@@ -427,12 +427,30 @@ pub(super) fn construct_onion_packet(
427
427
#[ allow( unused) ]
428
428
pub ( super ) fn construct_trampoline_onion_packet (
429
429
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 > ,
431
431
) -> 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 ( ) ;
433
433
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] ;
434
452
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) ;
436
454
437
455
construct_onion_packet_with_init_noise :: < _ , _ > (
438
456
payloads,
0 commit comments