d9d5c0a90376c2cabf5c50ac26b9cd50af23d8a0
[rust-lightning] / fuzz / src / onion_message.rs
1 // Imports that need to be added manually
2 use bitcoin::bech32::u5;
3 use bitcoin::blockdata::script::Script;
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;
8
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};
19
20 use crate::utils::test_logger;
21
22 use std::io::{self, Cursor};
23 use std::sync::atomic::{AtomicU64, Ordering};
24
25 #[inline]
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];
30                 secret_bytes[31] = 2;
31                 let secret = SecretKey::from_slice(&secret_bytes).unwrap();
32                 let keys_manager = KeyProvider {
33                         node_secret: secret,
34                         counter: AtomicU64::new(0),
35                 };
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,
41                         &custom_msg_handler
42                 );
43
44                 let peer_node_id = {
45                         let mut secret_bytes = [0; 32];
46                         secret_bytes[31] = 2;
47                         let secret = SecretKey::from_slice(&secret_bytes).unwrap();
48                         PublicKey::from_secret_key(&Secp256k1::signing_only(), &secret)
49                 };
50
51                 let mut features = InitFeatures::empty();
52                 features.set_onion_messages_optional();
53                 let init = msgs::Init { features, networks: None, remote_network_address: None };
54
55                 onion_messenger.peer_connected(&peer_node_id, &init, false).unwrap();
56                 onion_messenger.handle_onion_message(&peer_node_id, &msg);
57         }
58 }
59
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);
64 }
65
66 /// Method that needs to be added manually, {name}_run
67 #[no_mangle]
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);
71 }
72
73 struct TestMessageRouter {}
74
75 impl MessageRouter for TestMessageRouter {
76         fn find_path(
77                 &self, _sender: PublicKey, _peers: Vec<PublicKey>, destination: Destination
78         ) -> Result<OnionMessagePath, ()> {
79                 Ok(OnionMessagePath {
80                         intermediate_nodes: vec![],
81                         destination,
82                 })
83         }
84 }
85
86 struct TestOffersMessageHandler {}
87
88 impl OffersMessageHandler for TestOffersMessageHandler {
89         fn handle_message(&self, _message: OffersMessage) -> Option<OffersMessage> {
90                 None
91         }
92 }
93
94 struct TestCustomMessage {}
95
96 const CUSTOM_MESSAGE_TYPE: u64 = 4242;
97 const CUSTOM_MESSAGE_CONTENTS: [u8; 32] = [42; 32];
98
99 impl OnionMessageContents for TestCustomMessage {
100         fn tlv_type(&self) -> u64 {
101                 CUSTOM_MESSAGE_TYPE
102         }
103 }
104
105 impl Writeable for TestCustomMessage {
106         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
107                 Ok(CUSTOM_MESSAGE_CONTENTS.write(w)?)
108         }
109 }
110
111 struct TestCustomMessageHandler {}
112
113 impl CustomOnionMessageHandler for TestCustomMessageHandler {
114         type CustomMessage = TestCustomMessage;
115         fn handle_custom_message(&self, _msg: Self::CustomMessage) -> Option<Self::CustomMessage> {
116                 Some(TestCustomMessage {})
117         }
118         fn read_custom_message<R: io::Read>(&self, _message_type: u64, buffer: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError> {
119                 let mut buf = Vec::new();
120                 buffer.read_to_end(&mut buf)?;
121                 return Ok(Some(TestCustomMessage {}))
122         }
123         fn release_pending_custom_messages(&self) -> Vec<PendingOnionMessage<Self::CustomMessage>> {
124                 vec![]
125         }
126 }
127
128 pub struct VecWriter(pub Vec<u8>);
129 impl Writer for VecWriter {
130         fn write_all(&mut self, buf: &[u8]) -> Result<(), ::std::io::Error> {
131                 self.0.extend_from_slice(buf);
132                 Ok(())
133         }
134 }
135 struct KeyProvider {
136         node_secret: SecretKey,
137         counter: AtomicU64,
138 }
139
140 impl EntropySource for KeyProvider {
141         fn get_secure_random_bytes(&self) -> [u8; 32] {
142                 let ctr = self.counter.fetch_add(1, Ordering::Relaxed);
143                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
144                         (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]
145         }
146 }
147
148 impl NodeSigner for KeyProvider {
149         fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()> {
150                 let node_secret = match recipient {
151                         Recipient::Node => Ok(&self.node_secret),
152                         Recipient::PhantomNode => Err(())
153                 }?;
154                 Ok(PublicKey::from_secret_key(&Secp256k1::signing_only(), node_secret))
155         }
156
157         fn ecdh(&self, recipient: Recipient, other_key: &PublicKey, tweak: Option<&Scalar>) -> Result<SharedSecret, ()> {
158                 let mut node_secret = match recipient {
159                         Recipient::Node => Ok(self.node_secret.clone()),
160                         Recipient::PhantomNode => Err(())
161                 }?;
162                 if let Some(tweak) = tweak {
163                         node_secret = node_secret.mul_tweak(tweak).map_err(|_| ())?;
164                 }
165                 Ok(SharedSecret::new(other_key, &node_secret))
166         }
167
168         fn get_inbound_payment_key_material(&self) -> KeyMaterial { unreachable!() }
169
170         fn sign_invoice(&self, _hrp_bytes: &[u8], _invoice_data: &[u5], _recipient: Recipient) -> Result<RecoverableSignature, ()> {
171                 unreachable!()
172         }
173
174         fn sign_bolt12_invoice_request(
175                 &self, _invoice_request: &UnsignedInvoiceRequest
176         ) -> Result<schnorr::Signature, ()> {
177                 unreachable!()
178         }
179
180         fn sign_bolt12_invoice(
181                 &self, _invoice: &UnsignedBolt12Invoice,
182         ) -> Result<schnorr::Signature, ()> {
183                 unreachable!()
184         }
185
186         fn sign_gossip_message(&self, _msg: lightning::ln::msgs::UnsignedGossipMessage) -> Result<bitcoin::secp256k1::ecdsa::Signature, ()> {
187                 unreachable!()
188         }
189 }
190
191 impl SignerProvider for KeyProvider {
192         type Signer = TestChannelSigner;
193
194         fn generate_channel_keys_id(&self, _inbound: bool, _channel_value_satoshis: u64, _user_channel_id: u128) -> [u8; 32] { unreachable!() }
195
196         fn derive_channel_signer(&self, _channel_value_satoshis: u64, _channel_keys_id: [u8; 32]) -> Self::Signer {
197                 unreachable!()
198         }
199
200         fn read_chan_signer(&self, _data: &[u8]) -> Result<TestChannelSigner, DecodeError> { unreachable!() }
201
202         fn get_destination_script(&self) -> Result<Script, ()> { unreachable!() }
203
204         fn get_shutdown_scriptpubkey(&self) -> Result<ShutdownScript, ()> { unreachable!() }
205 }
206
207 #[cfg(test)]
208 mod tests {
209         use lightning::util::logger::{Logger, Record};
210         use std::collections::HashMap;
211         use std::sync::Mutex;
212
213         struct TrackingLogger {
214                 /// (module, message) -> count
215                 pub lines: Mutex<HashMap<(String, String), usize>>,
216         }
217         impl Logger for TrackingLogger {
218                 fn log(&self, record: &Record) {
219                         *self.lines.lock().unwrap().entry((record.module_path.to_string(), format!("{}", record.args))).or_insert(0) += 1;
220                         println!("{:<5} [{} : {}, {}] {}", record.level.to_string(), record.module_path, record.file, record.line, record.args);
221                 }
222         }
223
224         #[test]
225         fn test_no_onion_message_breakage() {
226                 let one_hop_om = "\
227                         020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000\
228                         000000000000000000000000000000000000000000000000e01ae0276020000000000000000000000000000\
229                         000000000000000000000000000000000002020000000000000000000000000000000000000000000000000\
230                         000000000000e0101022a0000000000000000000000000000014551231950b75fc4402da1732fc9bebf0010\
231                         9500000000000000000000000000000004106d000000000000000000000000000000fd1092202a2a2a2a2a2\
232                         a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0000000000000000000000000000000000\
233                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
234                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
235                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
236                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
237                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
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                         000000000000000000000000000000000000000005600000000000000000000000000000000000000000000\
259                         000000000000000000";
260                 let logger = TrackingLogger { lines: Mutex::new(HashMap::new()) };
261                 super::do_test(&::hex::decode(one_hop_om).unwrap(), &logger);
262                 {
263                         let log_entries = logger.lines.lock().unwrap();
264                         assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),
265                                                 "Received an onion message with path_id None and a reply_path".to_string())), Some(&1));
266                         assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),
267                                                 "Sending onion message when responding to Custom onion message with path_id None".to_string())), Some(&1));
268                 }
269
270                 let two_unblinded_hops_om = "\
271                         020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000\
272                         000000000000000000000000000000000000000000000000e01350433042102020202020202020202020202\
273                         02020202020202020202020202020202020202026d000000000000000000000000000000eb0000000000000\
274                         000000000000000000000000000000000000000000000000036041096000000000000000000000000000000\
275                         fd1092202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a000000000000000\
276                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
277                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
278                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
279                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
280                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
281                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
282                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
283                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
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                         000000000000000000000000000000000000000004800000000000000000000000000000000000000000000\
303                         000000000000000000";
304                 let logger = TrackingLogger { lines: Mutex::new(HashMap::new()) };
305                 super::do_test(&::hex::decode(two_unblinded_hops_om).unwrap(), &logger);
306                 {
307                         let log_entries = logger.lines.lock().unwrap();
308                         assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(), "Forwarding an onion message to peer 020202020202020202020202020202020202020202020202020202020202020202".to_string())), Some(&1));
309                 }
310
311                 let two_unblinded_two_blinded_om = "\
312                         020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000\
313                         000000000000000000000000000000000000000000000000e01350433042102020202020202020202020202\
314                         02020202020202020202020202020202020202026d0000000000000000000000000000009e0000000000000\
315                         000000000000000000000000000000000000000000000000058045604210203030303030303030303030303\
316                         030303030303030303030303030303030303020821020000000000000000000000000000000000000000000\
317                         000000000000000000e0196000000000000000000000000000000e900000000000000000000000000000000\
318                         000000000000000000000000000000350433042102040404040404040404040404040404040404040404040\
319                         4040404040404040402ca000000000000000000000000000000420000000000000000000000000000000000\
320                         00000000000000000000000000003604103f000000000000000000000000000000fd1092202a2a2a2a2a2a2\
321                         a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a000000000000000000000000000000000000\
322                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
323                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
324                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
325                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
326                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
327                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
328                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
329                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
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                         000000000000000000000000000000000000000004800000000000000000000000000000000000000000000\
344                         000000000000000000";
345                 let logger = TrackingLogger { lines: Mutex::new(HashMap::new()) };
346                 super::do_test(&::hex::decode(two_unblinded_two_blinded_om).unwrap(), &logger);
347                 {
348                         let log_entries = logger.lines.lock().unwrap();
349                         assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(), "Forwarding an onion message to peer 020202020202020202020202020202020202020202020202020202020202020202".to_string())), Some(&1));
350                 }
351
352                 let three_blinded_om = "\
353                         020000000000000000000000000000000000000000000000000000000000000e01055600020000000000000\
354                         000000000000000000000000000000000000000000000000e01350433042102020202020202020202020202\
355                         02020202020202020202020202020202020202026d000000000000000000000000000000b20000000000000\
356                         000000000000000000000000000000000000000000000000035043304210203030303030303030303030303\
357                         030303030303030303030303030303030303029600000000000000000000000000000033000000000000000\
358                         000000000000000000000000000000000000000000000003604104e000000000000000000000000000000fd\
359                         1092202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a00000000000000000\
360                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
361                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
362                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
363                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
364                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
365                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
366                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
367                         000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\
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                         000000000000000000000000000000000000000004800000000000000000000000000000000000000000000\
385                         000000000000000000";
386                 let logger = TrackingLogger { lines: Mutex::new(HashMap::new()) };
387                 super::do_test(&::hex::decode(three_blinded_om).unwrap(), &logger);
388                 {
389                         let log_entries = logger.lines.lock().unwrap();
390                         assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(), "Forwarding an onion message to peer 020202020202020202020202020202020202020202020202020202020202020202".to_string())), Some(&1));
391                 }
392         }
393 }