Files
zeekay ca327f37cb papers: lock PQ threshold-sig stack to dealerless canon (Pulsar Mithril RSS + hyperball, dual-leg Module-LWE)
Pulsar (LP-073, LP-223): the dealer is DEAD AT BOTH ENDS.
- Keygen: dealerless via Mithril short replicated secret sharing (Celi-del
  Pino-Espitau-Niot-Prest, ia.cr/2026/013, USENIX Sec 2026) -- the published
  escape from the naive-additive-S_eta wall; group key signs under the STOCK
  FIPS-204 verifier (compatibility PROVEN), per-subset mod-q reduction
  unblocks large committees (n=16,t=14). Replaces the old 'key generation
  stays trusted-dealer / provably unreachable' claim everywhere.
- Signing: no-reconstruct hyperball 3-round signer (z_j=y_j+c*s1_(j); no
  party forms s1/s2/seed/sk; mask y never serialised), verifies under stock
  ML-DSA. CI invariant forbids trusted-dealer keygen in production files.
- Claim discipline: (A) standard-FIPS-204-verifier-COMPATIBLE = PROVEN vs
  (B) full FIPS-204 KeyGen-distribution-EQUIVALENCE = labeled open residual;
  malicious-HARDENED != fully-malicious-secure-PROVEN. Versions -> pulsar
  v1.7.1, threshold v1.10.2, consensus v1.29.1, mlwe shared base.
- Fixed pre-pivot staleness: Pulsar sig is byte-equal ML-DSA-65 (~3.3KB),
  not the ~33KB 48-bit (c,z,Delta) shared kernel; q=8380417 production.

Corona (LP-220): Module-LWE (Ringtail/Raccoon, M=8 N=7, q=0x1000000004A01),
natively dealerless (Pedersen-VSS noise-flooded), no-reconstruct signing,
consumes shared luxfi/mlwe. Both lattice legs now dealerless -> Corona is
defence-in-depth, NOT the sole permissionless-public carrier. P3Q kind-0x02
dispatch still abiFalse, but the library landed + dedicated 0x012206 wired.

Dual-leg diversity (LP-020, LP-220, LP-magnetar): Corona + Pulsar BOTH
Module-LWE -> distinct schemes/params, adversary must break BOTH, strictly
stronger than either; NOT hardness-disjoint -- assumption-disjoint leg is
hash-based Magnetar (SLH-DSA). Cite Mithril ia.cr/2026/013.

Scan targets: lp-020 (Ring-LWE->Module-LWE, versions, residual B),
lp-stricte2epq (canonical-status note: byte-equal FIPS-204, sampled small
committees n=8/t=7/m=12/r=8 not single n=64; sig sizes), lp-magnetar
(Corona Ring-LWE->Module-LWE).

All 6 PDFs rebuilt clean (pdflatex+bibtex+pdflatex x2): lp-073 59pp,
lp-220 8pp, lp-223 5pp, lp-020 32pp, lp-stricte2epq 47pp, lp-magnetar 13pp.
2026-06-28 13:37:54 -07:00

103 lines
5.0 KiB
TeX

