Hekate v0.32.0
On this page
Two verifier soundness fixes. The LogUp fraction helper h was never
committed: a prover fits its evaluation after r_final is drawn, the
final check collapses to 0 = 0, and every constraint on the table,
AIR and boundary as well as bus, goes unenforced. Deterministic, not
probabilistic, and it reaches every table carrying a permutation or
lookup bus. Separately, a table declaring no bus could inject an
unbound claimed_sums entry into cross-bus matching and forge
cancellation in characteristic two. Wire format moves to v3; 0.31.0
proofs are rejected. Pair with the signed prover cdylib 0.9.0.
Upgrade is mandatory.
Full analysis of both gaps, and of the 0.31.0 row-code break they follow: postmortem.
§ Soundness
his committed and opened. Every bus-carrying table now carries a Brakedown commitment toh. The verifier absorbs its root before α, binding the ZeroCheck challenges to it, openshatr_final, and rejects unless every reportedh_evalequals the opened value. The affine bus term now runs on a bound scalar. No algebraic shortcut exists:h(r_final)is rational in the trace, and a polynomial commitment is mandatory.- Presence is checked against the trusted bus specs.
h_commitmentandh_eval_proofareSomeexactly when the table declares a bus, and the commitment'snum_rows/num_colsmust match the table height and bus count. Dropping the binding fails, it is not ignored. - The
hopening inherits the full 0.31.0 posture. Its geometry runs the same per-tablecheck_securitygate at its owngrid_cols, and hiding comes from the same codeword blind. - Zero-bus tables present empty LogUp aux. The
claimed_sumsandh_evalslength andbus_idordering checks moved out of theif !bus_specs.is_empty()guard, closing the injection term before cross-bus matching. Verifier-only, no proof bytes change.
§ Base-only h opening
h has no transition constraint. Its opening carries base columns
only. EvalVerifyContext gains next_row: false parses one value
per committed column and folds the base claim alone, halving the
opened row width. The opening scales with sqrt(row_bytes), which
buys about 1.4x on the binding, not 2x. The trace opening is
unchanged.
§ Performance
Signed public cdylib 0.9.0, table-math, Apple M3 Max,
-C target-cpu=native, quiesced host. Peak memory is
phys_footprint_peak. PQC and AES are the mean of three runs.
| Workload | Prove | Verify | Peak mem | Proof |
|---|---|---|---|---|
| ML-KEM-768 | 919 ms | 23.6 ms | 556 MiB | 4.35 MB |
| ML-DSA-44 | 1.60 s | 29.2 ms | 603 MiB | 5.69 MB |
| ML-DSA-65 | 1.66 s | 29.5 ms | 566 MiB | 5.71 MB |
| ML-DSA-87 | 2.95 s | 35.1 ms | 1.25 GiB | 7.71 MB |
| AES-128 | 2.08 s | 18.2 ms | 1.59 GiB | 7.48 MB |
| AES-256 | 2.27 s | 18.3 ms | 2.01 GiB | 8.21 MB |
| keccak_inline 2^15 | 323 ms | 6.1 ms | 175 MiB | 1.08 MB |
| keccak_inline 2^20 | 7.58 s | 13.1 ms | 3.51 GiB | 5.32 MB |
Against 0.31.0: proof +14 to 32%, verify +9 to 35%, prove within ±10%, peak memory flat. The binding scales with bus count, not trace width: 24% of the ML-KEM proof, 21% ML-DSA-65, 15% AES-128, 12% keccak 2^20. keccak_inline 2^24 was not re-measured.
§ Breaking
- Proofs and bundles.
WIRE_PROOF_VERSION2 to 3. v2 proofs are rejected and must be re-proved.LogUpAuxgains nullableh_commitmentandh_eval_proof. EvalVerifyContextgainsnext_row;opened_row_bytestakes it as a third argument andopened_row_bytes_variantsis removed.- Prover cdylib 0.9.0, signed (SHA-256, Ed25519, ML-DSA-65). An older cdylib emits proofs this verifier rejects.
Configandprogram_idare unchanged. Only proofs are re-emitted.- Version. Workspace 0.31.0 -> 0.32.0; hekate-keccak and hekate-aes 0.5.0, hekate-pqc 0.6.0.