Skip to content

Commit 154841b

Browse files
Parameterize InboundPayload reads with NodeSigner
This will be used in the next commit to deserialize encrypted TLVs for receiving to 1-hop blinded paths.
1 parent 7b1e091 commit 154841b

File tree

4 files changed

+48
-28
lines changed

4 files changed

+48
-28
lines changed

fuzz/src/onion_hop_data.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,21 @@
1111
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
1212

1313
use crate::utils::test_logger;
14+
use lightning::util::test_utils;
1415

1516
#[inline]
1617
pub fn onion_hop_data_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
17-
use lightning::util::ser::Readable;
18+
use lightning::util::ser::ReadableArgs;
1819
let mut r = ::std::io::Cursor::new(data);
19-
let _ = <lightning::ln::msgs::InboundOnionPayload as Readable>::read(&mut r);
20+
let node_signer = test_utils::TestNodeSigner::new(test_utils::privkey(42));
21+
let _ = <lightning::ln::msgs::InboundOnionPayload as ReadableArgs<&&test_utils::TestNodeSigner>>::read(&mut r, &&node_signer);
2022
}
2123

2224
#[no_mangle]
2325
pub extern "C" fn onion_hop_data_run(data: *const u8, datalen: usize) {
24-
use lightning::util::ser::Readable;
26+
use lightning::util::ser::ReadableArgs;
2527
let data = unsafe { std::slice::from_raw_parts(data, datalen) };
2628
let mut r = ::std::io::Cursor::new(data);
27-
let _ = <lightning::ln::msgs::InboundOnionPayload as Readable>::read(&mut r);
29+
let node_signer = test_utils::TestNodeSigner::new(test_utils::privkey(42));
30+
let _ = <lightning::ln::msgs::InboundOnionPayload as ReadableArgs<&&test_utils::TestNodeSigner>>::read(&mut r, &&node_signer);
2831
}

lightning/src/ln/channelmanager.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2915,7 +2915,10 @@ where
29152915
}
29162916
}
29172917

