@@ -660,6 +660,34 @@ impl<C: Context> Secp256k1<C> {
660
660
661
661
}
662
662
663
+ fn der_length_check ( sig : & ffi:: Signature , max_len : usize ) -> bool {
664
+ let mut ser_ret = [ 0 ; 72 ] ;
665
+ let mut len: usize = ser_ret. len ( ) ;
666
+ unsafe {
667
+ let err = ffi:: secp256k1_ecdsa_signature_serialize_der (
668
+ ffi:: secp256k1_context_no_precomp,
669
+ ser_ret. as_mut_c_ptr ( ) ,
670
+ & mut len,
671
+ sig,
672
+ ) ;
673
+ debug_assert ! ( err == 1 ) ;
674
+ }
675
+ len <= max_len
676
+ }
677
+
678
+ fn compact_sig_has_zero_first_bit ( sig : & ffi:: Signature ) -> bool {
679
+ let mut compact = [ 0 ; 64 ] ;
680
+ unsafe {
681
+ let err = ffi:: secp256k1_ecdsa_signature_serialize_compact (
682
+ ffi:: secp256k1_context_no_precomp,
683
+ compact. as_mut_c_ptr ( ) ,
684
+ sig,
685
+ ) ;
686
+ debug_assert ! ( err == 1 ) ;
687
+ }
688
+ compact[ 0 ] < 0x80
689
+ }
690
+
663
691
impl < C : Signing > Secp256k1 < C > {
664
692
665
693
/// Constructs a signature for `msg` using the secret key `sk` and RFC6979 nonce
@@ -678,6 +706,59 @@ impl<C: Signing> Secp256k1<C> {
678
706
}
679
707
}
680
708
709
+ fn sign_grind_with_check (
710
+ & self , msg : & Message ,
711
+ sk : & key:: SecretKey ,
712
+ check : impl Fn ( & ffi:: Signature ) -> bool ) -> Signature {
713
+ let mut entropy_p : * const ffi:: types:: c_void = ptr:: null ( ) ;
714
+ let mut counter : u32 = 0 ;
715
+ let mut extra_entropy = [ 0u8 ; 32 ] ;
716
+ loop {
717
+ unsafe {
718
+ let mut ret = ffi:: Signature :: new ( ) ;
719
+ // We can assume the return value because it's not possible to construct
720
+ // an invalid signature from a valid `Message` and `SecretKey`
721
+ assert_eq ! ( ffi:: secp256k1_ecdsa_sign( self . ctx, & mut ret, msg. as_c_ptr( ) ,
722
+ sk. as_c_ptr( ) , ffi:: secp256k1_nonce_function_rfc6979,
723
+ entropy_p) , 1 ) ;
724
+ if check ( & ret) {
725
+ return Signature :: from ( ret) ;
726
+ }
727
+
728
+ counter += 1 ;
729
+ // From 1.32 can use `to_le_bytes` instead
730
+ let le_counter = counter. to_le ( ) ;
731
+ let le_counter_bytes : [ u8 ; 4 ] = mem:: transmute ( le_counter) ;
732
+ for ( i, b) in le_counter_bytes. iter ( ) . enumerate ( ) {
733
+ extra_entropy[ i] = * b;
734
+ }
735
+
736
+ entropy_p = extra_entropy. as_ptr ( ) as * const ffi:: types:: c_void ;
737
+ }
738
+ }
739
+ }
740
+
741
+ /// Constructs a signature for `msg` using the secret key `sk`, RFC6979 nonce
742
+ /// and "grinds" the nonce by passing extra entropy if necessary to produce
743
+ /// a signature that is less than 71 - bytes_to_grund bytes. The number
744
+ /// of signing operation performed by this function is exponential in the
745
+ /// number of bytes grinded.
746
+ /// Requires a signing capable context.
747
+ pub fn sign_grind_r ( & self , msg : & Message , sk : & key:: SecretKey , bytes_to_grind : usize ) -> Signature {
748
+ let len_check = |s : & ffi:: Signature | der_length_check ( s, 71 - bytes_to_grind) ;
749
+ return self . sign_grind_with_check ( msg, sk, len_check) ;
750
+ }
751
+
752
+ /// Constructs a signature for `msg` using the secret key `sk`, RFC6979 nonce
753
+ /// and "grinds" the nonce by passing extra entropy if necessary to produce
754
+ /// a signature that is less than 71 bytes and compatible with the low r
755
+ /// signature implementation of bitcoin core. In average, this function
756
+ /// will perform two signing operations.
757
+ /// Requires a signing capable context.
758
+ pub fn sign_low_r ( & self , msg : & Message , sk : & key:: SecretKey ) -> Signature {
759
+ return self . sign_grind_with_check ( msg, sk, compact_sig_has_zero_first_bit)
760
+ }
761
+
681
762
/// Generates a random keypair. Convenience function for `key::SecretKey::new`
682
763
/// and `key::PublicKey::from_secret_key`; call those functions directly for
683
764
/// batch key generation. Requires a signing-capable context. Requires compilation
@@ -1003,6 +1084,18 @@ mod tests {
1003
1084
let ( sk, pk) = s. generate_keypair ( & mut thread_rng ( ) ) ;
1004
1085
let sig = s. sign ( & msg, & sk) ;
1005
1086
assert_eq ! ( s. verify( & msg, & sig, & pk) , Ok ( ( ) ) ) ;
1087
+ let low_r_sig = s. sign_low_r ( & msg, & sk) ;
1088
+ assert_eq ! ( s. verify( & msg, & low_r_sig, & pk) , Ok ( ( ) ) ) ;
1089
+ let grind_r_sig = s. sign_grind_r ( & msg, & sk, 1 ) ;
1090
+ assert_eq ! ( s. verify( & msg, & grind_r_sig, & pk) , Ok ( ( ) ) ) ;
1091
+ let compact = sig. serialize_compact ( ) ;
1092
+ if compact[ 0 ] < 0x80 {
1093
+ assert_eq ! ( sig, low_r_sig) ;
1094
+ } else {
1095
+ assert_ne ! ( sig, low_r_sig) ;
1096
+ }
1097
+ assert ! ( super :: compact_sig_has_zero_first_bit( & low_r_sig. 0 ) ) ;
1098
+ assert ! ( super :: der_length_check( & grind_r_sig. 0 , 70 ) ) ;
1006
1099
}
1007
1100
}
1008
1101
@@ -1029,8 +1122,12 @@ mod tests {
1029
1122
for key in wild_keys. iter ( ) . map ( |k| SecretKey :: from_slice ( & k[ ..] ) . unwrap ( ) ) {
1030
1123
for msg in wild_msgs. iter ( ) . map ( |m| Message :: from_slice ( & m[ ..] ) . unwrap ( ) ) {
1031
1124
let sig = s. sign ( & msg, & key) ;
1125
+ let low_r_sig = s. sign_low_r ( & msg, & key) ;
1126
+ let grind_r_sig = s. sign_grind_r ( & msg, & key, 1 ) ;
1032
1127
let pk = PublicKey :: from_secret_key ( & s, & key) ;
1033
1128
assert_eq ! ( s. verify( & msg, & sig, & pk) , Ok ( ( ) ) ) ;
1129
+ assert_eq ! ( s. verify( & msg, & low_r_sig, & pk) , Ok ( ( ) ) ) ;
1130
+ assert_eq ! ( s. verify( & msg, & grind_r_sig, & pk) , Ok ( ( ) ) ) ;
1034
1131
}
1035
1132
}
1036
1133
}
@@ -1090,6 +1187,33 @@ mod tests {
1090
1187
assert_eq ! ( secp. verify( & msg, & sig, & pk) , Ok ( ( ) ) ) ;
1091
1188
}
1092
1189
1190
+ #[ test]
1191
+ fn test_low_r ( ) {
1192
+ let secp = Secp256k1 :: new ( ) ;
1193
+ let msg = hex ! ( "887d04bb1cf1b1554f1b268dfe62d13064ca67ae45348d50d1392ce2d13418ac" ) ;
1194
+ let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
1195
+ let sk = SecretKey :: from_str ( "57f0148f94d13095cfda539d0da0d1541304b678d8b36e243980aab4e1b7cead" ) . unwrap ( ) ;
1196
+ let expected_sig = hex ! ( "047dd4d049db02b430d24c41c7925b2725bcd5a85393513bdec04b4dc363632b1054d0180094122b380f4cfa391e6296244da773173e78fc745c1b9c79f7b713" ) ;
1197
+ let expected_sig = Signature :: from_compact ( & expected_sig) . unwrap ( ) ;
1198
+
1199
+ let sig = secp. sign_low_r ( & msg, & sk) ;
1200
+
1201
+ assert_eq ! ( expected_sig, sig) ;
1202
+ }
1203
+
1204
+ #[ test]
1205
+ fn test_grind_r ( ) {
1206
+ let secp = Secp256k1 :: new ( ) ;
1207
+ let msg = hex ! ( "ef2d5b9a7c61865a95941d0f04285420560df7e9d76890ac1b8867b12ce43167" ) ;
1208
+ let msg = Message :: from_slice ( & msg) . unwrap ( ) ;
1209
+ let sk = SecretKey :: from_str ( "848355d75fe1c354cf05539bb29b2015f1863065bcb6766b44d399ab95c3fa0b" ) . unwrap ( ) ;
1210
+ let expected_sig = Signature :: from_str ( "304302202ffc447100d518c8ba643d11f3e6a83a8640488e7d2537b1954b942408be6ea3021f26e1248dd1e52160c3a38af9769d91a1a806cab5f9d508c103464d3c02d6e1" ) . unwrap ( ) ;
1211
+
1212
+ let sig = secp. sign_grind_r ( & msg, & sk, 2 ) ;
1213
+
1214
+ assert_eq ! ( expected_sig, sig) ;
1215
+ }
1216
+
1093
1217
#[ cfg( feature = "serde" ) ]
1094
1218
#[ test]
1095
1219
fn test_signature_serde ( ) {
0 commit comments