@@ -31,7 +31,8 @@ use crate::util::errors::APIError;
3131
3232use bitcoin:: hash_types:: BlockHash ;
3333
34- use bitcoin:: hashes:: Hash ;
34+ use bitcoin:: hashes:: { Hash , HashEngine } ;
35+ use bitcoin:: hashes:: hmac:: { Hmac , HmacEngine } ;
3536use bitcoin:: hashes:: sha256:: Hash as Sha256 ;
3637
3738use bitcoin:: secp256k1;
@@ -57,7 +58,12 @@ fn run_onion_failure_test<F1,F2>(_name: &str, test_case: u8, nodes: &Vec<Node>,
5758// 3: final node fails backward (but tamper onion payloads from node0)
5859// 100: trigger error in the intermediate node and tamper returning fail_htlc
5960// 200: trigger error in the final node and tamper returning fail_htlc
60- fn run_onion_failure_test_with_fail_intercept < F1 , F2 , F3 > ( _name : & str , test_case : u8 , nodes : & Vec < Node > , route : & Route , payment_hash : & PaymentHash , payment_secret : & PaymentSecret , mut callback_msg : F1 , mut callback_fail : F2 , mut callback_node : F3 , expected_retryable : bool , expected_error_code : Option < u16 > , expected_channel_update : Option < NetworkUpdate > , expected_short_channel_id : Option < u64 > )
61+ fn run_onion_failure_test_with_fail_intercept < F1 , F2 , F3 > (
62+ _name : & str , test_case : u8 , nodes : & Vec < Node > , route : & Route , payment_hash : & PaymentHash ,
63+ payment_secret : & PaymentSecret , mut callback_msg : F1 , mut callback_fail : F2 ,
64+ mut callback_node : F3 , expected_retryable : bool , expected_error_code : Option < u16 > ,
65+ expected_channel_update : Option < NetworkUpdate > , expected_short_channel_id : Option < u64 >
66+ )
6167 where F1 : for < ' a > FnMut ( & ' a mut msgs:: UpdateAddHTLC ) ,
6268 F2 : for < ' a > FnMut ( & ' a mut msgs:: UpdateFailHTLC ) ,
6369 F3 : FnMut ( ) ,
@@ -620,6 +626,25 @@ fn test_onion_failure() {
620626 } , ||{
621627 nodes[ 2 ] . node . fail_htlc_backwards ( & payment_hash) ;
622628 } , true , Some ( 23 ) , None , None ) ;
629+
630+ run_onion_failure_test_with_fail_intercept ( "bogus err packet with valid hmac" , 200 , & nodes,
631+ & route, & payment_hash, & payment_secret, |_msg| { } , |msg| {
632+ let session_priv = SecretKey :: from_slice ( & [ 3 ; 32 ] ) . unwrap ( ) ;
633+ let onion_keys = onion_utils:: construct_onion_keys ( & Secp256k1 :: new ( ) , & route. paths [ 0 ] , & session_priv) . unwrap ( ) ;
634+ let mut decoded_err_packet = msgs:: DecodedOnionErrorPacket {
635+ failuremsg : vec ! [ 0 ] ,
636+ pad : vec ! [ 0 ; 255 ] ,
637+ hmac : [ 0 ; 32 ] ,
638+ } ;
639+ let um = onion_utils:: gen_um_from_shared_secret ( & onion_keys[ 1 ] . shared_secret . as_ref ( ) ) ;
640+ let mut hmac = HmacEngine :: < Sha256 > :: new ( & um) ;
641+ hmac. input ( & decoded_err_packet. encode ( ) [ 32 ..] ) ;
642+ decoded_err_packet. hmac = Hmac :: from_engine ( hmac) . into_inner ( ) ;
643+ msg. reason = onion_utils:: encrypt_failure_packet (
644+ & onion_keys[ 1 ] . shared_secret . as_ref ( ) , & decoded_err_packet. encode ( ) [ ..] )
645+ } , || nodes[ 2 ] . node . fail_htlc_backwards ( & payment_hash) , false , None ,
646+ Some ( NetworkUpdate :: NodeFailure { node_id : route. paths [ 0 ] . hops [ 1 ] . pubkey , is_permanent : true } ) ,
647+ Some ( channels[ 1 ] . 0 . contents . short_channel_id ) ) ;
623648}
624649
625650#[ test]
0 commit comments