Files
corona/PROOF-CLAIMS.md
zeekay 1367e9bb97 docs: certify Corona a STRICT trustless lane (no-reconstruct signing, gate 5)
- LLM.md: Latest Tag -> v0.10.0; record the no-reconstruct signing gate +
  v0.9.0 DKG cutover in the recent-commits table.
- PROOF-CLAIMS.md: catalogue the new code-level conformance gate alongside
  the Lean-4 secret_aggregate_no_reconstruct proof, framed honestly as a
  TEST gate (not a proof-assistant artifact).

Audit verdict (branch audit/no-reconstruct-signing): Corona threshold signing
is no-reconstruct — each party emits z_i = R_i*u + maskPrime_i + c*lambda_i*s_i
- mask_i from its OWN share; SignFinalize sums the masked partials z_sum = Sum
z_j = R*u + c*s; the secret s = Sum lambda_j*s_j appears only as the coefficient
of the public challenge c inside the masked aggregate and is never materialised.
Dealerless keygen (keyera.Bootstrap) + no-reconstruct signing => strict
trustless lane for STRICT_DUAL_PQ / POLARIS_MAX.
2026-06-28 00:57:18 -07:00

18 KiB
Raw Permalink Blame History

PROOF-CLAIMS — Corona (assurance-vocabulary, HONEST)

What this submission proves, and — critically — what it does NOT. Every claim carries one assurance-vocabulary tag that MATCHES the artifact's actual state. Companion to AXIOM-INVENTORY.md (bucketed axiom census), BLOCKERS.md (open findings), TRUSTED-COMPUTING-BASE.md (TCB), SUBMISSION.md (cover sheet).

Read this before reading the Corona code. The framing matters as much as the implementation.

§0 Assurance vocabulary (canonical) + the two load-bearing disclosures

Tag Meaning
machine-checked A proof assistant verifies it; the named file has ZERO real sorry/admit/:= True tactics. The EasyCrypt toolchain is live on the host (opam switch proofs: easycrypt + why3 + alt-ergo, z3 solver) — all 14 theories compile under easycrypt compile, enforced every run by security/framework/checks/ec-machine-check.sh. (combine_abs_op_lifted_eq_rlwe is now a machine-checked lemma; its residual is the narrow public threshold_public_commitment_eq_central.)
sound-by-reduction Pen-and-paper reduction to a stated assumption; not mechanized.
interop-tested Validated against ≥2 INDEPENDENT implementations.
asserted-axiom Taken as an axiom in EC; bucketed in AXIOM-INVENTORY.md (A/B).
fail-closed-pending-review Implemented but gated to REFUSE until external review.
open-research Multi-month roadmap; not done.

Disclosure 1 — TWO models; reconstruct-then-sign is the idealised one, NOT the production residual (RE-SCOPED this pass).

Model 1 (idealised correctness). corona_n1_byte_equality / _extracted prove the threshold combine equals CombineAbs.combine, whose body reduces — via combine_abs_op_lifted_bridge and sign_abs_op_lifted_eq_rlwe — to rlwe_sign_op (reconstruct quorum shares) …: the centralised Module-LWE signer applied to the Lagrange-reconstructed master secret. The Boschini combine steps 26 are opened inside combine_body_spec, not proved. So Model 1 is machine-checked (0 admits) modulo a C-cone that reconstructs-then-signs — an idealised correctness statement, NOT how production runs and NOT a leak-freeness proof.

Model 2 (the HONEST production residual, Corona_N1_NoLeak.ec). The production path's per-party masked responses z_i = R_i·u + maskPrime_i + c·λ_i·s_i mask_i aggregate to R·u + c·s because the pairwise-PRF masks telescope to zero (mask_telescope_zero) — the master secret is never formed and no per-party c·s_i is ever exposed (no_leak_z_aggregate). The CORRECTNESS core of Model 2 is machine-checked in Lean 4 + Mathlib on this host (lake build green, 0 sorry): Crypto.Corona.NoLeakAggregate (pairwise_mask_telescopes, summed_response_is_mask_free, secret_aggregate_no_reconstruct, no_leak_under_standard_assumptions) + Crypto.Threshold_Lagrange. The ONLY open assumption is no_leak_reduction: under Module-LWE + Module-SIS (the SAME substrate §ProofSubstrate / AXIOM-INVENTORY.md §1 already lists) the public transcript leaks nothing about s beyond one single-party Boschini signature — a STANDARD PQ assumption, not an implementation reconstruct. Model 2's EC side is written, machine-recheck pending EasyCrypt; its Lean core is machine-checked now.

