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"");
}