Help us shape the future of Go! Take the 2026 Go Developer Survey

verifier

package
v0.0.35 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 28, 2026 License: Apache-2.0 Imports: 35 Imported by: 2

Documentation

Overview

Package verifier verifies Sigstore signatures and attestations on OCI artifacts.

Two entry points cover the two trust flows:

  • New builds a Sigstore verifier with a live TUF-refreshed trust root for verifying MCP server images against registry-declared provenance (Sigstore.VerifyServer).
  • RetrieveBundles, VerifyBundle, VerifyBundleWithKey, and VerifyBundleOffline expose the bundle-level building blocks for consumers that manage their own trust decisions — retrieving the bundles attached to an artifact, verifying them against keyless (Fulcio) or key-pair material, binding an expected Identity into the verification policy, and re-verifying stored bundles offline against the embedded trust root.

Verifying a retrieved bundle

bundles, err := verifier.RetrieveBundles(ctx, imageRef, keychain)
// handle err; errors.Is(err, verifier.ErrNoBundles) means unsigned
tm, _ := verifier.OfflineTrustedMaterial()
opts, _ := verifier.DefaultVerifierOptions()
result, err := verifier.VerifyBundle(bundles[0], tm, nil, opts...)
// errors.Is(err, verifier.ErrVerificationFailed) means signed but invalid
identity, _ := verifier.IdentityFromResult(result)
// store bundles[0].Raw and identity; later:
_, err = verifier.VerifyBundleOffline(storedRaw, "sha256:"+digestHex, &identity)

Key-signed bundles (Bundle.HasCertificate() == false, the "cosign sign --key" layout) carry no certificate identity; verify them with VerifyBundleWithKey at retrieval time and VerifyBundleOfflineWithKey for stored Raw bytes — both take the signer's PEM public key.

Stability

This package is Alpha stability. The API may change without notice.

Package verifier provides a client for verifying artifacts using sigstore

Index

Constants

View Source
const (
	MediaTypeOCIEmptyV1JSON            = "application/vnd.oci.empty.v1+json"
	MediaTypeCosignSimpleSigningV1JSON = "application/vnd.dev.cosign.simplesigning.v1+json"
	MediaTypeSigstoreBundleV03JSON     = "application/vnd.dev.sigstore.bundle.v0.3+json"
)

OCI and Sigstore media type constants used when inspecting referrer manifests.

View Source
const (
	// TrustedRootSigstoreGitHub is the GitHub trusted root repository for sigstore (used for private repos, Enterprise)
	TrustedRootSigstoreGitHub = "tuf-repo.github.com"
	// TrustedRootSigstorePublicGoodInstance is the public trusted root repository for sigstore
	TrustedRootSigstorePublicGoodInstance = "tuf-repo-cdn.sigstore.dev"
)
View Source
const DigestAlgorithmSHA256 = "sha256"

DigestAlgorithmSHA256 is the digest algorithm name used throughout the Sigstore bundle formats this package handles.

Variables

View Source
var (
	// ErrProvenanceNotFoundOrIncomplete is returned when there's no provenance info (missing .sig or attestation) or
	// has incomplete data
	ErrProvenanceNotFoundOrIncomplete = errors.New("provenance not found or incomplete")

	// ErrProvenanceServerInformationNotSet is returned when the provenance information for a server is not set
	ErrProvenanceServerInformationNotSet = errors.New("provenance server information not set")

	// ErrImageNotSigned is returned when no signatures or attestations are found for the image
	ErrImageNotSigned = errors.New("image is not signed")

	// ErrProvenanceMismatch is returned when the image is signed but no bundle matches the expected provenance
	ErrProvenanceMismatch = errors.New("image provenance does not match")

	// MaxAttestationsBytesLimit is the maximum number of bytes we're willing to read from the attestation endpoint
	// We'll limit this to 10mb for now
	MaxAttestationsBytesLimit int64 = 10 * 1024 * 1024
)
View Source
var ErrNoBundles = errors.New("no sigstore bundles found for artifact")

