1 // Imports that need to be added manually
2 use bitcoin::bech32::u5;
3 use bitcoin::blockdata::script::ScriptBuf;
4 use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey};
5 use bitcoin::secp256k1::ecdh::SharedSecret;
6 use bitcoin::secp256k1::ecdsa::RecoverableSignature;
7 use bitcoin::secp256k1::schnorr;
9 use lightning::sign::{Recipient, KeyMaterial, EntropySource, NodeSigner, SignerProvider};
10 use lightning::ln::features::InitFeatures;
11 use lightning::ln::msgs::{self, DecodeError, OnionMessageHandler};
12 use lightning::ln::script::ShutdownScript;
13 use lightning::offers::invoice::UnsignedBolt12Invoice;
14 use lightning::offers::invoice_request::UnsignedInvoiceRequest;
15 use lightning::util::test_channel_signer::TestChannelSigner;
16 use lightning::util::logger::Logger;
17 use lightning::util::ser::{Readable, Writeable, Writer};
18 use lightning::onion_message::{CustomOnionMessageHandler, Destination, MessageRouter, OffersMessage, OffersMessageHandler, OnionMessageContents, OnionMessagePath, OnionMessenger, PendingOnionMessage};
20 use crate::utils::test_logger;
22 use std::io::{self, Cursor};
23 use std::sync::atomic::{AtomicU64, Ordering};
26 /// Actual fuzz test, method signature and name are fixed
27 pub fn do_test<L: Logger>(data: &[u8], logger: &L) {
28 if let Ok(msg) = <msgs::OnionMessage as Readable>::read(&mut Cursor::new(data)) {
29 let mut secret_bytes = [1; 32];
31 let secret = SecretKey::from_slice(&secret_bytes).unwrap();
32 let keys_manager = KeyProvider {
34 counter: AtomicU64::new(0),
36 let message_router = TestMessageRouter {};
37 let offers_msg_handler = TestOffersMessageHandler {};
38 let custom_msg_handler = TestCustomMessageHandler {};
39 let onion_messenger = OnionMessenger::new(
40 &keys_manager, &keys_manager, logger, &message_router, &offers_msg_handler,
45 let mut secret_bytes = [0; 32];
47 let secret = SecretKey::from_slice(&secret_bytes).unwrap();
48 PublicKey::from_secret_key(&Secp256k1::signing_only(), &secret)
51 let mut features = InitFeatures::empty();
52 features.set_onion_messages_optional();
53 let init = msgs::Init { features, networks: None, remote_network_address: None };
55 onion_messenger.peer_connected(&peer_node_id, &init, false).unwrap();
56 onion_messenger.handle_onion_message(&peer_node_id, &msg);
60 /// Method that needs to be added manually, {name}_test
61 pub fn onion_message_test<Out: test_logger::Output>(data: &[u8], out: Out) {
62 let logger = test_logger::TestLogger::new("".to_owned(), out);
63 do_test(data, &logger);
66 /// Method that needs to be added manually, {name}_run
68 pub extern "C" fn onion_message_run(data: *const u8, datalen: usize) {
69 let logger = test_logger::TestLogger::new("".to_owned(), test_logger::DevNull {});
70 do_test(unsafe { std::slice::from_raw_parts(data, datalen) }, &logger);
73 struct TestMessageRouter {}
75 impl MessageRouter for TestMessageRouter {
77 &self, _sender: PublicKey, _peers: Vec<PublicKey>, destination: Destination
78 ) -> Result<OnionMessagePath, ()> {
80 intermediate_nodes: vec![],
82 first_node_addresses: None,
87 struct TestOffersMessageHandler {}
89 impl OffersMessageHandler for TestOffersMessageHandler {
90 fn handle_message(&self, _message: OffersMessage) -> Option<OffersMessage> {
96 struct TestCustomMessage {}
98 const CUSTOM_MESSAGE_TYPE: u64 = 4242;
99 const CUSTOM_MESSAGE_CONTENTS: [u8; 32] = [42; 32];
101 impl OnionMessageContents for TestCustomMessage {
102 fn tlv_type(&self) -> u64 {
107 impl Writeable for TestCustomMessage {
108 fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
109 Ok(CUSTOM_MESSAGE_CONTENTS.write(w)?)
113 struct TestCustomMessageHandler {}
115 impl CustomOnionMessageHandler for TestCustomMessageHandler {
116 type CustomMessage = TestCustomMessage;
117 fn handle_custom_message(&self, _msg: Self::CustomMessage) -> Option<Self::CustomMessage> {
118 Some(TestCustomMessage {})
120 fn read_custom_message<R: io::Read>(&self, _message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError> {
121 let mut buf = Vec::new();
122 buffer.read_to_end(&mut buf)?;
123 return Ok(Some(TestCustomMessage {}))
125 fn release_pending_custom_messages(&self) -> Vec<PendingOnionMessage<Self::CustomMessage>> {
130 pub struct VecWriter(pub Vec<u8>);
131 impl Writer for VecWriter {
132 fn write_all(&mut self, buf: &[u8]) -> Result<(), ::std::io::Error> {
133 self.0.extend_from_slice(buf);
138 node_secret: SecretKey,
142 impl EntropySource for KeyProvider {
143 fn get_secure_random_bytes(&self) -> [u8; 32] {
144 let ctr = self.counter.fetch_add(1, Ordering::Relaxed);
145 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
146 (ctr >> 8*7) as u8, (ctr >> 8*6) as u8, (ctr >> 8*5) as u8, (ctr >> 8*4) as u8, (ctr >> 8*3) as u8, (ctr >> 8*2) as u8, (ctr >> 8*1) as u8, 14, (ctr >> 8*0) as u8]
150 impl NodeSigner for KeyProvider {
151 fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()> {
152 let node_secret = match recipient {
153 Recipient::Node => Ok(&self.node_secret),
154 Recipient::PhantomNode => Err(())
156 Ok(PublicKey::from_secret_key(&Secp256k1::signing_only(), node_secret))
159 fn ecdh(&self, recipient: Recipient, other_key: &PublicKey, tweak: Option<&Scalar>) -> Result<SharedSecret, ()> {
160 let mut node_secret = match recipient {
161 Recipient::Node => Ok(self.node_secret.clone()),
162 Recipient::PhantomNode => Err(())
164 if let Some(tweak) = tweak {
165 node_secret = node_secret.mul_tweak(tweak).map_err(|_| ())?;
167 Ok(SharedSecret::new(other_key, &node_secret))
170 fn get_inbound_payment_key_material(&self) -> KeyMaterial { unreachable!() }
172 fn sign_invoice(&self, _hrp_bytes: &[u8], _invoice_data: &[u5], _recipient: Recipient) -> Result<RecoverableSignature, ()> {
176 fn sign_bolt12_invoice_request(
177 &self, _invoice_request: &UnsignedInvoiceRequest
178 ) -> Result<schnorr::Signature, ()> {
182 fn sign_bolt12_invoice(
183 &self, _invoice: &UnsignedBolt12Invoice,
184 ) -> Result<schnorr::Signature, ()> {
188 fn sign_gossip_message(&self, _msg: lightning::ln::msgs::UnsignedGossipMessage) -> Result<bitcoin::secp256k1::ecdsa::Signature, ()> {
193 impl SignerProvider for KeyProvider {
194 type EcdsaSigner = TestChannelSigner;
196 type TaprootSigner = TestChannelSigner;
198 fn generate_channel_keys_id(&self, _inbound: bool, _channel_value_satoshis: u64, _user_channel_id: u128) -> [u8; 32] { unreachable!() }
200 fn derive_channel_signer(&self, _channel_value_satoshis: u64, _channel_keys_id: [u8; 32]) -> Self::EcdsaSigner {
204 fn read_chan_signer(&self, _data: &[u8]) -> Result<TestChannelSigner, DecodeError> { unreachable!() }
206 fn get_destination_script(&self, _channel_keys_id: [u8; 32]) -> Result<ScriptBuf, ()> { unreachable!() }
208 fn get_shutdown_scriptpubkey(&self) -> Result<ShutdownScript, ()> { unreachable!() }
213 use bitcoin::hashes::hex::FromHex;
214 use lightning::util::logger::{Logger, Record};
215 use std::collections::HashMap;
216 use std::sync::Mutex;
218 struct TrackingLogger {
219 /// (module, message) -> count
220 pub lines: Mutex<HashMap<(String, String), usize>>,
222 impl Logger for TrackingLogger {
223 fn log(&self, record: Record) {
224 *self.lines.lock().unwrap().entry((record.module_path.to_string(), format!("{}", record.args))).or_insert(0) += 1;
225 println!("{:<5} [{} : {}, {}] {}", record.level.to_string(), record.module_path, record.file, record.line, record.args);
230 fn test_no_onion_message_breakage() {
232 020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000\
233 000000000000000000000000000000000000000000000000e01ae0276020000000000000000000000000000\
234 000000000000000000000000000000000002020000000000000000000000000000000000000000000000000\
235 000000000000e0101022a0000000000000000000000000000014551231950b75fc4402da1732fc9bebf0010\
236 9500000000000000000000000000000004106d000000000000000000000000000000fd1092202a2a2a2a2a2\
237 a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0000000000000000000000000000000000\
238 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
239 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
240 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
241 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
242 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
243 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
244 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
245 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
246 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
247 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
248 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
249 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
250 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
251 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
252 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
253 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
254 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
255 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
256 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
257 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
258 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
259 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
260 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
261 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
262 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
263 000000000000000000000000000000000000000005600000000000000000000000000000000000000000000\
265 let logger = TrackingLogger { lines: Mutex::new(HashMap::new()) };
266 super::do_test(&<Vec<u8>>::from_hex(one_hop_om).unwrap(), &logger);
268 let log_entries = logger.lines.lock().unwrap();
269 assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),
270 "Received an onion message with path_id None and a reply_path: Custom(TestCustomMessage)"
271 .to_string())), Some(&1));
272 assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),
273 "Constructing onion message when responding to Custom onion message with path_id None: TestCustomMessage".to_string())), Some(&1));
274 assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),
275 "Buffered onion message when responding to Custom onion message with path_id None".to_string())), Some(&1));
278 let two_unblinded_hops_om = "\
279 020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000\
280 000000000000000000000000000000000000000000000000e01350433042102020202020202020202020202\
281 02020202020202020202020202020202020202026d000000000000000000000000000000eb0000000000000\
282 000000000000000000000000000000000000000000000000036041096000000000000000000000000000000\
283 fd1092202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a000000000000000\
284 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
285 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
286 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
287 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
288 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
289 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
290 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
291 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
292 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
293 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
294 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
295 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
296 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
297 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
298 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
299 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
300 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
301 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
302 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
303 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
304 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
305 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
306 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
307 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
308 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
309 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
310 000000000000000000000000000000000000000004800000000000000000000000000000000000000000000\
312 let logger = TrackingLogger { lines: Mutex::new(HashMap::new()) };
313 super::do_test(&<Vec<u8>>::from_hex(two_unblinded_hops_om).unwrap(), &logger);
315 let log_entries = logger.lines.lock().unwrap();
316 assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(), "Forwarding an onion message to peer 020202020202020202020202020202020202020202020202020202020202020202".to_string())), Some(&1));
319 let two_unblinded_two_blinded_om = "\
320 020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000\
321 000000000000000000000000000000000000000000000000e01350433042102020202020202020202020202\
322 02020202020202020202020202020202020202026d0000000000000000000000000000009e0000000000000\
323 000000000000000000000000000000000000000000000000058045604210203030303030303030303030303\
324 030303030303030303030303030303030303020821020000000000000000000000000000000000000000000\
325 000000000000000000e0196000000000000000000000000000000e900000000000000000000000000000000\
326 000000000000000000000000000000350433042102040404040404040404040404040404040404040404040\
327 4040404040404040402ca000000000000000000000000000000420000000000000000000000000000000000\
328 00000000000000000000000000003604103f000000000000000000000000000000fd1092202a2a2a2a2a2a2\
329 a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a000000000000000000000000000000000000\
330 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
331 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
332 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
333 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
334 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
335 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
336 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
337 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
338 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
339 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
340 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
341 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
342 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
343 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
344 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
345 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
346 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
347 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
348 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
349 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
350 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
351 000000000000000000000000000000000000000004800000000000000000000000000000000000000000000\
353 let logger = TrackingLogger { lines: Mutex::new(HashMap::new()) };
354 super::do_test(&<Vec<u8>>::from_hex(two_unblinded_two_blinded_om).unwrap(), &logger);
356 let log_entries = logger.lines.lock().unwrap();
357 assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(), "Forwarding an onion message to peer 020202020202020202020202020202020202020202020202020202020202020202".to_string())), Some(&1));
360 let three_blinded_om = "\
361 020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000\
362 000000000000000000000000000000000000000000000000e01350433042102020202020202020202020202\
363 02020202020202020202020202020202020202026d000000000000000000000000000000b20000000000000\
364 000000000000000000000000000000000000000000000000035043304210203030303030303030303030303\
365 030303030303030303030303030303030303029600000000000000000000000000000033000000000000000\
366 000000000000000000000000000000000000000000000003604104e000000000000000000000000000000fd\
367 1092202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a00000000000000000\
368 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
369 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
370 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
371 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
372 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
373 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
374 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
375 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
376 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
377 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
378 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
379 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
380 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
381 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
382 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
383 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
384 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
385 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
386 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
387 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
388 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
389 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
390 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
391 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
392 000000000000000000000000000000000000000004800000000000000000000000000000000000000000000\
394 let logger = TrackingLogger { lines: Mutex::new(HashMap::new()) };
395 super::do_test(&<Vec<u8>>::from_hex(three_blinded_om).unwrap(), &logger);
397 let log_entries = logger.lines.lock().unwrap();
398 assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(), "Forwarding an onion message to peer 020202020202020202020202020202020202020202020202020202020202020202".to_string())), Some(&1));