rustfmt: Run on lightning/src/offers/merkle.rs

This commit is contained in:
Elias Rohrer 2025-01-30 11:55:11 +01:00
parent f87eeb9303
commit 01702f5790
No known key found for this signature in database
GPG key ID: 36153082BDF676FD

View file

@ -9,11 +9,11 @@
//! Tagged hashes for use in signature calculation and verification.
use bitcoin::hashes::{Hash, HashEngine, sha256};
use bitcoin::secp256k1::{Message, PublicKey, Secp256k1, self};
use bitcoin::secp256k1::schnorr::Signature;
use crate::io;
use crate::util::ser::{BigSize, Readable, Writeable, Writer};
use bitcoin::hashes::{sha256, Hash, HashEngine};
use bitcoin::secp256k1::schnorr::Signature;
use bitcoin::secp256k1::{self, Message, PublicKey, Secp256k1};
#[allow(unused_imports)]
use crate::prelude::*;
@ -50,16 +50,12 @@ impl TaggedHash {
///
/// Panics if `tlv_stream` is not a well-formed TLV stream containing at least one TLV record.
pub(super) fn from_tlv_stream<'a, I: core::iter::Iterator<Item = TlvRecord<'a>>>(
tag: &'static str, tlv_stream: I
tag: &'static str, tlv_stream: I,
) -> Self {
let tag_hash = sha256::Hash::hash(tag.as_bytes());
let merkle_root = root_hash(tlv_stream);
let digest = Message::from_digest(tagged_hash(tag_hash, merkle_root).to_byte_array());
Self {
tag,
merkle_root,
digest,
}
Self { tag, merkle_root, digest }
}
/// Returns the digest to sign.
@ -227,9 +223,7 @@ pub(super) struct TlvStream<'a> {
impl<'a> TlvStream<'a> {
pub fn new(data: &'a [u8]) -> Self {
Self {
data: io::Cursor::new(data),
}
Self { data: io::Cursor::new(data) }
}
pub fn range<T>(self, types: T) -> impl core::iter::Iterator<Item = TlvRecord<'a>>
@ -271,9 +265,7 @@ impl<'a> Iterator for TlvStream<'a> {
self.data.set_position(end);
Some(TlvRecord {
r#type, type_bytes, record_bytes, end: end as usize,
})
Some(TlvRecord { r#type, type_bytes, record_bytes, end: end as usize })
} else {
None
}
@ -289,41 +281,47 @@ impl<'a> Writeable for TlvRecord<'a> {
#[cfg(test)]
mod tests {
use super::{SIGNATURE_TYPES, TlvStream};
use super::{TlvStream, SIGNATURE_TYPES};
use bitcoin::hashes::{Hash, sha256};
use bitcoin::hex::FromHex;
use bitcoin::secp256k1::{Keypair, Message, Secp256k1, SecretKey};
use bitcoin::secp256k1::schnorr::Signature;
use crate::ln::channelmanager::PaymentId;
use crate::ln::inbound_payment::ExpandedKey;
use crate::offers::invoice_request::{InvoiceRequest, UnsignedInvoiceRequest};
use crate::offers::nonce::Nonce;
use crate::offers::offer::{Amount, OfferBuilder};
use crate::offers::invoice_request::{InvoiceRequest, UnsignedInvoiceRequest};
use crate::offers::parse::Bech32Encode;
use crate::offers::signer::Metadata;
use crate::offers::test_utils::recipient_pubkey;
use crate::util::ser::Writeable;
use bitcoin::hashes::{sha256, Hash};
use bitcoin::hex::FromHex;
use bitcoin::secp256k1::schnorr::Signature;
use bitcoin::secp256k1::{Keypair, Message, Secp256k1, SecretKey};
#[test]
fn calculates_merkle_root_hash() {
// BOLT 12 test vectors
const HEX_1: &'static str = "010203e8";
let bytes_1 = <Vec<u8>>::from_hex("b013756c8fee86503a0b4abdab4cddeb1af5d344ca6fc2fa8b6c08938caa6f93").unwrap();
let bytes_1 =
<Vec<u8>>::from_hex("b013756c8fee86503a0b4abdab4cddeb1af5d344ca6fc2fa8b6c08938caa6f93")
.unwrap();
assert_eq!(
super::root_hash(TlvStream::new(&<Vec<u8>>::from_hex(HEX_1).unwrap())),
sha256::Hash::from_slice(&bytes_1).unwrap(),
);
const HEX_2: &'static str = concat!("010203e8","02080000010000020003");
let bytes_2 = <Vec<u8>>::from_hex("c3774abbf4815aa54ccaa026bff6581f01f3be5fe814c620a252534f434bc0d1").unwrap();
const HEX_2: &'static str = concat!("010203e8", "02080000010000020003");
let bytes_2 =
<Vec<u8>>::from_hex("c3774abbf4815aa54ccaa026bff6581f01f3be5fe814c620a252534f434bc0d1")
.unwrap();
assert_eq!(
super::root_hash(TlvStream::new(&<Vec<u8>>::from_hex(HEX_2).unwrap())),
sha256::Hash::from_slice(&bytes_2).unwrap(),
);
const HEX_3: &'static str = concat!("010203e8","02080000010000020003", "03310266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c0351800000000000000010000000000000002");
let bytes_3 = <Vec<u8>>::from_hex("ab2e79b1283b0b31e0b035258de23782df6b89a38cfa7237bde69aed1a658c5d").unwrap();
let bytes_3 =
<Vec<u8>>::from_hex("ab2e79b1283b0b31e0b035258de23782df6b89a38cfa7237bde69aed1a658c5d")
.unwrap();
assert_eq!(
super::root_hash(TlvStream::new(&<Vec<u8>>::from_hex(HEX_3).unwrap())),
sha256::Hash::from_slice(&bytes_3).unwrap(),
@ -338,12 +336,18 @@ mod tests {
let payment_id = PaymentId([1; 32]);
let recipient_pubkey = {
let secret_bytes = <Vec<u8>>::from_hex("4141414141414141414141414141414141414141414141414141414141414141").unwrap();
let secret_bytes = <Vec<u8>>::from_hex(
"4141414141414141414141414141414141414141414141414141414141414141",
)
.unwrap();
let secret_key = SecretKey::from_slice(&secret_bytes).unwrap();
Keypair::from_secret_key(&secp_ctx, &secret_key).public_key()
};
let payer_keys = {
let secret_bytes = <Vec<u8>>::from_hex("4242424242424242424242424242424242424242424242424242424242424242").unwrap();
let secret_bytes = <Vec<u8>>::from_hex(
"4242424242424242424242424242424242424242424242424242424242424242",
)
.unwrap();
let secret_key = SecretKey::from_slice(&secret_bytes).unwrap();
Keypair::from_secret_key(&secp_ctx, &secret_key)
};
@ -354,30 +358,30 @@ mod tests {
.amount(Amount::Currency { iso4217_code: *b"USD", amount: 100 })
.build_unchecked()
// Override the payer metadata and signing pubkey to match the test vectors
.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id).unwrap()
.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id)
.unwrap()
.payer_metadata(Metadata::Bytes(vec![0; 8]))
.payer_signing_pubkey(payer_keys.public_key())
.build_unchecked()
.sign(|message: &UnsignedInvoiceRequest|
.sign(|message: &UnsignedInvoiceRequest| {
Ok(secp_ctx.sign_schnorr_no_aux_rand(message.as_ref().as_digest(), &payer_keys))
)
})
.unwrap();
assert_eq!(
invoice_request.to_string(),
"lnr1qqyqqqqqqqqqqqqqqcp4256ypqqkgzshgysy6ct5dpjk6ct5d93kzmpq23ex2ct5d9ek293pqthvwfzadd7jejes8q9lhc4rvjxd022zv5l44g6qah82ru5rdpnpjkppqvjx204vgdzgsqpvcp4mldl3plscny0rt707gvpdh6ndydfacz43euzqhrurageg3n7kafgsek6gz3e9w52parv8gs2hlxzk95tzeswywffxlkeyhml0hh46kndmwf4m6xma3tkq2lu04qz3slje2rfthc89vss",
);
let bytes = <Vec<u8>>::from_hex("608407c18ad9a94d9ea2bcdbe170b6c20c462a7833a197621c916f78cf18e624").unwrap();
let bytes =
<Vec<u8>>::from_hex("608407c18ad9a94d9ea2bcdbe170b6c20c462a7833a197621c916f78cf18e624")
.unwrap();
assert_eq!(
super::root_hash(TlvStream::new(&invoice_request.bytes[..])),
sha256::Hash::from_slice(&bytes).unwrap(),
);
let bytes = <Vec<u8>>::from_hex("b8f83ea3288cfd6ea510cdb481472575141e8d8744157f98562d162cc1c472526fdb24befefbdebab4dbb726bbd1b7d8aec057f8fa805187e5950d2bbe0e5642").unwrap();
assert_eq!(
invoice_request.signature(),
Signature::from_slice(&bytes).unwrap(),
);
assert_eq!(invoice_request.signature(), Signature::from_slice(&bytes).unwrap(),);
}
#[test]
@ -389,8 +393,10 @@ mod tests {
let unsigned_invoice_request = OfferBuilder::new(recipient_pubkey())
.amount_msats(1000)
.build().unwrap()
.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id).unwrap()
.build()
.unwrap()
.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id)
.unwrap()
.payer_note("bar".into())
.build_unchecked();
@ -399,7 +405,9 @@ mod tests {
let tagged_hash = unsigned_invoice_request.as_ref();
let expected_digest = unsigned_invoice_request.as_ref().as_digest();
let tag = sha256::Hash::hash(tagged_hash.tag().as_bytes());
let actual_digest = Message::from_digest(super::tagged_hash(tag, tagged_hash.merkle_root()).to_byte_array());
let actual_digest = Message::from_digest(
super::tagged_hash(tag, tagged_hash.merkle_root()).to_byte_array(),
);
assert_eq!(*expected_digest, actual_digest);
}
@ -418,8 +426,10 @@ mod tests {
let invoice_request = OfferBuilder::new(recipient_pubkey)
.amount_msats(100)
.build_unchecked()
.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id).unwrap()
.build_and_sign().unwrap();
.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id)
.unwrap()
.build_and_sign()
.unwrap();
let mut bytes_without_signature = Vec::new();
let tlv_stream_without_signatures = TlvStream::new(&invoice_request.bytes)
@ -450,11 +460,13 @@ mod tests {
let invoice_request = OfferBuilder::new(recipient_pubkey)
.amount_msats(100)
.build_unchecked()
.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id).unwrap()
.request_invoice(&expanded_key, nonce, &secp_ctx, payment_id)
.unwrap()
.build_and_sign()
.unwrap();
let tlv_stream = TlvStream::new(&invoice_request.bytes).range(0..1)
let tlv_stream = TlvStream::new(&invoice_request.bytes)
.range(0..1)
.chain(TlvStream::new(&invoice_request.bytes).range(1..80))
.chain(TlvStream::new(&invoice_request.bytes).range(80..160))
.chain(TlvStream::new(&invoice_request.bytes).range(160..240))