\section{Parameters and Ring Construction}
\label{sec:parameters}
\paragraph{Scope of this section.} The parameters below pin the generic
two-round lattice-threshold \emph{kernel} --- the $(c, z, \Delta)$
mechanism Pulsar shares with Corona \cite{corona}, instantiated at the
48-bit Ringtail parameter set ($q = \mathtt{0x1000000004A01}$) with the
bespoke verifier of \S\ref{sec:protocol:verify}. Pulsar's
\emph{production} instantiation is byte-equal to FIPS~204 ML-DSA and
therefore runs at the ML-DSA parameter set instead --- prime $q =
8380417$, ring $R_q = \mathbb{Z}_q[X]/(X^{256}+1)$, with the stock
FIPS-204 verifier; those parameters and the construction that reaches
them (TALUS) are specified in \S\ref{sec:protocol:bcc}. Read this section
as the shared kernel; read \S\ref{sec:protocol:bcc} for Pulsar's
on-the-wire FIPS-204 signature.
\subsection{Rings}
The protocol uses three rings, all of degree $\varphi = 256$ and Standard NTT \cite{lp029} (negacyclic $\mathbb{Z}[X]/(X^\varphi+1)$):
\begin{table}[H]
\centering
\caption{Ring parameters. $R$ is the working ring; $R_\xi$ and $R_\nu$ are non-NTT auxiliary rings used solely as containers for rounded coefficients.}
\begin{tabular}{lrrl}
\toprule
Ring & Degree & Modulus & Purpose \\
\midrule
$R$ & 256 & $q = \texttt{0x1000000004A01}$ (48-bit) & working ring \\
$R_\xi$ & 256 & $q_\xi = \texttt{0x40000} = 2^{18}$ & rounded public key $\tilde b$ \\
$R_\nu$ & 256 & $q_\nu = \texttt{0x80000} = 2^{19}$ & hint $\tilde h$, $\tilde \Delta$ \\
\bottomrule
\end{tabular}
\end{table}
The construction $R$ requires $q \equiv 1 \pmod{2\varphi}$ for the existence of a $2\varphi$-th primitive root of unity; this holds since $q \mod 512 = 1$. The rings are instantiated as
\[
\texttt{ring.NewRing}(2^{8},\; \{q\}) \quad \text{etc.}
\]
in the Go canonical (\texttt{threshold/threshold.go:46}).
\subsection{NTT and Montgomery constants}
For each modulus $q_*$, Lattigo \cite{lattigov7} pre-computes:
\begin{itemize}
\item $\textsc{MRedConstant}(q) = q^{-1} \bmod 2^{64}$, used in Montgomery reduction (\texttt{lattice/ring/modular\_reduction.go:67}).
\item $\textsc{BRedConstant}(q) = (\lfloor 2^{128}/q \rfloor \gg 64,\;\lfloor 2^{128}/q \rfloor \bmod 2^{64})$, used in Barrett reduction (line 99).
\item $\textsc{RootsForward}$ and $\textsc{RootsBackward}$ tables: powers of the $2\varphi$-th primitive root in Montgomery form, bit-reversed order (\texttt{lattice/ring/subring.go:99}).
\end{itemize}
All NTT-domain multiplies in the protocol use \texttt{MulCoeffsMontgomery} (the lazy variant when output bounds permit). Polynomials are stored in Montgomery form ($a \cdot 2^{64} \bmod q$) inside the NTT domain; \texttt{MForm} and \texttt{IMForm} interconvert.
\subsection{Protocol constants}
Constants from \texttt{sign/config.go} are reproduced in Table~\ref{tab:constants}.
\begin{table}[H]
\centering
\caption{Protocol constants. \texttt{LogN}~$=8$ defines the ring degree $\varphi$; the symbol \texttt{N} in the Go source denotes the secret-vector length, which we render as $n_{\textrm{vec}}$ to avoid confusion.}
\label{tab:constants}
\begin{tabular}{llp{6.5cm}}
\toprule
Symbol & Value & Role \\
\midrule
$\varphi$ & $256$ & ring degree (\texttt{1 << LogN}) \\
$m_{\textrm{pk}}$ & $8$ & public-key matrix rows ($M$ in Go) \\
$n_{\textrm{vec}}$ & $7$ & secret-vector length (\texttt{N} in Go) \\
$\bar D$ & $48$ & masking nonce expansion factor \\
$K$ & $n$ & total parties (set per epoch) \\
$t$ & threshold & $1 \le t < n$ \\
$\kappa$ & $23$ & challenge ternary Hamming weight \\
$\xi$ & $30$ & public-key rounding $\tilde b = \lfloor b / 2^{30} \rceil$ \\
$\nu$ & $29$ & hint rounding $\tilde h = \lfloor h / 2^{29} \rceil$ \\
$|\textsc{Key}|$ & $32$ bytes & symmetric / MAC / PRNG seed length \\
$\eta_\varepsilon$ & $2.650104$ & rejection-sampling slack \\
\bottomrule
\end{tabular}
\end{table}
\subsection{Discrete-Gaussian parameters}
Three Discrete-Gaussian distributions appear in the protocol; bound $B = 2\sigma$ is the truncation bound passed to Lattigo's Ziggurat sampler \cite{ziggurat,lattigov7}.
\begin{table}[H]
\centering
\caption{Discrete-Gaussian samplers. All bounds are $B = 2\sigma$.}
\begin{tabular}{lll}
\toprule
Sampler & $\sigma$ & Used for \\
\midrule
$\sigma_E$ & $6.108187070284607$ & LWE error $e$, per-party $E_i$, mask $R_i$ \\
$\sigma_*$ & $1.7285 \times 10^{11}$ ($\approx 2^{37.33}$) & ``star'' column $r^*, e^*$ \\
$\sigma_U$ & $1.6396 \times 10^{8}$ & challenge-side $u$ (\textsc{GaussianHash}) \\
\bottomrule
\end{tabular}
\end{table}
The $L_2$ acceptance bound is
\[
B^2 = 184\,960\,669\,042\,442\,604\,975\,662\,780\,477,
\]
equivalent to $B \approx 4.30 \times 10^{14}$. Every coefficient of $z$ and $\Delta$ is reduced to its signed representative in $(-q/2, q/2]$ before squaring (\texttt{sign.go:303}).