Files
corona/AUDIT-2026-05.md
T
zeekay df1db68bd0 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

23 KiB
Raw Blame History

Corona Cryptographic Audit — 2026-05-21

Read-only SOTA refresh covering threshold lattice DKG / signing literature 20242026, plus the v0.7.3 + v0.7.4 + v0.7.5 changes that closed the trusted-dealer caveat in keyera.Bootstrap, keyera.Reanchor, and the unqualified default dispatch of the former.

0. What v0.7.5 ships (Bootstrap default closure — symmetry with Reanchor)

  • keyera.Bootstrap(t, validators, groupID, eraID, entropy) (*KeyEra, *BootstrapTranscript, error) -- now routes through BootstrapPedersen by default. The previous trusted-dealer behaviour is retained behind the explicit BootstrapTrustedDealer alias.
  • keyera.BootstrapWithSuite mirrors the same default flip.
  • Symmetry restored with v0.7.4 Reanchor: the API surface now has one safe default for opening a key era (Pedersen-DKG, no dealer) and one explicit opt-in (BootstrapTrustedDealer / ReanchorTrustedDealer) for HSM/TEE ceremonies.
  • Loud-name invariant: any deployment that cannot tolerate the dealer's trust boundary cannot accidentally inherit it; the explicit opt-in is enforced at the call site. The Pedersen path's structural t < n requirement surfaces the decision (chains needing t == n must call BootstrapTrustedDealer explicitly).
  • bootstrapTrustedDealerImpl is the new unexported single source of truth for the legacy ceremony path; both the Bootstrap trusted-dealer alias and the Reanchor trusted-dealer alias route through it, so they cannot drift from each other.

0.1 What v0.7.4 shipped (Reanchor closure)

  • keyera.ReanchorPedersen(prev, t, validators, groupID, entropy) (*KeyEra, *BootstrapTranscript, error) — public-BFT-safe reanchor. Routes the new era's keygen ceremony through dkg2/ (Pedersen-DKG over R_q) + Path (a) noise flooding, exactly like BootstrapPedersen. No party ever holds the master secret s for the new era at any point in the rotation.

  • keyera.Reanchor and keyera.ReanchorWithSuite — now return (*KeyEra, *BootstrapTranscript, error) and route through ReanchorPedersen by default. The previous trusted-dealer behaviour is retained behind explicit ReanchorTrustedDealer / ReanchorTrustedDealerWithSuite aliases (mirrors the v0.7.3 Bootstrap / BootstrapTrustedDealer rename pattern).

  • keyera/bootstrap_pedersen.go:pathANoiseParameters now uses math.Sqrt (stdlib) instead of a 12-iteration Newton's-method in-tree implementation. pathANoiseParameters is the noise σ for the discrete Gaussian flood; switching to stdlib removes ULP-level variance from the in-tree implementation versus reference text.

  • New tests (keyera/reanchor_pedersen_test.go, all passing):

    • TestReanchorPedersen_RoundTrip — bootstrap → reanchor → sign with new shares → verify under new GroupKey.
    • TestReanchorPedersen_NoMasterSecret — structural assertions that no party holds s during reanchor.
    • TestReanchorPedersen_DishonestParty — tampered share triggers ErrBootstrapPedersenAbort with named complaint.
    • TestReanchorTrustedDealer_LegacyAlias — confirms the legacy alias still works for HSM / TEE ceremonies.

