@@ -22,11 +22,12 @@ use bitcoin::blockdata::transaction::Transaction;
2222use bitcoin::blockdata::constants::{genesis_block, ChainHash};
2323use bitcoin::network::constants::Network;
2424
25- use bitcoin::hashes::Hash;
25+ use bitcoin::hashes::{Hash, HashEngine};
26+ use bitcoin::hashes::hmac::{Hmac, HmacEngine};
2627use bitcoin::hashes::sha256::Hash as Sha256;
2728use bitcoin::hash_types::{BlockHash, Txid};
2829
29- use bitcoin::secp256k1::{SecretKey, PublicKey};
30+ use bitcoin::secp256k1::{PublicKey, Scalar, SecretKey };
3031use bitcoin::secp256k1::Secp256k1;
3132use bitcoin::{LockTime, secp256k1, Sequence};
3233
@@ -49,7 +50,7 @@ use crate::routing::router::{BlindedTail, DefaultRouter, InFlightHtlcs, Path, Pa
4950use crate::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters};
5051use crate::ln::msgs;
5152use crate::ln::onion_utils;
52- use crate::ln::onion_utils::HTLCFailReason;
53+ use crate::ln::onion_utils::{ HTLCFailReason, INVALID_ONION_BLINDING} ;
5354use crate::ln::msgs::{ChannelMessageHandler, DecodeError, LightningError};
5455#[cfg(test)]
5556use crate::ln::outbound_payment;
@@ -2763,13 +2764,26 @@ where
27632764 payment_data, keysend_preimage, custom_tlvs, amt_msat, outgoing_cltv_value, payment_metadata, ..
27642765 } =>
27652766 (payment_data, keysend_preimage, custom_tlvs, amt_msat, outgoing_cltv_value, payment_metadata),
2766- msgs::InboundOnionPayload::Forward { .. } =>
2767+ msgs::InboundOnionPayload::BlindedReceive {
2768+ amt_msat, total_msat, outgoing_cltv_value, payment_secret, ..
2769+ } => {
2770+ let payment_data = msgs::FinalOnionHopData { payment_secret, total_msat };
2771+ (Some(payment_data), None, Vec::new(), amt_msat, outgoing_cltv_value, None)
2772+ }
2773+ msgs::InboundOnionPayload::Forward { .. } => {
27672774 return Err(InboundOnionErr {
27682775 err_code: 0x4000|22,
27692776 err_data: Vec::new(),
27702777 msg: "Got non final data with an HMAC of 0",
2771- }),
2772- _ => todo!()
2778+ })
2779+ },
2780+ msgs::InboundOnionPayload::BlindedForward { .. } => {
2781+ return Err(InboundOnionErr {
2782+ msg: "Got blinded non final data with an HMAC of 0",
2783+ err_code: INVALID_ONION_BLINDING,
2784+ err_data: vec![0; 32],
2785+ })
2786+ },
27732787 };
27742788 // final_incorrect_cltv_expiry
27752789 if outgoing_cltv_value > cltv_expiry {
@@ -2882,8 +2896,15 @@ where
28822896 return_malformed_err!("invalid ephemeral pubkey", 0x8000 | 0x4000 | 6);
28832897 }
28842898
2899+ let blinded_node_id_tweak = msg.blinding_point.map(|bp| {
2900+ let blinded_tlvs_ss = self.node_signer.ecdh(
2901+ Recipient::Node, &bp, None).unwrap().secret_bytes();
2902+ let mut hmac = HmacEngine::<Sha256>::new(b"blinded_node_id");
2903+ hmac.input(blinded_tlvs_ss.as_ref());
2904+ Scalar::from_be_bytes(Hmac::from_engine(hmac).into_inner()).unwrap()
2905+ });
28852906 let shared_secret = self.node_signer.ecdh(
2886- Recipient::Node, &msg.onion_routing_packet.public_key.unwrap(), None
2907+ Recipient::Node, &msg.onion_routing_packet.public_key.unwrap(), blinded_node_id_tweak.as_ref()
28872908 ).unwrap().secret_bytes();
28882909
28892910 if msg.onion_routing_packet.version != 0 {
0 commit comments