@@ -39,6 +39,8 @@ use core::ops::Deref;
3939#[ allow( unused_imports) ]
4040use crate :: prelude:: * ;
4141
42+ const DEFAULT_MIN_FAILURE_PACKET_LEN : usize = 256 ;
43+
4244pub ( crate ) struct OnionKeys {
4345 #[ cfg( test) ]
4446 pub ( crate ) shared_secret : SharedSecret ,
@@ -887,10 +889,9 @@ fn process_chacha(key: &[u8; 32], packet: &mut [u8]) {
887889}
888890
889891fn build_unencrypted_failure_packet (
890- shared_secret : & [ u8 ] , failure_type : u16 , failure_data : & [ u8 ] ,
892+ shared_secret : & [ u8 ] , failure_type : u16 , failure_data : & [ u8 ] , min_packet_len : usize ,
891893) -> OnionErrorPacket {
892894 assert_eq ! ( shared_secret. len( ) , 32 ) ;
893- assert ! ( failure_data. len( ) <= 256 - 2 ) ;
894895
895896 let um = gen_um_from_shared_secret ( & shared_secret) ;
896897
@@ -901,9 +902,14 @@ fn build_unencrypted_failure_packet(
901902 res. extend_from_slice ( & failure_data[ ..] ) ;
902903 res
903904 } ;
905+ let pad_len = if failure_data. len ( ) > min_packet_len - 2 {
906+ 0
907+ } else {
908+ min_packet_len - 2 - failure_data. len ( )
909+ } ;
904910 let pad = {
905- let mut res = Vec :: with_capacity ( 256 - 2 - failure_data . len ( ) ) ;
906- res. resize ( 256 - 2 - failure_data . len ( ) , 0 ) ;
911+ let mut res = Vec :: with_capacity ( pad_len ) ;
912+ res. resize ( pad_len , 0 ) ;
907913 res
908914 } ;
909915 let mut packet = msgs:: DecodedOnionErrorPacket { hmac : [ 0 ; 32 ] , failuremsg, pad } ;
@@ -918,8 +924,12 @@ fn build_unencrypted_failure_packet(
918924pub ( super ) fn build_failure_packet (
919925 shared_secret : & [ u8 ] , failure_type : u16 , failure_data : & [ u8 ] ,
920926) -> OnionErrorPacket {
921- let mut onion_error_packet =
922- build_unencrypted_failure_packet ( shared_secret, failure_type, failure_data) ;
927+ let mut onion_error_packet = build_unencrypted_failure_packet (
928+ shared_secret,
929+ failure_type,
930+ failure_data,
931+ DEFAULT_MIN_FAILURE_PACKET_LEN ,
932+ ) ;
923933
924934 crypt_failure_packet ( shared_secret, & mut onion_error_packet) ;
925935
@@ -2425,6 +2435,7 @@ mod tests {
24252435 onion_keys[ 4 ] . shared_secret . as_ref ( ) ,
24262436 0x2002 ,
24272437 & [ 0 ; 0 ] ,
2438+ DEFAULT_MIN_FAILURE_PACKET_LEN ,
24282439 ) ;
24292440 let hex = "4c2fc8bc08510334b6833ad9c3e79cd1b52ae59dfe5c2a4b23ead50f09f7ee0b0002200200fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ;
24302441 assert_eq ! ( onion_error. data, <Vec <u8 >>:: from_hex( hex) . unwrap( ) ) ;
@@ -2601,6 +2612,7 @@ mod tests {
26012612 outer_onion_keys[ 0 ] . shared_secret . as_ref ( ) ,
26022613 error_code,
26032614 & [ 0 ; 0 ] ,
2615+ DEFAULT_MIN_FAILURE_PACKET_LEN ,
26042616 ) ;
26052617
26062618 crypt_failure_packet (
@@ -2620,6 +2632,7 @@ mod tests {
26202632 outer_onion_keys[ 1 ] . shared_secret . as_ref ( ) ,
26212633 error_code,
26222634 & [ 0 ; 0 ] ,
2635+ DEFAULT_MIN_FAILURE_PACKET_LEN ,
26232636 ) ;
26242637
26252638 crypt_failure_packet (
@@ -2648,6 +2661,7 @@ mod tests {
26482661 trampoline_onion_keys[ 0 ] . shared_secret . as_ref ( ) ,
26492662 error_code,
26502663 & [ 0 ; 0 ] ,
2664+ DEFAULT_MIN_FAILURE_PACKET_LEN ,
26512665 ) ;
26522666
26532667 crypt_failure_packet (
@@ -2681,6 +2695,7 @@ mod tests {
26812695 trampoline_onion_keys[ 1 ] . shared_secret . as_ref ( ) ,
26822696 error_code,
26832697 & [ 0 ; 0 ] ,
2698+ DEFAULT_MIN_FAILURE_PACKET_LEN ,
26842699 ) ;
26852700
26862701 crypt_failure_packet (
0 commit comments