You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The ml-dsa 0.0.4 crate carries open timing-side-channel and implementation
advisories (RUSTSEC-2025-0144, CVE-2026-22705, CVE-2026-24850,
GHSA-h37v-hp6w-2pp8). Default builds now resolve without ml-dsa at all —
operators who want post-quantum signing opt in explicitly:
cargo build --features pq-experimental
Changes:
- Cargo.toml: ml-dsa = { ..., optional = true }; add pq-experimental feature
- signer.rs: cfg-gate ml-dsa import, PrivateKey::MlDsa* variants, and every
match arm / parse branch that references them; error message conditional
- pkcs7/builder.rs: cfg-gate SigningAlgorithm::MlDsa* + SlhDsa* variants,
algorithm_id / digest_algorithm arms, and the six PQC unit tests
- tests/pq_feature_gate.rs: compile-time + dep-tree assertions that pin
the gate — exhaustive matches break the build if a variant leaks, and
`cargo tree --no-default-features --invert ml-dsa` must exit non-zero
- deny.toml: drop the ml-dsa CVE ignores (default graph is ml-dsa-free)
- ci.yml / daily-health.yml / release.yml: keep --ignore RUSTSEC-2025-0144
for cargo audit (Cargo.lock still pins the optional dep, audit walks
the lockfile regardless of features) with clarifying rationale
- README / CHANGELOG: document the feature flag and mark #72 shipped
closes#72
Co-Authored-By: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
-**Multipart streaming body-limit now returns 413** — uploads without a `Content-Length` header (chunked transfer-encoding) that exceed `max_upload_size` are rejected with `413 Payload Too Large` instead of `500 Internal Server Error`. The fix walks the multipart error source chain for `http_body_util::LengthLimitError` and maps it to `SignError::FileTooLarge`, closing the 500-leakage gap the pre-buffer layer left behind.
12
12
-**Release ci-gate now runs cargo-audit + cargo-deny** — vulnerable dependencies can no longer ship via the release workflow, even if admin-bypass is used on `main`.
13
13
-**Cosign signing failures now fail the release** — removed `|| echo` fallback on `gh release upload` and added a post-sign presence check for every `.sig`/`.cosign-bundle`. v0.5.8 shipped without supply-chain signatures because of this silent-fail; regression guard added.
14
-
-**ml-dsa CVE cluster acknowledged in deny.toml + cargo audit** — CVE-2026-22705, CVE-2026-24850, GHSA-h37v-hp6w-2pp8 explicitly ignored with tracker link; no CI surprise when advisory DB catches up.
14
+
-**ML-DSA / SLH-DSA moved behind `pq-experimental` feature flag (#72)** — the `ml-dsa` crate and all `PrivateKey::MlDsa*` / `SigningAlgorithm::MlDsa*` / `SigningAlgorithm::SlhDsa*` variants are now gated. The default build does not resolve `ml-dsa`, which removes RUSTSEC-2025-0144 (timing side-channel), CVE-2026-22705, CVE-2026-24850, and GHSA-h37v-hp6w-2pp8 from the default dep graph. `tests/pq_feature_gate.rs` asserts the invariant at CI time via exhaustive match + `cargo tree --no-default-features --invert ml-dsa`.
15
15
-**rustls-webpki CVE floor regression test** — supply-chain test asserts locked version >= 0.103.12.
16
16
17
17
### Fixed
@@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
24
24
-`test_exact_boundary_content_length_not_413` — off-by-one regression on `body == max_upload_size`.
-**No OpenSSL** --- Pure Rust crypto stack (`rsa`, `p256`, `p384`, `p521`, `ed25519-dalek`, `ml-dsa`, `sha2`, `aes-gcm`). TLS via `rustls` with `aws-lc-rs` backend.
489
+
-**No OpenSSL** --- Pure Rust crypto stack (`rsa`, `p256`, `p384`, `p521`, `ed25519-dalek`, `sha2`, `aes-gcm`; `ml-dsa` only with `--features pq-experimental`). TLS via `rustls` with `aws-lc-rs` backend.
-**Feature-gate ML-DSA behind `pq-experimental`** ([#72](https://github.com/rayketcham-lab/PKI-Signing-Service/issues/72)) --- default builds drop the `ml-dsa` / `slh-dsa` dependencies entirely. Operators who want PQC optin explicitly with `cargo build --features pq-experimental`.
560
+
-**Feature-gate ML-DSA behind `pq-experimental`** ([#72](https://github.com/rayketcham-lab/PKI-Signing-Service/issues/72)) --- ✅ **shipped** in the current `main`. Default builds drop the `ml-dsa` / `slh-dsa` dependencies entirely; post-quantum opt-in via `cargo build --features pq-experimental`. The `default_build_cargo_tree_omits_ml_dsa` test pins the invariant.
540
561
-**Decompose `signer.rs` / `verifier.rs` monoliths** ([#55](https://github.com/rayketcham-lab/PKI-Signing-Service/issues/55)) --- extract PFX loading and cert-validation helpers into dedicated modules without public-API churn.
541
-
-**ML-DSA timing-side-channel tracking** ([#42](https://github.com/rayketcham-lab/PKI-Signing-Service/issues/42)) --- follow the upstream `ml-dsa` 0.0.4 → stable release and drop the `cargo-audit` ignores as soon as a constant-time Decompose lands.
562
+
-**ML-DSA timing-side-channel tracking** ([#42](https://github.com/rayketcham-lab/PKI-Signing-Service/issues/42)) --- follow the upstream `ml-dsa` 0.0.4 → stable release and drop the `pq-experimental`-only `cargo-audit` ignores as soon as a constant-time Decompose lands.
0 commit comments