ErrNoBundles is returned by RetrieveBundles when the artifact carries no Sigstore signature or attestation in any supported layout — keyless (certificate-bearing), key-signed ("cosign sign --key"), or attestation — i.e. the artifact is unsigned as far as this package can tell.

View Source
var ErrVerificationFailed = errors.New("sigstore bundle verification failed")

ErrVerificationFailed wraps every cryptographic verification failure returned by the VerifyBundle* functions, so callers can distinguish "signed but failed verification" from malformed input with errors.Is instead of matching sigstore-go's (unstable) error strings.

Functions

func DefaultVerifierOptions added in v0.0.35

func DefaultVerifierOptions() ([]verify.VerifierOption, error)

DefaultVerifierOptions returns the verifier options matching the Sigstore public-good instance trust root (SCT, transparency log, and observer timestamp requirements). Pass these to VerifyBundle together with OfflineTrustedMaterial (or the live public-good root).

func OfflineTrustedMaterial added in v0.0.35

func OfflineTrustedMaterial() (root.TrustedMaterial, error)

OfflineTrustedMaterial returns trusted material for the Sigstore public-good instance built entirely from the trusted root embedded in this package — no network access, no TUF refresh. The embedded root is a point-in-time snapshot: key rotations in the public-good instance require a package update to pick up. This cuts both ways — newly rotated-in keys are unknown (verification of fresh signatures fails until the snapshot is updated), and a key rotated out BECAUSE OF COMPROMISE keeps being trusted here until a new release ships and consumers bump. Callers that need live freshness or timely compromise revocation should use New (which performs a TUF fetch) instead; offline verification trades that for hermeticity. See tufroots/README.md for the snapshot's provenance.

func PublicKeyMaterial added in v0.0.35

func PublicKeyMaterial(pubKeyPEM []byte) (root.TrustedMaterial, error)

PublicKeyMaterial returns trusted material that verifies bundles signed with the private counterpart of the given PEM-encoded public key (the cosign key-pair flow, as opposed to keyless/Fulcio). The key is trusted without validity-period bounds: key-signed bundles carry no certificate whose lifetime could scope it.

func VerifyBundle added in v0.0.35

func VerifyBundle(
	b Bundle,
	tm root.TrustedMaterial,
	expected *Identity,
	verifierOpts ...verify.VerifierOption,
) (*verify.VerificationResult, error)

VerifyBundle verifies a retrieved bundle against the given trusted material. When expected is non-nil, the identity is bound into the Sigstore verification policy itself (certificate SAN and issuer must match) rather than compared after the fact; a nil expected — the trust-on-first-use case — verifies the chain of trust only, and the caller records the identity from the returned result.

verifierOpts configure the verifier and MUST match the trusted material: pass DefaultVerifierOptions() with public-good material (SCT + transparency log + observer timestamps), and verify.WithNoObserverTimestamps() with PublicKeyMaterial (key-signed bundles carry no certificate transparency or Fulcio timestamps). Requiring the options explicitly prevents public-good defaults being fed to a different root, which surfaces as confusing sigstore-go internals rather than a clear mismatch.

func VerifyBundleOffline added in v0.0.35

func VerifyBundleOffline(
	rawBundle []byte,
	artifactDigest string,
	expected *Identity,
) (*verify.VerificationResult, error)

VerifyBundleOffline re-verifies a stored bundle (the Raw form produced by RetrieveBundles or a signing flow) against the artifact digest ("sha256:<hex>"), using only the embedded trusted root — no network. See OfflineTrustedMaterial for the freshness trade-off. expected behaves as in VerifyBundle.

func VerifyBundleOfflineWithKey added in v0.0.35

func VerifyBundleOfflineWithKey(
	rawBundle []byte,
	artifactDigest string,
	pubKeyPEM []byte,
) (*verify.VerificationResult, error)

VerifyBundleOfflineWithKey re-verifies a stored key-signed bundle (the Raw form of a bundle whose HasCertificate is false) against the artifact digest ("sha256:<hex>") and the given PEM public key. Key verification needs no trust root or network in the first place; this entry point only adds the parse step for stored bundles.

