Skip to content

Commit 7835f4a

Browse files
committed
f - HMAC entire ReceiveTlvs
1 parent 1e51511 commit 7835f4a

File tree

6 files changed

+45
-59
lines changed

6 files changed

+45
-59
lines changed

fuzz/src/invoice_request_deser.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,12 @@ use lightning::blinded_path::payment::{
1414
BlindedPaymentPath, Bolt12OfferContext, ForwardTlvs, PaymentConstraints, PaymentContext,
1515
PaymentForwardNode, PaymentRelay, ReceiveTlvs,
1616
};
17-
use lightning::ln::channelmanager::{MIN_FINAL_CLTV_EXPIRY_DELTA, Verification};
18-
use lightning::ln::inbound_payment::ExpandedKey;
17+
use lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA;
1918
use lightning::offers::invoice::UnsignedBolt12Invoice;
2019
use lightning::offers::invoice_request::{InvoiceRequest, InvoiceRequestFields};
21-
use lightning::offers::nonce::Nonce;
2220
use lightning::offers::offer::OfferId;
2321
use lightning::offers::parse::Bolt12SemanticError;
24-
use lightning::sign::{EntropySource, KeyMaterial};
22+
use lightning::sign::EntropySource;
2523
use lightning::types::features::BlindedHopFeatures;
2624
use lightning::types::payment::{PaymentHash, PaymentSecret};
2725
use lightning::util::ser::Writeable;
@@ -82,7 +80,6 @@ fn privkey(byte: u8) -> SecretKey {
8280
fn build_response<T: secp256k1::Signing + secp256k1::Verification>(
8381
invoice_request: &InvoiceRequest, secp_ctx: &Secp256k1<T>,
8482
) -> Result<UnsignedBolt12Invoice, Bolt12SemanticError> {
85-
let expanded_key = ExpandedKey::new(&KeyMaterial([42; 32]));
8683
let entropy_source = Randomness {};
8784
let payment_context = PaymentContext::Bolt12Offer(Bolt12OfferContext {
8885
offer_id: OfferId([42; 32]),
@@ -95,16 +92,14 @@ fn build_response<T: secp256k1::Signing + secp256k1::Verification>(
9592
human_readable_name: None,
9693
},
9794
});
98-
let nonce = Nonce::from_entropy_source(&entropy_source);
99-
let hmac = payment_context.hmac_for_offer_payment(nonce, &expanded_key);
10095
let payee_tlvs = ReceiveTlvs {
10196
payment_secret: PaymentSecret([42; 32]),
10297
payment_constraints: PaymentConstraints {
10398
max_cltv_expiry: 1_000_000,
10499
htlc_minimum_msat: 1,
105100
},
106101
payment_context,
107-
authentication: (hmac, nonce),
102+
authentication: None,
108103
};
109104
let intermediate_nodes = [PaymentForwardNode {
110105
tlvs: ForwardTlvs {

fuzz/src/refund_deser.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ use lightning::blinded_path::payment::{
1414
BlindedPaymentPath, Bolt12RefundContext, ForwardTlvs, PaymentConstraints, PaymentContext,
1515
PaymentForwardNode, PaymentRelay, ReceiveTlvs,
1616
};
17-
use lightning::ln::channelmanager::{MIN_FINAL_CLTV_EXPIRY_DELTA, Verification};
18-
use lightning::ln::inbound_payment::ExpandedKey;
17+
use lightning::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA;
1918
use lightning::offers::invoice::UnsignedBolt12Invoice;
20-
use lightning::offers::nonce::Nonce;
2119
use lightning::offers::parse::Bolt12SemanticError;
2220
use lightning::offers::refund::Refund;
23-
use lightning::sign::{EntropySource, KeyMaterial};
21+
use lightning::sign::EntropySource;
2422
use lightning::types::features::BlindedHopFeatures;
2523
use lightning::types::payment::{PaymentHash, PaymentSecret};
2624
use lightning::util::ser::Writeable;
@@ -69,19 +67,16 @@ fn privkey(byte: u8) -> SecretKey {
6967
fn build_response<T: secp256k1::Signing + secp256k1::Verification>(
7068
refund: &Refund, signing_pubkey: PublicKey, secp_ctx: &Secp256k1<T>,
7169
) -> Result<UnsignedBolt12Invoice, Bolt12SemanticError> {
72-
let expanded_key = ExpandedKey::new(&KeyMaterial([42; 32]));
7370
let entropy_source = Randomness {};
7471
let payment_context = PaymentContext::Bolt12Refund(Bolt12RefundContext {});
75-
let nonce = Nonce::from_entropy_source(&entropy_source);
76-
let hmac = payment_context.hmac_for_offer_payment(nonce, &expanded_key);
7772
let payee_tlvs = ReceiveTlvs {
7873
payment_secret: PaymentSecret([42; 32]),
7974
payment_constraints: PaymentConstraints {
8075
max_cltv_expiry: 1_000_000,
8176
htlc_minimum_msat: 1,
8277
},
8378
payment_context,
84-
authentication: (hmac, nonce),
79+
authentication: None,
8580
};
8681
let intermediate_nodes = [PaymentForwardNode {
8782
tlvs: ForwardTlvs {

lightning/src/blinded_path/payment.rs

+8-12
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ pub struct ReceiveTlvs {
264264
/// Context for the receiver of this payment.
265265
pub payment_context: PaymentContext,
266266
/// An HMAC of `payment_context` along with a nonce used to construct it.
267-
pub authentication: (Hmac<Sha256>, Nonce),
267+
pub authentication: Option<(Hmac<Sha256>, Nonce)>,
268268
}
269269

270270
/// Data to construct a [`BlindedHop`] for sending a payment over.
@@ -410,7 +410,7 @@ impl Writeable for ReceiveTlvs {
410410
(12, self.payment_constraints, required),
411411
(65536, self.payment_secret, required),
412412
(65537, self.payment_context, required),
413-
(65539, self.authentication, required),
413+
(65539, self.authentication, option),
414414
});
415415
Ok(())
416416
}
@@ -459,7 +459,7 @@ impl Readable for BlindedPaymentTlvs {
459459
payment_secret: payment_secret.ok_or(DecodeError::InvalidValue)?,
460460
payment_constraints: payment_constraints.0.unwrap(),
461461
payment_context: payment_context.0.unwrap(),
462-
authentication: authentication.ok_or(DecodeError::InvalidValue)?,
462+
authentication,
463463
}))
464464
}
465465
}
@@ -638,15 +638,11 @@ impl_writeable_tlv_based!(Bolt12RefundContext, {});
638638

639639
#[cfg(test)]
640640
mod tests {
641-
use bitcoin::hashes::hmac::Hmac;
642-
use bitcoin::hashes::sha256::Hash as Sha256;
643-
use bitcoin::hashes::Hash;
644641
use bitcoin::secp256k1::PublicKey;
645642
use crate::blinded_path::payment::{PaymentForwardNode, ForwardTlvs, ReceiveTlvs, PaymentConstraints, PaymentContext, PaymentRelay};
646643
use crate::types::payment::PaymentSecret;
647644
use crate::types::features::BlindedHopFeatures;
648645
use crate::ln::functional_test_utils::TEST_FINAL_CLTV;
649-
use crate::offers::nonce::Nonce;
650646

651647
#[test]
652648
fn compute_payinfo() {
@@ -695,7 +691,7 @@ mod tests {
695691
htlc_minimum_msat: 1,
696692
},
697693
payment_context: PaymentContext::unknown(),
698-
authentication: (Hmac::<Sha256>::hash(&[42u8]), Nonce([42u8; 16])),
694+
authentication: None,
699695
};
700696
let htlc_maximum_msat = 100_000;
701697
let blinded_payinfo = super::compute_payinfo(&intermediate_nodes[..], &recv_tlvs, htlc_maximum_msat, 12).unwrap();
@@ -715,7 +711,7 @@ mod tests {
715711
htlc_minimum_msat: 1,
716712
},
717713
payment_context: PaymentContext::unknown(),
718-
authentication: (Hmac::<Sha256>::hash(&[42u8]), Nonce([42u8; 16])),
714+
authentication: None,
719715
};
720716
let blinded_payinfo = super::compute_payinfo(&[], &recv_tlvs, 4242, TEST_FINAL_CLTV as u16).unwrap();
721717
assert_eq!(blinded_payinfo.fee_base_msat, 0);
@@ -772,7 +768,7 @@ mod tests {
772768
htlc_minimum_msat: 3,
773769
},
774770
payment_context: PaymentContext::unknown(),
775-
authentication: (Hmac::<Sha256>::hash(&[42u8]), Nonce([42u8; 16])),
771+
authentication: None,
776772
};
777773
let htlc_maximum_msat = 100_000;
778774
let blinded_payinfo = super::compute_payinfo(&intermediate_nodes[..], &recv_tlvs, htlc_maximum_msat, TEST_FINAL_CLTV as u16).unwrap();
@@ -826,7 +822,7 @@ mod tests {
826822
htlc_minimum_msat: 1,
827823
},
828824
payment_context: PaymentContext::unknown(),
829-
authentication: (Hmac::<Sha256>::hash(&[42u8]), Nonce([42u8; 16])),
825+
authentication: None,
830826
};
831827
let htlc_minimum_msat = 3798;
832828
assert!(super::compute_payinfo(&intermediate_nodes[..], &recv_tlvs, htlc_minimum_msat - 1, TEST_FINAL_CLTV as u16).is_err());
@@ -884,7 +880,7 @@ mod tests {
884880
htlc_minimum_msat: 1,
885881
},
886882
payment_context: PaymentContext::unknown(),
887-
authentication: (Hmac::<Sha256>::hash(&[42u8]), Nonce([42u8; 16])),
883+
authentication: None,
888884
};
889885

890886
let blinded_payinfo = super::compute_payinfo(&intermediate_nodes[..], &recv_tlvs, 10_000, TEST_FINAL_CLTV as u16).unwrap();

lightning/src/ln/blinded_payment_tests.rs

+19-19
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,17 @@ fn blinded_payment_path(
7474
});
7575
}
7676

