Upgrade AFL to 0.4 with persistent mode fuzzing
[rust-lightning] / fuzz / fuzz_targets / router_target.rs
1 extern crate bitcoin;
2 extern crate lightning;
3 extern crate secp256k1;
4
5 use lightning::ln::channelmanager::ChannelDetails;
6 use lightning::ln::msgs;
7 use lightning::ln::msgs::{MsgDecodable, RoutingMessageHandler};
8 use lightning::ln::router::{Router, RouteHint};
9 use lightning::util::reset_rng_state;
10 use lightning::util::logger::Logger;
11
12 use secp256k1::key::PublicKey;
13 use secp256k1::Secp256k1;
14
15 mod utils;
16
17 use utils::test_logger;
18
19 use std::sync::Arc;
20
21 #[inline]
22 pub fn slice_to_be16(v: &[u8]) -> u16 {
23         ((v[0] as u16) << 8*1) |
24         ((v[1] as u16) << 8*0)
25 }
26
27 #[inline]
28 pub fn slice_to_be32(v: &[u8]) -> u32 {
29         ((v[0] as u32) << 8*3) |
30         ((v[1] as u32) << 8*2) |
31         ((v[2] as u32) << 8*1) |
32         ((v[3] as u32) << 8*0)
33 }
34
35 #[inline]
36 pub fn slice_to_be64(v: &[u8]) -> u64 {
37         ((v[0] as u64) << 8*7) |
38         ((v[1] as u64) << 8*6) |
39         ((v[2] as u64) << 8*5) |
40         ((v[3] as u64) << 8*4) |
41         ((v[4] as u64) << 8*3) |
42         ((v[5] as u64) << 8*2) |
43         ((v[6] as u64) << 8*1) |
44         ((v[7] as u64) << 8*0)
45 }
46
47 #[inline]
48 pub fn do_test(data: &[u8]) {
49         reset_rng_state();
50
51         let mut read_pos = 0;
52         macro_rules! get_slice_nonadvancing {
53                 ($len: expr) => {
54                         {
55                                 if data.len() < read_pos + $len as usize {
56                                         return;
57                                 }
58                                 &data[read_pos..read_pos + $len as usize]
59                         }
60                 }
61         }
62         macro_rules! get_slice {
63                 ($len: expr) => {
64                         {
65                                 let res = get_slice_nonadvancing!($len);
66                                 read_pos += $len;
67                                 res
68                         }
69                 }
70         }
71
72         macro_rules! decode_msg {
73                 ($MsgType: path, $len: expr) => {
74                         match <($MsgType)>::decode(get_slice!($len)) {
75                                 Ok(msg) => msg,
76                                 Err(e) => match e {
77                                         msgs::DecodeError::UnknownRealmByte => return,
78                                         msgs::DecodeError::BadPublicKey => return,
79                                         msgs::DecodeError::BadSignature => return,
80                                         msgs::DecodeError::BadText => return,
81                                         msgs::DecodeError::ExtraAddressesPerType => return,
82                                         msgs::DecodeError::BadLengthDescriptor => return,
83                                         msgs::DecodeError::ShortRead => panic!("We picked the length..."),
84                                 }
85                         }
86                 }
87         }
88
89         macro_rules! decode_msg_with_len16 {
90                 ($MsgType: path, $begin_len: expr, $excess: expr) => {
91                         {
92                                 let extra_len = slice_to_be16(&get_slice_nonadvancing!($begin_len as usize + 2)[$begin_len..$begin_len + 2]);
93                                 decode_msg!($MsgType, $begin_len as usize + 2 + (extra_len as usize) + $excess)
94                         }
95                 }
96         }
97
98         let secp_ctx = Secp256k1::new();
99         macro_rules! get_pubkey {
100                 () => {
101                         match PublicKey::from_slice(&secp_ctx, get_slice!(33)) {
102                                 Ok(key) => key,
103                                 Err(_) => return,
104                         }
105                 }
106         }
107
108         let logger: Arc<Logger> = Arc::new(test_logger::TestLogger{});
109
110         let our_pubkey = get_pubkey!();
111         let router = Router::new(our_pubkey.clone(), Arc::clone(&logger));
112
113         loop {
114                 match get_slice!(1)[0] {
115                         0 => {
116                                 let start_len = slice_to_be16(&get_slice_nonadvancing!(64 + 2)[64..64 + 2]) as usize;
117                                 let addr_len = slice_to_be16(&get_slice_nonadvancing!(64+start_len+2 + 74)[64+start_len+2 + 72..64+start_len+2 + 74]);
118                                 if addr_len > (37+1)*4 {
119                                         return;
120                                 }
121                                 let _ = router.handle_node_announcement(&decode_msg_with_len16!(msgs::NodeAnnouncement, 64, 288));
122                         },
123                         1 => {
124                                 let _ = router.handle_channel_announcement(&decode_msg_with_len16!(msgs::ChannelAnnouncement, 64*4, 32+8+33*4));
125                         },
126                         2 => {
127                                 let _ = router.handle_channel_update(&decode_msg!(msgs::ChannelUpdate, 128));
128                         },
129                         3 => {
130                                 match get_slice!(1)[0] {
131                                         0 => {
132                                                 router.handle_htlc_fail_channel_update(&msgs::HTLCFailChannelUpdate::ChannelUpdateMessage {msg: decode_msg!(msgs::ChannelUpdate, 128)});
133                                         },
134                                         1 => {
135                                                 let short_channel_id = slice_to_be64(get_slice!(8));
136                                                 router.handle_htlc_fail_channel_update(&msgs::HTLCFailChannelUpdate::ChannelClosed {short_channel_id});
137                                         },
138                                         _ => return,
139                                 }
140                         },
141                         4 => {
142                                 let target = get_pubkey!();
143                                 let mut first_hops_vec = Vec::new();
144                                 let first_hops = match get_slice!(1)[0] {
145                                         0 => None,
146                                         1 => {
147                                                 let count = slice_to_be16(get_slice!(2));
148                                                 for _ in 0..count {
149                                                         first_hops_vec.push(ChannelDetails {
150                                                                 channel_id: [0; 32],
151                                                                 short_channel_id: Some(slice_to_be64(get_slice!(8))),
152                                                                 remote_network_id: get_pubkey!(),
153                                                                 channel_value_satoshis: slice_to_be64(get_slice!(8)),
154                                                                 user_id: 0,
155                                                         });
156                                                 }
157                                                 Some(&first_hops_vec[..])
158                                         },
159                                         _ => return,
160                                 };
161                                 let mut last_hops_vec = Vec::new();
162                                 let last_hops = {
163                                         let count = slice_to_be16(get_slice!(2));
164                                         for _ in 0..count {
165                                                 last_hops_vec.push(RouteHint {
166                                                         src_node_id: get_pubkey!(),
167                                                         short_channel_id: slice_to_be64(get_slice!(8)),
168                                                         fee_base_msat: slice_to_be32(get_slice!(4)),
169                                                         fee_proportional_millionths: slice_to_be32(get_slice!(4)),
170                                                         cltv_expiry_delta: slice_to_be16(get_slice!(2)),
171                                                         htlc_minimum_msat: slice_to_be64(get_slice!(8)),
172                                                 });
173                                         }
174                                         &last_hops_vec[..]
175                                 };
176                                 let _ = router.get_route(&target, first_hops, last_hops, slice_to_be64(get_slice!(8)), slice_to_be32(get_slice!(4)));
177                         },
178                         _ => return,
179                 }
180         }
181 }
182
183 #[cfg(feature = "afl")]
184 #[macro_use] extern crate afl;
185 #[cfg(feature = "afl")]
186 fn main() {
187         fuzz!(|data| {
188                 do_test(data);
189         });
190 }
191
192 #[cfg(feature = "honggfuzz")]
193 #[macro_use] extern crate honggfuzz;
194 #[cfg(feature = "honggfuzz")]
195 fn main() {
196         loop {
197                 fuzz!(|data| {
198                         do_test(data);
199                 });
200         }
201 }
202
203 extern crate hex;
204 #[cfg(test)]
205 mod tests {
206
207         #[test]
208         fn duplicate_crash() {
209                 super::do_test(&::hex::decode("00").unwrap());
210         }
211 }