@@ -645,6 +645,30 @@ fn test_onion_failure() {
645
645
} , || nodes[ 2 ] . node . fail_htlc_backwards ( & payment_hash) , false , None ,
646
646
Some ( NetworkUpdate :: NodeFailure { node_id : route. paths [ 0 ] . hops [ 1 ] . pubkey , is_permanent : true } ) ,
647
647
Some ( channels[ 1 ] . 0 . contents . short_channel_id ) ) ;
648
+ run_onion_failure_test_with_fail_intercept ( "0-length channel update in UPDATE onion failure" , 200 , & nodes,
649
+ & route, & payment_hash, & payment_secret, |_msg| { } , |msg| {
650
+ let session_priv = SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ;
651
+ let onion_keys = onion_utils:: construct_onion_keys ( & Secp256k1 :: new ( ) , & route. paths [ 0 ] , & session_priv) . unwrap ( ) ;
652
+ let mut decoded_err_packet = msgs:: DecodedOnionErrorPacket {
653
+ failuremsg : vec ! [
654
+ 0x10 , 0x7 , // UPDATE|7
655
+ 0x0 , 0x0 // 0-len channel update
656
+ ] ,
657
+ pad : vec ! [ 0 ; 255 - 4 /* 4-byte error message */ ] ,
658
+ hmac : [ 0 ; 32 ] ,
659
+ } ;
660
+ let um = onion_utils:: gen_um_from_shared_secret ( & onion_keys[ 1 ] . shared_secret . as_ref ( ) ) ;
661
+ let mut hmac = HmacEngine :: < Sha256 > :: new ( & um) ;
662
+ hmac. input ( & decoded_err_packet. encode ( ) [ 32 ..] ) ;
663
+ decoded_err_packet. hmac = Hmac :: from_engine ( hmac) . into_inner ( ) ;
664
+ msg. reason = onion_utils:: encrypt_failure_packet (
665
+ & onion_keys[ 1 ] . shared_secret . as_ref ( ) , & decoded_err_packet. encode ( ) [ ..] )
666
+ } , || nodes[ 2 ] . node . fail_htlc_backwards ( & payment_hash) , true , Some ( 0x1000 |7 ) ,
667
+ Some ( NetworkUpdate :: ChannelFailure {
668
+ short_channel_id : channels[ 1 ] . 0 . contents . short_channel_id ,
669
+ is_permanent : false ,
670
+ } ) ,
671
+ Some ( channels[ 1 ] . 0 . contents . short_channel_id ) ) ;
648
672
}
649
673
650
674
#[ test]
0 commit comments