|
8 | 8 | // licenses.
|
9 | 9 |
|
10 | 10 | use bitcoin::secp256k1::Secp256k1;
|
11 |
| -use crate::blinded_path::BlindedPath; |
| 11 | +use crate::blinded_path::{BlindedHop, BlindedPath}; |
12 | 12 | use crate::blinded_path::payment::{ForwardTlvs, PaymentConstraints, PaymentRelay, ReceiveTlvs};
|
13 | 13 | use crate::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider};
|
14 | 14 | use crate::ln::channelmanager;
|
@@ -482,3 +482,76 @@ fn fail_blinded_payment() {
|
482 | 482 | _ => panic!("Unexpected event"),
|
483 | 483 | }
|
484 | 484 | }
|
| 485 | + |
| 486 | +#[test] |
| 487 | +fn invalid_intro_node_payload() { |
| 488 | + // Ensure we fail back properly if the intro node's onion payload is bogus. |
| 489 | + let chanmon_cfgs = create_chanmon_cfgs(3); |
| 490 | + let node_cfgs = create_node_cfgs(3, &chanmon_cfgs); |
| 491 | + let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]); |
| 492 | + let nodes = create_network(3, &node_cfgs, &node_chanmgrs); |
| 493 | + create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0); |
| 494 | + let chan_upd = create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 0).0.contents; |
| 495 | + |
| 496 | + let amt_msat = 5000; |
| 497 | + let (_, payment_hash, payment_secret) = get_payment_preimage_hash(&nodes[2], Some(amt_msat), None); |
| 498 | + let intermediate_nodes = vec![(nodes[1].node.get_our_node_id(), ForwardTlvs { |
| 499 | + short_channel_id: chan_upd.short_channel_id, |
| 500 | + payment_relay: PaymentRelay { |
| 501 | + cltv_expiry_delta: chan_upd.cltv_expiry_delta, |
| 502 | + fee_proportional_millionths: chan_upd.fee_proportional_millionths, |
| 503 | + fee_base_msat: chan_upd.fee_base_msat, |
| 504 | + }, |
| 505 | + payment_constraints: PaymentConstraints { |
| 506 | + max_cltv_expiry: u32::max_value(), |
| 507 | + htlc_minimum_msat: chan_upd.htlc_minimum_msat, |
| 508 | + }, |
| 509 | + features: BlindedHopFeatures::empty(), |
| 510 | + })]; |
| 511 | + let payee_tlvs = ReceiveTlvs { |
| 512 | + payment_secret, |
| 513 | + payment_constraints: PaymentConstraints { |
| 514 | + max_cltv_expiry: u32::max_value(), |
| 515 | + htlc_minimum_msat: chan_upd.htlc_minimum_msat, |
| 516 | + }, |
| 517 | + }; |
| 518 | + let mut secp_ctx = Secp256k1::new(); |
| 519 | + let mut blinded_path = BlindedPath::new_for_payment( |
| 520 | + &intermediate_nodes[..], nodes[2].node.get_our_node_id(), payee_tlvs, |
| 521 | + chan_upd.htlc_maximum_msat, &chanmon_cfgs[2].keys_manager, &secp_ctx |
| 522 | + ).unwrap(); |
| 523 | + blinded_path.1.blinded_hops[0] = BlindedHop { |
| 524 | + blinded_node_id: blinded_path.1.blinded_hops[0].blinded_node_id, |
| 525 | + encrypted_payload: vec![0; 32], // Bogus intro node payload |
| 526 | + }; |
| 527 | + |
| 528 | + let route_params = RouteParameters { |
| 529 | + payment_params: PaymentParameters::blinded(vec![blinded_path]), |
| 530 | + final_value_msat: amt_msat |
| 531 | + }; |
| 532 | + nodes[0].node.send_payment(payment_hash, RecipientOnionFields::spontaneous_empty(), |
| 533 | + PaymentId(payment_hash.0), route_params, Retry::Attempts(0)).unwrap(); |
| 534 | + check_added_monitors(&nodes[0], 1); |
| 535 | + let (update_add, commitment_signed) = { |
| 536 | + let mut events = nodes[0].node.get_and_clear_pending_msg_events(); |
| 537 | + assert_eq!(events.len(), 1); |
| 538 | + let payment_ev = SendEvent::from_event(events.pop().unwrap()); |
| 539 | + (payment_ev.msgs[0].clone(), payment_ev.commitment_msg.clone()) |
| 540 | + }; |
| 541 | + nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &update_add); |
| 542 | + do_commitment_signed_dance(&nodes[1], &nodes[0], &commitment_signed, false, true); |
| 543 | + let (update_fail, commitment_signed) = { |
| 544 | + let events = nodes[1].node.get_and_clear_pending_msg_events(); |
| 545 | + assert_eq!(events.len(), 1); |
| 546 | + match &events[0] { |
| 547 | + MessageSendEvent::UpdateHTLCs { updates, .. } => { |
| 548 | + (updates.update_fail_htlcs[0].clone(), updates.commitment_signed.clone()) |
| 549 | + }, |
| 550 | + _ => panic!() |
| 551 | + } |
| 552 | + }; |
| 553 | + nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &update_fail); |
| 554 | + do_commitment_signed_dance(&nodes[0], &nodes[1], &commitment_signed, false, true); |
| 555 | + expect_payment_failed_conditions(&nodes[0], payment_hash, false, |
| 556 | + PaymentFailedConditions::new().expected_htlc_error_data(INVALID_ONION_BLINDING, &[0; 32])); |
| 557 | +} |
0 commit comments