Files
corona/AXIOM-INVENTORY.md
zeekay c0399e2607 docs/comments: correct lattice-family label Ring-LWE -> Module-LWE (Corona is Module-LWE)
Corona is Module-LWE (threshold-Raccoon/Ringtail), NOT Ring-LWE. Confirmed in code: sign/sign.go samples A in R_q^{8x7} (sign.go:87 SamplePolyMatrix M=8,N=7), secret s a rank-7 ring vector, b=A*s+e (sign.go:106-107) over R_q=Z_q[X]/(X^256+1) (LogN=8), q=0x1000000004A01 -- rank>1 module structure, not rank-1 ring-LWE. threshold/threshold.go:4-5 already said Module-LWE.

Fixed the family label across README, SPEC, SUBMISSION, NIST-SUBMISSION, PATENTS, LLM, CONTRIBUTING, SECURITY, CHANGELOG, DEPLOYMENT-RUNBOOK, Makefile, AXIOM-INVENTORY, PROOF-CLAIMS, BLOCKERS, CRYPTOGRAPHER-SIGN-OFF, FIPS-TRACEABILITY, TRUSTED-COMPUTING-BASE, AUDIT-2026-05/06, docs/mptc/*, jasmin/README, 3 Go comments + cli help string.

Also corrected the downstream false claim that Corona (Ring-LWE) and Pulsar (Module-LWE) are 'different lattice families' giving 'structural/family diversity': both are Module-LWE, so the Double-Lattice defense is construction/implementation diversity (threshold-Raccoon vs ML-DSA), not hardness-family diversity; a Module-LWE break affects both legs (hash-based Magnetar is the assumption-diversifier). Fixed companion R-SIS -> Module-SIS where it was the module scheme's SIS assumption; added the Langlois-Stehle (DCC 2015) Module-LWE citation alongside LPR 2010.

Delicate artifacts: proof identifiers (rlwe_sign_op, RLWE_Functional theory/file, *_eq_rlwe bridges, CentralRLWESign, RLWESign, rlwe_compute_*) were NOT renamed -- EasyCrypt/jasmin toolchains are absent here so a rename cannot be compile-verified, and .assurance/ gates parse those names. Added clarifying naming notes to the 5 prominent .ec files, proofs/easycrypt/README.md, AXIOM-INVENTORY.md, and jasmin/rlwe/sign.jazz. .assurance/*.txt left untouched (already say Module-LWE/Module-SIS; rlwe tokens are gate-parsed identifiers). Left AUDIT-2026-06.md:463 historical rename-log and the ProtoStar-LWE paper-title substring untouched.

go build ./... and go test ./... green (GOWORK=off; all packages ok).
2026-06-27 16:12:24 -07:00

342 lines
26 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AXIOM-INVENTORY — Corona (bucketed, honest, complete)
> Honest enumeration of every cryptographic assumption + residual EC
> axiom Corona depends on, classified into exactly one bucket with a
> per-axiom justification. This document is the disclosure artifact for
> the Tier-A submission gate and the merge gate "remaining axioms not
> discharged OR reclassified": every residual axiom is RECLASSIFIED
> (bucketed + justified), and the genuinely-open security assumptions are
> flagged **C / OPEN** and tracked in `BLOCKERS.md`.
>
> Status correction (this pass): the prior revision of §2 labelled the
> wrapper-bridge axioms (`combine_abs_op_lifted_bridge`,
> `sign_abs_op_lifted_eq_rlwe`) and the section-local `combine_body_axiom`
> / `S_functional_spec` as "Discharged in the Wrapper". That was
> **understated**. The wrapper *lemmas* (`wrapper_combine_refines_abs`,
> `wrapper_sign_refines_central`) are real EasyCrypt, but they REST ON
> those bridge axioms, and the bridge axioms carry the security content
> (they assume the aggregated combine equals `rlwe_sign_op` of the
> **Lagrange-reconstructed master secret**). They are now correctly
> classified **C / OPEN**.
> **Naming note.** Identifiers and EasyCrypt/Lean file names containing
> `rlwe` / `RLWE` (e.g. `rlwe_sign_op`, `RLWE_Functional.ec`, the wrapper
> bridges `*_eq_rlwe`, and the informal "centralised RLWE sign" reference
> signer) are retained **proof identifiers** for the single-party reference
> signer the threshold protocol refines against; they are deliberately not
> renamed, to keep the EasyCrypt/Lean developments compiling. Corona is a
> **Module-LWE** scheme (threshold-Raccoon/Ringtail; module dims M=8, N=7
> over `Z_q[X]/(X^256+1)`).
## Buckets
- **A — STANDARD-MATH-FACT.** Cited field/algebra/coding identity EC lacks
built-in over the abstract types in play. Legitimate; cite the source.
- **B — SERIALIZATION/LAYOUT-IDENTITY.** encode/decode round-trips,
byte-length facts, layout refinement over abstract ops/constants.
Dischargeable only after concretizing the op/constant.
- **C — OPEN SECURITY ASSUMPTION.** Security-relevant content the reduction
has NOT closed — the steps-2–6 combine body + the reconstruct-then-sign
`CombineAbs` abstraction. **MUST stay open and disclosed.** Tracked in
`BLOCKERS.md`.
## §1 Construction-level assumptions (cryptographic substrate — NOT Lux-closable)
These are the underlying hardness + soundness assumptions of the Module-LWE
threshold construction, inherited from the literature. They are not closed
in any Lux work and are not counted in the EC axiom histogram below.
| Assumption | Reference | Rationale for non-closure |
|---|---|---|
| Module-LWE hardness | Lyubashevsky-Peikert-Regev (TOC 2013); Langlois-Stehlé (DCC 2015) | Standard PQ lattice hardness; same substrate as ML-DSA / ML-KEM. |
| Module-SIS hardness over `R_q` | Ajtai (1996); Micciancio-Regev (SIAM 2007); Langlois-Stehlé (DCC 2015) | Unforgeability reduces to Module-SIS at `sign/config.go` parameters. |
| Boschini-Kaviani-Lai-Malavolta-Takahashi-Tibouchi soundness | IACR ePrint 2024/1113; IEEE S&P 2025 | The 2-round threshold protocol's UC-soundness is in the cited paper; Lux's fork inherits it. Note: this is the Ringtail/Corona-family paper, NOT a Pulsar citation. |
| Pedersen-VSS soundness | Pedersen (CRYPTO 1991) | Corona's DKG (`dkg2/`) reduces to discrete-log hardness. |
| cSHAKE256 / KMAC256 collision + preimage resistance | NIST SP 800-185 | Domain-separated hashing across DKG/signing/reshare. |
## §2 EC residual axioms — histogram (nominal sub-bucket counts)
> The per-bucket counts below are hand-maintained nominal figures. The
> MACHINE-ENFORCED authority is `.assurance/budget.txt` `AXIOM=59`
> (comment-stripped declarations across the whole proof tree, EC + Lean);
> sub-bucket drift never gates. The gate `ec-machine-check.sh` confirms
> 14/14 EC theories compile.
| Bucket | Count | Discharged this pass | Remaining |
|---|---:|---:|---:|
| A — standard-math-fact | 18 | 0 (abstract algebra / Lean-bridged; A IS machine-checked in Lean, see below) | 18 |
| B — serialization/layout | 28 | 0; **+1 `mask_telescope_zero`** (EC contract of the machine-checked Lean telescope) | 28 |
| C — open security assumption | 12 | **−1 `combine_abs_op_lifted_eq_rlwe` DISCHARGED → LEMMA** (z-leg via the machine-checked keystone; master secret never reconstructed); **+1 `threshold_public_commitment_eq_central`** — the NARROW PUBLIC-commitment residual that replaces it (no `c*s`, no secret). Net 0; the secret-bearing whole-bridge residual is GONE, only the public-commitment c/Delta-leg residual remains. | 12 |
| **Total** | **(nominal 58; budget authority = 59 EC+Lean)** | **C11 → lemma** | **— see budget.txt** |
> **A IS MACHINE-CHECKED IN LEAN ON THIS HOST.** The five A-axioms (A1–A5:
> `lagrange_inverse_eval`, `threshold_partial_response_identity`,
> `reconstruct_linear`, `shamir_correct`, `add_share_zeroR`) correspond 1:1
> to **sorry-free Lean 4 + Mathlib theorems that `lake build` compiles green
> on this host** (`Crypto.Threshold_Lagrange`, `Crypto.Corona.Shamir`). They
> remain EC `axiom`s only because EasyCrypt's field/polynomial theory is too
> thin to re-derive them in-prover; the gap is cross-prover proof-object
> exchange, not the absence of a proof.
> **Discharged into machine-checked Lean this pass: the no-leak CORRECTNESS
> CORE.** `Corona_N1_NoLeak.ec` states the production no-leak model whose
> algebraic core — the telescoping pairwise-mask cancellation + the Lagrange
> secret aggregate (master secret never formed) — is **newly machine-checked
> in Lean** (`Crypto.Corona.NoLeakAggregate`: `pairwise_mask_telescopes`,
> `summed_response_is_mask_free`, `secret_aggregate_no_reconstruct`,
> `no_leak_under_standard_assumptions`). The residual EC axiom is the
> Module-LWE/MSIS reduction, a STANDARD assumption (the same substrate §1
> lists) — not an implementation reconstruct.
>
> **EC TOOLCHAIN IS LIVE ON THIS HOST** (opam switch `proofs`: easycrypt +
> why3 + alt-ergo, z3 solver). The gate `ec-machine-check.sh` compiles all
> 14/14 EC theories. The earlier "no EasyCrypt toolchain on host" note was
> FALSE and is removed.
>
> **EC axioms DISCHARGED this pass: the combine bridge (C11).** The former
> whole-bridge reconstruct-then-sign axiom `combine_abs_op_lifted_eq_rlwe`
> (C11) is now a **machine-checked LEMMA**: `combine_abs_op_lifted` was given a
> CONCRETE threshold definition (the no-leak assembly), and the bridge to
> `rlwe_sign_op (reconstruct …)` is proven on honest, well-formed quorums.
> The load-bearing z-leg goes through the machine-checked keystone
> `Corona_N1_NoLeak.no_leak_z_aggregate` (= Lean
> `threshold_partial_response_identity`); the c/Delta-legs go through the
> single NARROW PUBLIC residual `threshold_public_commitment_eq_central`
> (C11′). Net C-bucket change: flat (one whole-bridge axiom out, one
> public-commitment axiom in), but the residual is narrowed from a
> whole-signature secret-bearing identity to a public-commitment equality.
>
> The other in-file lemmas were already proved (`encode_decode_signature`,
> `decode_encode_signature_wf`, `encode_signature_len`, `read_after_write_sig`,
> `write_sig_separation`, `pack_n1_signature_injective`, `reconstruct_of_share`,
> `reconstruct_quorum_invariant`, `fresh_sharing_zero_is_zero`,
> `combine_post_signature`, `combine_idempotent`, `sign_post_signature`,
> `sign_idempotent`, `wrapper_combine_refines_abs`,
> `wrapper_sign_refines_central`, `corona_n1_byte_equality_extracted`). The
> residual A-axioms are over abstract algebra (`inf_norm_R : R_q -> int`), and
> the residual B-axioms are over abstract ops/constants (`op group_pk_width :
> int.`, `op sig_len : int.`, `share_encode`/`decode` abstract). Discharging
> them requires concretizing those — a verify-gated wire-format decision that
> cannot be done blind and machine-rechecked here. Faking such a discharge is
> the cheat the gate forbids. The honest reclassification + disclosure below is
> the gate-satisfying outcome.
EC admit budget remains **0 / 0** (real `admit.` tactics; statically
guarded by `scripts/checks/ec-admits.sh`). The `.assurance/budget.txt`
ADMIT key counts the *word* "admit" in comments and is informational.
---
### Bucket A — STANDARD-MATH-FACT (18)
| # | Axiom | File:line | Justification | Discharge path |
|---|---|---|---|---|
| A1 | `lagrange_inverse_eval` | Corona_N1.ec:266 | Lagrange-at-0 secret recovery from t distinct evals. **Load-bearing** (`reconstruct_of_share` uses `exact:`). | Lean-bridged `Crypto.Corona.Shamir.shamir_correct_at_target`. Acknowledged in reviewed-axioms.txt. |
| A2 | `threshold_partial_response_identity` | Corona_N1.ec:478 | Lagrange-aggregation of partial responses = `rlwe_compute_z` on reconstructed share. | Lean-bridged `Crypto.Threshold.Lagrange.threshold_partial_response_identity`. |
| A3 | `reconstruct_linear` | Corona_N4.ec:140 | Reconstruction linear over share-list addition. | Lean-bridged `Crypto.Threshold.Lagrange.combine_distributes_over_sum`. |
| A4 | `shamir_correct` | Corona_N4.ec:151 | Reconstruction left-inverse of fresh sharing. | Lean-bridged `Crypto.Corona.Shamir.shamir_correct_at_target`. |
| A5 | `add_share_zeroR` | Corona_N4.ec:133 | Additive identity on `share_t`. | Lean-bridged Mathlib `AddCommMonoid`. |
| A6 | `l2_norm_sq_vec_N_nonneg` | RLWE_Functional.ec:128 | L2² norm ≥ 0 (abstract `l2_norm_sq_vec_N`). | Discharge after norm concretization. |
| A7 | `l2_norm_sq_vec_M_nu_nonneg` | RLWE_Functional.ec:129 | As A6 over `vec_M_nu`. | As A6. |
| A8 | `inf_norm_R_nonneg` | RLWE_Functional.ec:130 | inf-norm ≥ 0 over `R_q`. | As A6. |
| A9 | `rlwe_correctness` | RLWE_Functional.ec:212 | Boschini ePrint 2024/1113 §3 correctness theorem (cited). | Inherited from the paper; not Lux-closable. |
| A10 | `share_to_bits_id` | RLWE_Functional.ec:238 | Type-identification pass-through. | Discharge after type identification is definitional. |
| A11 | `msg_to_bits_id` | RLWE_Functional.ec:239 | As A10. | As A10. |
| A12 | `ctx_to_bits_id` | RLWE_Functional.ec:240 | As A10. | As A10. |
| A13 | `rnd_to_bits_id` | RLWE_Functional.ec:241 | As A10. | As A10. |
| A14 | `bits_to_sig_id` | RLWE_Functional.ec:242 | As A10. | As A10. |
| A15 | `poly_degree_nonneg` | Corona_N1.ec:245 | `0 <= poly_degree s` (abstract `poly_degree`). | Discharge after `share_t` concretization. |
| A16 | `accept_signing_attempt_iff_components` | Corona_N1.ec:547 | accept ⇔ (l2-z ∧ l2-Δ ∧ full-rank): algebra of the Module-LWE accept predicate. | Discharge with the concrete accept predicate. |
| A17 | `compute_mu_injective` | Corona_N1.ec:563 | distinct (m,ctx) ⇒ distinct mu (transcript binder injectivity). | Discharge with concrete transcript_hash. |
| A18 | `context_bytes_len_bound` | Corona_N1.ec:356 | `0 <= |context_bytes ctx| <= 65535`. | Discharge after `context_bytes` concretization. |
---
### Bucket B — SERIALIZATION / LAYOUT-IDENTITY (27)
| # | Axiom | File:line | Justification |
|---|---|---|---|
| B1 | `group_pk_width_pos` | Corona_N1_Combine_Layout.ec:60 | `0 <= group_pk_width` (abstract `op group_pk_width : int`). |
| B2 | `quorum_width_pos` | …:61 | `0 <= quorum_width`. |
| B3 | `shares_r1_width_pos` | …:62 | `0 <= shares_r1_width`. |
| B4 | `shares_r2_width_pos` | …:63 | `0 <= shares_r2_width`. |
| B5 | `message_width_pos` (combine) | …:64 | `0 <= message_width`. |
| B6 | `ctx_width_pos` (combine) | …:65 | `0 <= ctx_width`. |
| B7 | `sk_share_width_pos` | Corona_N1_Sign_Layout.ec:37 | `0 <= sk_share_width`. |
| B8 | `message_width_pos` (sign) | Corona_N1_Sign_Layout.ec:38 | `0 <= message_width` (sign-layout copy; distinct file/namespace). |
| B9 | `ctx_width_pos` (sign) | Corona_N1_Sign_Layout.ec:39 | `0 <= ctx_width` (sign-layout copy). |
| B10 | `sig_len_pos` | Corona_N1_Signature_Codec.ec:45 | `0 < sig_len` (abstract `op sig_len : int`). |
| B11 | `sig_len_within_cap` | …:46 | `sig_len <= sig_len_max (=35000)`. |
| B12 | `encode_signature_wf` | …:68 | Producer-side: `wf_signature_bytes (encode_signature x)`. |
| B13 | `combine_body_writes_signature` | Corona_N1_Combine_Refinement.ec:79 | memory-separation: combine writes only the sig_out range. |
| B14 | `layout_combine_frame` | …:116 | layout-stability: writes confined to sig_out preserve the input-buffer layout predicate. |
| B15 | `layout_sign_frame` | Corona_N1_Sign_Refinement.ec:63 | sign-side layout-stability companion. |
| B16 | `sign_body_writes_signature` | Corona_N1_Sign_Refinement.ec:54 | sign-side memory-separation. |
| B17 | `share_encode_decode_roundtrip` | Corona_N1_Combine_Wrapper.ec:30 | `share_decode (share_encode s) = s` (abstract codec). |
| B18 | `share_dim_correct` | Corona_N1.ec:137 | `|share_polys s| = share_dim`. |
| B19 | `poly_share_roundtrip` | …:142 | poly-share codec round-trip. |
| B20 | `share_polys_injective` | …:149 | `share_polys` injective. |
| B21 | `poly_share_of_injective` | …:153 | `poly_share_of` injective. |
| B22 | `poly_share_of_share_polys` | …:160 | round-trip pinning share↔poly-vector view. |
| B23 | `reconstruct_polys_view` | …:218 | `reconstruct` agrees with its polynomial-vector view. |
| B24 | `pack_unpack_n1_signature_roundtrip` | …:503 | unpack∘pack = id on (c,z,Δ). Pack-injectivity is DERIVED. |
| B25 | `pack_unpack_sk_roundtrip` | …:560 | `pack_sk (unpack_sk sk) = sk`. |
| B26 | `fresh_sharing_size` | Corona_N4.ec:157 | `|fresh_sharing q s| = |q|`. |
| B27 | `committee_quorum_uniq` / `committee_quorum_nonempty` | Corona_N4.ec:179–180 | canonical quorum duplicate-free + non-empty (one row; two declarations). |
> Counting note: B27 bundles the two committee facts. Per *declaration*,
> bucket B = 28; the histogram counts B27 as one logical row. Both readings
> disclosed; no hidden axiom.
---
### Bucket C — OPEN SECURITY ASSUMPTION (12) — **MUST STAY OPEN**
Corona's EC byte-equality (`corona_n1_byte_equality` /
`corona_n1_byte_equality_extracted`) proves the threshold combine equals
`CombineAbs.combine`, whose body (`wrapper_combine_refines_abs`, lines
96–142 of Corona_N1_Combine_Wrapper.ec) reduces — via the bridge axioms
below — to `rlwe_sign_op (reconstruct quorum shares) m ctx rho_rnd`: the
**centralised Module-LWE signer applied to the Lagrange-reconstructed master
secret**. This is the **reconstruct-then-sign / CombineAbs reconstruct-then-
sign abstraction**. The "steps 2–6" of the Boschini combine (the
`CombineAbs.combine` open/aggregate/reject steps) are **opened**, not
proved leak-free. The no-leak property of the production signer is
**interop-tested (Go↔C++ KAT byte-equality; and the production Module-LWE path's
correctness is by code review against the paper), NOT EC-proven**.
Tracked: `BLOCKERS.md` § "EC reconstruct-then-sign model".
| # | Axiom | File:line | What is assumed (open) |
|---|---|---|---|
| C1 | `combine_body_axiom` (declare axiom) | Corona_N1.ec:697 | `T.combine ~ CombineAbs.combine` on honest-quorum inputs — the extracted threshold combine equals the centralised Module-LWE sign of the reconstructed secret. The module-contract form of the whole combine refinement; closure pathway is the Jasmin byte-walk (production target v0.8.0). |
| C2 | `S_functional_spec` (declare axiom) | Corona_N1.ec:712 | `S.sign ~ CentralRLWESign.sign` on accepted inputs — the single-party module is a faithful Boschini signer. |
| C3 | `combine_body_spec` | Corona_N1_Combine_Refinement.ec:63 | the Jasmin-extracted combine writes exactly `combine_abs_op(args)` to sig_out. Atomic byte-walk; **steps 2–6 are inside this axiom, unproved.** |
| C4 | `sign_body_spec` | Corona_N1_Sign_Refinement.ec:42 | the Jasmin-extracted central sign writes exactly `sign_abs_op(args)` to sig_out. Atomic byte-walk. |
| C5 | `combine_abs_op_lifted_bridge` | Corona_N1_Combine_Wrapper.ec:47 | the share-typed lifted combine op = the byte-level `combine_abs_op` modulo encoding. The bridge from the abstract module interface to the byte-walk; the security content rides here. |
| C6 | `sign_abs_op_lifted_bridge` | Corona_N1_Sign_Wrapper.ec:27 | the share-typed lifted sign op = the byte-level `sign_abs_op` modulo encoding. |
| C7 | `sign_abs_op_lifted_eq_rlwe` | Corona_N1_Sign_Wrapper.ec:38 | **the reconstruct-then-sign identity in its starkest form**: `sign_abs_op_lifted sk … = rlwe_sign_op sk …` — the lifted op IS the centralised Boschini signer (the analog of libjade's role for Pulsar, but in-house since Module-LWE threshold has no FIPS target). This is the open Boschini-conformance claim. |
| C8 | `rlwe_sign_size` | RLWE_Functional.ec:204 | per-instance signature byte length under Boschini's rejection-sampling. Carries the construction's wire-size contract; classified C because it is a construction-level claim from the paper, not a pure layout identity. |
| C9 | `sign_round1_constant_time` (declare axiom) | lemmas/Corona_CT.ec:80 | Round-1 commit is constant-time. A CT *contract*, discharged Jasmin-side via `jasminc -checkCT` (roadmap), NOT by EC; a timing property, so a name/EC claim cannot certify it (see `proof-by-rename.sh` rationale). |
| C10 | `sign_round2_constant_time` (declare axiom) | lemmas/Corona_CT.ec:110 | Round-2 response is constant-time. As C9. |
| ~~C11~~ → **DISCHARGED** | ~~`combine_abs_op_lifted_eq_rlwe`~~ (now a PROVEN LEMMA) | Corona_N1_Combine_Wrapper.ec | The combine reconstruct-then-sign identity is **no longer an axiom**: `combine_abs_op_lifted` is now a CONCRETE threshold definition (the no-leak assembly: `c = kmac_mu_w mu w_pub`; `z = lagrange_aggregate_responses` of `per_party_partial_response`; `Delta = make_delta_of_w w_pub z`) and the bridge `combine_abs_op_lifted_eq_rlwe = rlwe_sign_op (reconstruct …)` is a **machine-checked LEMMA** on honest, well-formed quorums (uniq/size/degree/sharing). The load-bearing z-leg (where the secret enters) is discharged through the **MACHINE-CHECKED keystone** `Corona_N1_NoLeak.no_leak_z_aggregate` (= Lean `threshold_partial_response_identity`; verified load-bearing — removing it fails the proof). The master secret is never reconstructed. The residual shrinks to the PUBLIC-commitment axiom C11′ below. |
| C11′ | `threshold_public_commitment_eq_central` | Corona_N1_Combine_Wrapper.ec | **NARROW, PUBLIC-ONLY** (the SHRUNK residual replacing the secret-bearing whole-bridge C11). The threshold-assembled public Fiat-Shamir commitment `w = A*y` (sum of per-party Round-1 commitments; mask `y = Σ_i R_i*u` is mask-summed and telescopes like the responses — **carries no `c*s`**) equals the central commitment `central_w` on the reconstructed share. References **PUBLIC data only** (the commitment `w`, no secret share, no per-party `c*s_i`): cryptographically benign. The c-leg + Delta-leg of the combine bridge ride here. Discharge pathway (v0.8.0): a commitment-aggregate op + Lean bridge for the `A*y` mask-sum identity. |
> C-cone bundling note: the enumerated C-declarations are C1–C10 plus C11′
> (`threshold_public_commitment_eq_central`) = 11 rows. The former C11
> (`combine_abs_op_lifted_eq_rlwe`) is now a PROVEN LEMMA (struck through
> above), not an axiom — it does not count. The C11→lemma discharge and the
> C11′ replacement are net-flat in the C bucket, but the residual surface is
> narrowed from a whole-signature reconstruct-then-sign identity to a
> public-commitment equality (no secret). All named; none hidden.
### Why the CT axioms (C9/C10) are C, not B
`sign_round{1,2}_constant_time` are `declare axiom` CT *contracts*. A
constant-time property is a runtime/timing property that an EC axiom (or a
name grep) cannot certify — it needs a dudect/ctgrind/jasmin-CT harness
(`proof-by-rename.sh` exists to catch exactly the "name grep certifies
timing" anti-pattern). Corona's dudect harness is wired (smoke-budget) and
the submission-grade 10⁹-sample run is roadmap v0.8.0. So these axioms are
**fail-closed-pending-review**, disclosed here as open.
> **The C1–C10 axioms above are NOT the production residual.** They prove an
> idealised *correctness* fact (threshold output = central sign on the
> reconstructed secret) plus the CT/wire contracts. They are deliberately
> **not** the abstraction the production leaderless path instantiates. The
> production residual is the standard-assumption no-leak reduction below.
---
### Bucket C-standard — NO-LEAK REDUCTION (`Corona_N1_NoLeak.ec`) — the HONEST production residual
This is the headline of the de-misdirection pass. `Corona_N1_NoLeak.ec`
models the production path the way it actually runs: the 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**
(`Σ_i maskPrime_i = Σ_i mask_i`, the same double sum reindexed) — so the
master secret is **never formed** and no per-party `c·s_i` is ever exposed.
The only open content is then a STANDARD-assumption reduction, NOT a
reconstruct.
| # | Axiom | File:line | Bucket | What is assumed |
|---|---|---|---|---|
| NL1 | `mask_telescope_zero` | Corona_N1_NoLeak.ec | **B (standard / Lean-backed)** | `Σ_{i∈Q}(maskPrime_i − mask_i) = 0` — both are the same double sum `Σ_{i,j} p(i,j)` reindexed (Fubini). EC contract of the **machine-checked Lean** `Crypto.Corona.NoLeak.pairwise_mask_telescopes`. References ONLY masks — no secret share. Why the aggregate exposes no per-party `c·λ_i·s_i`. |
| NL2 | `no_leak_reduction` | Corona_N1_NoLeak.ec | **C-standard (OPEN, Module-LWE/MSIS)** | Under Module-LWE + Module-SIS, the public Corona transcript is simulatable from one single-party Boschini signature's leakage — leaks nothing extra about `s`. The honest replacement for `sign_abs_op_lifted_eq_rlwe`: a reduction to the SAME lattice assumptions §1 already lists, secret **never reconstructed**. EC mirror of the **machine-checked Lean** `Crypto.Corona.NoLeak.NoLeakReduction`. Full simulation = v0.8.0 artifact. |
What is **machine-checked in Lean** under NL1/NL2 (this host, `lake build`
green, 0 sorry):
- `Crypto.Corona.NoLeak.pairwise_mask_telescopes` — pairwise-mask aggregate
is zero (Fubini reindex); the Corona no-leak core.
- `Crypto.Corona.NoLeak.summed_response_is_mask_free` — `Σ_i z_i = Σ_i base_i`:
the masks contribute nothing, only the aggregate is exposed.
- `Crypto.Corona.NoLeak.secret_aggregate_no_reconstruct` — the surviving
`c · Σ_i λ_i·s_i = c·s` by Lagrange-at-0, secret never formed.
- `Crypto.Corona.NoLeak.no_leak_under_standard_assumptions` — packaged
residual: under M-LWE/M-SIS, every transcript is the simulator's output.
The EC `no_leak_z_aggregate` / `mask_telescope_zero` / `no_leak_reduction`
are the procedure-level EC wrappers; they are **written, machine-recheck
pending EasyCrypt** (no `ec` on host; `scripts/checks/ec-compile.sh` is CI).
### The net assurance change of this pass
- **Before:** the headline residual was reconstruct-then-sign
(`sign_abs_op_lifted_eq_rlwe` / `combine_body_axiom`) — an implementation
reconstruct.
- **After:** that cone is re-labelled *idealised correctness*; the production
residual is `no_leak_reduction`, a **Module-LWE/MSIS standard reduction**,
and its CORRECTNESS core (telescoping masks + Lagrange aggregate) is
**machine-checked in Lean**. Strictly better: the open assumption is now a
standard PQ assumption (the same substrate §1 already discloses), not an
implementation reconstruct.
## §3 Implementation-level axioms (TCB — residual Go ↔ construction gaps)
| Axiom | Location | Closure plan |
|---|---|---|
| `cloudflare/circl` / `luxfi/lattice/v7` primitive correctness | indirect | Trust upstream (community-audited); cross-runtime KAT byte-equality vs C++ port pins ring arithmetic (`scripts/regen-kats.sh --verify`). |
| Implementation matches Boschini construction (protocol level) | `dkg2/`, `threshold/`, `sign/`, `reshare/` | EC scaffold lands (13 files, admit 0/0); the byte-walk axioms C3/C4 require the Jasmin extraction to fill out (v0.8.0). |
| Constant-time execution of the threshold layer | `threshold/`, `sign/` | dudect harness at `ct/dudect/`; 10⁹-sample pinned-hardware run is v0.8.0. See C9/C10. |
| Identifiable abort under partition | `reshare/complaint.go`, `dkg2/complaint.go` | typed complaint records; soundness reduces to identity-key signature unforgeability; EC proof roadmap v0.8.0. |
| Cross-era key preservation (Reanchor) | `reshare/activation.go`, `keyera/` | activation-cert circuit-breaker; `Corona_N4.ec` proves public-key preservation on the honest reshare module. |
## §4 Honest framing
Corona's EC theories refine the Go implementation against an in-house
mechanization of the Boschini construction. There are now TWO models. The
`corona_n1_byte_equality` theorem is honest *as an idealised CORRECTNESS
statement* — but it models **reconstruct-then-sign**: the EC `CombineAbs`
reconstructs the master secret and signs with it. That is intentionally NOT
how the production threshold path runs. `Corona_N1_NoLeak.ec` adds the
HONEST production model: the per-party masked responses telescope to
`R·u + c·s` **without forming the master secret**, and the ONLY open
assumption is a STANDARD Module-LWE/Module-SIS reduction (`no_leak_reduction`)
— the same substrate §1 already lists — with the secret never reconstructed.
The CORRECTNESS core of that model (`pairwise_mask_telescopes` +
`secret_aggregate_no_reconstruct`) is **machine-checked in Lean on this
host** (`Crypto.Corona.NoLeakAggregate`; `lake build` green). The
production no-leak path's correctness is ALSO established by code review +
cross-runtime KAT. Five algebraic axioms (A1–A5) are Lean-bridged-and-
machine-checked. The byte-walk obligations (C3/C4), the wrapper bridges
(C5–C7), the CT contracts (C9/C10), and the no-leak simulation
(`no_leak_reduction`) are the open surface, tracked in `BLOCKERS.md` and
gated on the v0.8.0 Jasmin-extraction + dudect + external-audit roadmap.
## §5 Comparison to Pulsar's AXIOM-INVENTORY
Pulsar (`~/work/lux/pulsar/AXIOM-INVENTORY.md`) has the same A/B/C structure
over 78 axioms, with a far more decomposed refinement cone (per-stage
byte-walk axioms reduced to derived lemmas across v4–v12). Corona's
refinement is coarser: the whole combine is ONE `combine_body_spec` byte-
walk (C3) plus the wrapper bridges, where Pulsar splits it into ~10 narrow
per-stage sub-axioms. Both share the identical open core: the EC byte-
equality models reconstruct-then-sign, and the production no-leak path is
interop-tested, not EC-proven.
## §6 Cross-references
`SUBMISSION.md`, `PROOF-CLAIMS.md`, `BLOCKERS.md`, `TRUSTED-COMPUTING-BASE.md`,
`FIPS-TRACEABILITY.md`, `proofs/lean-easycrypt-bridge.md`,
`proofs/easycrypt/Corona_N1_Extracted.ec`.