Skip to content

Commit c0b3380

Browse files
valentinewallacejkczyz
authored andcommitted
Commit for regenerating OM fuzz no_breakage vectors
Use the OM generated for hop1->hop2 in the vmw_* tests
1 parent 7a0d86e commit c0b3380

File tree

2 files changed

+152
-2
lines changed

2 files changed

+152
-2
lines changed

fuzz/src/onion_message.rs

+149
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,36 @@ impl SignerProvider for KeyProvider {
171171
fn get_shutdown_scriptpubkey(&self) -> Result<ShutdownScript, ()> { unreachable!() }
172172
}
173173

174+
impl KeyProvider {
175+
fn get_node_secret(&self, recipient: Recipient) -> Result<SecretKey, ()> {
176+
match recipient {
177+
Recipient::Node => Ok(self.node_secret),
178+
Recipient::PhantomNode => Err(())
179+
}
180+
}
181+
}
182+
174183
#[cfg(test)]
175184
mod tests {
185+
use super::{TestCustomMessage, TestCustomMessageHandler, TestMessageRouter, TestOffersMessageHandler};
186+
use lightning::blinded_path::BlindedPath;
187+
use lightning::sign::Recipient;
188+
use lightning::ln::features::InitFeatures;
189+
use lightning::ln::msgs::{self, OnionMessageHandler};
190+
use lightning::onion_message::{Destination, OnionMessenger, SendError};
191+
use lightning::onion_message::OnionMessagePath;
192+
use lightning::onion_message::OnionMessageContents;
193+
use lightning::util::enforcing_trait_impls::EnforcingSigner;
194+
use lightning::util::test_utils;
195+
use lightning::util::ser::Writeable;
196+
197+
use bitcoin::network::constants::Network;
198+
use bitcoin::secp256k1::{PublicKey, SecretKey, Secp256k1};
199+
200+
use std::sync::Arc;
201+
use super::KeyProvider;
202+
use std::sync::atomic::{AtomicU64, Ordering};
203+
176204
use lightning::util::logger::{Logger, Record};
177205
use std::collections::HashMap;
178206
use std::sync::Mutex;
@@ -188,6 +216,126 @@ mod tests {
188216
}
189217
}
190218