2918-
let next_hop = match onion_utils::decode_next_payment_hop(shared_secret, &msg.onion_routing_packet.hop_data[..], msg.onion_routing_packet.hmac, msg.payment_hash) {
2918+
let next_hop = match onion_utils::decode_next_payment_hop(
2919+
shared_secret, &msg.onion_routing_packet.hop_data[..], msg.onion_routing_packet.hmac,
2920+
msg.payment_hash, &self.node_signer
2921+
) {
29192922
Ok(res) => res,
29202923
Err(onion_utils::OnionDecodeErr::Malformed { err_msg, err_code }) => {
29212924
return_malformed_err!(err_msg, err_code);
@@ -3924,7 +3927,10 @@ where
39243927
let phantom_pubkey_res = self.node_signer.get_node_id(Recipient::PhantomNode);
39253928
if phantom_pubkey_res.is_ok() && fake_scid::is_valid_phantom(&self.fake_scid_rand_bytes, short_chan_id, &self.genesis_hash) {
39263929
let phantom_shared_secret = self.node_signer.ecdh(Recipient::PhantomNode, &onion_packet.public_key.unwrap(), None).unwrap().secret_bytes();
3927-
let next_hop = match onion_utils::decode_next_payment_hop(phantom_shared_secret, &onion_packet.hop_data, onion_packet.hmac, payment_hash) {
3930+
let next_hop = match onion_utils::decode_next_payment_hop(
3931+
phantom_shared_secret, &onion_packet.hop_data, onion_packet.hmac,
3932+
payment_hash, &self.node_signer
3933+
) {
39283934
Ok(res) => res,
39293935
Err(onion_utils::OnionDecodeErr::Malformed { err_msg, err_code }) => {
39303936
let sha256_of_onion = Sha256::hash(&onion_packet.hop_data).into_inner();

lightning/src/ln/msgs.rs

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ use crate::ln::{ChannelId, PaymentPreimage, PaymentHash, PaymentSecret};
3535
use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures};
3636
use crate::ln::onion_utils;
3737
use crate::onion_message;
38+
use crate::sign::NodeSigner;
3839

3940
use crate::prelude::*;
4041
use core::convert::TryFrom;
4142
use core::fmt;
4243
use core::fmt::Debug;
44+
use core::ops::Deref;
4345
use core::str::FromStr;
4446
use crate::io::{self, Read};
4547
use crate::io_extras::read_to_end;
@@ -2132,8 +2134,8 @@ impl Writeable for OutboundOnionPayload {
21322134
}
21332135
}
21342136

2135-
impl Readable for InboundOnionPayload {
2136-
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
2137+
impl<NS: Deref> ReadableArgs<&NS> for InboundOnionPayload where NS::Target: NodeSigner {
2138+
fn read<R: Read>(r: &mut R, node_signer: &NS) -> Result<Self, DecodeError> {
21372139
let mut amt = HighZeroBytesDroppedBigSize(0u64);
21382140
let mut cltv_value = HighZeroBytesDroppedBigSize(0u32);
21392141
let mut short_id: Option<u64> = None;
@@ -2187,14 +2189,6 @@ impl Readable for InboundOnionPayload {
21872189
}
21882190
}
21892191

2190-
// ReadableArgs because we need onion_utils::decode_next_hop to accommodate payment packets and
2191-
// onion message packets.
2192-
impl ReadableArgs<()> for InboundOnionPayload {
2193-
fn read<R: Read>(r: &mut R, _arg: ()) -> Result<Self, DecodeError> {
2194-
<Self as Readable>::read(r)
2195-
}
2196-
}
2197-
21982192
impl Writeable for Ping {
21992193
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
22002194
self.ponglen.write(w)?;
@@ -2612,7 +2606,8 @@ mod tests {
26122606
use crate::ln::msgs::{self, FinalOnionHopData, OnionErrorPacket};
26132607
use crate::ln::msgs::SocketAddress;
26142608
use crate::routing::gossip::{NodeAlias, NodeId};
2615-
use crate::util::ser::{Writeable, Readable, Hostname, TransactionU16LenLimited};
2609+
use crate::util::ser::{Writeable, Readable, ReadableArgs, Hostname, TransactionU16LenLimited};
2610+
use crate::util::test_utils;
26162611

26172612
use bitcoin::hashes::hex::FromHex;
26182613
use bitcoin::util::address::Address;
@@ -3704,8 +3699,11 @@ mod tests {
37043699
let target_value = hex::decode("1a02080badf00d010203040404ffffffff0608deadbeef1bad1dea").unwrap();
37053700
assert_eq!(encoded_value, target_value);
37063701

3707-
let inbound_msg = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
3708-
if let msgs::InboundOnionPayload::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value } = inbound_msg {
3702+
let node_signer = test_utils::TestKeysInterface::new(&[42; 32], Network::Testnet);
3703+
let inbound_msg = ReadableArgs::read(&mut Cursor::new(&target_value[..]), &&node_signer).unwrap();
3704+
if let msgs::InboundOnionPayload::Forward {
3705+
short_channel_id, amt_to_forward, outgoing_cltv_value
3706+
} = inbound_msg {
37093707
assert_eq!(short_channel_id, 0xdeadbeef1bad1dea);
37103708
assert_eq!(amt_to_forward, 0x0badf00d01020304);
37113709
assert_eq!(outgoing_cltv_value, 0xffffffff);
@@ -3726,8 +3724,11 @@ mod tests {
37263724
let target_value = hex::decode("1002080badf00d010203040404ffffffff").unwrap();
37273725
assert_eq!(encoded_value, target_value);
37283726

3729-
let inbound_msg = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
3730-
if let msgs::InboundOnionPayload::Receive { payment_data: None, amt_msat, outgoing_cltv_value, .. } = inbound_msg {
3727+
let node_signer = test_utils::TestKeysInterface::new(&[42; 32], Network::Testnet);
3728+
let inbound_msg = ReadableArgs::read(&mut Cursor::new(&target_value[..]), &&node_signer).unwrap();
3729+
if let msgs::InboundOnionPayload::Receive {
3730+
payment_data: None, amt_msat, outgoing_cltv_value, ..
3731+
} = inbound_msg {
37313732
assert_eq!(amt_msat, 0x0badf00d01020304);
37323733
assert_eq!(outgoing_cltv_value, 0xffffffff);
37333734
} else { panic!(); }
@@ -3751,7 +3752,8 @@ mod tests {
37513752
let target_value = hex::decode("3602080badf00d010203040404ffffffff082442424242424242424242424242424242424242424242424242424242424242421badca1f").unwrap();
37523753
assert_eq!(encoded_value, target_value);
37533754

3754-
let inbound_msg = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
3755+
let node_signer = test_utils::TestKeysInterface::new(&[42; 32], Network::Testnet);
3756+
let inbound_msg = ReadableArgs::read(&mut Cursor::new(&target_value[..]), &&node_signer).unwrap();
37553757
if let msgs::InboundOnionPayload::Receive {
37563758
payment_data: Some(FinalOnionHopData {
37573759
payment_secret,
@@ -3786,7 +3788,8 @@ mod tests {
37863788
outgoing_cltv_value: 0xffffffff,
37873789
};
37883790
let encoded_value = msg.encode();
3789-
assert!(msgs::InboundOnionPayload::read(&mut Cursor::new(&encoded_value[..])).is_err());
3791+
let node_signer = test_utils::TestKeysInterface::new(&[42; 32], Network::Testnet);
3792+
assert!(msgs::InboundOnionPayload::read(&mut Cursor::new(&encoded_value[..]), &&node_signer).is_err());
37903793
let good_type_range_tlvs = vec![
37913794
((1 << 16) - 3, vec![42]),
37923795
((1 << 16) - 1, vec![42; 32]),
@@ -3795,7 +3798,7 @@ mod tests {
37953798
*custom_tlvs = good_type_range_tlvs.clone();
37963799
}
37973800
let encoded_value = msg.encode();
3798-
let inbound_msg = Readable::read(&mut Cursor::new(&encoded_value[..])).unwrap();
3801+
let inbound_msg = ReadableArgs::read(&mut Cursor::new(&encoded_value[..]), &&node_signer).unwrap();
37993802
match inbound_msg {
38003803
msgs::InboundOnionPayload::Receive { custom_tlvs, .. } => assert!(custom_tlvs.is_empty()),
38013804
_ => panic!(),
@@ -3819,7 +3822,8 @@ mod tests {
38193822
let encoded_value = msg.encode();
38203823
let target_value = hex::decode("2e02080badf00d010203040404ffffffffff0000000146c6616b021234ff0000000146c6616f084242424242424242").unwrap();
38213824
assert_eq!(encoded_value, target_value);
3822-
let inbound_msg: msgs::InboundOnionPayload = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
3825+
let node_signer = test_utils::TestKeysInterface::new(&[42; 32], Network::Testnet);
3826+
let inbound_msg: msgs::InboundOnionPayload = ReadableArgs::read(&mut Cursor::new(&target_value[..]), &&node_signer).unwrap();
38233827
if let msgs::InboundOnionPayload::Receive {
38243828
payment_data: None,
38253829
payment_metadata: None,
@@ -3982,7 +3986,10 @@ mod tests {
39823986
// payload length to be encoded over multiple bytes rather than a single u8.
39833987
let big_payload = encode_big_payload().unwrap();
39843988
let mut rd = Cursor::new(&big_payload[..]);
3985-
<msgs::InboundOnionPayload as Readable>::read(&mut rd).unwrap();
3989+
3990+
let node_signer = test_utils::TestKeysInterface::new(&[42; 32], Network::Testnet);
3991+
<msgs::InboundOnionPayload as ReadableArgs<&&test_utils::TestKeysInterface>>
3992+
::read(&mut rd, &&node_signer).unwrap();
39863993
}
39873994
// see above test, needs to be a separate method for use of the serialization macros.
39883995
fn encode_big_payload() -> Result<Vec<u8>, io::Error> {

lightning/src/ln/onion_utils.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::ln::msgs;
1313
use crate::ln::wire::Encode;
1414
use crate::routing::gossip::NetworkUpdate;
1515
use crate::routing::router::{BlindedTail, Path, RouteHop};
16+
use crate::sign::NodeSigner;
1617
use crate::util::chacha20::{ChaCha20, ChaChaReader};
1718
use crate::util::errors::{self, APIError};
1819
use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer, LengthCalculatingWriter};
@@ -885,8 +886,11 @@ pub(crate) enum OnionDecodeErr {
885886
},
886887
}
887888

888-
pub(crate) fn decode_next_payment_hop(shared_secret: [u8; 32], hop_data: &[u8], hmac_bytes: [u8; 32], payment_hash: PaymentHash) -> Result<Hop, OnionDecodeErr> {
889-
match decode_next_hop(shared_secret, hop_data, hmac_bytes, Some(payment_hash), ()) {
889+
pub(crate) fn decode_next_payment_hop<NS: Deref>(
890+
shared_secret: [u8; 32], hop_data: &[u8], hmac_bytes: [u8; 32], payment_hash: PaymentHash,
891+
node_signer: &NS,
892+
) -> Result<Hop, OnionDecodeErr> where NS::Target: NodeSigner {
893+
match decode_next_hop(shared_secret, hop_data, hmac_bytes, Some(payment_hash), node_signer) {
890894
Ok((next_hop_data, None)) => Ok(Hop::Receive(next_hop_data)),
891895
Ok((next_hop_data, Some((next_hop_hmac, FixedSizeOnionPacket(new_packet_bytes))))) => {
892896
Ok(Hop::Forward {

0 commit comments

Comments
 (0)