27a0b0cd15bf9a50130192c1c0684a45441c1719
[rust-lightning] / lightning / src / onion_message / messenger.rs
1 // This file is Copyright its original authors, visible in version control
2 // history.
3 //
4 // This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
5 // or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
7 // You may not use this file except in accordance with one or both of these
8 // licenses.
9
10 //! LDK sends, receives, and forwards onion messages via the [`OnionMessenger`]. See its docs for
11 //! more information.
12
13 use bitcoin::hashes::{Hash, HashEngine};
14 use bitcoin::hashes::hmac::{Hmac, HmacEngine};
15 use bitcoin::hashes::sha256::Hash as Sha256;
16 use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
17
18 use crate::blinded_path::BlindedPath;
19 use crate::blinded_path::message::{advance_path_by_one, ForwardTlvs, ReceiveTlvs};
20 use crate::blinded_path::utils;
21 use crate::sign::{EntropySource, KeysManager, NodeSigner, Recipient};
22 use crate::events::OnionMessageProvider;
23 use crate::ln::features::{InitFeatures, NodeFeatures};
24 use crate::ln::msgs::{self, OnionMessageHandler};
25 use crate::ln::onion_utils;
26 use crate::ln::peer_handler::IgnoringMessageHandler;
27 pub use super::packet::{CustomOnionMessageContents, OnionMessageContents};
28 use super::offers::OffersMessageHandler;
29 use super::packet::{BIG_PACKET_HOP_DATA_LEN, ForwardControlTlvs, Packet, Payload, ReceiveControlTlvs, SMALL_PACKET_HOP_DATA_LEN};
30 use crate::util::logger::Logger;
31 use crate::util::ser::Writeable;
32
33 use core::ops::Deref;
34 use crate::io;
35 use crate::sync::{Arc, Mutex};
36 use crate::prelude::*;
37
38 /// A sender, receiver and forwarder of [`OnionMessage`]s.
39 ///
40 /// # Handling Messages
41 ///
42 /// `OnionMessenger` implements [`OnionMessageHandler`], making it responsible for either forwarding
43 /// messages to peers or delegating to the appropriate handler for the message type. Currently, the
44 /// available handlers are:
45 /// * [`OffersMessageHandler`], for responding to [`InvoiceRequest`]s and paying [`Bolt12Invoice`]s
46 /// * [`CustomOnionMessageHandler`], for handling user-defined message types
47 ///
48 /// # Sending Messages
49 ///
50 /// [`OnionMessage`]s are sent initially using [`OnionMessenger::send_onion_message`]. When handling
51 /// a message, the matched handler may return a response message which `OnionMessenger` will send
52 /// on its behalf.
53 ///
54 /// # Example
55 ///
56 /// ```
57 /// # extern crate bitcoin;
58 /// # use bitcoin::hashes::_export::_core::time::Duration;
59 /// # use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
60 /// # use lightning::blinded_path::BlindedPath;
61 /// # use lightning::sign::KeysManager;
62 /// # use lightning::ln::peer_handler::IgnoringMessageHandler;
63 /// # use lightning::onion_message::{CustomOnionMessageContents, Destination, MessageRouter, OnionMessageContents, OnionMessagePath, OnionMessenger};
64 /// # use lightning::util::logger::{Logger, Record};
65 /// # use lightning::util::ser::{Writeable, Writer};
66 /// # use lightning::io;
67 /// # use std::sync::Arc;
68 /// # struct FakeLogger;
69 /// # impl Logger for FakeLogger {
70 /// #     fn log(&self, record: &Record) { unimplemented!() }
71 /// # }
72 /// # struct FakeMessageRouter {}
73 /// # impl MessageRouter for FakeMessageRouter {
74 /// #     fn find_path(&self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination) -> Result<OnionMessagePath, ()> {
75 /// #         unimplemented!()
76 /// #     }
77 /// # }
78 /// # let seed = [42u8; 32];
79 /// # let time = Duration::from_secs(123456);
80 /// # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos());
81 /// # let logger = Arc::new(FakeLogger {});
82 /// # let node_secret = SecretKey::from_slice(&hex::decode("0101010101010101010101010101010101010101010101010101010101010101").unwrap()[..]).unwrap();
83 /// # let secp_ctx = Secp256k1::new();
84 /// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
85 /// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
86 /// # let destination_node_id = hop_node_id1;
87 /// # let message_router = Arc::new(FakeMessageRouter {});
88 /// # let custom_message_handler = IgnoringMessageHandler {};
89 /// # let offers_message_handler = IgnoringMessageHandler {};
90 /// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
91 /// // ChannelManager.
92 /// let onion_messenger = OnionMessenger::new(
93 ///     &keys_manager, &keys_manager, logger, message_router, &offers_message_handler,
94 ///     &custom_message_handler
95 /// );
96 ///
97 /// # struct YourCustomMessage {}
98 /// impl Writeable for YourCustomMessage {
99 ///     fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
100 ///             # Ok(())
101 ///             // Write your custom onion message to `w`
102 ///     }
103 /// }
104 /// impl CustomOnionMessageContents for YourCustomMessage {
105 ///     fn tlv_type(&self) -> u64 {
106 ///             # let your_custom_message_type = 42;
107 ///             your_custom_message_type
108 ///     }
109 /// }
110 /// // Send a custom onion message to a node id.
111 /// let path = OnionMessagePath {
112 ///     intermediate_nodes: vec![hop_node_id1, hop_node_id2],
113 ///     destination: Destination::Node(destination_node_id),
114 /// };
115 /// let reply_path = None;
116 /// # let your_custom_message = YourCustomMessage {};
117 /// let message = OnionMessageContents::Custom(your_custom_message);
118 /// onion_messenger.send_onion_message(path, message, reply_path);
119 ///
120 /// // Create a blinded path to yourself, for someone to send an onion message to.
121 /// # let your_node_id = hop_node_id1;
122 /// let hops = [hop_node_id3, hop_node_id4, your_node_id];
123 /// let blinded_path = BlindedPath::new_for_message(&hops, &keys_manager, &secp_ctx).unwrap();
124 ///
125 /// // Send a custom onion message to a blinded path.
126 /// let path = OnionMessagePath {
127 ///     intermediate_nodes: vec![hop_node_id1, hop_node_id2],
128 ///     destination: Destination::BlindedPath(blinded_path),
129 /// };
130 /// let reply_path = None;
131 /// # let your_custom_message = YourCustomMessage {};
132 /// let message = OnionMessageContents::Custom(your_custom_message);
133 /// onion_messenger.send_onion_message(path, message, reply_path);
134 /// ```
135 ///
136 /// [`OnionMessage`]: crate::ln::msgs::OnionMessage
137 /// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
138 /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
139 pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
140 where
141         ES::Target: EntropySource,
142         NS::Target: NodeSigner,
143         L::Target: Logger,
144         MR::Target: MessageRouter,
145         OMH::Target: OffersMessageHandler,
146         CMH:: Target: CustomOnionMessageHandler,
147 {
148         entropy_source: ES,
149         node_signer: NS,
150         logger: L,
151         pending_messages: Mutex<HashMap<PublicKey, VecDeque<msgs::OnionMessage>>>,
152         secp_ctx: Secp256k1<secp256k1::All>,
153         message_router: MR,
154         offers_handler: OMH,
155         custom_handler: CMH,
156 }
157
158 /// A trait defining behavior for routing an [`OnionMessage`].
159 ///
160 /// [`OnionMessage`]: msgs::OnionMessage
161 pub trait MessageRouter {
162         /// Returns a route for sending an [`OnionMessage`] to the given [`Destination`].
163         ///
164         /// [`OnionMessage`]: msgs::OnionMessage
165         fn find_path(
166                 &self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination
167         ) -> Result<OnionMessagePath, ()>;
168 }
169
170 /// A [`MessageRouter`] that always fails.
171 pub struct DefaultMessageRouter;
172
173 impl MessageRouter for DefaultMessageRouter {
174         fn find_path(
175                 &self, _sender: PublicKey, _peers: Vec<PublicKey>, _destination: Destination
176         ) -> Result<OnionMessagePath, ()> {
177                 Err(())
178         }
179 }
180
181 /// A path for sending an [`msgs::OnionMessage`].
182 #[derive(Clone)]
183 pub struct OnionMessagePath {
184         /// Nodes on the path between the sender and the destination.
185         pub intermediate_nodes: Vec<PublicKey>,
186
187         /// The recipient of the message.
188         pub destination: Destination,
189 }
190
191 /// The destination of an onion message.
192 #[derive(Clone)]
193 pub enum Destination {
194         /// We're sending this onion message to a node.
195         Node(PublicKey),
196         /// We're sending this onion message to a blinded path.
197         BlindedPath(BlindedPath),
198 }
199
200 impl Destination {
201         pub(super) fn num_hops(&self) -> usize {
202                 match self {
203                         Destination::Node(_) => 1,
204                         Destination::BlindedPath(BlindedPath { blinded_hops, .. }) => blinded_hops.len(),
205                 }
206         }
207 }
208
209 /// Errors that may occur when [sending an onion message].
210 ///
211 /// [sending an onion message]: OnionMessenger::send_onion_message
212 #[derive(Debug, PartialEq, Eq)]
213 pub enum SendError {
214         /// Errored computing onion message packet keys.
215         Secp256k1(secp256k1::Error),
216         /// Because implementations such as Eclair will drop onion messages where the message packet
217         /// exceeds 32834 bytes, we refuse to send messages where the packet exceeds this size.
218         TooBigPacket,
219         /// The provided [`Destination`] was an invalid [`BlindedPath`], due to having fewer than two
220         /// blinded hops.
221         TooFewBlindedHops,
222         /// Our next-hop peer was offline or does not support onion message forwarding.
223         InvalidFirstHop,
224         /// Onion message contents must have a TLV type >= 64.
225         InvalidMessage,
226         /// Our next-hop peer's buffer was full or our total outbound buffer was full.
227         BufferFull,
228         /// Failed to retrieve our node id from the provided [`NodeSigner`].
229         ///
230         /// [`NodeSigner`]: crate::sign::NodeSigner
231         GetNodeIdFailed,
232         /// We attempted to send to a blinded path where we are the introduction node, and failed to
233         /// advance the blinded path to make the second hop the new introduction node. Either
234         /// [`NodeSigner::ecdh`] failed, we failed to tweak the current blinding point to get the
235         /// new blinding point, or we were attempting to send to ourselves.
236         BlindedPathAdvanceFailed,
237 }
238
239 /// Handler for custom onion messages. If you are using [`SimpleArcOnionMessenger`],
240 /// [`SimpleRefOnionMessenger`], or prefer to ignore inbound custom onion messages,
241 /// [`IgnoringMessageHandler`] must be provided to [`OnionMessenger::new`]. Otherwise, a custom
242 /// implementation of this trait must be provided, with [`CustomMessage`] specifying the supported
243 /// message types.
244 ///
245 /// See [`OnionMessenger`] for example usage.
246 ///
247 /// [`IgnoringMessageHandler`]: crate::ln::peer_handler::IgnoringMessageHandler
248 /// [`CustomMessage`]: Self::CustomMessage
249 pub trait CustomOnionMessageHandler {
250         /// The message known to the handler. To support multiple message types, you may want to make this
251         /// an enum with a variant for each supported message.
252         type CustomMessage: CustomOnionMessageContents;
253
254         /// Called with the custom message that was received, returning a response to send, if any.
255         fn handle_custom_message(&self, msg: Self::CustomMessage) -> Option<Self::CustomMessage>;
256
257         /// Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
258         /// message type is unknown.
259         fn read_custom_message<R: io::Read>(&self, message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError>;
260 }
261
262 /// A processed incoming onion message, containing either a Forward (another onion message)
263 /// or a Receive payload with decrypted contents.
264 pub enum PeeledOnion<CM: CustomOnionMessageContents> {
265         /// Forwarded onion, with the next node id and a new onion
266         Forward(PublicKey, msgs::OnionMessage),
267         /// Received onion message, with decrypted contents, path_id, and reply path
268         Receive(OnionMessageContents<CM>, Option<[u8; 32]>, Option<BlindedPath>)
269 }
270
271 /// Create an onion message with contents `message` to the destination of `path`.
272 /// Returns (introduction_node_id, onion_msg)
273 pub fn create_onion_message<ES: Deref, NS: Deref, T: CustomOnionMessageContents>(
274         entropy_source: &ES, node_signer: &NS, secp_ctx: &Secp256k1<secp256k1::All>,
275         path: OnionMessagePath, message: OnionMessageContents<T>, reply_path: Option<BlindedPath>,
276 ) -> Result<(PublicKey, msgs::OnionMessage), SendError>
277 where
278         ES::Target: EntropySource,
279         NS::Target: NodeSigner,
280 {
281         let OnionMessagePath { intermediate_nodes, mut destination } = path;
282         if let Destination::BlindedPath(BlindedPath { ref blinded_hops, .. }) = destination {
283                 if blinded_hops.len() < 2 {
284                         return Err(SendError::TooFewBlindedHops);
285                 }
286         }
287
288         if message.tlv_type() < 64 { return Err(SendError::InvalidMessage) }
289
290         // If we are sending straight to a blinded path and we are the introduction node, we need to
291         // advance the blinded path by 1 hop so the second hop is the new introduction node.
292         if intermediate_nodes.len() == 0 {
293                 if let Destination::BlindedPath(ref mut blinded_path) = destination {
294                         let our_node_id = node_signer.get_node_id(Recipient::Node)
295                                 .map_err(|()| SendError::GetNodeIdFailed)?;
296                         if blinded_path.introduction_node_id == our_node_id {
297                                 advance_path_by_one(blinded_path, node_signer, &secp_ctx)
298                                         .map_err(|()| SendError::BlindedPathAdvanceFailed)?;
299                         }
300                 }
301         }
302
303         let blinding_secret_bytes = entropy_source.get_secure_random_bytes();
304         let blinding_secret = SecretKey::from_slice(&blinding_secret_bytes[..]).expect("RNG is busted");
305         let (introduction_node_id, blinding_point) = if intermediate_nodes.len() != 0 {
306                 (intermediate_nodes[0], PublicKey::from_secret_key(&secp_ctx, &blinding_secret))
307         } else {
308                 match destination {
309                         Destination::Node(pk) => (pk, PublicKey::from_secret_key(&secp_ctx, &blinding_secret)),
310                         Destination::BlindedPath(BlindedPath { introduction_node_id, blinding_point, .. }) =>
311                                 (introduction_node_id, blinding_point),
312                 }
313         };
314         let (packet_payloads, packet_keys) = packet_payloads_and_keys(
315                 &secp_ctx, &intermediate_nodes, destination, message, reply_path, &blinding_secret)
316                 .map_err(|e| SendError::Secp256k1(e))?;
317
318         let prng_seed = entropy_source.get_secure_random_bytes();
319         let onion_routing_packet = construct_onion_message_packet(
320                 packet_payloads, packet_keys, prng_seed).map_err(|()| SendError::TooBigPacket)?;
321
322         Ok((introduction_node_id, msgs::OnionMessage {
323                 blinding_point,
324                 onion_routing_packet
325         }))
326 }
327
328 /// Decode one layer of an incoming onion message
329 /// Returns either a Forward (another onion message), or Receive (decrypted content)
330 pub fn peel_onion<NS: Deref, L: Deref, CMH: Deref>(
331         node_signer: NS, secp_ctx: &Secp256k1<secp256k1::All>, logger: L, custom_handler: CMH,
332         msg: &msgs::OnionMessage,
333 ) -> Result<PeeledOnion<<<CMH>::Target as CustomOnionMessageHandler>::CustomMessage>, ()>
334 where
335         NS::Target: NodeSigner,
336         L::Target: Logger,
337         CMH::Target: CustomOnionMessageHandler,
338 {
339         let control_tlvs_ss = match node_signer.ecdh(Recipient::Node, &msg.blinding_point, None) {
340                 Ok(ss) => ss,
341                 Err(e) =>  {
342                         log_error!(logger, "Failed to retrieve node secret: {:?}", e);
343                         return Err(());
344                 }
345         };
346         let onion_decode_ss = {
347                 let blinding_factor = {
348                         let mut hmac = HmacEngine::<Sha256>::new(b"blinded_node_id");
349                         hmac.input(control_tlvs_ss.as_ref());
350                         Hmac::from_engine(hmac).into_inner()
351                 };
352                 match node_signer.ecdh(Recipient::Node, &msg.onion_routing_packet.public_key,
353                         Some(&Scalar::from_be_bytes(blinding_factor).unwrap()))
354                 {
355                         Ok(ss) => ss.secret_bytes(),
356                         Err(()) => {
357                                 log_trace!(logger, "Failed to compute onion packet shared secret");
358                                 return Err(());
359                         }
360                 }
361         };
362         match onion_utils::decode_next_untagged_hop(
363                 onion_decode_ss, &msg.onion_routing_packet.hop_data[..], msg.onion_routing_packet.hmac,
364                 (control_tlvs_ss, custom_handler.deref(), logger.deref())
365         ) {
366                 Ok((Payload::Receive::<<<CMH as Deref>::Target as CustomOnionMessageHandler>::CustomMessage> {
367                         message, control_tlvs: ReceiveControlTlvs::Unblinded(ReceiveTlvs { path_id }), reply_path,
368                 }, None)) => {
369                         Ok(PeeledOnion::Receive(message, path_id, reply_path))
370                 },
371                 Ok((Payload::Forward(ForwardControlTlvs::Unblinded(ForwardTlvs {
372                         next_node_id, next_blinding_override
373                 })), Some((next_hop_hmac, new_packet_bytes)))) => {
374                         // TODO: we need to check whether `next_node_id` is our node, in which case this is a dummy
375                         // blinded hop and this onion message is destined for us. In this situation, we should keep
376                         // unwrapping the onion layers to get to the final payload. Since we don't have the option
377                         // of creating blinded paths with dummy hops currently, we should be ok to not handle this
378                         // for now.
379                         let new_pubkey = match onion_utils::next_hop_pubkey(&secp_ctx, msg.onion_routing_packet.public_key, &onion_decode_ss) {
380                                 Ok(pk) => pk,
381                                 Err(e) => {
382                                         log_trace!(logger, "Failed to compute next hop packet pubkey: {}", e);
383                                         return Err(())
384                                 }
385                         };
386                         let outgoing_packet = Packet {
387                                 version: 0,
388                                 public_key: new_pubkey,
389                                 hop_data: new_packet_bytes,
390                                 hmac: next_hop_hmac,
391                         };
392                         let onion_message = msgs::OnionMessage {
393                                 blinding_point: match next_blinding_override {
394                                         Some(blinding_point) => blinding_point,
395                                         None => {
396                                                 match onion_utils::next_hop_pubkey(
397                                                         &secp_ctx, msg.blinding_point, control_tlvs_ss.as_ref()
398                                                 ) {
399                                                         Ok(bp) => bp,
400                                                         Err(e) => {
401                                                                 log_trace!(logger, "Failed to compute next blinding point: {}", e);
402                                                                 return Err(())
403                                                         }
404                                                 }
405                                         }
406                                 },
407                                 onion_routing_packet: outgoing_packet,
408                         };
409
410                         Ok(PeeledOnion::Forward(next_node_id, onion_message))
411                 },
412                 Err(e) => {
413                         log_trace!(logger, "Errored decoding onion message packet: {:?}", e);
414                         Err(())
415                 },
416                 _ => {
417                         log_trace!(logger, "Received bogus onion message packet, either the sender encoded a final hop as a forwarding hop or vice versa");
418                         Err(())
419                 },
420         }
421 }
422
423 impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
424 OnionMessenger<ES, NS, L, MR, OMH, CMH>
425 where
426         ES::Target: EntropySource,
427         NS::Target: NodeSigner,
428         L::Target: Logger,
429         MR::Target: MessageRouter,
430         OMH::Target: OffersMessageHandler,
431         CMH::Target: CustomOnionMessageHandler,
432 {
433         /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
434         /// their respective handlers.
435         pub fn new(
436                 entropy_source: ES, node_signer: NS, logger: L, message_router: MR, offers_handler: OMH,
437                 custom_handler: CMH
438         ) -> Self {
439                 let mut secp_ctx = Secp256k1::new();
440                 secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
441                 OnionMessenger {
442                         entropy_source,
443                         node_signer,
444                         pending_messages: Mutex::new(HashMap::new()),
445                         secp_ctx,
446                         logger,
447                         message_router,
448                         offers_handler,
449                         custom_handler,
450                 }
451         }
452
453         /// Send an onion message with contents `message` to the destination of `path`.
454         ///
455         /// See [`OnionMessenger`] for example usage.
456         pub fn send_onion_message<T: CustomOnionMessageContents>(
457                 &self, path: OnionMessagePath, message: OnionMessageContents<T>,
458                 reply_path: Option<BlindedPath>
459         ) -> Result<(), SendError> {
460                 let (introduction_node_id, onion_msg) = create_onion_message(
461                         &self.entropy_source, &self.node_signer, &self.secp_ctx,
462                         path, message, reply_path
463                 )?;
464
465                 let mut pending_per_peer_msgs = self.pending_messages.lock().unwrap();
466                 if outbound_buffer_full(&introduction_node_id, &pending_per_peer_msgs) { return Err(SendError::BufferFull) }
467                 match pending_per_peer_msgs.entry(introduction_node_id) {
468                         hash_map::Entry::Vacant(_) => Err(SendError::InvalidFirstHop),
469                         hash_map::Entry::Occupied(mut e) => {
470                                 e.get_mut().push_back(onion_msg);
471                                 Ok(())
472                         }
473                 }
474         }
475
476         fn respond_with_onion_message<T: CustomOnionMessageContents>(
477                 &self, response: OnionMessageContents<T>, path_id: Option<[u8; 32]>,
478                 reply_path: Option<BlindedPath>
479         ) {
480                 let sender = match self.node_signer.get_node_id(Recipient::Node) {
481                         Ok(node_id) => node_id,
482                         Err(_) => {
483                                 log_warn!(
484                                         self.logger, "Unable to retrieve node id when responding to onion message with \
485                                         path_id {:02x?}", path_id
486                                 );
487                                 return;
488                         }
489                 };
490
491                 let peers = self.pending_messages.lock().unwrap().keys().copied().collect();
492
493                 let destination = match reply_path {
494                         Some(reply_path) => Destination::BlindedPath(reply_path),
495                         None => {
496                                 log_trace!(
497                                         self.logger, "Missing reply path when responding to onion message with path_id \
498                                         {:02x?}", path_id
499                                 );
500                                 return;
501                         },
502                 };
503
504                 let path = match self.message_router.find_path(sender, peers, destination) {
505                         Ok(path) => path,
506                         Err(()) => {
507                                 log_trace!(
508                                         self.logger, "Failed to find path when responding to onion message with \
509                                         path_id {:02x?}", path_id
510                                 );
511                                 return;
512                         },
513                 };
514
515                 log_trace!(self.logger, "Responding to onion message with path_id {:02x?}", path_id);
516
517                 if let Err(e) = self.send_onion_message(path, response, None) {
518                         log_trace!(
519                                 self.logger, "Failed responding to onion message with path_id {:02x?}: {:?}",
520                                 path_id, e
521                         );
522                         return;
523                 }
524         }
525
526         #[cfg(test)]
527         pub(super) fn release_pending_msgs(&self) -> HashMap<PublicKey, VecDeque<msgs::OnionMessage>> {
528                 let mut pending_msgs = self.pending_messages.lock().unwrap();
529                 let mut msgs = HashMap::new();
530                 // We don't want to disconnect the peers by removing them entirely from the original map, so we
531                 // swap the pending message buffers individually.
532                 for (peer_node_id, pending_messages) in &mut *pending_msgs {
533                         msgs.insert(*peer_node_id, core::mem::take(pending_messages));
534                 }
535                 msgs
536         }
537 }
538
539 fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, VecDeque<msgs::OnionMessage>>) -> bool {
540         const MAX_TOTAL_BUFFER_SIZE: usize = (1 << 20) * 128;
541         const MAX_PER_PEER_BUFFER_SIZE: usize = (1 << 10) * 256;
542         let mut total_buffered_bytes = 0;
543         let mut peer_buffered_bytes = 0;
544         for (pk, peer_buf) in buffer {
545                 for om in peer_buf {
546                         let om_len = om.serialized_length();
547                         if pk == peer_node_id {
548                                 peer_buffered_bytes += om_len;
549                         }
550                         total_buffered_bytes += om_len;
551
552                         if total_buffered_bytes >= MAX_TOTAL_BUFFER_SIZE ||
553                                 peer_buffered_bytes >= MAX_PER_PEER_BUFFER_SIZE
554                         {
555                                 return true
556                         }
557                 }
558         }
559         false
560 }
561
562 impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
563 for OnionMessenger<ES, NS, L, MR, OMH, CMH>
564 where
565         ES::Target: EntropySource,
566         NS::Target: NodeSigner,
567         L::Target: Logger,
568         MR::Target: MessageRouter,
569         OMH::Target: OffersMessageHandler,
570         CMH::Target: CustomOnionMessageHandler,
571 {
572         /// Handle an incoming onion message. Currently, if a message was destined for us we will log, but
573         /// soon we'll delegate the onion message to a handler that can generate invoices or send
574         /// payments.
575         fn handle_onion_message(&self, _peer_node_id: &PublicKey, msg: &msgs::OnionMessage) {
576                 match peel_onion(
577                         &*self.node_signer, &self.secp_ctx, &*self.logger, &*self.custom_handler, msg
578                 ) {
579                         Ok(PeeledOnion::Receive(message, path_id, reply_path)) => {
580                                 log_trace!(self.logger,
581                                         "Received an onion message with path_id {:02x?} and {} reply_path",
582                                                 path_id, if reply_path.is_some() { "a" } else { "no" });
583                                 let response = match message {
584                                         OnionMessageContents::Offers(msg) => {
585                                                 self.offers_handler.handle_message(msg)
586                                                         .map(|msg| OnionMessageContents::Offers(msg))
587                                         },
588                                         OnionMessageContents::Custom(msg) => {
589                                                 self.custom_handler.handle_custom_message(msg)
590                                                         .map(|msg| OnionMessageContents::Custom(msg))
591                                         },
592                                 };
593                                 if let Some(response) = response {
594                                         self.respond_with_onion_message(response, path_id, reply_path);
595                                 }
596                         },
597                         Ok(PeeledOnion::Forward(next_node_id, onion_message)) => {
598                                 let mut pending_per_peer_msgs = self.pending_messages.lock().unwrap();
599                                 if outbound_buffer_full(&next_node_id, &pending_per_peer_msgs) {
600                                         log_trace!(self.logger, "Dropping forwarded onion message to peer {:?}: outbound buffer full", next_node_id);
601                                         return
602                                 }
603
604                                 #[cfg(fuzzing)]
605                                 pending_per_peer_msgs.entry(next_node_id).or_insert_with(VecDeque::new);
606
607                                 match pending_per_peer_msgs.entry(next_node_id) {
608                                         hash_map::Entry::Vacant(_) => {
609                                                 log_trace!(self.logger, "Dropping forwarded onion message to disconnected peer {:?}", next_node_id);
610                                                 return
611                                         },
612                                         hash_map::Entry::Occupied(mut e) => {
613                                                 e.get_mut().push_back(onion_message);
614                                                 log_trace!(self.logger, "Forwarding an onion message to peer {}", next_node_id);
615                                         }
616                                 }
617                         },
618                         Err(e) => {
619                                 log_error!(self.logger, "Failed to process onion message {:?}", e);
620                         }
621                 }
622         }
623
624         fn peer_connected(&self, their_node_id: &PublicKey, init: &msgs::Init, _inbound: bool) -> Result<(), ()> {
625                 if init.features.supports_onion_messages() {
626                         let mut peers = self.pending_messages.lock().unwrap();
627                         peers.insert(their_node_id.clone(), VecDeque::new());
628                 }
629                 Ok(())
630         }
631
632         fn peer_disconnected(&self, their_node_id: &PublicKey) {
633                 let mut pending_msgs = self.pending_messages.lock().unwrap();
634                 pending_msgs.remove(their_node_id);
635         }
636
637         fn provided_node_features(&self) -> NodeFeatures {
638                 let mut features = NodeFeatures::empty();
639                 features.set_onion_messages_optional();
640                 features
641         }
642
643         fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
644                 let mut features = InitFeatures::empty();
645                 features.set_onion_messages_optional();
646                 features
647         }
648 }
649
650 impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageProvider
651 for OnionMessenger<ES, NS, L, MR, OMH, CMH>
652 where
653         ES::Target: EntropySource,
654         NS::Target: NodeSigner,
655         L::Target: Logger,
656         MR::Target: MessageRouter,
657         OMH::Target: OffersMessageHandler,
658         CMH::Target: CustomOnionMessageHandler,
659 {
660         fn next_onion_message_for_peer(&self, peer_node_id: PublicKey) -> Option<msgs::OnionMessage> {
661                 let mut pending_msgs = self.pending_messages.lock().unwrap();
662                 if let Some(msgs) = pending_msgs.get_mut(&peer_node_id) {
663                         return msgs.pop_front()
664                 }
665                 None
666         }
667 }
668
669 // TODO: parameterize the below Simple* types with OnionMessenger and handle the messages it
670 // produces
671 /// Useful for simplifying the parameters of [`SimpleArcChannelManager`] and
672 /// [`SimpleArcPeerManager`]. See their docs for more details.
673 ///
674 /// This is not exported to bindings users as `Arc`s don't make sense in bindings.
675 ///
676 /// [`SimpleArcChannelManager`]: crate::ln::channelmanager::SimpleArcChannelManager
677 /// [`SimpleArcPeerManager`]: crate::ln::peer_handler::SimpleArcPeerManager
678 pub type SimpleArcOnionMessenger<L> = OnionMessenger<
679         Arc<KeysManager>,
680         Arc<KeysManager>,
681         Arc<L>,
682         Arc<DefaultMessageRouter>,
683         IgnoringMessageHandler,
684         IgnoringMessageHandler
685 >;
686
687 /// Useful for simplifying the parameters of [`SimpleRefChannelManager`] and
688 /// [`SimpleRefPeerManager`]. See their docs for more details.
689 ///
690 /// This is not exported to bindings users as general type aliases don't make sense in bindings.
691 ///
692 /// [`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
693 /// [`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
694 pub type SimpleRefOnionMessenger<'a, 'b, 'c, L> = OnionMessenger<
695         &'a KeysManager,
696         &'a KeysManager,
697         &'b L,
698         &'c DefaultMessageRouter,
699         IgnoringMessageHandler,
700         IgnoringMessageHandler
701 >;
702
703 /// Construct onion packet payloads and keys for sending an onion message along the given
704 /// `unblinded_path` to the given `destination`.
705 fn packet_payloads_and_keys<T: CustomOnionMessageContents, S: secp256k1::Signing + secp256k1::Verification>(
706         secp_ctx: &Secp256k1<S>, unblinded_path: &[PublicKey], destination: Destination,
707         message: OnionMessageContents<T>, mut reply_path: Option<BlindedPath>, session_priv: &SecretKey
708 ) -> Result<(Vec<(Payload<T>, [u8; 32])>, Vec<onion_utils::OnionKeys>), secp256k1::Error> {
709         let num_hops = unblinded_path.len() + destination.num_hops();
710         let mut payloads = Vec::with_capacity(num_hops);
711         let mut onion_packet_keys = Vec::with_capacity(num_hops);
712
713         let (mut intro_node_id_blinding_pt, num_blinded_hops) = if let Destination::BlindedPath(BlindedPath {
714                 introduction_node_id, blinding_point, blinded_hops }) = &destination {
715                 (Some((*introduction_node_id, *blinding_point)), blinded_hops.len()) } else { (None, 0) };
716         let num_unblinded_hops = num_hops - num_blinded_hops;
717
718         let mut unblinded_path_idx = 0;
719         let mut blinded_path_idx = 0;
720         let mut prev_control_tlvs_ss = None;
721         let mut final_control_tlvs = None;
722         utils::construct_keys_callback(secp_ctx, unblinded_path.iter(), Some(destination), session_priv,
723                 |_, onion_packet_ss, ephemeral_pubkey, control_tlvs_ss, unblinded_pk_opt, enc_payload_opt| {
724                         if num_unblinded_hops != 0 && unblinded_path_idx < num_unblinded_hops {
725                                 if let Some(ss) = prev_control_tlvs_ss.take() {
726                                         payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(
727                                                 ForwardTlvs {
728                                                         next_node_id: unblinded_pk_opt.unwrap(),
729                                                         next_blinding_override: None,
730                                                 }
731                                         )), ss));
732                                 }
733                                 prev_control_tlvs_ss = Some(control_tlvs_ss);
734                                 unblinded_path_idx += 1;
735                         } else if let Some((intro_node_id, blinding_pt)) = intro_node_id_blinding_pt.take() {
736                                 if let Some(control_tlvs_ss) = prev_control_tlvs_ss.take() {
737                                         payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(ForwardTlvs {
738                                                 next_node_id: intro_node_id,
739                                                 next_blinding_override: Some(blinding_pt),
740                                         })), control_tlvs_ss));
741                                 }
742                         }
743                         if blinded_path_idx < num_blinded_hops.saturating_sub(1) && enc_payload_opt.is_some() {
744                                 payloads.push((Payload::Forward(ForwardControlTlvs::Blinded(enc_payload_opt.unwrap())),
745                                         control_tlvs_ss));
746                                 blinded_path_idx += 1;
747                         } else if let Some(encrypted_payload) = enc_payload_opt {
748                                 final_control_tlvs = Some(ReceiveControlTlvs::Blinded(encrypted_payload));
749                                 prev_control_tlvs_ss = Some(control_tlvs_ss);
750                         }
751
752                         let (rho, mu) = onion_utils::gen_rho_mu_from_shared_secret(onion_packet_ss.as_ref());
753                         onion_packet_keys.push(onion_utils::OnionKeys {
754                                 #[cfg(test)]
755                                 shared_secret: onion_packet_ss,
756                                 #[cfg(test)]
757                                 blinding_factor: [0; 32],
758                                 ephemeral_pubkey,
759                                 rho,
760                                 mu,
761                         });
762                 }
763         )?;
764
765         if let Some(control_tlvs) = final_control_tlvs {
766                 payloads.push((Payload::Receive {
767                         control_tlvs,
768                         reply_path: reply_path.take(),
769                         message,
770                 }, prev_control_tlvs_ss.unwrap()));
771         } else {
772                 payloads.push((Payload::Receive {
773                         control_tlvs: ReceiveControlTlvs::Unblinded(ReceiveTlvs { path_id: None, }),
774                         reply_path: reply_path.take(),
775                         message,
776                 }, prev_control_tlvs_ss.unwrap()));
777         }
778
779         Ok((payloads, onion_packet_keys))
780 }
781
782 /// Errors if the serialized payload size exceeds onion_message::BIG_PACKET_HOP_DATA_LEN
783 fn construct_onion_message_packet<T: CustomOnionMessageContents>(payloads: Vec<(Payload<T>, [u8; 32])>, onion_keys: Vec<onion_utils::OnionKeys>, prng_seed: [u8; 32]) -> Result<Packet, ()> {
784         // Spec rationale:
785         // "`len` allows larger messages to be sent than the standard 1300 bytes allowed for an HTLC
786         // onion, but this should be used sparingly as it is reduces anonymity set, hence the
787         // recommendation that it either look like an HTLC onion, or if larger, be a fixed size."
788         let payloads_ser_len = onion_utils::payloads_serialized_length(&payloads);
789         let hop_data_len = if payloads_ser_len <= SMALL_PACKET_HOP_DATA_LEN {
790                 SMALL_PACKET_HOP_DATA_LEN
791         } else if payloads_ser_len <= BIG_PACKET_HOP_DATA_LEN {
792                 BIG_PACKET_HOP_DATA_LEN
793         } else { return Err(()) };
794
795         onion_utils::construct_onion_message_packet::<_, _>(
796                 payloads, onion_keys, prng_seed, hop_data_len)
797 }