Split off from #219 / REQ-23 (real offline keyless verification), which landed the offline engine for AirGappedVerifier but deliberately deferred this second public API.
Ask
container::bundle::SigstoreBundle (src/lib/src/container/bundle.rs) is currently export-only (serialization adapter so external cosign verify-blob --bundle can consume wsc signatures). There is no in-library verify — CosignDelegator only shells out to the cosign binary and only handles registry image refs.
Add SigstoreBundle::verify(&self, trust_bundle: &airgapped::TrustBundle, artifact_digest: &[u8; 32]) -> Result<...> that decodes the bundle's x509_certificate_chain + tlog_entries, reconstructs a KeylessSignature-equivalent, and delegates to the same offline engine REQ-23 built (CertificatePool::from_pem_authorities + RekorKeyring::from_pem_logs + P-256 verify_prehash + verify_rekor_body_binds_to_bundle). It must reuse that engine, not reimplement it.
Why separate from REQ-23
It's a second public API on a different type with its own DER-decode/bundle-format path; keeping it out kept REQ-23's verifier change focused and reviewable. Scoped as its own requirement so the bundle-format edge cases (v0.3 protobuf JSON shape, tlog entry selection) get their own tests.
Depends on
REQ-23 (merged, main 255a597) — the offline engine this delegates to.
Split off from #219 / REQ-23 (real offline keyless verification), which landed the offline engine for
AirGappedVerifierbut deliberately deferred this second public API.Ask
container::bundle::SigstoreBundle(src/lib/src/container/bundle.rs) is currently export-only (serialization adapter so externalcosign verify-blob --bundlecan consume wsc signatures). There is no in-library verify —CosignDelegatoronly shells out to the cosign binary and only handles registry image refs.Add
SigstoreBundle::verify(&self, trust_bundle: &airgapped::TrustBundle, artifact_digest: &[u8; 32]) -> Result<...>that decodes the bundle'sx509_certificate_chain+tlog_entries, reconstructs aKeylessSignature-equivalent, and delegates to the same offline engine REQ-23 built (CertificatePool::from_pem_authorities+RekorKeyring::from_pem_logs+ P-256 verify_prehash +verify_rekor_body_binds_to_bundle). It must reuse that engine, not reimplement it.Why separate from REQ-23
It's a second public API on a different type with its own DER-decode/bundle-format path; keeping it out kept REQ-23's verifier change focused and reviewable. Scoped as its own requirement so the bundle-format edge cases (v0.3 protobuf JSON shape, tlog entry selection) get their own tests.
Depends on
REQ-23 (merged, main 255a597) — the offline engine this delegates to.