@@ -55,7 +55,7 @@ use crate::io_extras::read_to_end;
5555use crate :: events:: { EventsProvider , MessageSendEventsProvider } ;
5656use crate :: crypto:: streams:: ChaChaPolyReadAdapter ;
5757use 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 } ;
5959use crate :: util:: base32;
6060
6161use 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+
18601880impl 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