@@ -15,24 +15,28 @@ impl AsRef<[u8]> for PersonalMessage<'_> {
15
15
}
16
16
}
17
17
18
- /// Sign a message with the given private key
19
- pub fn sign_message ( msg : & PersonalMessage , privkey : & [ u8 ; 32 ] ) -> Result < Vec < u8 > , Error > {
20
- let hash = calc_personal_message_hash ( msg) ;
21
-
22
- let msg = secp256k1:: Message :: from_digest_slice ( hash. as_bytes ( ) . as_slice ( ) ) ?;
23
- let schnorr_key = secp256k1:: Keypair :: from_seckey_slice ( secp256k1:: SECP256K1 , privkey) ?;
24
- let sig: [ u8 ; 64 ] = * schnorr_key. sign_schnorr ( msg) . as_ref ( ) ;
25
-
26
- Ok ( sig. to_vec ( ) )
18
+ #[ derive( Clone ) ]
19
+ pub struct SignMessageOptions {
20
+ /// The auxiliary randomness exists only to mitigate specific kinds of power analysis
21
+ /// side-channel attacks. Providing it definitely improves security, but omitting it
22
+ /// should not be considered dangerous, as most legacy signature schemes don't provide
23
+ /// mitigations against such attacks. To read more about the relevant discussions that
24
+ /// arose in adding this randomness please see: https://github.com/sipa/bips/issues/195
25
+ pub no_aux_rand : bool ,
27
26
}
28
27
29
- /// Sign a message with the given private key without random
30
- pub fn sign_message_without_rand ( msg : & PersonalMessage , privkey : & [ u8 ; 32 ] ) -> Result < Vec < u8 > , Error > {
28
+ /// Sign a message with the given private key
29
+ pub fn sign_message ( msg : & PersonalMessage , privkey : & [ u8 ; 32 ] , options : & SignMessageOptions ) -> Result < Vec < u8 > , Error > {
31
30
let hash = calc_personal_message_hash ( msg) ;
32
31
33
32
let msg = secp256k1:: Message :: from_digest_slice ( hash. as_bytes ( ) . as_slice ( ) ) ?;
34
33
let schnorr_key = secp256k1:: Keypair :: from_seckey_slice ( secp256k1:: SECP256K1 , privkey) ?;
35
- let sig: [ u8 ; 64 ] = * secp256k1:: SECP256K1 . sign_schnorr_no_aux_rand ( & msg, & schnorr_key) . as_ref ( ) ;
34
+
35
+ let sig: [ u8 ; 64 ] = if options. no_aux_rand {
36
+ * schnorr_key. sign_schnorr ( msg) . as_ref ( )
37
+ } else {
38
+ * secp256k1:: Secp256k1 :: new ( ) . sign_schnorr_no_aux_rand ( & msg, & schnorr_key) . as_ref ( )
39
+ } ;
36
40
37
41
Ok ( sig. to_vec ( ) )
38
42
}
@@ -85,8 +89,11 @@ mod tests {
85
89
] )
86
90
. unwrap ( ) ;
87
91
88
- verify_message ( & pm, & sign_message ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey) . expect ( "verify_message failed" ) ;
89
- verify_message ( & pm, & sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey)
92
+ let sign_with_aux_rand = SignMessageOptions { no_aux_rand : false } ;
93
+ let sign_with_no_aux_rand = SignMessageOptions { no_aux_rand : true } ;
94
+ verify_message ( & pm, & sign_message ( & pm, & privkey, & sign_with_aux_rand) . expect ( "sign_message failed" ) , & pubkey)
95
+ . expect ( "verify_message failed" ) ;
96
+ verify_message ( & pm, & sign_message ( & pm, & privkey, & sign_with_no_aux_rand) . expect ( "sign_message failed" ) , & pubkey)
90
97
. expect ( "verify_message failed" ) ;
91
98
}
92
99
@@ -98,8 +105,9 @@ mod tests {
98
105
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 ,
99
106
] ;
100
107
101
- let signature = sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) ;
102
- let signature_twice = sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) ;
108
+ let sign_with_no_aux_rand = SignMessageOptions { no_aux_rand : true } ;
109
+ let signature = sign_message ( & pm, & privkey, & sign_with_no_aux_rand) . expect ( "sign_message failed" ) ;
110
+ let signature_twice = sign_message ( & pm, & privkey, & sign_with_no_aux_rand) . expect ( "sign_message failed" ) ;
103
111
assert_eq ! ( signature, signature_twice) ;
104
112
}
105
113
@@ -116,8 +124,11 @@ mod tests {
116
124
] )
117
125
. unwrap ( ) ;
118
126
119
- verify_message ( & pm, & sign_message ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey) . expect ( "verify_message failed" ) ;
120
- verify_message ( & pm, & sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey)
127
+ let sign_with_aux_rand = SignMessageOptions { no_aux_rand : false } ;
128
+ let sign_with_no_aux_rand = SignMessageOptions { no_aux_rand : true } ;
129
+ verify_message ( & pm, & sign_message ( & pm, & privkey, & sign_with_aux_rand) . expect ( "sign_message failed" ) , & pubkey)
130
+ . expect ( "verify_message failed" ) ;
131
+ verify_message ( & pm, & sign_message ( & pm, & privkey, & sign_with_no_aux_rand) . expect ( "sign_message failed" ) , & pubkey)
121
132
. expect ( "verify_message failed" ) ;
122
133
}
123
134
@@ -138,8 +149,11 @@ Ut omnis magnam et accusamus earum rem impedit provident eum commodi repellat qu
138
149
] )
139
150
. unwrap ( ) ;
140
151
141
- verify_message ( & pm, & sign_message ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey) . expect ( "verify_message failed" ) ;
142
- verify_message ( & pm, & sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey)
152
+ let sign_with_aux_rand = SignMessageOptions { no_aux_rand : false } ;
153
+ let sign_with_no_aux_rand = SignMessageOptions { no_aux_rand : true } ;
154
+ verify_message ( & pm, & sign_message ( & pm, & privkey, & sign_with_aux_rand) . expect ( "sign_message failed" ) , & pubkey)
155
+ . expect ( "verify_message failed" ) ;
156
+ verify_message ( & pm, & sign_message ( & pm, & privkey, & sign_with_no_aux_rand) . expect ( "sign_message failed" ) , & pubkey)
143
157
. expect ( "verify_message failed" ) ;
144
158
}
145
159
0 commit comments