File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -727,4 +727,41 @@ mod tests {
727727 ) ) ;
728728 assert ! ( !batch. verify( & mut rand:: thread_rng( ) ) ) ;
729729 }
730+
731+ #[ test]
732+ fn test_zero_signature_fails ( ) {
733+ let ( _, public_key, message, _) = vector_1 ( ) ;
734+ let zero_sig = Signature :: decode ( vec ! [ 0u8 ; Signature :: SIZE ] . as_ref ( ) ) . unwrap ( ) ;
735+ assert ! ( !Ed25519 :: verify( None , & message, & public_key, & zero_sig) ) ;
736+ }
737+
738+ #[ test]
739+ fn test_high_s_fails ( ) {
740+ let ( _, public_key, message, signature) = vector_1 ( ) ;
741+ let mut bad_signature = signature. to_vec ( ) ;
742+ bad_signature[ 63 ] |= 0x80 ; // make S non-canonical
743+ let bad_signature = Signature :: decode ( bad_signature. as_ref ( ) ) . unwrap ( ) ;
744+ assert ! ( !Ed25519 :: verify(
745+ None ,
746+ & message,
747+ & public_key,
748+ & bad_signature
749+ ) ) ;
750+ }
751+
752+ #[ test]
753+ fn test_invalid_r_fails ( ) {
754+ let ( _, public_key, message, signature) = vector_1 ( ) ;
755+ let mut bad_signature = signature. to_vec ( ) ;
756+ for b in bad_signature. iter_mut ( ) . take ( 32 ) {
757+ * b = 0xff ; // invalid R component
758+ }
759+ let bad_signature = Signature :: decode ( bad_signature. as_ref ( ) ) . unwrap ( ) ;
760+ assert ! ( !Ed25519 :: verify(
761+ None ,
762+ & message,
763+ & public_key,
764+ & bad_signature
765+ ) ) ;
766+ }
730767}
Original file line number Diff line number Diff line change @@ -495,6 +495,38 @@ mod tests {
495495 ) ;
496496 }
497497
498+ #[ test]
499+ fn test_decode_zero_signature_fails ( ) {
500+ let result = Signature :: decode ( vec ! [ 0u8 ; SIGNATURE_LENGTH ] . as_ref ( ) ) ;
501+ assert ! ( result. is_err( ) ) ;
502+ }
503+
504+ #[ test]
505+ fn test_decode_high_s_signature_fails ( ) {
506+ let ( private_key, _) = vector_keypair_1 ( ) ;
507+ let message = b"edge" ;
508+ let mut signer = <Secp256r1 as CommonwareSigner >:: from ( private_key) . unwrap ( ) ;
509+ let signature = signer. sign ( None , message) ;
510+ let mut bad_signature = signature. to_vec ( ) ;
511+ bad_signature[ 32 ] |= 0x80 ; // force S into upper range
512+ assert ! ( Signature :: decode( bad_signature. as_ref( ) ) . is_err( ) ) ;
513+ }
514+
515+ #[ test]
516+ fn test_decode_zero_r_signature_fails ( ) {
517+ let ( private_key, _) = vector_keypair_1 ( ) ;
518+ let message = b"edge" ;
519+ let mut signer = <Secp256r1 as CommonwareSigner >:: from ( private_key) . unwrap ( ) ;
520+ let signature = signer. sign ( None , message) ;
521+ let mut bad_signature = signature. to_vec ( ) ;
522+ for b in bad_signature. iter_mut ( ) . take ( 32 ) {
523+ * b = 0x00 ;
524+ }
525+ // ensure S component is non-zero
526+ bad_signature[ 32 ] = 1 ;
527+ assert ! ( Signature :: decode( bad_signature. as_ref( ) ) . is_err( ) ) ;
528+ }
529+
498530 // Ensure RFC6979 compliance (should also be tested by underlying library)
499531 #[ test]
500532 fn test_rfc6979 ( ) {
You can’t perform that action at this time.
0 commit comments