@@ -81,9 +81,9 @@ impl SignatureProjective {
8181
8282 /// Aggregate a list of signatures into an existing aggregate
8383 #[ allow( clippy:: arithmetic_side_effects) ]
84- pub fn aggregate_with < S : AsSignatureProjective + ?Sized > (
84+ pub fn aggregate_with < ' a , S : AsSignatureProjective + ?Sized + ' a > (
8585 & mut self ,
86- signatures : & [ & S ] ,
86+ signatures : impl Iterator < Item = & ' a S > ,
8787 ) -> Result < ( ) , BlsError > {
8888 for signature in signatures {
8989 self . 0 += signature. try_as_projective ( ) ?. 0 ;
@@ -92,23 +92,27 @@ impl SignatureProjective {
9292 }
9393
9494 /// Aggregate a list of signatures
95- #[ allow( clippy:: arithmetic_side_effects) ]
96- pub fn aggregate < S : AsSignatureProjective + ?Sized > (
97- signatures : & [ & S ] ,
95+ pub fn aggregate < ' a , S : AsSignatureProjective + ?Sized + ' a > (
96+ mut signatures : impl Iterator < Item = & ' a S > ,
9897 ) -> Result < SignatureProjective , BlsError > {
99- if let Some ( ( first, rest) ) = signatures. split_first ( ) {
100- let mut aggregate = first. try_as_projective ( ) ?;
101- aggregate. aggregate_with ( rest) ?;
102- Ok ( aggregate)
103- } else {
104- Err ( BlsError :: EmptyAggregation )
98+ match signatures. next ( ) {
99+ Some ( first) => {
100+ let mut aggregate = first. try_as_projective ( ) ?;
101+ aggregate. aggregate_with ( signatures) ?;
102+ Ok ( aggregate)
103+ }
104+ None => Err ( BlsError :: EmptyAggregation ) ,
105105 }
106106 }
107107
108108 /// Verify a list of signatures against a message and a list of public keys
109- pub fn verify_aggregate < P : AsPubkeyProjective + ?Sized , S : AsSignatureProjective + ?Sized > (
110- public_keys : & [ & P ] ,
111- signatures : & [ & S ] ,
109+ pub fn verify_aggregate <
110+ ' a ,
111+ P : AsPubkeyProjective + ?Sized + ' a ,
112+ S : AsSignatureProjective + ?Sized + ' a ,
113+ > (
114+ public_keys : impl Iterator < Item = & ' a P > ,
115+ signatures : impl Iterator < Item = & ' a S > ,
112116 message : & [ u8 ] ,
113117 ) -> Result < bool , BlsError > {
114118 let aggregate_pubkey = PubkeyProjective :: aggregate ( public_keys) ?;
@@ -121,7 +125,7 @@ impl SignatureProjective {
121125 /// public keys.
122126 pub fn verify_distinct (
123127 public_keys : & [ & Pubkey ] ,
124- signatures : & [ & Signature ] ,
128+ signatures : & [ Signature ] ,
125129 messages : & [ & [ u8 ] ] ,
126130 ) -> Result < bool , BlsError > {
127131 if public_keys. len ( ) != messages. len ( ) || public_keys. len ( ) != signatures. len ( ) {
@@ -130,7 +134,7 @@ impl SignatureProjective {
130134 if public_keys. is_empty ( ) {
131135 return Err ( BlsError :: EmptyAggregation ) ;
132136 }
133- let aggregate_signature = SignatureProjective :: aggregate ( signatures) ?;
137+ let aggregate_signature = SignatureProjective :: aggregate ( signatures. iter ( ) ) ?;
134138 Self :: verify_distinct_aggregated ( public_keys, & aggregate_signature. into ( ) , messages)
135139 }
136140
@@ -486,11 +490,11 @@ mod tests {
486490 let signature1_affine: Signature = signature1. into ( ) ;
487491
488492 let aggregate_signature =
489- SignatureProjective :: aggregate ( & [ & signature0, & signature1] ) . unwrap ( ) ;
493+ SignatureProjective :: aggregate ( [ & signature0, & signature1] . into_iter ( ) ) . unwrap ( ) ;
490494
491495 let mut aggregate_signature_with = signature0;
492496 aggregate_signature_with
493- . aggregate_with ( & [ & signature1_affine] )
497+ . aggregate_with ( [ & signature1_affine] . into_iter ( ) )
494498 . unwrap ( ) ;
495499
496500 assert_eq ! ( aggregate_signature, aggregate_signature_with) ;
@@ -516,8 +520,8 @@ mod tests {
516520
517521 // basic case
518522 assert ! ( SignatureProjective :: verify_aggregate(
519- & [ & keypair0. public, & keypair1. public] ,
520- & [ & signature0, & signature1] ,
523+ [ & keypair0. public, & keypair1. public] . into_iter ( ) ,
524+ [ & signature0, & signature1] . into_iter ( ) ,
521525 test_message,
522526 )
523527 . unwrap( ) ) ;
@@ -528,44 +532,46 @@ mod tests {
528532 let signature0_affine: Signature = signature0. into ( ) ;
529533 let signature1_affine: Signature = signature1. into ( ) ;
530534 assert ! ( SignatureProjective :: verify_aggregate(
531- & [ & pubkey0_affine, & pubkey1_affine] ,
532- & [ & signature0_affine, & signature1_affine] ,
535+ [ & pubkey0_affine, & pubkey1_affine] . into_iter ( ) ,
536+ [ & signature0_affine, & signature1_affine] . into_iter ( ) ,
533537 test_message,
534538 )
535539 . unwrap( ) ) ;
536540
537541 // pre-aggregate the signatures
538542 let aggregate_signature =
539- SignatureProjective :: aggregate ( & [ & signature0, & signature1] ) . unwrap ( ) ;
543+ SignatureProjective :: aggregate ( [ & signature0, & signature1] . into_iter ( ) ) . unwrap ( ) ;
540544 assert ! ( SignatureProjective :: verify_aggregate(
541- & [ & keypair0. public, & keypair1. public] ,
542- & [ & aggregate_signature] ,
545+ [ & keypair0. public, & keypair1. public] . into_iter ( ) ,
546+ [ & aggregate_signature] . into_iter ( ) ,
543547 test_message,
544548 )
545549 . unwrap( ) ) ;
546550
547551 // pre-aggregate the public keys
548552 let aggregate_pubkey =
549- PubkeyProjective :: aggregate ( & [ & keypair0. public , & keypair1. public ] ) . unwrap ( ) ;
553+ PubkeyProjective :: aggregate ( [ & keypair0. public , & keypair1. public ] . into_iter ( ) ) . unwrap ( ) ;
550554 assert ! ( SignatureProjective :: verify_aggregate(
551- & [ & aggregate_pubkey] ,
552- & [ & signature0, & signature1] ,
555+ [ & aggregate_pubkey] . into_iter ( ) ,
556+ [ & signature0, & signature1] . into_iter ( ) ,
553557 test_message,
554558 )
555559 . unwrap( ) ) ;
560+ let pubkeys = Vec :: new ( ) as Vec < PubkeyProjective > ;
556561
557562 // empty set of public keys or signatures
558563 let err = SignatureProjective :: verify_aggregate (
559- & [ ] as & [ & PubkeyProjective ] ,
560- & [ & signature0, & signature1] ,
564+ pubkeys . iter ( ) ,
565+ [ & signature0, & signature1] . into_iter ( ) ,
561566 test_message,
562567 )
563568 . unwrap_err ( ) ;
564569 assert_eq ! ( err, BlsError :: EmptyAggregation ) ;
565570
571+ let signatures = Vec :: new ( ) as Vec < & SignatureProjective > ;
566572 let err = SignatureProjective :: verify_aggregate (
567- & [ & keypair0. public , & keypair1. public ] ,
568- & [ ] as & [ & SignatureProjective ] ,
573+ [ & keypair0. public , & keypair1. public ] . into_iter ( ) ,
574+ signatures . into_iter ( ) ,
569575 test_message,
570576 )
571577 . unwrap_err ( ) ;
@@ -593,7 +599,7 @@ mod tests {
593599 // Success cases
594600 let pubkeys_refs = [ & keypair0. public , & keypair1. public , & keypair2. public ] ;
595601 let messages_refs_vec: Vec < & [ u8 ] > = std:: vec![ message0, message1, message2] ;
596- let signatures_refs = [ & signature0, & signature1, & signature2] ;
602+ let signatures_refs = std :: vec! [ signature0, signature1, signature2] ;
597603
598604 assert ! ( SignatureProjective :: verify_distinct(
599605 & pubkeys_refs,
@@ -630,7 +636,7 @@ mod tests {
630636
631637 let wrong_signature_proj = wrong_keypair. sign ( message1) ;
632638 let wrong_signature: Signature = wrong_signature_proj. into ( ) ;
633- let wrong_signatures = [ & signature0, & wrong_signature, & signature2] ;
639+ let wrong_signatures = [ signature0, wrong_signature, signature2] ;
634640 assert ! ( !SignatureProjective :: verify_distinct(
635641 & pubkeys_refs,
636642 & wrong_signatures,
@@ -656,7 +662,7 @@ mod tests {
656662
657663 let err = SignatureProjective :: verify_distinct (
658664 & [ ] as & [ & Pubkey ] ,
659- & [ ] as & [ & Signature ] ,
665+ & [ ] as & [ Signature ] ,
660666 & [ ] as & [ & [ u8 ] ] ,
661667 )
662668 . unwrap_err ( ) ;
@@ -689,19 +695,21 @@ mod tests {
689695 let dyn_signatures: Vec < & dyn AsSignatureProjective > =
690696 std:: vec![ & signature0, & signature1_affine, & signature2_compressed] ;
691697
692- assert ! (
693- SignatureProjective :: verify_aggregate( & dyn_pubkeys, & dyn_signatures, test_message)
694- . unwrap( )
695- ) ;
698+ assert ! ( SignatureProjective :: verify_aggregate(
699+ dyn_pubkeys. into_iter( ) ,
700+ dyn_signatures. into_iter( ) ,
701+ test_message
702+ )
703+ . unwrap( ) ) ;
696704
697705 let wrong_message = b"this is not the correct message" ;
698706 let dyn_pubkeys_fail: Vec < & dyn AsPubkeyProjective > =
699707 std:: vec![ & pubkey0, & pubkey1_affine, & pubkey2_compressed] ;
700708 let dyn_signatures_fail: Vec < & dyn AsSignatureProjective > =
701709 std:: vec![ & signature0, & signature1_affine, & signature2_compressed] ;
702710 assert ! ( !SignatureProjective :: verify_aggregate(
703- & dyn_pubkeys_fail,
704- & dyn_signatures_fail,
711+ dyn_pubkeys_fail. into_iter ( ) ,
712+ dyn_signatures_fail. into_iter ( ) ,
705713 wrong_message
706714 )
707715 . unwrap( ) ) ;
0 commit comments