use std::convert::TryFrom; use std::io; use p256::{EncodedPoint, PublicKey}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; /// Represents a wrapper around [`EncodedPoint`], and exists to /// fix an issue with [`serde`] deserialization failing when /// directly serializing the [`EncodedPoint`] type #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(into = "Vec", try_from = "Vec")] pub struct PublicKeyBytes(EncodedPoint); impl From for PublicKeyBytes { fn from(pk: PublicKey) -> Self { Self(EncodedPoint::from(pk)) } } impl TryFrom for PublicKey { type Error = io::Error; fn try_from(pkb: PublicKeyBytes) -> Result { PublicKey::from_sec1_bytes(pkb.0.as_ref()) .map_err(|x| io::Error::new(io::ErrorKind::InvalidData, x)) } } impl From for Vec { fn from(pkb: PublicKeyBytes) -> Self { pkb.0.as_bytes().to_vec() } } impl TryFrom> for PublicKeyBytes { type Error = io::Error; fn try_from(bytes: Vec) -> Result { Ok(Self(EncodedPoint::from_bytes(bytes).map_err(|x| { io::Error::new(io::ErrorKind::InvalidData, x.to_string()) })?)) } } impl serde_bytes::Serialize for PublicKeyBytes { fn serialize(&self, serializer: S) -> Result where S: Serializer, { serializer.serialize_bytes(self.0.as_ref()) } } impl<'de> serde_bytes::Deserialize<'de> for PublicKeyBytes { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { let bytes = Deserialize::deserialize(deserializer).map(serde_bytes::ByteBuf::into_vec)?; PublicKeyBytes::try_from(bytes).map_err(serde::de::Error::custom) } }