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).
26 KiB
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-localcombine_body_axiom/S_functional_specas "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 equalsrlwe_sign_opof 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 overZ_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
CombineAbsabstraction. MUST stay open and disclosed. Tracked inBLOCKERS.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.txtAXIOM=59(comment-stripped declarations across the whole proof tree, EC + Lean); sub-bucket drift never gates. The gateec-machine-check.shconfirms 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 thatlake buildcompiles green on this host (Crypto.Threshold_Lagrange,Crypto.Corona.Shamir). They remain ECaxioms 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.ecstates 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 gateec-machine-check.shcompiles 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_liftedwas given a CONCRETE threshold definition (the no-leak assembly), and the bridge torlwe_sign_op (reconstruct …)is proven on honest, well-formed quorums. The load-bearing z-leg goes through the machine-checked keystoneCorona_N1_NoLeak.no_leak_z_aggregate(= Leanthreshold_partial_response_identity); the c/Delta-legs go through the single NARROW PUBLIC residualthreshold_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/decodeabstract). 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 |
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 | ` |
| 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 | ` |
| 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. |
combine_abs_op_lifted_eq_rlwe |
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 survivingc · Σ_i λ_i·s_i = c·sby 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.