@@ -41,6 +41,7 @@ use crate::sign::{NodeSigner, Recipient};
41
41
#[ allow( unused_imports) ]
42
42
use crate :: prelude:: * ;
43
43
44
+ use core:: cmp;
44
45
use core:: fmt;
45
46
use core:: fmt:: Debug ;
46
47
use core:: ops:: Deref ;
@@ -55,7 +56,7 @@ use crate::io_extras::read_to_end;
55
56
use crate :: events:: { EventsProvider , MessageSendEventsProvider } ;
56
57
use crate :: crypto:: streams:: ChaChaPolyReadAdapter ;
57
58
use crate :: util:: logger;
58
- use crate :: util:: ser:: { LengthReadable , LengthReadableArgs , Readable , ReadableArgs , Writeable , Writer , WithoutLength , FixedLengthReader , HighZeroBytesDroppedBigSize , Hostname , TransactionU16LenLimited , BigSize } ;
59
+ use crate :: util:: ser:: { BigSize , FixedLengthReader , HighZeroBytesDroppedBigSize , Hostname , LengthRead , LengthReadable , LengthReadableArgs , Readable , ReadableArgs , TransactionU16LenLimited , WithoutLength , Writeable , Writer } ;
59
60
use crate :: util:: base32;
60
61
61
62
use crate :: routing:: gossip:: { NodeAlias , NodeId } ;
@@ -1856,6 +1857,34 @@ impl Writeable for TrampolineOnionPacket {
1856
1857
}
1857
1858
}
1858
1859
1860
+ impl LengthReadable for TrampolineOnionPacket {
1861
+ fn read < R : LengthRead > ( r : & mut R ) -> Result < Self , DecodeError > {
1862
+ const READ_BUFFER_SIZE : usize = 4096 ;
1863
+
1864
+ let version = Readable :: read ( r) ?;
1865
+ let public_key = Readable :: read ( r) ?;
1866
+
1867
+ let mut hop_data = Vec :: new ( ) ;
1868
+ let hop_data_len = r. total_bytes ( ) . saturating_sub ( 66 ) as usize ; // 1 (version) + 33 (pubkey) + 32 (HMAC) = 66
1869
+ let mut read_idx = 0 ;
1870
+ while read_idx < hop_data_len {
1871
+ let mut read_buffer = [ 0 ; READ_BUFFER_SIZE ] ;
1872
+ let read_amt = cmp:: min ( hop_data_len - read_idx, READ_BUFFER_SIZE ) ;
1873
+ r. read_exact ( & mut read_buffer[ ..read_amt] ) ?;
1874
+ hop_data. extend_from_slice ( & read_buffer[ ..read_amt] ) ;
1875
+ read_idx += read_amt;
1876
+ }
1877
+
1878
+ let hmac = Readable :: read ( r) ?;
1879
+ Ok ( TrampolineOnionPacket {
1880
+ version,
1881
+ public_key,
1882
+ hop_data,
1883
+ hmac,
1884
+ } )
1885
+ }
1886
+ }
1887
+
1859
1888
impl Debug for TrampolineOnionPacket {
1860
1889
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
1861
1890
f. write_fmt ( format_args ! ( "TrampolineOnionPacket version {} with hmac {:?}" , self . version, & self . hmac[ ..] ) )
0 commit comments