X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fblinded_path%2Fmod.rs;h=c52df1651fe3a5b3a8aaf137113881a31478147f;hb=b20b1dbe678d12480f79c736b37ab10ab79a9b06;hp=a4128d6a39d8876bd90e1377d8c23c635584a651;hpb=efed905a4f90a3ca86b08cd6fb111e7c790ce20d;p=rust-lightning diff --git a/lightning/src/blinded_path/mod.rs b/lightning/src/blinded_path/mod.rs index a4128d6a..c52df165 100644 --- a/lightning/src/blinded_path/mod.rs +++ b/lightning/src/blinded_path/mod.rs @@ -11,11 +11,9 @@ pub(crate) mod utils; -use bitcoin::hashes::{Hash, HashEngine}; -use bitcoin::hashes::sha256::Hash as Sha256; -use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey}; +use bitcoin::secp256k1::{self, PublicKey, Secp256k1, SecretKey}; -use crate::chain::keysinterface::{EntropySource, NodeSigner, Recipient}; +use crate::sign::{EntropySource, NodeSigner, Recipient}; use crate::onion_message::ControlTlvs; use crate::ln::msgs::DecodeError; use crate::ln::onion_utils; @@ -27,44 +25,44 @@ use core::ops::Deref; use crate::io::{self, Cursor}; use crate::prelude::*; -/// Onion messages can be sent and received to blinded paths, which serve to hide the identity of -/// the recipient. -#[derive(Clone, Debug, PartialEq)] +/// Onion messages and payments can be sent and received to blinded paths, which serve to hide the +/// identity of the recipient. +#[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct BlindedPath { /// To send to a blinded path, the sender first finds a route to the unblinded /// `introduction_node_id`, which can unblind its [`encrypted_payload`] to find out the onion - /// message's next hop and forward it along. + /// message or payment's next hop and forward it along. /// /// [`encrypted_payload`]: BlindedHop::encrypted_payload - pub(crate) introduction_node_id: PublicKey, + pub introduction_node_id: PublicKey, /// Used by the introduction node to decrypt its [`encrypted_payload`] to forward the onion - /// message. + /// message or payment. /// /// [`encrypted_payload`]: BlindedHop::encrypted_payload - pub(crate) blinding_point: PublicKey, + pub blinding_point: PublicKey, /// The hops composing the blinded path. - pub(crate) blinded_hops: Vec, + pub blinded_hops: Vec, } /// Used to construct the blinded hops portion of a blinded path. These hops cannot be identified /// by outside observers and thus can be used to hide the identity of the recipient. -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct BlindedHop { /// The blinded node id of this hop in a blinded path. - pub(crate) blinded_node_id: PublicKey, + pub blinded_node_id: PublicKey, /// The encrypted payload intended for this hop in a blinded path. // The node sending to this blinded path will later encode this payload into the onion packet for // this hop. - pub(crate) encrypted_payload: Vec, + pub encrypted_payload: Vec, } impl BlindedPath { - /// Create a blinded path to be forwarded along `node_pks`. The last node pubkey in `node_pks` - /// will be the destination node. + /// Create a blinded path for an onion message, to be forwarded along `node_pks`. The last node + /// pubkey in `node_pks` will be the destination node. /// /// Errors if less than two hops are provided or if `node_pk`(s) are invalid. // TODO: make all payloads the same size with padding + add dummy hops - pub fn new + pub fn new_for_message (node_pks: &[PublicKey], entropy_source: &ES, secp_ctx: &Secp256k1) -> Result { if node_pks.len() < 2 { return Err(()) } @@ -75,12 +73,13 @@ impl BlindedPath { Ok(BlindedPath { introduction_node_id, blinding_point: PublicKey::from_secret_key(secp_ctx, &blinding_secret), - blinded_hops: blinded_hops(secp_ctx, node_pks, &blinding_secret).map_err(|_| ())?, + blinded_hops: blinded_message_hops(secp_ctx, node_pks, &blinding_secret).map_err(|_| ())?, }) } - // Advance the blinded path by one hop, so make the second hop into the new introduction node. - pub(super) fn advance_by_one + // Advance the blinded onion message path by one hop, so make the second hop into the new + // introduction node. + pub(super) fn advance_message_path_by_one (&mut self, node_signer: &NS, secp_ctx: &Secp256k1) -> Result<(), ()> where NS::Target: NodeSigner { @@ -96,14 +95,8 @@ impl BlindedPath { let mut new_blinding_point = match next_blinding_override { Some(blinding_point) => blinding_point, None => { - let blinding_factor = { - let mut sha = Sha256::engine(); - sha.input(&self.blinding_point.serialize()[..]); - sha.input(control_tlvs_ss.as_ref()); - Sha256::from_engine(sha).into_inner() - }; - self.blinding_point.mul_tweak(secp_ctx, &Scalar::from_be_bytes(blinding_factor).unwrap()) - .map_err(|_| ())? + onion_utils::next_hop_pubkey(secp_ctx, self.blinding_point, + control_tlvs_ss.as_ref()).map_err(|_| ())? } }; mem::swap(&mut self.blinding_point, &mut new_blinding_point); @@ -115,8 +108,8 @@ impl BlindedPath { } } -/// Construct blinded hops for the given `unblinded_path`. -fn blinded_hops( +/// Construct blinded onion message hops for the given `unblinded_path`. +fn blinded_message_hops( secp_ctx: &Secp256k1, unblinded_path: &[PublicKey], session_priv: &SecretKey ) -> Result, secp256k1::Error> { let mut blinded_hops = Vec::with_capacity(unblinded_path.len());