9
9
10
10
//! Structs and enums useful for constructing and reading an onion message packet.
11
11
12
- use bitcoin:: secp256k1:: PublicKey ;
13
12
use bitcoin:: secp256k1:: ecdh:: SharedSecret ;
13
+ use bitcoin:: secp256k1:: PublicKey ;
14
14
15
- use crate :: blinded_path:: message:: { BlindedMessagePath , ForwardTlvs , NextMessageHop , ReceiveTlvs } ;
16
- use crate :: blinded_path:: utils:: Padding ;
17
- use crate :: ln:: msgs:: DecodeError ;
18
- use crate :: ln:: onion_utils;
19
15
#[ cfg( async_payments) ]
20
16
use super :: async_payments:: AsyncPaymentsMessage ;
21
17
use super :: dns_resolution:: DNSResolverMessage ;
22
18
use super :: messenger:: CustomOnionMessageHandler ;
23
19
use super :: offers:: OffersMessage ;
20
+ use crate :: blinded_path:: message:: { BlindedMessagePath , ForwardTlvs , NextMessageHop , ReceiveTlvs } ;
21
+ use crate :: blinded_path:: utils:: Padding ;
24
22
use crate :: crypto:: streams:: { ChaChaPolyReadAdapter , ChaChaPolyWriteAdapter } ;
23
+ use crate :: ln:: msgs:: DecodeError ;
24
+ use crate :: ln:: onion_utils;
25
25
use crate :: util:: logger:: Logger ;
26
- use crate :: util:: ser:: { BigSize , FixedLengthReader , LengthRead , LengthReadable , LengthReadableArgs , Readable , ReadableArgs , Writeable , Writer } ;
26
+ use crate :: util:: ser:: {
27
+ BigSize , FixedLengthReader , LengthRead , LengthReadable , LengthReadableArgs , Readable ,
28
+ ReadableArgs , Writeable , Writer ,
29
+ } ;
27
30
28
- use core:: cmp;
29
- use core:: fmt;
30
31
use crate :: io:: { self , Read } ;
31
32
use crate :: prelude:: * ;
33
+ use core:: cmp;
34
+ use core:: fmt;
32
35
33
36
// Per the spec, an onion message packet's `hop_data` field length should be
34
37
// SMALL_PACKET_HOP_DATA_LEN if it fits, else BIG_PACKET_HOP_DATA_LEN if it fits.
@@ -56,18 +59,17 @@ pub struct Packet {
56
59
impl onion_utils:: Packet for Packet {
57
60
type Data = Vec < u8 > ;
58
61
fn new ( public_key : PublicKey , hop_data : Vec < u8 > , hmac : [ u8 ; 32 ] ) -> Packet {
59
- Self {
60
- version : 0 ,
61
- public_key,
62
- hop_data,
63
- hmac,
64
- }
62
+ Self { version : 0 , public_key, hop_data, hmac }
65
63
}
66
64
}
67
65
68
66
impl fmt:: Debug for Packet {
69
67
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
70
- f. write_fmt ( format_args ! ( "Onion message packet version {} with hmac {:?}" , self . version, & self . hmac[ ..] ) )
68
+ f. write_fmt ( format_args ! (
69
+ "Onion message packet version {} with hmac {:?}" ,
70
+ self . version,
71
+ & self . hmac[ ..]
72
+ ) )
71
73
}
72
74
}
73
75
@@ -100,12 +102,7 @@ impl LengthReadable for Packet {
100
102
}
101
103
102
104
let hmac = Readable :: read ( r) ?;
103
- Ok ( Packet {
104
- version,
105
- public_key,
106
- hop_data,
107
- hmac,
108
- } )
105
+ Ok ( Packet { version, public_key, hop_data, hmac } )
109
106
}
110
107
}
111
108
@@ -116,11 +113,7 @@ pub(super) enum Payload<T: OnionMessageContents> {
116
113
/// This payload is for an intermediate hop.
117
114
Forward ( ForwardControlTlvs ) ,
118
115
/// This payload is for the final hop.
119
- Receive {
120
- control_tlvs : ReceiveControlTlvs ,
121
- reply_path : Option < BlindedMessagePath > ,
122
- message : T ,
123
- }
116
+ Receive { control_tlvs : ReceiveControlTlvs , reply_path : Option < BlindedMessagePath > , message : T } ,
124
117
}
125
118
126
119
/// The contents of an [`OnionMessage`] as read from the wire.
@@ -225,12 +218,12 @@ impl<T: OnionMessageContents> Writeable for (Payload<T>, [u8; 32]) {
225
218
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
226
219
match & self . 0 {
227
220
Payload :: Forward ( ForwardControlTlvs :: Blinded ( encrypted_bytes) ) => {
228
- _encode_varint_length_prefixed_tlv ! ( w, {
229
- ( 4 , * encrypted_bytes, required_vec)
230
- } )
221
+ _encode_varint_length_prefixed_tlv ! ( w, { ( 4 , * encrypted_bytes, required_vec) } )
231
222
} ,
232
223
Payload :: Receive {
233
- control_tlvs : ReceiveControlTlvs :: Blinded ( encrypted_bytes) , reply_path, message,
224
+ control_tlvs : ReceiveControlTlvs :: Blinded ( encrypted_bytes) ,
225
+ reply_path,
226
+ message,
234
227
} => {
235
228
_encode_varint_length_prefixed_tlv ! ( w, {
236
229
( 2 , reply_path, option) ,
@@ -240,12 +233,12 @@ impl<T: OnionMessageContents> Writeable for (Payload<T>, [u8; 32]) {
240
233
} ,
241
234
Payload :: Forward ( ForwardControlTlvs :: Unblinded ( control_tlvs) ) => {
242
235
let write_adapter = ChaChaPolyWriteAdapter :: new ( self . 1 , & control_tlvs) ;
243
- _encode_varint_length_prefixed_tlv ! ( w, {
244
- ( 4 , write_adapter, required)
245
- } )
236
+ _encode_varint_length_prefixed_tlv ! ( w, { ( 4 , write_adapter, required) } )
246
237
} ,
247
238
Payload :: Receive {
248
- control_tlvs : ReceiveControlTlvs :: Unblinded ( control_tlvs) , reply_path, message,
239
+ control_tlvs : ReceiveControlTlvs :: Unblinded ( control_tlvs) ,
240
+ reply_path,
241
+ message,
249
242
} => {
250
243
let write_adapter = ChaChaPolyWriteAdapter :: new ( self . 1 , & control_tlvs) ;
251
244
_encode_varint_length_prefixed_tlv ! ( w, {
@@ -261,7 +254,8 @@ impl<T: OnionMessageContents> Writeable for (Payload<T>, [u8; 32]) {
261
254
262
255
// Uses the provided secret to simultaneously decode and decrypt the control TLVs and data TLV.
263
256
impl < H : CustomOnionMessageHandler + ?Sized , L : Logger + ?Sized > ReadableArgs < ( SharedSecret , & H , & L ) >
264
- for Payload < ParsedOnionMessageContents < <H as CustomOnionMessageHandler >:: CustomMessage > > {
257
+ for Payload < ParsedOnionMessageContents < <H as CustomOnionMessageHandler >:: CustomMessage > >
258
+ {
265
259
fn read < R : Read > ( r : & mut R , args : ( SharedSecret , & H , & L ) ) -> Result < Self , DecodeError > {
266
260
let ( encrypted_tlvs_ss, handler, logger) = args;
267
261
@@ -311,13 +305,13 @@ for Payload<ParsedOnionMessageContents<<H as CustomOnionMessageHandler>::CustomM
311
305
312
306
match read_adapter {
313
307
None => return Err ( DecodeError :: InvalidValue ) ,
314
- Some ( ChaChaPolyReadAdapter { readable : ControlTlvs :: Forward ( tlvs) } ) => {
308
+ Some ( ChaChaPolyReadAdapter { readable : ControlTlvs :: Forward ( tlvs) } ) => {
315
309
if message_type. is_some ( ) {
316
- return Err ( DecodeError :: InvalidValue )
310
+ return Err ( DecodeError :: InvalidValue ) ;
317
311
}
318
312
Ok ( Payload :: Forward ( ForwardControlTlvs :: Unblinded ( tlvs) ) )
319
313
} ,
320
- Some ( ChaChaPolyReadAdapter { readable : ControlTlvs :: Receive ( tlvs) } ) => {
314
+ Some ( ChaChaPolyReadAdapter { readable : ControlTlvs :: Receive ( tlvs) } ) => {
321
315
Ok ( Payload :: Receive {
322
316
control_tlvs : ReceiveControlTlvs :: Unblinded ( tlvs) ,
323
317
reply_path,
@@ -366,11 +360,9 @@ impl Readable for ControlTlvs {
366
360
next_blinding_override,
367
361
} )
368
362
} else if valid_recv_fmt {
369
- ControlTlvs :: Receive ( ReceiveTlvs {
370
- context,
371
- } )
363
+ ControlTlvs :: Receive ( ReceiveTlvs { context } )
372
364
} else {
373
- return Err ( DecodeError :: InvalidValue )
365
+ return Err ( DecodeError :: InvalidValue ) ;
374
366
} ;
375
367
376
368
Ok ( payload_fmt)
0 commit comments