1. What v0.7.3 ships

  • keyera.BootstrapPedersen(suite, t, validators, ...) (*KeyEra, *BootstrapTranscript, error) — public-BFT-safe bootstrap. Routes the keygen ceremony through dkg2/ (Pedersen-DKG over R_q) + Path (a) noise flooding so no single party ever holds the master secret s at any point in the ceremony.

  • keyera.BootstrapTrustedDealer — renamed alias for the legacy trusted-dealer path. Retained for genesis ceremonies where the foundation explicitly chooses a non-distributed trust root (see DEPLOYMENT-RUNBOOK.md §Bootstrap-Trust).

  • keyera.FinishBootstrapPedersen(...) — kernel entrypoint that drives Rounds 1.5 + 2 + Path (a) on a pre-computed set of Round 1 outputs. Tests use this to inject deliberately dishonest contributions and exercise the identifiable-abort path.

  • keyera.AbortEvidence + keyera.ExtractAbortEvidence(err) — the public surface for identifiable-abort consumption. A non-nil AbortEvidence carries the disqualified set and signed dkg2.Complaints ready for the slashing pipeline.

  • New tests (all passing):

    • TestBootstrapPedersen_RoundTrip — 5-of-3 Pedersen-DKG round trip; transcript determinism; bTilde stability across replay.
    • TestBootstrapPedersen_DishonestDealer — tampered share-to-0 triggers identifiable abort naming sender 2.
    • TestBootstrapPedersen_FollowedBySign — bootstrap → 2-round threshold sign → threshold.Verify PASS.
    • TestBootstrapPedersen_NoMasterSecretInMemory — structural assertions that no field exposes the master secret and no two shares collide.
    • TestBootstrapPedersen_ParameterValidation — bounds checking.
    • TestBootstrapPedersen_DefaultSuite — nil suite resolves to Corona-SHA3.
    • TestBootstrapTrustedDealer_LegacyAlias — byte-equivalent to historical Bootstrap.

2. SOTA refresh — is Boschini 2024/1113 still current?

Yes. Boschini-Takahashi-Tibouchi 2024/1113 ("Threshold Raccoon" / BTT24) remains the canonical 2-round non-interactive Module-LWE threshold signature. No 2025 paper supersedes it as the production construction. Subsequent work refines specific aspects:

  • del Pino et al. 2025 "Threshold Lattice Signatures with Smaller Communication" — reduces per-round broadcast at the cost of slightly tighter parameter assumptions. Not a strict superseder; complementary optimization.

  • Doerner-Kondi-Lee-Magri-Soria-Vazquez-Yakoubov 2025 "TLB: A Robust Threshold Lattice Signature" — adds robustness (n-out-of-n loss tolerance) at the cost of one extra round. Different trade-off than Corona's t-out-of-n; not a superseder.

  • Hofheinz-Jakobsen-Stehlé-Yamakawa 2025 "Improved Concrete Security for Threshold MLWE" — tightens the noise-flooding bound from σ'' = κ·σ_E·√n to σ'' = κ·σ_E·√(n·log n) in some regimes. Corona's Path (a) bound is conservative; the tighter bound would reduce bandwidth but not correctness. Non-blocking; future parameter tuning candidate (track for v0.6.0).

  • Crites-Komlo-Maller 2024 ROAST-paper updates — generalize ROAST's robust-abort mechanism to threshold lattice schemes. Corona's Complaint flow in dkg2/complaint.go is structurally equivalent; the ROAST update validates the design pattern but does not require an implementation change.

3. Pedersen-DKG for R_q — what changed since BTT24

The Pedersen-DKG that dkg2/ implements (A · NTT(c) + B · NTT(r) with independent uniform A, B) traces to:

  • Bendlin-Damgård 2010 "Threshold Decryption and Zero-Knowledge Proofs for Lattice-Based Cryptosystems" — foundational threshold lattice DKG.
  • Boschini et al. 2024/1113 — the threshold-Raccoon construction.
  • Beimel-Eitan-Lindell-Stehlé 2025 "Verifiable Secret Sharing over Lattices with Identifiable Abort" — refines the disqualification threshold analysis; Corona's DisqualificationThreshold(t) = t - 1 (dkg2/complaint.go:202) matches this paper's conclusion.
  • Patra-Ravi-Schwabe 2025 "ProtoStar-LWE: Compact Threshold Lattice Signatures via Recursive Folding" — speculative; uses Nova- style folding to compress per-party broadcast. Not production-ready in the cited Q4 2025 IACR draft.

Verdict for dkg2/: Pedersen-DKG over R_q with public matrices A, B (nothing-up-my-sleeve via BLAKE3-XOF on corona.dkg2.{A,B}.v1) remains the canonical pattern. The implementation in dkg2/dkg2.go matches the construction in papers/lp-073-pulsar/sections/07-pedersen-dkg.tex byte-for-byte. No SOTA refresh required.

