provenance/Cargo.toml
[package]
name = "holger-provenance"
version.workspace = true
edition = "2021"
authors = ["Ignalina ApS", "Vetra Automation AB"]
description = "Holger's provenance verifier: DSSE + in-toto + SLSA provenance, Sigstore bundles, PyPI PEP 740 attestations, npm provenance and cosign image signatures and attestations, verified OFFLINE against a trust policy and a pinned Sigstore trust root that crosses the airgap as a signed holger.update-bundle/v1. Network-free."
license = "AGPL-3.0-only"
repository = "https://git.gunnar.rs/nordisk/holger"
# crates.io takes at most 10 MiB: the 11 MB Wolfi APKINDEX fixture (and the one test that reads it) stay in the repository;
# so does the dwarf release bundle (350 KB) and its test.
exclude = ["tests/fixtures/wolfi/os/", "tests/apk_wolfi.rs", "tests/fixtures/slsa-dwarf/", "tests/slsa_dwarf_release.rs"]
[lib]
name = "holger_provenance"
# NETWORK-FREE. No HTTP client, no DNS: everything this crate checks, it checks
# against bytes it was handed and keys it was configured with.
[dependencies]
holger-errcode = { version = "3.0.0", path = "../errcode" }
# The pinned trust root crosses the airgap as a signed update bundle, the way the
# intel bundle does (product `holger.sigstore-trust/v1`).
holger-update-bundle = { version = "3.0.0", path = "../update-bundle" }
# The byte-exact DSSE v1 PAE the rest of Holger signs with.
znippy-common = { version = "0.10.4", default-features = false, features = ["sign"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
thiserror = "2"
base64 = "0.23"
sha2 = "0.11"
hex = "0.4"
# Signature verification: ECDSA P-256 / P-384, Ed25519 and RSA, pure verify paths.
ring = "0.17"
x509-parser = "0.18"
regex = "1"
chrono = { version = "0.4", features = ["serde", "clock"] }
anyhow = "1"
# APK indexes and packages (Wolfi, Chainguard, Alpine): concatenated gzip streams of tars.
flate2 = "1"
tar = "0.4"
# Maven Central's detached OpenPGP `.asc` signatures (rpgp, pure Rust). Exact pin,
# released 2026-10-03; no default features, so no bzip2 (C) is linked. OPTIONAL
# (T9b): it is about 96 crates, so only the `pgp` feature below links it.
pgp = { version = "=0.21.0", default-features = false, optional = true }
[features]
# `pgp` — the OpenPGP verifier (`src/pgp/rpgp.rs`): Maven Central's `.asc` against the
# keys a trust bundle pins as `pgp-keys/<name>` or a floor key of `alg: openpgp`.
# OFF by default (T9b, 2026-10-25): rpgp put the default `cargo install holger` at 440
# crates against its bound of 345. server-lib's and the CLI's `maven-pgp` turn it on,
# and the CLI's `online` and `full` (which build the Maven pull-through) carry it. Without
# it every pgp pin is refused at load by name, `[provenance-pgp-not-built]`, and an
# `.asc` is unverified, never a pass (`tests/pgp_build_feature.rs`).
pgp = ["dep:pgp"]
[dev-dependencies]
ron = "0.12"
# Test-only PKI: a minted Fulcio-like CA, Rekor key and CT log, never a committed key.
rcgen = "0.14"
tempfile = "3"