Files
zooqueen 5225fa3df0 Pulsar papers: BCC/CEF byte-equal threshold ML-DSA + honest status
lp-073-pulsar (the dedicated Pulsar paper):
- Add §3.8 "Byte-equal threshold ML-DSA (BCC/CEF)": boundary clearance
  (offline, message-independent), NonceCert (W1+ClearanceQC only, never
  full w), Ringtail-style 2-round online signing, public hint recovery
  (FindHint over w'=A·z−c·t1·2^d), Thm 3.1 BCC/CEF byte-equality, mode
  restriction (65/87 only), the V13 finding, honest status.
- Abstract: reframe from "Corona-family" to the shared two-round
  Module-LWE kernel + Pulsar's byte-equal-ML-DSA target via BCC/CEF;
  add review-ready status.
- §5 security: point Lean ref at Crypto.Pulsar.pulsar_pq_unforgeability
  (was Corona.lean/corona_pq_unforgeability — a conflation); add the
  byte-equal-mode proof posture + honest status.
- Reproducibility appendix: replace the v0.3 algebraic-aggregate
  "production path" (which leaked c·s2/c·t0, V13) with the no-leak
  BCC/CEF path + the superseded-V13 note + honest status.
- references.bib: fix lp073 (was titled "Corona ... Threshold
  Signatures" — misattribution) → Pulsar; add lp4450 canonical entry.

lp-020-quasar-consensus (§13 reconciliation — SUPERSEDED):
- §13 rewritten: "Why Not Threshold ML-DSA" → "Threshold ML-DSA via
  Pulsar; Why Not Threshold FALCON". Threshold ML-DSA IS achieved via
  Pulsar BCC/CEF (byte-equal FIPS 204); the two classical obstacles
  (combined-z rejection, hint computation) are dissolved by offline
  boundary clearance + public UseHint. FALCON subsection kept
  (distributed trapdoor Gaussian sampling is still open). V13 finding
  documented; honest review-ready status; rollup is now framed as a
  complementary accountability lane, not a threshold substitute.
- §1/§4/§11 reconciled to match (no longer claim threshold ML-DSA
  "cannot be deployed"); §99 adds lp4450/lp073 bibitems.

Corona = Module-LWE/Ringtail-derived sibling facts preserved throughout.
PDFs rebuilt (latexmk/pdflatex+bibtex), exit 0, no errors.
2026-06-21 07:16:21 -07:00

162 lines
7.7 KiB
TeX

\section{Three-Lane Certificate Architecture}
\label{sec:crypto}
%% ============================================================================
A QuasarCert is the conjunction of three independent verification
\emph{lanes}. Each lane has its own primitive, its own hardness
assumption, and its own verifier. None of the three depends on the others
to verify, and the three are scheduled and executed in parallel both
during signing (validator-side) and during verification (light-client and
peer-side). This section formalizes each lane.
\subsection{Lane 1: BLS12-381 Aggregate Signatures}
BLS12-381~\cite{boneh2001short} operates over the pairing-friendly curve
$E(\mathbb{F}_p)$ with embedding degree 12 and 128-bit classical security.
\begin{itemize}[leftmargin=2em,nosep]
\item \textbf{Key generation}: $\mathit{sk} \xleftarrow{\$} \mathbb{Z}_r$;
$\mathit{pk} = \mathit{sk} \cdot G_2$, with proof-of-possession.
\item \textbf{Signing}: $\sigma = \mathit{sk} \cdot
H_{\mathbb{G}_1}(\mathsf{cert\_subject})$.
\item \textbf{Aggregation}: $\sigma_{\mathrm{agg}} = \sum_{i \in Q}
\sigma_i$. Aggregated size is 48 bytes regardless of $|Q|$.
\item \textbf{Verification}: $e(G_2, \sigma_{\mathrm{agg}}) =
e(\mathit{apk}, H_{\mathbb{G}_1}(\mathsf{cert\_subject}))$ where
$\mathit{apk} = \sum_{i \in Q} \mathit{pk}_i$.
\end{itemize}
BLS provides the classical fast path. Verification cost is $O(1)$ in $|Q|$
and dominated by two pairings; an aggregate-of-aggregates check at
$n{=}100$ runs in ${\sim}875\,\mu$s on commodity x86 CPU
(Section~\ref{sec:performance}). This lane is broken by Shor; the other
two lanes compensate.
\subsection{Lane 2: Corona (Module-LWE Threshold Signatures)}
Corona~\cite{corona} is a lattice-based $t$-of-$n$ threshold
signature scheme over the polynomial ring $R_q = \mathbb{Z}_q[X]/(X^N+1)$
with parameters $N = 256$, $q = 2^{48} + 2561$ (NTT-friendly), module
dimension 8, and threshold $t = \lfloor 2n/3 \rfloor + 1$. It is a
two-round, Module-LWE construction (Ringtail-derived parameter set)
that builds on the Ringtail line~\cite{ringtail}.
\begin{itemize}[leftmargin=2em,nosep]
\item \textbf{DKG}: Q-Chain runs the Corona DKG once per epoch,
producing the combined public key $\mathit{pk}^{\mathrm{RT}}$ and
Shamir-shared secrets $\mathit{sk}_i^{\mathrm{RT}}$. The DKG
transcript hash is $\mathsf{qchain\_ceremony\_root}$.
\item \textbf{Round 1 (precomputation)}: each party $P_i$ samples a nonce
$\mathbf{y}_i \sim D_{\sigma'}^N$ from PRF-correlated randomness,
commits $\mathbf{w}_i = \mathbf{A}\mathbf{y}_i$, and broadcasts
$\mathbf{w}_i$ with a MAC.
\item \textbf{Round 2 (signing)}: given message
$m = \mathsf{cert\_subject}$, compute challenge
$c = H(m \,\|\, \sum_i \mathbf{w}_i)$, response
$\mathbf{z}_i = \mathbf{y}_i + c \cdot \mathit{sk}_i^{\mathrm{RT}}$,
reject if $\|\mathbf{z}_i\|$ exceeds the bound (rejection sampling).
\item \textbf{Combination}: the Q-Chain combiner reconstructs
$\mathbf{z} = \sum_{i \in T} \lambda_i \mathbf{z}_i$ via Lagrange
interpolation over the ring.
\item \textbf{Verification}: $\|\mathbf{z}\| \leq B$ and
$H(m \,\|\, \mathbf{A}\mathbf{z} - c\mathbf{t}) = c$.
\emph{Batch verify is $O(1)$ amortized after DKG} because the
verifier holds a fixed $\mathit{pk}^{\mathrm{RT}}$.
\end{itemize}
Corona's security reduces to Module-LWE/SIS;
the production parameters provide $> 128$-bit classical and $> 130$-bit
quantum security (Appendix~E of~\cite{qcert-proof}).
\subsection{Lane 3: MLDSAGroth16 (Z-Chain Rollup of ML-DSA-65)}
\label{sec:lane3}
The third lane is the conceptual heart of Quasar 3.0. The naive design
would carry $N$ raw ML-DSA-65 validator signatures in every block header,
costing $N \times 3{,}309$ bytes (e.g.\ ${\sim}69$\,KB at $N{=}21$,
${\sim}330$\,KB at $N{=}100$) and $N \times 254\,\mu$s per verifier. We
instead delegate ML-DSA verification to a Z-Chain Groth16 rollup. The
on-chain artifact reduces from $N \times 3{,}309$ bytes to a fixed
\textbf{192-byte SNARK plus 32-byte public-inputs hash}, irrespective of
$N$.
\paragraph{Primitive: ML-DSA-65 (FIPS 204).}
\begin{itemize}[leftmargin=2em,nosep]
\item Public key 1{,}952 B; secret key 4{,}032 B; signature 3{,}309 B.
\item NIST Level 3, $\geq$128-bit quantum security.
\item Verification: 254\,$\mu$s CPU (cold), 3\,$\mu$s with cached
challenge (hot path).
\end{itemize}
\paragraph{Z-Chain rollup statement.}
The MLDSAGroth16 lane is a non-interactive zero-knowledge argument for
the relation
\[
\mathcal{R}_{\mathrm{ZK}} \;=\; \Bigl\{\,
\bigl(x;\, w\bigr)
\;:\;
x = (\mathsf{cert\_subject},\, h_x)
\,\land\,
w = \bigl(\{\mathit{pk}_i^{\mathrm{ML}}\}_{i=1}^N,
\{\sigma_i^{\mathrm{ML}}\}_{i=1}^N\bigr)
\,\land\,\Phi(x, w)\,\Bigr\}
\]
where $\Phi(x, w)$ holds iff:
\begin{enumerate}[leftmargin=2em,nosep]
\item $h_x = H_{\text{Poseidon}}\bigl(\{\mathit{pk}_i^{\mathrm{ML}}\}_{i=1}^N
\,\|\, \mathsf{cert\_subject}\bigr)$.
\item $\sum_{i=1}^{N} [\![ \mathsf{MLDSA.Verify}(\mathit{pk}_i^{\mathrm{ML}},
\mathsf{cert\_subject}, \sigma_i^{\mathrm{ML}}) = 1 ]\!] \;\geq\;
t = \lfloor 2N/3 \rfloor + 1$.
\item Each $\mathit{pk}_i^{\mathrm{ML}}$ appears in
$P_\text{val}$ (the validator-set Merkle root) at the binding
epoch.
\end{enumerate}
The Groth16 prover, executed by Z-Chain validators, produces
$\pi_{\mathrm{ZK}} = (A, B, C) \in \mathbb{G}_1 \times \mathbb{G}_2
\times \mathbb{G}_1$ totalling 192 bytes (compressed), and emits the
public-inputs hash $h_x$ (32 bytes).
\paragraph{Why this is not a raw per-validator ML-DSA list.}
The rollup is a \emph{single} succinct argument. The verifier never sees
individual ML-DSA signatures; it sees only $(\pi_{\mathrm{ZK}}, h_x)$.
This is critical for two reasons. First, on-chain footprint: the per-block
post-quantum identity-binding cost is $192 + 32$ bytes regardless of
validator count. Second, verification cost: $\mathsf{Groth16.Verify}$ is
three pairings, executed in 200--500\,$\mu$s when batched on a GPU
(Section~\ref{sec:gpu-native}).
\paragraph{This lane is accountability, not a substitute for threshold
ML-DSA.}
This lane proves a quorum of \emph{individual} ML-DSA-65 signatures and
compresses them to a constant on-chain footprint; it is the
per-validator accountability mechanism, not Lux's threshold scheme. A
genuine threshold ML-DSA --- byte-equal to FIPS~204 --- \emph{is}
provided separately by \textbf{Pulsar} (LP-4450~\cite{lp4450}):
ML-DSA's Fiat--Shamir-with-Aborts requires a rejection-and-hint
sequence over the \emph{combined} response that no party can evaluate
locally, and Pulsar resolves this by moving the rejection decision
offline (boundary-cleared nonces) and recovering the hint from public
data ($\mathsf{FindHint}$ over $\mathbf{w}' = \mathbf{A}\mathbf{z} -
c\mathbf{t}_1 2^d$), never reconstructing $c\mathbf{s}_2$ or
$c\mathbf{t}_0$ (Section~\ref{sec:threshold-mldsa-pulsar}). The two
lanes are orthogonal: the Z-Chain Groth16 rollup gives the on-chain
footprint and per-validator attribution \emph{without altering the
underlying primitive} (each validator runs FIPS-204 ML-DSA-65 exactly
as standardized), while Pulsar gives the threshold seal under one group
key.
\paragraph{Trusted setup.}
Z-Chain's Groth16 verifying key is the output of a multi-party trusted
setup ceremony (powers-of-tau plus circuit-specific phase 2, with $\geq
1024$ contributors). The verifying-key hash is rooted on Z-Chain as
$\mathsf{zchain\_vk\_root}$ and bound into the certificate subject. A
post-setup-compromise attacker can forge $\pi_{\mathrm{ZK}}$ but still
cannot produce a Corona signature or break BLS, so single-compromise
insufficiency (Theorem~\ref{thm:single}) holds.
%% ============================================================================