Verify release files offline against one trusted root file

Standard

provenance

Change type

  • Add new standard
  • Modify existing standard (prose only)
  • Modify existing standard's check.sh (add, remove, or change an assertion)
  • Modify existing standard's templates
  • Status transition: introduced -> enforcing
  • Status transition: enforcing -> archived
  • Retire / archive

What does this MR do and why?

I want the Airgap section to verify against one trusted_root.json, because the copied ~/.sigstore/root/ it documents stops working offline, and the producer input it names does not exist.

sequenceDiagram
  participant C as Connected host
  participant T as Sigstore TUF repository
  participant E as Enclave
  C->>T: cosign initialize
  T-->>C: trusted_root.json
  C->>C: verify-blob on binary.bundle, exact tag identity
  C->>E: binary, binary.sigstore.json, trusted_root.json
  E->>E: verify-blob-attestation with --trusted-root
  • One file. cosign initialize fetches trusted_root.json through The Update Framework (TUF) repository Sigstore publishes. A copied cache refreshes once its metadata expires (sigstore-go options.go:49-54), and that metadata is re-signed at least every three days.
  • The attestation crosses. --trusted-root needs the new bundle format (verify_blob.go:206-207). binary@6 writes the legacy .bundle; attest@6 writes the new one, checked against the binary's digest (verify_blob_attestation.go:239-243).
  • cosign 2.6.5, or 3.1.3 on v3. Earlier releases ignore the identity flags on a crafted legacy bundle (GitHub security advisory GHSA-fx35-mq7g-6g98).
  • Exact identity, //.gitlab-ci.yml@refs/tags/vX.Y.Z (format), not a regular expression that accepts any tag.

Failure mode this addresses

The documented offline path fails once the copied metadata expires, and extra-assets@6 has no include_sigstore_trust_bundle input. A signed bash utility, gitlab-com/public-sector/utilities/periscope, needs this path for its first release.

Assertion deltas

None. check.sh is unchanged.

Consumer impact

None fail. Consumers following the old section move to the commands above.

Status transition

None.

Test plan

  • just guard passes (assertions use only closed primitives)
  • just check-one STANDARD=provenance passes against this repo (SKIP, no *.lock.toml); just ship green, TOTAL: 21 standard(s) passed, 0 exempt, 0 failed
  • Ran check.sh against at least one consumer repo of each applicable shape (binary-shipping, lab); results match expectations: not applicable, prose only
  • CHANGELOG updated

An AI tool wrote this change and ran the checks above.

Reviewer checklist

  • SKILL.md frontmatter is valid YAML (name, description, status, [enforced_since])
  • check.sh sources ../../_lib.sh correctly
  • check.sh calls report at the end
  • Templates/ directory present where applicable
  • Standard appears in README's contracts table
  • Standard appears in the rendered site's /standards/ index

Merge request reports

Loading
Loading