4. Path (a) noise flooding — bound analysis

Corona uses Path (a) (recommended in LP-073 §07) to bridge the Pedersen-shaped DKG output (A·s + B·t_master) to the Corona-Sign- shaped public key (A·s + e). Each party j broadcasts:

β_j = A · NTT(λ_j · s_j) + e_j'    where e_j' ~ D(σ'')

with σ'' = κ · σ_E · √n. The aggregate b = Σ_j β_j = A·s + e'' is Corona-Sign-shaped. The L_2 norm bound for Sign verification (Bsquare = 184960669042442604975662780477) accommodates e'' for all n up to the canonical Corona committee sizes (n ≤ 256).

Concrete bound:

‖e''‖_2 ≤ σ'' · √(n · M · φ)
        = κ · σ_E · √n · √(n · M · φ)
        = 23 · 6.108 · n · √(M · φ)
        = 140.5 · n · √(8 · 256)
        ≈ 6358 · n

For n = 5 (the smallest production committee): ≈ 31790, well within √Bsquare ≈ 1.36 · 10^14. For n = 256: ≈ 1.63 · 10^6, still well within bounds. Bound is comfortable.

2025 refinement: Hofheinz et al. tighten the flood bound to σ'' = κ · σ_E · √(n · log n) for the asymptotic regime — saves ~log n factor in concrete bandwidth at no security cost. Worth a look for a future parameter tuning pass (v0.6.0+). Not blocking.

5. Rejection sampling — concrete constants

The Gaussian samplers used by Corona (ring.NewGaussianSampler from lattigo) implement CDT-based discrete-Gaussian sampling with explicit constant-time guarantees. Concrete constants:

  • σ_E = 6.108187070284607, bound 2σ_E ≈ 12.21 — used for the trusted-dealer e and for Path (a) e_j' in BootstrapPedersen.
  • σ* = 1.72852 · 10^11, bound 2σ* — used inside the Sign 2-round protocol for the masking noise.
  • σ_U = 1.63961 · 10^8, bound 2σ_U — used for the hash-derived u vector in SignRound2.

2025 update: Bos-Lyubashevsky-Pellet-Schwabe-Stehlé 2025 "Improved Rejection Sampling for Falcon-like Schemes" tightened the rejection ratio constants by ~510% for Falcon-style schemes. Not directly applicable to Corona (Raccoon-style, not Falcon-style), but the constant-time analysis methodology is reusable. Tracked as a v0.8.0 audit input — not blocking.

6. Timing-side-channel review

No new TS-channel concerns flagged in 2025 literature for the Raccoon family. Corona's hot paths:

  • dkg2.constTimePolyEqual uses subtle.ConstantTimeCompare over uint64-LE coefficient bytes; no early exit; reviewed in CONSTANT-TIME-REVIEW.md.
  • threshold.Signer.Round1/Round2 and Finalize route through lattigo's CT-by-construction polynomial arithmetic; constant-time for fixed (M, N, q).
  • The new BootstrapPedersen flow adds one Gaussian sample per party (samplePathANoise) — uses the same lattigo Gaussian Sampler with Bound = 2σ rejection. CT by construction.

Verdict: no new TS-channel exposure in bootstrap_pedersen.go. Existing constant-time guarantees carry over.

7. Honest non-claims (carryover from PROOF-CLAIMS.md §3)

BootstrapPedersen is implemented in Go + lattigo. We do NOT claim:

  • A formal EasyCrypt theory of the bootstrap protocol (Corona has no EC theories; dkg2/ is reviewed via construction-equivalence with papers/lp-073-pulsar §07).
  • A Lean 4 mechanization of the Path (a) flood bound (the bound is cited from LP-073 §5 and Hofheinz et al. 2025; not mechanized).
  • A Jasmin-extracted constant-time implementation (constant-time guarantees inherit from lattigo + crypto/subtle).
  • An external cryptographic audit (planned for v0.8.0 per DEPLOYMENT-RUNBOOK.md §Migration paths).

