Skip to content

Commit b1fc7d8

Browse files
Merge pull request #3333 from arik-so/dynamic_trampoline_onion_sizes
Calculate Trampoline onion packet sizes dynamically.
2 parents 97e70b4 + 7c6f220 commit b1fc7d8

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

lightning/src/ln/onion_utils.rs

+21-3
Original file line numberDiff line numberDiff line change
@@ -427,12 +427,30 @@ pub(super) fn construct_onion_packet(
427427
#[allow(unused)]
428428
pub(super) fn construct_trampoline_onion_packet(
429429
payloads: Vec<msgs::OutboundTrampolinePayload>, onion_keys: Vec<OnionKeys>,
430-
prng_seed: [u8; 32], associated_data: &PaymentHash, length: u16,
430+
prng_seed: [u8; 32], associated_data: &PaymentHash, length: Option<u16>,
431431
) -> Result<msgs::TrampolineOnionPacket, ()> {
432-
let mut packet_data = vec![0u8; length as usize];
432+
let minimum_packet_length = payloads.iter().map(|p| p.serialized_length() + 32).sum();
433433

434+
debug_assert!(
435+
minimum_packet_length < ONION_DATA_LEN,
436+
"Trampoline onion packet must be smaller than outer onion"
437+
);
438+
if minimum_packet_length >= ONION_DATA_LEN {
439+
return Err(());
440+
}
441+
442+
let packet_length = length.map(|l| usize::from(l)).unwrap_or(minimum_packet_length);
443+
debug_assert!(
444+
packet_length >= minimum_packet_length,
445+
"Packet length cannot be smaller than the payloads require."
446+
);
447+
if packet_length < minimum_packet_length {
448+
return Err(());
449+
}
450+
451+
let mut packet_data = vec![0u8; packet_length];
434452
let mut chacha = ChaCha20::new(&prng_seed, &[0; 8]);
435-
chacha.process(&vec![0u8; length as usize], &mut packet_data);
453+
chacha.process_in_place(&mut packet_data);
436454

437455
construct_onion_packet_with_init_noise::<_, _>(
438456
payloads,

0 commit comments

Comments
 (0)