@@ -154,6 +154,15 @@ pub enum SendError {
154
154
InvalidMessage ,
155
155
/// Our next-hop peer's buffer was full or our total outbound buffer was full.
156
156
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 ,
157
166
}
158
167
159
168
/// 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,
198
207
199
208
/// Send an onion message with contents `message` to `destination`, routing it through `intermediate_nodes`.
200
209
/// 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 > {
202
211
if let Destination :: BlindedRoute ( BlindedRoute { ref blinded_hops, .. } ) = destination {
203
212
if blinded_hops. len ( ) < 2 {
204
213
return Err ( SendError :: TooFewBlindedHops ) ;
@@ -207,6 +216,19 @@ impl<Signer: Sign, K: Deref, L: Deref, CMH: Deref> OnionMessenger<Signer, K, L,
207
216
let OnionMessageContents :: Custom ( ref msg) = message;
208
217
if msg. tlv_type ( ) < 64 { return Err ( SendError :: InvalidMessage ) }
209
218
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
+
210
232
let blinding_secret_bytes = self . keys_manager . get_secure_random_bytes ( ) ;
211
233
let blinding_secret = SecretKey :: from_slice ( & blinding_secret_bytes[ ..] ) . expect ( "RNG is busted" ) ;
212
234
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
488
510
next_blinding_override : Some ( blinding_pt) ,
489
511
} ) ) , control_tlvs_ss) ) ;
490
512
}
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 ( ) {
497
515
payloads. push ( ( Payload :: Forward ( ForwardControlTlvs :: Blinded ( enc_payload_opt. unwrap ( ) ) ) ,
498
516
control_tlvs_ss) ) ;
499
517
blinded_path_idx += 1 ;
0 commit comments