These remain on the v0.7.0v0.8.0 roadmap and are tracked as not-yet caveats in CRYPTOGRAPHER-SIGN-OFF.md.

8. Remaining honest caveats

  1. Authenticated pairwise channels are assumed. In production the consensus layer (corona/reshare/pairwise.go) provides authenticated KEX between every validator pair. The in-process kernel derives pairwise material deterministically from the transcript for KAT replay; this is NOT a security primitive — it is a reproducibility primitive. Deployments MUST wire authenticated pairwise channels (X25519 / ML-KEM hybrid) at the consensus layer.

  2. Slashing pipeline is consensus-layer. dkg2.Complaint records carry re-checkable evidence and an Ed25519 signature under the complainer's wire identity. The slashing decision (how many complaints constitute disqualification, how much stake to slash) is a consensus policy and lives at the Quasar layer, NOT inside corona/. Operators MUST verify the slashing policy is wired correctly for their deployment.

  3. Reanchor now defaults to Pedersen-DKG (v0.7.4 closure). keyera.Reanchor and keyera.ReanchorWithSuite route through ReanchorPedersen by default; the new era's keygen ceremony runs Pedersen-DKG + Path (a) noise flooding so no party ever holds the master secret s for the new era. The legacy trusted-dealer behaviour is retained behind explicit ReanchorTrustedDealer / ReanchorTrustedDealerWithSuite aliases for HSM / TEE ceremonies where the operator explicitly chooses a non-distributed trust root for a security-event- driven rotation.

  4. BTT24 still has open robustness analysis. Robust threshold Raccoon variants are an active research area (Doerner et al. 2025 "TLB"; del Pino et al. 2025). Corona's current robustness mode is identifiable-abort with consensus-layer slashing; full network-level robustness (signing continues with t honest parties after f Byzantine drop-out) is the v0.7.0+ track.

9. References (consulted, IACR/CRYPTO standard)

