@@ -541,12 +541,31 @@ pub(super) fn construct_onion_packet(
541
541
#[ allow( unused) ]
542
542
pub ( super ) fn construct_trampoline_onion_packet (
543
543
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 > ,
545
545
) -> 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
+ ) ;
547
565
566
+ let mut packet_data = vec ! [ 0u8 ; packet_length] ;
548
567
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) ;
550
569
551
570
construct_onion_packet_with_init_noise :: < _ , _ > (
552
571
payloads,
0 commit comments