@@ -2217,7 +2217,6 @@ fn test_trampoline_unblinded_receive() {
2217
2217
connect_blocks ( & nodes[ i] , ( TOTAL_NODE_COUNT as u32 ) * CHAN_CONFIRM_DEPTH + 1 - nodes[ i] . best_block_info ( ) . 1 ) ;
2218
2218
}
2219
2219
2220
- let alice_node_id = nodes[ 0 ] . node ( ) . get_our_node_id ( ) ;
2221
2220
let bob_node_id = nodes[ 1 ] . node ( ) . get_our_node_id ( ) ;
2222
2221
let carol_node_id = nodes[ 2 ] . node ( ) . get_our_node_id ( ) ;
2223
2222
@@ -2226,29 +2225,6 @@ fn test_trampoline_unblinded_receive() {
2226
2225
2227
2226
let amt_msat = 1000 ;
2228
2227
let ( payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash ( & nodes[ 2 ] , Some ( amt_msat) , None ) ;
2229
- let payee_tlvs = blinded_path:: payment:: TrampolineForwardTlvs {
2230
- next_trampoline : alice_node_id,
2231
- payment_constraints : PaymentConstraints {
2232
- max_cltv_expiry : u32:: max_value ( ) ,
2233
- htlc_minimum_msat : amt_msat,
2234
- } ,
2235
- features : BlindedHopFeatures :: empty ( ) ,
2236
- payment_relay : PaymentRelay {
2237
- cltv_expiry_delta : 0 ,
2238
- fee_proportional_millionths : 0 ,
2239
- fee_base_msat : 0 ,
2240
- } ,
2241
- next_blinding_override : None ,
2242
- } ;
2243
-
2244
- let carol_unblinded_tlvs = payee_tlvs. encode ( ) ;
2245
- let path = [ ( ( carol_node_id, None ) , WithoutLength ( & carol_unblinded_tlvs) ) ] ;
2246
- let carol_alice_trampoline_session_priv = secret_from_hex ( "a0f4b8d7b6c2d0ffdfaf718f76e9decaef4d9fb38a8c4addb95c4007cc3eee03" ) ;
2247
- let carol_blinding_point = PublicKey :: from_secret_key ( & secp_ctx, & carol_alice_trampoline_session_priv) ;
2248
- let carol_blinded_hops = blinded_path:: utils:: construct_blinded_hops (
2249
- & secp_ctx, path. into_iter ( ) , & carol_alice_trampoline_session_priv,
2250
- ) ;
2251
-
2252
2228
let route = Route {
2253
2229
paths : vec ! [ Path {
2254
2230
hops: vec![
@@ -2284,58 +2260,60 @@ fn test_trampoline_unblinded_receive() {
2284
2260
cltv_expiry_delta: 24 ,
2285
2261
} ,
2286
2262
] ,
2287
- hops: carol_blinded_hops,
2288
- 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( ) ,
2289
2269
excess_final_cltv_expiry_delta: 39 ,
2290
2270
final_value_msat: amt_msat,
2291
2271
} )
2292
2272
} ] ,
2293
2273
route_params : None ,
2294
2274
} ;
2295
2275
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) ;
2296
2279
nodes[ 0 ] . node . send_payment_with_route ( route. clone ( ) , payment_hash, RecipientOnionFields :: spontaneous_empty ( ) , PaymentId ( payment_hash. 0 ) ) . unwrap ( ) ;
2297
2280
2298
2281
let replacement_onion = {
2299
2282
// create a substitute onion where the last Trampoline hop is an unblinded receive, which we
2300
2283
// (deliberately) do not support out of the box, therefore necessitating this workaround
2301
- let trampoline_secret_key = secret_from_hex ( "0134928f7b7ca6769080d70f16be84c812c741f545b49a34db47ce338a205799" ) ;
2302
- 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 ) ;
2303
2286
let recipient_onion_fields = RecipientOnionFields :: spontaneous_empty ( ) ;
2304
2287
2305
2288
let blinded_tail = route. paths [ 0 ] . blinded_tail . clone ( ) . unwrap ( ) ;
2306
- 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 ( ) ;
2307
-
2308
- // pop the last dummy hop
2309
- trampoline_payloads. pop ( ) ;
2310
-
2311
- 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 {
2312
2291
payment_data: Some ( msgs:: FinalOnionHopData {
2313
2292
payment_secret,
2314
2293
total_msat: amt_msat,
2315
2294
} ) ,
2316
2295
sender_intended_htlc_amt_msat: amt_msat,
2317
2296
cltv_expiry_height: 104 ,
2318
- } ) ;
2297
+ } ] ;
2319
2298
2320
- 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 ) ;
2321
2300
let trampoline_packet = onion_utils:: construct_trampoline_onion_packet (
2322
2301
trampoline_payloads,
2323
2302
trampoline_onion_keys,
2324
- prng_seed . secret_bytes ( ) ,
2303
+ override_random_bytes ,
2325
2304
& payment_hash,
2326
2305
None ,
2327
2306
) . unwrap ( ) ;
2328
2307
2329
2308
// Use a different session key to construct the replacement onion packet. Note that the sender isn't aware of
2330
2309
// this and won't be able to decode the fulfill hold times.
2331
- let outer_session_priv = secret_from_hex ( "e52c20461ed7acd46c4e7b591a37610519179482887bd73bf3b94617f8f03677" ) ;
2332
2310
2333
- 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 ( ) ;
2334
2312
let outer_onion_keys = onion_utils:: construct_onion_keys ( & secp_ctx, & route. clone ( ) . paths [ 0 ] , & outer_session_priv) ;
2335
2313
let outer_packet = onion_utils:: construct_onion_packet (
2336
2314
outer_payloads,
2337
2315
outer_onion_keys,
2338
- prng_seed . secret_bytes ( ) ,
2316
+ override_random_bytes ,
2339
2317
& payment_hash,
2340
2318
) . unwrap ( ) ;
2341
2319
0 commit comments