X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Fmsgs.rs;h=16f3d09fef0d7e9f1549154779d11cf488fec89a;hb=c08aa349f5d1e7c3935b402ee2046b077a294506;hp=136ed4d317b35bfdc43618a0109e7c3ed1a729a1;hpb=dfb250b976eb9ad9e93f0c3f543ad88b76924d42;p=rust-lightning diff --git a/lightning/src/ln/msgs.rs b/lightning/src/ln/msgs.rs index 136ed4d3..16f3d09f 100644 --- a/lightning/src/ln/msgs.rs +++ b/lightning/src/ln/msgs.rs @@ -32,7 +32,7 @@ use bitcoin::blockdata::script::ScriptBuf; use bitcoin::hash_types::Txid; use crate::blinded_path::payment::{BlindedPaymentTlvs, ForwardTlvs, ReceiveTlvs}; -use crate::ln::{ChannelId, PaymentPreimage, PaymentHash, PaymentSecret}; +use crate::ln::types::{ChannelId, PaymentPreimage, PaymentHash, PaymentSecret}; use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures}; use crate::ln::onion_utils; use crate::onion_message; @@ -55,7 +55,7 @@ use crate::io_extras::read_to_end; use crate::events::{EventsProvider, MessageSendEventsProvider}; use crate::crypto::streams::ChaChaPolyReadAdapter; use crate::util::logger; -use crate::util::ser::{LengthReadable, LengthReadableArgs, Readable, ReadableArgs, Writeable, Writer, WithoutLength, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname, TransactionU16LenLimited, BigSize}; +use crate::util::ser::{BigSize, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname, LengthRead, LengthReadable, LengthReadableArgs, Readable, ReadableArgs, TransactionU16LenLimited, WithoutLength, Writeable, Writer}; use crate::util::base32; use crate::routing::gossip::{NodeAlias, NodeId}; @@ -1678,7 +1678,7 @@ pub struct FinalOnionHopData { mod fuzzy_internal_msgs { use bitcoin::secp256k1::PublicKey; use crate::blinded_path::payment::{PaymentConstraints, PaymentContext, PaymentRelay}; - use crate::ln::{PaymentPreimage, PaymentSecret}; + use crate::ln::types::{PaymentPreimage, PaymentSecret}; use crate::ln::features::BlindedHopFeatures; use super::{FinalOnionHopData, TrampolineOnionPacket}; @@ -1723,7 +1723,7 @@ mod fuzzy_internal_msgs { } } - pub(crate) enum OutboundOnionPayload { + pub(crate) enum OutboundOnionPayload<'a> { Forward { short_channel_id: u64, /// The value, in msat, of the payment after this hop's fee is deducted. @@ -1739,24 +1739,24 @@ mod fuzzy_internal_msgs { }, Receive { payment_data: Option, - payment_metadata: Option>, + payment_metadata: Option<&'a Vec>, keysend_preimage: Option, - custom_tlvs: Vec<(u64, Vec)>, + custom_tlvs: &'a Vec<(u64, Vec)>, sender_intended_htlc_amt_msat: u64, cltv_expiry_height: u32, }, BlindedForward { - encrypted_tlvs: Vec, + encrypted_tlvs: &'a Vec, intro_node_blinding_point: Option, }, BlindedReceive { sender_intended_htlc_amt_msat: u64, total_msat: u64, cltv_expiry_height: u32, - encrypted_tlvs: Vec, + encrypted_tlvs: &'a Vec, intro_node_blinding_point: Option, // Set if the introduction node of the blinded path is the final node keysend_preimage: Option, - custom_tlvs: Vec<(u64, Vec)>, + custom_tlvs: &'a Vec<(u64, Vec)>, } } @@ -1857,6 +1857,26 @@ impl Writeable for TrampolineOnionPacket { } } +impl LengthReadable for TrampolineOnionPacket { + fn read(r: &mut R) -> Result { + let version = Readable::read(r)?; + let public_key = Readable::read(r)?; + + let hop_data_len = r.total_bytes().saturating_sub(66); // 1 (version) + 33 (pubkey) + 32 (HMAC) = 66 + let mut rd = FixedLengthReader::new(r, hop_data_len); + let hop_data = WithoutLength::>::read(&mut rd)?.0; + + let hmac = Readable::read(r)?; + + Ok(TrampolineOnionPacket { + version, + public_key, + hop_data, + hmac, + }) + } +} + impl Debug for TrampolineOnionPacket { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_fmt(format_args!("TrampolineOnionPacket version {} with hmac {:?}", self.version, &self.hmac[..])) @@ -2569,7 +2589,7 @@ impl Readable for FinalOnionHopData { } } -impl Writeable for OutboundOnionPayload { +impl<'a> Writeable for OutboundOnionPayload<'a> { fn write(&self, w: &mut W) -> Result<(), io::Error> { match self { Self::Forward { short_channel_id, amt_to_forward, outgoing_cltv_value } => { @@ -2604,12 +2624,12 @@ impl Writeable for OutboundOnionPayload { (2, HighZeroBytesDroppedBigSize(*sender_intended_htlc_amt_msat), required), (4, HighZeroBytesDroppedBigSize(*cltv_expiry_height), required), (8, payment_data, option), - (16, payment_metadata.as_ref().map(|m| WithoutLength(m)), option) + (16, payment_metadata.map(|m| WithoutLength(m)), option) }, custom_tlvs.iter()); }, Self::BlindedForward { encrypted_tlvs, intro_node_blinding_point } => { _encode_varint_length_prefixed_tlv!(w, { - (10, *encrypted_tlvs, required_vec), + (10, **encrypted_tlvs, required_vec), (12, intro_node_blinding_point, option) }); }, @@ -2626,7 +2646,7 @@ impl Writeable for OutboundOnionPayload { _encode_varint_length_prefixed_tlv!(w, { (2, HighZeroBytesDroppedBigSize(*sender_intended_htlc_amt_msat), required), (4, HighZeroBytesDroppedBigSize(*cltv_expiry_height), required), - (10, *encrypted_tlvs, required_vec), + (10, **encrypted_tlvs, required_vec), (12, intro_node_blinding_point, option), (18, HighZeroBytesDroppedBigSize(*total_msat), required) }, custom_tlvs.iter()); @@ -3176,13 +3196,12 @@ impl_writeable_msg!(GossipTimestampFilter, { mod tests { use bitcoin::{Transaction, TxIn, ScriptBuf, Sequence, Witness, TxOut}; use hex::DisplayHex; - use crate::ln::{PaymentPreimage, PaymentHash, PaymentSecret}; - use crate::ln::ChannelId; + use crate::ln::types::{ChannelId, PaymentPreimage, PaymentHash, PaymentSecret}; use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures}; use crate::ln::msgs::{self, FinalOnionHopData, OnionErrorPacket, CommonOpenChannelFields, CommonAcceptChannelFields, TrampolineOnionPacket}; use crate::ln::msgs::SocketAddress; use crate::routing::gossip::{NodeAlias, NodeId}; - use crate::util::ser::{BigSize, Hostname, Readable, ReadableArgs, TransactionU16LenLimited, Writeable}; + use crate::util::ser::{BigSize, FixedLengthReader, Hostname, LengthReadable, Readable, ReadableArgs, TransactionU16LenLimited, Writeable}; use crate::util::test_utils; use bitcoin::hashes::hex::FromHex; @@ -4360,7 +4379,7 @@ mod tests { keysend_preimage: None, sender_intended_htlc_amt_msat: 0x0badf00d01020304, cltv_expiry_height: 0xffffffff, - custom_tlvs: vec![], + custom_tlvs: &vec![], }; let encoded_value = outbound_msg.encode(); let target_value = >::from_hex("1002080badf00d010203040404ffffffff").unwrap(); @@ -4388,7 +4407,7 @@ mod tests { keysend_preimage: None, sender_intended_htlc_amt_msat: 0x0badf00d01020304, cltv_expiry_height: 0xffffffff, - custom_tlvs: vec![], + custom_tlvs: &vec![], }; let encoded_value = outbound_msg.encode(); let target_value = >::from_hex("3602080badf00d010203040404ffffffff082442424242424242424242424242424242424242424242424242424242424242421badca1f").unwrap(); @@ -4425,7 +4444,7 @@ mod tests { payment_data: None, payment_metadata: None, keysend_preimage: None, - custom_tlvs: bad_type_range_tlvs, + custom_tlvs: &bad_type_range_tlvs, sender_intended_htlc_amt_msat: 0x0badf00d01020304, cltv_expiry_height: 0xffffffff, }; @@ -4437,7 +4456,7 @@ mod tests { ((1 << 16) - 1, vec![42; 32]), ]; if let msgs::OutboundOnionPayload::Receive { ref mut custom_tlvs, .. } = msg { - *custom_tlvs = good_type_range_tlvs.clone(); + *custom_tlvs = &good_type_range_tlvs; } let encoded_value = msg.encode(); let inbound_msg = ReadableArgs::read(&mut Cursor::new(&encoded_value[..]), (None, &&node_signer)).unwrap(); @@ -4457,7 +4476,7 @@ mod tests { payment_data: None, payment_metadata: None, keysend_preimage: None, - custom_tlvs: expected_custom_tlvs.clone(), + custom_tlvs: &expected_custom_tlvs, sender_intended_htlc_amt_msat: 0x0badf00d01020304, cltv_expiry_height: 0xffffffff, }; @@ -4498,6 +4517,13 @@ mod tests { let encoded_trampoline_packet = trampoline_packet.encode(); assert_eq!(encoded_trampoline_packet.len(), 716); + { // verify that a codec round trip works + let mut reader = Cursor::new(&encoded_trampoline_packet); + let mut trampoline_packet_reader = FixedLengthReader::new(&mut reader, encoded_trampoline_packet.len() as u64); + let decoded_trampoline_packet: TrampolineOnionPacket = ::read(&mut trampoline_packet_reader).unwrap(); + assert_eq!(decoded_trampoline_packet.encode(), encoded_trampoline_packet); + } + let msg = msgs::OutboundOnionPayload::TrampolineEntrypoint { multipath_trampoline_data: None, amt_to_forward: 0x0badf00d01020304,