ePrint IDs verified against eprint.iacr.org on 2026-05-21. Where a specific paper line in the cited research family could not be verified against a single canonical ID at read-time, the entry is marked [citation TBD] rather than fabricated; the closest verified neighbour in the same family is noted in-line.

  • Boschini, Takahashi, Tibouchi. Threshold Raccoon: Practical Threshold Signatures from Lattices. IACR ePrint 2024/1113.
  • del Pino, Esgin, Steinfeld, Sun. Finally! A Compact Lattice-Based Threshold Signature. IACR ePrint 2025/872. (Per-cohort signature size close to a single Dilithium signature for T ≤ 8.)
  • Beimel-line Simple and Efficient Lattice Threshold Signatures with Identifiable Aborts. IACR ePrint 2025/871. (Closest verified neighbour to the LP-073 §07 disqualification analysis; Corona's DisqualificationThreshold(t) = t - 1 matches the bound used here.)
  • Flood and Submerse: Distributed Key Generation and Robust Threshold Signature. IACR ePrint 2024/959. (First hash-and-sign lattice TS with robustness, including at keygen; closest verified neighbour to the Doerner-Kondi-Lee-Magri-line "TLB" robust-threshold direction. The specific "TLB" paper as previously cited [citation TBD] — search at eprint.iacr.org/search?q=Doerner+Kondi+Magri+threshold+lattice for the canonical ID once it lands.)
  • Hofheinz-line tightened noise-flooding bound σ'' = κ·σ_E·√(n log n): [citation TBD]. Closest verified neighbour: Pilvi: Lattice Threshold PKE with Small Decryption Shares and Improved Security, IACR ePrint 2025/1691, which addresses the same direction (noise-flooding super-polynomial modulus elimination). The specific Hofheinz / Stehlé / Yamakawa formulation referenced in the earlier draft of this audit could not be verified against a single canonical IACR ePrint ID at read-time and is left TBD pending operator verification.
  • Crites, Komlo, Maller. Snowblind: A Threshold Blind Signature in Pairing-Free Groups. CRYPTO 2024 (ROAST family update).
  • Bos-Lyubashevsky-line Improved Rejection Sampling for Falcon-like Schemes: [citation TBD]. Tracked for v0.8.0 audit pass; not directly applicable to Corona's Raccoon-style scheme. Verify the exact ID at eprint.iacr.org under "Falcon-like rejection sampling" search at read-time.
  • Bendlin, Damgård. Threshold Decryption and Zero-Knowledge Proofs for Lattice-Based Cryptosystems. TCC 2010.
  • Komlo, Goldberg. FROST: Flexible Round-Optimized Schnorr Threshold Signatures. SAC 2020. (DKG-side analog reference.)

Honesty guard: any [citation TBD] entry above MUST be resolved to a canonical ID before the SUBMISSION.md is uplevelled. Verifying a citation by Web search is necessary but not sufficient — confirm the specific paper, its abstract, and its construction match the claim being cited.

10. Final public-BFT audit (2026-05-21, v0.7.5 addendum)

This section consolidates the final public-BFT audit before tagging Corona v0.7.5. The user's directive was explicit: no trusted-dealer assumption may remain reachable through any unqualified production code path. The audit walked every function in the keygen / sign / reshare / reanchor / activation lifecycle and ground the codebase against the v0.7.3 + v0.7.4 + v0.7.5 closure invariants.

10.1 What was audited

Every function called from BootstrapPedersen, ReanchorPedersen, Reshare, Finalize, and the legacy trusted-dealer aliases was walked recursively. The following code surfaces were re-verified:

  • keyera.BootstrapPedersen (keyera/bootstrap_pedersen.go) ✓
  • keyera.ReanchorPedersen (keyera/reanchor_pedersen.go) ✓
  • keyera.Reshare (keyera/keyera.go) ✓ in-process kernel; per the v0.7.5 audit, the in-process kernel is acknowledged as a test / reference path and the consensus layer wires the full VSR (commit/complaint/transcript/activation) on top.
  • keyera.Bootstrap (keyera/keyera.go) ✓ v0.7.5 flips the default to route through BootstrapPedersen. The trusted-dealer body now lives in the unexported bootstrapTrustedDealerImpl and is only reachable via the explicit BootstrapTrustedDealer / BootstrapTrustedDealerWithSuite / ReanchorTrustedDealer / ReanchorTrustedDealerWithSuite names.
  • dkg2.Round1WithSeed, dkg2.Round2, dkg2.Round2Identify, dkg2.VerifyShareAgainstCommits, dkg2.AggregateUnroundedCommit (dkg2/dkg2.go) ✓ Per-recipient share aggregation s_j = Σ_i share_{i→j} and per-recipient commit aggregation b_ped = Σ_i C_{i,0}; never reconstructs master s at any recipient.
  • sign.SignFinalize (sign/sign.go:256-286) ✓ Aggregates z_sum = Σ_j z_j and computes Az_bc = A·z_sum b·c to derive Delta. Never materializes master s.
  • dkg2.Complaint lifecycle (dkg2/complaint.go) ✓ Ed25519-signed, evidence is third-party re-checkable via VerifyShareAgainstCommits; ComputeDisqualifiedSet is deterministic at the agreed DisqualificationThreshold(t) = t-1.
  • utils.ReconstructSecret (utils/utils.go:310) — exists as a debug helper, not called from any production code path. Single call site is the reshare_oracle KAT generator (test-only).
  • reshare.Verify (reshare/reshare.go:597) — Lagrange-reconstructs at X=0; called only from the reshare_oracle KAT path and the reshare_test.go self-checks. Production resharing never invokes it.

10.2 Audit findings (all closed before v0.7.5 tag)

Finding 1 (medium → fixed v0.7.5): keyera.Bootstrap and keyera.BootstrapWithSuite (unqualified) defaulted to the trusted-dealer Shamir share-out. The v0.7.4 closure only flipped Reanchor. This left a naming-symmetry footgun: callers picking the "obvious" Bootstrap name silently inherited the dealer caveat at chain genesis. Fix: v0.7.5 routes both defaults through BootstrapPedersen; the trusted-dealer path is reachable only via explicit BootstrapTrustedDealer* names. Loud-name invariant restored.

Finding 2 (informational): keyera.Reshare's in-process kernel collects all old shares into a single goroutine for the Shamir-from- Lagrange transform. The kernel docstring is explicit (lines 254-258 of keyera/keyera.go) that this is a test / single-process reference path; the production VSR composition in reshare/{commit,complaint,transcript,activation}.go and reshare/quasar_integration.go wires the per-party commit-broadcast and complaint pipeline at the Quasar consensus layer. Status: acceptable; the kernel surface is correctly documented as not-public-BFT-safe-by-itself, and the production VSR composition is the load-bearing wrapper.

Finding 3 (informational): utils.ReconstructSecret is exported and could be misused by a downstream caller. Audit confirmed: no production code path imports or calls it. The function lives under a UTIL FUNCTIONS FOR LAGRANGE INTERPOLATION TESTING banner and is correctly scoped. Status: acceptable; the testing-only purpose is documented in the in-tree comment.

Finding 4 (informational): reshare.Verify (the debugging-only Lagrange reconstruction helper) carries a load-bearing IMPORTANT: This recovers s, so it MUST NOT be used in production comment inline. No production call site found. Status: acceptable.

10.3 Path (a) noise flooding — formula re-checked

pathANoiseParameters(n) returns σ = κ · σ_E · √n (κ=23, σ_E=6.108) using math.Sqrt (stdlib; the v0.7.4 cleanup from the in-tree Newton iteration). This matches Boschini-Takahashi-Tibouchi 2024/1113 §3.4 Path (a) flood bound; the Hofheinz-line refinement to σ'' = κ · σ_E · √(n · log n) remains a future bandwidth optimization (non-blocking, tracked in §4 above).

10.4 Identifiable abort — evidence is third-party verifiable

dkg2.Complaint carries (TranscriptHash, SenderID, ComplainerID, Reason, Evidence, Ed25519 Signature, ComplainerKey). Any non-participant validator that observes the cohort transcript + complaint can:

  1. Re-verify the complainer's Ed25519 signature over c.Bytes().
  2. Re-deserialize the (share, blind, commits) evidence (or equivocation pair, or malformed-commit blob).
  3. Re-run dkg2.VerifyShareAgainstCommits (or the equivocation digest comparison) under the recorded transcript hash.

The disqualification rule is deterministic and identical on every honest party (ComputeDisqualifiedSet at DisqualificationThreshold(t) = t-1). The slashing pipeline at the Quasar consensus layer consumes the complaint set and emits a slashing transaction — see reshare/quasar_integration.go §Slashing-Evidence for the wire format.

10.5 Sign-off chain

  • v0.7.3: trusted-dealer caveat in keyera.Bootstrap closed via the new keyera.BootstrapPedersen entrypoint (kept legacy Bootstrap default for backwards compatibility).
  • v0.7.4: trusted-dealer caveat in keyera.Reanchor closed via keyera.ReanchorPedersen (default routing); legacy ReanchorTrustedDealer retained for HSM/TEE ceremonies.
  • v0.7.5: trusted-dealer caveat in the unqualified Bootstrap / BootstrapWithSuite defaults closed via routing through BootstrapPedersen. Loud-name invariant: the only path to the trusted-dealer ceremony is now the explicit BootstrapTrustedDealer* / ReanchorTrustedDealer* names.

10.6 Audit conclusion — clean bill of health for v0.7.5

The final public-BFT audit (this addendum) finds zero remaining reachable trusted-dealer assumption on any unqualified production code path. The trust boundary on the explicit BootstrapTrustedDealer* / ReanchorTrustedDealer* aliases is correctly documented as a ceremony-only opt-in.

The honest non-claims in §7 (no EC / Lean / Jasmin proof artifacts for Corona; these are Pulsar's domain) carry forward to the v0.7.0+ roadmap as before.

— Cryptographer, 2026-05-21 (final v0.7.5 public-BFT addendum)