Skip to content

Commit 023c9e1

Browse files
committed
Add SignFunction trait to document parameters
1 parent 95d0adc commit 023c9e1

File tree

6 files changed

+44
-42
lines changed

6 files changed

+44
-42
lines changed

fuzz/src/invoice_request_deser.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use lightning::ln::PaymentHash;
1616
use lightning::ln::features::BlindedHopFeatures;
1717
use lightning::offers::invoice::{BlindedPayInfo, UnsignedBolt12Invoice};
1818
use lightning::offers::invoice_request::InvoiceRequest;
19+
use lightning::offers::merkle::TaggedHash;
1920
use lightning::offers::parse::Bolt12SemanticError;
2021
use lightning::util::ser::Writeable;
2122

@@ -37,16 +38,16 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3738
let even_pubkey = x_only_pubkey.public_key(Parity::Even);
3839
if signing_pubkey == odd_pubkey || signing_pubkey == even_pubkey {
3940
unsigned_invoice
40-
.sign::<_, Infallible>(
41-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
41+
.sign::<_, Infallible>(|message: &TaggedHash|
42+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
4243
)
4344
.unwrap()
4445
.write(&mut buffer)
4546
.unwrap();
4647
} else {
4748
unsigned_invoice
48-
.sign::<_, Infallible>(
49-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
49+
.sign::<_, Infallible>(|message: &TaggedHash|
50+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
5051
)
5152
.unwrap_err();
5253
}

fuzz/src/offer_deser.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use bitcoin::secp256k1::{KeyPair, PublicKey, Secp256k1, SecretKey};
1111
use crate::utils::test_logger;
1212
use core::convert::{Infallible, TryFrom};
1313
use lightning::offers::invoice_request::UnsignedInvoiceRequest;
14+
use lightning::offers::merkle::TaggedHash;
1415
use lightning::offers::offer::{Amount, Offer, Quantity};
1516
use lightning::offers::parse::Bolt12SemanticError;
1617
use lightning::util::ser::Writeable;
@@ -29,8 +30,8 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
2930

3031
if let Ok(invoice_request) = build_response(&offer, pubkey) {
3132
invoice_request
32-
.sign::<_, Infallible>(
33-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
33+
.sign::<_, Infallible>(|message: &TaggedHash|
34+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
3435
)
3536
.unwrap()
3637
.write(&mut buffer)

fuzz/src/refund_deser.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use lightning::sign::EntropySource;
1515
use lightning::ln::PaymentHash;
1616
use lightning::ln::features::BlindedHopFeatures;
1717
use lightning::offers::invoice::{BlindedPayInfo, UnsignedBolt12Invoice};
18+
use lightning::offers::merkle::TaggedHash;
1819
use lightning::offers::parse::Bolt12SemanticError;
1920
use lightning::offers::refund::Refund;
2021
use lightning::util::ser::Writeable;
@@ -33,8 +34,8 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3334

3435
if let Ok(invoice) = build_response(&refund, pubkey, &secp_ctx) {
3536
invoice
36-
.sign::<_, Infallible>(
37-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
37+
.sign::<_, Infallible>(|message: &TaggedHash|
38+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
3839
)
3940
.unwrap()
4041
.write(&mut buffer)

lightning/src/offers/invoice.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
//! use bitcoin::secp256k1::{KeyPair, PublicKey, Secp256k1, SecretKey};
2525
//! use core::convert::{Infallible, TryFrom};
2626
//! use lightning::offers::invoice_request::InvoiceRequest;
27+
//! use lightning::offers::merkle::TaggedHash;
2728
//! use lightning::offers::refund::Refund;
2829
//! use lightning::util::ser::Writeable;
2930
//!
@@ -55,7 +56,7 @@
5556
//! .allow_mpp()
5657
//! .fallback_v0_p2wpkh(&wpubkey_hash)
5758
//! .build()?
58-
//! .sign::<_, Infallible>(|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
59+
//! .sign::<_, Infallible>(|message: &TaggedHash| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
5960
//! .expect("failed verifying signature")
6061
//! .write(&mut buffer)
6162
//! .unwrap();
@@ -84,7 +85,7 @@
8485
//! .allow_mpp()
8586
//! .fallback_v0_p2wpkh(&wpubkey_hash)
8687
//! .build()?
87-
//! .sign::<_, Infallible>(|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
88+
//! .sign::<_, Infallible>(|message: &TaggedHash| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
8889
//! .expect("failed verifying signature")
8990
//! .write(&mut buffer)
9091
//! .unwrap();
@@ -110,7 +111,7 @@ use crate::ln::features::{BlindedHopFeatures, Bolt12InvoiceFeatures};
110111
use crate::ln::inbound_payment::ExpandedKey;
111112
use crate::ln::msgs::DecodeError;
112113
use crate::offers::invoice_request::{INVOICE_REQUEST_PAYER_ID_TYPE, INVOICE_REQUEST_TYPES, IV_BYTES as INVOICE_REQUEST_IV_BYTES, InvoiceRequest, InvoiceRequestContents, InvoiceRequestTlvStream, InvoiceRequestTlvStreamRef};
113-
use crate::offers::merkle::{SignError, SignatureTlvStream, SignatureTlvStreamRef, TaggedHash, TlvStream, WithoutSignatures, self};
114+
use crate::offers::merkle::{SignError, SignFunction, SignatureTlvStream, SignatureTlvStreamRef, TaggedHash, TlvStream, WithoutSignatures, self};
114115
use crate::offers::offer::{Amount, OFFER_TYPES, OfferTlvStream, OfferTlvStreamRef};
115116
use crate::offers::parse::{Bolt12ParseError, Bolt12SemanticError, ParsedMessage};
116117
use crate::offers::payer::{PAYER_METADATA_TYPE, PayerTlvStream, PayerTlvStreamRef};
@@ -360,8 +361,8 @@ impl<'a> InvoiceBuilder<'a, DerivedSigningPubkey> {
360361

361362
let keys = keys.unwrap();
362363
let invoice = unsigned_invoice
363-
.sign::<_, Infallible>(
364-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
364+
.sign::<_, Infallible>(|message: &TaggedHash|
365+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
365366
)
366367
.unwrap();
367368
Ok(invoice)
@@ -383,10 +384,7 @@ impl<'a> UnsignedBolt12Invoice<'a> {
383384
/// Signs the invoice using the given function.
384385
///
385386
/// This is not exported to bindings users as functions aren't currently mapped.
386-
pub fn sign<F, E>(self, sign: F) -> Result<Bolt12Invoice, SignError<E>>
387-
where
388-
F: FnOnce(&TaggedHash) -> Result<Signature, E>
389-
{
387+
pub fn sign<F: SignFunction<E>, E>(self, sign: F) -> Result<Bolt12Invoice, SignError<E>> {
390388
// Use the invoice_request bytes instead of the invoice_request TLV stream as the latter may
391389
// have contained unknown TLV records, which are not stored in `InvoiceRequestContents` or
392390
// `RefundContents`.
@@ -966,7 +964,7 @@ mod tests {
966964
use crate::ln::inbound_payment::ExpandedKey;
967965
use crate::ln::msgs::DecodeError;
968966
use crate::offers::invoice_request::InvoiceRequestTlvStreamRef;
969-
use crate::offers::merkle::{SignError, SignatureTlvStreamRef, self};
967+
use crate::offers::merkle::{SignError, SignatureTlvStreamRef, TaggedHash, self};
970968
use crate::offers::offer::{OfferBuilder, OfferTlvStreamRef, Quantity};
971969
use crate::offers::parse::{Bolt12ParseError, Bolt12SemanticError};
972970
use crate::offers::payer::PayerTlvStreamRef;
@@ -1464,7 +1462,7 @@ mod tests {
14641462
.sign(payer_sign).unwrap()
14651463
.respond_with_no_std(payment_paths(), payment_hash(), now()).unwrap()
14661464
.build().unwrap()
1467-
.sign(|_| Err(()))
1465+
.sign(|_: &TaggedHash| Err(()))
14681466
{
14691467
Ok(_) => panic!("expected error"),
14701468
Err(e) => assert_eq!(e, SignError::Signing(())),

lightning/src/offers/invoice_request.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
//! use core::convert::Infallible;
2929
//! use lightning::ln::features::OfferFeatures;
3030
//! use lightning::offers::offer::Offer;
31+
//! use lightning::offers::merkle::TaggedHash;
3132
//! use lightning::util::ser::Writeable;
3233
//!
3334
//! # fn parse() -> Result<(), lightning::offers::parse::Bolt12ParseError> {
@@ -44,7 +45,7 @@
4445
//! .quantity(5)?
4546
//! .payer_note("foo".to_string())
4647
//! .build()?
47-
//! .sign::<_, Infallible>(|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
48+
//! .sign::<_, Infallible>(|message: &TaggedHash| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
4849
//! .expect("failed verifying signature")
4950
//! .write(&mut buffer)
5051
//! .unwrap();
@@ -66,7 +67,7 @@ use crate::ln::features::InvoiceRequestFeatures;
6667
use crate::ln::inbound_payment::{ExpandedKey, IV_LEN, Nonce};
6768
use crate::ln::msgs::DecodeError;
6869
use crate::offers::invoice::{BlindedPayInfo, DerivedSigningPubkey, ExplicitSigningPubkey, InvoiceBuilder};
69-
use crate::offers::merkle::{SignError, SignatureTlvStream, SignatureTlvStreamRef, TaggedHash, self};
70+
use crate::offers::merkle::{SignError, SignFunction, SignatureTlvStream, SignatureTlvStreamRef, TaggedHash, self};
7071
use crate::offers::offer::{Offer, OfferContents, OfferTlvStream, OfferTlvStreamRef};
7172
use crate::offers::parse::{Bolt12ParseError, ParsedMessage, Bolt12SemanticError};
7273
use crate::offers::payer::{PayerContents, PayerTlvStream, PayerTlvStreamRef};
@@ -307,8 +308,8 @@ impl<'a, 'b, T: secp256k1::Signing> InvoiceRequestBuilder<'a, 'b, DerivedPayerId
307308
let secp_ctx = secp_ctx.unwrap();
308309
let keys = keys.unwrap();
309310
let invoice_request = unsigned_invoice_request
310-
.sign::<_, Infallible>(
311-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
311+
.sign::<_, Infallible>(|message: &TaggedHash|
312+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
312313
)
313314
.unwrap();
314315
Ok(invoice_request)
@@ -353,10 +354,7 @@ impl<'a> UnsignedInvoiceRequest<'a> {
353354
/// Signs the invoice request using the given function.
354355
///
355356
/// This is not exported to bindings users as functions are not yet mapped.
356-
pub fn sign<F, E>(self, sign: F) -> Result<InvoiceRequest, SignError<E>>
357-
where
358-
F: FnOnce(&TaggedHash) -> Result<Signature, E>
359-
{
357+
pub fn sign<F: SignFunction<E>, E>(self, sign: F) -> Result<InvoiceRequest, SignError<E>> {
360358
// Use the offer bytes instead of the offer TLV stream as the offer may have contained
361359
// unknown TLV records, which are not stored in `OfferContents`.
362360
let (payer_tlv_stream, _offer_tlv_stream, invoice_request_tlv_stream) =
@@ -1357,7 +1355,7 @@ mod tests {
13571355
.build().unwrap()
13581356
.request_invoice(vec![1; 32], payer_pubkey()).unwrap()
13591357
.build().unwrap()
1360-
.sign(|_| Err(()))
1358+
.sign(|_: &TaggedHash| Err(()))
13611359
{
13621360
Ok(_) => panic!("expected error"),
13631361
Err(e) => assert_eq!(e, SignError::Signing(())),
@@ -1771,8 +1769,8 @@ mod tests {
17711769
.build().unwrap()
17721770
.request_invoice(vec![1; 32], keys.public_key()).unwrap()
17731771
.build().unwrap()
1774-
.sign::<_, Infallible>(
1775-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
1772+
.sign::<_, Infallible>(|message: &TaggedHash|
1773+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
17761774
)
17771775
.unwrap();
17781776

lightning/src/offers/merkle.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ tlv_stream!(SignatureTlvStream, SignatureTlvStreamRef, SIGNATURE_TYPES, {
2525
(240, signature: Signature),
2626
});
2727

28+
/// A function for signing a [`Message`] digest produced from the given [`TaggedHash`]. See
29+
/// [`TaggedHash`] for details.
30+
pub trait SignFunction<E>: FnOnce(&TaggedHash) -> Result<Signature, E> {}
31+
32+
impl<F, E> SignFunction<E> for F where F: FnOnce(&TaggedHash) -> Result<Signature, E> {}
33+
2834
/// A hash for use in a specific context by tweaking with a context-dependent tag as per [BIP 340]
2935
/// and computed over the merkle root of a TLV stream to sign as defined in [BOLT 12].
3036
///
@@ -75,12 +81,9 @@ pub enum SignError<E> {
7581
/// by `sign` to derive the signing keys.
7682
///
7783
/// Panics if `message` does not contain a well-formed TLV stream with at least one TLV record.
78-
pub(super) fn sign_message<F, E>(
84+
pub(super) fn sign_message<F: SignFunction<E>, E>(
7985
sign: F, message: TaggedHash, pubkey: PublicKey,
80-
) -> Result<Signature, SignError<E>>
81-
where
82-
F: FnOnce(&TaggedHash) -> Result<Signature, E>
83-
{
86+
) -> Result<Signature, SignError<E>> {
8487
let signature = sign(&message).map_err(|e| SignError::Signing(e))?;
8588

8689
let pubkey = pubkey.into();
@@ -260,7 +263,7 @@ impl<'a> Writeable for WithoutSignatures<'a> {
260263

261264
#[cfg(test)]
262265
mod tests {
263-
use super::{SIGNATURE_TYPES, TlvStream, WithoutSignatures};
266+
use super::{SIGNATURE_TYPES, TaggedHash, TlvStream, WithoutSignatures};
264267

265268
use bitcoin::hashes::{Hash, sha256};
266269
use bitcoin::secp256k1::{KeyPair, Secp256k1, SecretKey};
@@ -309,8 +312,8 @@ mod tests {
309312
.build_unchecked()
310313
.request_invoice(vec![0; 8], payer_keys.public_key()).unwrap()
311314
.build_unchecked()
312-
.sign::<_, Infallible>(
313-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
315+
.sign::<_, Infallible>(|message: &TaggedHash|
316+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
314317
)
315318
.unwrap();
316319
assert_eq!(
@@ -344,8 +347,8 @@ mod tests {
344347
.build_unchecked()
345348
.request_invoice(vec![0; 8], payer_keys.public_key()).unwrap()
346349
.build_unchecked()
347-
.sign::<_, Infallible>(
348-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
350+
.sign::<_, Infallible>(|message: &TaggedHash|
351+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
349352
)
350353
.unwrap();
351354

@@ -376,8 +379,8 @@ mod tests {
376379
.build_unchecked()
377380
.request_invoice(vec![0; 8], payer_keys.public_key()).unwrap()
378381
.build_unchecked()
379-
.sign::<_, Infallible>(
380-
|message| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
382+
.sign::<_, Infallible>(|message: &TaggedHash|
383+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
381384
)
382385
.unwrap();
383386

0 commit comments

Comments
 (0)