@@ -200,7 +200,7 @@ impl<D: Clone + Digest + FixedOutput + Send + Sync> AggregateSignature<D> {
200200mod  tests { 
201201    use  super :: * ; 
202202
203-     mod  aggregate_signature_type  { 
203+     mod  aggregate_signature_type_golden  { 
204204        use  super :: * ; 
205205
206206        #[ test]  
@@ -215,4 +215,117 @@ mod tests {
215215            ) ; 
216216        } 
217217    } 
218+ 
219+     mod  aggregate_signature_golden_concatenation { 
220+         use  blake2:: { Blake2b ,  digest:: consts:: U32 } ; 
221+         use  rand_chacha:: ChaCha20Rng ; 
222+         use  rand_core:: SeedableRng ; 
223+ 
224+         use  crate :: bls_multi_signature:: { BlsSigningKey ,  BlsVerificationKeyProofOfPossession } ; 
225+         use  crate :: { 
226+             AggregateSignature ,  AggregateSignatureType ,  Clerk ,  ClosedKeyRegistration , 
227+             KeyRegistration ,  Parameters ,  Signer , 
228+         } ; 
229+ 
230+         type  D  = Blake2b < U32 > ; 
231+ 
232+         const  GOLDEN_JSON :  & str  = r#" 
233+         { 
234+             "signatures": [ 
235+                 [ 
236+                 { 
237+                     "sigma": [ 
238+                     149, 157, 201, 187, 140, 54, 0, 128, 209, 88, 16, 203, 61, 78, 77, 98, 
239+                     161, 133, 58, 152, 29, 74, 217, 113, 64, 100, 10, 161, 186, 167, 133, 
240+                     114, 211, 153, 218, 56, 223, 84, 105, 242, 41, 54, 224, 170, 208, 185, 
241+                     126, 83 
242+                     ], 
243+                     "indexes": [1, 4, 5, 8], 
244+                     "signer_index": 0 
245+                 }, 
246+                 [ 
247+                     [ 
248+                     143, 161, 255, 48, 78, 57, 204, 220, 25, 221, 164, 252, 248, 14, 56, 
249+                     126, 186, 135, 228, 188, 145, 181, 52, 200, 97, 99, 213, 46, 0, 199, 
250+                     193, 89, 187, 88, 29, 135, 173, 244, 86, 36, 83, 54, 67, 164, 6, 137, 
251+                     94, 72, 6, 105, 128, 128, 93, 48, 176, 11, 4, 246, 138, 48, 180, 133, 
252+                     90, 142, 192, 24, 193, 111, 142, 31, 76, 111, 110, 234, 153, 90, 208, 
253+                     192, 31, 124, 95, 102, 49, 158, 99, 52, 220, 165, 94, 251, 68, 69, 
254+                     121, 16, 224, 194 
255+                     ], 
256+                     1 
257+                 ] 
258+                 ], 
259+                 [ 
260+                 { 
261+                     "sigma": [ 
262+                     149, 169, 22, 201, 216, 97, 163, 188, 115, 210, 217, 236, 233, 161, 
263+                     201, 13, 42, 132, 12, 63, 5, 31, 120, 22, 78, 177, 125, 134, 208, 205, 
264+                     73, 58, 247, 141, 59, 62, 187, 81, 213, 30, 153, 218, 41, 42, 110, 
265+                     156, 161, 205 
266+                     ], 
267+                     "indexes": [0, 3, 6], 
268+                     "signer_index": 1 
269+                 }, 
270+                 [ 
271+                     [ 
272+                     145, 56, 175, 32, 122, 187, 214, 226, 251, 148, 88, 9, 1, 103, 159, 
273+                     146, 80, 166, 107, 243, 251, 236, 41, 28, 111, 128, 207, 164, 132, 
274+                     147, 228, 83, 246, 228, 170, 68, 89, 78, 60, 28, 123, 130, 88, 234, 
275+                     38, 97, 42, 65, 1, 100, 53, 18, 78, 131, 8, 61, 122, 131, 238, 84, 
276+                     233, 223, 154, 118, 118, 73, 28, 27, 101, 78, 80, 233, 123, 206, 220, 
277+                     174, 134, 205, 71, 110, 112, 180, 97, 98, 0, 113, 69, 145, 231, 168, 
278+                     43, 173, 172, 56, 104, 208 
279+                     ], 
280+                     1 
281+                 ] 
282+                 ] 
283+             ], 
284+             "batch_proof": { "values": [], "indices": [0, 1], "hasher": null } 
285+         } 
286+         "# ; 
287+ 
288+         fn  golden_value ( )  -> AggregateSignature < D >  { 
289+             let  mut  rng = ChaCha20Rng :: from_seed ( [ 0u8 ;  32 ] ) ; 
290+             let  msg = [ 0u8 ;  16 ] ; 
291+             let  params = Parameters  { 
292+                 m :  10 , 
293+                 k :  5 , 
294+                 phi_f :  0.8 , 
295+             } ; 
296+             let  sk_1 = BlsSigningKey :: generate ( & mut  rng) ; 
297+             let  sk_2 = BlsSigningKey :: generate ( & mut  rng) ; 
298+             let  pk_1 = BlsVerificationKeyProofOfPossession :: from ( & sk_1) ; 
299+             let  pk_2 = BlsVerificationKeyProofOfPossession :: from ( & sk_2) ; 
300+             let  mut  key_reg = KeyRegistration :: init ( ) ; 
301+             key_reg. register ( 1 ,  pk_1) . unwrap ( ) ; 
302+             key_reg. register ( 1 ,  pk_2) . unwrap ( ) ; 
303+             let  closed_key_reg:  ClosedKeyRegistration < D >  = key_reg. close ( ) ; 
304+             let  clerk = Clerk :: new_clerk_from_closed_key_registration ( & params,  & closed_key_reg) ; 
305+             let  signer_1 = Signer :: set_signer ( 0 ,  1 ,  params,  sk_1,  pk_1. vk ,  closed_key_reg. clone ( ) ) ; 
306+             let  signer_2 = Signer :: set_signer ( 1 ,  1 ,  params,  sk_2,  pk_2. vk ,  closed_key_reg) ; 
307+             let  signature_1 = signer_1. sign ( & msg) . unwrap ( ) ; 
308+             let  signature_2 = signer_2. sign ( & msg) . unwrap ( ) ; 
309+ 
310+             clerk
311+                 . aggregate_signatures_with_type ( 
312+                     & [ signature_1,  signature_2] , 
313+                     & msg, 
314+                     AggregateSignatureType :: Concatenation , 
315+                 ) 
316+                 . unwrap ( ) 
317+         } 
318+ 
319+         #[ test]  
320+         fn  golden_conversions ( )  { 
321+             let  value:  AggregateSignature < D >  = serde_json:: from_str ( GOLDEN_JSON ) 
322+                 . expect ( "This JSON deserialization should not fail" ) ; 
323+ 
324+             let  serialized =
325+                 serde_json:: to_string ( & value) . expect ( "This JSON serialization should not fail" ) ; 
326+             let  golden_serialized = serde_json:: to_string ( & golden_value ( ) ) 
327+                 . expect ( "This JSON serialization should not fail" ) ; 
328+             assert_eq ! ( golden_serialized,  serialized) ; 
329+         } 
330+     } 
218331} 
0 commit comments