From 5e7d16b8117d1b9120dab9338972c81f6f446226 Mon Sep 17 00:00:00 2001 From: Samuel Burnham Date: Sun, 20 Nov 2022 14:17:08 -0500 Subject: [PATCH] Implement serde for Ep, Eq --- src/serde_impl.rs | 125 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 1 deletion(-) diff --git a/src/serde_impl.rs b/src/serde_impl.rs index e0cfb03..c26201b 100644 --- a/src/serde_impl.rs +++ b/src/serde_impl.rs @@ -5,8 +5,9 @@ use serde_crate::{ }; use crate::{ - curves::{EpAffine, EqAffine}, + curves::{Ep, EpAffine, Eq, EqAffine}, fields::{Fp, Fq}, + group::Curve, }; /// Serializes bytes to human readable or compact representation. @@ -105,6 +106,30 @@ impl<'de> Deserialize<'de> for EqAffine { } } +impl Serialize for Ep { + fn serialize(&self, s: S) -> Result { + EpAffine::serialize(&self.to_affine(), s) + } +} + +impl<'de> Deserialize<'de> for Ep { + fn deserialize>(d: D) -> Result { + Ok(Self::from(EpAffine::deserialize(d)?)) + } +} + +impl Serialize for Eq { + fn serialize(&self, s: S) -> Result { + EqAffine::serialize(&self.to_affine(), s) + } +} + +impl<'de> Deserialize<'de> for Eq { + fn deserialize>(d: D) -> Result { + Ok(Self::from(EqAffine::deserialize(d)?)) + } +} + #[cfg(test)] mod tests { use super::*; @@ -321,4 +346,102 @@ mod tests { f ); } + + #[test] + fn serde_ep() { + let mut rng = XorShiftRng::from_seed([ + 0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, + 0xbc, 0xe5, + ]); + + for _ in 0..100 { + let f = Ep::random(&mut rng); + test_roundtrip(&f); + } + + let f = Ep::identity(); + test_roundtrip(&f); + assert_eq!( + serde_json::from_slice::( + br#""0000000000000000000000000000000000000000000000000000000000000000""# + ) + .unwrap(), + f + ); + assert_eq!( + bincode::deserialize::(&[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 + ]) + .unwrap(), + f + ); + + let f = Ep::generator(); + test_roundtrip(&f); + assert_eq!( + serde_json::from_slice::( + br#""00000000ed302d991bf94c09fc98462200000000000000000000000000000040""# + ) + .unwrap(), + f + ); + assert_eq!( + bincode::deserialize::(&[ + 0, 0, 0, 0, 237, 48, 45, 153, 27, 249, 76, 9, 252, 152, 70, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 64 + ]) + .unwrap(), + f + ); + } + + #[test] + fn serde_eq() { + let mut rng = XorShiftRng::from_seed([ + 0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, + 0xbc, 0xe5, + ]); + + for _ in 0..100 { + let f = Eq::random(&mut rng); + test_roundtrip(&f); + } + + let f = Eq::identity(); + test_roundtrip(&f); + assert_eq!( + serde_json::from_slice::( + br#""0000000000000000000000000000000000000000000000000000000000000000""# + ) + .unwrap(), + f + ); + assert_eq!( + bincode::deserialize::(&[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 + ]) + .unwrap(), + f + ); + + let f = Eq::generator(); + test_roundtrip(&f); + assert_eq!( + serde_json::from_slice::( + br#""0000000021eb468cdda89409fc98462200000000000000000000000000000040""# + ) + .unwrap(), + f + ); + assert_eq!( + bincode::deserialize::(&[ + 0, 0, 0, 0, 33, 235, 70, 140, 221, 168, 148, 9, 252, 152, 70, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 64 + ]) + .unwrap(), + f + ); + } }