Skip to content

Commit 0c77c1b

Browse files
committed
Implement Readable for LengthReadable
Inbound Trampoline entrypoint packets will contain inner onions, which only implement LengthReadable. Until now, we never had to decode LengthReadable-only structs in TLV streams, so this issue never surfaced before, but going forward, this will allow us to parse inbound Trampoline data.
1 parent 04a158f commit 0c77c1b

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

lightning/src/ln/msgs.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,7 +1960,7 @@ impl LengthReadable for TrampolineOnionPacket {
19601960

19611961
let hop_data_len = r.total_bytes().saturating_sub(66); // 1 (version) + 33 (pubkey) + 32 (HMAC) = 66
19621962
let mut rd = FixedLengthReader::new(r, hop_data_len);
1963-
let hop_data = WithoutLength::<Vec<u8>>::read(&mut rd)?.0;
1963+
let hop_data = <WithoutLength::<Vec<u8>> as LengthReadable>::read(&mut rd)?.0;
19641964

19651965
let hmac = Readable::read(r)?;
19661966

@@ -2850,7 +2850,7 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
28502850
let mut keysend_preimage: Option<PaymentPreimage> = None;
28512851
let mut custom_tlvs = Vec::new();
28522852

2853-
let tlv_len = BigSize::read(r)?;
2853+
let tlv_len = <BigSize as Readable>::read(r)?;
28542854
let mut rd = FixedLengthReader::new(r, tlv_len.0);
28552855
decode_tlv_stream_with_custom_tlv_decode!(&mut rd, {
28562856
(2, amt, (option, encoding: (u64, HighZeroBytesDroppedBigSize))),
@@ -4309,7 +4309,7 @@ mod tests {
43094309
let encoded_value = closing_signed.encode();
43104310
let target_value = <Vec<u8>>::from_hex("020202020202020202020202020202020202020202020202020202020202020200083a840000034dd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a").unwrap();
43114311
assert_eq!(encoded_value, target_value);
4312-
assert_eq!(msgs::ClosingSigned::read(&mut Cursor::new(&target_value)).unwrap(), closing_signed);
4312+
assert_eq!(<msgs::ClosingSigned as Readable>::read(&mut Cursor::new(&target_value)).unwrap(), closing_signed);
43134313

43144314
let closing_signed_with_range = msgs::ClosingSigned {
43154315
channel_id: ChannelId::from_bytes([2; 32]),
@@ -4323,7 +4323,7 @@ mod tests {
43234323
let encoded_value_with_range = closing_signed_with_range.encode();
43244324
let target_value_with_range = <Vec<u8>>::from_hex("020202020202020202020202020202020202020202020202020202020202020200083a840000034dd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a011000000000deadbeef1badcafe01234567").unwrap();
43254325
assert_eq!(encoded_value_with_range, target_value_with_range);
4326-
assert_eq!(msgs::ClosingSigned::read(&mut Cursor::new(&target_value_with_range)).unwrap(),
4326+
assert_eq!(<msgs::ClosingSigned as Readable>::read(&mut Cursor::new(&target_value_with_range)).unwrap(),
43274327
closing_signed_with_range);
43284328
}
43294329

@@ -4487,7 +4487,7 @@ mod tests {
44874487
let encoded_value = init_msg.encode();
44884488
let target_value = <Vec<u8>>::from_hex("0000000001206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61900000000000307017f00000103e8").unwrap();
44894489
assert_eq!(encoded_value, target_value);
4490-
assert_eq!(msgs::Init::read(&mut Cursor::new(&target_value)).unwrap(), init_msg);
4490+
assert_eq!(<msgs::Init as Readable>::read(&mut Cursor::new(&target_value)).unwrap(), init_msg);
44914491
}
44924492

44934493
#[test]

lightning/src/util/ser.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,13 @@ where
374374
fn read<R: LengthRead>(reader: &mut R) -> Result<Self, DecodeError>;
375375
}
376376

377+
impl<T: Readable> LengthReadable for T {
378+
#[inline]
379+
fn read<R: Read>(reader: &mut R) -> Result<T, DecodeError> {
380+
Readable::read(reader)
381+
}
382+
}
383+
377384
/// A trait that various LDK types implement allowing them to (maybe) be read in from a [`Read`].
378385
///
379386
/// This is not exported to bindings users as we only export serialization to/from byte arrays instead

lightning/src/util/ser_macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ macro_rules! _decode_tlv {
385385
($outer_reader: expr, $reader: expr, $field: ident, (static_value, $value: expr)) => {{
386386
}};
387387
($outer_reader: expr, $reader: expr, $field: ident, required) => {{
388-
$field = $crate::util::ser::Readable::read(&mut $reader)?;
388+
$field = $crate::util::ser::LengthReadable::read(&mut $reader)?;
389389
}};
390390
($outer_reader: expr, $reader: expr, $field: ident, (required: $trait: ident $(, $read_arg: expr)?)) => {{
391391
$field = $trait::read(&mut $reader $(, $read_arg)*)?;
@@ -395,7 +395,7 @@ macro_rules! _decode_tlv {
395395
$field = f.0;
396396
}};
397397
($outer_reader: expr, $reader: expr, $field: ident, option) => {{
398-
$field = Some($crate::util::ser::Readable::read(&mut $reader)?);
398+
$field = Some($crate::util::ser::LengthReadable::read(&mut $reader)?);
399399
}};
400400
($outer_reader: expr, $reader: expr, $field: ident, (option, explicit_type: $fieldty: ty)) => {{
401401
let _field: &Option<$fieldty> = &$field;

0 commit comments

Comments
 (0)