@@ -13,6 +13,7 @@ use bitcoin::secp256k1::ecdh::SharedSecret;
1313use bitcoin:: secp256k1:: ecdsa:: { RecoverableSignature , Signature } ;
1414use crate :: blinded_path;
1515use crate :: blinded_path:: payment:: { BlindedPaymentPath , PaymentForwardNode , ForwardTlvs , PaymentConstraints , PaymentContext , PaymentRelay , ReceiveTlvs } ;
16+ use crate :: blinded_path:: utils:: is_padded;
1617use crate :: events:: { Event , HTLCDestination , MessageSendEvent , MessageSendEventsProvider , PaymentFailureReason } ;
1718use crate :: ln:: types:: { ChannelId , PaymentHash , PaymentSecret } ;
1819use crate :: ln:: channelmanager;
@@ -1345,6 +1346,42 @@ fn custom_tlvs_to_blinded_path() {
13451346 ) ;
13461347}
13471348
1349+ #[ test]
1350+ fn blinded_payment_path_padding ( ) {
1351+ // Make sure that for a blinded payment path, all encrypted payloads are padded to equal lengths.
1352+ let chanmon_cfgs = create_chanmon_cfgs ( 5 ) ;
1353+ let node_cfgs = create_node_cfgs ( 5 , & chanmon_cfgs) ;
1354+ let node_chanmgrs = create_node_chanmgrs ( 5 , & node_cfgs, & [ None , None , None , None , None ] ) ;
1355+ let mut nodes = create_network ( 5 , & node_cfgs, & node_chanmgrs) ;
1356+ create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1_000_000 , 0 ) ;
1357+ create_announced_chan_between_nodes_with_value ( & nodes, 1 , 2 , 1_000_000 , 0 ) ;
1358+ let chan_upd_2_3 = create_announced_chan_between_nodes_with_value ( & nodes, 2 , 3 , 1_000_000 , 0 ) . 0 . contents ;
1359+ let chan_upd_3_4 = create_announced_chan_between_nodes_with_value ( & nodes, 3 , 4 , 1_000_000 , 0 ) . 0 . contents ;
1360+
1361+ // Get all our nodes onto the same height so payments don't fail for CLTV violations.
1362+ connect_blocks ( & nodes[ 0 ] , nodes[ 4 ] . best_block_info ( ) . 1 - nodes[ 0 ] . best_block_info ( ) . 1 ) ;
1363+ connect_blocks ( & nodes[ 1 ] , nodes[ 4 ] . best_block_info ( ) . 1 - nodes[ 1 ] . best_block_info ( ) . 1 ) ;
1364+ connect_blocks ( & nodes[ 2 ] , nodes[ 4 ] . best_block_info ( ) . 1 - nodes[ 2 ] . best_block_info ( ) . 1 ) ;
1365+ assert_eq ! ( nodes[ 4 ] . best_block_info( ) . 1 , nodes[ 3 ] . best_block_info( ) . 1 ) ;
1366+
1367+ let amt_msat = 5000 ;
1368+ let ( payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 4 ] , Some ( amt_msat) , None ) ;
1369+
1370+ let blinded_path = blinded_payment_path ( payment_secret, 1 , 1_0000_0000 ,
1371+ nodes. iter ( ) . skip ( 2 ) . map ( |n| n. node . get_our_node_id ( ) ) . collect ( ) , & [ & chan_upd_2_3, & chan_upd_3_4] ,
1372+ & chanmon_cfgs[ 4 ] . keys_manager
1373+ ) ;
1374+
1375+ assert ! ( is_padded( & blinded_path. blinded_hops( ) ) ) ;
1376+
1377+ let route_params = RouteParameters :: from_payment_params_and_value ( PaymentParameters :: blinded ( vec ! [ blinded_path] ) , amt_msat) ;
1378+
1379+ nodes[ 0 ] . node . send_payment ( payment_hash, RecipientOnionFields :: spontaneous_empty ( ) , PaymentId ( payment_hash. 0 ) , route_params, Retry :: Attempts ( 0 ) ) . unwrap ( ) ;
1380+ check_added_monitors ( & nodes[ 0 ] , 1 ) ;
1381+ pass_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 3 ] , & nodes[ 4 ] ] ] , amt_msat, payment_hash, payment_secret) ;
1382+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] , & nodes[ 3 ] , & nodes[ 4 ] ] , payment_preimage) ;
1383+ }
1384+
13481385fn secret_from_hex ( hex : & str ) -> SecretKey {
13491386 SecretKey :: from_slice ( & <Vec < u8 > >:: from_hex ( hex) . unwrap ( ) ) . unwrap ( )
13501387}
0 commit comments