@@ -13,7 +13,7 @@ use bitcoin::blockdata::constants::genesis_block;
13
13
use bitcoin:: hash_types:: BlockHash ;
14
14
use bitcoin:: hashes:: { Hash , sha256} ;
15
15
use bitcoin:: network:: constants:: Network ;
16
- use bitcoin:: secp256k1:: { Message , PublicKey } ;
16
+ use bitcoin:: secp256k1:: { Message , PublicKey , Secp256k1 , self } ;
17
17
use bitcoin:: secp256k1:: schnorr:: Signature ;
18
18
use core:: num:: NonZeroU64 ;
19
19
use core:: ops:: { Bound , RangeBounds } ;
@@ -155,11 +155,10 @@ impl OfferBuilder {
155
155
}
156
156
157
157
///
158
- pub fn build_signed < F : FnOnce ( & Message ) -> Signature > ( self , sign : F ) -> Offer {
159
- let mut offer = self . build ( ) ;
160
- let digest = offer. to_message_digest ( ) ;
161
- offer. signature = Some ( sign ( & digest) ) ;
162
- offer
158
+ pub fn build_signed < F > ( self , sign : F ) -> Result < Offer , secp256k1:: Error >
159
+ where F : FnOnce ( & Message ) -> Signature
160
+ {
161
+ self . build ( ) . sign ( sign)
163
162
}
164
163
}
165
164
@@ -265,6 +264,20 @@ impl Offer {
265
264
self . signature . as_ref ( )
266
265
}
267
266
267
+ fn sign < F > ( mut self , sign : F ) -> Result < Self , secp256k1:: Error >
268
+ where F : FnOnce ( & Message ) -> Signature
269
+ {
270
+ let digest = self . to_message_digest ( ) ;
271
+ let signature = sign ( & digest) ;
272
+
273
+ let secp_ctx = Secp256k1 :: verification_only ( ) ;
274
+ let pubkey = self . node_id ( ) ;
275
+ secp_ctx. verify_schnorr ( & signature, & digest, & pubkey. into ( ) ) ?;
276
+
277
+ self . signature = Some ( signature) ;
278
+ Ok ( self )
279
+ }
280
+
268
281
fn to_message_digest ( & self ) -> Message {
269
282
Self :: message_digest ( self . id )
270
283
}
@@ -393,7 +406,7 @@ mod tests {
393
406
}
394
407
395
408
fn privkey ( ) -> SecretKey {
396
- SecretKey :: from_slice ( & [ 45 ; 32 ] ) . unwrap ( )
409
+ SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( )
397
410
}
398
411
399
412
fn blinded_pubkey ( byte : u8 ) -> PublicKey {
@@ -448,13 +461,16 @@ mod tests {
448
461
let pubkey = PublicKey :: from ( keys) ;
449
462
450
463
let offer = OfferBuilder :: new ( "foo" . into ( ) , Destination :: NodeId ( pubkey) )
451
- . build_signed ( |digest| secp_ctx. sign_schnorr_no_aux_rand ( digest, & keys) ) ;
464
+ . build_signed ( |digest| secp_ctx. sign_schnorr_no_aux_rand ( digest, & keys) )
465
+ . unwrap ( ) ;
452
466
assert ! ( offer. signature( ) . is_some( ) ) ;
453
467
454
- let message_digest = offer. to_message_digest ( ) ;
455
- let signature = offer. signature ( ) . unwrap ( ) ;
456
- let x_only_pubkey = keys. x_only_public_key ( ) . 0 ;
457
- assert ! ( secp_ctx. verify_schnorr( signature, & message_digest, & x_only_pubkey) . is_ok( ) ) ;
468
+ let wrong_keys = KeyPair :: from_secret_key ( & secp_ctx, & blinded_privkey ( 99 ) ) ;
469
+ assert ! (
470
+ OfferBuilder :: new( "foo" . into( ) , Destination :: NodeId ( pubkey) )
471
+ . build_signed( |digest| secp_ctx. sign_schnorr_no_aux_rand( digest, & wrong_keys) )
472
+ . is_err( )
473
+ ) ;
458
474
}
459
475
460
476
#[ test]
0 commit comments