Skip to content

Commit 33afb56

Browse files
committed
Add Trampoline variant to OutboundOnionPayload.
1 parent b828a14 commit 33afb56

File tree

1 file changed

+81
-2
lines changed

1 file changed

+81
-2
lines changed

lightning/src/ln/msgs.rs

+81-2
Original file line numberDiff line numberDiff line change
@@ -1698,6 +1698,13 @@ mod fuzzy_internal_msgs {
16981698
amt_to_forward: u64,
16991699
outgoing_cltv_value: u32,
17001700
},
1701+
#[allow(unused)]
1702+
TrampolineEntry {
1703+
amt_to_forward: u64,
1704+
outgoing_cltv_value: u32,
1705+
payment_data: Option<FinalOnionHopData>,
1706+
trampoline_packet: crate::onion_message::packet::Packet,
1707+
},
17011708
Receive {
17021709
payment_data: Option<FinalOnionHopData>,
17031710
payment_metadata: Option<Vec<u8>>,
@@ -2478,6 +2485,17 @@ impl Writeable for OutboundOnionPayload {
24782485
(6, short_channel_id, required)
24792486
});
24802487
},
2488+
Self::TrampolineEntry {
2489+
amt_to_forward, outgoing_cltv_value, ref payment_data,
2490+
ref trampoline_packet
2491+
} => {
2492+
_encode_varint_length_prefixed_tlv!(w, {
2493+
(2, HighZeroBytesDroppedBigSize(*amt_to_forward), required),
2494+
(4, HighZeroBytesDroppedBigSize(*outgoing_cltv_value), required),
2495+
(8, payment_data, option),
2496+
(20, trampoline_packet, required)
2497+
});
2498+
},
24812499
Self::Receive {
24822500
ref payment_data, ref payment_metadata, ref keysend_preimage, sender_intended_htlc_amt_msat,
24832501
cltv_expiry_height, ref custom_tlvs,
@@ -2486,7 +2504,9 @@ impl Writeable for OutboundOnionPayload {
24862504
// to reject any reserved types in the experimental range if new ones are ever
24872505
// standardized.
24882506
let keysend_tlv = keysend_preimage.map(|preimage| (5482373484, preimage.encode()));
2489-
let mut custom_tlvs: Vec<&(u64, Vec<u8>)> = custom_tlvs.iter().chain(keysend_tlv.iter()).collect();
2507+
let mut custom_tlvs: Vec<&(u64, Vec<u8>)> = custom_tlvs.iter()
2508+
.chain(keysend_tlv.iter())
2509+
.collect();
24902510
custom_tlvs.sort_unstable_by_key(|(typ, _)| *typ);
24912511
_encode_varint_length_prefixed_tlv!(w, {
24922512
(2, HighZeroBytesDroppedBigSize(*sender_intended_htlc_amt_msat), required),
@@ -3046,7 +3066,7 @@ mod tests {
30463066
use crate::ln::msgs::{self, FinalOnionHopData, OnionErrorPacket, CommonOpenChannelFields, CommonAcceptChannelFields};
30473067
use crate::ln::msgs::SocketAddress;
30483068
use crate::routing::gossip::{NodeAlias, NodeId};
3049-
use crate::util::ser::{Writeable, Readable, ReadableArgs, Hostname, TransactionU16LenLimited};
3069+
use crate::util::ser::{Writeable, Readable, ReadableArgs, Hostname, TransactionU16LenLimited, BigSize};
30503070
use crate::util::test_utils;
30513071

30523072
use bitcoin::hashes::hex::FromHex;
@@ -3070,6 +3090,7 @@ mod tests {
30703090
use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
30713091
#[cfg(feature = "std")]
30723092
use crate::ln::msgs::SocketAddressParseError;
3093+
use crate::onion_message::packet::Packet;
30733094

30743095
#[test]
30753096
fn encoding_channel_reestablish() {
@@ -4338,6 +4359,64 @@ mod tests {
43384359
} else { panic!(); }
43394360
}
43404361

4362+
#[test]
4363+
fn encoding_final_onion_hop_data_with_trampoline_packet() {
4364+
let secp_ctx = Secp256k1::new();
4365+
let (_private_key, public_key) = get_keys_from!("0101010101010101010101010101010101010101010101010101010101010101", secp_ctx);
4366+
4367+
let compressed_public_key = public_key.serialize();
4368+
assert_eq!(compressed_public_key.len(), 33);
4369+
4370+
let trampoline_packet = Packet {
4371+
version: 0,
4372+
public_key,
4373+
hop_data: vec![1; 650], // this should be the standard encoded length
4374+
hmac: [2; 32],
4375+
};
4376+
let encoded_trampoline_packet = trampoline_packet.encode();
4377+
assert_eq!(encoded_trampoline_packet.len(), 716);
4378+
4379+
let msg = msgs::OutboundOnionPayload::TrampolineEntry {
4380+
payment_data: None,
4381+
amt_to_forward: 0x0badf00d01020304,
4382+
outgoing_cltv_value: 0xffffffff,
4383+
trampoline_packet,
4384+
};
4385+
let encoded_payload = msg.encode();
4386+
4387+
let trampoline_type_bytes = &encoded_payload[19..=19];
4388+
let mut trampoline_type_cursor = Cursor::new(trampoline_type_bytes);
4389+
let trampoline_type_big_size: BigSize = Readable::read(&mut trampoline_type_cursor).unwrap();
4390+
assert_eq!(trampoline_type_big_size.0, 20);
4391+
4392+
let trampoline_length_bytes = &encoded_payload[20..=22];
4393+
let mut trampoline_length_cursor = Cursor::new(trampoline_length_bytes);
4394+
let trampoline_length_big_size: BigSize = Readable::read(&mut trampoline_length_cursor).unwrap();
4395+
assert_eq!(trampoline_length_big_size.0, encoded_trampoline_packet.len() as u64);
4396+
}
4397+
4398+
#[test]
4399+
fn encoding_final_onion_hop_data_with_eclair_trampoline_packet() {
4400+
let public_key = PublicKey::from_slice(&<Vec<u8>>::from_hex("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()).unwrap();
4401+
let hop_data = <Vec<u8>>::from_hex("cff34152f3a36e52ca94e74927203a560392b9cc7ce3c45809c6be52166c24a595716880f95f178bf5b30ca63141f74db6e92795c6130877cfdac3d4bd3087ee73c65d627ddd709112a848cc99e303f3706509aa43ba7c8a88cba175fccf9a8f5016ef06d3b935dbb15196d7ce16dc1a7157845566901d7b2197e52cab4ce487014b14816e5805f9fcacb4f8f88b8ff176f1b94f6ce6b00bc43221130c17d20ef629db7c5f7eafaa166578c720619561dd14b3277db557ec7dcdb793771aef0f2f667cfdbeae3ac8d331c5994779dffb31e5fc0dbdedc0c592ca6d21c18e47fe3528d6975c19517d7e2ea8c5391cf17d0fe30c80913ed887234ccb48808f7ef9425bcd815c3b586210979e3bb286ef2851bf9ce04e28c40a203df98fd648d2f1936fd2f1def0e77eecb277229b4b682322371c0a1dbfcd723a991993df8cc1f2696b84b055b40a1792a29f710295a18fbd351b0f3ff34cd13941131b8278ba79303c89117120eea691738a9954908195143b039dbeed98f26a92585f3d15cf742c953799d3272e0545e9b744be9d3b4c").unwrap();
4402+
let hmac_vector = <Vec<u8>>::from_hex("bb079bfc4b35190eee9f59a1d7b41ba2f773179f322dafb4b1af900c289ebd6c").unwrap();
4403+
let mut hmac = [0; 32];
4404+
hmac.copy_from_slice(&hmac_vector);
4405+
4406+
let compressed_public_key = public_key.serialize();
4407+
assert_eq!(compressed_public_key.len(), 33);
4408+
4409+
let trampoline_packet = Packet {
4410+
version: 0,
4411+
public_key,
4412+
hop_data,
4413+
hmac,
4414+
};
4415+
let encoded_trampoline_packet = trampoline_packet.encode();
4416+
let expected_eclair_trampoline_packet = <Vec<u8>>::from_hex("0002eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619cff34152f3a36e52ca94e74927203a560392b9cc7ce3c45809c6be52166c24a595716880f95f178bf5b30ca63141f74db6e92795c6130877cfdac3d4bd3087ee73c65d627ddd709112a848cc99e303f3706509aa43ba7c8a88cba175fccf9a8f5016ef06d3b935dbb15196d7ce16dc1a7157845566901d7b2197e52cab4ce487014b14816e5805f9fcacb4f8f88b8ff176f1b94f6ce6b00bc43221130c17d20ef629db7c5f7eafaa166578c720619561dd14b3277db557ec7dcdb793771aef0f2f667cfdbeae3ac8d331c5994779dffb31e5fc0dbdedc0c592ca6d21c18e47fe3528d6975c19517d7e2ea8c5391cf17d0fe30c80913ed887234ccb48808f7ef9425bcd815c3b586210979e3bb286ef2851bf9ce04e28c40a203df98fd648d2f1936fd2f1def0e77eecb277229b4b682322371c0a1dbfcd723a991993df8cc1f2696b84b055b40a1792a29f710295a18fbd351b0f3ff34cd13941131b8278ba79303c89117120eea691738a9954908195143b039dbeed98f26a92585f3d15cf742c953799d3272e0545e9b744be9d3b4cbb079bfc4b35190eee9f59a1d7b41ba2f773179f322dafb4b1af900c289ebd6c").unwrap();
4417+
assert_eq!(encoded_trampoline_packet, expected_eclair_trampoline_packet);
4418+
}
4419+
43414420
#[test]
43424421
fn query_channel_range_end_blocknum() {
43434422
let tests: Vec<(u32, u32, u32)> = vec![

0 commit comments

Comments
 (0)