Files
iroh-gossip-rendezvous/fuzz/fuzz_targets/fuzz_wire_roundtrip.rs
T
swaitsandClaude Opus 4.7 7e39781318 Initial release: v0.1.0
Passphrase-based peer rendezvous for iroh-gossip swarms over the public
Mainline DHT. Two nodes that share a passphrase + application salt find
each other and join the same gossip topic — no bootstrap server, no
prior knowledge of peer addresses.

The algorithm is a clock-free variant of HyParView-style partition
healing on BEP 44 mutable items, with K-sharded slots, logical aging
with random-tie eviction, vouching of up to V neighbors at age 1, and
a two-layer AEAD record envelope. Full spec in PROTOCOL.md.

Ships with:

* 119 tests (unit / property / integration / doctest) all green
* 100% mutation-testing catch rate (cargo-mutants)
* cargo-fuzz harnesses for the parse surface
* Kani proofs of no-UB / no-panic on crypto::epoch_of and
  wire::decode_entries across their full symbolic input spaces
* Stateright distributed-system model: safety invariants S1 + S2
  proved exhaustively for N ≤ 6, K ≤ 3; liveness witness under weak
  fairness
* Miri green on the synchronous modules
* cargo-deny + cargo-audit clean
* criterion benches
* Full-matrix CI (Linux + macOS + Windows × stable + MSRV 1.93.0)
* Dedicated nightly lane for Miri / mutation / fuzz / Kani / Stateright

Pinned iroh 0.98.x. License MIT.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 22:52:46 -06:00

28 lines
812 B
Rust

//! Fuzz `decode_entries(encode_entries(x))` roundtrip. Any well-formed
//! input must roundtrip exactly; any malformed input must fail cleanly.
#![no_main]
use arbitrary::Arbitrary;
use iroh_gossip_rendezvous::sim::{decode_entries, encode_entries, Entry, MAX_ENTRIES};
use libfuzzer_sys::fuzz_target;
#[derive(Arbitrary, Debug)]
struct FuzzInput {
entries: Vec<([u8; 32], u8)>,
}
fuzz_target!(|input: FuzzInput| {
// Cap at MAX_ENTRIES since encode_entries requires it.
let entries: Vec<Entry> = input
.entries
.into_iter()
.take(MAX_ENTRIES)
.map(|(id, age)| Entry { id, age })
.collect();
let encoded = encode_entries(&entries);
let decoded = decode_entries(&encoded).expect("well-formed encode decodes");
assert_eq!(decoded, entries);
});