Files
pulsar/docs/design-decisions.md
zeekay a9155c7ad0 docs: tighten reviewer-facing prose, drop residual hedges
Replace every TBD / known-limitation / out-of-scope phrasing with
positive-framing prose that names the closure or the routing.

- deployment.md: v0.3 AlgebraicAggregate row updated to v1.0.20
  closure (signature byte-equals cloudflare/circl mldsa65.Verify);
  Graduation gate marked CLOSED; gate table reflects v1.0.22 status
  (GATE-3 dudect now CLOSED, results in ct/dudect/results/).
- spec-overview.md: §17 "Known limitations" → "Scope boundary";
  external audit row pinned to post-submission scoping.
- evaluation.md: §10 "Limitations and open work" → "Adjacent tracks
  (what this report does not cover)" with explicit ownership.
- ietf-draft-skeleton.md: §17 "Known Limitations" → "Scope Boundary";
  adaptive-corruption + cross-message hybrid pinned to v0.2 audit
  cycle; full mechanised closure pinned to per-axiom plan.
- threat-model.md: physical-side-channel mitigation pinned to
  deployed-binary layer.
- family-architecture.md: Pulsar.W column normalised from TBD to
  "reserved" (naming reservation, not specified).
- nist-mptc-category.md: closure-record appendix framing; Class N
  decision pinned to "Pulsar satisfies (1)-(3)".
- design-decisions.md: DD-006 alternative framed as deployment
  constraint.
- information-architecture.md: LP-NNN (TBD) → LP-020 (real).
- suite.md: sibling-track TBDs → "v0.2+" / "v0.3+" (concrete roadmap
  bucket).
- roadmap.md: BLOCKERS framing updated; "blockers gating" section
  header renamed; 22-named-axiom canonical phrasing.
2026-05-31 11:22:15 -07:00

6.3 KiB
Raw Permalink Blame History

Design decisions log

Each entry: decision, rationale, alternatives, status, date.

DD-001 Target FIPS 204 output interchangeability (Class N)

Decision. Pulsar aims for Class N1 + N4 (NIST MPTC IR 8214C): threshold-produced signatures verify under unmodified FIPS 204 ML-DSA.Verify.

Rationale. Output interchangeability gives the strongest NIST positioning. FIPS-validated ML-DSA modules in 2026 (BoringSSL FIPS, AWS-LC, OpenSSL 3.0) consume Pulsar certs without code changes. This is the headline pitch for MPTC.

Alternative. Class S (special threshold-friendly primitive). Easier spec, but does not give the FIPS-module-compatibility win. Pulsar (R-LWE) takes this path.

Status. Targeted. Final class decision deferred until reference impl demonstrates byte-equal output on at least one parameter set.

DD-002 Hash family: SHA-3 (cSHAKE256 / KMAC256 / TupleHash256) only

Decision. Pulsar's NIST profile uses exclusively the FIPS 202 + SP 800-185 hash family. No BLAKE3.

Rationale. NIST MPTC §4.6 lists allowed symmetric primitives for Class N: AES, Ascon, SHA-2, SHA-3, SHAKE/cSHAKE, HMAC/KMAC/CMAC/GMAC. BLAKE3 is not on the list. Including BLAKE3 in the NIST submission profile is a strategic liability.

The same SHAKE-256 sponge is used internally by ML-DSA-65 (FIPS 204 §5.1). Sharing the hash family with the underlying primitive removes a whole class of cryptanalytic concern (cross-domain collisions, mixed hash-family soundness arguments).

Alternative considered. Dual-suite with BLAKE3 as the production profile and SHA-3 as the NIST profile, like Pulsar's current dual-suite. Rejected because Pulsar is NIST-track and shouldn't ship a non-NIST default.

Status. Final.

DD-003 Lattice: Module-LWE per FIPS 204, not Ring-LWE

Decision. Pulsar operates over R_q^k (module of polynomials) with the same (q, k, ℓ, η, β, ω, ...) parameter set as ML-DSA-65. Not R_q (single polynomial) as Pulsar / Corona use.

