@@ -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