mirror of
https://github.com/luxfi/pulsar.git
synced 2026-09-24 00:25:52 +00:00
references.bib gave ePrint 2024/1113 the title "Corona: Practical Two-Round Threshold Signatures from Learning with Errors". The paper is "Ringtail: Practical Two-Round Threshold Signatures from Learning with Errors", by the six authors the entry already named correctly. A title is the authors' words. The file's own header asks for exactly this โ "verified against https://eprint.iacr.org... Do not paraphrase or guess". Ringtail is their scheme. Corona is Lux's implementation over Ring-LWE; Pulsar retargets the same two-round structure to Module-LWE for FIPS 204. The prose and the citation key now say so, and this spec is the NIST MPTC submission, so it is the last place to get it wrong. patent-notes.tex stated "Corona's open-source repo is Apache-2.0 with no asserted patent claims". Corona is under the Lux Ecosystem License v1.2, which reserves commercial use โ no Apache grant and no Apache ยง3 patent grant. The surrounding paragraph had been flattened by a rename into "Pulsar ... is derivative of Pulsar" and "Pulsar (and therefore Pulsar) is a fork"; it now names Corona and Ringtail where each is meant. Dropped the residual Pulsar-M spelling, including the naming rule that forbade writing "Pulsar" and required writing "Pulsar". Co-authored-by: Hanzo Dev <[email protected]>
1646 lines
76 KiB
TeX
1646 lines
76 KiB
TeX
% Pulsar Technical Specification --- NIST MPTC submission
|
|
% Target deadline: 2026-Nov-16
|
|
%
|
|
% Compile: latexmk -pdf pulsar.tex
|
|
%
|
|
% Status: cryptographic body drafted. Encoding section is intentionally
|
|
% structural only --- byte-level wire formats freeze at DD-008
|
|
% (end of August 2026).
|
|
|
|
\documentclass[11pt,a4paper]{article}
|
|
|
|
\usepackage[margin=1in]{geometry}
|
|
\usepackage{amsmath, amssymb, amsthm}
|
|
\usepackage{algorithm, algpseudocode}
|
|
\usepackage{hyperref}
|
|
\usepackage{cite}
|
|
\usepackage{microtype}
|
|
\usepackage{xcolor}
|
|
\usepackage{listings}
|
|
\usepackage{booktabs}
|
|
\usepackage{enumitem}
|
|
\usepackage{cleveref}
|
|
|
|
\hypersetup{
|
|
colorlinks=true,
|
|
linkcolor=blue!50!black,
|
|
citecolor=blue!50!black,
|
|
urlcolor=blue!50!black,
|
|
}
|
|
|
|
\newtheorem{theorem}{Theorem}
|
|
\newtheorem{lemma}[theorem]{Lemma}
|
|
\newtheorem{proposition}[theorem]{Proposition}
|
|
\newtheorem{corollary}[theorem]{Corollary}
|
|
\theoremstyle{definition}
|
|
\newtheorem{definition}{Definition}
|
|
\newtheorem{game}{Game}
|
|
\newtheorem{construction}{Construction}
|
|
\theoremstyle{remark}
|
|
\newtheorem{remark}{Remark}
|
|
\newtheorem{sketch}{Proof sketch}
|
|
\newtheorem{openq}{Open question}
|
|
|
|
\crefname{theorem}{Theorem}{Theorems}
|
|
\crefname{lemma}{Lemma}{Lemmas}
|
|
\crefname{proposition}{Proposition}{Propositions}
|
|
\crefname{corollary}{Corollary}{Corollaries}
|
|
\crefname{definition}{Definition}{Definitions}
|
|
\crefname{game}{Game}{Games}
|
|
\crefname{construction}{Construction}{Constructions}
|
|
\crefname{remark}{Remark}{Remarks}
|
|
\crefname{openq}{Open question}{Open questions}
|
|
\crefname{algorithm}{Algorithm}{Algorithms}
|
|
|
|
\newcommand{\Rq}{R_q}
|
|
\newcommand{\Zq}{\mathbb{Z}_q}
|
|
\newcommand{\Tq}{\mathbb{T}_q}
|
|
\newcommand{\GF}{\mathrm{GF}}
|
|
\newcommand{\negl}{\mathsf{negl}}
|
|
\newcommand{\poly}{\mathsf{poly}}
|
|
\newcommand{\PPT}{\mathsf{PPT}}
|
|
\newcommand{\Adv}{\mathsf{Adv}}
|
|
% \Pr is provided by LaTeX as a math operator; we use it directly.
|
|
\newcommand{\MLWE}{\mathsf{MLWE}}
|
|
\newcommand{\MSIS}{\mathsf{MSIS}}
|
|
\newcommand{\SHAKE}{\mathrm{SHAKE256}}
|
|
\newcommand{\cSHAKE}{\mathrm{cSHAKE256}}
|
|
\newcommand{\KMAC}{\mathrm{KMAC256}}
|
|
\newcommand{\TupleHash}{\mathrm{TupleHash256}}
|
|
\newcommand{\NTT}{\mathrm{NTT}}
|
|
\newcommand{\INTT}{\mathrm{NTT}^{-1}}
|
|
\newcommand{\HighBits}{\mathsf{HighBits}}
|
|
\newcommand{\LowBits}{\mathsf{LowBits}}
|
|
\newcommand{\MakeHint}{\mathsf{MakeHint}}
|
|
\newcommand{\UseHint}{\mathsf{UseHint}}
|
|
\newcommand{\Power}{\mathsf{Power2Round}}
|
|
\newcommand{\Decompose}{\mathsf{Decompose}}
|
|
\newcommand{\Sign}{\textsc{Sign}}
|
|
\newcommand{\Verify}{\textsc{Verify}}
|
|
\newcommand{\Setup}{\textsc{Setup}}
|
|
\newcommand{\DKG}{\textsc{DKG}}
|
|
\newcommand{\Reshare}{\textsc{Reshare}}
|
|
\newcommand{\Refresh}{\textsc{Refresh}}
|
|
\newcommand{\Comm}{\mathsf{Comm}}
|
|
|
|
\title{Pulsar:\\
|
|
\large A Threshold Implementation of FIPS 204 ML-DSA\\
|
|
NIST MPTC Class N1 + N4 Candidate}
|
|
\author{Lux Industries Inc.\\
|
|
\texttt{[email protected]}}
|
|
\date{Draft \today}
|
|
|
|
\begin{document}
|
|
\maketitle
|
|
|
|
\begin{abstract}
|
|
Pulsar is a $t$-of-$n$ threshold implementation of NIST FIPS 204
|
|
(ML-DSA)~\cite{nist-fips204} signing and distributed key generation.
|
|
The threshold ceremony emits signatures byte-equal to single-party
|
|
FIPS~204 ML-DSA signatures: Pulsar signatures verify under
|
|
unmodified \texttt{ML-DSA.Verify}. The protocol structure is the
|
|
two-round threshold scheme of Boschini, Kaviani, Lai, Malavolta,
|
|
Takahashi, and Tibouchi (``Ringtail''~\cite{boschini2024ringtail}), retargeted
|
|
from Ring-LWE ($\Rq$, single polynomial) to Module-LWE ($\Rq^k$,
|
|
polynomial vectors) so the protocol's algebraic shape matches
|
|
FIPS~204.
|
|
|
|
This document is the technical specification submitted to the NIST
|
|
Multi-Party Threshold Cryptography first call (NIST IR
|
|
8214C,~\cite{nist-ir-8214c}). We claim Class~N1 (signing) and Class~N4
|
|
(ML keygen / DKG): output interchangeability with FIPS~204 is the
|
|
headline contribution.
|
|
|
|
\paragraph{Status.} Draft. Encoding freeze targeted for end-August
|
|
2026; package submission targeted for 2026-Nov-16. Sections on
|
|
encodings and concrete benchmarks are intentionally structural only
|
|
in this draft --- the byte-level wire formats freeze at the
|
|
encoding-freeze gate.
|
|
\end{abstract}
|
|
|
|
\tableofcontents
|
|
|
|
% =====================================================================
|
|
\section{Introduction}
|
|
% =====================================================================
|
|
|
|
\paragraph{FIPS~204 ML-DSA.}
|
|
FIPS~204~\cite{nist-fips204} standardises the Module-Lattice-Based
|
|
Digital Signature Algorithm (ML-DSA), a derandomised variant of
|
|
CRYSTALS-Dilithium. ML-DSA is a Fiat--Shamir-with-Aborts scheme over
|
|
the cyclotomic ring $\Rq = \Zq[X]/(X^{256}+1)$ with prime modulus
|
|
$q = 2^{23} - 2^{13} + 1 = 8\,380\,417$. Three parameter sets ---
|
|
ML-DSA-44, ML-DSA-65, ML-DSA-87 --- target NIST PQ categories
|
|
$2$, $3$, and $5$ respectively. The signature format is a triple
|
|
$\sigma = (\tilde c, z, h)$ where $\tilde c \in \{0,1\}^{2\lambda}$
|
|
is the commitment hash, $z \in \Rq^\ell$ is the masked response, and
|
|
$h \in \{0,1\}^{\omega + k}$ encodes hint bits.
|
|
|
|
\paragraph{Threshold signing.}
|
|
A $t$-of-$n$ threshold signature scheme replaces the single signing
|
|
party with a quorum: any subset of at least $t$ parties from a fixed
|
|
group of $n$ can jointly produce a signature, while any subset of
|
|
size strictly less than $t$ learns no useful information about the
|
|
secret key and cannot forge. Threshold deployments are mandatory for
|
|
high-value systems where single-key custody is unacceptable
|
|
(consensus validators, custodial-key cold storage, root-CA signing).
|
|
NIST IR~8214C~\cite{nist-ir-8214c} structures the design space into
|
|
\emph{Class~S} (special threshold-friendly primitives, no output
|
|
interchangeability requirement) and \emph{Class~N} (threshold
|
|
implementations \emph{of} a specified NIST primitive whose outputs
|
|
are interchangeable with the non-threshold primitive's outputs).
|
|
|
|
\paragraph{Output interchangeability is the headline claim.}
|
|
The Class~N positioning is strictly stronger: a threshold signature
|
|
produced by Pulsar verifies against the same group public key
|
|
$\mathit{pk}$ under unmodified \texttt{ML-DSA.Verify}. Any deployed
|
|
FIPS-validated ML-DSA verifier --- BoringSSL FIPS, AWS-LC, OpenSSL~3,
|
|
liboqs, or any future module conforming to FIPS~204 --- consumes
|
|
Pulsar signatures with no code change. This collapses the
|
|
threshold/non-threshold split at the wire format: a relying party
|
|
who can verify ML-DSA can verify Pulsar.
|
|
|
|
\paragraph{Why Pulsar alongside Pulsar.}
|
|
The companion scheme Corona (R-LWE)~\cite{boschini2024ringtail} is a
|
|
Class~S candidate over the single-polynomial ring $\Rq$. Pulsar's
|
|
construction is faster, simpler, and produces a different wire
|
|
format (the verifier is \emph{not} FIPS~204; it is a Pulsar-specific
|
|
verifier). Pulsar ports that protocol's $2$-round signing structure
|
|
to the Module-LWE setting $\Rq^k$ in which FIPS~204 operates so that
|
|
the output byte string is exactly an ML-DSA signature. We retain
|
|
Pulsar's Pedersen DKG (over $\Rq^k$ rather than $\Rq$) and Pulsar's
|
|
HJKY97-style proactive resharing, modulo:
|
|
|
|
\begin{itemize}[leftmargin=*]
|
|
\item \textbf{DD-002 (hash family).} The NIST profile uses
|
|
exclusively FIPS~202~\cite{nist-fips202} +
|
|
SP~800-185~\cite{nist-sp800-185}: $\SHAKE$, $\cSHAKE$, $\KMAC$,
|
|
$\TupleHash$. No BLAKE3. The same SHAKE-256 sponge is used
|
|
internally by ML-DSA-65 (FIPS~204~\S5.1).
|
|
\item \textbf{DD-003 (lattice shape).} The protocol operates on
|
|
$\Rq^k$ with the FIPS~204 parameters $(k, \ell, \eta, \tau, \gamma_1,
|
|
\gamma_2, \omega, \beta, d, \lambda)$ inherited verbatim per
|
|
parameter level.
|
|
\item \textbf{DD-006 (reshare quorum selection).} Long-lived
|
|
deployments select the reshare quorum from the chain's randomness
|
|
beacon rather than deterministically (smallest-ID). The deterministic
|
|
selection used by the Pulsar reference implementation lets a mobile
|
|
adversary game the corrupt-set positioning across epochs; the beacon
|
|
selection blocks that line of attack.
|
|
\end{itemize}
|
|
|
|
\paragraph{High-level construction.}
|
|
Pulsar consists of four protocols and one verifier:
|
|
|
|
\begin{itemize}[leftmargin=*]
|
|
\item $\DKG$: Pedersen distributed key generation over $\Rq^k$.
|
|
Three rounds. Output: a group public key $\mathit{pk}$ distributed
|
|
exactly as a fresh ML-DSA public key, and a per-party Shamir share
|
|
$(s_i, u_i)$ where $s_i$ shares the secret $s$ under the FIPS~204
|
|
secret distribution and $u_i$ is the blinding share used for
|
|
Pedersen binding.
|
|
\item $\Sign$: Two-round threshold signing. Inputs: shares
|
|
$(s_i, u_i)$ and message $\mu$. Output: a single FIPS~204
|
|
$\sigma = (\tilde c, z, h)$ that verifies under \texttt{ML-DSA.Verify}.
|
|
\item $\Verify$: literally \texttt{ML-DSA.Verify} from FIPS~204
|
|
\S6.3; we quote and \emph{do not modify} the verifier.
|
|
\item $\Reshare$: HJKY97-style proactive resharing, with
|
|
beacon-randomised quorum selection. Inputs: old committee shares,
|
|
new committee identity set, fresh beacon randomness.
|
|
Output: new committee shares producing the \emph{same} $\mathit{pk}$.
|
|
\item Identifiable abort: every protocol stage emits signed evidence
|
|
of any detected deviation, suitable for slashing.
|
|
\end{itemize}
|
|
|
|
\paragraph{Document map.}
|
|
\S\ref{sec:notation} pins notation. \S\ref{sec:prelim} states the
|
|
hardness assumption (M-LWE), Pedersen commitments over $\Rq^k$,
|
|
Shamir secret sharing over $\Rq^k$, and the FIPS~204 sampling
|
|
primitives we re-use verbatim. \S\ref{sec:algorithms} specifies
|
|
$\DKG$, $\Sign$, the verifier, and $\Reshare$.
|
|
\S\ref{sec:security} defines the security games and reduces each to
|
|
either M-LWE / MSIS or to the FIPS~204 EUF-CMA argument; the formal
|
|
game definitions live in the companion file
|
|
\texttt{spec/security-games.tex} included verbatim.
|
|
\S\ref{sec:parameters} specifies three parameter sets matching
|
|
ML-DSA-44/65/87 with lattice-estimator commitments.
|
|
\S\ref{sec:encodings} is structural only in this draft; byte-level
|
|
wire formats freeze at DD-008.
|
|
\S\ref{sec:system-model}--\ref{sec:deployment} cover the system model,
|
|
implementation considerations, and operational deployment guidance.
|
|
|
|
% =====================================================================
|
|
\section{Notation}
|
|
\label{sec:notation}
|
|
% =====================================================================
|
|
|
|
\paragraph{Rings.} For a prime $q$ and positive power-of-two $n$, let
|
|
$\Rq = \Zq[X]/(X^n + 1)$ be the cyclotomic ring of degree $n$ over
|
|
$\Zq$. Pulsar operates over $\Rq$ with $(q, n) = (8\,380\,417, 256)$
|
|
matching FIPS~204. Lower-case Latin letters denote ring elements;
|
|
bold or vector arrows denote elements of $\Rq^k$ or $\Rq^\ell$.
|
|
|
|
\paragraph{NTT.} The number-theoretic transform
|
|
$\NTT : \Rq \to \Zq^n$ is the FIPS~204 NTT
|
|
(FIPS~204~\S7.5). $\NTT$ is a ring isomorphism; for $a, b \in \Rq$,
|
|
$\NTT(a \cdot b) = \NTT(a) \odot \NTT(b)$ where $\odot$ denotes
|
|
coordinate-wise multiplication in $\Zq^n$. Multiplication of ring
|
|
elements is computed by transporting both factors to NTT form,
|
|
multiplying coordinate-wise, and inverse-transforming. Throughout
|
|
this specification we adopt the convention that all matrix and
|
|
vector multiplications are computed in NTT representation unless
|
|
explicitly noted; this is the same convention as FIPS~204.
|
|
|
|
\paragraph{Module shape.} The FIPS~204 ML-DSA parameter sets are
|
|
indexed by a pair $(k, \ell)$ giving the dimensions of the public
|
|
matrix $\mathbf{A} \in \Rq^{k \times \ell}$ and the secret vector
|
|
$\mathbf{s}_1 \in \Rq^\ell$. The three FIPS~204 parameter sets fix
|
|
$(k, \ell) \in \{(4, 4), (6, 5), (8, 7)\}$ for ML-DSA-44, ML-DSA-65,
|
|
ML-DSA-87 respectively (FIPS~204~\S4 Table~1).
|
|
|
|
\paragraph{Threshold parameters.} A threshold scheme has total party
|
|
count $n$ and reconstruction threshold $t$, with $1 \le t \le n$ and
|
|
$n \ge 2t - 1$ (so a $t$-element quorum exists alongside up to $t-1$
|
|
faulty parties). Each party is identified by a $1$-indexed integer
|
|
$i \in \{1, \dots, n\}$. We forbid the index $0$ because $0$ is the
|
|
Shamir evaluation point of the secret. We re-use the symbol $n$ for
|
|
both the ring degree and the party count where context disambiguates;
|
|
where a clash would be confusing we write $\nu$ for the ring degree
|
|
(matching FIPS~204's variable name).
|
|
|
|
\paragraph{Hash family.} All hashing uses the FIPS~202 +
|
|
SP~800-185 family: $\SHAKE$ (FIPS~202~\S6.3), $\cSHAKE$
|
|
(SP~800-185~\S3), $\KMAC$ (SP~800-185~\S4), $\TupleHash$
|
|
(SP~800-185~\S5). Each call is parameterised by a customisation
|
|
string. The canonical customisation tags used by Pulsar are:
|
|
|
|
\begin{center}\small
|
|
\begin{tabular}{l l}
|
|
\toprule
|
|
purpose & SP~800-185 customisation tag \\
|
|
\midrule
|
|
DKG commit-digest (Round~1.5) & \texttt{PULSAR-DKG-COMMIT-V1} \\
|
|
DKG transcript hash & \texttt{PULSAR-DKG-TRANSCRIPT-V1} \\
|
|
Sign Round-1 transcript (sid hash $H_1$) & \texttt{PULSAR-SIGN-R1-V1} \\
|
|
Sign Round-2 challenge (FIPS~204 $\tilde c$) & FIPS~204 inner SHAKE-256 \\
|
|
Sign per-party PRNG (round-keyed) & \texttt{PULSAR-SIGN-PRNG-V1} \\
|
|
Sign PRF for mask cancellation & \texttt{PULSAR-SIGN-PRF-V1} \\
|
|
Reshare commit digest & \texttt{PULSAR-RESHARE-COMMIT-V1} \\
|
|
Reshare transcript & \texttt{PULSAR-RESHARE-TRANSCRIPT-V1} \\
|
|
Reshare beacon binding & \texttt{PULSAR-RESHARE-BEACON-V1} \\
|
|
Public matrix $\mathbf{A}$ derivation & FIPS~204 \texttt{ExpandA} (no change) \\
|
|
Public matrix $\mathbf{B}$ derivation & \texttt{PULSAR-EXPANDB-V1} \\
|
|
Complaint signing transcript & \texttt{PULSAR-COMPLAINT-V1} \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
The bound on customisation-string length is governed by
|
|
SP~800-185~\S3.2 ($\le 2^{2040}$ bits); all Pulsar tags above are
|
|
short-form ASCII strings well within the bound. Version
|
|
suffixes (\texttt{-V1}) are reserved for future rotation; rotating any
|
|
tag invalidates every test vector pinned at that tag.
|
|
|
|
\paragraph{Sampling.} Five distributions appear in this specification:
|
|
|
|
\begin{itemize}[leftmargin=*]
|
|
\item \emph{Uniform mod $q$}, written $a \gets \Zq$ (per coefficient
|
|
slot). The FIPS~204 rejection-based uniform sampler is reused
|
|
verbatim; see FIPS~204~\S7.3.
|
|
\item \emph{Centred binomial $B_\eta$} over the integers, written
|
|
$a \gets B_\eta$. Secret coefficients have this distribution;
|
|
FIPS~204~\S7.4 (\texttt{SampleInBall} is unrelated --- the secret
|
|
sampler is the centred binomial of \S7.4 with the parameter
|
|
$\eta$ given per parameter set).
|
|
\item \emph{Ternary with Hamming weight $\tau$}, written
|
|
$c \gets B_\tau$. Used for the challenge polynomial $c$; FIPS~204
|
|
\texttt{SampleInBall} (\S7.6).
|
|
\item \emph{Discrete Gaussian with parameter $\sigma$}, written
|
|
$a \gets D_\sigma$. Used only inside the Pedersen DKG round-1
|
|
sampling; see \S\ref{sec:prelim-gauss}.
|
|
\item \emph{Uniform interval} $[-\gamma_1 + 1, \gamma_1]$, written
|
|
$y \gets U_{\gamma_1}$. Used for masking the response polynomial in
|
|
the FIPS~204 signer; FIPS~204~\S7.7.
|
|
\end{itemize}
|
|
|
|
\paragraph{Norms.} Coefficients of $\Zq$ are canonically lifted to
|
|
$(-q/2, q/2]$ before any infinity-norm or two-norm is taken; we
|
|
write $\|a\|_\infty$ and $\|a\|_2$ throughout. For a vector
|
|
$\mathbf{v} \in \Rq^k$, $\|\mathbf{v}\|_\infty = \max_i \|v_i\|_\infty$,
|
|
the maximum entry over all coefficient slots of all components.
|
|
|
|
\paragraph{FIPS~204 macros.} We retain the FIPS~204 names
|
|
$\HighBits, \LowBits, \Decompose, \Power, \MakeHint, \UseHint$ for the
|
|
high-bits and hint extraction routines (FIPS~204~\S7.4--7.5); their
|
|
behaviour and parameterisation by $\gamma_2$ and $d$ are inherited
|
|
unchanged.
|
|
|
|
% =====================================================================
|
|
\section{Mathematical preliminaries}
|
|
\label{sec:prelim}
|
|
% =====================================================================
|
|
|
|
\subsection{Module-LWE assumption}
|
|
\label{sec:prelim-mlwe}
|
|
|
|
The hardness assumption underlying Pulsar is identical to the
|
|
hardness assumption underlying FIPS~204 ML-DSA: the decisional
|
|
Module-LWE problem over $\Rq^k$.
|
|
|
|
\begin{definition}[Decisional Module-LWE]
|
|
\label{def:mlwe}
|
|
Fix $(q, n, k, \ell, \eta) \in \mathbb{N}^5$. Let $\chi_\eta$ denote the
|
|
centred binomial distribution of parameter $\eta$ over $\Zq$, applied
|
|
coefficient-wise to elements of $\Rq$. The decisional
|
|
$\MLWE_{q, k, \ell, \eta}$ problem is to distinguish, with
|
|
non-negligible advantage, the distribution
|
|
\[
|
|
\bigl(\mathbf{A},\,\mathbf{A} \cdot \mathbf{s}_1 + \mathbf{s}_2\bigr)
|
|
\quad \text{where } \mathbf{A} \gets \Rq^{k \times \ell},\;
|
|
\mathbf{s}_1 \gets \chi_\eta^\ell,\;
|
|
\mathbf{s}_2 \gets \chi_\eta^k,
|
|
\]
|
|
from the uniform distribution
|
|
$\bigl(\mathbf{A},\,\mathbf{b}\bigr) \gets \Rq^{k \times \ell} \times \Rq^k$.
|
|
The advantage of an adversary $\mathcal{B}$ is
|
|
\[
|
|
\Adv^{\MLWE}_{q, k, \ell, \eta}(\mathcal{B})
|
|
=
|
|
\bigl|\Pr[\mathcal{B}(\mathbf{A}, \mathbf{A}\mathbf{s}_1+\mathbf{s}_2) = 1]
|
|
- \Pr[\mathcal{B}(\mathbf{A}, \mathbf{b}) = 1]\bigr|.
|
|
\]
|
|
\end{definition}
|
|
|
|
The standard search-to-decision reduction (Langlois--Stehl\'e
|
|
\cite{lattice-estimator} cite-tree from FIPS~204~\S2 references) gives
|
|
the corresponding search hardness. The parameter sets in
|
|
\S\ref{sec:parameters} fix the concrete instances at NIST PQ
|
|
categories $2$, $3$, $5$.
|
|
|
|
\subsection{Pedersen commitments over $\Rq^k$}
|
|
\label{sec:prelim-pedersen}
|
|
|
|
Pulsar's DKG and reshare protocols build on a module-shaped
|
|
Pedersen commitment. The construction is the natural lift of the
|
|
$\Rq$ Pedersen commitment used by the Pulsar reference
|
|
implementation~\cite{boschini2024ringtail} to the module
|
|
ring $\Rq^k$.
|
|
|
|
\begin{construction}[Module Pedersen commitment]
|
|
\label{con:pedersen}
|
|
Let $\mathbf{A}, \mathbf{B} \in \Rq^{k \times \ell}$ be two independent
|
|
uniformly distributed public matrices. The Pedersen commitment to a
|
|
secret vector $\mathbf{c} \in \Rq^\ell$ with binding randomness
|
|
$\mathbf{r} \in \Rq^\ell$ is
|
|
\[
|
|
\Comm_{\mathbf{A}, \mathbf{B}}(\mathbf{c}; \mathbf{r}) \;=\;
|
|
\mathbf{A} \cdot \mathbf{c} + \mathbf{B} \cdot \mathbf{r} \pmod q.
|
|
\]
|
|
$\mathbf{r}$ is drawn from the FIPS~204 centred binomial $\chi_\eta^\ell$ in
|
|
the DKG instantiation. The commitment is $k$-vector valued in
|
|
$\Rq^k$.
|
|
\end{construction}
|
|
|
|
\begin{theorem}[Computational hiding]
|
|
\label{thm:pedersen-hiding}
|
|
Under $\MLWE_{q, k, \ell, \eta}$ in the matrix $\mathbf{B}$,
|
|
$\Comm_{\mathbf{A}, \mathbf{B}}$ is computationally hiding. Formally,
|
|
for any $\PPT$ adversary $\mathcal{A}$ choosing
|
|
$\mathbf{c}_0, \mathbf{c}_1 \in \Rq^\ell$,
|
|
\[
|
|
\Adv^{\mathrm{hide}}_{\mathbf{A}, \mathbf{B}}(\mathcal{A})
|
|
\le
|
|
\Adv^{\MLWE}_{q, k, \ell, \eta}(\mathcal{B})
|
|
\]
|
|
for an efficient reduction $\mathcal{B}$.
|
|
\end{theorem}
|
|
|
|
\begin{proof}[Proof sketch]
|
|
Identical to the BDLOP18~\cite{boschini2024ringtail} commitment-hiding
|
|
argument applied per Shamir-coordinate slot of the module ring.
|
|
Given an M-LWE instance $(\mathbf{B}, \mathbf{B}\mathbf{r} + \mathbf{e})$
|
|
vs.\ $(\mathbf{B}, \mathbf{u})$, the reduction sets
|
|
$\Comm_{\mathbf{A}, \mathbf{B}}(\mathbf{c}_b; \mathbf{r})
|
|
= \mathbf{A}\mathbf{c}_b + (\mathbf{B}\mathbf{r} + \mathbf{e})$, embeds
|
|
the bit $b$ into the choice of plaintext, and uses $\mathcal{A}$'s
|
|
guess. The noise term $\mathbf{e}$ is added back into the commitment
|
|
because the FIPS~204 noise distribution is fixed and the simulator
|
|
must produce exactly that distribution. The advantage
|
|
relationship is tight. \qed
|
|
\end{proof}
|
|
|
|
\begin{theorem}[Computational binding]
|
|
\label{thm:pedersen-binding}
|
|
Under $\MSIS_{q, k, 2\ell, \beta_{\mathrm{bind}}}$ in the wide
|
|
concatenation $[\mathbf{A} \,|\, \mathbf{B}]$, the Pedersen commitment
|
|
is computationally binding. The binding norm bound
|
|
$\beta_{\mathrm{bind}}$ is bounded by the maximum norm of any
|
|
honestly-produced opening:
|
|
$\beta_{\mathrm{bind}} \ge 2\eta\sqrt{n \cdot \ell}$.
|
|
\end{theorem}
|
|
|
|
\begin{proof}[Proof sketch]
|
|
Suppose $\mathcal{A}$ produces
|
|
$(\mathbf{c}_0, \mathbf{r}_0) \ne (\mathbf{c}_1, \mathbf{r}_1)$ with
|
|
$\Comm_{\mathbf{A},\mathbf{B}}(\mathbf{c}_0;\mathbf{r}_0)
|
|
= \Comm_{\mathbf{A},\mathbf{B}}(\mathbf{c}_1;\mathbf{r}_1)$. Then
|
|
$[\mathbf{A}\,|\,\mathbf{B}] \cdot
|
|
(\mathbf{c}_0 - \mathbf{c}_1,\,\mathbf{r}_0 - \mathbf{r}_1)^\top = 0$,
|
|
producing a short solution to MSIS in the concatenation, of norm
|
|
at most $2 \cdot \max(\|\mathbf{c}\|_\infty, \|\mathbf{r}\|_\infty)$,
|
|
which is bounded under the openings of interest. \qed
|
|
\end{proof}
|
|
|
|
\paragraph{Public matrix derivation.}
|
|
$\mathbf{A}$ is derived exactly as in FIPS~204 via
|
|
\texttt{ExpandA} (FIPS~204~\S7.1): \(\mathbf{A} = \texttt{ExpandA}(\rho)\),
|
|
$\rho \in \{0,1\}^{256}$ a public seed. $\mathbf{B}$ is derived from
|
|
a separate nothing-up-my-sleeve seed
|
|
$\rho_B = \cSHAKE(\text{empty}, 256, \text{`Pulsar'},
|
|
\text{`PULSAR-EXPANDB-V1'}\,)$. The two derivations are
|
|
domain-separated so that $\mathbf{A}$ and $\mathbf{B}$ are independent
|
|
even with shared randomness, satisfying the independence
|
|
requirement of \Cref{thm:pedersen-hiding}.
|
|
|
|
\subsection{Shamir secret sharing over $\Rq^k$}
|
|
\label{sec:prelim-shamir}
|
|
|
|
Shamir secret sharing extends to $\Rq^k$ slot-wise: each $\Zq$
|
|
coefficient of each polynomial of each module entry is shared
|
|
independently. Concretely, for a secret $\mathbf{s} \in \Rq^\ell$,
|
|
the dealer chooses a vector polynomial
|
|
\[
|
|
P(X) = \mathbf{s} + \mathbf{a}_1 X + \cdots + \mathbf{a}_{t-1} X^{t-1}
|
|
\in \bigl(\Rq^\ell\bigr)[X], \qquad \mathbf{a}_d \gets \Rq^\ell,
|
|
\]
|
|
and assigns party $i \in \{1, \dots, n\}$ the share $\mathbf{s}_i = P(i)$.
|
|
Reconstruction at $X = 0$ uses standard Lagrange interpolation in
|
|
$\Zq$ per coefficient slot:
|
|
\[
|
|
\mathbf{s} = \sum_{i \in T} \lambda_i^T \cdot \mathbf{s}_i, \qquad
|
|
\lambda_i^T = \prod_{j \in T,\, j \ne i} \frac{-j}{i - j} \pmod q,
|
|
\]
|
|
for any threshold subset $T \subseteq \{1, \dots, n\}$ with
|
|
$|T| = t$. Because the Lagrange coefficients $\lambda_i^T$ live in
|
|
$\Zq$, they act on $\mathbf{s}_i \in \Rq^\ell$ as scalar
|
|
multiplication --- the ring structure is preserved trivially. The
|
|
information-theoretic security of $(t-1)$-Shamir over $\Zq$ gives
|
|
the corresponding security over $\Rq^k$ per slot.
|
|
|
|
\paragraph{Dual sharing $(\mathbf{s}_i, \mathbf{u}_i)$.}
|
|
Pulsar's DKG produces a Shamir share of the FIPS~204 secret
|
|
$\mathbf{s}_1$ alongside a Shamir share of the Pedersen blinding
|
|
randomness $\mathbf{u}$. We denote the per-party share pair by
|
|
$(\mathbf{s}_i, \mathbf{u}_i)$. Both are shared at the same threshold
|
|
$t$ over the same evaluation-point set. The pair is bound to the
|
|
party's identity by the Pedersen commit verification at DKG Round~2.
|
|
|
|
\subsection{Discrete Gaussian sampling}
|
|
\label{sec:prelim-gauss}
|
|
|
|
Pulsar's signing protocol re-uses every distribution from FIPS~204
|
|
verbatim: the mask $\mathbf{y} \gets U_{\gamma_1}^\ell$ (uniform interval),
|
|
the secret centred binomial $\chi_\eta$, the challenge ternary
|
|
$B_\tau$. The Pedersen DKG additionally uses the centred binomial
|
|
$\chi_\eta$ for the blinding factor $\mathbf{r}$ to match
|
|
FIPS~204's secret distribution.
|
|
|
|
\paragraph{Why no Gaussian in $\Sign$.}
|
|
FIPS~204 uses uniform-interval masking, not Gaussian masking (this is
|
|
the Dilithium variant, not the rounded-Gaussian variant of
|
|
Falcon-like schemes). To produce byte-equal FIPS~204 signatures,
|
|
Pulsar must produce a $z$ vector with the same distribution as
|
|
\texttt{ML-DSA.Sign}'s $z$ vector --- which means uniform-interval
|
|
masking. We do \emph{not} use the Gaussian sampler of FIPS~204 \S3.3
|
|
in the threshold $\Sign$ path. We \emph{do} use the centred binomial
|
|
for the DKG blinding randomness $\mathbf{r}$ inside Pedersen
|
|
commitments; this distribution choice is internal to the DKG and is
|
|
not visible in the output FIPS~204 signature.
|
|
|
|
\paragraph{Constant-time samplers.}
|
|
All samplers used in Pulsar must be constant-time in their inputs.
|
|
The FIPS~204 reference rejection samplers are constant-time provided
|
|
the bound check is performed with branchless arithmetic; this is
|
|
discussed further in \S\ref{sec:impl-ct}.
|
|
|
|
\subsection{Rejection sampling in FIPS~204}
|
|
\label{sec:prelim-rejection}
|
|
|
|
FIPS~204~\S6.1 specifies the rejection-with-restart structure of
|
|
ML-DSA signing. The signer samples a fresh $\mathbf{y}$ each
|
|
iteration, computes $\mathbf{w} = \mathbf{A}\mathbf{y}$, derives the
|
|
challenge $c$ from the high-bits of $\mathbf{w}$ and the message
|
|
hash $\mu$, computes the candidate response
|
|
$\mathbf{z} = \mathbf{y} + c \cdot \mathbf{s}_1$, and either accepts
|
|
or restarts depending on two norm checks: $\|\mathbf{z}\|_\infty$
|
|
must lie in the bounded interval
|
|
$[-\gamma_1 + \beta + 1, \gamma_1 - \beta - 1]$, and
|
|
$\|\LowBits(\mathbf{w} - c\mathbf{s}_2, 2\gamma_2)\|_\infty$ must lie
|
|
in $[-\gamma_2 + \beta + 1, \gamma_2 - \beta - 1]$. On a fail, the
|
|
signer restarts with a fresh $\mathbf{y}$.
|
|
|
|
This restart structure interacts subtly with threshold signing: each
|
|
restart consumes fresh masking randomness, but the per-party masking
|
|
randomness must be domain-separated across restarts so that an
|
|
attacker observing multiple restarts on the same $(\mathit{pk}, \mu)$
|
|
learns nothing more than from a single attempt. We address this in
|
|
\S\ref{sec:impl-rejection-restart}.
|
|
|
|
% =====================================================================
|
|
\section{Algorithms}
|
|
\label{sec:algorithms}
|
|
% =====================================================================
|
|
|
|
\subsection{Distributed key generation \texorpdfstring{$\DKG$}{DKG}}
|
|
\label{sec:dkg}
|
|
|
|
The DKG produces a group public key $\mathit{pk}$ that is a fresh
|
|
FIPS~204 ML-DSA public key together with per-party threshold shares
|
|
of the master 32-byte ML-DSA seed.
|
|
|
|
\paragraph{Two instantiation paths.}
|
|
Pulsar admits two protocol families that produce the same FIPS~204
|
|
output shape:
|
|
\begin{description}[leftmargin=*, itemsep=0pt]
|
|
\item[v0.2 target (Pedersen-VSS, this section).] A degree-$(t-1)$
|
|
Shamir polynomial over $\Rq^\ell$ with Pedersen polynomial commits
|
|
in $\Rq^k$. The aggregated commit $\mathbf{t}$ identifies with the
|
|
FIPS~204 public-key inner vector $\mathbf{A}\mathbf{s}_1 +
|
|
\mathbf{B}\mathbf{u}$, and the substitution $\mathbf{s}_2 =
|
|
\mathbf{B}\mathbf{u}$ is M-LWE-indistinguishable from a fresh
|
|
$\chi_\eta^k$ sample (\Cref{thm:outind}). No party ever reconstructs
|
|
the master secret. The security analysis (\S\ref{sec:security}) is
|
|
stated on this protocol.
|
|
\item[v0.1 reference (Path~A reconstruction aggregator).] A
|
|
byte-level instantiation realised by the reference Go code
|
|
(\texttt{ref/go/pkg/pulsar}, v0.2.0). Each party samples a 32-byte
|
|
contribution $c_i$, byte-wise Shamir-shares $c_i$ over $\GF(257)$ to
|
|
the committee, and ML-KEM-768-wraps each per-recipient envelope
|
|
against the recipient's long-term identity public key. Round~3
|
|
reconstructs the master seed $\sigma = \cSHAKE(\sum_i c_i \,\|\,
|
|
\mathit{root})$ in every committee member's memory and runs
|
|
\texttt{ML-DSA.KeyGen} verbatim on $\sigma$. Threshold sign
|
|
reconstructs $\sigma$ at sign time and runs \texttt{ML-DSA.Sign}
|
|
verbatim, which is what makes the byte-equality argument
|
|
(\Cref{thm:outind}) trivial under this path. The trust model is
|
|
documented in \S\ref{sec:knownlimits}.
|
|
\end{description}
|
|
The remainder of this subsection specifies the v0.2 protocol;
|
|
``v0.1 note'' paragraphs flag the deviations realised by the reference
|
|
implementation.
|
|
|
|
\paragraph{Setup (out of band).}
|
|
Before $\DKG$, all parties agree on the common public parameters
|
|
$(q, n_{\mathrm{ring}}, k, \ell, \eta, \tau, \gamma_1, \gamma_2, \omega, \beta, d, \lambda)$
|
|
matching the chosen FIPS~204 parameter set (one of $\{44, 65, 87\}$),
|
|
plus the threshold pair $(n, t)$ with $n \ge 2t-1$.
|
|
|
|
\paragraph{Setup: identity directory (v0.1 reference, CR-7 + CR-8
|
|
closure).}
|
|
Each party publishes a long-term identity public key
|
|
$\mathit{IPK}_i = (\mathit{KEMpk}_i, \mathit{DSApk}_i)$ pairing an
|
|
ML-KEM-768 encapsulation key with an ML-DSA-65 verification key,
|
|
typically anchored in the chain's validator-set record. Every party
|
|
constructs an $\textsc{IdentityDirectory}: \mathit{NodeID} \mapsto
|
|
\mathit{IPK}$ covering every committee member before DKG begins.
|
|
Round-1 envelopes are KEM-sealed against each recipient's
|
|
$\mathit{KEMpk}$; threshold-sign per-pair MAC keys are derived from
|
|
ephemeral ML-KEM-768 session secrets authenticated under the long-term
|
|
ML-DSA-65 keys (see \S\ref{sec:sign}).
|
|
|
|
\paragraph{Public matrices.}
|
|
$\mathbf{A} = \texttt{ExpandA}(\rho)$ from a public seed $\rho$
|
|
(typically the chain genesis seed bound to the validator-set epoch),
|
|
and $\mathbf{B}$ from the domain-separated derivation in
|
|
\S\ref{sec:prelim-pedersen}.
|
|
|
|
\paragraph{Round 1 (commit and deal).}
|
|
Each party $i \in \{1, \dots, n\}$:
|
|
\begin{enumerate}[leftmargin=*, itemsep=0pt]
|
|
\item Samples a degree-$(t-1)$ polynomial in $X$ over $\Rq^\ell$:
|
|
\[
|
|
f_i(X) = \mathbf{c}_{i,0} + \mathbf{c}_{i,1} X + \cdots + \mathbf{c}_{i,t-1} X^{t-1},
|
|
\]
|
|
with $\mathbf{c}_{i,k} \gets \chi_\eta^\ell$ for each $k$. ($\mathbf{c}_{i,0}$ is party $i$'s contribution to the master secret $\mathbf{s}_1$.)
|
|
\item Samples a degree-$(t-1)$ polynomial in $X$ over $\Rq^\ell$:
|
|
\[
|
|
g_i(X) = \mathbf{r}_{i,0} + \mathbf{r}_{i,1} X + \cdots + \mathbf{r}_{i,t-1} X^{t-1},
|
|
\]
|
|
with $\mathbf{r}_{i,k} \gets \chi_\eta^\ell$ for each $k$.
|
|
\item Computes the Pedersen commitment to each coefficient pair:
|
|
\[
|
|
\mathbf{C}_{i,k} = \mathbf{A} \cdot \mathbf{c}_{i,k} + \mathbf{B} \cdot \mathbf{r}_{i,k}
|
|
\in \Rq^k, \quad k \in \{0, 1, \dots, t-1\}.
|
|
\]
|
|
\item Broadcasts $\{\mathbf{C}_{i,k}\}_{k=0}^{t-1}$ to all parties.
|
|
\item Privately sends $(\text{share}_{i \to j}, \text{blind}_{i \to j}) = (f_i(j), g_i(j))$ to each party $j \ne i$ over an authenticated point-to-point channel.
|
|
\end{enumerate}
|
|
|
|
\paragraph{Round 1.5 (cross-party commitment consistency).}
|
|
Each party broadcasts the commit digest
|
|
\[
|
|
H_i = \cSHAKE(\,\text{empty},\,256,\,\text{`Pulsar'},\,
|
|
\text{`PULSAR-DKG-COMMIT-V1'}\,||\,\mathit{encode}(\{\mathbf{C}_{i,k}\}_{k=0}^{t-1})\,).
|
|
\]
|
|
Parties compare digests received from every sender across the cohort.
|
|
Mismatch $\Rightarrow$ equivocation: the sender broadcast distinct
|
|
commitment vectors to distinct recipients. A signed
|
|
\textsc{ComplaintEquivocation} disqualifies the sender. This step is
|
|
load-bearing for identifiable abort.
|
|
|
|
\paragraph{Round 2 (verification and aggregation).}
|
|
Each party $j$ verifies, for every sender $i$:
|
|
\[
|
|
\mathbf{A} \cdot f_i(j) + \mathbf{B} \cdot g_i(j) \;\stackrel{?}{=}\;
|
|
\sum_{k=0}^{t-1} j^k \cdot \mathbf{C}_{i,k} \pmod q.
|
|
\]
|
|
The check is exact (both sides are $\Zq$-linear) and is performed
|
|
with a constant-time module-level comparison (no early exit on the
|
|
first mismatched coefficient slot --- see
|
|
\S\ref{sec:impl-ct}). Mismatch $\Rightarrow$ a signed
|
|
\textsc{ComplaintBadDelivery} naming sender $i$ and carrying the
|
|
(share, blind, commits) as evidence.
|
|
|
|
On success, party $j$ aggregates:
|
|
\[
|
|
\mathbf{s}_j = \sum_{i=1}^n f_i(j), \qquad
|
|
\mathbf{u}_j = \sum_{i=1}^n g_i(j), \qquad
|
|
\mathbf{t} = \sum_{i=1}^n \mathbf{C}_{i,0}.
|
|
\]
|
|
$\mathbf{s}_j$ and $\mathbf{u}_j$ are party $j$'s share of $\mathbf{s}_1$
|
|
and the Pedersen blinding $\mathbf{u}$, respectively. The aggregated
|
|
Pedersen commitment $\mathbf{t} \in \Rq^k$ identifies with the FIPS~204
|
|
public-key inner vector by construction:
|
|
\[
|
|
\mathbf{t} = \mathbf{A} \cdot \mathbf{s}_1 + \mathbf{B} \cdot \mathbf{u}
|
|
\;\equiv_{\mathrm{dist}}\;
|
|
\mathbf{A} \cdot \mathbf{s}_1 + \mathbf{s}_2,
|
|
\]
|
|
where the substitution $\mathbf{s}_2 = \mathbf{B}\mathbf{u}$ is
|
|
computationally indistinguishable from a fresh
|
|
$\chi_\eta^k$ sample under $\MLWE_{q,k,\ell,\eta}$ in $\mathbf{B}$
|
|
(\Cref{thm:outind}).
|
|
|
|
\paragraph{Output: FIPS~204-shaped $\mathit{pk}$.}
|
|
The group public key follows the FIPS~204 layout
|
|
(FIPS~204~\S5.1, Algorithm~5):
|
|
\[
|
|
\mathit{pk} = \bigl(\rho,\,\mathbf{t}_1\bigr), \qquad
|
|
(\mathbf{t}_1, \mathbf{t}_0) = \Power(\mathbf{t}, d).
|
|
\]
|
|
The high-bits component $\mathbf{t}_1$ is in $\mathit{pk}$; the low-bits
|
|
$\mathbf{t}_0$ is required by every signer at Round-2 aggregation
|
|
(Algorithm~\ref{alg:sign-agg} line~3 uses it in the FIPS~204 hint
|
|
formula) and is therefore stored alongside the aggregated public key
|
|
by every party. $\mathbf{t}_0$ does \emph{not} leak the secret
|
|
$\mathbf{s}_1$: it is the low-bits of a uniform-modulus quantity and
|
|
behaves as a public protocol parameter.
|
|
|
|
The aggregated Pedersen blinding $\mathbf{u} = \sum_i \mathbf{r}_{i,0}$
|
|
is reconstructable by any threshold quorum via Lagrange interpolation
|
|
on the $\{\mathbf{u}_j\}_{j \in T}$. In the strict FIPS~204 layout
|
|
$\mathbf{s}_2$ is part of the private signing key; in Pulsar
|
|
$\mathbf{u}$ is Shamir-shared with the same threshold structure as
|
|
$\mathbf{s}_1$.
|
|
|
|
\begin{remark}[$\mathbf{s}_2$ as derived quantity]
|
|
The FIPS~204 specification treats $\mathbf{s}_1$ and $\mathbf{s}_2$
|
|
as independent samples from $\chi_\eta$ (FIPS~204~\S5.1). Pulsar's
|
|
construction derives $\mathbf{s}_2$ from the Pedersen blinding
|
|
$\mathbf{u}$ via the structural identity
|
|
$\mathbf{s}_2 = \mathbf{B} \cdot \mathbf{u}$. Because $\mathbf{B}$ is
|
|
uniformly distributed and $\mathbf{u}$ is from $\chi_\eta^\ell$,
|
|
$\mathbf{s}_2$ is computationally indistinguishable from a fresh
|
|
$\chi_\eta^k$ sample under $\MLWE_{q, k, \ell, \eta}$; this is the
|
|
content of the output-indistinguishability theorem
|
|
(\Cref{thm:outind} below).
|
|
\end{remark}
|
|
|
|
\paragraph{Identifiable abort.}
|
|
Round~1.5 and Round~2 each produce signed complaint records as a
|
|
side-effect of detected deviations. The signing key is the party's
|
|
long-term FIPS~204 ML-DSA-65 identity key
|
|
(\S\ref{sec:identity} \texttt{IdentityKey}; CR-6 closure since
|
|
v1.0.6). Complaint aggregation rules are specified per the system
|
|
model (\S\ref{sec:system-model}).
|
|
|
|
\subsection{Threshold signing \texorpdfstring{$\Sign$}{Sign}}
|
|
\label{sec:sign}
|
|
|
|
The threshold $\Sign$ protocol takes:
|
|
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item the group public key $\mathit{pk}$,
|
|
\item the quorum $T \subseteq \{1, \dots, n\}$ with $|T| = t$,
|
|
\item per-party shares $\{(\mathbf{s}_i, \mathbf{u}_i)\}_{i \in T}$,
|
|
\item a message $\mu$ (after FIPS~204 message hash binding $\mathrm{tr}$),
|
|
\item a session id $\mathit{sid}$ unique per signature attempt,
|
|
\end{itemize}
|
|
|
|
and produces a FIPS~204 ML-DSA signature
|
|
$\sigma = (\tilde c, \mathbf{z}, \mathbf{h})$.
|
|
|
|
The protocol runs in two rounds plus a possibly-iterated rejection-restart
|
|
outer loop. The inner rejection-restart loop is parameterised by an
|
|
attempt counter $\kappa$; each new attempt advances $\kappa$ and
|
|
re-domain-separates all sampler PRNG seeds (see
|
|
\S\ref{sec:impl-rejection-restart}).
|
|
|
|
\begin{algorithm}[H]
|
|
\caption{$\Sign$ Round~1 (party $i$, attempt $\kappa$)}
|
|
\label{alg:sign-r1}
|
|
\begin{algorithmic}[1]
|
|
\State \textbf{Input:} $\mathit{pk}$, $\mathit{sid}$, $\kappa$, share $\mathbf{s}_i$,
|
|
quorum $T$, party-pair PRF keys $\{K_{i,j}\}_{j \in T \setminus \{i\}}$,
|
|
message hash $\mu$.
|
|
\State $\tau_1 \gets (\mathit{sid}, \kappa, T, i, \mathit{pk}, \mu)$
|
|
\Comment{Round-1 transcript binding}
|
|
\State $\text{seed}_i \gets \KMAC(K_i^{\mathrm{prng}},\,\tau_1,\,256,\,\text{`PULSAR-SIGN-PRNG-V1'})$
|
|
\Comment{Per-round PRNG seed (\S\ref{sec:impl-rejection-restart})}
|
|
\State Sample $\mathbf{y}_i \gets U_{\gamma_1}^\ell$ from the PRNG keyed by $\text{seed}_i$
|
|
\State Compute commit $\mathbf{w}_i = \mathbf{A} \mathbf{y}_i \in \Rq^k$
|
|
\State Compute high-bits commit $\bar{\mathbf{w}}_i = \HighBits(\mathbf{w}_i,\,2\gamma_2)$
|
|
\State Compute commit digest $D_i = \cSHAKE(\bar{\mathbf{w}}_i,\,256,\,\text{`Pulsar'},\,\text{`PULSAR-SIGN-R1-V1'} \| \tau_1)$
|
|
\State \textbf{For each} $j \in T \setminus \{i\}$ \textbf{do}
|
|
$\;\mathrm{MAC}_{i \to j} \gets \KMAC(K_{i,j},\,D_i \| \tau_1,\,256,\,\text{`PULSAR-SIGN-R1-MAC-V1'})$
|
|
\State \textbf{Broadcast:} $(D_i, \{\mathrm{MAC}_{i \to j}\}_{j \in T \setminus \{i\}})$
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
|
|
\begin{algorithm}[H]
|
|
\caption{$\Sign$ Round~2 (party $i$, attempt $\kappa$)}
|
|
\label{alg:sign-r2}
|
|
\begin{algorithmic}[1]
|
|
\State \textbf{Input:} the received $\{D_j\}_{j \in T}$ and corresponding MACs, plus all Round-1 state from party $i$.
|
|
\State Verify every MAC received from each $j$ against the locally-known $K_{i,j}$. Abort with $\textsc{ComplaintMACFailure}(j)$ on mismatch.
|
|
\State Compute the aggregated commit hash $\bar D = \cSHAKE(\text{empty},\,256,\,\text{`Pulsar'},\,\text{`PULSAR-SIGN-R2-V1'} \,\|\, D_1 \| D_2 \| \cdots \| D_n)$
|
|
\State Recover the aggregated $\bar{\mathbf{w}} = \HighBits(\sum_{j \in T} \mathbf{w}_j,\,2\gamma_2)$ by summing per-party Round-1 commits (each party transmits its raw $\bar{\mathbf{w}}_i$ alongside the commit digest in Round~2 for verification --- the digest's role is binding under MAC, not concealment).
|
|
\State Compute the FIPS~204 challenge $\tilde c \gets \SHAKE(\mu \,\|\, \bar{\mathbf{w}},\,2\lambda)$ and expand to $c \in \Rq$ via $c = \texttt{SampleInBall}(\tilde c)$.
|
|
\State Compute the Lagrange coefficient $\lambda_i^T \in \Zq$ for party $i$ in the quorum $T$.
|
|
\State Compute party $i$'s response contribution:
|
|
$\mathbf{z}_i = \mathbf{y}_i + c \cdot \lambda_i^T \cdot \mathbf{s}_i \pmod q$
|
|
\State Compute party $i$'s low-bits contribution to the hint vector:
|
|
$\mathbf{r}_i = c \cdot \lambda_i^T \cdot \mathbf{u}_i$ \Comment{used in $\mathbf{h}$ computation by the aggregator}
|
|
\State \textbf{Broadcast:} $(\bar{\mathbf{w}}_i, \mathbf{z}_i, \mathbf{r}_i)$ alongside an integrity hash bound to the Round-2 transcript.
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
|
|
\begin{algorithm}[H]
|
|
\caption{$\Sign$ Aggregation and rejection (any honest party in $T$)}
|
|
\label{alg:sign-agg}
|
|
\begin{algorithmic}[1]
|
|
\State Compute aggregate $\mathbf{z} = \sum_{j \in T} \mathbf{z}_j$ and aggregate $c\mathbf{s}_2 = \sum_{j \in T} \mathbf{r}_j$. By Lagrange linearity, $c\mathbf{s}_2 = c \cdot \mathbf{B}\mathbf{u}$ where $\mathbf{u} = \sum_{j} \lambda_j^T \mathbf{u}_j$ is the master Pedersen blinding (\S\ref{sec:dkg}).
|
|
\State Compute the FIPS~204 high-bits delta: let $\mathbf{w} = \sum_{j \in T} \mathbf{w}_j$ and $\mathbf{w}' = \mathbf{w} - c\mathbf{s}_2$.
|
|
\State Compute the candidate hint $\mathbf{h} = \MakeHint(-\langle c\mathbf{t}_0 \rangle,\,\mathbf{w}' + \langle c\mathbf{t}_0 \rangle,\,2\gamma_2)$ following FIPS~204~\S6.1 line 16, where $\mathbf{t}_0$ is the low-bits component of the public Pedersen-recovered commit (carried in $\mathit{pk}$'s private companion held by every party).
|
|
\State Compute the FIPS~204 rejection-check predicates (FIPS~204~\S6.1.1):
|
|
\State \quad $R_1$: $\|\mathbf{z}\|_\infty \stackrel{?}{<} \gamma_1 - \beta$
|
|
\State \quad $R_2$: $\|\LowBits(\mathbf{w}',\,2\gamma_2)\|_\infty \stackrel{?}{<} \gamma_2 - \beta$
|
|
\State \quad $R_3$: $\|\langle c\mathbf{t}_0\rangle\|_\infty \stackrel{?}{<} \gamma_2$
|
|
\State \quad $R_4$: $|\mathbf{h}|_{\mathrm{count}} \stackrel{?}{\le} \omega$
|
|
\State Compute the combined accept bit $\mathrm{accept} = R_1 \wedge R_2 \wedge R_3 \wedge R_4$, evaluating all $R_i$ unconditionally (constant-time, \S\ref{sec:impl-ct}).
|
|
\If{$\neg\mathrm{accept}$}
|
|
\State Restart: increment $\kappa$ and re-run from Round~1 with new PRNG seeds (\S\ref{sec:impl-rejection-restart}). \textbf{Crucially}: no per-round state is preserved across the restart boundary other than $(\mathit{sid}, \kappa, \mathit{pk}, \mu, T)$ and the long-term shares.
|
|
\Else
|
|
\State Output $\sigma = (\tilde c, \mathbf{z}, \mathbf{h})$.
|
|
\EndIf
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
|
|
\begin{theorem}[Correctness of $\Sign$]
|
|
\label{thm:sign-correct}
|
|
If all parties in $T$ are honest and the rejection conditions
|
|
accept, then the aggregated $\sigma = (\tilde c, \mathbf{z}, \mathbf{h})$
|
|
satisfies $\texttt{ML-DSA.Verify}(\mathit{pk}, \mu, \sigma) = \mathit{accept}$.
|
|
\end{theorem}
|
|
|
|
\begin{proof}
|
|
By Lagrange-interpolation linearity:
|
|
\[
|
|
\mathbf{z}
|
|
= \sum_{j \in T} \bigl(\mathbf{y}_j + c \cdot \lambda_j^T \cdot \mathbf{s}_j\bigr)
|
|
= \mathbf{y} + c \cdot \mathbf{s}_1
|
|
\]
|
|
where $\mathbf{y} = \sum_{j \in T} \mathbf{y}_j$ is the aggregate
|
|
mask (distributed as uniform interval over the per-coordinate sum,
|
|
and within the FIPS~204 acceptance interval by the rejection
|
|
check) and $\sum_{j \in T} \lambda_j^T \mathbf{s}_j = \mathbf{s}_1$
|
|
by Lagrange interpolation at $X = 0$. This is exactly the FIPS~204
|
|
single-signer $\mathbf{z}$. The challenge $\tilde c$ is the
|
|
FIPS~204 challenge computed on the same
|
|
$(\mu, \HighBits(\mathbf{A}\mathbf{y}, 2\gamma_2))$ input. The hint
|
|
$\mathbf{h}$ is the FIPS~204 hint computed against the same
|
|
$(\mathbf{w}, c\mathbf{s}_2, 2\gamma_2)$ inputs. Therefore the triple
|
|
$(\tilde c, \mathbf{z}, \mathbf{h})$ is identical to what
|
|
single-signer FIPS~204 would output on the same
|
|
$(\mathit{pk}, \mu, \mathbf{y})$. Verification follows from FIPS~204's
|
|
correctness. \qed
|
|
\end{proof}
|
|
|
|
\begin{remark}[Round-1 commit-digest binding]
|
|
The Round-1 commit digest $D_i$ is bound under MAC, not concealment:
|
|
its purpose is to commit each party to its
|
|
$\bar{\mathbf{w}}_i$ before learning the challenge $c$. The
|
|
plaintext $\bar{\mathbf{w}}_i$ is transmitted in Round~2 alongside
|
|
the response; recipients re-derive $D_i$ from the received plaintext
|
|
and check equality. This is the standard MAC-and-commit pattern
|
|
inherited from Pulsar's $\Sign$ in \texttt{pulsar/sign/sign.go}.
|
|
\end{remark}
|
|
|
|
\subsection{Verification \texorpdfstring{$\Verify$}{Verify}}
|
|
\label{sec:verify}
|
|
|
|
$\Verify$ is \texttt{ML-DSA.Verify} from FIPS~204~\S6.3, verbatim. No
|
|
threshold-specific changes; no per-threshold extension fields; no
|
|
side parameters. We quote FIPS~204 for completeness:
|
|
|
|
\begin{algorithm}[H]
|
|
\caption{$\Verify$ (\texttt{ML-DSA.Verify} per FIPS~204 \S6.3)}
|
|
\label{alg:verify}
|
|
\begin{algorithmic}[1]
|
|
\State \textbf{Input:} $\mathit{pk} = (\rho, \mathbf{t}_1)$, message $\mu$, signature $\sigma = (\tilde c, \mathbf{z}, \mathbf{h})$.
|
|
\State $\mathbf{A} \gets \texttt{ExpandA}(\rho)$
|
|
\State $\mu' \gets \SHAKE(\mathrm{tr} \| \mu, 512)$ where $\mathrm{tr}$ is the FIPS~204 public-key fingerprint
|
|
\State $c \gets \texttt{SampleInBall}(\tilde c)$
|
|
\State $\mathbf{w}' \gets \UseHint(\mathbf{h},\,\mathbf{A}\mathbf{z} - c \cdot 2^d \mathbf{t}_1,\,2\gamma_2)$
|
|
\State $\tilde c' \gets \SHAKE(\mu' \| \mathbf{w}', 2\lambda)$
|
|
\State \textbf{Output:}
|
|
$\mathit{accept}$ iff
|
|
$\|\mathbf{z}\|_\infty < \gamma_1 - \beta$
|
|
and
|
|
$\tilde c = \tilde c'$
|
|
and
|
|
$|\mathbf{h}|_{\mathrm{count}} \le \omega$.
|
|
\end{algorithmic}
|
|
\end{algorithm}
|
|
|
|
Note that line 3's $\mu'$ definition --- the public-key fingerprint
|
|
prefixing --- is exactly the FIPS~204 binding. Pulsar's $\Sign$
|
|
must compute its challenge over the \emph{same} $\mu'$ for the
|
|
verifier to accept; this is the $\mu$ used in
|
|
Algorithm~\ref{alg:sign-r2} step 5.
|
|
|
|
This is the entire Class~N point: any FIPS-validated ML-DSA
|
|
verifier (BoringSSL FIPS, AWS-LC, OpenSSL~3, liboqs) consumes
|
|
Pulsar signatures without modification.
|
|
|
|
\subsection{Proactive resharing \texorpdfstring{$\Reshare$}{Reshare}}
|
|
\label{sec:reshare}
|
|
|
|
$\Reshare$ rotates the share distribution from an old committee
|
|
$\mathcal{O}$ with threshold $t_{\mathrm{old}}$ to a new committee
|
|
$\mathcal{N}$ with threshold $t_{\mathrm{new}}$ without (i) reconstructing
|
|
the master secret $\mathbf{s}_1$ in any party's memory, and (ii)
|
|
changing the public key $\mathit{pk}$. The construction is HJKY97-style
|
|
(\cite{hjky97}) lifted to $\Rq^k$.
|
|
|
|
\paragraph{Beacon-randomised quorum selection (DD-006).}
|
|
A na\"ive deterministic quorum selection (e.g.\ smallest-ID
|
|
$t_{\mathrm{old}}$ subset of $\mathcal{O}$) lets a mobile adversary
|
|
\emph{game} the corrupt-set positioning: the adversary, knowing in
|
|
advance which parties will be quorum members at each reshare, can
|
|
schedule its $t-1$ corruption budget to maximally cover the quorum.
|
|
The HIP-0077 red-review finding F10 made this concrete for Pulsar's
|
|
reshare layer. Pulsar mitigates by deriving the quorum from the
|
|
chain's randomness beacon $\beta_e$ for epoch $e$:
|
|
\[
|
|
\mathcal{Q}_e
|
|
\;=\;
|
|
\bigl\{\text{the } t_{\mathrm{old}} \text{ smallest-ID members of }
|
|
\mathcal{O}\text{ in the permutation induced by }
|
|
\cSHAKE(\beta_e, 256\cdot|\mathcal{O}|, \text{`Pulsar'},
|
|
\text{`PULSAR-RESHARE-BEACON-V1'})\bigr\}.
|
|
\]
|
|
The beacon $\beta_e$ must be unpredictable in advance to the
|
|
adversary; the Lux consensus randomness layer (Quasar) provides this
|
|
unpredictability. With an unbiasable beacon, the adversary's optimal
|
|
strategy reduces to randomly guessing which corrupted parties will be
|
|
selected, giving negligible advantage over uniform.
|
|
|
|
\paragraph{Protocol.}
|
|
\begin{enumerate}[leftmargin=*, itemsep=0pt]
|
|
\item Compute $\mathcal{Q}_e \subseteq \mathcal{O}$ as above with
|
|
$|\mathcal{Q}_e| = t_{\mathrm{old}}$.
|
|
\item Compute Lagrange coefficients $\lambda_i^{\mathcal{Q}_e}$ at
|
|
$X = 0$ for each $i \in \mathcal{Q}_e$.
|
|
\item Each $i \in \mathcal{Q}_e$ samples a degree-$(t_{\mathrm{new}} - 1)$
|
|
polynomial in $X$ over $\Rq^\ell$:
|
|
\[
|
|
g_i(X) = (\lambda_i^{\mathcal{Q}_e} \cdot \mathbf{s}_i) + \mathbf{r}_{i,1} X + \cdots + \mathbf{r}_{i, t_{\mathrm{new}}-1} X^{t_{\mathrm{new}}-1},
|
|
\]
|
|
with $\mathbf{r}_{i,d} \gets \Rq^\ell$ uniform for $d \ge 1$, and
|
|
similarly an independent polynomial $h_i(X)$ with constant term
|
|
$\lambda_i^{\mathcal{Q}_e} \mathbf{u}_i$ for the blinding share.
|
|
\item Each $i$ commits to $g_i, h_i$ via Pedersen commitments
|
|
$\mathbf{C}^g_{i,k}, \mathbf{C}^h_{i,k}$, broadcasts them, and
|
|
privately delivers $(g_i(j), h_i(j))$ to each $j \in \mathcal{N}$.
|
|
\item Each new party $j$ verifies, for every $i \in \mathcal{Q}_e$:
|
|
$\mathbf{A} g_i(j) + \mathbf{B} h_i(j) \stackrel{?}{=}
|
|
\sum_k j^k \mathbf{C}^g_{i,k} + \sum_k j^k \mathbf{C}^h_{i,k}$, with
|
|
the same constant-time module-level comparison as in
|
|
\S\ref{sec:dkg}.
|
|
\item Each $j$ aggregates
|
|
$\mathbf{s}'_j = \sum_{i \in \mathcal{Q}_e} g_i(j)$ and
|
|
$\mathbf{u}'_j = \sum_{i \in \mathcal{Q}_e} h_i(j)$.
|
|
\item All new parties produce an \textsc{ActivationCertificate}: a
|
|
threshold signature of the reshare transcript hash under the
|
|
\emph{unchanged} $\mathit{pk}$, proving the new committee is
|
|
operational. The chain accepts the new epoch only on activation
|
|
certificate verification.
|
|
\end{enumerate}
|
|
|
|
\begin{theorem}[Public-key invariance]
|
|
\label{thm:reshare-pkinv}
|
|
Let $\mathbf{s}'_j$ and $\mathbf{u}'_j$ be the shares produced by
|
|
$\Reshare$. For every threshold subset
|
|
$T' \subseteq \mathcal{N}$ with $|T'| = t_{\mathrm{new}}$,
|
|
\[
|
|
\sum_{j \in T'} \lambda_j^{T'} \mathbf{s}'_j = \mathbf{s}_1 \quad\text{and}\quad
|
|
\sum_{j \in T'} \lambda_j^{T'} \mathbf{u}'_j = \mathbf{u} \pmod q.
|
|
\]
|
|
Therefore $\mathit{pk}$ is invariant under $\Reshare$.
|
|
\end{theorem}
|
|
|
|
\begin{proof}
|
|
Define $G(X) = \sum_{i \in \mathcal{Q}_e} g_i(X)$. $G$ has degree at
|
|
most $t_{\mathrm{new}} - 1$ and constant term
|
|
\[
|
|
G(0) = \sum_{i \in \mathcal{Q}_e} g_i(0)
|
|
= \sum_{i \in \mathcal{Q}_e} \lambda_i^{\mathcal{Q}_e} \mathbf{s}_i
|
|
= \mathbf{s}_1,
|
|
\]
|
|
where the last equality is Lagrange interpolation over the old
|
|
quorum. The new shares are $\mathbf{s}'_j = G(j)$ for $j \in \mathcal{N}$,
|
|
so $\{\mathbf{s}'_j\}_{j \in \mathcal{N}}$ are valid Shamir shares of
|
|
$G(0) = \mathbf{s}_1$ with threshold $t_{\mathrm{new}}$. The same argument
|
|
applies to $\{\mathbf{u}'_j\}_{j \in \mathcal{N}}$. \qed
|
|
\end{proof}
|
|
|
|
\paragraph{Same-committee refresh.}
|
|
We also specify a $\Refresh$ primitive (HJKY97 zero-polynomial form)
|
|
for periodic mobile-adversary hygiene within a stable validator set.
|
|
$\Refresh$ is structurally identical to $\Reshare$ with the
|
|
substitution $g_i(0) = 0, h_i(0) = 0$ (zero constant term), the same
|
|
committee on both sides, and an updated activation certificate. Its
|
|
correctness and security arguments are direct corollaries of
|
|
\Cref{thm:reshare-pkinv} (every honest party's polynomial vanishes at
|
|
$X = 0$, so the master secret is preserved).
|
|
|
|
\subsection{Identifiable abort}
|
|
\label{sec:abort}
|
|
|
|
Every detected deviation in $\DKG$, $\Sign$, or $\Reshare$ produces
|
|
a signed complaint. A complaint is a tuple
|
|
$(\text{kind}, \text{accuser}, \text{accused}, \text{epoch}, \text{evidence})$
|
|
where:
|
|
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item \textsc{ComplaintEquivocation}: the accused party broadcast distinct commitment vectors to distinct recipients. Evidence: two commits and the signed broadcast from the accused.
|
|
\item \textsc{ComplaintBadDelivery}: the accused party's private share/blind to the accuser fails Pedersen verification. Evidence: (share, blind, commits) showing the verification fails.
|
|
\item \textsc{ComplaintMACFailure}: a MAC from the accused fails verification. Evidence: the failing MAC and the recipient's key.
|
|
\item \textsc{ComplaintRangeFailure}: the accused party's contribution would have caused the aggregated signature to fail the FIPS~204 norm check by an amount inconsistent with honest behaviour. Evidence: the per-party transcript line.
|
|
\end{itemize}
|
|
|
|
All complaints are signed under the accuser's long-term FIPS~204
|
|
ML-DSA-65 identity key (\texttt{IdentityKey} per
|
|
\S\ref{sec:identity}; CR-6 closure since v1.0.6). The system model's
|
|
slashing layer (\S\ref{sec:system-model}) consumes complaints; a
|
|
quorum of distinct accusers against the same accused is a
|
|
disqualification event.
|
|
|
|
% =====================================================================
|
|
\section{Security analysis}
|
|
\label{sec:security}
|
|
% =====================================================================
|
|
|
|
The formal game definitions are stated in the companion file
|
|
\texttt{spec/security-games.tex}, included below:
|
|
|
|
\input{security-games}
|
|
|
|
% =====================================================================
|
|
\section{Concrete parameters}
|
|
\label{sec:parameters}
|
|
% =====================================================================
|
|
|
|
\input{parameters}
|
|
|
|
% =====================================================================
|
|
\section{Encodings}
|
|
\label{sec:encodings}
|
|
% =====================================================================
|
|
|
|
This section specifies the \emph{structure} of every wire-level
|
|
message. Byte-level layouts (offsets, lengths, endianness) freeze at
|
|
the encoding-freeze gate (DD-008, end of August 2026). Until that
|
|
gate, the structural commitments below are normative; byte offsets
|
|
within them are not.
|
|
|
|
\paragraph{Common conventions.}
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item Every wire message starts with a fixed-length version tag:
|
|
$(\text{`PULSAR-1'}, \text{kind\_byte}, \text{epoch\_u32})$.
|
|
The tag width is pinned at the DD-008 encoding-freeze gate.
|
|
\item Lengths are big-endian unsigned. Length-prefixed for every
|
|
variable-size field.
|
|
\item Polynomials in $\Rq$ are encoded coefficient-by-coefficient
|
|
using the FIPS~204 byte-packing for the per-poly bit width (see
|
|
FIPS~204~\S7.1, \texttt{bitlen}). Pulsar re-uses the FIPS~204
|
|
packings verbatim for $\mathbf{s}_1, \mathbf{s}_2, \mathbf{z}, \mathbf{w}$.
|
|
\item Module vectors are encoded as their entries concatenated in
|
|
order. Module matrices are encoded row-major.
|
|
\item All multi-party transcripts include the
|
|
$(\mathit{pk}, \text{epoch}, \mathit{sid}, T)$ tuple as a
|
|
prefix before the message body, bound under a $\cSHAKE$ transcript
|
|
hash with the appropriate customisation tag.
|
|
\end{itemize}
|
|
|
|
\paragraph{$\DKG$ Round-1 message.}
|
|
\(\{\mathbf{C}_{i,k}\}_{k=0}^{t-1}\) followed by the per-recipient
|
|
private channel envelope containing $(f_i(j), g_i(j))$ for each
|
|
$j \ne i$. The broadcast portion (commits) is length-pinned because
|
|
$t$ and the module shape are known at the start of the protocol.
|
|
|
|
\paragraph{$\DKG$ Round-1.5 broadcast.}
|
|
$(i, H_i)$ where $H_i$ is the 32-byte commit digest.
|
|
|
|
\paragraph{$\DKG$ Round-2 message.}
|
|
$(i, \mathbf{s}_i^{\mathrm{aggregated}}, \mathbf{u}_i^{\mathrm{aggregated}})$
|
|
\emph{never appears on the wire}: aggregation is local. The Round-2
|
|
artifact is a per-party acceptance signature on the aggregated
|
|
$(\mathbf{t}, \mathit{pk})$ value, signed under the party's long-term
|
|
identity key.
|
|
|
|
\paragraph{$\Sign$ Round-1 broadcast.}
|
|
$(\mathit{sid}, \kappa, i, D_i, \{\mathrm{MAC}_{i \to j}\}_{j \in T \setminus \{i\}})$.
|
|
|
|
\paragraph{$\Sign$ Round-2 broadcast.}
|
|
$(\mathit{sid}, \kappa, i, \bar{\mathbf{w}}_i, \mathbf{z}_i, \mathbf{r}_i, \text{Round2integrity})$.
|
|
|
|
\paragraph{$\Sign$ output (final signature).}
|
|
The FIPS~204 ML-DSA signature triple $(\tilde c, \mathbf{z}, \mathbf{h})$,
|
|
encoded \emph{exactly} per FIPS~204~\S7.2. \textbf{No Pulsar envelope.}
|
|
|
|
\paragraph{$\Reshare$ messages.}
|
|
Structurally identical to $\DKG$ except the commit constant terms
|
|
are $\lambda_i^{\mathcal{Q}_e} \mathbf{s}_i$ rather than fresh; and the
|
|
broadcast carries the beacon $\beta_e$ to bind the quorum choice.
|
|
|
|
\paragraph{Complaint records.}
|
|
$(\text{kind}\,\text{u8},\,\text{accuser}\,\text{u32},\,\text{accused}\,\text{u32},\,\text{epoch}\,\text{u32},\,\text{evidence-blob}\,\text{var},\,\text{signature}\,\text{64B})$.
|
|
Length-pinned per kind.
|
|
|
|
\paragraph{Activation certificate.}
|
|
A FIPS~204 ML-DSA signature on the reshare transcript hash under the
|
|
unchanged $\mathit{pk}$. The hash is bound under the
|
|
\texttt{PULSAR-RESHARE-TRANSCRIPT-V1} customisation tag.
|
|
|
|
\paragraph{Open at freeze.}
|
|
Outstanding decisions for the encoding freeze:
|
|
(i) the exact version tag layout for cross-implementation feature
|
|
gating,
|
|
(ii) the exact embedding of $\bar{\mathbf{w}}_i$ in the Round-2
|
|
broadcast (compressed vs.\ uncompressed FIPS~204
|
|
\texttt{w1Encode}),
|
|
(iii) the byte layout of the per-party MAC bundle (sparse vs.\
|
|
dense indexing),
|
|
(iv) the exact ordering and field widths for complaint evidence blobs.
|
|
|
|
% =====================================================================
|
|
\section{System model}
|
|
\label{sec:system-model}
|
|
% =====================================================================
|
|
|
|
\input{system-model}
|
|
|
|
% =====================================================================
|
|
\section{Implementation considerations}
|
|
\label{sec:impl}
|
|
% =====================================================================
|
|
|
|
\subsection{Constant-time signing}
|
|
\label{sec:impl-ct}
|
|
|
|
All secret-dependent comparisons MUST be constant-time. In
|
|
particular:
|
|
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item Pedersen-identity verification (\S\ref{sec:dkg} Round~2 and
|
|
\S\ref{sec:reshare}) compares full module vectors in $\Rq^k$. The
|
|
comparison MUST iterate over every coefficient slot of every entry
|
|
unconditionally and reduce the per-slot equality bit into a single
|
|
accumulator (e.g.\ \texttt{subtle.ConstantTimeCompare} over a
|
|
serialised view, as in
|
|
\texttt{pulsar/dkg2/dkg2.go: constTimePolyEqual}).
|
|
\item FIPS~204 norm checks ($\|\mathbf{z}\|_\infty < \gamma_1 - \beta$
|
|
etc.) MUST be performed with branchless arithmetic. The
|
|
\texttt{pulsar/sign/sign.go: CheckL2Norm} implementation is the
|
|
reference (modulo Pulsar's switch from L2 norm to L-infty per
|
|
FIPS~204).
|
|
\item Rejection-restart MUST NOT short-circuit on the first failing
|
|
norm: all norms are evaluated, then the accept/restart decision is
|
|
made from the accumulated result. This prevents timing leakage of
|
|
\emph{which} bound failed.
|
|
\item No \texttt{log.*}, \texttt{fmt.Print*}, or panic in any
|
|
secret-touching function (DD-007). The Pulsar reference's
|
|
pre-fix \texttt{log.Println(Bsquare, sumSquares)} (HIP-0077 F8) is
|
|
exactly the failure mode this rule prevents; the Pulsar reference
|
|
implementation will be CI-gated against any logging call inside
|
|
\texttt{ref/go/sign/}, \texttt{ref/go/dkg/}, \texttt{ref/go/reshare/}.
|
|
\end{itemize}
|
|
|
|
\subsection{Rejection-sampling restart without secret leakage}
|
|
\label{sec:impl-rejection-restart}
|
|
|
|
This is the hardest cryptographic engineering problem in Pulsar.
|
|
FIPS~204 ML-DSA's rejection-with-restart structure (\S\ref{sec:prelim-rejection})
|
|
interacts with threshold signing in three load-bearing places.
|
|
|
|
\paragraph{The threat.}
|
|
A na\"ive port of Pulsar's Round-1 PRNG keying would seed party
|
|
$i$'s PRNG from the secret share $\mathbf{s}_i$ alone:
|
|
\(
|
|
\text{seed}_i \gets \text{Hash}(\mathbf{s}_i)
|
|
\).
|
|
Two distinct sign attempts with the same $(\mathit{pk}, \mu)$ would
|
|
then sample byte-identical $\mathbf{y}_i$ values, and an attacker
|
|
who saw the resulting $\mathbf{z}$ values from two attempts could
|
|
compute
|
|
\[
|
|
\mathbf{z}^{(1)} - \mathbf{z}^{(2)} = c^{(1)} \mathbf{s}_1 - c^{(2)} \mathbf{s}_1
|
|
= (c^{(1)} - c^{(2)}) \mathbf{s}_1,
|
|
\]
|
|
and \emph{recover the secret} by dividing by the (low-norm,
|
|
small-coefficient) difference $c^{(1)} - c^{(2)}$ over $\Rq$. This is
|
|
the CRIT-1 vulnerability flagged in Pulsar's pre-fix code
|
|
(\texttt{pulsar/primitives/hash.go: PRNGKey}) and addressed
|
|
2026-05-03 in coordination with the C++ port at
|
|
\texttt{luxcpp/crypto}. The fix is the
|
|
\texttt{PRNGKeyForRound} function: the PRNG seed mixes
|
|
$(\mathbf{s}_i, \mathit{sid})$ so distinct sessions get distinct
|
|
seeds.
|
|
|
|
\paragraph{The Pulsar domain separation.}
|
|
Pulsar extends the Pulsar fix to handle three orthogonal
|
|
domains:
|
|
|
|
\begin{enumerate}[leftmargin=*, itemsep=0pt]
|
|
\item \textbf{Across signatures} (distinct $\mathit{sid}$). Each
|
|
sign attempt gets a fresh $\mathit{sid}$, monotonically advanced
|
|
by the protocol layer above (Lux consensus uses the block height
|
|
plus the within-block signature index as $\mathit{sid}$).
|
|
\item \textbf{Across rejection-restart attempts within one
|
|
$\mathit{sid}$} (distinct $\kappa$). Each restart advances the
|
|
attempt counter. The per-attempt PRNG seed is derived as:
|
|
\[
|
|
\text{seed}_i^{(\kappa)} \;=\;
|
|
\KMAC(\,K_i^{\mathrm{prng}},\,
|
|
(\mathit{sid}, \kappa, T, i, \mathit{pk}, \mu),\,
|
|
256,\,
|
|
\text{`PULSAR-SIGN-PRNG-V1'}\,),
|
|
\]
|
|
where $K_i^{\mathrm{prng}}$ is a per-party PRNG key derived at DKG
|
|
time from $\mathbf{s}_i$ via $\cSHAKE$ with the customisation tag
|
|
\texttt{`PULSAR-SIGN-PRNGKEY-V1'}. Both $\mathit{sid}$ and $\kappa$
|
|
are bound into the seed.
|
|
\item \textbf{Across quorums on the same $\mathit{sid}$} (distinct
|
|
$T$). If two distinct quorums coordinate on the same $\mathit{sid}$
|
|
(e.g.\ a network split followed by reconciliation), the seed must
|
|
diverge so that the two attempts use independent masks. The
|
|
quorum set $T$ is bound into the seed as above.
|
|
\end{enumerate}
|
|
|
|
\paragraph{Cross-restart state.}
|
|
Across a rejection-sampling restart boundary, only the following
|
|
state is preserved:
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item the long-term shares $(\mathbf{s}_i, \mathbf{u}_i, K_i^{\mathrm{prng}}, \{K_{i,j}\})$,
|
|
\item the public coordination state $(\mathit{sid}, \mathit{pk}, T, \mu)$,
|
|
\item the attempt counter $\kappa$.
|
|
\end{itemize}
|
|
\textbf{Everything else} is recomputed: PRNG seeds, masks
|
|
$\mathbf{y}_i$, commits $\mathbf{w}_i$, MACs, per-party response
|
|
contributions $(\mathbf{z}_i, \mathbf{r}_i)$. There is no
|
|
``cached'' per-round value that crosses the boundary. This
|
|
discipline is the cryptographic justification for the next theorem.
|
|
|
|
\begin{theorem}[Restart non-leakage]
|
|
\label{thm:restart-non-leak}
|
|
Let $\mathcal{A}$ be an adversary that observes a transcript of $K$
|
|
rejection-sampling attempts on the same $(\mathit{pk}, \mu, T)$
|
|
(distinct $\kappa = 1, \dots, K$) and outputs a guess
|
|
$\hat{\mathbf{s}}_i$ for some honest party $i \in T \setminus
|
|
\mathrm{corrupt}$. Under the assumption that $\KMAC$ is a PRF in its
|
|
key, $\mathcal{A}$'s advantage in recovering $\mathbf{s}_i$ from $K$
|
|
attempts is at most $K \cdot \Adv^{\mathrm{prf}}_{\KMAC}(\mathcal{B})$
|
|
plus the single-attempt advantage:
|
|
\[
|
|
\Pr[\mathcal{A}(\mathrm{transcript}_{1..K}) = \mathbf{s}_i]
|
|
\;\le\;
|
|
K \cdot \Adv^{\mathrm{prf}}_{\KMAC}(\mathcal{B})
|
|
+ \Pr[\mathcal{A}'(\mathrm{transcript}_{1}) = \mathbf{s}_i],
|
|
\]
|
|
for some efficient $\mathcal{B}$ and an equally-capable
|
|
$\mathcal{A}'$ restricted to a single transcript.
|
|
\end{theorem}
|
|
|
|
\begin{proof}[Proof sketch]
|
|
The PRF assumption on $\KMAC$ implies that
|
|
$\{\text{seed}_i^{(\kappa)}\}_{\kappa=1}^K$ is computationally
|
|
indistinguishable from $K$ independent uniform samples in
|
|
$\{0,1\}^{256}$, with distinguishing advantage at most
|
|
$\Adv^{\mathrm{prf}}_{\KMAC}(\mathcal{B})$ per call (i.e.\
|
|
total $\le K \cdot \Adv^{\mathrm{prf}}_{\KMAC}(\mathcal{B})$ by a
|
|
standard hybrid). Once we condition on $K$ independent seeds, the
|
|
$K$ masks $\{\mathbf{y}_i^{(\kappa)}\}_{\kappa=1}^K$ are independent
|
|
uniform-interval samples, and the $K$ responses
|
|
$\{\mathbf{z}_i^{(\kappa)}\}$ are $K$ independent functions of
|
|
$\mathbf{s}_i$ each with the same distribution as a single
|
|
honest-party response. The adversary thus gains no more information
|
|
than from $K$ \emph{independently sampled} signatures, which is the
|
|
same as from a single signature plus $K-1$ ``free'' instances under
|
|
M-LWE. The single-attempt advantage bound completes the
|
|
inequality. \qed
|
|
\end{proof}
|
|
|
|
\begin{remark}[Stronger statement deferred]
|
|
A stronger statement would replace the right-hand side
|
|
single-attempt advantage with the EUF-CMA advantage of FIPS~204
|
|
against $K$-fold signing queries on the same message. This is
|
|
straightforward in the single-message setting but requires a careful
|
|
hybrid for cross-message correlations (e.g.\ if $\mathcal{A}$
|
|
chooses adaptive messages between restarts). We mark this as
|
|
Round-2-MPTC work in \S\ref{sec:knownlimits}.
|
|
\end{remark}
|
|
|
|
\paragraph{Implementation discipline.}
|
|
The Pulsar reference implementation enforces the cross-restart
|
|
state discipline structurally:
|
|
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item The per-attempt state is a fresh struct allocated at the top
|
|
of each restart iteration. No cross-iteration field carries forward.
|
|
\item The PRNG seeding routine takes
|
|
$(\mathit{sid}, \kappa, T, i, \mathit{pk}, \mu)$ as inputs and is
|
|
the unique source of per-attempt randomness. Any attempt to use
|
|
\texttt{crypto/rand} inside the inner loop is a CI failure.
|
|
\item Constant-time discipline (\S\ref{sec:impl-ct}) is preserved
|
|
across restarts: the restart decision itself is constant-time in
|
|
the failure mode (which norm check failed is leaked only via the
|
|
fact of failure, not via timing).
|
|
\end{itemize}
|
|
|
|
\subsection{Performance characteristics}
|
|
\label{sec:impl-perf}
|
|
|
|
Concrete benchmarks defer to the experimental-evaluation report
|
|
(\texttt{bench/results/REPORT.md}, frozen at submission). Pulsar's
|
|
expected complexity scales as follows for parameter set ML-DSA-65,
|
|
$(n, t) = (7, 4)$:
|
|
|
|
\begin{center}
|
|
\begin{tabular}{l l l l}
|
|
\toprule
|
|
operation & messages & local compute & per-party state \\
|
|
\midrule
|
|
$\DKG$ (3 rounds)
|
|
& $O(n^2)$ broadcast + $O(n)$ per recipient
|
|
& $O(n \cdot k \ell)$ per party
|
|
& $O(t \cdot k \ell)$ \\
|
|
$\Sign$ (2 rounds, no restart)
|
|
& $O(t^2)$ MACs + $O(t)$ broadcast
|
|
& $O(k \ell)$ per party
|
|
& $O(\ell)$ \\
|
|
$\Sign$ (avg.\ FIPS~204 restart count $\approx 5$)
|
|
& $5 \times$ above
|
|
& $5 \times$ above
|
|
& unchanged \\
|
|
$\Reshare$ (3 rounds)
|
|
& $O(t_{\mathrm{old}} \cdot |\mathcal{N}|)$ private + $O(n)$ broadcast
|
|
& $O(t_{\mathrm{old}} \cdot k \ell)$
|
|
& $O(t_{\mathrm{new}} \cdot k \ell)$ \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
\paragraph{Signature size.} The output is a single FIPS~204
|
|
signature: ML-DSA-44 (2420 B), ML-DSA-65 (3309 B), ML-DSA-87
|
|
(4627 B). \emph{No threshold envelope.}
|
|
|
|
\subsection{Side-channel resistance}
|
|
\label{sec:impl-sidechannel}
|
|
|
|
The reference implementation targets constant-time semantics as
|
|
specified in \S\ref{sec:impl-ct}. The jasmin-ct gate on the
|
|
threshold layer (\texttt{round1.jazz}, \texttt{round2.jazz},
|
|
\texttt{combine.jazz}) is blocking at 3/3 CT-clean; libjade
|
|
ML-DSA-65 single-party sign is advisory under tracked issue \#2
|
|
(write-up: \texttt{ct/jasmin-ct-libjade.md}). Statistical timing
|
|
runs through \texttt{dudect} at $10^9$ samples per target in
|
|
\texttt{scripts/nightly.sh}, with results checked into
|
|
\texttt{ct/dudect/results/}. Physical side channels (power
|
|
analysis, EM, fault injection, cache timing) belong to the
|
|
deployed-binary layer; the algorithm-correctness chain in
|
|
\S\ref{sec:knownlimits} is independent.
|
|
|
|
% =====================================================================
|
|
\section{Test vectors}
|
|
\label{sec:vectors}
|
|
% =====================================================================
|
|
|
|
The KAT suite (frozen at submission) lives in
|
|
\texttt{vectors/kat-v1.\{json,rsp\}}. Each entry encodes a complete
|
|
ceremony:
|
|
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item Setup: $(q, n_{\mathrm{ring}}, k, \ell, \eta, \tau, \gamma_1, \gamma_2, \omega, \beta, d, \lambda, n, t)$.
|
|
\item DKG: per-party seeds (deterministic), Round-1 outputs (commits and dealt shares), Round-2 verification results, final $\mathit{pk}$.
|
|
\item Sign: $(\mathit{sid}, T, \mu, K_i^{\mathrm{prng}})$, per-party Round-1 and Round-2 transcripts, per-attempt $\kappa$ trace, final $\sigma$, FIPS~204 \texttt{ML-DSA.Verify} result.
|
|
\item Reshare: old shares, new committee, beacon $\beta_e$, per-party transcripts, new shares, activation certificate, $\mathit{pk}$-invariance proof.
|
|
\end{itemize}
|
|
|
|
Cross-implementation KAT replay: the Go reference (\texttt{ref/go/})
|
|
and the eventual C reference (\texttt{ref/c/}) MUST produce
|
|
byte-equal outputs from the same seeded inputs. The KAT generation
|
|
oracle is locked at \texttt{cmd/pulsar-oracle}.
|
|
|
|
% =====================================================================
|
|
\section{Complexity analysis}
|
|
\label{sec:complexity}
|
|
% =====================================================================
|
|
|
|
\paragraph{Communication.}
|
|
$\DKG$: $O(n^2 \cdot t \cdot k)$ bits broadcast (commits) plus
|
|
$O(n^2 \cdot t \cdot \ell)$ bits private (shares and blinds).
|
|
$\Sign$: $O(t^2)$ MAC bits plus $O(t \cdot (k + \ell))$ bits
|
|
broadcast per round. $\Reshare$: $O(t_{\mathrm{old}} \cdot
|
|
(t_{\mathrm{new}} \cdot k + |\mathcal{N}| \cdot \ell))$.
|
|
|
|
\paragraph{Computation.}
|
|
$\DKG$: $O(n \cdot t \cdot k\ell)$ ring operations per party.
|
|
$\Sign$: $O(k\ell)$ ring operations per party per round (one matrix
|
|
multiplication, plus the Lagrange-scalar response). The aggregator
|
|
performs an additional $O(t \cdot \ell)$ sum.
|
|
$\Reshare$: $O(t_{\mathrm{old}} \cdot t_{\mathrm{new}})$ per old quorum
|
|
member, $O(t_{\mathrm{old}})$ per new committee member.
|
|
|
|
\paragraph{Memory.}
|
|
Per-party state: $O(t \cdot k\ell)$ (shares plus DKG commitment
|
|
backlog). $\Sign$ holds an $O(\ell)$ working set within the inner
|
|
loop.
|
|
|
|
\paragraph{Round count.}
|
|
$\DKG$: 3. $\Sign$: 2 per attempt; the FIPS~204 acceptance
|
|
probability is approximately $1 - e^{-\beta\tau/2\gamma_1}$ per
|
|
attempt (FIPS~204~\S6.1.1), giving an expected $\sim 2.4$ attempts at
|
|
ML-DSA-65. $\Reshare$: 3.
|
|
|
|
% =====================================================================
|
|
\section{Deployment considerations}
|
|
\label{sec:deployment}
|
|
% =====================================================================
|
|
|
|
\paragraph{Network model.}
|
|
The protocols assume synchronous broadcast within the round window:
|
|
all honest parties receive all honest broadcast messages within a
|
|
bounded $\Delta$. Partially synchronous (eventual delivery within a
|
|
sufficient round window) is acceptable in practice; full
|
|
asynchrony is not within scope for round-1 MPTC.
|
|
|
|
\paragraph{Abort and recovery.}
|
|
On any complaint that reaches the disqualification threshold, the
|
|
chain layer removes the disqualified party from the validator set
|
|
and triggers a $\Reshare$ to a new committee. Liveness is preserved
|
|
provided fewer than $t-1$ parties are disqualified per epoch.
|
|
|
|
\paragraph{Rotation cadence.}
|
|
Production deployments are expected to run $\Refresh$ every
|
|
$\sim$ hour (background hygiene against mobile adversary) and
|
|
$\Reshare$ at every validator-set change (typically hours to days
|
|
between epochs).
|
|
|
|
\paragraph{Monitoring.}
|
|
Public artifacts safe for observability: $\mathit{pk}$, commitments,
|
|
signed complaints, signature outputs, beacon values, per-party
|
|
identity-key signatures. Private artifacts that MUST NOT be logged:
|
|
shares, blinds, masks, samples, PRNG seeds, per-round derived state,
|
|
norm-check intermediate values.
|
|
|
|
\paragraph{HSM integration.}
|
|
The reference implementation is software. HSM integration --- where
|
|
each party's share lives in an HSM and the HSM exposes only the
|
|
$\Sign$ Round-2 contribution --- is a deployed-binary concern handled
|
|
by the operator runbook at \texttt{docs/deployment.md}.
|
|
|
|
% =====================================================================
|
|
\section{Comparison with related work}
|
|
\label{sec:related}
|
|
% =====================================================================
|
|
|
|
\paragraph{Pulsar (R-LWE), Class~S~\cite{boschini2024ringtail}.}
|
|
The companion Lux scheme over $\Rq$, single polynomial. Faster,
|
|
simpler, but \emph{not} output-interchangeable with any NIST primitive.
|
|
Different wire format. Pulsar shares Pulsar's protocol structure
|
|
(2-round signing, Pedersen DKG, HJKY97 reshare) lifted from $\Rq$ to
|
|
$\Rq^k$.
|
|
|
|
\paragraph{GKS24~\cite{gks24}, PQCrypto 2024.}
|
|
Two-round threshold lattice signatures from threshold homomorphic
|
|
encryption (G\"ur--Katz--Silde). Output is a TFHE-shaped artefact, not
|
|
ML-DSA. Class~S. Higher signature size than ML-DSA but tighter
|
|
proofs.
|
|
|
|
\paragraph{DOTT21~\cite{dott21}, PKC 2021.}
|
|
The foundational Damg\aa rd--Orlandi--Takahashi--Tibouchi two-round
|
|
$n$-out-of-$n$ multisignature from lattices. Inspires the
|
|
commit-and-aggregate structure of Pulsar/Pulsar. Restricted to
|
|
$n$-out-of-$n$; Pulsar extends to $t$-out-of-$n$ via Shamir.
|
|
|
|
\paragraph{Olingo~\cite{olingo2025}, ePrint 2025/1789.}
|
|
Concurrent threshold ML-DSA candidate. Comparison points: round
|
|
count, output interchangeability claim, DKG soundness, side-channel
|
|
posture. Full comparison table deferred to the experimental
|
|
evaluation report; structural comparison: Olingo and Pulsar both
|
|
target Class N1, both use $\Rq^k$, with differing rejection-restart
|
|
strategies.
|
|
|
|
\paragraph{THED~\cite{thed2026}, ePrint 2026/638.}
|
|
Threshold extension of FIPS~204. Comparison deferred to round-1
|
|
preview; THED was not public at Pulsar's draft cut-off.
|
|
|
|
\paragraph{HJKY97~\cite{hjky97}.}
|
|
The foundational proactive-resharing model. Pulsar's $\Reshare$
|
|
protocol is the natural lift of the HJKY97 construction to the M-LWE
|
|
setting, with the beacon-randomised quorum selection (DD-006) as the
|
|
Pulsar-specific strengthening for mobile-adversary attacks.
|
|
|
|
% =====================================================================
|
|
\appendix
|
|
\section{Notation summary}
|
|
\label{sec:notation-table}
|
|
% =====================================================================
|
|
|
|
\begin{center}
|
|
\begin{tabular}{l l}
|
|
\toprule
|
|
symbol & meaning \\
|
|
\midrule
|
|
$q$ & prime modulus, $q = 2^{23} - 2^{13} + 1 = 8\,380\,417$ \\
|
|
$n_{\mathrm{ring}}$ & ring degree, $n_{\mathrm{ring}} = 256$ \\
|
|
$\Rq$ & $\Zq[X]/(X^{n_{\mathrm{ring}}} + 1)$ \\
|
|
$(k, \ell)$ & module dimensions, FIPS~204 dependent \\
|
|
$(\eta, \tau, \gamma_1, \gamma_2, \omega, \beta, d, \lambda)$ & FIPS~204 parameter set \\
|
|
$(n, t)$ & threshold parameters, $n \ge 2t-1$ \\
|
|
$\mathbf{A} \in \Rq^{k \times \ell}$ & public matrix, derived from $\rho$ via FIPS~204 \texttt{ExpandA} \\
|
|
$\mathbf{B} \in \Rq^{k \times \ell}$ & Pedersen blinding matrix, derived via \texttt{PULSAR-EXPANDB-V1} \\
|
|
$\mathbf{s}_1 \in \Rq^\ell$ & master secret, $\chi_\eta$-distributed \\
|
|
$\mathbf{u} \in \Rq^\ell$ & Pedersen blinding, $\chi_\eta$-distributed \\
|
|
$\mathbf{s}_2 \in \Rq^k$ & FIPS~204 noise, $= \mathbf{B}\mathbf{u}$ in Pulsar \\
|
|
$\mathbf{t} = \mathbf{A}\mathbf{s}_1 + \mathbf{B}\mathbf{u}$ & FIPS~204 public-key inner vector (Pedersen-shaped) \\
|
|
$(\mathbf{t}_1, \mathbf{t}_0) = \Power(\mathbf{t}, d)$ & FIPS~204 public/private decomposition \\
|
|
$\mathit{pk} = (\rho, \mathbf{t}_1)$ & FIPS~204 public key \\
|
|
$(\mathbf{s}_i, \mathbf{u}_i)$ & party $i$'s Shamir share pair \\
|
|
$\lambda_i^T$ & Lagrange coefficient at $X = 0$ for $i \in T$ \\
|
|
$\mathbf{y}_i$ & party $i$'s mask, uniform interval $U_{\gamma_1}^\ell$ \\
|
|
$\mathbf{w}_i = \mathbf{A}\mathbf{y}_i$ & party $i$'s commit, in $\Rq^k$ \\
|
|
$\bar{\mathbf{w}}_i = \HighBits(\mathbf{w}_i, 2\gamma_2)$ & high-bits commit \\
|
|
$c \in \Rq$ & FIPS~204 challenge, $\texttt{SampleInBall}(\tilde c)$ \\
|
|
$\mathbf{z} \in \Rq^\ell$ & aggregated response, $\mathbf{y} + c\mathbf{s}_1$ \\
|
|
$\mathbf{h}$ & FIPS~204 hint vector \\
|
|
$\sigma = (\tilde c, \mathbf{z}, \mathbf{h})$ & FIPS~204 signature triple \\
|
|
$\mathit{sid}$ & per-attempt session id \\
|
|
$\kappa$ & per-attempt rejection-restart counter \\
|
|
$T \subseteq \{1, \dots, n\}$ & quorum, $|T| = t$ \\
|
|
$\mathcal{Q}_e$ & beacon-selected reshare quorum at epoch $e$ \\
|
|
$\beta_e$ & chain randomness beacon at epoch $e$ \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{center}
|
|
|
|
\section{Patent claims}
|
|
\label{sec:patent}
|
|
Final patent disclosure assembled from
|
|
\texttt{docs/patent-notes-draft.md} at the submission freeze. Lux
|
|
Industries Inc.\ asserts no patent claims on the cryptographic body
|
|
of Pulsar; the threshold protocol is a port of the publicly-known
|
|
Ringtail~\cite{boschini2024ringtail} construction with the beacon-quorum
|
|
strengthening of DD-006, both of which are explicitly placed into
|
|
the public domain by this submission.
|
|
|
|
\section{Closure record and round-1 scope boundary}
|
|
\label{sec:knownlimits}
|
|
Mirror of \texttt{BLOCKERS.md} (closed-finding registry; Open: none).
|
|
The 4-red-agent + 1-scientist adversarial audit (2026-05) closed
|
|
every cryptographic finding it surfaced; each closure cites commit
|
|
and tag in \texttt{BLOCKERS.md} at the repository root.
|
|
|
|
\paragraph{Cryptographic closures against the audit.}
|
|
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item \textbf{DKG commit-opening (CR-6)} [CLOSED in v0.2.0]: The
|
|
unopened \texttt{cSHAKE256(c\_i $\Vert$ blind\_i)} commit was
|
|
dropped (Path A). The reference implementation realises the
|
|
Shamir+sum protocol with no separate commit-and-open layer;
|
|
binding comes from Round-2 envelope-digest agreement over the
|
|
ordered Round-1 broadcast set (\S\ref{sec:dkg}).
|
|
\item \textbf{Sign-round session-key derivation (CR-7)} [CLOSED in
|
|
v0.2.0]: \texttt{deriveMACKey} was deleted. The threshold signer
|
|
consumes a per-pair ephemeral session key established before
|
|
Round~1 via authenticated ML-KEM-768 key agreement, where each
|
|
party encapsulates a fresh shared secret to the peer's long-term
|
|
ML-KEM-768 identity public key and signs the ciphertext with their
|
|
long-term ML-DSA-65 identity key. The final session key mixes both
|
|
parties' contributions through HKDF-SHA3-256 over a
|
|
canonical-ordered NodeID pair (\S\ref{sec:sign} and
|
|
\S\ref{sec:system-model}).
|
|
\item \textbf{DKG envelope confidentiality (CR-8)} [CLOSED in v0.2.0]:
|
|
Round-1 envelopes are ML-KEM-768-wrapped against each recipient's
|
|
long-term identity public key. The wire shape is
|
|
$\textsc{DKGShareEnvelope} = (\mathit{KEMCT}, \mathit{Sealed})$
|
|
where $\mathit{KEMCT}$ is the ML-KEM-768 ciphertext (1088 B) and
|
|
$\mathit{Sealed}$ is the 128-byte sealed payload carrying
|
|
$(\mathit{share} \| \mathit{contribution} \| \mathit{tag})$ XORed
|
|
with a cSHAKE256 stream keyed by the KEM-derived envelope key
|
|
(\S\ref{sec:dkg}).
|
|
\item \textbf{Adaptive corruption proof.}
|
|
\Cref{thm:reshare-pkinv} is proved against the static-corruption
|
|
model (the MPTC requirement). The adaptive-corruption variant
|
|
(Game ADAPT) ports the static reduction through the
|
|
chain-corruption simulator and is targeted for the v0.2 audit
|
|
cycle.
|
|
\item \textbf{Cross-domain isolation between Pulsar (M-LWE) and
|
|
Corona (R-LWE).} Both inhabit the same algebraic-lattice hardness
|
|
family. Deployments seeking lattice-family diversity compose them
|
|
with a hash-based (SLH-DSA) signer at the consensus envelope;
|
|
Magnetar is the Tier-3 research track for this composition.
|
|
\item \textbf{Verify constant-time.} \Cref{sec:verify} routes
|
|
verification through \texttt{cloudflare/circl}'s FIPS~204
|
|
verifier, documented constant-time. The \texttt{ct/dudect/}
|
|
harness pins the $10^9$-sample run in
|
|
\texttt{scripts/nightly.sh}; results check into
|
|
\texttt{ct/dudect/results/}.
|
|
\item \textbf{$\Sign$ Round-2 byte-equality (PULSAR-V03-1)}
|
|
[CLOSED in v1.0.20, commit \texttt{023a3ed}]: the spurious
|
|
post-sample forward-NTT on $A$ in \texttt{deriveKeyMaterial} is
|
|
dropped; $A$ is sampled directly into the NTT representation per
|
|
FIPS~204 \S3.5 Algorithm~32. Regression guards in v1.0.21
|
|
(\texttt{267ec04}) and v1.0.22 (\texttt{29094a7}).
|
|
\end{itemize}
|
|
|
|
\paragraph{Round-1 scope boundary.}
|
|
|
|
\begin{itemize}[leftmargin=*, itemsep=0pt]
|
|
\item \textbf{Network model.} Round-1 assumes synchronous broadcast
|
|
within the round window. Asynchronous identifiable-abort
|
|
attribution routes through a separate consensus-layer
|
|
accountability artifact.
|
|
\item \textbf{HSM integration.} A deployed-binary concern handled
|
|
by the operator hardening checklist in
|
|
\texttt{docs/deployment.md}.
|
|
\item \textbf{Physical side channels} (power, EM, fault, cache
|
|
timing): handled at the deployed-binary layer; the
|
|
algorithm-correctness chain in the EasyCrypt refinement proof is
|
|
unchanged.
|
|
\item \textbf{Cross-message restart hybrid.}
|
|
\Cref{thm:restart-non-leak} proves restart non-leakage for a
|
|
single $(\mathit{pk}, \mu)$. The v0.2 wire shape ports the restart
|
|
semantics through the same MPTC submission framework.
|
|
\item \textbf{Lattice estimator parameter pins.} Concrete
|
|
bit-security estimates from the lattice estimator
|
|
(\texttt{estimator/}) are pinned at submission; the underlying
|
|
estimator commit hash is recorded in \texttt{estimator/README.md}.
|
|
\end{itemize}
|
|
|
|
\begin{openq}[Adaptive corruption tightness]
|
|
The static-to-adaptive corruption gap for two-round threshold
|
|
lattice signatures is an active research direction. The
|
|
\cite{boschini2024ringtail} paper's adaptive variant uses a complexity
|
|
leveraging argument that loses a multiplicative
|
|
$\binom{n}{t}$ factor in the security parameter. Can a tighter
|
|
adaptive reduction be constructed for the module-shaped
|
|
Pulsar variant without architectural changes? \emph{Unresolved.}
|
|
\end{openq}
|
|
|
|
\begin{openq}[Restart cross-message hybrid]
|
|
\Cref{thm:restart-non-leak} proves restart non-leakage for a single
|
|
$(\mathit{pk}, \mu)$. A full cross-message-adaptive hybrid would
|
|
extend to the case where the adversary chooses $\mu^{(\kappa+1)}$
|
|
based on the transcript of attempts on $\mu^{(\kappa)}$. We
|
|
conjecture this holds under M-LWE without structural changes, but
|
|
the formal hybrid is round-2 work. \emph{Unresolved.}
|
|
\end{openq}
|
|
|
|
\begin{openq}[Beacon-quorum binding for proactive resharing]
|
|
The DD-006 beacon-randomised quorum selection assumes the chain
|
|
beacon is unbiasable against the adversary. The Lux Quasar
|
|
consensus randomness layer provides this property; the formal
|
|
binding to the Pulsar reshare MOB game requires a separate
|
|
hybrid argument bridging the consensus randomness assumption to
|
|
the Pulsar MOB game. \emph{Sketched in security-games.tex; full
|
|
proof round-2.}
|
|
\end{openq}
|
|
|
|
\bibliographystyle{plain}
|
|
\bibliography{references}
|
|
|
|
\end{document}
|