@@ -26,6 +26,17 @@ pub fn sign_message(msg: &PersonalMessage, privkey: &[u8; 32]) -> Result<Vec<u8>
26
26
Ok ( sig. to_vec ( ) )
27
27
}
28
28
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 > {
31
+ let hash = calc_personal_message_hash ( msg) ;
32
+
33
+ let msg = secp256k1:: Message :: from_digest_slice ( hash. as_bytes ( ) . as_slice ( ) ) ?;
34
+ 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 ( ) ;
36
+
37
+ Ok ( sig. to_vec ( ) )
38
+ }
39
+
29
40
/// Verifies signed message.
30
41
///
31
42
/// Produces `Ok(())` if the signature matches the given message and [`secp256k1::Error`]
@@ -72,9 +83,23 @@ mod tests {
72
83
0xF9 , 0x30 , 0x8A , 0x01 , 0x92 , 0x58 , 0xC3 , 0x10 , 0x49 , 0x34 , 0x4F , 0x85 , 0xF8 , 0x9D , 0x52 , 0x29 , 0xB5 , 0x31 , 0xC8 , 0x45 ,
73
84
0x83 , 0x6F , 0x99 , 0xB0 , 0x86 , 0x01 , 0xF1 , 0x13 , 0xBC , 0xE0 , 0x36 , 0xF9 ,
74
85
] )
75
- . unwrap ( ) ;
86
+ . unwrap ( ) ;
76
87
77
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) . expect ( "verify_message failed" ) ;
90
+ }
91
+
92
+ #[ test]
93
+ fn test_basic_sign_without_rand_twice_should_get_same_signature ( ) {
94
+ let pm = PersonalMessage ( "Hello Kaspa!" ) ;
95
+ let privkey: [ u8 ; 32 ] = [
96
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
97
+ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 ,
98
+ ] ;
99
+
100
+ let signature = sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) ;
101
+ let signature_twice = sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) ;
102
+ assert_eq ! ( signature, signature_twice) ;
78
103
}
79
104
80
105
#[ test]
@@ -88,9 +113,10 @@ mod tests {
88
113
0xDF , 0xF1 , 0xD7 , 0x7F , 0x2A , 0x67 , 0x1C , 0x5F , 0x36 , 0x18 , 0x37 , 0x26 , 0xDB , 0x23 , 0x41 , 0xBE , 0x58 , 0xFE , 0xAE , 0x1D ,
89
114
0xA2 , 0xDE , 0xCE , 0xD8 , 0x43 , 0x24 , 0x0F , 0x7B , 0x50 , 0x2B , 0xA6 , 0x59 ,
90
115
] )
91
- . unwrap ( ) ;
116
+ . unwrap ( ) ;
92
117
93
118
verify_message ( & pm, & sign_message ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey) . expect ( "verify_message failed" ) ;
119
+ verify_message ( & pm, & sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey) . expect ( "verify_message failed" ) ;
94
120
}
95
121
96
122
#[ test]
@@ -108,9 +134,10 @@ Ut omnis magnam et accusamus earum rem impedit provident eum commodi repellat qu
108
134
0xDF , 0xF1 , 0xD7 , 0x7F , 0x2A , 0x67 , 0x1C , 0x5F , 0x36 , 0x18 , 0x37 , 0x26 , 0xDB , 0x23 , 0x41 , 0xBE , 0x58 , 0xFE , 0xAE , 0x1D ,
109
135
0xA2 , 0xDE , 0xCE , 0xD8 , 0x43 , 0x24 , 0x0F , 0x7B , 0x50 , 0x2B , 0xA6 , 0x59 ,
110
136
] )
111
- . unwrap ( ) ;
137
+ . unwrap ( ) ;
112
138
113
139
verify_message ( & pm, & sign_message ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey) . expect ( "verify_message failed" ) ;
140
+ verify_message ( & pm, & sign_message_without_rand ( & pm, & privkey) . expect ( "sign_message failed" ) , & pubkey) . expect ( "verify_message failed" ) ;
114
141
}
115
142
116
143
#[ test]
@@ -120,14 +147,14 @@ Ut omnis magnam et accusamus earum rem impedit provident eum commodi repellat qu
120
147
0xF9 , 0x30 , 0x8A , 0x01 , 0x92 , 0x58 , 0xC3 , 0x10 , 0x49 , 0x34 , 0x4F , 0x85 , 0xF8 , 0x9D , 0x52 , 0x29 , 0xB5 , 0x31 , 0xC8 , 0x45 ,
121
148
0x83 , 0x6F , 0x99 , 0xB0 , 0x86 , 0x01 , 0xF1 , 0x13 , 0xBC , 0xE0 , 0x36 , 0xF9 ,
122
149
] )
123
- . unwrap ( ) ;
150
+ . unwrap ( ) ;
124
151
let fake_sig: Vec < u8 > = [
125
152
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
126
153
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
127
154
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
128
155
0x00 , 0x00 , 0x00 , 0x00 ,
129
156
]
130
- . to_vec ( ) ;
157
+ . to_vec ( ) ;
131
158
132
159
let verify_result = verify_message ( & pm, & fake_sig, & pubkey) ;
133
160
assert ! ( verify_result. is_err( ) ) ;
@@ -148,14 +175,14 @@ Ut omnis magnam et accusamus earum rem impedit provident eum commodi repellat qu
148
175
0xF9 , 0x30 , 0x8A , 0x01 , 0x92 , 0x58 , 0xC3 , 0x10 , 0x49 , 0x34 , 0x4F , 0x85 , 0xF8 , 0x9D , 0x52 , 0x29 , 0xB5 , 0x31 , 0xC8 , 0x45 ,
149
176
0x83 , 0x6F , 0x99 , 0xB0 , 0x86 , 0x01 , 0xF1 , 0x13 , 0xBC , 0xE0 , 0x36 , 0xF9 ,
150
177
] )
151
- . unwrap ( ) ;
178
+ . unwrap ( ) ;
152
179
let expected_sig: Vec < u8 > = [
153
180
0x40 , 0xB9 , 0xBB , 0x2B , 0xE0 , 0xAE , 0x02 , 0x60 , 0x72 , 0x79 , 0xED , 0xA6 , 0x40 , 0x15 , 0xA8 , 0xD8 , 0x6E , 0x37 , 0x63 , 0x27 ,
154
181
0x91 , 0x70 , 0x34 , 0x0B , 0x82 , 0x43 , 0xF7 , 0xCE , 0x53 , 0x44 , 0xD7 , 0x7A , 0xFF , 0x11 , 0x91 , 0x59 , 0x8B , 0xAF , 0x2F , 0xD2 ,
155
182
0x61 , 0x49 , 0xCA , 0xC3 , 0xB4 , 0xB1 , 0x2C , 0x2C , 0x43 , 0x32 , 0x61 , 0xC0 , 0x08 , 0x34 , 0xDB , 0x60 , 0x98 , 0xCB , 0x17 , 0x2A ,
156
183
0xA4 , 0x8E , 0xF5 , 0x22 ,
157
184
]
158
- . to_vec ( ) ;
185
+ . to_vec ( ) ;
159
186
160
187
let sig_result = sign_message_with_aux_rand ( & pm, & privkey, & aux_rand) . expect ( "sign_message failed" ) ;
161
188
assert_eq ! ( expected_sig, sig_result) ;
@@ -178,14 +205,14 @@ Ut omnis magnam et accusamus earum rem impedit provident eum commodi repellat qu
178
205
0xDF , 0xF1 , 0xD7 , 0x7F , 0x2A , 0x67 , 0x1C , 0x5F , 0x36 , 0x18 , 0x37 , 0x26 , 0xDB , 0x23 , 0x41 , 0xBE , 0x58 , 0xFE , 0xAE , 0x1D ,
179
206
0xA2 , 0xDE , 0xCE , 0xD8 , 0x43 , 0x24 , 0x0F , 0x7B , 0x50 , 0x2B , 0xA6 , 0x59 ,
180
207
] )
181
- . unwrap ( ) ;
208
+ . unwrap ( ) ;
182
209
let expected_sig: Vec < u8 > = [
183
210
0xEB , 0x9E , 0x8A , 0x3C , 0x54 , 0x7E , 0xB9 , 0x1B , 0x6A , 0x75 , 0x92 , 0x64 , 0x4F , 0x32 , 0x8F , 0x06 , 0x48 , 0xBD , 0xD2 , 0x1A ,
184
211
0xBA , 0x3C , 0xD4 , 0x47 , 0x87 , 0xD4 , 0x29 , 0xD4 , 0xD7 , 0x90 , 0xAA , 0x8B , 0x96 , 0x27 , 0x45 , 0x69 , 0x1F , 0x3B , 0x47 , 0x2E ,
185
212
0xD8 , 0xD6 , 0x5F , 0x3B , 0x77 , 0x0E , 0xCB , 0x4F , 0x77 , 0x7B , 0xD1 , 0x7B , 0x1D , 0x30 , 0x91 , 0x00 , 0x91 , 0x9B , 0x53 , 0xE0 ,
186
213
0xE2 , 0x06 , 0xB4 , 0xC6 ,
187
214
]
188
- . to_vec ( ) ;
215
+ . to_vec ( ) ;
189
216
190
217
let sig_result = sign_message_with_aux_rand ( & pm, & privkey, & aux_rand) . expect ( "sign_message failed" ) ;
191
218
assert_eq ! ( expected_sig, sig_result) ;
@@ -208,14 +235,14 @@ Ut omnis magnam et accusamus earum rem impedit provident eum commodi repellat qu
208
235
0xDF , 0xF1 , 0xD7 , 0x7F , 0x2A , 0x67 , 0x1C , 0x5F , 0x36 , 0x18 , 0x37 , 0x26 , 0xDB , 0x23 , 0x41 , 0xBE , 0x58 , 0xFE , 0xAE , 0x1D ,
209
236
0xA2 , 0xDE , 0xCE , 0xD8 , 0x43 , 0x24 , 0x0F , 0x7B , 0x50 , 0x2B , 0xA6 , 0x59 ,
210
237
] )
211
- . unwrap ( ) ;
238
+ . unwrap ( ) ;
212
239
let expected_sig: Vec < u8 > = [
213
240
0x81 , 0x06 , 0x53 , 0xD5 , 0xF8 , 0x02 , 0x06 , 0xDB , 0x51 , 0x96 , 0x72 , 0x36 , 0x2A , 0xDD , 0x6C , 0x98 , 0xDA , 0xD3 , 0x78 , 0x84 ,
214
241
0x4E , 0x5B , 0xA4 , 0xD8 , 0x9A , 0x22 , 0xC9 , 0xF0 , 0xC7 , 0x09 , 0x2E , 0x8C , 0xEC , 0xBA , 0x73 , 0x4F , 0xFF , 0x79 , 0x22 , 0xB6 ,
215
242
0x56 , 0xB4 , 0xBE , 0x3F , 0x4B , 0x1F , 0x09 , 0x88 , 0x99 , 0xC9 , 0x5C , 0xB5 , 0xC1 , 0x02 , 0x3D , 0xCE , 0x35 , 0x19 , 0x20 , 0x8A ,
216
243
0xFA , 0xFB , 0x59 , 0xBC ,
217
244
]
218
- . to_vec ( ) ;
245
+ . to_vec ( ) ;
219
246
220
247
let sig_result = sign_message_with_aux_rand ( & pm, & privkey, & aux_rand) . expect ( "sign_message failed" ) ;
221
248
assert_eq ! ( expected_sig, sig_result) ;
@@ -242,14 +269,14 @@ Ut omnis magnam et accusamus earum rem impedit provident eum commodi repellat qu
242
269
0xDF , 0xF1 , 0xD7 , 0x7F , 0x2A , 0x67 , 0x1C , 0x5F , 0x36 , 0x18 , 0x37 , 0x26 , 0xDB , 0x23 , 0x41 , 0xBE , 0x58 , 0xFE , 0xAE , 0x1D ,
243
270
0xA2 , 0xDE , 0xCE , 0xD8 , 0x43 , 0x24 , 0x0F , 0x7B , 0x50 , 0x2B , 0xA6 , 0x59 ,
244
271
] )
245
- . unwrap ( ) ;
272
+ . unwrap ( ) ;
246
273
let expected_sig: Vec < u8 > = [
247
274
0x40 , 0xCB , 0xBD , 0x39 , 0x38 , 0x86 , 0x7B , 0x10 , 0x07 , 0x6B , 0xB1 , 0x48 , 0x35 , 0x55 , 0x7C , 0x06 , 0x2F , 0x5B , 0xF6 , 0xA4 ,
248
275
0x68 , 0x29 , 0x95 , 0xFC , 0x8B , 0x0A , 0x1C , 0xD2 , 0xED , 0x98 , 0x6E , 0xED , 0xAA , 0xA0 , 0x0C , 0xFE , 0x04 , 0xF6 , 0xC9 , 0xE5 ,
249
276
0xA9 , 0x54 , 0x6B , 0x86 , 0x07 , 0x32 , 0xE5 , 0xB9 , 0x03 , 0xCC , 0x82 , 0x78 , 0x02 , 0x28 , 0x64 , 0x7D , 0x53 , 0x75 , 0xBE , 0xC3 ,
250
277
0xD2 , 0xA4 , 0x98 , 0x3A ,
251
278
]
252
- . to_vec ( ) ;
279
+ . to_vec ( ) ;
253
280
254
281
let sig_result = sign_message_with_aux_rand ( & pm, & privkey, & aux_rand) . expect ( "sign_message failed" ) ;
255
282
assert_eq ! ( expected_sig, sig_result) ;
0 commit comments