@@ -14,8 +14,10 @@ use bitcoin::hashes::{Hash, HashEngine};
14
14
use bitcoin:: hashes:: hmac:: { Hmac , HmacEngine } ;
15
15
use bitcoin:: hashes:: sha256:: Hash as Sha256 ;
16
16
use bitcoin:: secp256k1:: { self , PublicKey , Scalar , Secp256k1 , SecretKey } ;
17
+ use bitcoin:: secp256k1:: ecdh:: SharedSecret ;
17
18
18
19
use crate :: chain:: keysinterface:: { InMemorySigner , KeysInterface , KeysManager , Recipient , Sign } ;
20
+ use crate :: ln:: PaymentHash ;
19
21
use crate :: ln:: features:: { InitFeatures , NodeFeatures } ;
20
22
use crate :: ln:: msgs:: { self , OnionMessageHandler } ;
21
23
use crate :: ln:: onion_utils;
@@ -29,6 +31,7 @@ use crate::util::logger::Logger;
29
31
use crate :: util:: ser:: Writeable ;
30
32
31
33
use core:: ops:: Deref ;
34
+ use crate :: io;
32
35
use crate :: sync:: { Arc , Mutex } ;
33
36
use crate :: prelude:: * ;
34
37
@@ -178,6 +181,9 @@ pub trait CustomOnionMessageHandler {
178
181
type CustomMessage : CustomOnionMessageContents ;
179
182
/// Called with the custom message that was received.
180
183
fn handle_custom_message ( & self , msg : Self :: CustomMessage ) ;
184
+ /// Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
185
+ /// message type is unknown.
186
+ fn read < R : io:: Read > ( & self , message_type : u64 , buffer : & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > ;
181
187
}
182
188
183
189
impl < Signer : Sign , K : Deref , L : Deref , CMH : Deref > OnionMessenger < Signer , K , L , CMH >
@@ -276,10 +282,19 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, Ve
276
282
false
277
283
}
278
284
285
+ impl < ' a , T : CustomOnionMessageHandler > onion_utils:: DecodeInput for ( SharedSecret , & ' a T ) {
286
+ type Arg = ( SharedSecret , & ' a T ) ;
287
+ fn payment_hash ( & self ) -> Option < & PaymentHash > {
288
+ None
289
+ }
290
+ fn read_arg ( self ) -> Self :: Arg { self }
291
+ }
292
+
279
293
impl < Signer : Sign , K : Deref , L : Deref , CMH : Deref > OnionMessageHandler for OnionMessenger < Signer , K , L , CMH >
280
294
where K :: Target : KeysInterface < Signer = Signer > ,
281
295
L :: Target : Logger ,
282
- CMH :: Target : CustomOnionMessageHandler ,
296
+ CMH :: Target : CustomOnionMessageHandler + Sized , // XXX: No idea why rustc desperately
297
+ // wants Sized here, it's kinda dumb
283
298
{
284
299
/// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
285
300
/// soon we'll delegate the onion message to a handler that can generate invoices or send
@@ -309,7 +324,7 @@ impl<Signer: Sign, K: Deref, L: Deref, CMH: Deref> OnionMessageHandler for Onion
309
324
}
310
325
} ;
311
326
match onion_utils:: decode_next_hop ( onion_decode_ss, & msg. onion_routing_packet . hop_data [ ..] ,
312
- msg. onion_routing_packet . hmac , control_tlvs_ss)
327
+ msg. onion_routing_packet . hmac , ( control_tlvs_ss, & * self . custom_handler ) )
313
328
{
314
329
Ok ( ( Payload :: Receive :: < <<CMH as Deref >:: Target as CustomOnionMessageHandler >:: CustomMessage > {
315
330
message, control_tlvs : ReceiveControlTlvs :: Unblinded ( ReceiveTlvs { path_id } ) , reply_path,
0 commit comments