@@ -14,8 +14,10 @@ use bitcoin::hashes::{Hash, HashEngine};
1414use bitcoin:: hashes:: hmac:: { Hmac , HmacEngine } ;
1515use bitcoin:: hashes:: sha256:: Hash as Sha256 ;
1616use bitcoin:: secp256k1:: { self , PublicKey , Scalar , Secp256k1 , SecretKey } ;
17+ use bitcoin:: secp256k1:: ecdh:: SharedSecret ;
1718
1819use crate :: chain:: keysinterface:: { InMemorySigner , KeysInterface , KeysManager , Recipient , Sign } ;
20+ use crate :: ln:: PaymentHash ;
1921use crate :: ln:: features:: { InitFeatures , NodeFeatures } ;
2022use crate :: ln:: msgs:: { self , OnionMessageHandler } ;
2123use crate :: ln:: onion_utils;
@@ -29,6 +31,7 @@ use crate::util::logger::Logger;
2931use crate :: util:: ser:: Writeable ;
3032
3133use core:: ops:: Deref ;
34+ use crate :: io;
3235use crate :: sync:: { Arc , Mutex } ;
3336use crate :: prelude:: * ;
3437
@@ -178,6 +181,9 @@ pub trait CustomOnionMessageHandler {
178181 type CustomMessage : CustomOnionMessageContents ;
179182 /// Called with the custom message that was received.
180183 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 > ;
181187}
182188
183189impl < 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
276282 false
277283}
278284
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+
279293impl < Signer : Sign , K : Deref , L : Deref , CMH : Deref > OnionMessageHandler for OnionMessenger < Signer , K , L , CMH >
280294 where K :: Target : KeysInterface < Signer = Signer > ,
281295 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
283298{
284299 /// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
285300 /// 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
309324 }
310325 } ;
311326 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 ) )
313328 {
314329 Ok ( ( Payload :: Receive :: < <<CMH as Deref >:: Target as CustomOnionMessageHandler >:: CustomMessage > {
315330 message, control_tlvs : ReceiveControlTlvs :: Unblinded ( ReceiveTlvs { path_id } ) , reply_path,
0 commit comments