Harmonise the axiom accounting everywhere:
22 named axioms total — 17 narrow implementation-refinement
(14 byte-walk + 1 signature-codec round-trip + 2 honest-
execution no-reject post-conditions) plus 5 Lean-bridged
algebraic, each with file:line in EC and Lean.
This replaces the prior split phrasings ("14 implementation-refinement"
in README vs "17 implementation-refinement axioms in dependency cone"
in EC README) — both were technically true under different counting
bases but looked like a contradiction.
- README.md: hard-boundary block + axiom table use canonical phrasing.
- SUBMISSION.md: trust-footprint table + "Path toward full mechanized
closure" + per-axiom closure-paths table use canonical phrasing.
- docs/proof-axiom-inventory.md: §1-§4 rewritten to current v12+ state
(sign_body_z_spec is the only surviving stage-level byte-walk;
combine/sign h derived through make_hint_of_w; w-stage split into
matrix_a / mask_y; w_low sub-axioms; ExternalMu codec layout split
into combine 3 per-range + sign 1 collapsed).
- docs/proof-claims.md: scope-boundary framing on adversarial
robustness section.
- docs/tcb.md: §3.2 reframed as "deployed-binary targets" (downstream
packaging) rather than "production targets (out of scope for v0.1)".
- docs/cryptographer-sign-off.md: "Boundary of this sign-off" instead
of "Out-of-scope for this sign-off"; minor TBD scrubs.
- proofs/easycrypt/README.md: trust-boundary table uses canonical
phrasing.
- proofs/easycrypt/Pulsar_N1_Extracted.ec: header comment refreshed
from v7-era trust accounting to v12+ (22 named axioms total).
- proofs/lean-easycrypt-bridge.md: "Future work" → "Closure paths";
summary uses canonical phrasing.
- proofs/easycrypt/extraction/{combine,sign}-byte-walk-roadmap.md:
"followup B" → "v10 no-reject decomposition".
13 KiB
AXIOM-INVENTORY — Pulsar EasyCrypt residual trust base
Standalone trust accounting for the EasyCrypt N1 byte-equality theorem. Pairs with
proof-claims.md(proof scope),fips-204-traceability.md(op→FIPS § map), andtcb.md(EC/Jasmin/OCaml TCB).Auditors should read this document first. Every axiom in the dependency cone of
Pulsar_N1_Extracted.pulsar_n1_byte_equality_extractedis enumerated here with its full statement, location, closure plan, and current status.
Trust footprint summary
22 named axioms total in the extracted N1 byte-equality theorem's dependency cone — each with file:line in EC and Lean, each independently attackable through the per-axiom closure plan below.
| Category | Count | Status |
|---|---|---|
| Stage-level byte-walks | 1 | primitive — sign_body_z_spec |
| Combine z extraction (v8 split) | 2 | primitive — combine_body_z_via_aggregation_spec, combine_body_partial_responses_spec |
| w-stage matrix_a / mask_y sub-axioms (v12) | 4 | primitive — {combine,sign}_body_{matrix_a,mask_y}_spec |
| w_low sub-axioms (h-stage, v10) | 2 | primitive — {combine,sign}_body_w_low_spec |
| ExternalMu codec layout (v9) | 4 | primitive — 3 combine per-range + 1 sign collapsed |
| Honest-execution no-reject | 2 | primitive — *_no_reject_on_accepted_honest_layout |
| Signature-codec round-trip | 1 | primitive — pack_unpack_n1_signature_roundtrip |
| Subtotal — implementation-refinement | 17 | byte-walk + codec round-trip + honest-execution no-reject |
| Lean-bridged algebraic | 5 | primitive in EC; mechanised in Lean 4 + Mathlib |
| Total named axioms | 22 | each with file:line in EC and Lean |
| Per-type FIPS 204 codec round-trips | ~21 | primitive — see §7 below; outside the corollary cone |
| Derived lemmas (formerly primitive) | 11+ | *_body_{c_tilde,mu,w,w1,mu_input,h}_spec × 2 sides + combine_body_z_spec |
| EC admit budget | 0 / 0 | hard-pinned by scripts/checks/ec-admits.sh |
| Lean ↔ EC bridge guards | 5 / 5 | hard-pinned by scripts/check-lean-bridge.sh |
§1 Stage-level byte-walk axiom (1)
The only stage-level byte-walk that survives the v8 / v11 / v12
decompositions. Combine's z-stage is a derived lemma composing
combine_body_z_via_aggregation_spec +
combine_body_partial_responses_spec with the Lean Lagrange bridge
threshold_partial_response_identity. The h-stage on both sides is
derived via make_hint_of_w structural composition over
w_low_spec. The w-stage is decomposed into matrix_a + mask_y
sub-axioms.
§1.1 sign_body_z_spec
File: proofs/easycrypt/Pulsar_N1_Sign_Refinement.ec
Statement:
axiom sign_body_z_spec :
forall mem_pre ptrs full,
layout_sign_args mem_pre ptrs (wire_sign_args_of_full full) =>
sign_body_compute_status mem_pre ptrs = 0 =>
sign_body_compute_z mem_pre ptrs
= Pulsar_N1.mldsa_compute_z
(Pulsar_N1.unpack_sk full.`sgn_sk_n1)
(Pulsar_N1.compute_mu full.`sgn_m_n1 full.`sgn_ctx_n1)
full.`sgn_rnd_n1.
FIPS 204 §: §6.2 (Sign_internal — kappa rejection loop output z)
Closure plan:
- Step 1: decompose into
sign_body_y_spec+sign_body_cs1_spec+ structural addition (matches v7 HighBits pattern). - Step 2: bridge
sign_body_y_spectoexpand_mask+ accepted-kappa selection. - Step 3: bridge
sign_body_cs1_spectosample_in_ball+vec_l_scale. - Total estimated effort: 2-3 weeks.
§1.2 h-stage axioms — both derived
combine_body_h_spec and sign_body_h_spec are derived lemmas
(v10) composing *_body_w_low_spec with make_hint_of_w structural
identity over w_high from Pulsar_N1.high_bits_of_w. The narrower
{combine,sign}_body_w_low_spec axioms are listed in §3 below.
§2 Narrow combine z extraction (2 — v8 split)
§2.1 combine_body_z_via_aggregation_spec
File: proofs/easycrypt/Pulsar_N1_Combine_Refinement.ec
Statement: the extracted combine's z output equals the Lagrange
aggregation of combine_body_compute_partial_responses over
full.full_quorum`.
FIPS 204 §: §6.2 (combine z-aggregation stage)
Closure plan: byte-walk through combine.ec lines 3460-3490
(round-2 aggregation loop) showing the extracted aggregation
matches the abstract lagrange_aggregate_responses op. Estimated:
3-5 days.
§2.2 combine_body_partial_responses_spec
File: proofs/easycrypt/Pulsar_N1_Combine_Refinement.ec
Statement: per-party partial responses extracted from round-2
messages equal per_party_partial_response on the per-party share.
FIPS 204 §: per-party FROST-style z_i = y_i + c · s_i
Closure plan: byte-walk through round-2 message parsing in extraction. Estimated: 1-2 weeks.
§3 w-stage matrix_a / mask_y sub-axioms (4) + w_low sub-axioms (2)
The v12 split replaced the bundled *_body_w_spec axioms with
narrower matrix_a + mask_y per-side pairs (each is a sub-axiom of
the previous bundled w-stage obligation). The v10 split produced the
w_low sub-axioms used by the derived h-stage lemmas.
§3.1 {combine,sign}_body_matrix_a_spec
Statement: extracted matrix A equals central_matrix_a from the
public parameter ρ via expand_a.
FIPS 204 §: §3.5 Algorithm 32 (ExpandA)
Closure plan: BArray ↔ R_q polynomial-view bridge through
MLDSA65_Functional.expand_a.
§3.2 {combine,sign}_body_mask_y_spec
Statement: extracted mask y at the accepting kappa equals
central_y_at_accepted_kappa.
FIPS 204 §: §6.2 (ExpandMask at the accepting κ)
Closure plan: expand_mask + accepted-κ selection.
§3.3 {combine,sign}_body_w_low_spec
Statement: extracted w_low at the accepting kappa equals
central_w_low (low-bits side of decompose_vec_k).
FIPS 204 §: §3.4.3 + §6.2 (Decompose)
Closure plan: mirror lemma through MLDSA65_Functional.decompose.
§4 ExternalMu codec-layout axioms (4)
The v9 split decomposed the bundled *_body_mu_input_spec axioms
into narrower per-range / per-buffer sub-axioms. Combine has three
per-range sub-axioms over the protocol-witness ExternalMu buffer;
sign collapses to one because sign owns m_ptr / ctx_ptr in its
layout.
§4.1 Combine side — 3 per-range sub-axioms
combine_body_mu_input_prefix_spec,
combine_body_mu_input_ctx_bytes_spec,
combine_body_mu_input_m_bytes_spec cover the first 2 bytes
(prefix), the ctx-bytes slice, and the M-bytes suffix of the
FIPS 204 §5.4.1 ExternalMu layout respectively.
§4.2 Sign side — 1 collapsed byte-layout axiom
sign_layout_m_buffer_external_mu: the bytes written at ptr_m
form the FIPS 204 §5.4.1 ExternalMu layout. The
sign_body_mu_input op is constructively defined via
load_bytes mem ptrs.ptr_m ptrs.m_len.
§5 Accepted-path no-reject axioms (2)
§5.1 combine_no_reject_on_accepted_honest_layout
Statement: under layout invariants + accept_signing_attempt
holds, combine_body_compute_status = 0.
FIPS 204 §: §6.2 (kappa rejection-loop convergence)
Closure plan: requires probabilistic Hoare-logic chain on the
kappa loop. Operationally bounded by mldsa_accept_lower_bound
(≈ 1 − 2^-128). Closure requires a kappa-loop model in EC.
Estimated: 4-6 weeks.
§5.2 sign_no_reject_on_accepted_honest_layout
Symmetric. Same closure plan.
§6 Lean-bridged algebraic axioms (5)
These are mechanized on the Lean side; the EC axioms are
hand-bridged via proofs/lean-easycrypt-bridge.md + the CI guard
scripts/check-lean-bridge.sh.
§6.1 lagrange_inverse_eval (Pulsar_N1.ec)
Lean: Crypto.Pulsar.Shamir.shamir_correct_at_target
(lean/Crypto/Pulsar/Shamir.lean)
§6.2 add_share_zeroR (Pulsar_N4.ec)
Lean: implicit in Mathlib's AddCommMonoid instance.
§6.3 reconstruct_linear (Pulsar_N4.ec)
Lean: Crypto.Threshold.Lagrange.combine_distributes_over_sum
§6.4 shamir_correct (Pulsar_N4.ec)
Lean: Crypto.Pulsar.Shamir.shamir_correct_at_target
§6.5 threshold_partial_response_identity (Pulsar_N1.ec, v8)
Lean: Crypto.Threshold.Lagrange.threshold_partial_response_identity
(lean/Crypto/Threshold_Lagrange.lean:121)
Closure plan for all 5: either
- (a) port the relevant Mathlib polynomial-Lagrange theory into EC (multi-week), OR
- (b) build a checked Lean ↔ EC translation tool (multi-month research project — currently no such tool exists in published literature).
§7 Codec axioms
§7.1 pack_unpack_n1_signature_roundtrip
File: proofs/easycrypt/Pulsar_N1.ec (v4)
Statement: unpack_n1_signature (pack_n1_signature c z h) = (c, z, h).
FIPS 204 §: §3.5.5 (sigEncode roundtrip)
Closure plan: concretize pack_n1_signature and unpack_n1_signature
to bit-level codecs matching MLDSA65_Functional.pack_signature
when that's mechanized.
§7.2 Per-type FIPS 204 codec roundtrips (~21)
Across Pulsar_N1_Signature_Codec.ec, Pulsar_N1_Sign_Layout.ec,
Pulsar_N1_Combine_Layout.ec:
encode_decode_signature+encode_signature_len+encode_signature_wfencode_decode_sk+encode_sk_len+encode_sk_wf+decode_encode_sk_wfencode_decode_msg+encode_msg_len+encode_msg_wfencode_decode_c_tilde+encode_c_tilde_lenencode_decode_t0+encode_t0_lenencode_decode_r2_msg+encode_r2_msg_len- (and a handful of share-structure axioms:
share_polys_injective,poly_share_of_injective,poly_share_roundtrip, etc.)
Closure plan: Barbosa-Barthe-Dupressoir-scale Dilithium codec mechanization (CRYPTO 2023 paper template, ~6 person-months).
§8 Counterpart concretization opportunities
For each abstract op currently held inside an axiom, the concretization that would enable closure:
| Abstract op | Concretization needed |
|---|---|
message_t, ctx_t |
= int list (byte sequence) — adds message_bytes / context_bytes as proper byte serializers |
share_t |
= R_q^l × R_q × bits × bits per FIPS 204 §3.5.4 sk-structure |
signature_t |
already aliased to Pulsar_N1_Signature_Codec.signature_t — needs concrete byte-codec body |
unpacked_sk_t |
6-tuple (rho, K, tr, s1, s2, t0) per FIPS 204 §3.5.4 |
mu_t, mu_shake_input_t |
mu_t = int list (64 bytes); mu_shake_input_t = int list (v9) ✓ done |
c_tilde_n1_t, z_n1_t, h_n1_t |
bit-level FIPS 204 §3.5.5 sig-component encodings |
w_value_t, w_low_value_t, w1_value_t |
= vec_k per MLDSA65_Functional |
partial_response_t |
= (vec_l × ...) per protocol-level partial response shape |
unpacked_sk_t, randomness_t |
concrete byte forms |
Once these are concretized, the structural identities can be proved mechanically and the corresponding axioms collapse to lemmas.
§9 What this trust footprint EXCLUDES
The audit cone of pulsar_n1_byte_equality_extracted does NOT
include:
MLDSA65_Functional.ec's internal abstract ops (fips204_sign,sample_in_ball, etc.) — those are abstracted at the bits-level but the corollary doesn't reach into them.- The
combine_body_axiom/S_functional_specSECTION-LOCAL axioms insidesection ClassN1inPulsar_N1.ec. The extracted corollary instantiates the generic theorem with concrete wrapper modules + bridge lemmas, NOT via the section's declare-axiom hypotheses. The CI guardscripts/checks/ec-refinement-scaffold.shreports these as warnings (informational) — they're not on the audit path. - The EC / Jasmin / OCaml compiler trusted-computing base. See
tcb.md.
§10 Verification commands
# Full high-assurance gate (admit budget + Lean bridge + compile)
scripts/check-high-assurance.sh
# Admit budget enforcement (hard-pin 0/0)
scripts/checks/ec-admits.sh
# Lean bridge guard (5/5)
scripts/check-lean-bridge.sh
# Per-file EC compile (all 13)
scripts/checks/ec-compile.sh
# Refinement scaffold (declare-axiom hygiene)
scripts/checks/ec-refinement-scaffold.sh
# Retired-axiom regression guard
scripts/checks/ec-regressions.sh
All five must exit 0 for a clean trust accounting. Per-push CI runs all five.
§11 What an auditor should do
- Read this document end-to-end.
- Verify each axiom's statement matches the file:line it cites.
- Run
scripts/check-high-assurance.shand confirm 0/0 admits + 5/5 bridges + 13/13 compile. - For each Lean-bridged axiom, read the Lean theorem at the
cited location and verify the correspondence in
proofs/lean-easycrypt-bridge.md. - For each byte-walk axiom, read the extraction roadmap at
proofs/easycrypt/extraction/{combine,sign}-byte-walk-roadmap.mdto confirm the closure plan is concrete. - Cross-check the axiom count in this document against the
raw count returned by:
The numbers should match modulo internal sub-axioms not on the corollary cone (e.g.,
grep -rE "^axiom\s+\w" proofs/easycrypt/ | wc -lMLDSA65_Functional-internal axioms).
Document metadata
- Name:
proof-axiom-inventory.md - Version: v1.0 (post v8)
- Date: 2026-05-18
- Companion documents:
proof-claims.md(proof scope)fips-204-traceability.md(op → FIPS §)tcb.md(TCB)proofs/lean-easycrypt-bridge.md(bridge correspondence)SUBMISSION.md(cover sheet with same accounting)