The specified verifier omits the one-time signature's encoding check
Minor break · Argued · Cause: specification text
Property: existential unforgeability, for verifiers that follow the specification
Cost against claim: forgery ≈235 to 279 on the 160- and 256-bit sets, for a verifier that follows the specification
Scope: Verifiers written from the specification. The submitted code performs the check and is not affected.
The one-time layer (WOTS+C) is secure only if the digit vector lies in its constant-sum set, which no valid codeword can dominate. The specified signer enforces that membership; the specified verifier (Algorithm 6, and the abstract verifier of Construction 1 that the security reduction is about) recomputes the digits and compares without it. A verifier that follows the text therefore accepts a checksum-free Winternitz signature: from one genuine signature, a forger grinds a message whose digits dominate the revealed ones and advances every chain.
| Parameter set | Claim | Attack cost | Verdict |
|---|---|---|---|
| CEDRUS+C-160s | 160 classical | ≈235.4 | Minor break |
| CEDRUS+C-160f | 160 classical | ≈248.9 | Minor break |
| CEDRUS+C-256s | 256 classical | ≈257.5 | Minor break |
| CEDRUS+C-256f | 256 classical | ≈278.6 | Minor break |
| CEDRUS+C-384f | 384 classical | ≈2100.4 | Minor break |
| CEDRUS+C-384s | 384 classical | ≈2115.9 | Minor break |
| CEDRUS+C-512s | 512 classical | ≈2133.4 | Minor break |
| CEDRUS+C-512f | 512 classical | ≈2134.7 | Minor break |
What causes it
Algorithm 5 (signing) loops until the leading bits are zero and the digits have the required sum; Algorithm 6 (verification) and Construction 1 recompute the digits and go straight to the chains. The forgery costs 1/∏(w_i − b_i)/w_i hash evaluations per targeted key, and grafting at the top hypertree layer makes it universal.
Evidence
Argued from the specification text; the submitted code (wots.c) rejects any digit vector with the wrong sum. The cost model matches a 20-million-sample Monte Carlo to 0.2%. The forgery has not been run.
Cause in the specification, traced to the specification text.
Limits
Only an implementation written from the specification is forgeable. The fix is to add the signer's membership test to the verifier.
Credit
Found by PQC-X, extending an observation by Mikhail Kudinov (ngcc.dev sign-11-3, 2026-09-22): the same omission in the FlexTree specification.