X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fonion_message%2Fpacket.rs;h=8a5628f164ca358dd8df1d7aec5e58730247c67e;hb=4fb5708eec5a0683039c7877a0b3d452e21735c9;hp=d4f08109cd9858e0b62c88fbaffe59249b07efee;hpb=7533a3c42fea0ba08494b617a4f872dd04ef7f1e;p=rust-lightning diff --git a/lightning/src/onion_message/packet.rs b/lightning/src/onion_message/packet.rs index d4f08109..8a5628f1 100644 --- a/lightning/src/onion_message/packet.rs +++ b/lightning/src/onion_message/packet.rs @@ -16,6 +16,7 @@ use crate::blinded_path::{BlindedPath, ForwardTlvs, ReceiveTlvs}; use crate::ln::msgs::DecodeError; use crate::ln::onion_utils; use super::messenger::CustomOnionMessageHandler; +use super::offers::OffersMessage; use crate::util::chacha20poly1305rfc::{ChaChaPolyReadAdapter, ChaChaPolyWriteAdapter}; use crate::util::logger::Logger; use crate::util::ser::{BigSize, FixedLengthReader, LengthRead, LengthReadable, LengthReadableArgs, Readable, ReadableArgs, Writeable, Writer}; @@ -109,10 +110,8 @@ pub(super) enum Payload { /// The contents of an onion message. In the context of offers, this would be the invoice, invoice /// request, or invoice error. pub enum OnionMessageContents { - // Coming soon: - // Invoice, - // InvoiceRequest, - // InvoiceError, + /// A message related to BOLT 12 Offers. + Offers(OffersMessage), /// A custom onion message specified by the user. Custom(T), } @@ -123,6 +122,7 @@ impl OnionMessageContents { /// This is not exported to bindings users as methods on non-cloneable enums are not currently exportable pub fn tlv_type(&self) -> u64 { match self { + &OnionMessageContents::Offers(ref msg) => msg.tlv_type(), &OnionMessageContents::Custom(ref msg) => msg.tlv_type(), } } @@ -132,6 +132,7 @@ impl OnionMessageContents { impl Writeable for OnionMessageContents { 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)?), } } @@ -168,7 +169,7 @@ impl Writeable for (Payload, [u8; 32]) { match &self.0 { Payload::Forward(ForwardControlTlvs::Blinded(encrypted_bytes)) => { _encode_varint_length_prefixed_tlv!(w, { - (4, *encrypted_bytes, vec_type) + (4, *encrypted_bytes, required_vec) }) }, Payload::Receive { @@ -176,7 +177,7 @@ impl Writeable for (Payload, [u8; 32]) { } => { _encode_varint_length_prefixed_tlv!(w, { (2, reply_path, option), - (4, *encrypted_bytes, vec_type), + (4, *encrypted_bytes, required_vec), (message.tlv_type(), message, required) }) }, @@ -202,10 +203,10 @@ impl Writeable for (Payload, [u8; 32]) { } // Uses the provided secret to simultaneously decode and decrypt the control TLVs and data TLV. -impl +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; + let (encrypted_tlvs_ss, handler, logger) = args; let v: BigSize = Readable::read(r)?; let mut rd = FixedLengthReader::new(r, v.0); @@ -223,13 +224,19 @@ ReadableArgs<(SharedSecret, &H, &L)> for Payload< { - message = Some(msg); + match msg_type { + tlv_type if OffersMessage::is_known_type(tlv_type) => { + let msg = OffersMessage::read(msg_reader, (tlv_type, logger))?; + message = Some(OnionMessageContents::Offers(msg)); Ok(true) }, - Ok(None) => Ok(false), - Err(e) => Err(e), + _ => match handler.read_custom_message(msg_type, msg_reader)? { + Some(msg) => { + message = Some(OnionMessageContents::Custom(msg)); + Ok(true) + }, + None => Ok(false), + }, } }); rd.eat_remaining().map_err(|_| DecodeError::ShortRead)?; @@ -243,13 +250,12 @@ ReadableArgs<(SharedSecret, &H, &L)> for Payload< { - if message.is_none() { return Err(DecodeError::InvalidValue) } Ok(Payload::Receive { control_tlvs: ReceiveControlTlvs::Unblinded(tlvs), reply_path, - message: OnionMessageContents::Custom(message.unwrap()), + message: message.ok_or(DecodeError::InvalidValue)?, }) - } + }, } } }