#![no_main] //! Fuzz `protocol::from_body` (bincode deserialization) for every protocol and //! native struct that is decoded from untrusted wire bytes. None may panic. use libfuzzer_sys::fuzz_target; use dosh::auth::{AttachTicketPlain, BootstrapResponse, SealedAttachTicket}; use dosh::native::{ HostPublicKey, NativeAuthOk, NativeClientHello, NativeServerHello, NativeUserAuth, }; use dosh::protocol::{ self, AttachOk, AttachReject, BootstrapAttachRequest, Frame, Input, NativeAuthCheckOkBody, NativeAuthOkBody, NativeClientHelloBody, NativeServerHelloBody, NativeUserAuthBody, Resize, ResumeRequest, StreamClose, StreamData, StreamEof, StreamOpen, StreamOpenOk, StreamOpenReject, StreamWindowAdjust, TicketAttachBody, TicketAttachEnvelope, TicketAttachOkEnvelope, }; macro_rules! try_body { ($data:expr, $ty:ty) => { let _ = protocol::from_body::<$ty>($data); }; } fuzz_target!(|data: &[u8]| { // protocol.rs structs try_body!(data, BootstrapAttachRequest); try_body!(data, TicketAttachEnvelope); try_body!(data, TicketAttachBody); try_body!(data, TicketAttachOkEnvelope); try_body!(data, AttachOk); try_body!(data, AttachReject); try_body!(data, ResumeRequest); try_body!(data, Input); try_body!(data, Resize); try_body!(data, Frame); try_body!(data, StreamOpen); try_body!(data, StreamOpenOk); try_body!(data, StreamOpenReject); try_body!(data, StreamData); try_body!(data, StreamWindowAdjust); try_body!(data, StreamEof); try_body!(data, StreamClose); // native handshake wrapper bodies try_body!(data, NativeClientHelloBody); try_body!(data, NativeServerHelloBody); try_body!(data, NativeUserAuthBody); try_body!(data, NativeAuthOkBody); try_body!(data, NativeAuthCheckOkBody); // bare native handshake structs try_body!(data, NativeClientHello); try_body!(data, NativeServerHello); try_body!(data, NativeUserAuth); try_body!(data, NativeAuthOk); try_body!(data, HostPublicKey); // auth.rs structs try_body!(data, BootstrapResponse); try_body!(data, SealedAttachTicket); try_body!(data, AttachTicketPlain); });