Real progress on the first certificate (chain / Algorithm 5). Two mathematically-substantive lemmas now PROVEN and axiom-clean ([propext, Classical.choice, Quot.sound]): - u32_succ: the successful u32 index increment (start+1 = ok w, no overflow from the theorem's bound) — via UScalar.add_equiv case split. - fwd_succ: the range iterator's forward_checked start 1 = ok (some w), bridging checked_add/Option.ofResult/ofNatCore to the plain add. - match_ok_bind: the loop.eq_1 outer match = Result bind (rfl). chain_free_loop_eq BASE CASE proven (empty range). Two sorries remain, both PURE LEAN PLUMBING, no math left: - chain_step (one loop step = one fold step): reduction fully mechanised except exposing the let-pair so rw[match_ok_bind] can see the bind; next tactic documented in-file (full simp to reduce the let-pair, then match_ok_bind + bind_assoc; fallback = the WP loop.spec_decr_nat/spec_mono dalek pattern). - the succ case, which is chain_step + ih once chain_step lands. Still in drafts/ (sorries ⇒ never Proofs/ or check.sh); zero certificates claimed. Probes ran under lean-guard per S1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|---|---|---|
| verification | ||
| .gitignore | ||
| README.md | ||
| TRUSTED-BASE.md | ||
fips205-slhdsa-verified
Machine-checked verification campaign for the SLH-DSA (FIPS 205) verify
path, extracted from a pure-Rust implementation into Lean 4 via
Charon/Aeneas — the same pipeline, discipline, and honesty rules as the
four ed25519 campaigns (dalek/anza/risc0/betrusted-ed25519-verified).
STATUS: MODEL EXTRACTED & TYPE-CHECKS — NOTHING PROVEN YET
There are still zero certificates in this repository. What phase 1 established (2026-07-22):
- the Aeneas-compat patch landed in the snapshot (an additive monomorphic SHA2-128s verify module reached through a named hash-oracle boundary);
- charon and aeneas both exit 0 on the full verify cone — the gate-0 fn-pointer blocker is gone;
- the extracted Lean model (
verification/gen/SlhVerify, 62 defs, apexverify_mono.slh_verify_128s) type-checks under lean-guard (verification/check.shPhase 1 is green); - fidelity of the monomorphic path is pinned by a differential test in the snapshot that agrees with the deployed verifier on valid / corrupted / wrong-message signatures.
A green Phase-1 compile proves the model is well-formed, NOT that the verifier is correct. No operation theorem has been stated or proven. Every claim under "What will be claimed" remains a plan (H5: an honest gap outranks a hollow certificate).
Subject
- Upstream:
integritychain/fips205— pure-Rust FIPS 205 (final standard, 2024-08-13), zerounsafe,no_std, const-generic parameterization, modules mirroring the FIPS 205 algorithm structure. - Pinned at upstream commit
30bac08580aa61f653e5436d1bbacb5ffac446c4(2025-09-01), snapshotted with full history atsaymrwulf/fips205-source(snapshot head5dca0db, whose single deviation from verbatim is the removal of upstream CI workflows, documented in that commit). Aeneas-compat patches will land in the snapshot repo as transparent, individually-justified commits — never upstream. No affiliation with, and no changes proposed to, the upstream project. - Parameter set: SLH-DSA-SHA2-128s first (the small-signature profile deployed in the firmware/code-signing lane). The architecture generalizes; each further parameter set is a separate claim (rigor invariant R2).
Scope
Verify path only. The extraction cone, mirroring FIPS 205's own algorithm tree:
slh_verify -> slh_verify_internal
-> fors_pk_from_sig
-> ht_verify -> xmss_pk_from_sig -> wots_pk_from_sig -> chain
Key generation and signing are out of scope (trusted base), exactly as
ed25519 signing was. The five verify-path hash oracles (h_msg, f, h, t_l, t_len — SHA-2 instantiations; prf/prf_msg are sign-side only
and never enter the cone) are opaque external models with written
justifications, kept outside every certificate's dependency cone
(honesty invariant H4); their semantics are the standing SHA-2 oracle
boundary documented in TRUSTED-BASE.md.
Gate-0 record (2026-07-22)
Per TARGETS.md ("re-verify before use"), the subject was probed before this repository was created:
- Charon: clean (
charon cargo --preset=aeneas, roots at the verify cone,sha2/sha3/zeroize/rand_coreopaque, featuresslh_dsa_sha2_128s) — LLBC produced, exit 0. - Aeneas: translated the entire const-generic verify cone to Lean
definitions (
wots.chain…slh.slh_verify_internalall generated), with exactly one obstruction class (3 unique errors): thecrate::hashers::Hashersstruct of plain function pointers cannot be translated. - Phase 1 — DONE (2026-07-22): the Aeneas-compat patch landed in
fips205-source(snapshot2d89ee3): an additive monomorphic SHA2-128s verify module (src/verify_mono.rs) whose hash suite is reached through named free functions inverify_mono::oracle(marked opaque at the Charon boundary) — thesha512_*-shim pattern. Two further compat refinements: the message-digest input M' passes as a single&[u8](nested&[&[u8]]is untranslatable), and onelet-elsebecame theis_err/unwrapidiom.verification/extract.shnow re-derives the model from the mono root; charon + aeneas both exit 0, andverification/check.shcompiles the result. The generic paths and all twelve parameter sets are untouched (the only change to existing code is two lines wiring the module).
What will be claimed (when the button is green, not before)
One theorem per layer, each a statement about the extracted functions
(H3), compiled by verification/check.sh with a per-certificate
#print axioms audit (H1): chain semantics, WOTS+ pk recomputation,
XMSS path recomputation, hypertree acceptance, FORS pk recomputation,
and the apex — slh_verify_internal accepts iff the recomputed
hypertree root equals the pinned public-key root.
The allowed axiom set, stated precisely: unlike the ed25519 field and
scalar layers (whose cones are exactly [propext, Classical.choice, Quot.sound]), the hash oracles permeate every SLH-DSA layer — chain
already calls F. So each certificate's cone may contain the three
kernel axioms plus at most the five named oracles
(verify_mono.oracle.{h_msg, f, h, t_l, t_len}) — and nothing else: the
transpiler-plumbing axioms currently in FunsExternal.lean must be
discharged before any certificate ships, and the audit fails the button
if any of them (or anything unlisted) appears in a cone.
Discipline
Every Lean compile in this repository runs under verification/lean-guard
(memory-capped, machine-wide serialized). Extraction is reproducible from
the committed extract.sh against the pinned snapshot (R1). What cannot
be proven is named in TRUSTED-BASE.md, not hidden (H5).