@@ -22,7 +22,7 @@ use crate::transcript::TranscriptProtocol;
2222use crate :: util;
2323
2424use rand_core:: { CryptoRng , RngCore } ;
25- use serde:: de:: Visitor ;
25+ use serde:: de:: { Error , SeqAccess , Visitor } ;
2626use serde:: { self , Deserialize , Deserializer , Serialize , Serializer } ;
2727
2828// Modules for MPC protocol
@@ -559,7 +559,25 @@ impl<'de> Deserialize<'de> for RangeProof {
559559 type Value = RangeProof ;
560560
561561 fn expecting ( & self , formatter : & mut :: core:: fmt:: Formatter < ' _ > ) -> :: core:: fmt:: Result {
562- formatter. write_str ( "a valid RangeProof" )
562+ formatter. write_str ( "a byte sequence (raw or UTF-8) representation of RangeProof" )
563+ }
564+
565+ fn visit_seq < A > ( self , mut seq : A ) -> Result < Self :: Value , A :: Error >
566+ where
567+ A : SeqAccess < ' de > ,
568+ {
569+ let mut vec = Vec :: < u8 > :: new ( ) ;
570+ while let Some ( elem) = seq. next_element ( ) ? {
571+ vec. push ( elem) ;
572+ }
573+ // Using Error::custom requires T: Display, which our error
574+ // type only implements when it implements std::error::Error.
575+ #[ cfg( feature = "std" ) ]
576+ return RangeProof :: from_bytes ( & * vec) . map_err ( serde:: de:: Error :: custom) ;
577+ // In no-std contexts, drop the error message.
578+ #[ cfg( not( feature = "std" ) ) ]
579+ return RangeProof :: from_bytes ( & * vec)
580+ . map_err ( |_| serde:: de:: Error :: custom ( "deserialization error" ) ) ;
563581 }
564582
565583 fn visit_bytes < E > ( self , v : & [ u8 ] ) -> Result < RangeProof , E >
@@ -631,7 +649,15 @@ mod tests {
631649 /// 2. Serialize to wire format;
632650 /// 3. Deserialize from wire format;
633651 /// 4. Verify the proof.
634- fn singleparty_create_and_verify_helper ( n : usize , m : usize ) {
652+ fn singleparty_create_and_verify_helper < T , S , D > (
653+ n : usize ,
654+ m : usize ,
655+ serialize : S ,
656+ deserialize : D ,
657+ ) where
658+ S : Fn ( & RangeProof ) -> T ,
659+ D : Fn ( & T ) -> RangeProof ,
660+ {
635661 // Split the test into two scopes, so that it's explicit what
636662 // data is shared between the prover and the verifier.
637663
@@ -645,7 +671,7 @@ mod tests {
645671 let bp_gens = BulletproofGens :: new ( max_bitsize, max_parties) ;
646672
647673 // Prover's scope
648- let ( proof_bytes , value_commitments) = {
674+ let ( serialized_proof , value_commitments) = {
649675 use self :: rand:: Rng ;
650676 let mut rng = rand:: thread_rng ( ) ;
651677
@@ -667,13 +693,13 @@ mod tests {
667693 . unwrap ( ) ;
668694
669695 // 2. Return serialized proof and value commitments
670- ( bincode :: serialize ( & proof) . unwrap ( ) , value_commitments)
696+ ( serialize ( & proof) , value_commitments)
671697 } ;
672698
673699 // Verifier's scope
674700 {
675701 // 3. Deserialize
676- let proof: RangeProof = bincode :: deserialize ( & proof_bytes ) . unwrap ( ) ;
702+ let proof: RangeProof = deserialize ( & serialized_proof ) ;
677703
678704 // 4. Verify with the same customization label as above
679705 let mut transcript = Transcript :: new ( b"AggregatedRangeProofTest" ) ;
@@ -684,44 +710,68 @@ mod tests {
684710 }
685711 }
686712
713+ fn serialize_json ( proof : & RangeProof ) -> String {
714+ serde_json:: to_string_pretty ( proof) . unwrap ( )
715+ }
716+
717+ fn deserialize_json ( serialized_json : & String ) -> RangeProof {
718+ serde_json:: from_str ( serialized_json) . unwrap ( )
719+ }
720+
721+ fn serialize_bin ( proof : & RangeProof ) -> Vec < u8 > {
722+ bincode:: serialize ( & proof) . unwrap ( )
723+ }
724+
725+ fn deserialize_bin ( serialized_bytes : & Vec < u8 > ) -> RangeProof {
726+ bincode:: deserialize ( & serialized_bytes) . unwrap ( )
727+ }
728+
687729 #[ test]
688730 fn create_and_verify_n_32_m_1 ( ) {
689- singleparty_create_and_verify_helper ( 32 , 1 ) ;
731+ singleparty_create_and_verify_helper ( 32 , 1 , serialize_json, deserialize_json) ;
732+ singleparty_create_and_verify_helper ( 32 , 1 , serialize_bin, deserialize_bin) ;
690733 }
691734
692735 #[ test]
693736 fn create_and_verify_n_32_m_2 ( ) {
694- singleparty_create_and_verify_helper ( 32 , 2 ) ;
737+ singleparty_create_and_verify_helper ( 32 , 2 , serialize_json, deserialize_json) ;
738+ singleparty_create_and_verify_helper ( 32 , 2 , serialize_bin, deserialize_bin) ;
695739 }
696740
697741 #[ test]
698742 fn create_and_verify_n_32_m_4 ( ) {
699- singleparty_create_and_verify_helper ( 32 , 4 ) ;
743+ singleparty_create_and_verify_helper ( 32 , 4 , serialize_json, deserialize_json) ;
744+ singleparty_create_and_verify_helper ( 32 , 4 , serialize_bin, deserialize_bin) ;
700745 }
701746
702747 #[ test]
703748 fn create_and_verify_n_32_m_8 ( ) {
704- singleparty_create_and_verify_helper ( 32 , 8 ) ;
749+ singleparty_create_and_verify_helper ( 32 , 8 , serialize_json, deserialize_json) ;
750+ singleparty_create_and_verify_helper ( 32 , 8 , serialize_bin, deserialize_bin) ;
705751 }
706752
707753 #[ test]
708754 fn create_and_verify_n_64_m_1 ( ) {
709- singleparty_create_and_verify_helper ( 64 , 1 ) ;
755+ singleparty_create_and_verify_helper ( 64 , 1 , serialize_json, deserialize_json) ;
756+ singleparty_create_and_verify_helper ( 64 , 1 , serialize_bin, deserialize_bin) ;
710757 }
711758
712759 #[ test]
713760 fn create_and_verify_n_64_m_2 ( ) {
714- singleparty_create_and_verify_helper ( 64 , 2 ) ;
761+ singleparty_create_and_verify_helper ( 64 , 2 , serialize_json, deserialize_json) ;
762+ singleparty_create_and_verify_helper ( 64 , 2 , serialize_bin, deserialize_bin) ;
715763 }
716764
717765 #[ test]
718766 fn create_and_verify_n_64_m_4 ( ) {
719- singleparty_create_and_verify_helper ( 64 , 4 ) ;
767+ singleparty_create_and_verify_helper ( 64 , 4 , serialize_json, deserialize_json) ;
768+ singleparty_create_and_verify_helper ( 64 , 4 , serialize_bin, deserialize_bin) ;
720769 }
721770
722771 #[ test]
723772 fn create_and_verify_n_64_m_8 ( ) {
724- singleparty_create_and_verify_helper ( 64 , 8 ) ;
773+ singleparty_create_and_verify_helper ( 64 , 8 , serialize_json, deserialize_json) ;
774+ singleparty_create_and_verify_helper ( 64 , 8 , serialize_bin, deserialize_bin) ;
725775 }
726776
727777 #[ test]
0 commit comments