Harmonise the axiom accounting everywhere:
22 named axioms total — 17 narrow implementation-refinement
(14 byte-walk + 1 signature-codec round-trip + 2 honest-
execution no-reject post-conditions) plus 5 Lean-bridged
algebraic, each with file:line in EC and Lean.
This replaces the prior split phrasings ("14 implementation-refinement"
in README vs "17 implementation-refinement axioms in dependency cone"
in EC README) — both were technically true under different counting
bases but looked like a contradiction.
- README.md: hard-boundary block + axiom table use canonical phrasing.
- SUBMISSION.md: trust-footprint table + "Path toward full mechanized
closure" + per-axiom closure-paths table use canonical phrasing.
- docs/proof-axiom-inventory.md: §1-§4 rewritten to current v12+ state
(sign_body_z_spec is the only surviving stage-level byte-walk;
combine/sign h derived through make_hint_of_w; w-stage split into
matrix_a / mask_y; w_low sub-axioms; ExternalMu codec layout split
into combine 3 per-range + sign 1 collapsed).
- docs/proof-claims.md: scope-boundary framing on adversarial
robustness section.
- docs/tcb.md: §3.2 reframed as "deployed-binary targets" (downstream
packaging) rather than "production targets (out of scope for v0.1)".
- docs/cryptographer-sign-off.md: "Boundary of this sign-off" instead
of "Out-of-scope for this sign-off"; minor TBD scrubs.
- proofs/easycrypt/README.md: trust-boundary table uses canonical
phrasing.
- proofs/easycrypt/Pulsar_N1_Extracted.ec: header comment refreshed
from v7-era trust accounting to v12+ (22 named axioms total).
- proofs/lean-easycrypt-bridge.md: "Future work" → "Closure paths";
summary uses canonical phrasing.
- proofs/easycrypt/extraction/{combine,sign}-byte-walk-roadmap.md:
"followup B" → "v10 no-reject decomposition".
8.9 KiB
PROOF-CLAIMS — Pulsar Class N1 byte-equality
What this proof actually establishes — and what it does NOT. Companion document to
proof-axiom-inventory.md(trust footprint),fips-204-traceability.md(op→FIPS § map), andtcb.md(TCB).Read this before reading the EasyCrypt code. The framing matters as much as the proofs.
§1 The narrow claim
The strongest precise statement supported by the v10 proof artifact:
Class N1 byte-equality (extracted corollary). Under the trusted-computing base in
tcb.mdand the residual axioms enumerated inproof-axiom-inventory.md, every signature byte string produced by the Pulsar Combine procedure on inputs(group_pk, m, ctx, quorum, shares, rho_rnd)satisfying the protocol's well-formedness invariants (uniq quorum, size match, polynomial-degree bound, honest sharing, protocol consistency, accepted-path) is bit-identical to a signature produced by single-party FIPS 204 ML-DSA-65 Sign on the Lagrange-reconstructed group secret under the same(m, ctx, rho_rnd).
Formal statement:
lemma pulsar_n1_byte_equality_extracted :
equiv [ Pulsar_N1.ThresholdRun(CombineExtractedWrapper).run
~ Pulsar_N1.SinglePartyRun(SignExtractedWrapper).run :
={group_pk, shares, quorum, m, ctx, rho_rnd}
/\ uniq quorum{1}
/\ size shares{1} = size quorum{1}
/\ group_pk{1} = Pulsar_N1.derive_pk
(Pulsar_N1.reconstruct quorum{1} shares{1})
/\ Pulsar_N1.accept_signing_attempt
(Pulsar_N1.reconstruct quorum{1} shares{1})
m{1} ctx{1} rho_rnd{1}
/\ Pulsar_N1.poly_degree
(Pulsar_N1.reconstruct quorum{1} shares{1}) < size quorum{1}
/\ shares{1} = List.map
(Pulsar_N1.poly_eval
(Pulsar_N1.reconstruct quorum{1} shares{1}))
quorum{1}
==> ={res} ].
File: proofs/easycrypt/Pulsar_N1_Extracted.ec.
§2 What is proved
| Aspect | Status |
|---|---|
| Implementation refinement | ✅ EasyCrypt proof, 13 files compile, 0 admits |
| Byte-equality with FIPS 204 single-party | ✅ Per the lemma above |
| Class N1 (output-interchangeability) | ✅ Per the lemma above |
| Class N4 (reshare pk-preservation) | ✅ Separate theorem in Pulsar_N4.ec |
| Constant-time on threshold layer | ✅ jasmin-ct 3/3 blocking |
| Lean-bridged algebraic identities | ✅ 5 axioms with mechanized Lean proofs (Mathlib polynomial-Lagrange) |
| Bit-level FIPS 204 codec | ⚠ Abstracted via per-type roundtrip axioms (see proof-axiom-inventory.md §7) |
| κ-rejection loop acceptance probability | ⚠ Operational bound mldsa_accept_lower_bound, not probabilistic Hoare-logic |
| ML-DSA hardness (M-LWE / M-SIS) | ❌ NOT proved — assumed from NIST FIPS 204 analysis |
| Constant-time on libjade sign | ⚠ Advisory under jasmin-ct issue #2 |
| ACVP/CAVP algorithm validation | ❌ External (lab work) |
| FIPS 140-3 module validation | ❌ Applies to a packaged crypto module, not to this reference implementation |
§3 What is NOT proved (and why)
§3.1 NOT proved: lattice-hardness of ML-DSA
This proof artifact says nothing about the post-quantum hardness of ML-DSA itself. ML-DSA's security rests on Module-LWE and Module-SIS hardness assumptions; those are NIST's responsibility (FIPS 204 incorporates the analysis), not ours.
The defensible PQ-safety claim:
Pulsar implements a NIST-standardized post-quantum signature algorithm (FIPS 204 ML-DSA-65) and refines that algorithm's functional specification with the trust base enumerated in proof-axiom-inventory.md.
NOT defensible:
Pulsar is proved post-quantum secure.
§3.2 NOT proved: implementation-side covert-channel safety
The EC refinement proof says nothing about timing, memory access, randomness, or power side-channels. Those are addressed separately:
| Side-channel risk | Evidence |
|---|---|
| Timing leakage (threshold layer) | jasmin-ct 3/3 blocking — round1.jazz, round2.jazz, combine.jazz CT-clean |
| Timing leakage (libjade sign) | Advisory (jasmin-ct issue #2 — documented in ct/jasmin-ct-libjade.md) |
| Statistical timing (dudect 10⁹ samples) | Nightly gate scripts/nightly.sh; harness arm64 + x86_64 clean via ct/dudect/Makefile. Submission-grade 10⁹-sample run is the gate that promotes the harness from "wired" to "passed" — see cryptographer-sign-off.md §Gates GATE-3 for the dudect-pending disclosure. Per-push smoke runs are informational only. |
| Randomness misuse | Reference impl uses crypto/rand; each deployed-binary target re-audits its RNG source |
| Zeroization | ref/go/pkg/pulsar/zeroize.go (CR-8 closure since v1.0.6): zeroizeBytes / zeroizeSeed / zeroizeU16 / zeroizePrivateKey best-effort wipes on every Combine/Sign/DKG exit path |
| Fault attacks | Not addressed |
§3.3 NOT proved: protocol-level adversarial robustness
Class N1 byte-equality is honest-quorum correctness. It says: "when all parties follow the protocol, the output verifies." It does NOT prove:
- Unforgeability under adaptive corruption — proved separately
through
Pulsar_M/Unforgeability.lean. - Identifiable abort under network partition — synchronous network only; asynchronous identifiable-abort attribution routes through a separate consensus-layer accountability artifact.
- Robust completion under f < t/2 Byzantine parties.
- DKG soundness under adversarial dealer.
See pulsar-m/unforgeability.tex for the unforgeability reduction
(stated, mechanization in flight).
§3.4 NOT proved: bit-level FIPS 204 codec correctness
The proof abstracts the FIPS 204 §3.5 codec via per-type
encode/decode roundtrip axioms (encode_decode_signature,
encode_decode_sk, encode_decode_msg, etc.). Closing these as
lemmas requires a Barbosa-Barthe-Dupressoir-scale Dilithium
mechanization (CRYPTO 2023, ~6 person-months). Inventoried in
proof-axiom-inventory.md §7.
§3.5 NOT proved: external Lean theorems
5 axioms in the EC dependency cone are Lean-bridged (mechanized in Lean 4 + Mathlib). The EC side TRUSTS these. Closing requires either: (a) Porting Mathlib's polynomial-Lagrange theory to EasyCrypt (multi-week), OR (b) Building a checked Lean ↔ EC translation tool (multi-month — no published tool exists).
See proofs/lean-easycrypt-bridge.md for the correspondence.
§4 Refinement chain (what's connected to what)
EasyCrypt threshold model
(Pulsar_N1.ec, Pulsar_N1_Combine_Refinement.ec, Pulsar_N1_Sign_Refinement.ec)
refines
EasyCrypt centralised functional model
(Pulsar_N1.mldsa_sign_op = pack_n1_signature ∘ run_signing_components ∘ unpack_sk ∘ compute_mu)
refines (via per-type codec axioms)
FIPS 204 ML-DSA-65 functional specification
(MLDSA65_Functional.ec — abstract op surface mirroring FIPS 204 §3 + §6)
conforms to
FIPS 204 standard text
(NIST FIPS 204, August 2024)
Each "refines" relation is mechanized; each "conforms to" relation is by inspection.
Jasmin threshold layer (round1.jazz, round2.jazz, combine.jazz)
extracts to EasyCrypt
EasyCrypt extracted procedures
(proofs/easycrypt/extraction/build/{combine,sign}.ec)
(byte-walk obligations on output values)
EasyCrypt centralised functional model (above)
The byte-walk obligations are the remaining primitive axioms in
proof-axiom-inventory.md §1–§4.
§5 What an auditor verifying this proof should do
- Read the SUBMISSION.md cover sheet for context.
- Read
proof-axiom-inventory.mdfor the residual trust base. - Read this document (
proof-claims.md) for what's proved vs not. - Read
tcb.mdfor the EC/Jasmin/OCaml TCB. - Run
scripts/check-high-assurance.sh— expect 0/0 admits + 5/5 Lean bridges + 13/13 EC compile. - Cross-check the residual axioms in
proof-axiom-inventory.mdagainst the raw grep:grep -rE "^axiom\s+\w" proofs/easycrypt/ | wc -l - For each Lean-bridged axiom, verify the Lean theorem at the cited location.
- Run the test vectors in
vectors/against the reference implementation inref/go/.
§6 The honest one-paragraph version
Pulsar's EasyCrypt proof artifact establishes that the Jasmin-extracted threshold combine procedure produces a byte string bit-identical to a single-party FIPS 204 ML-DSA-65 signature on the Lagrange-reconstructed group secret, modulo the trust footprint enumerated in proof-axiom-inventory.md (residual byte-walk obligations on extracted Jasmin code, Lean-bridged Lagrange algebraic identities, FIPS 204 per-type codec roundtrip axioms, and the EasyCrypt/Jasmin/OCaml trusted-computing base). The proof is an implementation-correctness result; it does NOT prove the post-quantum hardness of ML-DSA, which inheres in NIST's FIPS 204 analysis of Module-LWE and Module-SIS.
Document metadata
- Name:
proof-claims.md - Version: v1.0 (post v10)
- Date: 2026-05-18