Code-level conformance gate (added v0.10.0). The same no-reconstruct property is pinned at the IMPLEMENTATION level by threshold/no_reconstruct_sign_test.go: (GATE A) a go/ast scan of every signing/verify function proving none calls an across-party reconstruction primitive (reconstruct/interpolate/combineShares/recover*/ ShamirSecretSharing/lagrangeAtZero) nor the trusted-dealer keygen (Gen/GenerateKeysTrustedDealer) — per-party party.Lambda on the party's OWN share is the legitimate no-reconstruct mechanism and is deliberately NOT forbidden; the gate's teeth are negative-control-verified (injecting a reconstruct call into SignFinalize trips it); (GATE B) a reflect gate proving the inter-party messages Round1Data/Round2Data and the final Signature carry no share/sk/seed/λ, so the aggregator never holds a second party's secret; (GATE C) a real (3,5) no-reconstruct ceremony verifying under the independent Corona verifier. This is a test gate (assurance tag: code-review/interop-tested at the construction level), NOT a proof-assistant artifact — it complements, and does not replace, the Lean core.

Disclosure 2 — the no-leak property is NOT independently interop-tested. Corona's KAT cross-validation is Go↔C++ of the SAME construction (luxcpp/crypto/corona), not against an independent verifier. There is no CIRCL/pq-crystals analog for Module-LWE (no NIST target). So Corona's combine output byte-equality is asserted + same-construction-KAT-tested, NOT interop-tested in the ≥2-independent-implementations sense (unlike Pulsar's CIRCL + pq-crystals). We therefore do NOT claim Corona byte-equality is "proven/verified" anywhere in this document.

§1 The narrow claim Corona makes at this submission

The strongest precise statement supported by Corona v0.4.1:

Construction-level interchangeability (Class N1). Every signature byte string produced by the Corona threshold finalize procedure (sign.Party.SignFinalize, exposed as threshold.Signer.Finalize, which aggregates the Round-2 z shares) on inputs (group_pk = (A, bTilde), m, ctx, quorum, shares) satisfying the protocol's well-formedness invariants verifies under the Corona reference verifier sign.Verify(group_pk, m, σ) with outcome OK.

Public-key preservation across resharing (Class N4). Every Corona Refresh or ReshareToNewSet ceremony on input (group_pk = (A, bTilde), old_shares, old_committee, new_committee) satisfying the protocol's honest-majority assumption produces new_shares such that any subsequent threshold signing under those new shares verifies under the byte-identical unchanged group_pk.

Formal-statement status: these are stated in prose, validated by test, and inherited from the Boschini et al. ePrint 2024/1113 §3 analysis for the underlying construction. They are NOT mechanized in EasyCrypt, Lean, Jasmin, or any other proof assistant at this submission. See §3 below for the explicit non-claims list.

§2 What IS provided

Aspect Status Source
Implementation matches the Boschini et al. ePrint 2024/1113 construction ✓ by code review + KAT cross-validation sign/, threshold/, primitives/
Class N1 (construction-level output verifies under same verifier) ✓ by test (no mechanized refinement) sign/sign_test.go, sign/sign_roundtrip_test.go, threshold/threshold_test.go
Class N4 (reshare preserves (A, bTilde)) ✓ by test (45+ tests in reshare/, integration tests assert byte-equal (A, bTilde) post-reshare) reshare/full_integration_test.go, reshare/refresh_test.go, reshare/reshare_test.go
Constant-time on threshold + dkg2 verification paths ✓ by per-path static audit CONSTANT-TIME-REVIEW.md
KAT cross-runtime byte-equality (Go ↔ C++ luxcpp port) ✓ by manifest enforcement scripts/regen-kats.sh --verify + scripts/regen-kats.manifest.sha256
Fuzz coverage on round-based protocols ✓ harnesses wired (operational fuzz budgets are deployment-level) reshare/fuzz_*_test.go, dkg2/fuzz_round_test.go, threshold/fuzz_round_test.go
Hash-suite injection for Corona-SHA3 production profile ✓ by code (F22 closure) hash/sp800_185.go, primitives/hash.go
Identifiable-abort evidence ✓ by test reshare/complaint_test.go, dkg2/complaint.go
Activation cert as circuit-breaker ✓ by test (verifies under unchanged GroupKey) reshare/activation_test.go

§3 What is NOT proved (HONEST)

This section is the load-bearing honesty disclosure. Read it.

§3.1 v0.7.0: EC + Lean + Jasmin scaffolding LANDED — but the EC byte-equality is reconstruct-then-sign (asserted-axiom cone)

Assurance: machine-checked structure (0 admits) MODULO the C-cone of asserted axioms (reconstruct-then-sign). The 13 EC theories are structurally complete, but corona_n1_byte_equality rests on the open bucket-C axioms in AXIOM-INVENTORY.md §C (the combine_body_spec byte-walk with Boschini steps 26 inside it, and the combine_abs_op_lifted_bridge / sign_abs_op_lifted_eq_rlwe wrapper bridges that pin the lifted op to rlwe_sign_op on the reconstructed secret). See §0 Disclosure 1.

v0.7.0 update: Corona now ships:

  • 13 EasyCrypt theories compiling clean with admit budget 0/0 (proofs/easycrypt/Corona_N1.ec + Corona_N4.ec + Layout + Refinement + Wrapper + Extracted + lemmas/RLWE_Functional.ec + lemmas/Corona_CT.ec).
  • 5 Lean <-> EC bridges (Shamir, OutputInterchange, Unforgeability, dkg2 -- see proofs/lean-easycrypt-bridge.md).
  • 3 Jasmin threshold-layer sources (round1.jazz, round2.jazz, combine.jazz) with #ct annotations + 1 centralized rlwe/sign.jazz reference + a lib/ of shared primitives.
  • dudect harness at ct/dudect/ for Verify + Combine.
  • CI orchestrator scripts/check-high-assurance.sh with 7 per-push gates (mirroring Pulsar's exactly).

What's still operational (roadmap v0.8.0):

  • Jasmin extraction filling out the byte-walk refinement obligations in Corona_N1_{Combine,Sign}_Refinement.ec.
  • dudect submission-grade 10^9-sample runs on pinned hardware.
  • External cryptographic audit engagement.

The implementation-backed N1 byte-equality theorem to cite is Corona_N1_Extracted.corona_n1_byte_equality_extracted.

Module-LWE threshold signing has no NIST standard target. The Boschini et al. ePrint 2024/1113 construction IS the spec; the EC theories refine the Go implementation against the in-house mechanization of that spec (lemmas/RLWE_Functional.ec), which is the analog of Pulsar's libjade dependence on FIPS 204.

§3.2 NOT proved: lattice-hardness of Module-LWE

This submission says nothing about the post-quantum hardness of Module-LWE itself. Module-LWE security rests on Lyubashevsky-Peikert-Regev (2010), the Langlois-Stehlé (2015) module generalisation, and follow-up cryptanalytic analysis. The parameter set (N = 256, q = 0x1000000004A01, 48-bit prime) was chosen to provide ≥ 128 bits of post-quantum security per lattice-estimator methodology — but Corona ships no parameter-set worksheet at this revision; that is roadmap item v0.6.0.

The defensible PQ-safety claim:

Corona implements a published academic Module-LWE threshold signature construction (Boschini et al. ePrint 2024/1113) on a parameter set chosen to provide ≥ 128 bits of post-quantum security against known Module-LWE attacks per the lattice-estimator methodology of Albrecht-Player-Scott. The construction's EUF-CMA reduction is in the cited paper.

NOT defensible:

Corona is proved post-quantum secure.

§3.3 NOT proved: byte-equality with FIPS 204 ML-DSA

Corona signatures are NOT byte-equal to FIPS 204 ML-DSA signatures. The two constructions are different schemes within the Module-LWE family (Corona is the Raccoon/Ringtail line; ML-DSA is the Dilithium line), with different moduli, module dimensions, and parameter sets. Any reviewer expecting FIPS 204 byte-equality should look at the Pulsar sibling at ~/work/lux/pulsar/.

§3.4 NOT proved: statistical constant-time validation (dudect)

CONSTANT-TIME-REVIEW.md documents a per-path static audit with zero (c) (must-fix) findings. It does NOT include statistical validation via dudect-style timing measurements. A dudect-style harness is roadmap item v0.8.0; at submission scaffolding time the constant-time evidence is the static audit + the upstream lattigo constant-time claims.

§3.5 NOT proved: implementation-side covert-channel safety

The static constant-time audit does NOT address:

  • Memory-access leakage (cache-timing side channels)
  • Power side-channels
  • EM side-channels
  • Fault attacks
  • Microarchitectural leakage (Spectre / Meltdown class)
  • Statistical timing under realistic deployment conditions

Production deployments MUST follow the hardening checklist in DEPLOYMENT-RUNBOOK.md (mlock pinning, core-dump disable, ptrace disable, dedicated host, etc.).

§3.6 NOT proved: protocol-level adversarial robustness

The construction-level claim in §1 is honest-quorum correctness. It says: "when all parties follow the protocol, the output verifies and resharing preserves the group key." It does NOT prove:

  • Unforgeability under adaptive corruption — inherited (with caveats) from Boschini et al. §3; no Corona-specific mechanization.
  • Identifiable abort under network partition — synchronous network assumptions hold; async abort is out of scope.
  • Robust completion under f < t/2 Byzantine parties.
  • DKG soundness under adversarial dealer — Pedersen DKG (dkg2/) provides hiding and binding under standard assumptions; full reduction is in the LP-073 paper but not mechanized here.

§3.7 v0.7.0: 5 Lean-bridged algebraic axioms LANDED (was: NOT proved)

v0.7.0 update: Corona now has 5 Lean-bridged algebraic axioms, in 1:1 correspondence with Pulsar's:

Corona EC axiom Lean theorem
lagrange_inverse_eval (Corona_N1.ec) Crypto.Corona.Shamir.shamir_correct_at_target
threshold_partial_response_identity (Corona_N1.ec) Crypto.Threshold.Lagrange.threshold_partial_response_identity
add_share_zeroR (Corona_N4.ec) Mathlib AddCommMonoid instance
reconstruct_linear (Corona_N4.ec) Crypto.Threshold.Lagrange.combine_distributes_over_sum
shamir_correct (Corona_N4.ec) Crypto.Corona.Shamir.shamir_correct_at_target

The bridge document is proofs/lean-easycrypt-bridge.md. The CI guard scripts/check-lean-bridge.sh verifies every EC axiom has the required citation comment + that the cited Lean theorem still exists in the named Lean file.

§4 Refinement chain (what's connected to what)

Go implementation (sign/, threshold/, dkg2/, reshare/, primitives/, hash/)
       implements (by code review + KAT)
Boschini et al. ePrint 2024/1113 §3 algorithmic spec
  + Corona production-lifecycle additions in SPEC.md §§6, 9, 10, 13
       conforms to (by inspection)
DESIGN.md invariants ("what is preserved across resharing")

Each "implements" / "conforms" relation is by inspection and test, NOT machine-checked. Compare to Pulsar's refinement chain, which is machine-checked (0-admit) at the EC level but only modulo the same reconstruct-then-sign asserted-axiom cone — Pulsar's EC byte-equality is also relative to combine_body_axiom / S_functional_spec (its AXIOM-INVENTORY.md §C). The honest difference is degree of decomposition (Pulsar splits the byte-walk into ~10 narrow per-stage sub-axioms; Corona keeps one combine_body_spec) and interop: Pulsar's final signature is interop-tested vs CIRCL + pq-crystals, Corona's is same-construction Go↔C++ KAT only (§0 Disclosure 2).

§5 What an auditor verifying this submission should do

  1. Read the SUBMISSION.md cover sheet for context.
  2. Read this document (PROOF-CLAIMS.md) for what's proved vs not.
  3. Read TRUSTED-COMPUTING-BASE.md for the implementation TCB.
  4. Read CONSTANT-TIME-REVIEW.md for the per-path CT audit.
  5. Read Boschini et al. ePrint 2024/1113 for the underlying construction analysis (academic prior art).
  6. Run scripts/test.sh — expect Go unit + integration + KAT tests all green.
  7. Run scripts/gen_vectors.sh && scripts/regen-kats.sh --verify — expect byte-equal KAT manifest agreement.
  8. Read the Go reference implementation: sign/sign.go, threshold/threshold.go, dkg2/dkg2.go, reshare/reshare.go, reshare/activation.go, primitives/hash.go, hash/sp800_185.go.
  9. Run scripts/bench.sh — expect performance numbers within docs/evaluation.md published bounds.

§6 The honest one-paragraph version

Corona's submission package establishes that the Go reference implementation faithfully implements the Boschini, Kaviani, Lai, Malavolta, Takahashi, and Tibouchi 2-round Module-LWE threshold signature construction (IACR ePrint 2024/1113, IEEE S&P 2025) on a fixed parameter set, plus production lifecycle additions (Pedersen DKG over R_q, proactive resharing with Refresh + ReshareToNewSet primitives, identifiable abort, activation certs as the resharing circuit-breaker, KAT-deterministic Corona-SHA3 hash suite). Unlike the Pulsar sibling submission (which ships a mechanized EasyCrypt + Lean + Jasmin refinement chain against FIPS 204), Corona ships NO machine-checked refinement at this submission — Module-LWE has no NIST standard target, the construction IS the spec, and mechanizing the construction itself is a multi- month research roadmap item. Corona's correctness evidence reduces to code review of the Go reference against the published construction, KAT cross-validation (Go ↔ C++ byte-equality manifest), the per-path constant-time static audit in CONSTANT-TIME-REVIEW.md (zero must-fix findings), fuzz harness coverage, and the academic security analysis in the cited paper. The proof tier is intentionally less mature than Pulsar's; the roadmap items in NIST-SUBMISSION.md lay out the multi-version path to mechanized refinement.

§7 Roadmap (multi-version closure path)

Milestone Target version Status
Single-document spec/corona.tex consolidating LaTeX v0.6.0 shipped
EasyCrypt theory shell for the construction-level interchangeability claim v0.7.0 shipped (13 files, admit 0/0)
Lean 4 / Mathlib mechanization of Lagrange-aggregation over R_q v0.7.0 shipped (5 Lean-bridged axioms)
Jasmin sources + jasmin-ct CT gates on the threshold layer v0.7.0 shipped (3 threshold + 1 rlwe + lib/)
dudect harness wired (smoke-budget) v0.7.0 shipped (Verify + Combine)
dudect submission-grade 10^9-sample runs on pinned hardware v0.8.0 roadmap
External cryptographic audit (engaged lab) v0.8.0 roadmap
Parameter-set worksheet (lattice-estimator concrete bounds) v0.6.0 shipped
Jasmin extraction filling out byte-walk refinement v0.8.0 roadmap

The closure path is real but long. The honest framing at this submission: production-hardened implementation of a published academic construction, with production lifecycle additions, NOT machine-checked refinement of a NIST standard.


Document metadata

  • Name: PROOF-CLAIMS.md
  • Version: v0.2 (v0.7.0 EC + Lean + Jasmin scaffold landed)
  • Date: 2026-05-18