Skip to main content

Crate packslip

Crate packslip 

Source
Expand description

packslip: a vendor publishes one signed, machine-readable document per release that says what the artifacts are and how to verify them. Consumers pin one identity and get checksums, platform mapping, executables, provenance links, and a signed manifest without per-vendor logic or a registry entry.

The document is a sigstore bundle carrying an in-toto statement. It is signed keylessly with a CI job’s OIDC identity or with a long-lived Ed25519 key, and either way logged to Rekor (sigstore). The same shape carries a project’s release list. This crate holds the schema, the verifier, and the generator. See https://packslip.dev/release/v1/.

Everything is on by default. A consumer that only verifies takes the crate with default-features = false, which keeps model, [verify], and sigstore and drops the archive readers, the executable decoder, the signing path, and the CLI.

Re-exports§

pub use fingerprint::Fingerprint;
pub use manifest::Manifest;
pub use model::verify_report_schema;
pub use model::Artifact;
pub use model::Attestor;
pub use model::Bin;
pub use model::Evidence;
pub use model::Host;
pub use model::Identity;
pub use model::Predicate;
pub use model::ReleaseList;
pub use model::ReleaseListStatement;
pub use model::ReleaseRef;
pub use model::ReleaseStatus;
pub use model::Requires;
pub use model::Resource;
pub use model::ResourceIdentity;
pub use model::ResourceSource;
pub use model::Scheme;
pub use model::Selection;
pub use model::Source;
pub use model::Statement;
pub use model::Subject;
pub use model::command_name;
pub use model::github_list_path;
pub use model::list_url;
pub use model::select_artifact;
pub use model::select_resources;
pub use model::tag_version;
pub use sigstore::Signer;
pub use sigstore::Policy;
pub use sigstore::Trust;
pub use verify::Claimed;
pub use verify::ForgeError;
pub use verify::ForgeVerified;
pub use verify::Options;
pub use verify::Verified;
pub use verify::VerifiedArtifact;
pub use verify::VerifiedList;
pub use verify::VerifyReport;
pub use verify::peek_unverified;
pub use verify::verify;
pub use verify::verify_forge;
pub use verify::verify_forge_release_list;
pub use verify::verify_release_list;

Modules§

archive
Reading the archives packslip create is given, so the executables it records are the paths that are really inside them. Paths in a packslip count from the true archive root: a vendor that says --bin tool for an archive holding tool-1.2.3-linux-x64/tool gets that path written, not the bare name.
cli
Glue for the binary: turn a usage-rs parse result into either the parsed command or the help, version, or failure text a user expects, with clap’s exit codes.
create
Creating the statements: a release from its artifact files, and a release list from released packslips. Signing is sigstore::sign.
discovery
Bootstrap discovery and HTTPS transport. Fetched documents remain untrusted until the caller verifies the bundle, project, version, and list digest.
dsse
DSSE envelopes: the signing envelope in-toto statements travel in. A signature covers the pre-authentication encoding (PAE) of the payload type and payload, so the type cannot be swapped under a signature.
fingerprint
The signer fingerprint: a short, pasteable name for the repository a keyless project is signed from, such as ps1_snirenkjwr7m5ozgcufameodnm.
forge
Forge identity: a GitHub or GitLab project’s name locates it, and the forge’s immutable repository ID pins it.
install
Command-scoped bootstrap orchestration. Discovery never supplies policy; authenticated lists and releases are checked under the persistent scope lock.
install_extract
Whole-artifact extraction into a destination-local, private staging tree. No archive entry is trusted to choose an absolute path or permission mode.
install_fs
Locked, journaled replacement of an installation and its command exports.
install_host
Host preflight after deterministic artifact selection. Never execute an artifact, install dependencies, or switch builds to make a requirement pass.
install_launcher
Export declared commands without exposing the artifact’s runtime directory. Windows uses a small native executable with an embedded absolute UTF-16 target. Each launcher is a single transaction entry: no sidecar, symlink privilege, shell, or Developer Mode is required.
install_policy
Conjunctive bootstrap policy and explicit, context-bound trust transitions. Signature verification precedes every use of document policy. Filesystem replacement options have no place in this API.
linkage
What an artifact’s executables load from the host: the shared libraries named in an ELF’s DT_NEEDED entries, a Mach-O’s load commands, or a PE’s import table, read out of the artifact so that requires.libs is a fact about the bytes rather than a claim. Archives are decoded by crate::archive.
manifest
A release manifest for packslip create --manifest: what the command line cannot say per artifact. Executables that live at different paths in different archives, a format the file name gets wrong, host requirements, an artifact that runs anywhere, and the resources the release ships, all in one TOML file a vendor keeps in its repository.
minisign
minisign-compatible Ed25519 signatures, so a vendor can sign a packslip with the minisign they already use and a consumer can verify it with minisign -V as well as with this crate.
model
The packslip documents: in-toto statements whose predicates say what a release shipped (release/v1) and which releases a project has (releases/v1). See docs/spec/packslip.md.
sigstore
Signing and verification through sigstore. A packslip is a sigstore bundle carrying the statement as an in-toto DSSE envelope. It is signed either keylessly, with an ephemeral key certified by Fulcio for an OIDC identity, or with a long-lived Ed25519 key; either way the signature is logged to Rekor, and the bundle carries the log entry.
trust_root
Fresh Sigstore verification keys authenticated from a pinned TUF root.
verify
Verifying a packslip: the bundle against what the consumer pinned, then the statement, then the digests of any artifacts at hand. And the same for a release list.

Structs§

Digests
Every digest of a file, in one pass.

Functions§

digest_file
The sha256 of a file, lowercase hex, and its size.
digest_file_all
The sha256 and sha512 of a file, lowercase hex, and its size.