@@ -88,7 +88,7 @@ impl SigningKey {
88
88
pub fn from_bytes ( bytes : & [ u8 ] ) -> Result < Self , MultiSignatureError > {
89
89
match BlstSk :: from_bytes ( & bytes[ ..32 ] ) {
90
90
Ok ( sk) => Ok ( Self ( sk) ) ,
91
- Err ( e) => Err ( blst_err_to_mithril ( e, None )
91
+ Err ( e) => Err ( blst_err_to_mithril ( e, None , None )
92
92
. expect_err ( "If deserialization is not successful, blst returns and error different to SUCCESS." ) )
93
93
}
94
94
}
@@ -108,7 +108,7 @@ impl VerificationKey {
108
108
pub fn from_bytes ( bytes : & [ u8 ] ) -> Result < Self , MultiSignatureError > {
109
109
match BlstVk :: key_validate ( & bytes[ ..96 ] ) {
110
110
Ok ( vk) => Ok ( Self ( vk) ) ,
111
- Err ( e) => Err ( blst_err_to_mithril ( e, None )
111
+ Err ( e) => Err ( blst_err_to_mithril ( e, None , None )
112
112
. expect_err ( "If deserialization is not successful, blst returns and error different to SUCCESS." ) )
113
113
}
114
114
}
@@ -196,15 +196,19 @@ impl VerificationKeyPoP {
196
196
// If we are really looking for performance improvements, we can combine the
197
197
// two final exponentiations (for verifying k1 and k2) into a single one.
198
198
pub fn check ( & self ) -> Result < ( ) , MultiSignatureError > {
199
- let result = verify_pairing ( & self . vk , & self . pop ) ;
200
-
201
- if !( self . pop . k1 . verify ( false , POP , & [ ] , & [ ] , & self . vk . 0 , false )
202
- == BLST_ERROR :: BLST_SUCCESS
203
- && result)
204
- {
205
- return Err ( MultiSignatureError :: KeyInvalid ( Box :: new ( * self ) ) ) ;
199
+ match self . vk . 0 . validate ( ) {
200
+ Ok ( _) => {
201
+ let result = verify_pairing ( & self . vk , & self . pop ) ;
202
+ if !( self . pop . k1 . verify ( false , POP , & [ ] , & [ ] , & self . vk . 0 , false )
203
+ == BLST_ERROR :: BLST_SUCCESS
204
+ && result)
205
+ {
206
+ return Err ( MultiSignatureError :: KeyInvalid ( Box :: new ( * self ) ) ) ;
207
+ }
208
+ Ok ( ( ) )
209
+ }
210
+ Err ( e) => blst_err_to_mithril ( e, None , Some ( self . vk ) ) ,
206
211
}
207
- Ok ( ( ) )
208
212
}
209
213
210
214
/// Convert to a 144 byte string.
@@ -261,7 +265,7 @@ impl ProofOfPossession {
261
265
let k1 = match BlstSig :: from_bytes ( & bytes[ ..48 ] ) {
262
266
Ok ( key) => key,
263
267
Err ( e) => {
264
- return Err ( blst_err_to_mithril ( e, None )
268
+ return Err ( blst_err_to_mithril ( e, None , None )
265
269
. expect_err ( "If it passed, blst returns and error different to SUCCESS." ) )
266
270
}
267
271
} ;
@@ -288,8 +292,12 @@ impl Signature {
288
292
/// Verify a signature against a verification key.
289
293
pub fn verify ( & self , msg : & [ u8 ] , mvk : & VerificationKey ) -> Result < ( ) , MultiSignatureError > {
290
294
blst_err_to_mithril (
291
- self . 0 . verify ( false , msg, & [ ] , & [ ] , & mvk. 0 , false ) ,
295
+ self . 0 . validate ( true ) . map_or_else (
296
+ |e| e,
297
+ |_| self . 0 . verify ( false , msg, & [ ] , & [ ] , & mvk. 0 , false ) ,
298
+ ) ,
292
299
Some ( * self ) ,
300
+ None ,
293
301
)
294
302
}
295
303
@@ -323,7 +331,7 @@ impl Signature {
323
331
pub fn from_bytes ( bytes : & [ u8 ] ) -> Result < Self , MultiSignatureError > {
324
332
match BlstSig :: sig_validate ( & bytes[ ..48 ] , true ) {
325
333
Ok ( sig) => Ok ( Self ( sig) ) ,
326
- Err ( e) => Err ( blst_err_to_mithril ( e, None )
334
+ Err ( e) => Err ( blst_err_to_mithril ( e, None , None )
327
335
. expect_err ( "If deserialization is not successful, blst returns and error different to SUCCESS." ) )
328
336
}
329
337
}
@@ -376,7 +384,6 @@ impl Signature {
376
384
}
377
385
378
386
let transmuted_vks: Vec < blst_p2 > = vks. iter ( ) . map ( vk_from_p2_affine) . collect ( ) ;
379
-
380
387
let transmuted_sigs: Vec < blst_p1 > = signatures. iter ( ) . map ( sig_to_p1) . collect ( ) ;
381
388
382
389
let grouped_vks = p2_affines:: from ( transmuted_vks. as_slice ( ) ) ;
@@ -400,6 +407,7 @@ impl Signature {
400
407
blst_err_to_mithril (
401
408
aggr_sig. 0 . verify ( false , msg, & [ ] , & [ ] , & aggr_vk. 0 , false ) ,
402
409
Some ( aggr_sig) ,
410
+ None ,
403
411
)
404
412
}
405
413
@@ -415,7 +423,7 @@ impl Signature {
415
423
false ,
416
424
) {
417
425
Ok ( sig) => BlstSig :: from_aggregate ( & sig) ,
418
- Err ( e) => return blst_err_to_mithril ( e, None ) ,
426
+ Err ( e) => return blst_err_to_mithril ( e, None , None ) ,
419
427
} ;
420
428
421
429
let p2_vks: Vec < & BlstVk > = vks. iter ( ) . map ( |vk| & vk. 0 ) . collect ( ) ;
@@ -427,6 +435,7 @@ impl Signature {
427
435
blst_err_to_mithril (
428
436
batched_sig. aggregate_verify ( false , & slice_msgs, & [ ] , & p2_vks, false ) ,
429
437
None ,
438
+ None ,
430
439
)
431
440
. map_err ( |_| MultiSignatureError :: BatchInvalid )
432
441
}
@@ -628,6 +637,8 @@ mod unsafe_helpers {
628
637
#[ cfg( test) ]
629
638
mod tests {
630
639
use super :: * ;
640
+ use crate :: error:: RegisterError ;
641
+ use crate :: key_reg:: KeyReg ;
631
642
use proptest:: prelude:: * ;
632
643
use rand_chacha:: ChaCha20Rng ;
633
644
use rand_core:: { OsRng , SeedableRng } ;
@@ -643,19 +654,68 @@ mod tests {
643
654
let sk = SigningKey :: gen ( & mut ChaCha20Rng :: from_seed( seed) ) ;
644
655
let vk = VerificationKey :: from( & sk) ;
645
656
let sig = sk. sign( & msg) ;
646
- assert!( sig. verify( & msg, & vk) . is_ok( ) ) ;
657
+
658
+ sig. verify( & msg, & vk) . unwrap( ) ;
647
659
}
648
660
649
661
#[ test]
650
- fn test_invalid_sig( msg in prop:: collection:: vec( any:: <u8 >( ) , 1 ..128 ) ,
651
- seed in any:: <[ u8 ; 32 ] >( ) ,
652
- ) {
662
+ fn test_invalid_sig( msg in prop:: collection:: vec( any:: <u8 >( ) , 1 ..128 ) , seed in any:: <[ u8 ; 32 ] >( ) ) {
653
663
let mut rng = ChaCha20Rng :: from_seed( seed) ;
654
664
let sk1 = SigningKey :: gen ( & mut rng) ;
655
665
let vk1 = VerificationKey :: from( & sk1) ;
656
666
let sk2 = SigningKey :: gen ( & mut rng) ;
657
667
let fake_sig = sk2. sign( & msg) ;
658
- assert!( fake_sig. verify( & msg, & vk1) . is_err( ) ) ;
668
+
669
+ let result = fake_sig. verify( & msg, & vk1) ;
670
+ assert_eq!( result, Err ( MultiSignatureError :: SignatureInvalid ( fake_sig) ) ) ;
671
+ }
672
+
673
+ #[ test]
674
+ fn test_infinity_sig( msg in prop:: collection:: vec( any:: <u8 >( ) , 1 ..128 ) , seed in any:: <[ u8 ; 32 ] >( ) ) {
675
+ let mut rng = ChaCha20Rng :: from_seed( seed) ;
676
+ let sk = SigningKey :: gen ( & mut rng) ;
677
+ let vk = VerificationKey :: from( & sk) ;
678
+
679
+ let p1 = blst_p1:: default ( ) ;
680
+ let sig_infinity = Signature ( p1_affine_to_sig( & p1) ) ;
681
+
682
+ let result = sig_infinity. verify( & msg, & vk) ;
683
+ assert_eq!( result, Err ( MultiSignatureError :: SignatureInfinity ( sig_infinity) ) ) ;
684
+ }
685
+
686
+ #[ test]
687
+ fn test_infinity_vk( seed in any:: <[ u8 ; 32 ] >( ) ) {
688
+ let mut rng = ChaCha20Rng :: from_seed( seed) ;
689
+ let sk = SigningKey :: gen ( & mut rng) ;
690
+ let pop = ProofOfPossession :: from( & sk) ;
691
+
692
+ let p2 = blst_p2:: default ( ) ;
693
+ let vk_infinity = VerificationKey ( p2_affine_to_vk( & p2) ) ;
694
+ let vkpop_infinity = VerificationKeyPoP { vk: vk_infinity, pop } ;
695
+
696
+ let result = vkpop_infinity. check( ) ;
697
+ assert_eq!( result, Err ( MultiSignatureError :: VerificationKeyInfinity ( Box :: new( vkpop_infinity. vk) ) ) ) ;
698
+ }
699
+
700
+ #[ test]
701
+ fn test_keyreg_with_infinity_vk( num_sigs in 2 ..16usize , seed in any:: <[ u8 ; 32 ] >( ) ) {
702
+ let mut rng = ChaCha20Rng :: from_seed( seed) ;
703
+ let mut kr = KeyReg :: init( ) ;
704
+
705
+ let sk = SigningKey :: gen ( & mut rng) ;
706
+ let pop = ProofOfPossession :: from( & sk) ;
707
+ let p2 = blst_p2:: default ( ) ;
708
+ let vk_infinity = VerificationKey ( p2_affine_to_vk( & p2) ) ;
709
+ let vkpop_infinity = VerificationKeyPoP { vk: vk_infinity, pop } ;
710
+
711
+ for _ in 0 ..num_sigs {
712
+ let sk = SigningKey :: gen ( & mut rng) ;
713
+ let vkpop = VerificationKeyPoP :: from( & sk) ;
714
+ let _ = kr. register( 1 , vkpop) ;
715
+ }
716
+
717
+ let result = kr. register( 1 , vkpop_infinity) ;
718
+ assert_eq!( result, Err ( RegisterError :: VerificationKeyInfinity ( Box :: new( vkpop_infinity. vk) ) ) ) ;
659
719
}
660
720
661
721
#[ test]
@@ -675,7 +735,8 @@ mod tests {
675
735
mvks. push( vk) ;
676
736
}
677
737
678
- assert!( Signature :: verify_aggregate( & msg, & mvks, & sigs) . is_ok( ) ) ;
738
+ let result = Signature :: verify_aggregate( & msg, & mvks, & sigs) ;
739
+ assert!( result. is_ok( ) , "Aggregate verification failed {result:?}" ) ;
679
740
}
680
741
681
742
#[ test]
@@ -764,7 +825,8 @@ mod tests {
764
825
let fake_sig = sk. sign( & msg) ;
765
826
batch_sig[ 0 ] = fake_sig;
766
827
767
- assert!( Signature :: batch_verify_aggregates( & batch_msgs, & batch_vk, & batch_sig) . is_err( ) ) ;
828
+ let batch_result = Signature :: batch_verify_aggregates( & batch_msgs, & batch_vk, & batch_sig) ;
829
+ assert_eq!( batch_result, Err ( MultiSignatureError :: BatchInvalid ) ) ;
768
830
}
769
831
}
770
832
0 commit comments