Skip to content

Commit 71d7a3c

Browse files
committed
f - Rename TaggedBytes to TaggedMessage and rewrite docs
1 parent c9c7093 commit 71d7a3c

File tree

7 files changed

+53
-46
lines changed

7 files changed

+53
-46
lines changed

fuzz/src/invoice_request_deser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3838
if signing_pubkey == odd_pubkey || signing_pubkey == even_pubkey {
3939
unsigned_invoice
4040
.sign::<_, Infallible>(
41-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
41+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
4242
)
4343
.unwrap()
4444
.write(&mut buffer)
4545
.unwrap();
4646
} else {
4747
unsigned_invoice
4848
.sign::<_, Infallible>(
49-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
49+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
5050
)
5151
.unwrap_err();
5252
}

fuzz/src/offer_deser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3030
if let Ok(invoice_request) = build_response(&offer, pubkey) {
3131
invoice_request
3232
.sign::<_, Infallible>(
33-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
33+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
3434
)
3535
.unwrap()
3636
.write(&mut buffer)

fuzz/src/refund_deser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
3434
if let Ok(invoice) = build_response(&refund, pubkey, &secp_ctx) {
3535
invoice
3636
.sign::<_, Infallible>(
37-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
37+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
3838
)
3939
.unwrap()
4040
.write(&mut buffer)

lightning/src/offers/invoice.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
//! .allow_mpp()
5656
//! .fallback_v0_p2wpkh(&wpubkey_hash)
5757
//! .build()?
58-
//! .sign::<_, Infallible>(|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys)))
58+
//! .sign::<_, Infallible>(|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
5959
//! .expect("failed verifying signature")
6060
//! .write(&mut buffer)
6161
//! .unwrap();
@@ -84,7 +84,7 @@
8484
//! .allow_mpp()
8585
//! .fallback_v0_p2wpkh(&wpubkey_hash)
8686
//! .build()?
87-
//! .sign::<_, Infallible>(|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys)))
87+
//! .sign::<_, Infallible>(|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
8888
//! .expect("failed verifying signature")
8989
//! .write(&mut buffer)
9090
//! .unwrap();
@@ -110,7 +110,7 @@ use crate::ln::features::{BlindedHopFeatures, Bolt12InvoiceFeatures};
110110
use crate::ln::inbound_payment::ExpandedKey;
111111
use crate::ln::msgs::DecodeError;
112112
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, TaggedBytes, TlvStream, WithoutSignatures, self};
113+
use crate::offers::merkle::{SignError, SignatureTlvStream, SignatureTlvStreamRef, TaggedHash, TlvStream, WithoutSignatures, self};
114114
use crate::offers::offer::{Amount, OFFER_TYPES, OfferTlvStream, OfferTlvStreamRef};
115115
use crate::offers::parse::{ParseError, ParsedMessage, SemanticError};
116116
use crate::offers::payer::{PAYER_METADATA_TYPE, PayerTlvStream, PayerTlvStreamRef};
@@ -359,7 +359,7 @@ impl<'a> InvoiceBuilder<'a, DerivedSigningPubkey> {
359359
let keys = keys.unwrap();
360360
let invoice = unsigned_invoice
361361
.sign::<_, Infallible>(
362-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
362+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
363363
)
364364
.unwrap();
365365
Ok(invoice)
@@ -383,7 +383,7 @@ impl<'a> UnsignedInvoice<'a> {
383383
/// This is not exported to bindings users as functions aren't currently mapped.
384384
pub fn sign<F, E>(self, sign: F) -> Result<Invoice, SignError<E>>
385385
where
386-
F: FnOnce(&TaggedBytes, &[u8]) -> Result<Signature, E>
386+
F: FnOnce(&TaggedHash, &[u8]) -> Result<Signature, E>
387387
{
388388
// Use the invoice_request bytes instead of the invoice_request TLV stream as the latter may
389389
// have contained unknown TLV records, which are not stored in `InvoiceRequestContents` or
@@ -395,7 +395,7 @@ impl<'a> UnsignedInvoice<'a> {
395395
let mut bytes = Vec::new();
396396
unsigned_tlv_stream.write(&mut bytes).unwrap();
397397

398-
let message = TaggedBytes::new(SIGNATURE_TAG, &bytes);
398+
let message = TaggedHash::new(SIGNATURE_TAG, &bytes);
399399
let metadata = self.invoice.metadata();
400400
let pubkey = self.invoice.fields().signing_pubkey;
401401
let signature = merkle::sign_message(sign, message, metadata, pubkey)?;

lightning/src/offers/invoice_request.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
//! .quantity(5)?
4545
//! .payer_note("foo".to_string())
4646
//! .build()?
47-
//! .sign::<_, Infallible>(|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys)))
47+
//! .sign::<_, Infallible>(|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys)))
4848
//! .expect("failed verifying signature")
4949
//! .write(&mut buffer)
5050
//! .unwrap();
@@ -66,7 +66,7 @@ use crate::ln::features::InvoiceRequestFeatures;
6666
use crate::ln::inbound_payment::{ExpandedKey, IV_LEN, Nonce};
6767
use crate::ln::msgs::DecodeError;
6868
use crate::offers::invoice::{BlindedPayInfo, DerivedSigningPubkey, ExplicitSigningPubkey, InvoiceBuilder};
69-
use crate::offers::merkle::{SignError, SignatureTlvStream, SignatureTlvStreamRef, TaggedBytes, self};
69+
use crate::offers::merkle::{SignError, SignatureTlvStream, SignatureTlvStreamRef, TaggedHash, self};
7070
use crate::offers::offer::{Offer, OfferContents, OfferTlvStream, OfferTlvStreamRef};
7171
use crate::offers::parse::{ParseError, ParsedMessage, SemanticError};
7272
use crate::offers::payer::{PayerContents, PayerTlvStream, PayerTlvStreamRef};
@@ -307,7 +307,7 @@ impl<'a, 'b, T: secp256k1::Signing> InvoiceRequestBuilder<'a, 'b, DerivedPayerId
307307
let keys = keys.unwrap();
308308
let invoice_request = unsigned_invoice_request
309309
.sign::<_, Infallible>(
310-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
310+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
311311
)
312312
.unwrap();
313313
Ok(invoice_request)
@@ -354,7 +354,7 @@ impl<'a> UnsignedInvoiceRequest<'a> {
354354
/// This is not exported to bindings users as functions are not yet mapped.
355355
pub fn sign<F, E>(self, sign: F) -> Result<InvoiceRequest, SignError<E>>
356356
where
357-
F: FnOnce(&TaggedBytes, &[u8]) -> Result<Signature, E>
357+
F: FnOnce(&TaggedHash, &[u8]) -> Result<Signature, E>
358358
{
359359
// Use the offer bytes instead of the offer TLV stream as the offer may have contained
360360
// unknown TLV records, which are not stored in `OfferContents`.
@@ -366,7 +366,7 @@ impl<'a> UnsignedInvoiceRequest<'a> {
366366
let mut bytes = Vec::new();
367367
unsigned_tlv_stream.write(&mut bytes).unwrap();
368368

369-
let message = TaggedBytes::new(SIGNATURE_TAG, &bytes);
369+
let message = TaggedHash::new(SIGNATURE_TAG, &bytes);
370370
let metadata = self.offer.metadata().map(|metadata| metadata.as_slice()).unwrap_or(&[]);
371371
let pubkey = self.invoice_request.payer_id;
372372
let signature = merkle::sign_message(sign, message, metadata, pubkey)?;
@@ -794,7 +794,7 @@ mod tests {
794794
use crate::ln::inbound_payment::ExpandedKey;
795795
use crate::ln::msgs::{DecodeError, MAX_VALUE_MSAT};
796796
use crate::offers::invoice::{Invoice, SIGNATURE_TAG as INVOICE_SIGNATURE_TAG};
797-
use crate::offers::merkle::{SignError, SignatureTlvStreamRef, TaggedBytes, self};
797+
use crate::offers::merkle::{SignError, SignatureTlvStreamRef, TaggedHash, self};
798798
use crate::offers::offer::{Amount, OfferBuilder, OfferTlvStreamRef, Quantity};
799799
use crate::offers::parse::{ParseError, SemanticError};
800800
use crate::offers::payer::PayerTlvStreamRef;
@@ -926,7 +926,7 @@ mod tests {
926926
let mut bytes = Vec::new();
927927
tlv_stream.write(&mut bytes).unwrap();
928928

929-
let message = TaggedBytes::new(INVOICE_SIGNATURE_TAG, &bytes);
929+
let message = TaggedHash::new(INVOICE_SIGNATURE_TAG, &bytes);
930930
let signature = merkle::sign_message(
931931
recipient_sign, message, invoice_request.metadata(), recipient_pubkey()
932932
).unwrap();
@@ -951,7 +951,7 @@ mod tests {
951951
let mut bytes = Vec::new();
952952
tlv_stream.write(&mut bytes).unwrap();
953953

954-
let message = TaggedBytes::new(INVOICE_SIGNATURE_TAG, &bytes);
954+
let message = TaggedHash::new(INVOICE_SIGNATURE_TAG, &bytes);
955955
let signature = merkle::sign_message(
956956
recipient_sign, message, &metadata, recipient_pubkey()
957957
).unwrap();
@@ -998,7 +998,7 @@ mod tests {
998998
let mut bytes = Vec::new();
999999
tlv_stream.write(&mut bytes).unwrap();
10001000

1001-
let message = TaggedBytes::new(INVOICE_SIGNATURE_TAG, &bytes);
1001+
let message = TaggedHash::new(INVOICE_SIGNATURE_TAG, &bytes);
10021002
let signature = merkle::sign_message(
10031003
recipient_sign, message, invoice_request.metadata(), recipient_pubkey()
10041004
).unwrap();
@@ -1023,7 +1023,7 @@ mod tests {
10231023
let mut bytes = Vec::new();
10241024
tlv_stream.write(&mut bytes).unwrap();
10251025

1026-
let message = TaggedBytes::new(INVOICE_SIGNATURE_TAG, &bytes);
1026+
let message = TaggedHash::new(INVOICE_SIGNATURE_TAG, &bytes);
10271027
let signature = merkle::sign_message(
10281028
recipient_sign, message, invoice_request.metadata(), recipient_pubkey()
10291029
).unwrap();
@@ -1780,7 +1780,7 @@ mod tests {
17801780
.request_invoice(vec![1; 32], keys.public_key()).unwrap()
17811781
.build().unwrap()
17821782
.sign::<_, Infallible>(
1783-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
1783+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
17841784
)
17851785
.unwrap();
17861786

lightning/src/offers/merkle.rs

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

28-
/// Bytes associated with a tag, which are used to produced a [`Message`] digest to sign.
29-
pub struct TaggedBytes<'a> {
28+
/// A hash for use in a specific context by tweaking with a context-dependent tag as per [BIP 340]
29+
/// and computed over the merkle root of a TLV stream to sign as defined in [BOLT 12].
30+
///
31+
/// The hash is computed lazily from the TLV stream.
32+
///
33+
/// [BIP 340]: https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
34+
/// [BOLT 12]: https://github.com/rustyrussell/lightning-rfc/blob/guilt/offers/12-offer-encoding.md#signature-calculation
35+
pub struct TaggedHash<'a> {
3036
tag: &'a str,
31-
bytes: &'a [u8],
37+
tlv_stream: &'a [u8],
3238
digest: RefCell<Option<Message>>,
3339
}
3440

35-
impl<'a> TaggedBytes<'a> {
36-
/// Creates tagged bytes with the given parameters.
37-
pub fn new(tag: &'a str, bytes: &'a [u8]) -> Self {
38-
Self { tag, bytes, digest: RefCell::new(None) }
41+
impl<'a> TaggedHash<'a> {
42+
/// Creates a tagged hash with the given parameters.
43+
pub fn new(tag: &'a str, tlv_stream: &'a [u8]) -> Self {
44+
Self { tag, tlv_stream, digest: RefCell::new(None) }
3945
}
4046

4147
/// Returns the digest to sign.
42-
pub fn digest(&self) -> Message {
43-
*self.digest.borrow_mut().get_or_insert_with(|| message_digest(self.tag, self.bytes))
48+
pub fn to_digest(&self) -> Message {
49+
*self.digest.borrow_mut().get_or_insert_with(|| message_digest(self.tag, self.tlv_stream))
4450
}
4551
}
4652

@@ -53,24 +59,25 @@ pub enum SignError<E> {
5359
Verification(secp256k1::Error),
5460
}
5561

56-
/// Signs a message digest consisting of a tagged hash of the given bytes, checking if it can be
57-
/// verified with the supplied pubkey.
62+
/// Signs a message digest consisting of a tagged hash over the merkle root of a TLV stream,
63+
/// checking if it can be verified with the supplied pubkey.
5864
///
59-
/// `metadata` is either the payer or offer metadata, depending on the message type and origin, and
60-
/// may be used by `sign` to derive the signing keys.
65+
/// `metadata` is either the payer or offer metadata, depending on the message type, and may be used
66+
/// by `sign` to derive the signing keys.
6167
///
62-
/// Panics if `message` is not a well-formed TLV stream containing at least one TLV record.
68+
/// Panics if the underlying TLV stream of `message` is not a well-formed TLV stream containing at
69+
/// least one TLV record.
6370
pub(super) fn sign_message<F, E>(
64-
sign: F, message: TaggedBytes, metadata: &[u8], pubkey: PublicKey,
71+
sign: F, message: TaggedHash, metadata: &[u8], pubkey: PublicKey,
6572
) -> Result<Signature, SignError<E>>
6673
where
67-
F: FnOnce(&TaggedBytes, &[u8]) -> Result<Signature, E>
74+
F: FnOnce(&TaggedHash, &[u8]) -> Result<Signature, E>
6875
{
6976
let signature = sign(&message, metadata).map_err(|e| SignError::Signing(e))?;
7077

7178
let pubkey = pubkey.into();
7279
let secp_ctx = Secp256k1::verification_only();
73-
secp_ctx.verify_schnorr(&signature, &message.digest(), &pubkey)
80+
secp_ctx.verify_schnorr(&signature, &message.to_digest(), &pubkey)
7481
.map_err(|e| SignError::Verification(e))?;
7582

7683
Ok(signature)
@@ -295,7 +302,7 @@ mod tests {
295302
.request_invoice(vec![0; 8], payer_keys.public_key()).unwrap()
296303
.build_unchecked()
297304
.sign::<_, Infallible>(
298-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &payer_keys))
305+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
299306
)
300307
.unwrap();
301308
assert_eq!(
@@ -330,7 +337,7 @@ mod tests {
330337
.request_invoice(vec![0; 8], payer_keys.public_key()).unwrap()
331338
.build_unchecked()
332339
.sign::<_, Infallible>(
333-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &payer_keys))
340+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
334341
)
335342
.unwrap();
336343

@@ -362,7 +369,7 @@ mod tests {
362369
.request_invoice(vec![0; 8], payer_keys.public_key()).unwrap()
363370
.build_unchecked()
364371
.sign::<_, Infallible>(
365-
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &payer_keys))
372+
|message, _| Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &payer_keys))
366373
)
367374
.unwrap();
368375

lightning/src/offers/test_utils.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ use crate::sign::EntropySource;
1818
use crate::ln::PaymentHash;
1919
use crate::ln::features::BlindedHopFeatures;
2020
use crate::offers::invoice::BlindedPayInfo;
21-
use crate::offers::merkle::TaggedBytes;
21+
use crate::offers::merkle::TaggedHash;
2222

2323
pub(super) fn payer_keys() -> KeyPair {
2424
let secp_ctx = Secp256k1::new();
2525
KeyPair::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap())
2626
}
2727

28-
pub(super) fn payer_sign(message: &TaggedBytes, _metadata: &[u8]) -> Result<Signature, Infallible> {
28+
pub(super) fn payer_sign(message: &TaggedHash, _metadata: &[u8]) -> Result<Signature, Infallible> {
2929
let secp_ctx = Secp256k1::new();
3030
let keys = KeyPair::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
31-
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
31+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
3232
}
3333

3434
pub(super) fn payer_pubkey() -> PublicKey {
@@ -41,11 +41,11 @@ pub(super) fn recipient_keys() -> KeyPair {
4141
}
4242

4343
pub(super) fn recipient_sign(
44-
message: &TaggedBytes, _metadata: &[u8]
44+
message: &TaggedHash, _metadata: &[u8]
4545
) -> Result<Signature, Infallible> {
4646
let secp_ctx = Secp256k1::new();
4747
let keys = KeyPair::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[43; 32]).unwrap());
48-
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.digest(), &keys))
48+
Ok(secp_ctx.sign_schnorr_no_aux_rand(&message.to_digest(), &keys))
4949
}
5050

5151
pub(super) fn recipient_pubkey() -> PublicKey {

0 commit comments

Comments
 (0)