@@ -154,6 +154,15 @@ pub enum SendError {
154154InvalidMessage , 
155155	/// Our next-hop peer's buffer was full or our total outbound buffer was full. 
156156BufferFull , 
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