Skip to content

Commit 2c71923

Browse files
Merge pull request #3006 from arik-so/arik/trampoline/2024-04-trampoline-onion-deserialization
Trampoline Onion Deserialization
2 parents 5d9f3b4 + 98a926f commit 2c71923

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

lightning/src/ln/msgs.rs

+29-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ use crate::io_extras::read_to_end;
5555
use crate::events::{EventsProvider, MessageSendEventsProvider};
5656
use crate::crypto::streams::ChaChaPolyReadAdapter;
5757
use crate::util::logger;
58-
use crate::util::ser::{LengthReadable, LengthReadableArgs, Readable, ReadableArgs, Writeable, Writer, WithoutLength, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname, TransactionU16LenLimited, BigSize};
58+
use crate::util::ser::{BigSize, FixedLengthReader, HighZeroBytesDroppedBigSize, Hostname, LengthRead, LengthReadable, LengthReadableArgs, Readable, ReadableArgs, TransactionU16LenLimited, WithoutLength, Writeable, Writer};
5959
use crate::util::base32;
6060

6161
use crate::routing::gossip::{NodeAlias, NodeId};
@@ -1857,6 +1857,26 @@ impl Writeable for TrampolineOnionPacket {
18571857
}
18581858
}
18591859

1860+
impl LengthReadable for TrampolineOnionPacket {
1861+
fn read<R: LengthRead>(r: &mut R) -> Result<Self, DecodeError> {
1862+
let version = Readable::read(r)?;
1863+
let public_key = Readable::read(r)?;
1864+
1865+
let hop_data_len = r.total_bytes().saturating_sub(66); // 1 (version) + 33 (pubkey) + 32 (HMAC) = 66
1866+
let mut rd = FixedLengthReader::new(r, hop_data_len);
1867+
let hop_data = WithoutLength::<Vec<u8>>::read(&mut rd)?.0;
1868+
1869+
let hmac = Readable::read(r)?;
1870+
1871+
Ok(TrampolineOnionPacket {
1872+
version,
1873+
public_key,
1874+
hop_data,
1875+
hmac,
1876+
})
1877+
}
1878+
}
1879+
18601880
impl Debug for TrampolineOnionPacket {
18611881
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
18621882
f.write_fmt(format_args!("TrampolineOnionPacket version {} with hmac {:?}", self.version, &self.hmac[..]))
@@ -3181,7 +3201,7 @@ mod tests {
31813201
use crate::ln::msgs::{self, FinalOnionHopData, OnionErrorPacket, CommonOpenChannelFields, CommonAcceptChannelFields, TrampolineOnionPacket};
31823202
use crate::ln::msgs::SocketAddress;
31833203
use crate::routing::gossip::{NodeAlias, NodeId};
3184-
use crate::util::ser::{BigSize, Hostname, Readable, ReadableArgs, TransactionU16LenLimited, Writeable};
3204+
use crate::util::ser::{BigSize, FixedLengthReader, Hostname, LengthReadable, Readable, ReadableArgs, TransactionU16LenLimited, Writeable};
31853205
use crate::util::test_utils;
31863206

31873207
use bitcoin::hashes::hex::FromHex;
@@ -4497,6 +4517,13 @@ mod tests {
44974517
let encoded_trampoline_packet = trampoline_packet.encode();
44984518
assert_eq!(encoded_trampoline_packet.len(), 716);
44994519

4520+
{ // verify that a codec round trip works
4521+
let mut reader = Cursor::new(&encoded_trampoline_packet);
4522+
let mut trampoline_packet_reader = FixedLengthReader::new(&mut reader, encoded_trampoline_packet.len() as u64);
4523+
let decoded_trampoline_packet: TrampolineOnionPacket = <TrampolineOnionPacket as LengthReadable>::read(&mut trampoline_packet_reader).unwrap();
4524+
assert_eq!(decoded_trampoline_packet.encode(), encoded_trampoline_packet);
4525+
}
4526+
45004527
let msg = msgs::OutboundOnionPayload::TrampolineEntrypoint {
45014528
multipath_trampoline_data: None,
45024529
amt_to_forward: 0x0badf00d01020304,

0 commit comments

Comments
 (0)