1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//! Fuzzing infrastructure for ELARA Protocol
//!
//! This crate provides a trait-based framework for creating fuzz targets
//! that can discover edge cases, panics, and security vulnerabilities in
//! parsing and cryptographic code.
//!
//! # Architecture
//!
//! The fuzzing infrastructure consists of:
//! - **FuzzTarget trait**: Core abstraction for fuzz targets
//! - **FuzzResult enum**: Classification of fuzz outcomes
//! - **Concrete fuzzers**: Pre-built fuzzers for wire protocol, crypto, and state
//!
//! # Example
//!
//! ```rust
//! use elara_fuzz::{FuzzTarget, FuzzResult};
//! use arbitrary::Arbitrary;
//!
//! #[derive(Arbitrary, Debug)]
//! struct MyInput {
//! data: Vec<u8>,
//! }
//!
//! struct MyFuzzer;
//!
//! impl FuzzTarget for MyFuzzer {
//! type Input = MyInput;
//!
//! fn fuzz_once(&mut self, input: Self::Input) -> FuzzResult {
//! // Test your code with arbitrary input
//! match process_data(&input.data) {
//! Ok(_) => FuzzResult::Ok,
//! Err(e) if e.is_expected() => FuzzResult::Invalid,
//! Err(e) => FuzzResult::Bug(format!("Unexpected error: {}", e)),
//! }
//! }
//! }
//! # fn process_data(_data: &[u8]) -> Result<(), std::io::Error> { Ok(()) }
//! # trait ErrorExt { fn is_expected(&self) -> bool; }
//! # impl ErrorExt for std::io::Error { fn is_expected(&self) -> bool { true } }
//! ```
//!
//! # Integration with cargo-fuzz
//!
//! To use with cargo-fuzz, create fuzz targets in `fuzz/fuzz_targets/`:
//!
//! ```rust,no_run
//! #![no_main]
//! use libfuzzer_sys::fuzz_target;
//! use elara_fuzz::FuzzTarget;
//!
//! # struct MyFuzzer;
//! # impl elara_fuzz::FuzzTarget for MyFuzzer {
//! # type Input = Vec<u8>;
//! # fn fuzz_once(&mut self, _input: Self::Input) -> elara_fuzz::FuzzResult {
//! # elara_fuzz::FuzzResult::Ok
//! # }
//! # }
//! fuzz_target!(|data: <MyFuzzer as FuzzTarget>::Input| {
//! let mut fuzzer = MyFuzzer;
//! let _ = fuzzer.fuzz_once(data);
//! });
//! ```
use Arbitrary;
/// Result of a single fuzz iteration
/// Trait for implementing fuzz targets
///
/// Implementors define an `Input` type that can be generated arbitrarily
/// and a `fuzz_once` method that tests the code with that input.