diff --git a/Cargo.lock b/Cargo.lock index 42f6b54515..7d5658fc4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1382,6 +1382,7 @@ dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.3", "serde", + "serde_bytes", "serde_derive", "sha2", "thiserror", diff --git a/common/crypto/dkg/Cargo.toml b/common/crypto/dkg/Cargo.toml index 610e41be19..31d431e469 100644 --- a/common/crypto/dkg/Cargo.toml +++ b/common/crypto/dkg/Cargo.toml @@ -21,6 +21,7 @@ rand_chacha = "0.3" rand_core = "0.6.3" sha2 = "0.9" serde = "1.0" +serde_bytes = { version = "0.11.6" } serde_derive = "1.0" thiserror = "1.0" zeroize = { version = "1.4", features = ["zeroize_derive"] } diff --git a/common/crypto/dkg/src/bte/keys.rs b/common/crypto/dkg/src/bte/keys.rs index 64ef47b010..cca086adb2 100644 --- a/common/crypto/dkg/src/bte/keys.rs +++ b/common/crypto/dkg/src/bte/keys.rs @@ -9,6 +9,9 @@ use bls12_381::{G1Projective, G2Projective, Scalar}; use ff::Field; use group::GroupEncoding; use rand_core::RngCore; +use serde::de::Error as SerdeError; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde_bytes::{ByteBuf as SerdeByteBuf, Bytes as SerdeBytes}; use zeroize::Zeroize; #[derive(Debug, Zeroize)] @@ -410,6 +413,25 @@ impl PublicKeyWithProof { } } +impl Serialize for PublicKeyWithProof { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + SerdeBytes::new(&self.to_bytes()).serialize(serializer) + } +} + +impl<'d> Deserialize<'d> for PublicKeyWithProof { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'d>, + { + let bytes = ::deserialize(deserializer)?; + PublicKeyWithProof::try_from_bytes(bytes.as_ref()).map_err(SerdeError::custom) + } +} + #[derive(Debug, Zeroize)] #[zeroize(drop)] #[cfg_attr(test, derive(PartialEq))] @@ -642,6 +664,25 @@ impl DecryptionKey { } } +impl Serialize for DecryptionKey { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + SerdeBytes::new(&self.to_bytes()).serialize(serializer) + } +} + +impl<'d> Deserialize<'d> for DecryptionKey { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'d>, + { + let bytes = ::deserialize(deserializer)?; + DecryptionKey::try_from_bytes(bytes.as_ref()).map_err(SerdeError::custom) + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/common/crypto/dkg/src/dealing.rs b/common/crypto/dkg/src/dealing.rs index 33333ee404..f00cbae59b 100644 --- a/common/crypto/dkg/src/dealing.rs +++ b/common/crypto/dkg/src/dealing.rs @@ -14,6 +14,9 @@ use crate::interpolation::{ use crate::{NodeIndex, Share, Threshold}; use bls12_381::{G2Projective, Scalar}; use rand_core::RngCore; +use serde::de::Error as SerdeError; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde_bytes::{ByteBuf as SerdeByteBuf, Bytes as SerdeBytes}; use std::collections::BTreeMap; use zeroize::Zeroize; @@ -245,6 +248,25 @@ impl Dealing { } } +impl Serialize for Dealing { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + SerdeBytes::new(&self.to_bytes()).serialize(serializer) + } +} + +impl<'d> Deserialize<'d> for Dealing { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'d>, + { + let bytes = ::deserialize(deserializer)?; + Dealing::try_from_bytes(bytes.as_ref()).map_err(SerdeError::custom) + } +} + // this assumes all dealings have been verified pub fn try_recover_verification_keys( dealings: &[Dealing],