@@ -154,6 +154,15 @@ pub enum SendError {
154154 InvalidMessage ,
155155 /// Our next-hop peer's buffer was full or our total outbound buffer was full.
156156 BufferFull ,
157+ /// Failed to retrieve our node id from the provided [`KeysInterface`].
158+ ///
159+ /// [`KeysInterface`]: crate::chain::keysinterface::KeysInterface
160+ GetNodeIdFailed ,
161+ /// We attempted to send to a blinded route where we are the introduction node, and failed to
162+ /// advance the blinded route to make the second hop the new introduction node. Either
163+ /// [`KeysInterface::ecdh`] failed, we failed to tweak the current blinding point to get the
164+ /// new blinding point, or we were attempting to send to ourselves.
165+ BlindedRouteAdvanceFailed ,
157166}
158167
159168/// Handler for custom onion messages. If you are using [`SimpleArcOnionMessenger`],
@@ -198,7 +207,7 @@ impl<Signer: Sign, K: Deref, L: Deref, CMH: Deref> OnionMessenger<Signer, K, L,
198207
199208 /// Send an onion message with contents `message` to `destination`, routing it through `intermediate_nodes`.
200209 /// See [`OnionMessenger`] for example usage.
201- pub fn send_onion_message < T : CustomOnionMessageContents > ( & self , intermediate_nodes : & [ PublicKey ] , destination : Destination , message : OnionMessageContents < T > , reply_path : Option < BlindedRoute > ) -> Result < ( ) , SendError > {
210+ pub fn send_onion_message < T : CustomOnionMessageContents > ( & self , intermediate_nodes : & [ PublicKey ] , mut destination : Destination , message : OnionMessageContents < T > , reply_path : Option < BlindedRoute > ) -> Result < ( ) , SendError > {
202211 if let Destination :: BlindedRoute ( BlindedRoute { ref blinded_hops, .. } ) = destination {
203212 if blinded_hops. len ( ) < 2 {
204213 return Err ( SendError :: TooFewBlindedHops ) ;
@@ -207,6 +216,19 @@ impl<Signer: Sign, K: Deref, L: Deref, CMH: Deref> OnionMessenger<Signer, K, L,
207216 let OnionMessageContents :: Custom ( ref msg) = message;
208217 if msg. tlv_type ( ) < 64 { return Err ( SendError :: InvalidMessage ) }
209218
219+ // If we are sending straight to a blinded route and we are the introduction node, we need to
220+ // advance the blinded route by 1 hop so the second hop is the new introduction node.
221+ if intermediate_nodes. len ( ) == 0 {
222+ if let Destination :: BlindedRoute ( ref mut blinded_route) = destination {
223+ let our_node_id = self . keys_manager . get_node_id ( Recipient :: Node )
224+ . map_err ( |( ) | SendError :: GetNodeIdFailed ) ?;
225+ if blinded_route. introduction_node_id == our_node_id {
226+ blinded_route. advance_by_one ( & self . keys_manager , & self . secp_ctx )
227+ . map_err ( |( ) | SendError :: BlindedRouteAdvanceFailed ) ?;
228+ }
229+ }
230+ }
231+
210232 let blinding_secret_bytes = self . keys_manager . get_secure_random_bytes ( ) ;
211233 let blinding_secret = SecretKey :: from_slice ( & blinding_secret_bytes[ ..] ) . expect ( "RNG is busted" ) ;
212234 let ( introduction_node_id, blinding_point) = if intermediate_nodes. len ( ) != 0 {
@@ -488,12 +510,8 @@ fn packet_payloads_and_keys<T: CustomOnionMessageContents, S: secp256k1::Signing
488510 next_blinding_override : Some ( blinding_pt) ,
489511 } ) ) , control_tlvs_ss) ) ;
490512 }
491- if let Some ( encrypted_payload) = enc_payload_opt {
492- payloads. push ( ( Payload :: Forward ( ForwardControlTlvs :: Blinded ( encrypted_payload) ) ,
493- control_tlvs_ss) ) ;
494- } else { debug_assert ! ( false ) ; }
495- blinded_path_idx += 1 ;
496- } else if blinded_path_idx < num_blinded_hops - 1 && enc_payload_opt. is_some ( ) {
513+ }
514+ if blinded_path_idx < num_blinded_hops. saturating_sub ( 1 ) && enc_payload_opt. is_some ( ) {
497515 payloads. push ( ( Payload :: Forward ( ForwardControlTlvs :: Blinded ( enc_payload_opt. unwrap ( ) ) ) ,
498516 control_tlvs_ss) ) ;
499517 blinded_path_idx += 1 ;
0 commit comments