Gunnar

nordisk/heimdall

fuzz/common/wasm_seeds.rs

// SPDX-License-Identifier: AGPL-3.0-only
//! Heimdall is a defensive sandbox. Writes the seeds for the heimdall-wasm
//! fuzz targets into fuzz/seeds/ (run from the repo root or fuzz/).
#[path = "wasm_kit.rs"]
mod wasm_kit;

use std::path::PathBuf;

fn put(target: &str, name: &str, bytes: &[u8]) {
    let base = if PathBuf::from("fuzz_targets").is_dir() {
        "seeds"
    } else {
        "fuzz/seeds"
    };
    let dir = PathBuf::from(base).join(target);
    std::fs::create_dir_all(&dir).unwrap();
    std::fs::write(dir.join(name), bytes).unwrap();
}

fn with(case: u8, bytes: &[u8]) -> Vec<u8> {
    let mut v = vec![case];
    v.extend_from_slice(bytes);
    v
}

fn main() {
    let good = wasm_kit::component(wasm_kit::EMIT_SCRIPT_WAT);
    let core = wat::parse_str("(module (func (export \"run\")))").unwrap();
    put("wasm_guest_load", "component_signed", &with(0, &good));
    put("wasm_guest_load", "component_unsigned", &with(1, &good));
    put(
        "wasm_guest_load",
        "component_bad_sig",
        &with(2, &[&[4u8, 1, 2, 3, 4][..], &good].concat()),
    );
    put("wasm_guest_load", "component_wrong_pin", &with(3, &good));
    put("wasm_guest_load", "core_module", &with(0, &core));
    put(
        "wasm_guest_load",
        "component_truncated",
        &with(0, &good[..good.len() / 2]),
    );
    put("wasm_guest_load", "empty", &[0]);

    let step = |name: &[u8], size: u16| -> Vec<u8> {
        let mut v = vec![name.len() as u8];
        v.extend_from_slice(name);
        v.extend_from_slice(&size.to_le_bytes());
        v
    };
    put("wasm_emit_file", "one", &step(b"report.json", 4));
    put(
        "wasm_emit_file",
        "two",
        &[step(b"a.txt", 1), step(b"b+c.bin", 4096)].concat(),
    );
    put("wasm_emit_file", "traversal", &step(b"../x", 1));
    put(
        "wasm_emit_file",
        "dup",
        &[step(b"a", 1), step(b"a", 1)].concat(),
    );
    put(
        "wasm_emit_file",
        "trap_mid",
        &[step(b"a", 1), vec![255]].concat(),
    );
    put(
        "wasm_emit_file",
        "refuse_mid",
        &[step(b"a", 1), vec![254]].concat(),
    );
    put("wasm_emit_file", "bad_utf8", &step(b"\xff\xfe", 1));
    put("wasm_emit_file", "too_big", &step(b"big", 5000));
    put("wasm_emit_file", "empty", b"");
}