- 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.
18 KiB
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 2–6 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 asthreshold.Signer.Finalize, which aggregates the Round-2zshares) on inputs(group_pk = (A, bTilde), m, ctx, quorum, shares)satisfying the protocol's well-formedness invariants verifies under the Corona reference verifiersign.Verify(group_pk, m, σ)with outcomeOK.
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 producesnew_sharessuch that any subsequent threshold signing under those new shares verifies under the byte-identical unchangedgroup_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 2–6 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
#ctannotations + 1 centralized rlwe/sign.jazz reference + alib/of shared primitives. - dudect harness at
ct/dudect/for Verify + Combine. - CI orchestrator
scripts/check-high-assurance.shwith 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/2Byzantine 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
- Read the
SUBMISSION.mdcover sheet for context. - Read this document (
PROOF-CLAIMS.md) for what's proved vs not. - Read
TRUSTED-COMPUTING-BASE.mdfor the implementation TCB. - Read
CONSTANT-TIME-REVIEW.mdfor the per-path CT audit. - Read Boschini et al. ePrint 2024/1113 for the underlying construction analysis (academic prior art).
- Run
scripts/test.sh— expect Go unit + integration + KAT tests all green. - Run
scripts/gen_vectors.sh && scripts/regen-kats.sh --verify— expect byte-equal KAT manifest agreement. - 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. - Run
scripts/bench.sh— expect performance numbers withindocs/evaluation.mdpublished 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 inCONSTANT-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 inNIST-SUBMISSION.mdlay 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