Closes the last trusted-dealer caveat in the Bootstrap ceremony. The
trusted-dealer path is retained under a renamed alias for genesis
ceremonies where a non-distributed trust root is acceptable by policy
(publicly observable HSM-bound foundation MPC with commit-and-reveal
entropy from genesis validators).
Construction.
BootstrapPedersen drives the keyera-genesis ceremony through dkg2/
(Pedersen-DKG over R_q with public matrices A, B derived from BLAKE3-XOF
on the nothing-up-my-sleeve tags `corona.dkg2.{A,B}.v1`):
1. Each party samples Gaussian f_i, g_i in R_q^Nvec[x]_{deg<t}, runs
dkg2.Round1 → broadcasts Pedersen commits C_{i,k} = A·NTT(c_{i,k})
+ B·NTT(r_{i,k}) and sends (share_{i→j}, blind_{i→j}) privately
over an authenticated p2p channel.
2. Each recipient j runs dkg2.Round2Identify, verifying every incoming
pair against the commits in constant time. On mismatch the recipient
emits a signed ComplaintBadDelivery naming the misbehaving sender.
3. Each recipient holds its standard-form share s_j of the master
secret s; NO PARTY ever reconstructs s.
4. Path (a) noise flooding (LP-073 §07 Mapping). Each party broadcasts
β_j = A·NTT(λ_j · s_j) + e_j' where e_j' ~ D(σ'') and
σ'' = κ·σ_E·√n is the LP-073 §5 flood bound.
5. All parties aggregate b = Σ_j β_j = A·s + e'' in NTT-Mont; the
Corona-Sign-shaped public key bTilde = Round_Xi(b) drops cleanly
into threshold.GroupKey. The existing 2-round threshold-sign path
accepts the noise-flooded GroupKey unchanged.
Security claims.
- Hiding under decisional MLWE on the wide concatenation [A | B]
(Pedersen-DKG; papers/lp-073-pulsar §07).
- Per-party Gaussian flooding bound σ'' = κ·σ_E·√n covers the LWE
leakage budget (Path (a) flood-bound, LP-073 §5).
- Identifiable abort with constant-time verification (dkg2.Round2-
Identify; subtle.ConstantTimeCompare across all M slots).
- No master-secret reconstruction at any point in the ceremony
(structural; see TestBootstrapPedersen_NoMasterSecretInMemory).
Tests (keyera/bootstrap_pedersen_test.go; all green).
- TestBootstrapPedersen_RoundTrip — 5-party Pedersen-DKG with t=3;
transcript determinism; bTilde stability across entropy replays.
- TestBootstrapPedersen_DishonestDealer — tampered share-to-0 triggers
ErrBootstrapPedersenAbort naming sender 2; AbortEvidence carries a
re-checkable ComplaintBadDelivery.
- TestBootstrapPedersen_FollowedBySign — bootstrap → threshold-sign →
threshold.Verify PASS (the noise-flooded GroupKey is structurally
identical to a trusted-dealer Corona setup).
- TestBootstrapPedersen_NoMasterSecretInMemory — structural assertion
that dkg2.DKGSession exposes no master-secret field and no two
parties' SkShares/Lambdas collide.
- TestBootstrapPedersen_ParameterValidation — bounds checking.
- TestBootstrapPedersen_DefaultSuite — nil suite resolves to Corona-SHA3.
- TestBootstrapTrustedDealer_LegacyAlias — legacy alias byte-equivalent
to historical Bootstrap.
Documentation.
- AUDIT-2026-05.md — read-only SOTA refresh covering threshold lattice
DKG / signing literature 2024-2026. Verdict: Boschini-Takahashi-
Tibouchi 2024/1113 remains canonical; 2025 follow-ups (del Pino,
Doerner-Kondi, Hofheinz, Beimel-Eitan, Bos-Lyubashevsky, Crites-
Komlo-Maller) are complementary or non-blocking; no SOTA refresh
blocks this revision. Path (a) bound stays comfortable for committee
sizes up to n=256.
- DEPLOYMENT-RUNBOOK.md §Bootstrap-Trust — decision matrix documenting
Option A (BootstrapPedersen, recommended) vs Option B
(BootstrapTrustedDealer, ceremony-only).
- CHANGELOG.md — v0.7.3 entry listing the new public surface, tests,
and documentation deltas.
- keyera/keyera.go — inline trust-model documentation pointing at
BootstrapPedersen as the public-BFT-safe alternative.
API summary.
New (keyera package):
- BootstrapPedersen(suite, t, validators, groupID, eraID, entropy)
(*KeyEra, *BootstrapTranscript, error)
- FinishBootstrapPedersen(suite, t, validators, ..., dkgParams,
sessions, round1) (*KeyEra, *BootstrapTranscript, error)
- BootstrapTrustedDealer / BootstrapTrustedDealerWithSuite — legacy
aliases for the single-dealer ceremony.
- BootstrapTranscript — public, byte-stable ceremony record.
- AbortEvidence + ExtractAbortEvidence(err) — identifiable-abort
consumption surface.
- ErrBootstrapPedersenAbort, ErrBootstrapPedersenShape — typed errors.
Wire / KAT compatibility.
- Existing trusted-dealer KATs continue to byte-match
~/work/luxcpp/crypto/corona/ (no behaviour change on that path).
- BootstrapPedersen adds new ceremony bytes; deterministic given a
reproducible entropy stream. A future cross-runtime port can pin
them via BootstrapTranscript.TranscriptHash.
14 KiB
Deployment Runbook — luxfi/corona
Operational guidance for deploying Corona (threshold Ring-LWE signing + Pedersen DKG + proactive resharing) in production validator sets. Discloses the v0.2 trust-model caveats and pins the safe operating envelope.
Audience
- Validator operators bringing up a Corona-enabled Lux Quasar chain
(or any chain consuming
github.com/luxfi/corona). - Coordinator-service operators running the witness-aggregator pattern.
- Security reviewers validating production posture against the
honest framing in
PROOF-CLAIMS.md.
Trust-model disclosure (load-bearing)
The v0.2 reconstruction-aggregator caveat
Operators MUST acknowledge this before running v0.2 in production on funds-bearing networks.
Corona's combine procedure operates on Lagrange-aggregated z_i = y_i + c·s_i responses. The aggregator computes
z = Σ_{i ∈ Q} λ_i^Q · z_i over R_q^M. The aggregator does NOT
reconstruct the master secret s in memory at any point during
normal signing — the Lagrange aggregation is over the partial
responses, not the shares themselves.
However, two distinct trust-model caveats apply:
-
DKG bootstrap is a one-time trusted-setup event. At chain genesis (or at Reanchor), the foundation MPC ceremony runs
keyera.Bootstrapwhich generates the master secretsand distributes shares. Whoever participates in the Bootstrap MPC ceremony has, at some point in the ceremony's execution, machinery that touchess. The dealer-sidesis zeroed in place after sharing (keyera/keyera.go:191-198), but the ceremony must be conducted under verifiably-public conditions (commit-and-reveal from genesis validators) with toxic-waste assumptions tracked. -
The aggregator process is in the trusted computing base. An adversary who fully compromises the aggregator host (root-equivalent) during a signing session can observe
candz_ifor alli ∈ Q, and can computes_Q = Σ λ_i · s_iif it sees enough partial-response sets across distinct quorum subsets. (Note: this is weaker than Pulsar's v0.1 aggregator caveat, where the aggregator briefly reconstructs the master ML-DSA seed in memory; Corona's aggregator never reconstructss.)
Operational mitigations (all production deployments MUST satisfy at least items 1–4):
- Aggregator host hardening: dedicated host, no general-purpose workloads, no shared memory, no /proc access for non-root users, hugepages disabled (prevents same-page deduplication side-channels).
- Memory isolation: the aggregator process runs with locked
pages (
mlock), core-dumps disabled (setrlimit RLIMIT_CORE=0), ptrace disabled (prctl PR_SET_DUMPABLE 0). - Bootstrap MPC ceremony hardening: foundation MPC ceremony at
chain genesis uses commit-and-reveal entropy from genesis
validators; dealer state is zeroed in place via
keyera/keyera.go:Bootstrap. Ceremony participants are bound by the foundation's toxic-waste protocol. - Operational scope limits: aggregator role is a single-purpose process; no network listener beyond the consensus message bus; no shell access; no debugger attachment in production.
- TEE attestation (recommended): aggregator runs inside SGX,
SEV-SNP, or TDX with remote attestation pinned to the
reproducible build of
luxfi/corona v0.7.3. - Defense-in-depth: validator-set rotation via Reshare (not Reanchor) is the routine path; Reanchor (new key era) is a rare governance event reserved for security-incident response.
Bootstrap-Trust: two entrypoints, one decision
As of v0.7.3, Corona ships two bootstrap entrypoints. Operators MUST
choose one explicitly; the choice is load-bearing for the chain's
trust model.
Option A — keyera.BootstrapPedersen (public-BFT-safe, recommended)
- Routes the keygen ceremony through
dkg2/(Pedersen-DKG overR_q). - Every validator runs
dkg2.Round1independently; no single party ever holds the master secretsat any point in the ceremony. - Path (a) noise flooding (LP-073 §07 Mapping) produces a Corona-
Sign-shaped public key
bTilde = Round_Xi(A·s + e'')where each party contributes one Gaussiane_j'slice. - Identifiable abort: a misbehaving sender is named in a signed
dkg2.Complaintcarrying re-checkable Pedersen evidence; the chain commits the abort transcript and stays at the previous epoch. - Use case: any production deployment where the operator cannot vouch for the secrecy of a single dealer's host platform.
- Security assumptions:
- Hiding under decisional MLWE on the wide concatenation
[A|B](Pedersen-DKG security;papers/lp-073-pulsar §07). - Per-party Gaussian flooding bound
σ'' = κ·σ_E·√ncovers the LWE leakage budget (Path (a) flood-bound, LP-073 §5). - Authenticated pairwise channels between every validator pair (consensus layer; in-process kernel derives material deterministically for KAT replay).
- Hiding under decisional MLWE on the wide concatenation
- Trade-off: one extra round versus the trusted-dealer path; an
extra
M · n · (φ · log q)bytes of broadcast (the per-party β_j contributions) bound into the transcript.
Option B — keyera.BootstrapTrustedDealer (legacy, ceremony-only)
- Single dealer instantiates
s, runs Shamir share-out, hands shares to the committee, zeroes its in-memory copy ofs. - The dealer's host platform is in the trust boundary for the duration of the call.
- Use case: genesis ceremonies where the foundation explicitly chooses a non-distributed trust root (publicly observable HSM- bound ceremony with commit-and-reveal entropy from genesis validators, dealer state zeroed before ceremony close).
- Honest framing: this is the standard "toxic-waste" assumption common to setup ceremonies. It is acceptable for chain launch ceremonies where the foundation's ceremony posture is audited and attested; it is NOT acceptable for permissionless re-anchoring, routine rotations, or any context where the dealer is not a publicly-attested entity.
Decision matrix
| Scenario | Recommended entrypoint |
|---|---|
| New mainnet chain launch | BootstrapPedersen (foundation acts as one of n) |
| Foundation-audited HSM ceremony at chain genesis | BootstrapTrustedDealer (acceptable; document trust attestation) |
| Reanchor due to security incident | BootstrapPedersen (no single party should be retrusted) |
| Routine validator-set rotation | Use Reshare (preserves GroupKey; no bootstrap) |
| Test / KAT replay | Either, with deterministic entropy |
The decision is recorded in the era's genesis transcript via the
HashSuiteID and the Bootstrap mode tag; downstream auditors can
verify which path was taken without re-running the ceremony.
What Corona's combine does NOT do
- Does NOT reconstruct the master secret
sin aggregator memory during normal signing. - Does NOT persist any per-party share to disk during signing.
- Does NOT leak any per-party share to any other process under normal operation.
- Does NOT survive a process crash with secret share material
present beyond the Go runtime's normal garbage-collection cycle
(best-effort zeroization via
reshare/keyshare.go:EraseShareis invoked on activation and reshare-completion paths).
Pre-deployment checklist
Before bringing up a Corona-enabled validator:
- Operator-readable acknowledgement of the v0.2 trust caveats above on file (RACI sign-off).
- Aggregator host meets items 1–4 above.
- If running on funds-bearing mainnet: item 5 (TEE attestation) satisfied OR documented compensating control approved by security review.
scripts/build.shexits 0 against the deployed binary's source tag (i.e., the binary you are deploying was built from a commit where the build gates were green).scripts/test.shexits 0 against the deployed tag (KAT + integration + unit tests green).scripts/regen-kats.sh --verifyexits 0 (cross-runtime byte-equality with the C++ port is intact).CONSTANT-TIME-REVIEW.mdreviewed; all(b)entries either mitigated or accepted with documented compensating control.PROOF-CLAIMS.md§3 read and understood — Corona does NOT ship mechanized refinement; review reduces to code + KAT + academic construction analysis.DESIGN.md§"What is preserved across resharing" understood — distinguish Refresh (same set, fresh shares) from ReshareToNewSet (set rotation), distinguish Reshare (preserves key era) from Reanchor (new key era).- Validator-set rotation policy documented (cadence, threshold changes, complaint-response procedures).
At-runtime monitoring
The aggregator process should expose:
- A metric for every
threshold.Combineinvocation (counter + latency-histogram). - A metric for every Lagrange aggregation step (counter; should match Combine invocations 1:1).
- A metric for every share zeroize call on the post-activation path (counter; should match activation completions 1:1).
- A metric for every Pedersen-mismatch complaint event (counter; should be 0 in honest deployments — spike indicates a malicious participant).
- A panic / signal handler that invokes
EraseShareon the current generation's shares before exit.
Anomalous values (e.g., a spike in complaints without a corresponding disqualification, or a zeroize counter trailing the activation counter) should page immediately.
Resharing operational procedure
Corona's resharing is the routine path for validator-set changes
within a key era. See DESIGN.md §"Three layers, one shipping path"
for the algorithmic detail; operational specifics:
-
Cadence: every epoch boundary or every validator-set change, whichever is more frequent. The consensus layer (Quasar) triggers resharing via the
keyera.Resharecall. -
Round structure: 3-round shape (commit → private deliveries → combine + activate). Each round has a timeout configured at the consensus layer; missed rounds trigger the complaint pipeline.
-
Complaint handling: per-pair Pedersen-style verification on the recipient side (
dkg2.go:VerifyShareAgainstCommits/reshare/commit.go:VerifyShareAgainstCommits). Failure produces a signed evidence packet identifying the malicious sender. Disqualification quorum is configured at the consensus layer. -
Activation gate: after the math completes, the new committee threshold-signs an activation message under the unchanged
(A, bTilde). Only on successful verification does the chain accept the new epoch. Failure → consensus falls back to the old committee + retries with a new transcript binding. -
Failure modes:
- Coordinator timeout / unavailable → consensus picks the next coordinator deterministically.
- Resharing round fails (commit mismatch, bad share) → emit signed evidence; retry under new transcript binding next epoch.
- Activation cert fails to verify → LSS Rollback to previous generation; chain stays at previous generation; signing continues under previous shares.
- Multiple consecutive activation failures → governance reanchor: new key era, fresh ceremony, new group key.
Migration paths
v0.4.x → v0.5.x (submission-package addition)
This revision adds the NIST MPTC submission package documentation
(SUBMISSION.md, NIST-SUBMISSION.md, SPEC.md, PATENTS.md,
PROOF-CLAIMS.md, TRUSTED-COMPUTING-BASE.md, etc.). NO behavior
changes. KAT vectors are byte-identical. Production deployments can
upgrade in place; no validator-set rotation required.
v0.5.x → v0.6.x (planned)
Planned: single-document spec/corona.tex consolidating the LaTeX
spec, parameter-set worksheet with lattice-estimator concrete
bounds, and second parameter set targeting NIST PQ Category 3.
Backward-compatible at the wire level; may add a new parameter-set
identifier.
v0.6.x → v0.7.x (research, multi-month)
Planned: EasyCrypt theory shell for the construction-level
interchangeability claim; Lean 4 / Mathlib mechanization of the
Lagrange-aggregation identity over R_q. NO code changes; pure
proof artifact addition. Backward-compatible.
v0.7.x → v0.8.x (research + audit)
Planned: dudect-style statistical CT validation harness; external cryptographic audit (engaged lab). May surface findings requiring patch-level remediation.
Reference: cryptographer guidance
Corona does NOT ship a CRYPTOGRAPHER-SIGN-OFF.md at this submission
scaffolding revision. (Pulsar has one because Pulsar has an
EasyCrypt + Lean + Jasmin mechanized refinement chain that a
cryptographer signed off on. Corona's lighter proof tier does not
yet warrant analogous formal sign-off.) The roadmap to a Corona
sign-off lands with v0.7.0 (mechanized refinement) and v0.8.0
(external audit).
In the interim, the honest cryptographic posture is:
- Construction soundness: inherited from Boschini et al. ePrint 2024/1113 (peer-reviewed academic prior art, IEEE S&P 2025).
- Implementation soundness: code review + KAT cross-validation
Go ↔ C++ + fuzz harnesses + static per-path constant-time audit
with zero
(c)findings. - Lifecycle soundness: production-tested via the consuming Quasar consensus layer; activation cert circuit-breaker is the load-bearing safety mechanism.
Contact
- Operations:
[email protected] - Security:
[email protected] - Submission package:
[email protected]
Document metadata
- Name:
DEPLOYMENT-RUNBOOK.md - Version: v0.2 (matches Corona v0.7.3; Bootstrap-Trust two-entrypoint disclosure added)
- Date: 2026-05-21