From 7c6f2207d7145a242d1a1aa6ef07635470bc039c Mon Sep 17 00:00:00 2001 From: Arik Sosman Date: Wed, 4 Dec 2024 11:36:52 -0800 Subject: [PATCH] Calculate Trampoline onion size dynamically For outbound Trampoline payments, we will need to generate onion packets whose size matches their content. This allows them to be included in individual hops at arbitrary positions. A future spec change may involve defining a static size to improve privacy from Trampoline nodes. --- lightning/src/ln/onion_utils.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/lightning/src/ln/onion_utils.rs b/lightning/src/ln/onion_utils.rs index a3ffffa3bc2..4140fb17088 100644 --- a/lightning/src/ln/onion_utils.rs +++ b/lightning/src/ln/onion_utils.rs @@ -427,12 +427,30 @@ pub(super) fn construct_onion_packet( #[allow(unused)] pub(super) fn construct_trampoline_onion_packet( payloads: Vec, onion_keys: Vec, - prng_seed: [u8; 32], associated_data: &PaymentHash, length: u16, + prng_seed: [u8; 32], associated_data: &PaymentHash, length: Option, ) -> Result { - let mut packet_data = vec![0u8; length as usize]; + let minimum_packet_length = payloads.iter().map(|p| p.serialized_length() + 32).sum(); + debug_assert!( + minimum_packet_length < ONION_DATA_LEN, + "Trampoline onion packet must be smaller than outer onion" + ); + if minimum_packet_length >= ONION_DATA_LEN { + return Err(()); + } + + let packet_length = length.map(|l| usize::from(l)).unwrap_or(minimum_packet_length); + debug_assert!( + packet_length >= minimum_packet_length, + "Packet length cannot be smaller than the payloads require." + ); + if packet_length < minimum_packet_length { + return Err(()); + } + + let mut packet_data = vec![0u8; packet_length]; let mut chacha = ChaCha20::new(&prng_seed, &[0; 8]); - chacha.process(&vec![0u8; length as usize], &mut packet_data); + chacha.process_in_place(&mut packet_data); construct_onion_packet_with_init_noise::<_, _>( payloads,