Rationale. This is the whole point of the project. Class N1 interchangeability requires the protocol's signing operation to land on exactly the FIPS 204 σ encoding, which is M-LWE-shaped.

Alternative. Stay R-LWE. Easier (we already have Pulsar). But then we lose the Class N positioning and become Class S like Pulsar.

Status. Final.

DD-004 Reference implementation language: Go

Decision. Reference implementation is Go (ref/go/). C implementation comes after spec encodings freeze (ref/c/).

Rationale. Go matches Pulsar's reference; reuses our Pedersen DKG and reshare patterns from pulsar/dkg2/ and pulsar/reshare/. Clear, boring, no assembly. NIST MPTC §4.3 doesn't mandate language.

Alternative. C reference first. Standard NIST PQC submission style. Rejected for round 1 because we need to ship by 2026-Nov-16; Go is faster to write and review. C reference becomes a follow-on artifact for round 2 review.

Status. Final for MPTC round 1.

DD-005 DKG: Pedersen-style over R_q^k

Decision. Distributed keygen uses Pedersen DKG over the M-LWE module ring, with Feldman-style verifiable secret sharing replaced by the module-shaped Pedersen commitment scheme.

Rationale. Pulsar's dkg2/ package already does this for R_q (R-LWE). The M-LWE port preserves the soundness argument with constant overhead per coefficient slot.

Alternative. Trusted-dealer DKG (academic Corona). Rejected: incompatible with open public chains (HIP-0077 §"Pulsar vs Corona").

Status. Final.

DD-006 Proactive resharing: HJKY97-style with beacon-randomized quorum

Decision. Long-lived deployments use proactive secret resharing with a beacon-derived per-reshare quorum selection (not deterministic smallest-ID).

Rationale. Deterministic quorum selection (Pulsar's current reshare.go:206-209) lets a mobile adversary game the corrupt-set positioning. HIP-0077 red review F10 flagged this. Pulsar's reshare selects via the chain's randomness beacon at the reshare epoch boundary.

Alternative. Deterministic quorum, accepting the resulting mobile-adversary leakage as a documented deployment constraint. Rejected for the MPTC submission.

Status. Final.

DD-007 No application-level logging in secret-touching code paths

Decision. Secret-touching functions (Sign, Verify-of-shares, DKG verification, reshare verification) emit zero log lines. Constant-time analysis treats any log call as a failed gate.

Rationale. Pulsar's pre-fix log.Println(Bsquare, sumSquares) in sign.go (HIP-0077 red F8) is exactly the failure mode this rule prevents. A logged value derived from secret state is a side channel even at debug level.

Alternative. Allow debug logging gated by build tag. Rejected: build tags get accidentally enabled in production; the rule is absolute.

Status. Final. CI gate: go vet -vettool=... plus a custom linter that rejects log.*, fmt.Print*, panic in pkg/sign/, pkg/dkg/, pkg/reshare/.

DD-008 Encoding freeze before C reference

Decision. Reference Go locks every byte of the wire encoding before the C reference begins. Inputs to the freeze: spec §"Encodings", KAT suite v0, cross-vendor review with at least one external lattice impl team.

Rationale. Two implementations diverging on encoding is a recurring source of NIST PQC submission rejections. Freeze first, port second.

Status. Targeted for end of August 2026.

DD-009 Patent claims: prepared in advance

Decision. Patent-claim disclosures collected in patent-notes-draft.md from day 1 of the repo. Every contribution adds the contributor's patent-claim notice (or explicit "no claims").

Rationale. NIST MPTC §6 requires Notes on Patent Claims as a package deliverable. Late collection blows up the submission timeline.

Status. In progress.

DD-010 Two-track NIST plan: MPTC now, CMVP later

Decision. Track A targets MPTC submission 2026-Nov-16. Track B prepares for eventual NIST PQC standardization + CMVP module validation, which is a multi-year process not scheduled.

Rationale. MPTC is the active NIST process for threshold schemes right now. CMVP requires an approved standard, which threshold schemes don't yet have. We can prepare a clean module boundary for future CMVP work without waiting for the standard.

Status. Track A active. Track B is a parallel readiness exercise, not a near-term gate.