@ -1,9 +1,9 @@
use std ::borrow ::Cow ;
use super ::G1 ;
use serde ::de ::Error as DeserializeError ;
use serde ::{ Deserialize , Deserializer , Serialize , Serializer } ;
use serde_derive ::{ Deserialize , Serialize } ;
use G1 ;
use poly ::{ coeff_pos , BivarCommitment } ;
@ -43,11 +43,13 @@ impl<'de> Deserialize<'de> for BivarCommitment {
/// Serialization and deserialization of a group element's compressed representation.
pub mod projective {
use std ::fmt ;
use std ::marker ::PhantomData ;
use pairing ::{ CurveAffine , CurveProjective , EncodedPoint } ;
use serde ::de ::Error as DeserializeError ;
use serde ::{ Deserialize , Deserializer , Serialize , Serializer } ;
use serde ::de ::{ Error as DeserializeError , SeqAccess , Visitor } ;
use serde ::{ ser ::SerializeTuple , Deserializer , Serializer } ;
const ERR_LEN : & str = "wrong length of deserialized group element" ;
const ERR_CODE : & str = "deserialized bytes don't encode a group element" ;
pub fn serialize < S , C > ( c : & C , s : S ) -> Result < S ::Ok , S ::Error >
@ -55,7 +57,12 @@ pub mod projective {
S : Serializer ,
C : CurveProjective ,
{
c . into_affine ( ) . into_compressed ( ) . as_ref ( ) . serialize ( s )
let len = < C ::Affine as CurveAffine > ::Compressed ::size ( ) ;
let mut tup = s . serialize_tuple ( len ) ? ;
for byte in c . into_affine ( ) . into_compressed ( ) . as_ref ( ) {
tup . serialize_element ( byte ) ? ;
}
tup . end ( )
}
pub fn deserialize < ' de , D , C > ( d : D ) -> Result < C , D ::Error >
@ -63,14 +70,32 @@ pub mod projective {
D : Deserializer < ' de > ,
C : CurveProjective ,
{
let bytes = < Vec < u8 > > ::deserialize ( d ) ? ;
if bytes . len ( ) ! = < C ::Affine as CurveAffine > ::Compressed ::size ( ) {
return Err ( D ::Error ::custom ( ERR_LEN ) ) ;
struct TupleVisitor < C > {
_ph : PhantomData < C > ,
}
let mut compressed = < C ::Affine as CurveAffine > ::Compressed ::empty ( ) ;
compressed . as_mut ( ) . copy_from_slice ( & bytes ) ;
let to_err = | _ | D ::Error ::custom ( ERR_CODE ) ;
Ok ( compressed . into_affine ( ) . map_err ( to_err ) ? . into_projective ( ) )
impl < ' de , C : CurveProjective > Visitor < ' de > for TupleVisitor < C > {
type Value = C ;
fn expecting ( & self , f : & mut fmt ::Formatter ) -> fmt ::Result {
let len = < C ::Affine as CurveAffine > ::Compressed ::size ( ) ;
write! ( f , "a tuple of size {}" , len )
}
#[ inline ]
fn visit_seq < A : SeqAccess < ' de > > ( self , mut seq : A ) -> Result < C , A ::Error > {
let mut compressed = < C ::Affine as CurveAffine > ::Compressed ::empty ( ) ;
for ( i , byte ) in compressed . as_mut ( ) . iter_mut ( ) . enumerate ( ) {
let len_err = | | DeserializeError ::invalid_length ( i , & self ) ;
* byte = seq . next_element ( ) ? . ok_or_else ( len_err ) ? ;
}
let to_err = | _ | DeserializeError ::custom ( ERR_CODE ) ;
Ok ( compressed . into_affine ( ) . map_err ( to_err ) ? . into_projective ( ) )
}
}
let len = < C ::Affine as CurveAffine > ::Compressed ::size ( ) ;
d . deserialize_tuple ( len , TupleVisitor { _ph : PhantomData } )
}
}
@ -130,90 +155,66 @@ pub mod projective_vec {
/// Serialization and deserialization of vectors of field elements.
pub mod field_vec {
use std ::borrow ::Borrow ;
use std ::marker ::PhantomData ;
use pairing ::{ PrimeField , PrimeFieldRepr } ;
use pairing ::PrimeField ;
use serde ::de ::Error as DeserializeError ;
use serde ::ser ::Error as SerializeError ;
use serde ::{ Deserialize , Deserializer , Serialize , Serializer } ;
/// A wrapper type to facilitate serialization and deserialization of field elements.
pub struct FieldWrap < F , B > ( B , PhantomData < F > ) ;
use { Fr , FrRepr } ;
impl < F , B > FieldWrap < F , B > {
pub fn new ( f : B ) -> Self {
FieldWrap ( f , PhantomData )
}
}
/// A wrapper type to facilitate serialization and deserialization of field elements.
pub struct FieldWrap < B > ( B ) ;
impl < F > FieldWrap < F , F > {
pub fn into_inner ( self ) -> F {
impl FieldWrap < Fr > {
pub fn into_inner ( self ) -> Fr {
self . 0
}
}
impl < F : PrimeField , B : Borrow < F > > Serialize for FieldWrap < F , B > {
impl < B : Borrow < Fr > > Serialize for FieldWrap < B > {
fn serialize < S : Serializer > ( & self , s : S ) -> Result < S ::Ok , S ::Error > {
let mut bytes = Vec ::new ( ) ;
self . 0
. borrow ( )
. into_repr ( )
. write_be ( & mut bytes )
. map_err ( | _ | S ::Error ::custom ( "failed to write bytes" ) ) ? ;
bytes . serialize ( s )
self . 0. borrow ( ) . into_repr ( ) . 0. serialize ( s )
}
}
impl < ' de , F : PrimeField > Deserialize < ' de > for FieldWrap < F , F > {
impl < ' de > Deserialize < ' de > for FieldWrap < Fr > {
fn deserialize < D : Deserializer < ' de > > ( d : D ) -> Result < Self , D ::Error > {
let bytes : Vec < u8 > = Deserialize ::deserialize ( d ) ? ;
let mut repr = F ::zero ( ) . into_repr ( ) ;
repr . read_be ( & bytes [ .. ] )
. map_err ( | _ | D ::Error ::custom ( "failed to write bytes" ) ) ? ;
Ok ( FieldWrap ::new ( F ::from_repr ( repr ) . map_err ( | _ | {
let repr = FrRepr ( Deserialize ::deserialize ( d ) ? ) ;
Ok ( FieldWrap ( Fr ::from_repr ( repr ) . map_err ( | _ | {
D ::Error ::custom ( "invalid field element representation" )
} ) ? ) )
}
}
pub fn serialize < S , F > ( vec : & [ F ] , s : S ) -> Result < S ::Ok , S ::Error >
where
S : Serializer ,
F : PrimeField ,
{
let wrap_vec : Vec < FieldWrap < F , & F > > = vec . iter ( ) . map ( FieldWrap ::new ) . collect ( ) ;
pub fn serialize < S : Serializer > ( vec : & [ Fr ] , s : S ) -> Result < S ::Ok , S ::Error > {
let wrap_vec : Vec < FieldWrap < & Fr > > = vec . iter ( ) . map ( FieldWrap ) . collect ( ) ;
wrap_vec . serialize ( s )
}
pub fn deserialize < ' de , D , F > ( d : D ) -> Result < Vec < F > , D ::Error >
where
D : Deserializer < ' de > ,
F : PrimeField ,
{
let wrap_vec = < Vec < FieldWrap < F , F > > > ::deserialize ( d ) ? ;
Ok ( wrap_vec . into_iter ( ) . map ( | FieldWrap ( f , _ ) | f ) . collect ( ) )
pub fn deserialize < ' de , D : Deserializer < ' de > > ( d : D ) -> Result < Vec < Fr > , D ::Error > {
let wrap_vec = < Vec < FieldWrap < Fr > > > ::deserialize ( d ) ? ;
Ok ( wrap_vec . into_iter ( ) . map ( FieldWrap ::into_inner ) . collect ( ) )
}
}
#[ cfg(test) ]
mod tests {
use super ::super ::PEngine ;
use bincode ;
use pairing ::Engine ;
use rand ::{ self , Rng } ;
use serde_derive ::{ Deserialize , Serialize } ;
use poly ::BivarPoly ;
use { Fr , G1 } ;
#[ derive(Debug, Serialize, Deserialize) ]
pub struct Vecs < E : Engine > {
pub struct Vecs {
#[ serde(with = " super::projective_vec " ) ]
curve_points : Vec < E ::G1 > ,
curve_points : Vec < G1 > ,
#[ serde(with = " super::field_vec " ) ]
field_elements : Vec < E ::Fr > ,
field_elements : Vec < Fr > ,
}
impl < E : Engine > PartialEq for Vecs < E > {
impl PartialEq for Vecs {
fn eq ( & self , other : & Self ) -> bool {
self . curve_points = = other . curve_points & & self . field_elements = = other . field_elements
}
@ -222,7 +223,7 @@ mod tests {
#[ test ]
fn vecs ( ) {
let mut rng = rand ::thread_rng ( ) ;
let vecs : Vecs < PEngine > = Vecs {
let vecs = Vecs {
curve_points : rng . gen_iter ( ) . take ( 10 ) . collect ( ) ,
field_elements : rng . gen_iter ( ) . take ( 10 ) . collect ( ) ,
} ;