Skip to content

Commit 9189640

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 b5a5e59 commit 9189640

File tree

3 files changed

+15
-8
lines changed

3 files changed

+15
-8
lines changed

lightning/src/ln/msgs.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1964,7 +1964,7 @@ impl LengthReadable for TrampolineOnionPacket {
19641964

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

19691969
let hmac = Readable::read(r)?;
19701970

@@ -2854,7 +2854,7 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, NS)> for InboundOnionPayload wh
28542854
let mut keysend_preimage: Option<PaymentPreimage> = None;
28552855
let mut custom_tlvs = Vec::new();
28562856

2857-
let tlv_len = BigSize::read(r)?;
2857+
let tlv_len = <BigSize as Readable>::read(r)?;
28582858
let mut rd = FixedLengthReader::new(r, tlv_len.0);
28592859
decode_tlv_stream_with_custom_tlv_decode!(&mut rd, {
28602860
(2, amt, (option, encoding: (u64, HighZeroBytesDroppedBigSize))),
@@ -4313,7 +4313,7 @@ mod tests {
43134313
let encoded_value = closing_signed.encode();
43144314
let target_value = <Vec<u8>>::from_hex("020202020202020202020202020202020202020202020202020202020202020200083a840000034dd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a").unwrap();
43154315
assert_eq!(encoded_value, target_value);
4316-
assert_eq!(msgs::ClosingSigned::read(&mut Cursor::new(&target_value)).unwrap(), closing_signed);
4316+
assert_eq!(<msgs::ClosingSigned as Readable>::read(&mut Cursor::new(&target_value)).unwrap(), closing_signed);
43174317

43184318
let closing_signed_with_range = msgs::ClosingSigned {
43194319
channel_id: ChannelId::from_bytes([2; 32]),
@@ -4327,7 +4327,7 @@ mod tests {
43274327
let encoded_value_with_range = closing_signed_with_range.encode();
43284328
let target_value_with_range = <Vec<u8>>::from_hex("020202020202020202020202020202020202020202020202020202020202020200083a840000034dd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a011000000000deadbeef1badcafe01234567").unwrap();
43294329
assert_eq!(encoded_value_with_range, target_value_with_range);
4330-
assert_eq!(msgs::ClosingSigned::read(&mut Cursor::new(&target_value_with_range)).unwrap(),
4330+
assert_eq!(<msgs::ClosingSigned as Readable>::read(&mut Cursor::new(&target_value_with_range)).unwrap(),
43314331
closing_signed_with_range);
43324332
}
43334333

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

44974497
#[test]

lightning/src/util/ser.rs

+7
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

+3-3
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;
@@ -453,7 +453,7 @@ macro_rules! _decode_tlv {
453453
}};
454454
($outer_reader: expr, $reader: expr, $field: ident, (option, encoding: ($fieldty: ty, $encoding: ident))) => {{
455455
$field = {
456-
let field: $encoding<$fieldty> = ser::Readable::read(&mut $reader)?;
456+
let field: $encoding<$fieldty> = ser::LengthReadable::read(&mut $reader)?;
457457
Some(field.0)
458458
};
459459
}};

0 commit comments

Comments
 (0)