@@ -425,12 +425,31 @@ pub(super) fn construct_onion_packet(
425
425
#[ allow( unused) ]
426
426
pub ( super ) fn construct_trampoline_onion_packet (
427
427
payloads : Vec < msgs:: OutboundTrampolinePayload > , onion_keys : Vec < OnionKeys > ,
428
- prng_seed : [ u8 ; 32 ] , associated_data : & PaymentHash , length : u16 ,
428
+ prng_seed : [ u8 ; 32 ] , associated_data : & PaymentHash , length : Option < u16 > ,
429
429
) -> Result < msgs:: TrampolineOnionPacket , ( ) > {
430
- let mut packet_data = vec ! [ 0u8 ; length as usize ] ;
430
+ let minimum_packet_length: usize = payloads
431
+ . iter ( )
432
+ . map ( |p| {
433
+ let mut payload_len = LengthCalculatingWriter ( 0 ) ;
434
+ p. write ( & mut payload_len) . expect ( "Failed to calculate length" ) ;
435
+ payload_len. 0 + 32
436
+ } )
437
+ . sum ( ) ;
438
+
439
+ assert ! (
440
+ minimum_packet_length < ONION_DATA_LEN ,
441
+ "Trampoline onion packet must be smaller than outer onion"
442
+ ) ;
443
+
444
+ let packet_length = length. unwrap_or ( minimum_packet_length as u16 ) as usize ;
445
+ assert ! (
446
+ packet_length >= minimum_packet_length,
447
+ "Packet length cannot be smaller than the payloads require."
448
+ ) ;
431
449
450
+ let mut packet_data = vec ! [ 0u8 ; packet_length] ;
432
451
let mut chacha = ChaCha20 :: new ( & prng_seed, & [ 0 ; 8 ] ) ;
433
- chacha. process ( & vec ! [ 0u8 ; length as usize ] , & mut packet_data) ;
452
+ chacha. process ( & vec ! [ 0u8 ; packet_length ] , & mut packet_data) ;
434
453
435
454
construct_onion_packet_with_init_noise :: < _ , _ > (
436
455
payloads,
0 commit comments