X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fonion_message%2Fpacket.rs;h=5ce02c54d08800b777a0c2c3a25f27ba1ffae462;hb=ffc24c3af9a274557434a64f74ad72f338c78419;hp=a76371b39eb9fa12769e2144fb6cdd02067b70f7;hpb=bbe20c3327d3af37a7d5f82a021af1945d689547;p=rust-lightning diff --git a/lightning/src/onion_message/packet.rs b/lightning/src/onion_message/packet.rs index a76371b3..5ce02c54 100644 --- a/lightning/src/onion_message/packet.rs +++ b/lightning/src/onion_message/packet.rs @@ -32,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; -#[derive(Clone, Debug, PartialEq, Eq)] -pub(crate) struct Packet { - pub(super) version: u8, - pub(super) public_key: PublicKey, +/// Packet of hop data for next peer +#[derive(Clone, Debug, Hash, PartialEq, Eq)] +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 { @@ -97,51 +103,51 @@ impl LengthReadable for Packet { /// Onion message payloads contain "control" TLVs and "data" TLVs. Control TLVs are used to route /// the onion message from hop to hop and for path verification, whereas data TLVs contain the onion /// message content itself, such as an invoice request. -pub(super) enum Payload { +pub(super) enum Payload { /// This payload is for an intermediate hop. Forward(ForwardControlTlvs), /// This payload is for the final hop. Receive { control_tlvs: ReceiveControlTlvs, reply_path: Option, - message: OnionMessageContents, + message: T, } } +/// The contents of an [`OnionMessage`] as read from the wire. +/// +/// [`OnionMessage`]: crate::ln::msgs::OnionMessage #[derive(Debug)] -/// The contents of an onion message. In the context of offers, this would be the invoice, invoice -/// request, or invoice error. -pub enum OnionMessageContents { +pub enum ParsedOnionMessageContents { /// A message related to BOLT 12 Offers. Offers(OffersMessage), /// A custom onion message specified by the user. Custom(T), } -impl OnionMessageContents { +impl OnionMessageContents for ParsedOnionMessageContents { /// Returns the type that was used to decode the message payload. /// /// This is not exported to bindings users as methods on non-cloneable enums are not currently exportable - pub fn tlv_type(&self) -> u64 { + fn tlv_type(&self) -> u64 { match self { - &OnionMessageContents::Offers(ref msg) => msg.tlv_type(), - &OnionMessageContents::Custom(ref msg) => msg.tlv_type(), + &ParsedOnionMessageContents::Offers(ref msg) => msg.tlv_type(), + &ParsedOnionMessageContents::Custom(ref msg) => msg.tlv_type(), } } } -/// This is not exported to bindings users as methods on non-cloneable enums are not currently exportable -impl Writeable for OnionMessageContents { +impl Writeable for ParsedOnionMessageContents { fn write(&self, w: &mut W) -> Result<(), io::Error> { match self { - OnionMessageContents::Offers(msg) => Ok(msg.write(w)?), - OnionMessageContents::Custom(msg) => Ok(msg.write(w)?), + ParsedOnionMessageContents::Offers(msg) => Ok(msg.write(w)?), + ParsedOnionMessageContents::Custom(msg) => Ok(msg.write(w)?), } } } -/// The contents of a custom onion message. -pub trait CustomOnionMessageContents: Writeable { +/// The contents of an onion message. +pub trait OnionMessageContents: Writeable + core::fmt::Debug { /// Returns the TLV type identifying the message contents. MUST be >= 64. fn tlv_type(&self) -> u64; } @@ -167,7 +173,7 @@ pub(super) enum ReceiveControlTlvs { } // Uses the provided secret to simultaneously encode and encrypt the unblinded control TLVs. -impl Writeable for (Payload, [u8; 32]) { +impl Writeable for (Payload, [u8; 32]) { fn write(&self, w: &mut W) -> Result<(), io::Error> { match &self.0 { Payload::Forward(ForwardControlTlvs::Blinded(encrypted_bytes)) => { @@ -206,8 +212,8 @@ impl Writeable for (Payload, [u8; 32]) { } // Uses the provided secret to simultaneously decode and decrypt the control TLVs and data TLV. -impl -ReadableArgs<(SharedSecret, &H, &L)> for Payload<::CustomMessage> { +impl ReadableArgs<(SharedSecret, &H, &L)> +for Payload::CustomMessage>> { fn read(r: &mut R, args: (SharedSecret, &H, &L)) -> Result { let (encrypted_tlvs_ss, handler, logger) = args; @@ -230,12 +236,12 @@ ReadableArgs<(SharedSecret, &H, &L)> for Payload< { let msg = OffersMessage::read(msg_reader, (tlv_type, logger))?; - message = Some(OnionMessageContents::Offers(msg)); + message = Some(ParsedOnionMessageContents::Offers(msg)); Ok(true) }, _ => match handler.read_custom_message(msg_type, msg_reader)? { Some(msg) => { - message = Some(OnionMessageContents::Custom(msg)); + message = Some(ParsedOnionMessageContents::Custom(msg)); Ok(true) }, None => Ok(false),