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<u8>) }
- pub(super) hop_data: Vec<u8>,
- pub(super) hmac: [u8; 32],
+ pub hop_data: Vec<u8>,
+ /// HMAC to verify the integrity of hop_data
+ pub hmac: [u8; 32],
}
impl onion_utils::Packet for Packet {
}
/// When reading a packet off the wire, we don't know a priori whether the packet is to be forwarded
-/// or received. Thus we read a ControlTlvs rather than reading a ForwardControlTlvs or
-/// ReceiveControlTlvs directly.
+/// or received. Thus we read a `ControlTlvs` rather than reading a [`ForwardTlvs`] or
+/// [`ReceiveTlvs`] directly. Also useful on the encoding side to keep forward and receive TLVs in
+/// the same iterator.
pub(crate) enum ControlTlvs {
/// This onion message is intended to be forwarded.
Forward(ForwardTlvs),
Ok(payload_fmt)
}
}
+
+impl Writeable for ControlTlvs {
+ fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
+ match self {
+ Self::Forward(tlvs) => tlvs.write(w),
+ Self::Receive(tlvs) => tlvs.write(w),
+ }
+ }
+}