Skip to content

Commit aad62bc

Browse files
committed
Add a NetworkGraph reference to OnionMessenger
When buffering onion messages for a node that is not connected as a peer, it's possible that node does not exist. Include a NetworkGraph reference in OnionMessenger so that it can be used to check if the node actually exists. Otherwise, an malicious node may send an onion message where the reply path's introduction node doesn't exist. This would result in buffering messages that may never be delivered.
1 parent 78a05ab commit aad62bc

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

lightning/src/onion_message/functional_tests.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use crate::blinded_path::BlindedPath;
1313
use crate::ln::features::InitFeatures;
1414
use crate::ln::msgs::{self, DecodeError, OnionMessageHandler};
15+
use crate::routing::gossip::NetworkGraph;
1516
use crate::sign::{NodeSigner, Recipient};
1617
use crate::util::ser::{FixedLengthReader, LengthReadable, Writeable, Writer};
1718
use crate::util::test_utils;
@@ -31,6 +32,7 @@ struct MessengerNode {
3132
messenger: OnionMessenger<
3233
Arc<test_utils::TestKeysInterface>,
3334
Arc<test_utils::TestKeysInterface>,
35+
Arc<NetworkGraph<Arc<test_utils::TestLogger>>>,
3436
Arc<test_utils::TestLogger>,
3537
Arc<TestMessageRouter>,
3638
Arc<TestOffersMessageHandler>,
@@ -157,6 +159,7 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
157159
let mut nodes = Vec::new();
158160
for i in 0..num_messengers {
159161
let logger = Arc::new(test_utils::TestLogger::with_id(format!("node {}", i)));
162+
let network_graph = Arc::new(NetworkGraph::new(Network::Testnet, logger.clone()));
160163
let seed = [i as u8; 32];
161164
let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&seed, Network::Testnet));
162165
let message_router = Arc::new(TestMessageRouter {});
@@ -165,7 +168,7 @@ fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
165168
nodes.push(MessengerNode {
166169
keys_manager: keys_manager.clone(),
167170
messenger: OnionMessenger::new(
168-
keys_manager.clone(), keys_manager, logger.clone(), message_router,
171+
keys_manager.clone(), keys_manager, network_graph, logger.clone(), message_router,
169172
offers_message_handler, custom_message_handler.clone()
170173
),
171174
custom_message_handler,
@@ -456,9 +459,10 @@ fn spec_test_vector() {
456459
let mut nodes = Vec::new();
457460
for (idx, (entropy_source, node_signer)) in keys_mgrs.iter().enumerate() {
458461
let logger = Arc::new(test_utils::TestLogger::with_id(format!("node {}", idx)));
462+
let network_graph = Arc::new(NetworkGraph::new(Network::Testnet, logger.clone()));
459463
nodes.push(OnionMessenger::new(
460-
entropy_source.clone(), node_signer.clone(), logger.clone(), message_router.clone(),
461-
offers_message_handler.clone(), custom_message_handler.clone()
464+
entropy_source.clone(), node_signer.clone(), network_graph, logger.clone(),
465+
message_router.clone(), offers_message_handler.clone(), custom_message_handler.clone()
462466
));
463467
}
464468
for idx in 0..nodes.len() - 1 {

lightning/src/onion_message/messenger.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use crate::ln::features::{InitFeatures, NodeFeatures};
2525
use crate::ln::msgs::{self, OnionMessage, OnionMessageHandler};
2626
use crate::ln::onion_utils;
2727
use crate::ln::peer_handler::IgnoringMessageHandler;
28+
use crate::routing::gossip::{NetworkGraph, NodeId};
2829
pub use super::packet::OnionMessageContents;
2930
use super::packet::ParsedOnionMessageContents;
3031
use super::offers::OffersMessageHandler;
@@ -59,15 +60,17 @@ use crate::prelude::*;
5960
/// ```
6061
/// # extern crate bitcoin;
6162
/// # use bitcoin::hashes::_export::_core::time::Duration;
63+
/// # use bitcoin::network::constants::Network;
6264
/// # use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
6365
/// # use lightning::blinded_path::BlindedPath;
6466
/// # use lightning::sign::KeysManager;
6567
/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
6668
/// # use lightning::onion_message::{OnionMessageContents, Destination, MessageRouter, OnionMessagePath, OnionMessenger};
69+
/// # use lightning::routing::gossip::NetworkGraph;
6770
/// # use lightning::util::logger::{Logger, Record};
6871
/// # use lightning::util::ser::{Writeable, Writer};
6972
/// # use lightning::io;
70-
/// # use std::sync::Arc;
73+
/// #
7174
/// # struct FakeLogger;
7275
/// # impl Logger for FakeLogger {
7376
/// # fn log(&self, record: &Record) { unimplemented!() }
@@ -81,20 +84,21 @@ use crate::prelude::*;
8184
/// # let seed = [42u8; 32];
8285
/// # let time = Duration::from_secs(123456);
8386
/// # let keys_manager = KeysManager::new(&seed, time.as_secs(), time.subsec_nanos());
84-
/// # let logger = Arc::new(FakeLogger {});
87+
/// # let logger = FakeLogger {};
88+
/// # let network_graph = NetworkGraph::new(Network::Testnet, &logger);
8589
/// # let node_secret = SecretKey::from_slice(&hex::decode("0101010101010101010101010101010101010101010101010101010101010101").unwrap()[..]).unwrap();
8690
/// # let secp_ctx = Secp256k1::new();
8791
/// # let hop_node_id1 = PublicKey::from_secret_key(&secp_ctx, &node_secret);
8892
/// # let (hop_node_id2, hop_node_id3, hop_node_id4) = (hop_node_id1, hop_node_id1, hop_node_id1);
8993
/// # let destination_node_id = hop_node_id1;
90-
/// # let message_router = Arc::new(FakeMessageRouter {});
94+
/// # let message_router = FakeMessageRouter {};
9195
/// # let custom_message_handler = IgnoringMessageHandler {};
9296
/// # let offers_message_handler = IgnoringMessageHandler {};
9397
/// // Create the onion messenger. This must use the same `keys_manager` as is passed to your
9498
/// // ChannelManager.
9599
/// let onion_messenger = OnionMessenger::new(
96-
/// &keys_manager, &keys_manager, logger, message_router, &offers_message_handler,
97-
/// &custom_message_handler
100+
/// &keys_manager, &keys_manager, &network_graph, &logger, &message_router,
101+
/// &offers_message_handler, &custom_message_handler
98102
/// );
99103
///
100104
/// # struct YourCustomMessage {}
@@ -136,17 +140,19 @@ use crate::prelude::*;
136140
///
137141
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
138142
/// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
139-
pub struct OnionMessenger<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
143+
pub struct OnionMessenger<ES: Deref, NS: Deref, G, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
140144
where
141145
ES::Target: EntropySource,
142146
NS::Target: NodeSigner,
147+
G: Deref<Target=NetworkGraph<L>>,
143148
L::Target: Logger,
144149
MR::Target: MessageRouter,
145150
OMH::Target: OffersMessageHandler,
146151
CMH:: Target: CustomOnionMessageHandler,
147152
{
148153
entropy_source: ES,
149154
node_signer: NS,
155+
network_graph: G,
150156
logger: L,
151157
message_buffers: Mutex<HashMap<PublicKey, OnionMessageBuffer>>,
152158
secp_ctx: Secp256k1<secp256k1::All>,
@@ -533,11 +539,12 @@ where
533539
}
534540
}
535541

536-
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
537-
OnionMessenger<ES, NS, L, MR, OMH, CMH>
542+
impl<ES: Deref, NS: Deref, G, L: Deref, MR: Deref, OMH: Deref, CMH: Deref>
543+
OnionMessenger<ES, NS, G, L, MR, OMH, CMH>
538544
where
539545
ES::Target: EntropySource,
540546
NS::Target: NodeSigner,
547+
G: Deref<Target=NetworkGraph<L>>,
541548
L::Target: Logger,
542549
MR::Target: MessageRouter,
543550
OMH::Target: OffersMessageHandler,
@@ -546,14 +553,15 @@ where
546553
/// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to
547554
/// their respective handlers.
548555
pub fn new(
549-
entropy_source: ES, node_signer: NS, logger: L, message_router: MR, offers_handler: OMH,
550-
custom_handler: CMH
556+
entropy_source: ES, node_signer: NS, network_graph: G, logger: L, message_router: MR,
557+
offers_handler: OMH, custom_handler: CMH
551558
) -> Self {
552559
let mut secp_ctx = Secp256k1::new();
553560
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
554561
OnionMessenger {
555562
entropy_source,
556563
node_signer,
564+
network_graph,
557565
message_buffers: Mutex::new(HashMap::new()),
558566
secp_ctx,
559567
logger,
@@ -687,11 +695,12 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, On
687695
false
688696
}
689697

690-
impl<ES: Deref, NS: Deref, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
691-
for OnionMessenger<ES, NS, L, MR, OMH, CMH>
698+
impl<ES: Deref, NS: Deref, G, L: Deref, MR: Deref, OMH: Deref, CMH: Deref> OnionMessageHandler
699+
for OnionMessenger<ES, NS, G, L, MR, OMH, CMH>
692700
where
693701
ES::Target: EntropySource,
694702
NS::Target: NodeSigner,
703+
G: Deref<Target=NetworkGraph<L>>,
695704
L::Target: Logger,
696705
MR::Target: MessageRouter,
697706
OMH::Target: OffersMessageHandler,
@@ -830,6 +839,7 @@ where
830839
pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
831840
Arc<KeysManager>,
832841
Arc<KeysManager>,
842+
Arc<NetworkGraph<L>>,
833843
Arc<L>,
834844
Arc<DefaultMessageRouter>,
835845
Arc<SimpleArcChannelManager<M, T, F, L>>,
@@ -849,6 +859,7 @@ pub type SimpleRefOnionMessenger<
849859
> = OnionMessenger<
850860
&'a KeysManager,
851861
&'a KeysManager,
862+
&'g NetworkGraph<&'b L>,
852863
&'b L,
853864
&'i DefaultMessageRouter,
854865
&'j SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L>,

0 commit comments

Comments
 (0)