From 73560d455f0a8d4893d689cb697e341843bf7f97 Mon Sep 17 00:00:00 2001 From: Monica Moniot Date: Mon, 11 Sep 2023 13:22:17 -0400 Subject: [PATCH] added identity serialization --- src/p384.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/p384.rs b/src/p384.rs index a7ad342..049552e 100644 --- a/src/p384.rs +++ b/src/p384.rs @@ -484,6 +484,51 @@ impl ToFromBytes for Identity { } } + +impl Serialize for Identity { + #[inline] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + if serializer.is_human_readable() { + self.to_string().serialize(serializer) + } else { + serializer.serialize_bytes(self.to_bytes_on_stack::<{P384_PUBLIC_KEY_SIZE + 8 + P384_PUBLIC_KEY_SIZE + P384_PUBLIC_KEY_SIZE + P384_ECDSA_SIGNATURE_SIZE}>().as_ref()) + } + } +} + +impl<'de> Deserialize<'de> for Identity { + #[inline] + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + if deserializer.is_human_readable() { + Identity::from_str(<&str>::deserialize(deserializer)?) + .map_err(|_| serde::de::Error::custom(IDENTITY_ERR.0)) + } else { + struct Visitor; + + impl<'de> serde::de::Visitor<'de> for Visitor { + type Value = Identity; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a pair of ratchet states") + } + + fn visit_bytes(self, v: &[u8]) -> Result + where + E: serde::de::Error, { + Identity::from_bytes(v).map_err(|_| serde::de::Error::custom(IDENTITY_ERR.0)) + } + } + deserializer.deserialize_bytes(Visitor) + } + } +} + impl PartialEq for Identity { #[inline(always)] fn eq(&self, other: &Self) -> bool {