Skip to content

Commit

Permalink
Simplify serde implementation for fields.
Browse files Browse the repository at this point in the history
  • Loading branch information
afck committed Jul 9, 2018
1 parent 9318589 commit 88e40dc
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 33 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ repository = "https://github.com/ebfull/pairing"
rand = "0.4"
byteorder = "1"
ff = { version = "0.4", features = ["derive"] }
serde = { version = "1.0.66", optional = true }
serde = { version = "1.0", optional = true }

[features]
unstable-features = ["expose-arith"]
Expand All @@ -28,4 +28,4 @@ u128-support = []
default = []

[dev-dependencies]
serde_json = "1.0.20"
serde_json = "1.0"
37 changes: 6 additions & 31 deletions src/bls12_381/serde_impl.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
use super::{Fq, FqRepr, Fr, FrRepr, G1, G1Affine, G2, G2Affine};
use {CurveAffine, CurveProjective, EncodedPoint, PrimeField, PrimeFieldRepr};
use {CurveAffine, CurveProjective, EncodedPoint, PrimeField};

use serde::de::Error as DeserializeError;
use serde::ser::Error as SerializeError;
use serde::{Deserialize, Deserializer, Serialize, Serializer};

const ERR_LEN: &str = "wrong length of deserialized group element";
const ERR_CODE: &str = "deserialized bytes don't encode a group element";
const ERR_IO: &str = "error writing to a byte vector";

impl Serialize for G1 {
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
Expand Down Expand Up @@ -88,13 +86,13 @@ impl<'de> Deserialize<'de> for Fr {

impl Serialize for FrRepr {
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
serialize_prime_field_repr(self, s)
self.0.serialize(s)
}
}

impl<'de> Deserialize<'de> for FrRepr {
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
Ok(deserialize_prime_field_repr(FrRepr([0; 4]), d)?)
Ok(FrRepr(<_>::deserialize(d)?))
}
}

Expand All @@ -112,37 +110,14 @@ impl<'de> Deserialize<'de> for Fq {

impl Serialize for FqRepr {
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
serialize_prime_field_repr(self, s)
self.0.serialize(s)
}
}

impl<'de> Deserialize<'de> for FqRepr {
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
Ok(deserialize_prime_field_repr(FqRepr([0; 6]), d)?)
}
}

/// Serializes a prime field element representation.
fn serialize_prime_field_repr<S, F>(f: &F, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
F: PrimeFieldRepr,
{
let mut bytes = Vec::new();
f.write_be(&mut bytes)
.map_err(|_| S::Error::custom(ERR_IO))?;
bytes.serialize(s)
}

/// Deserializes a prime field element representation.
fn deserialize_prime_field_repr<'de, D, F>(mut f: F, d: D) -> Result<F, D::Error>
where
D: Deserializer<'de>,
F: PrimeFieldRepr,
{
let bytes = Vec::<u8>::deserialize(d)?;
f.read_be(&bytes[..]).map_err(|_| D::Error::custom(ERR_IO))?;
Ok(f)
Ok(FqRepr(<_>::deserialize(d)?))
}
}

#[cfg(test)]
Expand Down

0 comments on commit 88e40dc

Please sign in to comment.