11
11
12
12
use chain:: keysinterface:: { KeysInterface , Recipient } ;
13
13
use ln:: features:: InitFeatures ;
14
- use ln:: msgs:: { self , OnionMessageHandler } ;
15
- use super :: { BlindedRoute , Destination , OnionMessenger , SendError } ;
14
+ use ln:: msgs:: { self , DecodeError , OnionMessageHandler } ;
15
+ use super :: { BlindedRoute , CustomOnionMessageContents , CustomOnionMessageHandler , Destination , OnionMessageContents , OnionMessenger , SendError } ;
16
16
use util:: enforcing_trait_impls:: EnforcingSigner ;
17
+ use util:: ser:: { MaybeReadableArgs , Writeable , Writer } ;
17
18
use util:: test_utils;
18
19
19
20
use bitcoin:: network:: constants:: Network ;
20
21
use bitcoin:: secp256k1:: { PublicKey , Secp256k1 } ;
21
22
23
+ use io;
22
24
use sync:: Arc ;
23
25
24
26
struct MessengerNode {
25
27
keys_manager : Arc < test_utils:: TestKeysInterface > ,
26
- messenger : OnionMessenger < EnforcingSigner , Arc < test_utils:: TestKeysInterface > , Arc < test_utils:: TestLogger > > ,
28
+ messenger : OnionMessenger < EnforcingSigner , Arc < test_utils:: TestKeysInterface > , Arc < test_utils:: TestLogger > , Arc < TestCustomMessageHandler > > ,
27
29
logger : Arc < test_utils:: TestLogger > ,
28
30
}
29
31
@@ -34,6 +36,43 @@ impl MessengerNode {
34
36
}
35
37
}
36
38
39
+ #[ derive( Clone ) ]
40
+ struct TestCustomMessage { }
41
+
42
+ const CUSTOM_MESSAGE_TYPE : u64 = 4242 ;
43
+ const CUSTOM_MESSAGE_CONTENTS : [ u8 ; 32 ] = [ 42 ; 32 ] ;
44
+
45
+ impl CustomOnionMessageContents for TestCustomMessage {
46
+ fn tlv_type ( & self ) -> u64 {
47
+ CUSTOM_MESSAGE_TYPE
48
+ }
49
+ }
50
+
51
+ impl Writeable for TestCustomMessage {
52
+ fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
53
+ Ok ( CUSTOM_MESSAGE_CONTENTS . write ( w) ?)
54
+ }
55
+ }
56
+
57
+ impl MaybeReadableArgs < u64 > for TestCustomMessage {
58
+ fn read < R : io:: Read > ( buffer : & mut R , message_type : u64 ) -> Result < Option < Self > , DecodeError > where Self : Sized {
59
+ if message_type == CUSTOM_MESSAGE_TYPE {
60
+ let mut buf = Vec :: new ( ) ;
61
+ buffer. read_to_end ( & mut buf) ?;
62
+ assert_eq ! ( buf, CUSTOM_MESSAGE_CONTENTS ) ;
63
+ return Ok ( Some ( TestCustomMessage { } ) )
64
+ }
65
+ Ok ( None )
66
+ }
67
+ }
68
+
69
+ struct TestCustomMessageHandler { }
70
+
71
+ impl CustomOnionMessageHandler for TestCustomMessageHandler {
72
+ type CustomMessage = TestCustomMessage ;
73
+ fn handle_custom_message ( & self , _msg : Self :: CustomMessage ) { }
74
+ }
75
+
37
76
fn create_nodes ( num_messengers : u8 ) -> Vec < MessengerNode > {
38
77
let mut nodes = Vec :: new ( ) ;
39
78
for i in 0 ..num_messengers {
@@ -42,7 +81,7 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
42
81
let keys_manager = Arc :: new ( test_utils:: TestKeysInterface :: new ( & seed, Network :: Testnet ) ) ;
43
82
nodes. push ( MessengerNode {
44
83
keys_manager : keys_manager. clone ( ) ,
45
- messenger : OnionMessenger :: new ( keys_manager, logger. clone ( ) ) ,
84
+ messenger : OnionMessenger :: new ( keys_manager, logger. clone ( ) , Arc :: new ( TestCustomMessageHandler { } ) ) ,
46
85
logger,
47
86
} ) ;
48
87
}
@@ -80,103 +119,138 @@ fn pass_along_path(path: &Vec<MessengerNode>, expected_path_id: Option<[u8; 32]>
80
119
#[ test]
81
120
fn one_hop ( ) {
82
121
let nodes = create_nodes ( 2 ) ;
122
+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
83
123
84
- nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: Node ( nodes[ 1 ] . get_node_pk ( ) ) , None ) . unwrap ( ) ;
124
+ nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: Node ( nodes[ 1 ] . get_node_pk ( ) ) , test_msg , None ) . unwrap ( ) ;
85
125
pass_along_path ( & nodes, None ) ;
86
126
}
87
127
88
128
#[ test]
89
129
fn two_unblinded_hops ( ) {
90
130
let nodes = create_nodes ( 3 ) ;
131
+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
91
132
92
- nodes[ 0 ] . messenger . send_onion_message ( & [ nodes[ 1 ] . get_node_pk ( ) ] , Destination :: Node ( nodes[ 2 ] . get_node_pk ( ) ) , None ) . unwrap ( ) ;
133
+ nodes[ 0 ] . messenger . send_onion_message ( & [ nodes[ 1 ] . get_node_pk ( ) ] , Destination :: Node ( nodes[ 2 ] . get_node_pk ( ) ) , test_msg , None ) . unwrap ( ) ;
93
134
pass_along_path ( & nodes, None ) ;
94
135
}
95
136
96
137
#[ test]
97
138
fn two_unblinded_two_blinded ( ) {
98
139
let nodes = create_nodes ( 5 ) ;
140
+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
99
141
100
142
let secp_ctx = Secp256k1 :: new ( ) ;
101
143
let blinded_route = BlindedRoute :: new ( & [ nodes[ 3 ] . get_node_pk ( ) , nodes[ 4 ] . get_node_pk ( ) ] , & * nodes[ 4 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
102
144
103
- nodes[ 0 ] . messenger . send_onion_message ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) ] , Destination :: BlindedRoute ( blinded_route) , None ) . unwrap ( ) ;
145
+ nodes[ 0 ] . messenger . send_onion_message ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) ] , Destination :: BlindedRoute ( blinded_route) , test_msg , None ) . unwrap ( ) ;
104
146
pass_along_path ( & nodes, None ) ;
105
147
}
106
148
107
149
#[ test]
108
150
fn three_blinded_hops ( ) {
109
151
let nodes = create_nodes ( 4 ) ;
152
+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
110
153
111
154
let secp_ctx = Secp256k1 :: new ( ) ;
112
155
let blinded_route = BlindedRoute :: new ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) , nodes[ 3 ] . get_node_pk ( ) ] , & * nodes[ 3 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
113
156
114
- nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: BlindedRoute ( blinded_route) , None ) . unwrap ( ) ;
157
+ nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: BlindedRoute ( blinded_route) , test_msg , None ) . unwrap ( ) ;
115
158
pass_along_path ( & nodes, None ) ;
116
159
}
117
160
118
161
#[ test]
119
162
fn too_big_packet_error ( ) {
120
163
// Make sure we error as expected if a packet is too big to send.
121
164
let nodes = create_nodes ( 2 ) ;
165
+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
122
166
123
167
let hop_node_id = nodes[ 1 ] . get_node_pk ( ) ;
124
168
let hops = [ hop_node_id; 400 ] ;
125
- let err = nodes[ 0 ] . messenger . send_onion_message ( & hops, Destination :: Node ( hop_node_id) , None ) . unwrap_err ( ) ;
169
+ let err = nodes[ 0 ] . messenger . send_onion_message ( & hops, Destination :: Node ( hop_node_id) , test_msg , None ) . unwrap_err ( ) ;
126
170
assert_eq ! ( err, SendError :: TooBigPacket ) ;
127
171
}
128
172
129
173
#[ test]
130
174
fn invalid_blinded_route_error ( ) {
131
175
// Make sure we error as expected if a provided blinded route has 0 or 1 hops.
132
176
let nodes = create_nodes ( 3 ) ;
177
+ let test_msg = TestCustomMessage { } ;
133
178
134
179
// 0 hops
135
180
let secp_ctx = Secp256k1 :: new ( ) ;
136
181
let mut blinded_route = BlindedRoute :: new ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) ] , & * nodes[ 2 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
137
182
blinded_route. blinded_hops . clear ( ) ;
138
- let err = nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: BlindedRoute ( blinded_route) , None ) . unwrap_err ( ) ;
183
+ let err = nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: BlindedRoute ( blinded_route) , OnionMessageContents :: Custom ( test_msg . clone ( ) ) , None ) . unwrap_err ( ) ;
139
184
assert_eq ! ( err, SendError :: TooFewBlindedHops ) ;
140
185
141
186
// 1 hop
142
187
let mut blinded_route = BlindedRoute :: new ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) ] , & * nodes[ 2 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
143
188
blinded_route. blinded_hops . remove ( 0 ) ;
144
189
assert_eq ! ( blinded_route. blinded_hops. len( ) , 1 ) ;
145
- let err = nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: BlindedRoute ( blinded_route) , None ) . unwrap_err ( ) ;
190
+ let err = nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: BlindedRoute ( blinded_route) , OnionMessageContents :: Custom ( test_msg ) , None ) . unwrap_err ( ) ;
146
191
assert_eq ! ( err, SendError :: TooFewBlindedHops ) ;
147
192
}
148
193
149
194
#[ test]
150
195
fn reply_path ( ) {
151
196
let nodes = create_nodes ( 4 ) ;
197
+ let test_msg = TestCustomMessage { } ;
152
198
let secp_ctx = Secp256k1 :: new ( ) ;
153
199
154
200
// Destination::Node
155
201
let reply_path = BlindedRoute :: new ( & [ nodes[ 2 ] . get_node_pk ( ) , nodes[ 1 ] . get_node_pk ( ) , nodes[ 0 ] . get_node_pk ( ) ] , & * nodes[ 0 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
156
- nodes[ 0 ] . messenger . send_onion_message ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) ] , Destination :: Node ( nodes[ 3 ] . get_node_pk ( ) ) , Some ( reply_path) ) . unwrap ( ) ;
202
+ nodes[ 0 ] . messenger . send_onion_message ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) ] , Destination :: Node ( nodes[ 3 ] . get_node_pk ( ) ) , OnionMessageContents :: Custom ( test_msg . clone ( ) ) , Some ( reply_path) ) . unwrap ( ) ;
157
203
pass_along_path ( & nodes, None ) ;
158
204
// Make sure the last node successfully decoded the reply path.
159
205
nodes[ 3 ] . logger . assert_log_contains (
160
206
"lightning::onion_message::messenger" . to_string ( ) ,
161
- format ! ( "Received an onion message with path_id: None and reply_path" ) . to_string ( ) , 1 ) ;
207
+ format ! ( "Received an onion message with path_id None and a reply_path" ) . to_string ( ) , 1 ) ;
162
208
163
209
// Destination::BlindedRoute
164
210
let blinded_route = BlindedRoute :: new ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) , nodes[ 3 ] . get_node_pk ( ) ] , & * nodes[ 3 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
165
211
let reply_path = BlindedRoute :: new ( & [ nodes[ 2 ] . get_node_pk ( ) , nodes[ 1 ] . get_node_pk ( ) , nodes[ 0 ] . get_node_pk ( ) ] , & * nodes[ 0 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
166
212
167
- nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: BlindedRoute ( blinded_route) , Some ( reply_path) ) . unwrap ( ) ;
213
+ nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: BlindedRoute ( blinded_route) , OnionMessageContents :: Custom ( test_msg ) , Some ( reply_path) ) . unwrap ( ) ;
168
214
pass_along_path ( & nodes, None ) ;
169
215
nodes[ 3 ] . logger . assert_log_contains (
170
216
"lightning::onion_message::messenger" . to_string ( ) ,
171
- format ! ( "Received an onion message with path_id: None and reply_path" ) . to_string ( ) , 2 ) ;
217
+ format ! ( "Received an onion message with path_id None and a reply_path" ) . to_string ( ) , 2 ) ;
218
+ }
219
+
220
+ #[ test]
221
+ fn invalid_custom_message_type ( ) {
222
+ let nodes = create_nodes ( 2 ) ;
223
+
224
+ struct InvalidCustomMessage { }
225
+ impl CustomOnionMessageContents for InvalidCustomMessage {
226
+ fn tlv_type ( & self ) -> u64 {
227
+ // Onion message contents must have a TLV >= 64.
228
+ 63
229
+ }
230
+ }
231
+
232
+ impl Writeable for InvalidCustomMessage {
233
+ fn write < W : Writer > ( & self , _w : & mut W ) -> Result < ( ) , io:: Error > { unreachable ! ( ) }
234
+ }
235
+
236
+ impl MaybeReadableArgs < u64 > for InvalidCustomMessage {
237
+ fn read < R : io:: Read > ( _buffer : & mut R , _message_type : u64 ) -> Result < Option < Self > , DecodeError > where Self : Sized {
238
+ unreachable ! ( )
239
+ }
240
+ }
241
+
242
+ let test_msg = OnionMessageContents :: Custom ( InvalidCustomMessage { } ) ;
243
+ let err = nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: Node ( nodes[ 1 ] . get_node_pk ( ) ) , test_msg, None ) . unwrap_err ( ) ;
244
+ assert_eq ! ( err, SendError :: InvalidMessage ) ;
172
245
}
173
246
174
247
#[ test]
175
248
fn peer_buffer_full ( ) {
176
249
let nodes = create_nodes ( 2 ) ;
250
+ let test_msg = TestCustomMessage { } ;
177
251
for _ in 0 ..188 { // Based on MAX_PER_PEER_BUFFER_SIZE in OnionMessenger
178
- nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: Node ( nodes[ 1 ] . get_node_pk ( ) ) , None ) . unwrap ( ) ;
252
+ nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: Node ( nodes[ 1 ] . get_node_pk ( ) ) , OnionMessageContents :: Custom ( test_msg . clone ( ) ) , None ) . unwrap ( ) ;
179
253
}
180
- let err = nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: Node ( nodes[ 1 ] . get_node_pk ( ) ) , None ) . unwrap_err ( ) ;
254
+ let err = nodes[ 0 ] . messenger . send_onion_message ( & [ ] , Destination :: Node ( nodes[ 1 ] . get_node_pk ( ) ) , OnionMessageContents :: Custom ( test_msg ) , None ) . unwrap_err ( ) ;
181
255
assert_eq ! ( err, SendError :: BufferFull ) ;
182
256
}
0 commit comments