libsoliton/ci_regression.sh
Kamal Tufekcic 1d99048c95
Some checks failed
CI / lint (push) Successful in 1m37s
CI / test-python (push) Successful in 1m49s
CI / test-zig (push) Successful in 1m39s
CI / test-wasm (push) Successful in 1m54s
CI / test (push) Successful in 14m44s
CI / miri (push) Successful in 14m18s
CI / build (push) Successful in 1m9s
CI / fuzz-regression (push) Successful in 9m9s
CI / publish (push) Failing after 1m10s
CI / publish-python (push) Failing after 1m46s
CI / publish-wasm (push) Has been cancelled
initial commit
Signed-off-by: Kamal Tufekcic <kamal@lo.sh>
2026-04-02 23:48:10 +03:00

87 lines
2.4 KiB
Bash
Executable file

#!/usr/bin/env bash
# Corpus-only fuzz regression: runs each fuzz target against its seed corpus
# with -runs=0 (no new mutations). Validates that:
# 1. All corpus files parse without panicking
# 2. No regressions in error handling
# 3. The fuzz harness builds and links correctly
#
# Covers both core (soliton) and CAPI (soliton_capi) fuzz targets.
#
# Usage: ./ci_regression.sh
# Exit code: 0 if all pass, non-zero on first failure.
set -euo pipefail
CORE_DIR="soliton"
CAPI_DIR="soliton_capi"
CORE_TARGETS=(
fuzz_storage_decrypt_blob
fuzz_ratchet_decrypt
fuzz_ratchet_decrypt_stateful
fuzz_ratchet_encrypt
fuzz_identity_from_bytes
fuzz_ed25519_verify
fuzz_hybrid_verify
fuzz_decrypt_first_message
fuzz_kex_receive_session
fuzz_storage_encrypt_blob
fuzz_auth_respond
fuzz_kex_verify_bundle
fuzz_verification_phrase
fuzz_ratchet_roundtrip
fuzz_xwing_roundtrip
fuzz_identity_sign_verify
fuzz_session_init_roundtrip
fuzz_call_derive
fuzz_auth_verify
fuzz_ratchet_from_bytes_epoch
fuzz_kex_decode_receive
fuzz_dm_queue_roundtrip
fuzz_dm_queue_decrypt_blob
fuzz_argon2_params
fuzz_stream_decrypt
fuzz_stream_decrypt_at
fuzz_stream_encrypt_decrypt
fuzz_stream_encrypt_at
fuzz_ratchet_state_machine
)
CAPI_TARGETS=(
fuzz_capi_ratchet_from_bytes
fuzz_capi_storage_decrypt
fuzz_capi_decode_session_init
fuzz_capi_dm_queue_decrypt
fuzz_capi_stream_decrypt
fuzz_capi_stream_decrypt_at
fuzz_capi_stream_encrypt_at
)
run_regression() {
local fuzz_dir="$1"
local label="$2"
shift 2
local targets=("$@")
echo ""
echo "=== ${label} (${#targets[@]} targets) ==="
for target in "${targets[@]}"; do
corpus_dir="${fuzz_dir}/fuzz/corpus/${target}"
if [ ! -d "$corpus_dir" ] || [ -z "$(ls -A "$corpus_dir" 2>/dev/null)" ]; then
echo "WARNING: No corpus for ${target}, skipping"
continue
fi
echo "--- ${target} ---"
(cd "$fuzz_dir" && cargo +nightly fuzz run "${target}" "fuzz/corpus/${target}" -- -runs=0 -max_len=65536)
echo "PASS: ${target}"
done
}
run_regression "$CORE_DIR" "Core" "${CORE_TARGETS[@]}"
run_regression "$CAPI_DIR" "CAPI" "${CAPI_TARGETS[@]}"
TOTAL=$(( ${#CORE_TARGETS[@]} + ${#CAPI_TARGETS[@]} ))
echo ""
echo "All ${TOTAL} corpus regressions passed."