77-
let payment_context = PaymentContext::unknown();
78-
let payee_tlvs = ReceiveTlvs {
77+
let mut payee_tlvs = ReceiveTlvs {
7978
payment_secret,
8079
payment_constraints: PaymentConstraints {
8180
max_cltv_expiry: u32::max_value(),
8281
htlc_minimum_msat:
8382
intro_node_min_htlc_opt.unwrap_or_else(|| channel_upds.last().unwrap().htlc_minimum_msat),
8483
},
85-
authentication: hmac_payment_context(&payment_context, keys_manager),
86-
payment_context,
84+
payment_context: PaymentContext::unknown(),
85+
authentication: None,
8786
};
87+
payee_tlvs.authentication = Some(hmac_payee_tlvs(&payee_tlvs, keys_manager));
8888

8989
let mut secp_ctx = Secp256k1::new();
9090
BlindedPaymentPath::new(
@@ -94,12 +94,12 @@ fn blinded_payment_path(
9494
).unwrap()
9595
}
9696

97-
fn hmac_payment_context(
98-
payment_context: &PaymentContext, keys_manager: &test_utils::TestKeysInterface,
97+
fn hmac_payee_tlvs(
98+
payee_tlvs: &ReceiveTlvs, keys_manager: &test_utils::TestKeysInterface,
9999
) -> (Hmac<Sha256>, Nonce) {
100100
let nonce = Nonce([42u8; 16]);
101101
let expanded_key = ExpandedKey::new(&keys_manager.get_inbound_payment_key_material());
102-
let hmac = payment_context.hmac_for_offer_payment(nonce, &expanded_key);
102+
let hmac = payee_tlvs.hmac_for_offer_payment(nonce, &expanded_key);
103103
(hmac, nonce)
104104
}
105105

@@ -133,16 +133,16 @@ fn do_one_hop_blinded_path(success: bool) {
133133

134134
let amt_msat = 5000;
135135
let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash(&nodes[1], Some(amt_msat), None);
136-
let payment_context = PaymentContext::unknown();
137-
let payee_tlvs = ReceiveTlvs {
136+
let mut payee_tlvs = ReceiveTlvs {
138137
payment_secret,
139138
payment_constraints: PaymentConstraints {
140139
max_cltv_expiry: u32::max_value(),
141140
htlc_minimum_msat: chan_upd.htlc_minimum_msat,
142141
},
143-
authentication: hmac_payment_context(&payment_context, &chanmon_cfgs[1].keys_manager),
144-
payment_context,
142+
payment_context: PaymentContext::unknown(),
143+
authentication: None,
145144
};
145+
payee_tlvs.authentication = Some(hmac_payee_tlvs(&payee_tlvs, &chanmon_cfgs[1].keys_manager));
146146
let mut secp_ctx = Secp256k1::new();
147147
let blinded_path = BlindedPaymentPath::new(
148148
&[], nodes[1].node.get_our_node_id(), payee_tlvs, u64::MAX, TEST_FINAL_CLTV as u16,
@@ -179,16 +179,16 @@ fn mpp_to_one_hop_blinded_path() {
179179

180180
let amt_msat = 15_000_000;
181181
let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash(&nodes[3], Some(amt_msat), None);
182-
let payment_context = PaymentContext::unknown();
183-
let payee_tlvs = ReceiveTlvs {
182+
let mut payee_tlvs = ReceiveTlvs {
184183
payment_secret,
185184
payment_constraints: PaymentConstraints {
186185
max_cltv_expiry: u32::max_value(),
187186
htlc_minimum_msat: chan_upd_1_3.htlc_minimum_msat,
188187
},
189-
authentication: hmac_payment_context(&payment_context, &chanmon_cfgs[3].keys_manager),
190-
payment_context,
188+
payment_context: PaymentContext::unknown(),
189+
authentication: None,
191190
};
191+
payee_tlvs.authentication = Some(hmac_payee_tlvs(&payee_tlvs, &chanmon_cfgs[3].keys_manager));
192192
let blinded_path = BlindedPaymentPath::new(
193193
&[], nodes[3].node.get_our_node_id(), payee_tlvs, u64::MAX, TEST_FINAL_CLTV as u16,
194194
&chanmon_cfgs[3].keys_manager, &secp_ctx
@@ -1396,16 +1396,16 @@ fn custom_tlvs_to_blinded_path() {
13961396

13971397
let amt_msat = 5000;
13981398
let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash(&nodes[1], Some(amt_msat), None);
1399-
let payment_context = PaymentContext::unknown();
1400-
let payee_tlvs = ReceiveTlvs {
1399+
let mut payee_tlvs = ReceiveTlvs {
14011400
payment_secret,
14021401
payment_constraints: PaymentConstraints {
14031402
max_cltv_expiry: u32::max_value(),
14041403
htlc_minimum_msat: chan_upd.htlc_minimum_msat,
14051404
},
1406-
authentication: hmac_payment_context(&payment_context, &chanmon_cfgs[1].keys_manager),
1407-
payment_context,
1405+
payment_context: PaymentContext::unknown(),
1406+
authentication: None,
14081407
};
1408+
payee_tlvs.authentication = Some(hmac_payee_tlvs(&payee_tlvs, &chanmon_cfgs[1].keys_manager));
14091409
let mut secp_ctx = Secp256k1::new();
14101410
let blinded_path = BlindedPaymentPath::new(
14111411
&[], nodes[1].node.get_our_node_id(), payee_tlvs, u64::MAX, TEST_FINAL_CLTV as u16,

lightning/src/ln/channelmanager.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -10481,18 +10481,18 @@ where
1048110481
let max_cltv_expiry = self.best_block.read().unwrap().height + CLTV_FAR_FAR_AWAY
1048210482
+ LATENCY_GRACE_PERIOD_BLOCKS;
1048310483

10484-
let nonce = Nonce::from_entropy_source(entropy);
10485-
let hmac = payment_context.hmac_for_offer_payment(nonce, expanded_key);
10486-
10487-
let payee_tlvs = ReceiveTlvs {
10484+
let mut payee_tlvs = ReceiveTlvs {
1048810485
payment_secret,
1048910486
payment_constraints: PaymentConstraints {
1049010487
max_cltv_expiry,
1049110488
htlc_minimum_msat: 1,
1049210489
},
1049310490
payment_context,
10494-
authentication: (hmac, nonce),
10491+
authentication: None,
1049510492
};
10493+
let nonce = Nonce::from_entropy_source(entropy);
10494+
let hmac = payee_tlvs.hmac_for_offer_payment(nonce, expanded_key);
10495+
payee_tlvs.authentication = Some((hmac, nonce));
1049610496

1049710497
self.router.create_blinded_payment_paths(
1049810498
payee_node_id, first_hops, payee_tlvs, amount_msats, secp_ctx

lightning/src/ln/max_payment_path_len_tests.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -160,19 +160,19 @@ fn one_hop_blinded_path_with_custom_tlv() {
160160
// Construct the route parameters for sending to nodes[2]'s 1-hop blinded path.
161161
let amt_msat = 100_000;
162162
let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash(&nodes[2], Some(amt_msat), None);
163-
let payment_context = PaymentContext::unknown();
164-
let nonce = Nonce([42u8; 16]);
165-
let expanded_key = ExpandedKey::new(&chanmon_cfgs[2].keys_manager.get_inbound_payment_key_material());
166-
let hmac = payment_context.hmac_for_offer_payment(nonce, &expanded_key);
167-
let payee_tlvs = ReceiveTlvs {
163+
let mut payee_tlvs = ReceiveTlvs {
168164
payment_secret,
169165
payment_constraints: PaymentConstraints {
170166
max_cltv_expiry: u32::max_value(),
171167
htlc_minimum_msat: chan_upd_1_2.htlc_minimum_msat,
172168
},
173-
payment_context,
174-
authentication: (hmac, nonce),
169+
payment_context: PaymentContext::unknown(),
170+
authentication: None,
175171
};
172+
let nonce = Nonce([42u8; 16]);
173+
let expanded_key = ExpandedKey::new(&chanmon_cfgs[2].keys_manager.get_inbound_payment_key_material());
174+
let hmac = payee_tlvs.hmac_for_offer_payment(nonce, &expanded_key);
175+
payee_tlvs.authentication = Some((hmac, nonce));
176176
let mut secp_ctx = Secp256k1::new();
177177
let blinded_path = BlindedPaymentPath::new(
178178
&[], nodes[2].node.get_our_node_id(), payee_tlvs, u64::MAX, TEST_FINAL_CLTV as u16,

0 commit comments

Comments
 (0)