use serde::de::{Deserialize, Deserializer};
use serde::ser::{Serialize, Serializer};
use serde::ser::SerializeTuple;
use crate::crypto::signature::Ed25519PublicKey;
use crate::payloads::Ipv8Payload;
use crate::serialization::varlen::VarLen16;
#[derive(Debug, PartialEq)]
pub struct BinMemberAuthenticationPayload {
pub public_key_bin: Ed25519PublicKey,
pub encryption_key_bin: [u8; 32],
}
impl Serialize for BinMemberAuthenticationPayload {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let length = self.public_key_bin.len() + self.encryption_key_bin.len() + 10;
let mut state = serializer.serialize_tuple(length + 2)?;
state.serialize_element(&(length as u16))?;
for i in [76u8, 105u8, 98u8, 78u8, 97u8, 67u8, 76u8, 80u8, 75u8, 58u8].iter() {
state.serialize_element(&i)?;
}
for i in self.encryption_key_bin.iter() {
state.serialize_element(&i)?;
}
for i in self.public_key_bin.iter() {
state.serialize_element(&i)?;
}
state.end()
}
}
#[derive(Debug, PartialEq, serde::Deserialize)]
struct BinMemberAuthenticationPayloadPattern(VarLen16);
impl<'de> Deserialize<'de> for BinMemberAuthenticationPayload {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let payload_temporary = BinMemberAuthenticationPayloadPattern::deserialize(deserializer)?;
let contents = &*(payload_temporary.0).0;
if contents[0..10] != [76u8, 105u8, 98u8, 78u8, 97u8, 67u8, 76u8, 80u8, 75u8, 58u8] {
return Err(serde::de::Error::custom(
"Received BinMemberAuthenticationPayload without LibNaclPK: prefix",
));
}
let encryption_key_bin = *zerocopy::LayoutVerified::<_, [u8; 32]>::new(&contents[10..42])
.ok_or_else(|| {
serde::de::Error::custom("Received BinMemberAuthenticationPayload had an invalid size")
})?;
let public_key_bin = *zerocopy::LayoutVerified::<_, [u8; 32]>::new(&contents[42..74])
.ok_or_else(|| {
serde::de::Error::custom(
"Received BinMemberAuthenticationPayload had an invalid size",
)
})?;
Ok(BinMemberAuthenticationPayload {
encryption_key_bin,
public_key_bin,
})
}
}
impl Ipv8Payload for BinMemberAuthenticationPayload {
}
#[cfg(test)]
mod tests {
use crate::serialization::Packet;
use super::*;
#[test]
fn integration_test_creation() {
let i = BinMemberAuthenticationPayload {
encryption_key_bin: [
3, 161, 7, 191, 243, 206, 16, 190, 29, 112, 221, 24, 231, 75, 192, 153, 103, 228,
214, 48, 155, 165, 13, 95, 29, 220, 134, 100, 18, 85, 49, 184,
],
public_key_bin: [
3, 161, 7, 191, 243, 206, 16, 190, 29, 112, 221, 24, 231, 75, 192, 153, 103, 228,
214, 48, 155, 165, 13, 95, 29, 220, 134, 100, 18, 85, 49, 184,
],
};
let mut packet = Packet::new(create_test_header!()).unwrap();
packet.add(&i).unwrap();
assert_eq!(
i,
packet
.start_deserialize()
.skip_header()
.unwrap()
.next_payload()
.unwrap()
);
}
}