219+
struct MessengerNode {
220+
keys_manager: Arc<KeyProvider>,
221+
messenger: OnionMessenger<Arc<KeyProvider>, Arc<KeyProvider>, Arc<TrackingLogger>, Arc<TestMessageRouter>, Arc<TestOffersMessageHandler>, Arc<TestCustomMessageHandler>>,
222+
logger: Arc<TrackingLogger>,
223+
}
224+
225+
impl MessengerNode {
226+
fn get_node_pk(&self) -> PublicKey {
227+
let secp_ctx = Secp256k1::new();
228+
PublicKey::from_secret_key(&secp_ctx, &self.keys_manager.get_node_secret(Recipient::Node).unwrap())
229+
}
230+
}
231+
fn create_nodes(num_messengers: u8) -> Vec<MessengerNode> {
232+
let mut nodes = Vec::new();
233+
for i in 0..num_messengers {
234+
let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
235+
let seed = [i as u8; 32];
236+
let mut secret_bytes = [0; 32];
237+
secret_bytes[31] = 2;
238+
let secret = SecretKey::from_slice(&secret_bytes).unwrap();
239+
let keys_manager = Arc::new(KeyProvider {
240+
node_secret: secret,
241+
counter: AtomicU64::new(0),
242+
});
243+
let message_router = Arc::new(TestMessageRouter {});
244+
let offers_msg_handler = Arc::new(TestOffersMessageHandler {});
245+
let custom_msg_handler = Arc::new(TestCustomMessageHandler {});
246+
let onion_messenger = OnionMessenger::new(
247+
keys_manager.clone(), keys_manager.clone(), logger.clone(), message_router, offers_msg_handler,
248+
custom_msg_handler
249+
);
250+
nodes.push(MessengerNode {
251+
keys_manager: keys_manager.clone(),
252+
messenger: onion_messenger,
253+
logger,
254+
});
255+
}
256+
for idx in 0..num_messengers - 1 {
257+
let i = idx as usize;
258+
let mut features = InitFeatures::empty();
259+
features.set_onion_messages_optional();
260+
let init_msg = msgs::Init { features, remote_network_address: None };
261+
nodes[i].messenger.peer_connected(&nodes[i + 1].get_node_pk(), &init_msg.clone(), true).unwrap();
262+
nodes[i + 1].messenger.peer_connected(&nodes[i].get_node_pk(), &init_msg.clone(), false).unwrap();
263+
}
264+
nodes
265+
}
266+
267+
fn pass_along_path(path: &Vec<MessengerNode>, expected_path_id: Option<[u8; 32]>) {
268+
let mut prev_node = &path[0];
269+
let num_nodes = path.len();
270+
for (idx, node) in path.into_iter().skip(1).enumerate() {
271+
let events = prev_node.messenger.release_pending_msgs();
272+
let onion_msg = {
273+
let msgs = events.get(&node.get_node_pk()).unwrap();
274+
assert_eq!(msgs.len(), 1);
275+
msgs[0].clone()
276+
};
277+
println!("VMW: encoded om: {:02x?}", onion_msg.encode());
278+
node.messenger.handle_onion_message(&prev_node.get_node_pk(), &onion_msg);
279+
if idx == num_nodes - 1 {
280+
// node.logger.assert_log_contains(
281+
// "lightning::onion_message::messenger".to_string(),
282+
// format!("Received an onion message with path_id: {:02x?}", expected_path_id).to_string(), 1);
283+
}
284+
prev_node = node;
285+
}
286+
}
287+
288+
#[test]
289+
fn vmw_om_one_hop() {
290+
let nodes = create_nodes(2);
291+
let path = OnionMessagePath {
292+
intermediate_nodes: Vec::new(),
293+
destination: Destination::Node(nodes[1].get_node_pk()),
294+
};
295+
296+
nodes[0].messenger.send_onion_message(path, OnionMessageContents::Custom(TestCustomMessage {}), None).unwrap();
297+
pass_along_path(&nodes, None);
298+
}
299+
300+
#[test]
301+
fn vmw_two_unblinded_hops() {
302+
let nodes = create_nodes(3);
303+
let path = OnionMessagePath {
304+
intermediate_nodes: vec![nodes[1].get_node_pk()],
305+
destination: Destination::Node(nodes[2].get_node_pk()),
306+
};
307+
308+
nodes[0].messenger.send_onion_message(path, OnionMessageContents::Custom(TestCustomMessage {}), None).unwrap();
309+
pass_along_path(&nodes, None);
310+
}
311+
312+
#[test]
313+
fn vmw_two_unblinded_two_blinded() {
314+
let nodes = create_nodes(5);
315+
let secp_ctx = Secp256k1::new();
316+
let blinded_route = BlindedPath::new_for_message(&[nodes[3].get_node_pk(), nodes[4].get_node_pk()], &*nodes[4].keys_manager, &secp_ctx).unwrap();
317+
let path = OnionMessagePath {
318+
intermediate_nodes: vec![nodes[1].get_node_pk(), nodes[2].get_node_pk()],
319+
destination: Destination::BlindedPath(blinded_route),
320+
};
321+
322+
nodes[0].messenger.send_onion_message(path, OnionMessageContents::Custom(TestCustomMessage {}), None).unwrap();
323+
pass_along_path(&nodes, None);
324+
}
325+
326+
#[test]
327+
fn vmw_three_blinded_hops() {
328+
let nodes = create_nodes(4);
329+
let secp_ctx = Secp256k1::new();
330+
let blinded_route = BlindedPath::new_for_message(&[nodes[1].get_node_pk(), nodes[2].get_node_pk(), nodes[3].get_node_pk()], &*nodes[3].keys_manager, &secp_ctx).unwrap();
331+
let path = OnionMessagePath {
332+
intermediate_nodes: vec![],
333+
destination: Destination::BlindedPath(blinded_route),
334+
};
335+
336+
nodes[0].messenger.send_onion_message(path, OnionMessageContents::Custom(TestCustomMessage {}), None).unwrap();
337+
pass_along_path(&nodes, None);
338+
}
191339
#[test]
192340
fn test_no_onion_message_breakage() {
193341
let one_hop_om = "020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000000000000000000000000000000000000000000000000000e0136041095000000000000000000000000000000fd1092202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000";
@@ -200,6 +348,7 @@ mod tests {
200348
// TODO: Add reply path to one_hop_om instead?
201349
assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),
202350
"No reply path to respond to onion message with path_id None".to_string())), Some(&1));
351+
//"Received an onion message with path_id None and no reply_path: Tlv { tag: 4242, value: [42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42] }".to_string())), Some(&1));
203352
}
204353

205354
let two_unblinded_hops_om = "020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000000000000000000000000000000000000000000000000000e0135043304210200000000000000000000000000000000000000000000000000000000000000029500000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003604104b000000000000000000000000000000fd1092202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000";

lightning/src/onion_message/messenger.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -372,8 +372,9 @@ where
372372
}
373373
}
374374

375-
#[cfg(test)]
376-
pub(super) fn release_pending_msgs(&self) -> HashMap<PublicKey, VecDeque<msgs::OnionMessage>> {
375+
#[cfg(any(test, fuzzing))]
376+
///
377+
pub fn release_pending_msgs(&self) -> HashMap<PublicKey, VecDeque<msgs::OnionMessage>> {
377378
let mut pending_msgs = self.pending_messages.lock().unwrap();
378379
let mut msgs = HashMap::new();
379380
// We don't want to disconnect the peers by removing them entirely from the original map, so we

0 commit comments

Comments
 (0)