@@ -76,13 +76,34 @@ impl AsRef<TaggedHash> for TaggedHash {
76
76
77
77
/// Error when signing messages.
78
78
#[ derive( Debug , PartialEq ) ]
79
- pub enum SignError < E > {
79
+ pub enum SignError < E = ( ) > {
80
80
/// User-defined error when signing the message.
81
81
Signing ( E ) ,
82
82
/// Error when verifying the produced signature using the given pubkey.
83
83
Verification ( secp256k1:: Error ) ,
84
84
}
85
85
86
+ /// A function for signing a [`TaggedHash`].
87
+ pub trait SignFunction < T : AsRef < TaggedHash > > {
88
+ /// Error type returned by the function.
89
+ type Error ;
90
+
91
+ /// Signs a [`TaggedHash`] computed over the merkle root of `message`'s TLV stream.
92
+ fn sign ( & self , message : & T ) -> Result < Signature , Self :: Error > ;
93
+ }
94
+
95
+ impl < F , T , E > SignFunction < T > for F
96
+ where
97
+ F : Fn ( & T ) -> Result < Signature , E > ,
98
+ T : AsRef < TaggedHash > ,
99
+ {
100
+ type Error = E ;
101
+
102
+ fn sign ( & self , message : & T ) -> Result < Signature , E > {
103
+ self ( message)
104
+ }
105
+ }
106
+
86
107
/// Signs a [`TaggedHash`] computed over the merkle root of `message`'s TLV stream, checking if it
87
108
/// can be verified with the supplied `pubkey`.
88
109
///
@@ -92,14 +113,14 @@ pub enum SignError<E> {
92
113
///
93
114
/// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
94
115
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
95
- pub ( super ) fn sign_message < F , E , T > (
96
- sign : F , message : & T , pubkey : PublicKey ,
116
+ pub ( super ) fn sign_message < F , T , E > (
117
+ f : F , message : & T , pubkey : PublicKey ,
97
118
) -> Result < Signature , SignError < E > >
98
119
where
99
- F : FnOnce ( & T ) -> Result < Signature , E > ,
120
+ F : SignFunction < T , Error = E > ,
100
121
T : AsRef < TaggedHash > ,
101
122
{
102
- let signature = sign ( message) . map_err ( |e| SignError :: Signing ( e) ) ?;
123
+ let signature = f . sign ( message) . map_err ( |e| SignError :: Signing ( e) ) ?;
103
124
104
125
let digest = message. as_ref ( ) . as_digest ( ) ;
105
126
let pubkey = pubkey. into ( ) ;
@@ -278,7 +299,7 @@ mod tests {
278
299
use bitcoin:: secp256k1:: schnorr:: Signature ;
279
300
use core:: convert:: Infallible ;
280
301
use crate :: offers:: offer:: { Amount , OfferBuilder } ;
281
- use crate :: offers:: invoice_request:: InvoiceRequest ;
302
+ use crate :: offers:: invoice_request:: { InvoiceRequest , UnsignedInvoiceRequest } ;
282
303
use crate :: offers:: parse:: Bech32Encode ;
283
304
use crate :: offers:: test_utils:: { payer_pubkey, recipient_pubkey} ;
284
305
use crate :: util:: ser:: Writeable ;
@@ -321,9 +342,9 @@ mod tests {
321
342
. build_unchecked ( )
322
343
. request_invoice ( vec ! [ 0 ; 8 ] , payer_keys. public_key ( ) ) . unwrap ( )
323
344
. build_unchecked ( )
324
- . sign :: < _ , Infallible > (
325
- |message| Ok ( secp_ctx. sign_schnorr_no_aux_rand ( message. as_ref ( ) . as_digest ( ) , & payer_keys) )
326
- )
345
+ . sign ( | message : & UnsignedInvoiceRequest | -> Result < _ , Infallible > {
346
+ Ok ( secp_ctx. sign_schnorr_no_aux_rand ( message. as_ref ( ) . as_digest ( ) , & payer_keys) )
347
+ } )
327
348
. unwrap ( ) ;
328
349
assert_eq ! (
329
350
invoice_request. to_string( ) ,
@@ -375,9 +396,9 @@ mod tests {
375
396
. build_unchecked ( )
376
397
. request_invoice ( vec ! [ 0 ; 8 ] , payer_keys. public_key ( ) ) . unwrap ( )
377
398
. build_unchecked ( )
378
- . sign :: < _ , Infallible > (
379
- |message| Ok ( secp_ctx. sign_schnorr_no_aux_rand ( message. as_ref ( ) . as_digest ( ) , & payer_keys) )
380
- )
399
+ . sign ( | message : & UnsignedInvoiceRequest | -> Result < _ , Infallible > {
400
+ Ok ( secp_ctx. sign_schnorr_no_aux_rand ( message. as_ref ( ) . as_digest ( ) , & payer_keys) )
401
+ } )
381
402
. unwrap ( ) ;
382
403
383
404
let mut bytes_without_signature = Vec :: new ( ) ;
@@ -407,9 +428,9 @@ mod tests {
407
428
. build_unchecked ( )
408
429
. request_invoice ( vec ! [ 0 ; 8 ] , payer_keys. public_key ( ) ) . unwrap ( )
409
430
. build_unchecked ( )
410
- . sign :: < _ , Infallible > (
411
- |message| Ok ( secp_ctx. sign_schnorr_no_aux_rand ( message. as_ref ( ) . as_digest ( ) , & payer_keys) )
412
- )
431
+ . sign ( | message : & UnsignedInvoiceRequest | -> Result < _ , Infallible > {
432
+ Ok ( secp_ctx. sign_schnorr_no_aux_rand ( message. as_ref ( ) . as_digest ( ) , & payer_keys) )
433
+ } )
413
434
. unwrap ( ) ;
414
435
415
436
let tlv_stream = TlvStream :: new ( & invoice_request. bytes ) . range ( 0 ..1 )
0 commit comments