@@ -887,6 +887,34 @@ mod fuzzy_internal_msgs {
887
887
// 12 bytes of 0-padding for Legacy format
888
888
}
889
889
890
+ impl OnionHopData {
891
+ pub fn encoding_length ( & self ) -> usize {
892
+ fn high_zero_bytes_dropped_length ( data : u64 ) -> usize {
893
+ 8 - ( ( data. leading_zeros ( ) /8 ) as usize )
894
+ }
895
+ match self . format {
896
+ OnionHopDataFormat :: Legacy { .. } => 1 + 8 + 8 + 4 + 12 , // 33
897
+ OnionHopDataFormat :: NonFinalNode { .. } => {
898
+ 1 +
899
+ 1 + 1 + high_zero_bytes_dropped_length ( self . amt_to_forward ) +
900
+ 1 + 1 + high_zero_bytes_dropped_length ( self . outgoing_cltv_value as u64 ) +
901
+ 1 + 1 + 8 // short_channel_id
902
+ }
903
+ OnionHopDataFormat :: FinalNode { ref payment_data } => {
904
+ 1 +
905
+ 1 + 1 + high_zero_bytes_dropped_length ( self . amt_to_forward ) +
906
+ 1 + 1 + high_zero_bytes_dropped_length ( self . outgoing_cltv_value as u64 ) +
907
+ match payment_data {
908
+ None => 0 ,
909
+ Some ( payment_data) =>
910
+ 1 + 1 + high_zero_bytes_dropped_length ( payment_data. total_msat ) +
911
+ 32 // payment_secret
912
+ }
913
+ }
914
+ }
915
+ }
916
+ }
917
+
890
918
pub struct DecodedOnionErrorPacket {
891
919
pub ( crate ) hmac : [ u8 ; 32 ] ,
892
920
pub ( crate ) failuremsg : Vec < u8 > ,
@@ -2477,6 +2505,7 @@ mod tests {
2477
2505
let encoded_value = msg. encode ( ) ;
2478
2506
let target_value = hex:: decode ( "00deadbeef1bad1dea0badf00d01020304ffffffff000000000000000000000000" ) . unwrap ( ) ;
2479
2507
assert_eq ! ( encoded_value, target_value) ;
2508
+ assert_eq ! ( encoded_value. len( ) , msg. encoding_length( ) )
2480
2509
}
2481
2510
2482
2511
#[ test]
@@ -2497,6 +2526,7 @@ mod tests {
2497
2526
} else { panic ! ( ) ; }
2498
2527
assert_eq ! ( msg. amt_to_forward, 0x0badf00d01020304 ) ;
2499
2528
assert_eq ! ( msg. outgoing_cltv_value, 0xffffffff ) ;
2529
+ assert_eq ! ( encoded_value. len( ) , msg. encoding_length( ) )
2500
2530
}
2501
2531
2502
2532
#[ test]
@@ -2515,6 +2545,7 @@ mod tests {
2515
2545
if let OnionHopDataFormat :: FinalNode { payment_data : None } = msg. format { } else { panic ! ( ) ; }
2516
2546
assert_eq ! ( msg. amt_to_forward, 0x0badf00d01020304 ) ;
2517
2547
assert_eq ! ( msg. outgoing_cltv_value, 0xffffffff ) ;
2548
+ assert_eq ! ( encoded_value. len( ) , msg. encoding_length( ) )
2518
2549
}
2519
2550
2520
2551
#[ test]
@@ -2544,6 +2575,7 @@ mod tests {
2544
2575
} else { panic ! ( ) ; }
2545
2576
assert_eq ! ( msg. amt_to_forward, 0x0badf00d01020304 ) ;
2546
2577
assert_eq ! ( msg. outgoing_cltv_value, 0xffffffff ) ;
2578
+ assert_eq ! ( encoded_value. len( ) , msg. encoding_length( ) )
2547
2579
}
2548
2580
2549
2581
#[ test]
0 commit comments