1111
1212use chain:: keysinterface:: { KeysInterface , Recipient } ;
1313use 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 } ;
1616use util:: enforcing_trait_impls:: EnforcingSigner ;
17+ use util:: ser:: { MaybeReadableArgs , Writeable , Writer } ;
1718use util:: test_utils;
1819
1920use bitcoin:: network:: constants:: Network ;
2021use bitcoin:: secp256k1:: { PublicKey , Secp256k1 } ;
2122
23+ use io;
2224use sync:: Arc ;
2325
2426struct MessengerNode {
2527 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 > > ,
2729 logger : Arc < test_utils:: TestLogger > ,
2830}
2931
@@ -34,6 +36,43 @@ impl MessengerNode {
3436 }
3537}
3638
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+
3776fn create_nodes ( num_messengers : u8 ) -> Vec < MessengerNode > {
3877 let mut nodes = Vec :: new ( ) ;
3978 for i in 0 ..num_messengers {
@@ -42,7 +81,7 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
4281 let keys_manager = Arc :: new ( test_utils:: TestKeysInterface :: new ( & seed, Network :: Testnet ) ) ;
4382 nodes. push ( MessengerNode {
4483 keys_manager : keys_manager. clone ( ) ,
45- messenger : OnionMessenger :: new ( keys_manager, logger. clone ( ) ) ,
84+ messenger : OnionMessenger :: new ( keys_manager, logger. clone ( ) , Arc :: new ( TestCustomMessageHandler { } ) ) ,
4685 logger,
4786 } ) ;
4887 }
@@ -80,103 +119,138 @@ fn pass_along_path(path: &Vec<MessengerNode>, expected_path_id: Option<[u8; 32]>
80119#[ test]
81120fn one_hop ( ) {
82121 let nodes = create_nodes ( 2 ) ;
122+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
83123
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 ( ) ;
85125 pass_along_path ( & nodes, None ) ;
86126}
87127
88128#[ test]
89129fn two_unblinded_hops ( ) {
90130 let nodes = create_nodes ( 3 ) ;
131+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
91132
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 ( ) ;
93134 pass_along_path ( & nodes, None ) ;
94135}
95136
96137#[ test]
97138fn two_unblinded_two_blinded ( ) {
98139 let nodes = create_nodes ( 5 ) ;
140+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
99141
100142 let secp_ctx = Secp256k1 :: new ( ) ;
101143 let blinded_route = BlindedRoute :: new ( & [ nodes[ 3 ] . get_node_pk ( ) , nodes[ 4 ] . get_node_pk ( ) ] , & * nodes[ 4 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
102144
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 ( ) ;
104146 pass_along_path ( & nodes, None ) ;
105147}
106148
107149#[ test]
108150fn three_blinded_hops ( ) {
109151 let nodes = create_nodes ( 4 ) ;
152+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
110153
111154 let secp_ctx = Secp256k1 :: new ( ) ;
112155 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 ( ) ;
113156
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 ( ) ;
115158 pass_along_path ( & nodes, None ) ;
116159}
117160
118161#[ test]
119162fn too_big_packet_error ( ) {
120163 // Make sure we error as expected if a packet is too big to send.
121164 let nodes = create_nodes ( 2 ) ;
165+ let test_msg = OnionMessageContents :: Custom ( TestCustomMessage { } ) ;
122166
123167 let hop_node_id = nodes[ 1 ] . get_node_pk ( ) ;
124168 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 ( ) ;
126170 assert_eq ! ( err, SendError :: TooBigPacket ) ;
127171}
128172
129173#[ test]
130174fn invalid_blinded_route_error ( ) {
131175 // Make sure we error as expected if a provided blinded route has 0 or 1 hops.
132176 let nodes = create_nodes ( 3 ) ;
177+ let test_msg = TestCustomMessage { } ;
133178
134179 // 0 hops
135180 let secp_ctx = Secp256k1 :: new ( ) ;
136181 let mut blinded_route = BlindedRoute :: new ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) ] , & * nodes[ 2 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
137182 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 ( ) ;
139184 assert_eq ! ( err, SendError :: TooFewBlindedHops ) ;
140185
141186 // 1 hop
142187 let mut blinded_route = BlindedRoute :: new ( & [ nodes[ 1 ] . get_node_pk ( ) , nodes[ 2 ] . get_node_pk ( ) ] , & * nodes[ 2 ] . keys_manager , & secp_ctx) . unwrap ( ) ;
143188 blinded_route. blinded_hops . remove ( 0 ) ;
144189 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 ( ) ;
146191 assert_eq ! ( err, SendError :: TooFewBlindedHops ) ;
147192}
148193
149194#[ test]
150195fn reply_path ( ) {
151196 let nodes = create_nodes ( 4 ) ;
197+ let test_msg = TestCustomMessage { } ;
152198 let secp_ctx = Secp256k1 :: new ( ) ;
153199
154200 // Destination::Node
155201 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 ( ) ;
157203 pass_along_path ( & nodes, None ) ;
158204 // Make sure the last node successfully decoded the reply path.
159205 nodes[ 3 ] . logger . assert_log_contains (
160206 "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 ) ;
162208
163209 // Destination::BlindedRoute
164210 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 ( ) ;
165211 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 ( ) ;
166212
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 ( ) ;
168214 pass_along_path ( & nodes, None ) ;
169215 nodes[ 3 ] . logger . assert_log_contains (
170216 "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 ) ;
172245}
173246
174247#[ test]
175248fn peer_buffer_full ( ) {
176249 let nodes = create_nodes ( 2 ) ;
250+ let test_msg = TestCustomMessage { } ;
177251 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 ( ) ;
179253 }
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 ( ) ;
181255 assert_eq ! ( err, SendError :: BufferFull ) ;
182256}
0 commit comments