@@ -541,12 +541,31 @@ pub(super) fn construct_onion_packet(
541541#[ allow( unused) ]
542542pub ( super ) fn construct_trampoline_onion_packet (
543543 payloads : Vec < msgs:: OutboundTrampolinePayload > , onion_keys : Vec < OnionKeys > ,
544- prng_seed : [ u8 ; 32 ] , associated_data : & PaymentHash , length : u16 ,
544+ prng_seed : [ u8 ; 32 ] , associated_data : & PaymentHash , length : Option < u16 > ,
545545) -> Result < msgs:: TrampolineOnionPacket , ( ) > {
546- let mut packet_data = vec ! [ 0u8 ; length as usize ] ;
546+ let minimum_packet_length: usize = payloads
547+ . iter ( )
548+ . map ( |p| {
549+ let mut payload_len = LengthCalculatingWriter ( 0 ) ;
550+ p. write ( & mut payload_len) . expect ( "Failed to calculate length" ) ;
551+ payload_len. 0 + 32
552+ } )
553+ . sum ( ) ;
554+
555+ assert ! (
556+ minimum_packet_length < ONION_DATA_LEN ,
557+ "Trampoline onion packet must be smaller than outer onion"
558+ ) ;
559+
560+ let packet_length = length. unwrap_or ( minimum_packet_length as u16 ) as usize ;
561+ assert ! (
562+ packet_length >= minimum_packet_length,
563+ "Packet length cannot be smaller than the payloads require."
564+ ) ;
547565
566+ let mut packet_data = vec ! [ 0u8 ; packet_length] ;
548567 let mut chacha = ChaCha20 :: new ( & prng_seed, & [ 0 ; 8 ] ) ;
549- chacha. process ( & vec ! [ 0u8 ; length as usize ] , & mut packet_data) ;
568+ chacha. process ( & vec ! [ 0u8 ; packet_length ] , & mut packet_data) ;
550569
551570 construct_onion_packet_with_init_noise :: < _ , _ > (
552571 payloads,
0 commit comments