X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=fuzz%2Ffuzz_targets%2Fmsg_targets%2Futils.rs;h=52ea530cf9fed976438e30f5ad1beff30ac94af7;hb=1f1f82569a1774d2f6cb84e1de3c55dc733022c8;hp=cb4de5eb95441a269608efb216a7db025d7d33f9;hpb=913ea887fea16be5f272ff8467a0458c086e7ff1;p=rust-lightning diff --git a/fuzz/fuzz_targets/msg_targets/utils.rs b/fuzz/fuzz_targets/msg_targets/utils.rs index cb4de5eb..52ea530c 100644 --- a/fuzz/fuzz_targets/msg_targets/utils.rs +++ b/fuzz/fuzz_targets/msg_targets/utils.rs @@ -1,69 +1,70 @@ #![macro_use] -#[allow(dead_code)] -#[inline] -pub fn slice_to_be16(v: &[u8]) -> u16 { - ((v[0] as u16) << 8*1) | - ((v[1] as u16) << 8*0) -} - #[macro_export] macro_rules! test_msg { - ($MsgType: path, $data: ident, $read_pos: ident) => { + ($MsgType: path, $data: ident) => { { - let len = slice_to_be16(get_slice!($data, $read_pos, 2)); - let raw = get_slice!($data, $read_pos, len); - let cb = decode_msg!($MsgType, raw).encode(); - assert_eq!(&raw[..cb.len()], &cb[..]); + use lightning::util::ser::{Writeable, Readable}; + let mut r = ::std::io::Cursor::new($data); + if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) { + let p = r.position() as usize; + let mut w = ::std::io::Cursor::new(vec![]); + msg.write(&mut w).unwrap(); + + let buf = w.into_inner(); + assert_eq!(buf.len(), p); + assert_eq!(&r.into_inner()[..p], &buf[..p]); + } } } } #[macro_export] -macro_rules! decode_msg { - ($MsgType: path, $data: expr) => { - match <($MsgType)>::decode($data) { - Ok(msg) => msg, - Err(e) => match e { - msgs::DecodeError::UnknownRealmByte => return, - msgs::DecodeError::BadPublicKey => return, - msgs::DecodeError::BadSignature => return, - msgs::DecodeError::ExtraAddressesPerType => return, - msgs::DecodeError::WrongLength => return, +macro_rules! test_msg_simple { + ($MsgType: path, $data: ident) => { + { + use lightning::util::ser::{Writeable, Readable}; + let mut r = ::std::io::Cursor::new($data); + if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) { + msg.write(&mut ::std::io::Cursor::new(vec![])).unwrap(); } } } } #[macro_export] -macro_rules! get_slice { - ($data: ident, $read_pos: ident, $len: expr) => { +macro_rules! test_msg_exact { + ($MsgType: path, $data: ident) => { { - let slice_len = $len as usize; - if $data.len() < $read_pos + slice_len { - return; + use lightning::util::ser::{Writeable, Readable}; + let mut r = ::std::io::Cursor::new($data); + if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) { + let mut w = ::std::io::Cursor::new(vec![]); + msg.write(&mut w).unwrap(); + + let buf = w.into_inner(); + assert_eq!(&r.into_inner()[..], &buf[..]); } - $read_pos += slice_len; - &$data[$read_pos - slice_len..$read_pos] } } } -#[allow(dead_code)] -#[cfg(test)] -pub fn extend_vec_from_hex(hex: &str, out: &mut Vec) { - let mut b = 0; - for (idx, c) in hex.as_bytes().iter().enumerate() { - b <<= 4; - match *c { - b'A'...b'F' => b |= c - b'A' + 10, - b'a'...b'f' => b |= c - b'a' + 10, - b'0'...b'9' => b |= c - b'0', - _ => panic!("Bad hex"), - } - if (idx & 1) == 1 { - out.push(b); - b = 0; +#[macro_export] +macro_rules! test_msg_hole { + ($MsgType: path, $data: ident, $hole: expr, $hole_len: expr) => { + { + use lightning::util::ser::{Writeable, Readable}; + let mut r = ::std::io::Cursor::new($data); + if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) { + let mut w = ::std::io::Cursor::new(vec![]); + msg.write(&mut w).unwrap(); + let p = w.position() as usize; + + let buf = w.into_inner(); + assert_eq!(buf.len(),p); + assert_eq!(&r.get_ref()[..$hole], &buf[..$hole]); + assert_eq!(&r.get_ref()[$hole+$hole_len..p], &buf[$hole+$hole_len..]); + } } } }