Skip to content

fix: SPKI cert pinning + wasmtime 29→43 + Rust 1.91#82

Merged
avrabe merged 1 commit intomainfrom
fix/spki-pinning-wasmtime-upgrade
Apr 14, 2026
Merged

fix: SPKI cert pinning + wasmtime 29→43 + Rust 1.91#82
avrabe merged 1 commit intomainfrom
fix/spki-pinning-wasmtime-upgrade

Conversation

@avrabe
Copy link
Copy Markdown
Contributor

@avrabe avrabe commented Apr 14, 2026

Summary

Two infrastructure fixes that resolve recurring CI failures:

SPKI Certificate Pinning

  • Problem: Sigstore rotates TLS leaf certs regularly, breaking hardcoded SHA256(cert_DER) pins every time
  • Fix: Switch to SHA256(SPKI_DER) pinning — pins survive cert renewals when the public key stays the same (standard approach, used by Chrome HPKP)
  • Pin both leaf SPKI and Google Trust Services WR3 intermediate CA SPKI
  • Tests updated to generate real X.509 certs via rcgen for SPKI extraction

Wasmtime 29 → 43

  • Problem: 7 CVEs accumulated against wasmtime 29 (all in deny.toml ignore list)
  • Fix: Upgrade to wasmtime 43.0.1 (latest), eliminating all 7 CVEs
  • Rust toolchain bumped 1.90.0 → 1.91.0 (wasmtime 43 MSRV)
  • bindgen! macro updated for wasmtime 43 API (HasSelf<T> dispatch)
  • deny.toml cleaned: 7 wasmtime + 2 unmaintained ignores removed, only rustls-pemfile remains

Test plan

  • cargo build — clean
  • cargo test — 766 passed, 0 failed
  • cargo build --features runtime — wasmtime 43 compiles
  • CI pipeline (should fix Air-Gapped E2E, Keyless, Sign & Verify, Cargo Audit/Deny)

🤖 Generated with Claude Code

SPKI pinning (fixes recurring cert rotation breakage):
- Switch from SHA256(cert_DER) to SHA256(SPKI_DER) pinning
- SPKI pins survive certificate renewals when key stays same
- Pin both leaf SPKI and GTS WR3 intermediate CA SPKI
- Update all tests to use real X.509 certs (rcgen) for SPKI extraction

Wasmtime upgrade (eliminates 7 CVEs):
- wasmtime 29 → 43 (latest)
- Rust toolchain 1.90.0 → 1.91.0 (wasmtime 43 MSRV)
- Update bindgen! macro options for wasmtime 43 API
- Update add_to_linker to use HasSelf<T> type dispatch

deny.toml cleanup:
- Remove 7 wasmtime CVE ignores (fixed in v43)
- Remove 2 unmaintained crate ignores (fxhash, paste — no longer transitive)
- Only RUSTSEC-2025-0134 (rustls-pemfile) remains

All 766 tests passing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 14, 2026

Codecov Report

❌ Patch coverage is 91.30435% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/lib/src/signature/keyless/cert_pinning.rs 91.30% 4 Missing ⚠️

📢 Thoughts on this report? Let us know!

@avrabe avrabe merged commit 9bed4fe into main Apr 14, 2026
20 of 21 checks passed
@avrabe avrabe deleted the fix/spki-pinning-wasmtime-upgrade branch April 14, 2026 20:36
@avrabe avrabe mentioned this pull request Apr 14, 2026
2 tasks
avrabe added a commit that referenced this pull request Apr 21, 2026
Bumping to 43 breaks the example's `with_context` usage —
wasmtime 43's `wasmtime::Error` no longer implements anyhow's
`StdError`, so `.with_context(...)` from anyhow::Context
doesn't apply. The earlier PR #82 that bumped the main lib to
43 left this example on 37 for this reason.

Properly bumping the example requires a port (use wasmtime's
own error helpers or `map_err` explicitly). That port is out
of scope for this pipeline-scaffolding PR.

Trace: skip

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
avrabe added a commit that referenced this pull request Apr 21, 2026
* chore: add Mythos bug-hunt pipeline + AGENTS.md restructure

Scaffolds scripts/mythos/ with a four-prompt pipeline (rank,
discover, validate, emit) plus portable HOWTO.md, modeled on
Anthropic's Claude Mythos (April 2026). Adds a pre-release
Mythos delta-pass step scoped by release type (tier-5 only for
patches, tier-5+4 for minors, full tier-5 for majors/LTS).

Migrates project guidance from CLAUDE.md to AGENTS.md (the
tool-neutral canonical location read by Cursor, OpenCode, Claude
Code, etc.) and slims CLAUDE.md to a thin pointer. Documents
Kani's std::io OOM limitation so future finding reports treat
CBMC OOM as "tool cannot reach" rather than "verification
succeeded".

Bumps examples/wasmtime-loader wasmtime 37 -> 43 to clear the
April 2026 CVE patch floor (CVE-2026-34941, 34942, 34943, 35195,
et al.).

No runtime code change.

Trace: skip

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* revert: leave examples/wasmtime-loader on wasmtime 37.0

Bumping to 43 breaks the example's `with_context` usage —
wasmtime 43's `wasmtime::Error` no longer implements anyhow's
`StdError`, so `.with_context(...)` from anyhow::Context
doesn't apply. The earlier PR #82 that bumped the main lib to
43 left this example on 37 for this reason.

Properly bumping the example requires a port (use wasmtime's
own error helpers or `map_err` explicitly). That port is out
of scope for this pipeline-scaffolding PR.

Trace: skip

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant