X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fonion_message%2Fpacket.rs;h=d19bd30edd212be4b19286d5ef5f0bf0f1870a8f;hb=ce7463486ee1ae61e9af439c3d34d00244248ee9;hp=8a5628f164ca358dd8df1d7aec5e58730247c67e;hpb=7a63ab77da7e0be35b1c5d87643e5461cd593b94;p=rust-lightning diff --git a/lightning/src/onion_message/packet.rs b/lightning/src/onion_message/packet.rs index 8a5628f1..d19bd30e 100644 --- a/lightning/src/onion_message/packet.rs +++ b/lightning/src/onion_message/packet.rs @@ -12,7 +12,9 @@ use bitcoin::secp256k1::PublicKey; use bitcoin::secp256k1::ecdh::SharedSecret; -use crate::blinded_path::{BlindedPath, ForwardTlvs, ReceiveTlvs}; +use crate::blinded_path::BlindedPath; +use crate::blinded_path::message::{ForwardTlvs, ReceiveTlvs}; +use crate::blinded_path::utils::Padding; use crate::ln::msgs::DecodeError; use crate::ln::onion_utils; use super::messenger::CustomOnionMessageHandler; @@ -30,16 +32,22 @@ use crate::prelude::*; pub(super) const SMALL_PACKET_HOP_DATA_LEN: usize = 1300; pub(super) const BIG_PACKET_HOP_DATA_LEN: usize = 32768; +/// Packet of hop data for next peer #[derive(Clone, Debug, PartialEq, Eq)] -pub(crate) struct Packet { - pub(super) version: u8, - pub(super) public_key: PublicKey, +pub struct Packet { + /// Bolt 04 version number + pub version: u8, + /// A random sepc256k1 point, used to build the ECDH shared secret to decrypt hop_data + pub public_key: PublicKey, + /// Encrypted payload for the next hop + // // Unlike the onion packets used for payments, onion message packets can have payloads greater // than 1300 bytes. // TODO: if 1300 ends up being the most common size, optimize this to be: // enum { ThirteenHundred([u8; 1300]), VarLen(Vec) } - pub(super) hop_data: Vec, - pub(super) hmac: [u8; 32], + pub hop_data: Vec, + /// HMAC to verify the integrity of hop_data + pub hmac: [u8; 32], } impl onion_utils::Packet for Packet { @@ -151,7 +159,8 @@ pub(super) enum ForwardControlTlvs { Blinded(Vec), /// If we're constructing an onion message hop through an intermediate unblinded node, we'll need /// to construct the intermediate hop's control TLVs in their unblinded state to avoid encoding - /// them into an intermediate Vec. See [`crate::blinded_path::ForwardTlvs`] for more info. + /// them into an intermediate Vec. See [`crate::blinded_path::message::ForwardTlvs`] for more + /// info. Unblinded(ForwardTlvs), } @@ -159,7 +168,7 @@ pub(super) enum ForwardControlTlvs { pub(super) enum ReceiveControlTlvs { /// See [`ForwardControlTlvs::Blinded`]. Blinded(Vec), - /// See [`ForwardControlTlvs::Unblinded`] and [`crate::blinded_path::ReceiveTlvs`]. + /// See [`ForwardControlTlvs::Unblinded`] and [`crate::blinded_path::message::ReceiveTlvs`]. Unblinded(ReceiveTlvs), } @@ -261,8 +270,9 @@ ReadableArgs<(SharedSecret, &H, &L)> for Payload<(mut r: &mut R) -> Result { - let mut _padding: Option = None; - let mut _short_channel_id: Option = None; - let mut next_node_id: Option = None; - let mut path_id: Option<[u8; 32]> = None; - let mut next_blinding_override: Option = None; - decode_tlv_stream!(&mut r, { + fn read(r: &mut R) -> Result { + _init_and_read_tlv_stream!(r, { (1, _padding, option), (2, _short_channel_id, option), (4, next_node_id, option), (6, path_id, option), (8, next_blinding_override, option), }); + let _padding: Option = _padding; + let _short_channel_id: Option = _short_channel_id; let valid_fwd_fmt = next_node_id.is_some() && path_id.is_none(); let valid_recv_fmt = next_node_id.is_none() && next_blinding_override.is_none(); @@ -305,15 +312,11 @@ impl Readable for ControlTlvs { } } -/// Reads padding to the end, ignoring what's read. -pub(crate) struct Padding {} -impl Readable for Padding { - #[inline] - fn read(reader: &mut R) -> Result { - loop { - let mut buf = [0; 8192]; - if reader.read(&mut buf[..])? == 0 { break; } +impl Writeable for ControlTlvs { + fn write(&self, w: &mut W) -> Result<(), io::Error> { + match self { + Self::Forward(tlvs) => tlvs.write(w), + Self::Receive(tlvs) => tlvs.write(w), } - Ok(Self {}) } }