Skip to content

Commit a678f76

Browse files
committed
Use onion::Packet for inner Trampoline onion.
1 parent 95eebc2 commit a678f76

File tree

1 file changed

+64
-3
lines changed

1 file changed

+64
-3
lines changed

lightning/src/ln/msgs.rs

+64-3
Original file line numberDiff line numberDiff line change
@@ -1690,7 +1690,6 @@ mod fuzzy_internal_msgs {
16901690
use crate::ln::{PaymentPreimage, PaymentSecret};
16911691
use crate::ln::features::BlindedHopFeatures;
16921692
use super::FinalOnionHopData;
1693-
use crate::ln::msgs::OnionPacket;
16941693

16951694
// These types aren't intended to be pub, but are exposed for direct fuzzing (as we deserialize
16961695
// them from untrusted input):
@@ -1741,7 +1740,7 @@ mod fuzzy_internal_msgs {
17411740
custom_tlvs: Vec<(u64, Vec<u8>)>,
17421741
sender_intended_htlc_amt_msat: u64,
17431742
cltv_expiry_height: u32,
1744-
trampoline_packet: Option<OnionPacket>
1743+
trampoline_packet: Option<crate::onion_message::packet::Packet>
17451744
},
17461745
BlindedForward {
17471746
encrypted_tlvs: Vec<u8>,
@@ -2863,7 +2862,7 @@ mod tests {
28632862
use crate::ln::msgs::{self, FinalOnionHopData, OnionErrorPacket};
28642863
use crate::ln::msgs::SocketAddress;
28652864
use crate::routing::gossip::{NodeAlias, NodeId};
2866-
use crate::util::ser::{Writeable, Readable, ReadableArgs, Hostname, TransactionU16LenLimited};
2865+
use crate::util::ser::{Writeable, Readable, ReadableArgs, Hostname, TransactionU16LenLimited, BigSize};
28672866
use crate::util::test_utils;
28682867

28692868
use bitcoin::hashes::hex::FromHex;
@@ -2887,6 +2886,7 @@ mod tests {
28872886
use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
28882887
#[cfg(feature = "std")]
28892888
use crate::ln::msgs::SocketAddressParseError;
2889+
use crate::onion_message::packet::Packet;
28902890

28912891
#[test]
28922892
fn encoding_channel_reestablish() {
@@ -4153,6 +4153,67 @@ mod tests {
41534153
} else { panic!(); }
41544154
}
41554155

4156+
#[test]
4157+
fn encoding_final_onion_hop_data_with_trampoline_packet() {
4158+
let secp_ctx = Secp256k1::new();
4159+
let (private_key, public_key) = get_keys_from!("0101010101010101010101010101010101010101010101010101010101010101", secp_ctx);
4160+
4161+
let compressed_public_key = public_key.serialize();
4162+
assert_eq!(compressed_public_key.len(), 33);
4163+
4164+
let trampoline_packet = Packet {
4165+
version: 0,
4166+
public_key,
4167+
hop_data: vec![1; 650], // this should be the standard encoded length
4168+
hmac: [2; 32],
4169+
};
4170+
let encoded_trampoline_packet = trampoline_packet.encode();
4171+
assert_eq!(encoded_trampoline_packet.len(), 716);
4172+
4173+
let msg = msgs::OutboundOnionPayload::Receive {
4174+
payment_data: None,
4175+
payment_metadata: None,
4176+
keysend_preimage: None,
4177+
custom_tlvs: Vec::new(),
4178+
sender_intended_htlc_amt_msat: 0x0badf00d01020304,
4179+
cltv_expiry_height: 0xffffffff,
4180+
trampoline_packet: Some(trampoline_packet)
4181+
};
4182+
let encoded_payload = msg.encode();
4183+
4184+
let trampoline_type_bytes = &encoded_payload[19..=23];
4185+
let mut trampoline_type_cursor = Cursor::new(trampoline_type_bytes);
4186+
let trampoline_type_big_size: BigSize = Readable::read(&mut trampoline_type_cursor).unwrap();
4187+
assert_eq!(trampoline_type_big_size.0, 66100);
4188+
4189+
let trampoline_length_bytes = &encoded_payload[24..=26];
4190+
let mut trampoline_length_cursor = Cursor::new(trampoline_length_bytes);
4191+
let trampoline_length_big_size: BigSize = Readable::read(&mut trampoline_length_cursor).unwrap();
4192+
assert_eq!(trampoline_length_big_size.0, encoded_trampoline_packet.len() as u64);
4193+
}
4194+
4195+
#[test]
4196+
fn encoding_final_onion_hop_data_with_eclair_trampoline_packet() {
4197+
let public_key = PublicKey::from_slice(&<Vec<u8>>::from_hex("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()).unwrap();
4198+
let hop_data = <Vec<u8>>::from_hex("cff34152f3a36e52ca94e74927203a560392b9cc7ce3c45809c6be52166c24a595716880f95f178bf5b30ca63141f74db6e92795c6130877cfdac3d4bd3087ee73c65d627ddd709112a848cc99e303f3706509aa43ba7c8a88cba175fccf9a8f5016ef06d3b935dbb15196d7ce16dc1a7157845566901d7b2197e52cab4ce487014b14816e5805f9fcacb4f8f88b8ff176f1b94f6ce6b00bc43221130c17d20ef629db7c5f7eafaa166578c720619561dd14b3277db557ec7dcdb793771aef0f2f667cfdbeae3ac8d331c5994779dffb31e5fc0dbdedc0c592ca6d21c18e47fe3528d6975c19517d7e2ea8c5391cf17d0fe30c80913ed887234ccb48808f7ef9425bcd815c3b586210979e3bb286ef2851bf9ce04e28c40a203df98fd648d2f1936fd2f1def0e77eecb277229b4b682322371c0a1dbfcd723a991993df8cc1f2696b84b055b40a1792a29f710295a18fbd351b0f3ff34cd13941131b8278ba79303c89117120eea691738a9954908195143b039dbeed98f26a92585f3d15cf742c953799d3272e0545e9b744be9d3b4c").unwrap();
4199+
let hmac_vector = <Vec<u8>>::from_hex("bb079bfc4b35190eee9f59a1d7b41ba2f773179f322dafb4b1af900c289ebd6c").unwrap();
4200+
let mut hmac = [0; 32];
4201+
hmac.copy_from_slice(&hmac_vector);
4202+
4203+
let compressed_public_key = public_key.serialize();
4204+
assert_eq!(compressed_public_key.len(), 33);
4205+
4206+
let trampoline_packet = Packet {
4207+
version: 0,
4208+
public_key,
4209+
hop_data,
4210+
hmac
4211+
};
4212+
let encoded_trampoline_packet = trampoline_packet.encode();
4213+
let expected_eclair_trampoline_packet = <Vec<u8>>::from_hex("0002eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619cff34152f3a36e52ca94e74927203a560392b9cc7ce3c45809c6be52166c24a595716880f95f178bf5b30ca63141f74db6e92795c6130877cfdac3d4bd3087ee73c65d627ddd709112a848cc99e303f3706509aa43ba7c8a88cba175fccf9a8f5016ef06d3b935dbb15196d7ce16dc1a7157845566901d7b2197e52cab4ce487014b14816e5805f9fcacb4f8f88b8ff176f1b94f6ce6b00bc43221130c17d20ef629db7c5f7eafaa166578c720619561dd14b3277db557ec7dcdb793771aef0f2f667cfdbeae3ac8d331c5994779dffb31e5fc0dbdedc0c592ca6d21c18e47fe3528d6975c19517d7e2ea8c5391cf17d0fe30c80913ed887234ccb48808f7ef9425bcd815c3b586210979e3bb286ef2851bf9ce04e28c40a203df98fd648d2f1936fd2f1def0e77eecb277229b4b682322371c0a1dbfcd723a991993df8cc1f2696b84b055b40a1792a29f710295a18fbd351b0f3ff34cd13941131b8278ba79303c89117120eea691738a9954908195143b039dbeed98f26a92585f3d15cf742c953799d3272e0545e9b744be9d3b4cbb079bfc4b35190eee9f59a1d7b41ba2f773179f322dafb4b1af900c289ebd6c").unwrap();
4214+
assert_eq!(encoded_trampoline_packet, expected_eclair_trampoline_packet);
4215+
}
4216+
41564217
#[test]
41574218
fn query_channel_range_end_blocknum() {
41584219
let tests: Vec<(u32, u32, u32)> = vec![

0 commit comments

Comments
 (0)