X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;ds=sidebyside;f=lightning%2Fsrc%2Fblinded_path%2Futils.rs;h=7e43f31453637a6fdea2309d4713f2b34567693f;hb=3a9fe209e104e048921ad50be77a80b18a98b45c;hp=1ac6519452c1eb10af3757240d41a046d381efaa;hpb=7c1726b585af71897e15dcb83024d5cab55d4fcd;p=rust-lightning diff --git a/lightning/src/blinded_path/utils.rs b/lightning/src/blinded_path/utils.rs index 1ac65194..7e43f314 100644 --- a/lightning/src/blinded_path/utils.rs +++ b/lightning/src/blinded_path/utils.rs @@ -15,14 +15,16 @@ use bitcoin::hashes::sha256::Hash as Sha256; use bitcoin::secp256k1::{self, PublicKey, Secp256k1, SecretKey, Scalar}; use bitcoin::secp256k1::ecdh::SharedSecret; -use super::BlindedPath; +use super::{BlindedHop, BlindedPath}; use crate::ln::msgs::DecodeError; use crate::ln::onion_utils; -use crate::onion_message::Destination; -use crate::util::chacha20poly1305rfc::ChaChaPolyWriteAdapter; -use crate::util::ser::{Readable, VecWriter, Writeable}; +use crate::onion_message::messenger::Destination; +use crate::crypto::streams::ChaChaPolyWriteAdapter; +use crate::util::ser::{Readable, Writeable}; use crate::io; + +#[allow(unused_imports)] use crate::prelude::*; // TODO: DRY with onion_utils::construct_onion_keys_callback @@ -49,7 +51,7 @@ where let hop_pk_blinding_factor = { let mut hmac = HmacEngine::::new(b"blinded_node_id"); hmac.input(encrypted_data_ss.as_ref()); - Hmac::from_engine(hmac).into_inner() + Hmac::from_engine(hmac).to_byte_array() }; $pk.mul_tweak(secp_ctx, &Scalar::from_be_bytes(hop_pk_blinding_factor).unwrap())? }; @@ -70,7 +72,7 @@ where let mut sha = Sha256::engine(); sha.input(&msg_blinding_point.serialize()[..]); sha.input(encrypted_data_ss.as_ref()); - Sha256::from_engine(sha).into_inner() + Sha256::from_engine(sha).to_byte_array() }; msg_blinding_point_priv = msg_blinding_point_priv.mul_tweak(&Scalar::from_be_bytes(msg_blinding_point_blinding_factor).unwrap())?; @@ -80,7 +82,7 @@ where let mut sha = Sha256::engine(); sha.input(&onion_packet_pubkey.serialize()[..]); sha.input(onion_packet_ss.as_ref()); - Sha256::from_engine(sha).into_inner() + Sha256::from_engine(sha).to_byte_array() }; onion_packet_pubkey_priv = onion_packet_pubkey_priv.mul_tweak(&Scalar::from_be_bytes(onion_packet_pubkey_blinding_factor).unwrap())?; onion_packet_pubkey = PublicKey::from_secret_key(secp_ctx, &onion_packet_pubkey_priv); @@ -105,12 +107,32 @@ where Ok(()) } +// Panics if `unblinded_tlvs` length is less than `unblinded_pks` length +pub(super) fn construct_blinded_hops<'a, T, I1, I2>( + secp_ctx: &Secp256k1, unblinded_pks: I1, mut unblinded_tlvs: I2, session_priv: &SecretKey +) -> Result, secp256k1::Error> +where + T: secp256k1::Signing + secp256k1::Verification, + I1: Iterator, + I2: Iterator, + I2::Item: Writeable +{ + let mut blinded_hops = Vec::with_capacity(unblinded_pks.size_hint().0); + construct_keys_callback( + secp_ctx, unblinded_pks, None, session_priv, + |blinded_node_id, _, _, encrypted_payload_rho, _, _| { + blinded_hops.push(BlindedHop { + blinded_node_id, + encrypted_payload: encrypt_payload(unblinded_tlvs.next().unwrap(), encrypted_payload_rho), + }); + })?; + Ok(blinded_hops) +} + /// Encrypt TLV payload to be used as a [`crate::blinded_path::BlindedHop::encrypted_payload`]. -pub(super) fn encrypt_payload(payload: P, encrypted_tlvs_ss: [u8; 32]) -> Vec { - let mut writer = VecWriter(Vec::new()); - let write_adapter = ChaChaPolyWriteAdapter::new(encrypted_tlvs_ss, &payload); - write_adapter.write(&mut writer).expect("In-memory writes cannot fail"); - writer.0 +fn encrypt_payload(payload: P, encrypted_tlvs_rho: [u8; 32]) -> Vec { + let write_adapter = ChaChaPolyWriteAdapter::new(encrypted_tlvs_rho, &payload); + write_adapter.encode() } /// Blinded path encrypted payloads may be padded to ensure they are equal length.