@@ -427,12 +427,30 @@ pub(super) fn construct_onion_packet(
427427#[ allow( unused) ]
428428pub ( 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