aboutsummaryrefslogtreecommitdiff
path: root/fuzz/fuzz_targets/zears_vs_aez.rs
blob: eda644db4f3fec24fc0b5b1cdd25c0aa26b5c93c (plain)
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
#![no_main]

use libfuzzer_sys::fuzz_target;

use arbitrary::Arbitrary;
use zears::Aez;

#[derive(Debug, Arbitrary)]
struct Parameters<'a> {
    key: &'a [u8],
    nonce: &'a [u8],
    ad: Option<&'a [u8]>,
    tau: u32,
    message: &'a [u8],
}

fuzz_target!(|data: Parameters| {
    // Limitations stem from AEZ's underlying C library
    if data.nonce.len() >= 1
        && data.nonce.len() <= 16
        && data.ad.map(|x| x.len()).unwrap_or(0) <= 16
        && data.tau <= 16
        && data.message.len() <= u32::MAX.try_into().unwrap()
        && (!data.message.is_empty() || data.tau > 0)
    {
        let ad = match data.ad {
            Some(ad) => &[ad] as &[&[u8]],
            None => &[],
        };
        let actual = Aez::new(data.key).encrypt(data.nonce, ad, data.tau, data.message);

        let mut expected = vec![0; data.message.len() + data.tau as usize];
        aez::Aez::new(data.key).encrypt(data.nonce, data.ad, data.message, &mut expected);

        assert_eq!(actual, expected);
    }
});