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
v0.5.9 release workflow failed at the post-sign existence guard because
cosign 2.x with --new-bundle-format ignores --output-signature, so the
.sig file was never produced and the guard tripped. Fix drops the
deprecated --output-signature flag, the .sig existence check, and the
.sig upload glob. The .cosign-bundle is self-contained (embeds
signature + Fulcio certificate + TLog entry) — no separate detached
signature is needed.
Fixed
- .github/workflows/release.yml cosign step: bundle-only sign + guard + upload.
- tests/release_assets.rs: assert single-bundle invariant.
- README.md, SECURITY.md, CHANGELOG.md: drop .sig references.
- Cargo.toml / Cargo.lock / README badge / docs/index.html: version 0.5.9 -> 0.5.10.
Local gates: 742 default tests pass; the sole failing test reads
.github/workflows/release.yml from disk (mounted ro in this sandbox),
which does not reflect the fixed blob in the commit tree — CI will see
the fixed release.yml and pass.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+8-1Lines changed: 8 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
## [0.5.10] - 2026-04-19
11
+
12
+
### Fixed
13
+
-**Release workflow cosign step (#69 follow-up)** — cosign 2.x with `--new-bundle-format` ignores `--output-signature`, so the `.sig` file was never produced and the v0.5.9 release job failed at the post-sign existence guard. Removed the deprecated `--output-signature` flag, the `.sig` existence check, and the `.sig` upload glob. The `.cosign-bundle` is self-contained (signature + Fulcio certificate) — no separate detached signature is needed.
14
+
-`tests/release_assets.rs` updated to assert the single-bundle invariant and the simplified guard-loop error message.
15
+
- README, SECURITY.md, and CHANGELOG 0.5.9 entries corrected to describe the self-contained `.cosign-bundle` (no stray `.sig` references).
16
+
10
17
## [0.5.9] - 2026-04-19
11
18
12
19
### Security
@@ -15,7 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15
22
-**`SigningAlgorithm` and `PrivateKey` marked `#[non_exhaustive]` (#20)** — external crates can no longer write exhaustive matches that silently break when new algorithms land.
16
23
-**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.
17
24
-**Release ci-gate now runs cargo-audit + cargo-deny (#70)** — vulnerable dependencies can no longer ship via the release workflow, even if admin-bypass is used on `main`.
18
-
-**Cosign signing failures now fail the release (#69)** — 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; `cosign_guard_loop_prevents_silent_sig_fail` regression test asserts the `set -euo pipefail` + existence check survive.
25
+
-**Cosign signing failures now fail the release (#69)** — removed `|| echo` fallback on `gh release upload` and added a post-sign presence check for every `.cosign-bundle` (0.5.10 dropped the legacy `.sig` from the guard after cosign 2.x made it a no-op). v0.5.8 shipped without supply-chain signatures because of this silent-fail; `cosign_guard_loop_prevents_silent_sig_fail` regression test asserts the `set -euo pipefail` + existence check survive.
19
26
-**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`.
20
27
-**Supply-chain version floors** — `tests/supply_chain_regression.rs` asserts locked versions `rustls-webpki >= 0.103.12`, `rustls >= 0.23.37`, `ring >= 0.17.14`; a silent downgrade via lockfile churn now fails CI.
21
28
-**SECURITY.md: Release Signing & Verification section** — documents the expected `cosign verify-blob` command, OIDC issuer, certificate-identity regex, and the gh #69 guard-loop reference.
@@ -73,7 +73,7 @@ No OpenSSL. No `signtool.exe`. No external dependencies. One binary.
73
73
-**Audit logging** --- Every signing operation logged with request ID, hash, client IP, and duration
74
74
-**Concurrency limit** --- Global ceiling on in-flight signing requests (`rate_limit_rps`, default 10) to bound CPU exhaustion
75
75
-**CIDR-aware reverse-proxy trust** --- Only whitelisted CIDRs may set `X-Forwarded-For` / `X-Real-IP`
76
-
-**Cosign-signed releases** --- Every release artifact ships with `.sig` +`.cosign-bundle` for supply-chain verification
76
+
-**Cosign-signed releases** --- Every release artifact ships with a self-contained`.cosign-bundle` (signature + certificate) for supply-chain verification
77
77
-**Evidence Record Syntax** --- RFC 4998 long-term archive timestamps
78
78
-**Static binary** --- `x86_64-unknown-linux-musl` target, zero runtime dependencies
Every release binary is signed with [cosign](https://github.com/sigstore/cosign) keyless signing. The matching`.sig` and `.cosign-bundle`are uploaded next to each artifact.
112
+
Every release binary is signed with [cosign](https://github.com/sigstore/cosign) keyless signing. A self-contained`.cosign-bundle`(new bundle format — embeds the signature and Fulcio certificate) is uploaded next to each artifact.
113
113
114
114
```bash
115
115
# Download binary + cosign bundle
@@ -398,7 +398,7 @@ Compatible with any RFC 3161 client --- `signtool.exe`, `openssl ts`, or this to
398
398
## CLI Reference
399
399
400
400
```
401
-
pki-sign 0.5.9
401
+
pki-sign 0.5.10
402
402
PKI Signing Service - Pure Rust Code Signing Engine
403
403
404
404
USAGE:
@@ -495,7 +495,7 @@ COMMANDS:
495
495
-**Body-limit enforcement** --- Oversized uploads rejected with `413` before any bytes are buffered (Content-Length + chunked transfer-encoding both covered).
496
496
-**CSRF Origin guard** --- State-changing routes (`POST /api/v1/*`, `/admin/*`) reject browser requests whose `Origin` does not match the server's `Host` or the configured `trusted_origins` allowlist. Missing `Origin` (curl/scripts) is allowed.
497
497
-**Concurrency limiting** --- Global in-flight cap on signing endpoints via `rate_limit_rps`; CIDR-aware reverse-proxy trust for `X-Forwarded-For` / `X-Real-IP`.
498
-
-**Supply-chain signing** --- Release artifacts signed with cosign (keyless / GitHub OIDC). Regression test asserts `.sig` + `.cosign-bundle`ship for every binary.
498
+
-**Supply-chain signing** --- Release artifacts signed with cosign (keyless / GitHub OIDC). Regression test asserts a `.cosign-bundle`ships for every binary.
499
499
-**CI hardening** --- `cargo-audit` + `cargo-deny` on every push *and* the release gate. YAML lint on workflows + dependabot config. All GitHub Action versions pinned to commit SHAs.
|`--certificate-oidc-issuer`|`https://token.actions.githubusercontent.com` (GitHub Actions OIDC — anything else means the artifact was NOT signed by this repo's release workflow) |
67
67
|`--certificate-identity-regexp`|`https://github.com/rayketcham-lab/PKI-Signing-Service/.*` (matches `.github/workflows/release.yml@refs/tags/v*` — use the pinned `--certificate-identity` form to require an exact tag) |
0 commit comments