|
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;
|
@@ -674,3 +674,76 @@ fn do_outbound_checks_failure(intro_node_fails: bool) {
|
674 | 674 | expect_payment_failed_conditions(&nodes[0], payment_hash, false,
|
675 | 675 | PaymentFailedConditions::new().expected_htlc_error_data(INVALID_ONION_BLINDING, &[0; 32]));
|
676 | 676 | }
|
| 677 | + |
| 678 | +#[test] |
| 679 | +fn invalid_intro_node_payload() { |
| 680 | + // Ensure we fail back properly if the intro node's onion payload is bogus. |
| 681 | + let chanmon_cfgs = create_chanmon_cfgs(3); |
| 682 | + let node_cfgs = create_node_cfgs(3, &chanmon_cfgs); |
| 683 | + let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]); |
| 684 | + let nodes = create_network(3, &node_cfgs, &node_chanmgrs); |
| 685 | + create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1_000_000, 0); |
| 686 | + let chan_upd = create_announced_chan_between_nodes_with_value(&nodes, 1, 2, 1_000_000, 0).0.contents; |
| 687 | + |
| 688 | + let amt_msat = 5000; |
| 689 | + let (_, payment_hash, payment_secret) = get_payment_preimage_hash(&nodes[2], Some(amt_msat), None); |
| 690 | + let intermediate_nodes = vec![(nodes[1].node.get_our_node_id(), ForwardTlvs { |
| 691 | + short_channel_id: chan_upd.short_channel_id, |
| 692 | + payment_relay: PaymentRelay { |
| 693 | + cltv_expiry_delta: chan_upd.cltv_expiry_delta, |
| 694 | + fee_proportional_millionths: chan_upd.fee_proportional_millionths, |
| 695 | + fee_base_msat: chan_upd.fee_base_msat, |
| 696 | + }, |
| 697 | + payment_constraints: PaymentConstraints { |
| 698 | + max_cltv_expiry: u32::max_value(), |
| 699 | + htlc_minimum_msat: chan_upd.htlc_minimum_msat, |
| 700 | + }, |
| 701 | + features: BlindedHopFeatures::empty(), |
| 702 | + })]; |
| 703 | + let payee_tlvs = ReceiveTlvs { |
| 704 | + payment_secret, |
| 705 | + payment_constraints: PaymentConstraints { |
| 706 | + max_cltv_expiry: u32::max_value(), |
| 707 | + htlc_minimum_msat: chan_upd.htlc_minimum_msat, |
| 708 | + }, |
| 709 | + }; |
| 710 | + let mut secp_ctx = Secp256k1::new(); |
| 711 | + let mut blinded_path = BlindedPath::new_for_payment( |
| 712 | + &intermediate_nodes[..], nodes[2].node.get_our_node_id(), payee_tlvs, |
| 713 | + chan_upd.htlc_maximum_msat, &chanmon_cfgs[2].keys_manager, &secp_ctx |
| 714 | + ).unwrap(); |
| 715 | + blinded_path.1.blinded_hops[0] = BlindedHop { |
| 716 | + blinded_node_id: blinded_path.1.blinded_hops[0].blinded_node_id, |
| 717 | + encrypted_payload: vec![0; 32], // Bogus intro node payload |
| 718 | + }; |
| 719 | + |
| 720 | + let route_params = RouteParameters { |
| 721 | + payment_params: PaymentParameters::blinded(vec![blinded_path]), |
| 722 | + final_value_msat: amt_msat |
| 723 | + }; |
| 724 | + nodes[0].node.send_payment(payment_hash, RecipientOnionFields::spontaneous_empty(), |
| 725 | + PaymentId(payment_hash.0), route_params, Retry::Attempts(0)).unwrap(); |
| 726 | + check_added_monitors(&nodes[0], 1); |
| 727 | + let (update_add, commitment_signed) = { |
| 728 | + let mut events = nodes[0].node.get_and_clear_pending_msg_events(); |
| 729 | + assert_eq!(events.len(), 1); |
| 730 | + let payment_ev = SendEvent::from_event(events.pop().unwrap()); |
| 731 | + (payment_ev.msgs[0].clone(), payment_ev.commitment_msg.clone()) |
| 732 | + }; |
| 733 | + nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &update_add); |
| 734 | + do_commitment_signed_dance(&nodes[1], &nodes[0], &commitment_signed, false, true); |
| 735 | + let (update_fail, commitment_signed) = { |
| 736 | + let events = nodes[1].node.get_and_clear_pending_msg_events(); |
| 737 | + assert_eq!(events.len(), 1); |
| 738 | + match &events[0] { |
| 739 | + MessageSendEvent::UpdateHTLCs { updates, .. } => { |
| 740 | + (updates.update_fail_htlcs[0].clone(), updates.commitment_signed.clone()) |
| 741 | + }, |
| 742 | + _ => panic!() |
| 743 | + } |
| 744 | + }; |
| 745 | + nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &update_fail); |
| 746 | + do_commitment_signed_dance(&nodes[0], &nodes[1], &commitment_signed, false, true); |
| 747 | + expect_payment_failed_conditions(&nodes[0], payment_hash, false, |
| 748 | + PaymentFailedConditions::new().expected_htlc_error_data(INVALID_ONION_BLINDING, &[0; 32])); |
| 749 | +} |
0 commit comments