1use bitcoin::hashes::{Hash, HashEngine};
14use bitcoin::hashes::hmac::{Hmac, HmacEngine};
15use bitcoin::hashes::sha256::Hash as Sha256;
16use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
17
18use crate::chain::keysinterface::{KeysInterface, KeysManager, Recipient};
19use crate::ln::features::{InitFeatures, NodeFeatures};
20use crate::ln::msgs::{self, OnionMessageHandler};
21use crate::ln::onion_utils;
22use crate::ln::peer_handler::IgnoringMessageHandler;
23use super::blinded_path::{BlindedPath, ForwardTlvs, ReceiveTlvs};
24pub use super::packet::{CustomOnionMessageContents, OnionMessageContents};
25use super::packet::{BIG_PACKET_HOP_DATA_LEN, ForwardControlTlvs, Packet, Payload, ReceiveControlTlvs, SMALL_PACKET_HOP_DATA_LEN};
26use super::utils;
27use crate::util::events::OnionMessageProvider;
28use crate::util::logger::Logger;
29use crate::util::ser::Writeable;
30
31use core::ops::Deref;
32use crate::io;
33use crate::sync::{Arc, Mutex};
34use crate::prelude::*;
35
36pub struct OnionMessenger<K: Deref, L: Deref, CMH: Deref>
108 where K::Target: KeysInterface,
109 L::Target: Logger,
110 CMH:: Target: CustomOnionMessageHandler,
111{
112 keys_manager: K,
113 logger: L,
114 pending_messages: Mutex<HashMap<PublicKey, VecDeque<msgs::OnionMessage>>>,
115 secp_ctx: Secp256k1<secp256k1::All>,
116 custom_handler: CMH,
117 }
120
121pub enum Destination {
123 Node(PublicKey),
125 BlindedPath(BlindedPath),
127}
128
129impl Destination {
130 pub(super) fn num_hops(&self) -> usize {
131 match self {
132 Destination::Node(_) => 1,
133 Destination::BlindedPath(BlindedPath { blinded_hops, .. }) => blinded_hops.len(),
134 }
135 }
136}
137
138#[derive(Debug, PartialEq, Eq)]
142pub enum SendError {
143 Secp256k1(secp256k1::Error),
145 TooBigPacket,
148 TooFewBlindedHops,
151 InvalidFirstHop,
153 InvalidMessage,
155 BufferFull,
157 GetNodeIdFailed,
161 BlindedPathAdvanceFailed,
166}
167
168pub trait CustomOnionMessageHandler {
179 type CustomMessage: CustomOnionMessageContents;
182 fn handle_custom_message(&self, msg: Self::CustomMessage);
184 fn read_custom_message<R: io::Read>(&self, message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError>;
187}
188
189impl<K: Deref, L: Deref, CMH: Deref> OnionMessenger<K, L, CMH>
190 where K::Target: KeysInterface,
191 L::Target: Logger,
192 CMH::Target: CustomOnionMessageHandler,
193{
194 pub fn new(keys_manager: K, logger: L, custom_handler: CMH) -> Self {
197 let mut secp_ctx = Secp256k1::new();
198 secp_ctx.seeded_randomize(&keys_manager.get_secure_random_bytes());
199 OnionMessenger {
200 keys_manager,
201 pending_messages: Mutex::new(HashMap::new()),
202 secp_ctx,
203 logger,
204 custom_handler,
205 }
206 }
207
208 pub fn send_onion_message<T: CustomOnionMessageContents>(&self, intermediate_nodes: &[PublicKey], mut destination: Destination, message: OnionMessageContents<T>, reply_path: Option<BlindedPath>) -> Result<(), SendError> {
211 if let Destination::BlindedPath(BlindedPath { ref blinded_hops, .. }) = destination {
212 if blinded_hops.len() < 2 {
213 return Err(SendError::TooFewBlindedHops);
214 }
215 }
216 let OnionMessageContents::Custom(ref msg) = message;
217 if msg.tlv_type() < 64 { return Err(SendError::InvalidMessage) }
218
219 if intermediate_nodes.len() == 0 {
222 if let Destination::BlindedPath(ref mut blinded_path) = destination {
223 let our_node_id = self.keys_manager.get_node_id(Recipient::Node)
224 .map_err(|()| SendError::GetNodeIdFailed)?;
225 if blinded_path.introduction_node_id == our_node_id {
226 blinded_path.advance_by_one(&self.keys_manager, &self.secp_ctx)
227 .map_err(|()| SendError::BlindedPathAdvanceFailed)?;
228 }
229 }
230 }
231
232 let blinding_secret_bytes = self.keys_manager.get_secure_random_bytes();
233 let blinding_secret = SecretKey::from_slice(&blinding_secret_bytes[..]).expect("RNG is busted");
234 let (introduction_node_id, blinding_point) = if intermediate_nodes.len() != 0 {
235 (intermediate_nodes[0], PublicKey::from_secret_key(&self.secp_ctx, &blinding_secret))
236 } else {
237 match destination {
238 Destination::Node(pk) => (pk, PublicKey::from_secret_key(&self.secp_ctx, &blinding_secret)),
239 Destination::BlindedPath(BlindedPath { introduction_node_id, blinding_point, .. }) =>
240 (introduction_node_id, blinding_point),
241 }
242 };
243 let (packet_payloads, packet_keys) = packet_payloads_and_keys(
244 &self.secp_ctx, intermediate_nodes, destination, message, reply_path, &blinding_secret)
245 .map_err(|e| SendError::Secp256k1(e))?;
246
247 let prng_seed = self.keys_manager.get_secure_random_bytes();
248 let onion_routing_packet = construct_onion_message_packet(
249 packet_payloads, packet_keys, prng_seed).map_err(|()| SendError::TooBigPacket)?;
250
251 let mut pending_per_peer_msgs = self.pending_messages.lock().unwrap();
252 if outbound_buffer_full(&introduction_node_id, &pending_per_peer_msgs) { return Err(SendError::BufferFull) }
253 match pending_per_peer_msgs.entry(introduction_node_id) {
254 hash_map::Entry::Vacant(_) => Err(SendError::InvalidFirstHop),
255 hash_map::Entry::Occupied(mut e) => {
256 e.get_mut().push_back(msgs::OnionMessage { blinding_point, onion_routing_packet });
257 Ok(())
258 }
259 }
260 }
261
262 #[cfg(test)]
263 pub(super) fn release_pending_msgs(&self) -> HashMap<PublicKey, VecDeque<msgs::OnionMessage>> {
264 let mut pending_msgs = self.pending_messages.lock().unwrap();
265 let mut msgs = HashMap::new();
266 for (peer_node_id, pending_messages) in &mut *pending_msgs {
269 msgs.insert(*peer_node_id, core::mem::take(pending_messages));
270 }
271 msgs
272 }
273}
274
275fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, VecDeque<msgs::OnionMessage>>) -> bool {
276 const MAX_TOTAL_BUFFER_SIZE: usize = (1 << 20) * 128;
277 const MAX_PER_PEER_BUFFER_SIZE: usize = (1 << 10) * 256;
278 let mut total_buffered_bytes = 0;
279 let mut peer_buffered_bytes = 0;
280 for (pk, peer_buf) in buffer {
281 for om in peer_buf {
282 let om_len = om.serialized_length();
283 if pk == peer_node_id {
284 peer_buffered_bytes += om_len;
285 }
286 total_buffered_bytes += om_len;
287
288 if total_buffered_bytes >= MAX_TOTAL_BUFFER_SIZE ||
289 peer_buffered_bytes >= MAX_PER_PEER_BUFFER_SIZE
290 {
291 return true
292 }
293 }
294 }
295 false
296}
297
298impl<K: Deref, L: Deref, CMH: Deref> OnionMessageHandler for OnionMessenger<K, L, CMH>
299 where K::Target: KeysInterface,
300 L::Target: Logger,
301 CMH::Target: CustomOnionMessageHandler + Sized,
302{
303 fn handle_onion_message(&self, _peer_node_id: &PublicKey, msg: &msgs::OnionMessage) {
307 let control_tlvs_ss = match self.keys_manager.ecdh(Recipient::Node, &msg.blinding_point, None) {
308 Ok(ss) => ss,
309 Err(e) => {
310 log_error!(self.logger, "Failed to retrieve node secret: {:?}", e);
311 return
312 }
313 };
314 let onion_decode_ss = {
315 let blinding_factor = {
316 let mut hmac = HmacEngine::<Sha256>::new(b"blinded_node_id");
317 hmac.input(control_tlvs_ss.as_ref());
318 Hmac::from_engine(hmac).into_inner()
319 };
320 match self.keys_manager.ecdh(Recipient::Node, &msg.onion_routing_packet.public_key,
321 Some(&Scalar::from_be_bytes(blinding_factor).unwrap()))
322 {
323 Ok(ss) => ss.secret_bytes(),
324 Err(()) => {
325 log_trace!(self.logger, "Failed to compute onion packet shared secret");
326 return
327 }
328 }
329 };
330 match onion_utils::decode_next_untagged_hop(onion_decode_ss, &msg.onion_routing_packet.hop_data[..],
331 msg.onion_routing_packet.hmac, (control_tlvs_ss, &*self.custom_handler))
332 {
333 Ok((Payload::Receive::<<<CMH as Deref>::Target as CustomOnionMessageHandler>::CustomMessage> {
334 message, control_tlvs: ReceiveControlTlvs::Unblinded(ReceiveTlvs { path_id }), reply_path,
335 }, None)) => {
336 log_info!(self.logger,
337 "Received an onion message with path_id {:02x?} and {} reply_path",
338 path_id, if reply_path.is_some() { "a" } else { "no" });
339 match message {
340 OnionMessageContents::Custom(msg) => self.custom_handler.handle_custom_message(msg),
341 }
342 },
343 Ok((Payload::Forward(ForwardControlTlvs::Unblinded(ForwardTlvs {
344 next_node_id, next_blinding_override
345 })), Some((next_hop_hmac, new_packet_bytes)))) => {
346 let new_pubkey = match onion_utils::next_hop_packet_pubkey(&self.secp_ctx, msg.onion_routing_packet.public_key, &onion_decode_ss) {
352 Ok(pk) => pk,
353 Err(e) => {
354 log_trace!(self.logger, "Failed to compute next hop packet pubkey: {}", e);
355 return
356 }
357 };
358 let outgoing_packet = Packet {
359 version: 0,
360 public_key: new_pubkey,
361 hop_data: new_packet_bytes,
362 hmac: next_hop_hmac,
363 };
364 let onion_message = msgs::OnionMessage {
365 blinding_point: match next_blinding_override {
366 Some(blinding_point) => blinding_point,
367 None => {
368 let blinding_factor = {
369 let mut sha = Sha256::engine();
370 sha.input(&msg.blinding_point.serialize()[..]);
371 sha.input(control_tlvs_ss.as_ref());
372 Sha256::from_engine(sha).into_inner()
373 };
374 let next_blinding_point = msg.blinding_point;
375 match next_blinding_point.mul_tweak(&self.secp_ctx, &Scalar::from_be_bytes(blinding_factor).unwrap()) {
376 Ok(bp) => bp,
377 Err(e) => {
378 log_trace!(self.logger, "Failed to compute next blinding point: {}", e);
379 return
380 }
381 }
382 },
383 },
384 onion_routing_packet: outgoing_packet,
385 };
386
387 let mut pending_per_peer_msgs = self.pending_messages.lock().unwrap();
388 if outbound_buffer_full(&next_node_id, &pending_per_peer_msgs) {
389 log_trace!(self.logger, "Dropping forwarded onion message to peer {:?}: outbound buffer full", next_node_id);
390 return
391 }
392
393 #[cfg(fuzzing)]
394 pending_per_peer_msgs.entry(next_node_id).or_insert_with(VecDeque::new);
395
396 match pending_per_peer_msgs.entry(next_node_id) {
397 hash_map::Entry::Vacant(_) => {
398 log_trace!(self.logger, "Dropping forwarded onion message to disconnected peer {:?}", next_node_id);
399 return
400 },
401 hash_map::Entry::Occupied(mut e) => {
402 e.get_mut().push_back(onion_message);
403 log_trace!(self.logger, "Forwarding an onion message to peer {}", next_node_id);
404 }
405 };
406 },
407 Err(e) => {
408 log_trace!(self.logger, "Errored decoding onion message packet: {:?}", e);
409 },
410 _ => {
411 log_trace!(self.logger, "Received bogus onion message packet, either the sender encoded a final hop as a forwarding hop or vice versa");
412 },
413 };
414 }
415
416 fn peer_connected(&self, their_node_id: &PublicKey, init: &msgs::Init) -> Result<(), ()> {
417 if init.features.supports_onion_messages() {
418 let mut peers = self.pending_messages.lock().unwrap();
419 peers.insert(their_node_id.clone(), VecDeque::new());
420 }
421 Ok(())
422 }
423
424 fn peer_disconnected(&self, their_node_id: &PublicKey, _no_connection_possible: bool) {
425 let mut pending_msgs = self.pending_messages.lock().unwrap();
426 pending_msgs.remove(their_node_id);
427 }
428
429 fn provided_node_features(&self) -> NodeFeatures {
430 let mut features = NodeFeatures::empty();
431 features.set_onion_messages_optional();
432 features
433 }
434
435 fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
436 let mut features = InitFeatures::empty();
437 features.set_onion_messages_optional();
438 features
439 }
440}
441
442impl<K: Deref, L: Deref, CMH: Deref> OnionMessageProvider for OnionMessenger<K, L, CMH>
443 where K::Target: KeysInterface,
444 L::Target: Logger,
445 CMH::Target: CustomOnionMessageHandler,
446{
447 fn next_onion_message_for_peer(&self, peer_node_id: PublicKey) -> Option<msgs::OnionMessage> {
448 let mut pending_msgs = self.pending_messages.lock().unwrap();
449 if let Some(msgs) = pending_msgs.get_mut(&peer_node_id) {
450 return msgs.pop_front()
451 }
452 None
453 }
454}
455
456pub type SimpleArcOnionMessenger<L> = OnionMessenger<Arc<KeysManager>, Arc<L>, IgnoringMessageHandler>;
466pub type SimpleRefOnionMessenger<'a, 'b, L> = OnionMessenger<&'a KeysManager, &'b L, IgnoringMessageHandler>;
474
475fn packet_payloads_and_keys<T: CustomOnionMessageContents, S: secp256k1::Signing + secp256k1::Verification>(
478 secp_ctx: &Secp256k1<S>, unblinded_path: &[PublicKey], destination: Destination,
479 message: OnionMessageContents<T>, mut reply_path: Option<BlindedPath>, session_priv: &SecretKey
480) -> Result<(Vec<(Payload<T>, [u8; 32])>, Vec<onion_utils::OnionKeys>), secp256k1::Error> {
481 let num_hops = unblinded_path.len() + destination.num_hops();
482 let mut payloads = Vec::with_capacity(num_hops);
483 let mut onion_packet_keys = Vec::with_capacity(num_hops);
484
485 let (mut intro_node_id_blinding_pt, num_blinded_hops) = if let Destination::BlindedPath(BlindedPath {
486 introduction_node_id, blinding_point, blinded_hops }) = &destination {
487 (Some((*introduction_node_id, *blinding_point)), blinded_hops.len()) } else { (None, 0) };
488 let num_unblinded_hops = num_hops - num_blinded_hops;
489
490 let mut unblinded_path_idx = 0;
491 let mut blinded_path_idx = 0;
492 let mut prev_control_tlvs_ss = None;
493 let mut final_control_tlvs = None;
494 utils::construct_keys_callback(secp_ctx, unblinded_path, Some(destination), session_priv, |_, onion_packet_ss, ephemeral_pubkey, control_tlvs_ss, unblinded_pk_opt, enc_payload_opt| {
495 if num_unblinded_hops != 0 && unblinded_path_idx < num_unblinded_hops {
496 if let Some(ss) = prev_control_tlvs_ss.take() {
497 payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(
498 ForwardTlvs {
499 next_node_id: unblinded_pk_opt.unwrap(),
500 next_blinding_override: None,
501 }
502 )), ss));
503 }
504 prev_control_tlvs_ss = Some(control_tlvs_ss);
505 unblinded_path_idx += 1;
506 } else if let Some((intro_node_id, blinding_pt)) = intro_node_id_blinding_pt.take() {
507 if let Some(control_tlvs_ss) = prev_control_tlvs_ss.take() {
508 payloads.push((Payload::Forward(ForwardControlTlvs::Unblinded(ForwardTlvs {
509 next_node_id: intro_node_id,
510 next_blinding_override: Some(blinding_pt),
511 })), control_tlvs_ss));
512 }
513 }
514 if blinded_path_idx < num_blinded_hops.saturating_sub(1) && enc_payload_opt.is_some() {
515 payloads.push((Payload::Forward(ForwardControlTlvs::Blinded(enc_payload_opt.unwrap())),
516 control_tlvs_ss));
517 blinded_path_idx += 1;
518 } else if let Some(encrypted_payload) = enc_payload_opt {
519 final_control_tlvs = Some(ReceiveControlTlvs::Blinded(encrypted_payload));
520 prev_control_tlvs_ss = Some(control_tlvs_ss);
521 }
522
523 let (rho, mu) = onion_utils::gen_rho_mu_from_shared_secret(onion_packet_ss.as_ref());
524 onion_packet_keys.push(onion_utils::OnionKeys {
525 #[cfg(test)]
526 shared_secret: onion_packet_ss,
527 #[cfg(test)]
528 blinding_factor: [0; 32],
529 ephemeral_pubkey,
530 rho,
531 mu,
532 });
533 })?;
534
535 if let Some(control_tlvs) = final_control_tlvs {
536 payloads.push((Payload::Receive {
537 control_tlvs,
538 reply_path: reply_path.take(),
539 message,
540 }, prev_control_tlvs_ss.unwrap()));
541 } else {
542 payloads.push((Payload::Receive {
543 control_tlvs: ReceiveControlTlvs::Unblinded(ReceiveTlvs { path_id: None, }),
544 reply_path: reply_path.take(),
545 message,
546 }, prev_control_tlvs_ss.unwrap()));
547 }
548
549 Ok((payloads, onion_packet_keys))
550}
551
552fn construct_onion_message_packet<T: CustomOnionMessageContents>(payloads: Vec<(Payload<T>, [u8; 32])>, onion_keys: Vec<onion_utils::OnionKeys>, prng_seed: [u8; 32]) -> Result<Packet, ()> {
554 let payloads_ser_len = onion_utils::payloads_serialized_length(&payloads);
559 let hop_data_len = if payloads_ser_len <= SMALL_PACKET_HOP_DATA_LEN {
560 SMALL_PACKET_HOP_DATA_LEN
561 } else if payloads_ser_len <= BIG_PACKET_HOP_DATA_LEN {
562 BIG_PACKET_HOP_DATA_LEN
563 } else { return Err(()) };
564
565 Ok(onion_utils::construct_onion_message_packet::<_, _>(
566 payloads, onion_keys, prng_seed, hop_data_len))
567}