@@ -2216,7 +2216,6 @@ fn test_trampoline_unblinded_receive() {
22162216 connect_blocks ( & nodes[ i] , ( TOTAL_NODE_COUNT as u32 ) * CHAN_CONFIRM_DEPTH + 1 - nodes[ i] . best_block_info ( ) . 1 ) ;
22172217 }
22182218
2219- let alice_node_id = nodes[ 0 ] . node ( ) . get_our_node_id ( ) ;
22202219 let bob_node_id = nodes[ 1 ] . node ( ) . get_our_node_id ( ) ;
22212220 let carol_node_id = nodes[ 2 ] . node ( ) . get_our_node_id ( ) ;
22222221
@@ -2225,28 +2224,6 @@ fn test_trampoline_unblinded_receive() {
22252224
22262225 let amt_msat = 1000 ;
22272226 let ( payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 2 ] , Some ( amt_msat) , None ) ;
2228- let payee_tlvs = blinded_path:: payment:: TrampolineForwardTlvs {
2229- next_trampoline : alice_node_id,
2230- payment_constraints : PaymentConstraints {
2231- max_cltv_expiry : u32:: max_value ( ) ,
2232- htlc_minimum_msat : amt_msat,
2233- } ,
2234- features : BlindedHopFeatures :: empty ( ) ,
2235- payment_relay : PaymentRelay {
2236- cltv_expiry_delta : 0 ,
2237- fee_proportional_millionths : 0 ,
2238- fee_base_msat : 0 ,
2239- } ,
2240- next_blinding_override : None ,
2241- } ;
2242-
2243- let carol_unblinded_tlvs = payee_tlvs. encode ( ) ;
2244- let path = [ ( ( carol_node_id, None ) , WithoutLength ( & carol_unblinded_tlvs) ) ] ;
2245- let carol_alice_trampoline_session_priv = secret_from_hex ( "a0f4b8d7b6c2d0ffdfaf718f76e9decaef4d9fb38a8c4addb95c4007cc3eee03" ) ;
2246- let carol_blinding_point = PublicKey :: from_secret_key ( & secp_ctx, & carol_alice_trampoline_session_priv) ;
2247- let carol_blinded_hops = blinded_path:: utils:: construct_blinded_hops (
2248- & secp_ctx, path. into_iter ( ) , & carol_alice_trampoline_session_priv,
2249- ) . unwrap ( ) ;
22502227
22512228 let route = Route {
22522229 paths : vec ! [ Path {
@@ -2283,58 +2260,60 @@ fn test_trampoline_unblinded_receive() {
22832260 cltv_expiry_delta: 24 ,
22842261 } ,
22852262 ] ,
2286- hops: carol_blinded_hops,
2287- blinding_point: carol_blinding_point,
2263+ // The blinded path data is unused because we replace the onion of the last hop
2264+ hops: vec![ BlindedHop {
2265+ blinded_node_id: PublicKey :: from_slice( & [ 2 ; 33 ] ) . unwrap( ) ,
2266+ encrypted_payload: vec![ 42 ; 32 ]
2267+ } ] ,
2268+ blinding_point: PublicKey :: from_slice( & [ 2 ; 33 ] ) . unwrap( ) ,
22882269 excess_final_cltv_expiry_delta: 39 ,
22892270 final_value_msat: amt_msat,
22902271 } )
22912272 } ] ,
22922273 route_params : None ,
22932274 } ;
22942275
2276+ // We need the session priv to construct an invalid onion packet later.
2277+ let override_random_bytes = [ 42 ; 32 ] ;
2278+ * nodes[ 0 ] . keys_manager . override_random_bytes . lock ( ) . unwrap ( ) = Some ( override_random_bytes) ;
22952279 nodes[ 0 ] . node . send_payment_with_route ( route. clone ( ) , payment_hash, RecipientOnionFields :: spontaneous_empty ( ) , PaymentId ( payment_hash. 0 ) ) . unwrap ( ) ;
22962280
22972281 let replacement_onion = {
22982282 // create a substitute onion where the last Trampoline hop is an unblinded receive, which we
22992283 // (deliberately) do not support out of the box, therefore necessitating this workaround
2300- let trampoline_secret_key = secret_from_hex ( "0134928f7b7ca6769080d70f16be84c812c741f545b49a34db47ce338a205799" ) ;
2301- let prng_seed = secret_from_hex ( "fe02b4b9054302a3ddf4e1e9f7c411d644aebbd295218ab009dca94435f775a9" ) ;
2284+ let outer_session_priv = SecretKey :: from_slice ( & override_random_bytes [ .. ] ) . unwrap ( ) ;
2285+ let trampoline_session_priv = onion_utils :: compute_trampoline_session_priv ( & outer_session_priv ) ;
23022286 let recipient_onion_fields = RecipientOnionFields :: spontaneous_empty ( ) ;
23032287
23042288 let blinded_tail = route. paths [ 0 ] . blinded_tail . clone ( ) . unwrap ( ) ;
2305- let ( mut trampoline_payloads, outer_total_msat, outer_starting_htlc_offset) = onion_utils:: build_trampoline_onion_payloads ( & blinded_tail, amt_msat, & recipient_onion_fields, 32 , & None ) . unwrap ( ) ;
2306-
2307- // pop the last dummy hop
2308- trampoline_payloads. pop ( ) ;
2309-
2310- trampoline_payloads. push ( msgs:: OutboundTrampolinePayload :: Receive {
2289+ let ( _, _, outer_starting_htlc_offset) = onion_utils:: build_trampoline_onion_payloads ( & blinded_tail, amt_msat, & recipient_onion_fields, 32 , & None ) . unwrap ( ) ;
2290+ let trampoline_payloads = vec ! [ msgs:: OutboundTrampolinePayload :: Receive {
23112291 payment_data: Some ( msgs:: FinalOnionHopData {
23122292 payment_secret,
23132293 total_msat: amt_msat,
23142294 } ) ,
23152295 sender_intended_htlc_amt_msat: amt_msat,
23162296 cltv_expiry_height: 104 ,
2317- } ) ;
2297+ } ] ;
23182298
2319- let trampoline_onion_keys = onion_utils:: construct_trampoline_onion_keys ( & secp_ctx, & route. paths [ 0 ] . blinded_tail . as_ref ( ) . unwrap ( ) , & trampoline_secret_key ) ;
2299+ let trampoline_onion_keys = onion_utils:: construct_trampoline_onion_keys ( & secp_ctx, & route. paths [ 0 ] . blinded_tail . as_ref ( ) . unwrap ( ) , & trampoline_session_priv ) ;
23202300 let trampoline_packet = onion_utils:: construct_trampoline_onion_packet (
23212301 trampoline_payloads,
23222302 trampoline_onion_keys,
2323- prng_seed . secret_bytes ( ) ,
2303+ override_random_bytes ,
23242304 & payment_hash,
23252305 None ,
23262306 ) . unwrap ( ) ;
23272307
23282308 // Use a different session key to construct the replacement onion packet. Note that the sender isn't aware of
23292309 // this and won't be able to decode the fulfill hold times.
2330- let outer_session_priv = secret_from_hex ( "e52c20461ed7acd46c4e7b591a37610519179482887bd73bf3b94617f8f03677" ) ;
23312310
2332- let ( outer_payloads, _, _) = onion_utils:: build_onion_payloads ( & route. paths [ 0 ] , outer_total_msat , & recipient_onion_fields, outer_starting_htlc_offset, & None , None , Some ( trampoline_packet) ) . unwrap ( ) ;
2311+ let ( outer_payloads, _, _) = onion_utils:: build_onion_payloads ( & route. paths [ 0 ] , amt_msat , & recipient_onion_fields, outer_starting_htlc_offset, & None , None , Some ( trampoline_packet) ) . unwrap ( ) ;
23332312 let outer_onion_keys = onion_utils:: construct_onion_keys ( & secp_ctx, & route. clone ( ) . paths [ 0 ] , & outer_session_priv) ;
23342313 let outer_packet = onion_utils:: construct_onion_packet (
23352314 outer_payloads,
23362315 outer_onion_keys,
2337- prng_seed . secret_bytes ( ) ,
2316+ override_random_bytes ,
23382317 & payment_hash,
23392318 ) . unwrap ( ) ;
23402319
0 commit comments