decaf377_plus 0.10.1

A prime-order group designed for use in SNARKs over BLS12-377
Documentation
use super::Fr;
use alloc::string::ToString;
use serdect::serde::{Deserialize, Deserializer, Serialize, Serializer};

impl Serialize for Fr {
    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let bytes = self.to_bytes_le();
        serdect::array::serialize_hex_lower_or_bin(&bytes, s)
    }
}

impl<'de> Deserialize<'de> for Fr {
    fn deserialize<D>(d: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let mut bytes = [0u8; 32];
        let _ = serdect::array::deserialize_hex_or_bin::<D>(&mut bytes, d)?;
        Fr::from_bytes_checked(&bytes).map_err(|e| serdect::serde::de::Error::custom(e.to_string()))
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use rand_chacha::ChaCha8Rng;
    use rand_core::SeedableRng;

    #[test]
    fn text() {
        let mut rng = ChaCha8Rng::from_entropy();
        let val = Fr::rand(&mut rng);
        let serialized = serde_json::to_string(&val).unwrap();
        let deserialized: Fr = serde_json::from_str(&serialized).unwrap();
        assert_eq!(val, deserialized);
    }

    #[test]
    fn binary() {
        let mut rng = ChaCha8Rng::from_entropy();
        let val = Fr::rand(&mut rng);
        let serialized = serde_bare::to_vec(&val).unwrap();
        let deserialized: Fr = serde_bare::from_slice(&serialized).unwrap();
        assert_eq!(val, deserialized);
    }
}