func VerifyBundleWithKey added in v0.0.35

func VerifyBundleWithKey(b Bundle, pubKeyPEM []byte) (*verify.VerificationResult, error)

VerifyBundleWithKey verifies a bundle signed with a plain key pair (the cosign --key flow) against the given PEM public key. Key-signed bundles carry no certificate, so there is no identity to bind — trust is the key itself — and no transparency-log or timestamp material to require.

Types

type Bundle added in v0.0.35

type Bundle struct {
	// Parsed is the decoded bundle.
	Parsed *bundle.Bundle
	// Raw is the bundle's canonical JSON serialization.
	Raw []byte
	// DigestAlgo is the algorithm of the artifact digest the bundle signs
	// (e.g. "sha256").
	DigestAlgo string
	// DigestHex is the hex-encoded artifact digest the bundle signs.
	DigestHex string
}

Bundle is a Sigstore bundle retrieved for an artifact, in both parsed and serialized form. Raw is the canonical JSON encoding, suitable for durable storage and later re-verification — with VerifyBundleOffline for keyless (certificate-bearing) bundles, or VerifyBundleOfflineWithKey for bundles reconstructed from the key-signed cosign layout (HasCertificate tells the two apart; key-signed bundles carry a "cosign-keypair" public-key hint instead of a certificate).

func RetrieveBundles added in v0.0.35

func RetrieveBundles(ctx context.Context, imageRef string, keychain authn.Keychain) ([]Bundle, error)

RetrieveBundles fetches the Sigstore bundles attached to imageRef, trying both layouts this package understands: a cosign-style signature manifest (the "sha256-<hex>.sig" tag) and attestation manifests. It returns ErrNoBundles when the artifact has no discoverable signature material — the caller's signal that the artifact is unsigned.

func (Bundle) HasCertificate added in v0.0.35

func (b Bundle) HasCertificate() bool

HasCertificate reports whether the bundle carries a signing certificate — i.e. it came from a keyless (Fulcio) flow and verifies with VerifyBundle; a false result is the key-signed layout, verifying with VerifyBundleWithKey / VerifyBundleOfflineWithKey.

type Identity added in v0.0.35

type Identity struct {
	// SignerIdentity is the certificate's subject identity. For
	// certificates issued through GitHub Actions tokens this is the
	// workflow path relative to the repository (see
	// signerIdentityFromCertificate); otherwise it is the certificate SAN
	// verbatim (a URI, email, or SPIFFE ID).
	SignerIdentity string
	// CertIssuer is the OIDC issuer that authenticated the signer.
	CertIssuer string
	// SourceRepositoryURI is the source repository recorded in the Fulcio
	// certificate extensions, when present.
	SourceRepositoryURI string
}

Identity is the signer identity extracted from a verified Sigstore bundle.

func IdentityFromResult added in v0.0.35

func IdentityFromResult(r *verify.VerificationResult) (Identity, error)

IdentityFromResult extracts the signer Identity from a verification result.

type Result

type Result struct {
	IsSigned   bool `json:"is_signed"`
	IsVerified bool `json:"is_verified"`
	verify.VerificationResult
}

Result is the result of the verification

type Sigstore

type Sigstore struct {
	// contains filtered or unexported fields
}

Sigstore is the sigstore verifier

func New

func New(provenance *registry.Provenance, keychain authn.Keychain) (*Sigstore, error)

New creates a new Sigstore verifier

func (*Sigstore) GetVerificationResults

func (s *Sigstore) GetVerificationResults(
	imageRef string,
) ([]*verify.VerificationResult, error)

GetVerificationResults returns the verification results for the given image reference

func (*Sigstore) VerifyServer

func (s *Sigstore) VerifyServer(imageRef string, provenance *registry.Provenance) error

VerifyServer verifies the server information for the given image reference

func (*Sigstore) WithKeychain

func (s *Sigstore) WithKeychain(keychain authn.Keychain) *Sigstore

WithKeychain sets the keychain for authentication

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL