Skip to main content

A library to convert between Sigstore Bundles and PEP-740 Attestation objects

Project description

pypi-attestations

CI PyPI version Packaging status

A library to generate and convert between Sigstore Bundles and PEP 740 Attestation objects.

Installation

python -m pip install pypi-attestations

Usage as a command line tool

python -m pypi_attestations --help
usage: pypi-attestation [-h] [-v] [-V] COMMAND ...

Sign, inspect or verify PEP 740 attestations

positional arguments:
  COMMAND        The operation to perform
    sign         Sign one or more inputs
    verify       Verify one or more inputs
    inspect      Inspect one or more inputs

options:
  -h, --help     show this help message and exit
  -v, --verbose  run with additional debug logging; supply multiple times to
                 increase verbosity (default: 0)
  -V, --version  show program's version number and exit

Signing a package

# Generate a whl file
make package
python -m pypi_attestations sign dist/pypi_attestations-*.whl

Note: This will open a browser window to authenticate with the Sigstore OAuth flow.

Inspecting a PEP 740 Attestation

python -m pypi_attestations inspect dist/pypi_attestations-*.whl.publish.attestation

Warning: Inspecting does not mean verifying. It only prints the structure of the attestation.

Verifying a PEP 740 Attestation

python -m pypi_attestations verify --staging \
  --identity william@yossarian.net \
  test/assets/rfc8785-0.1.2-py3-none-any.whl

The attestation present in the test has been generated using the staging environment of Sigstore and signed by William.

Usage as a library

See the full API documentation here.

Signing and verification

Use these APIs to create a PEP 740-compliant Attestation object by signing a Python artifact (i.e: sdist or wheel files), and to verify an Attestation object against a Python artifact.

from pathlib import Path

from pypi_attestations import Attestation
from sigstore.oidc import Issuer
from sigstore.sign import SigningContext
from sigstore.verify import Verifier, policy

artifact_path = Path("test_package-0.0.1-py3-none-any.whl")

# Sign a Python artifact
issuer = Issuer.production()
identity_token = issuer.identity_token()
signing_ctx = SigningContext.production()
with signing_ctx.signer(identity_token, cache=True) as signer:
    attestation = Attestation.sign(signer, artifact_path)

print(attestation.model_dump_json())

# Verify an attestation against a Python artifact
attestation_path = Path("test_package-0.0.1-py3-none-any.whl.attestation")
attestation = Attestation.model_validate_json(attestation_path.read_bytes())
verifier = Verifier.production()
policy = policy.Identity(identity="example@gmail.com", issuer="https://accounts.google.com")
attestation.verify(verifier, policy, attestation_path)

Low-level model conversions

These conversions assume that any Sigstore Bundle used as an input was created by signing a distribution file.

from pathlib import Path
from pypi_attestations import Attestation
from sigstore.models import Bundle

# Sigstore Bundle -> PEP 740 Attestation object
bundle_path = Path("test_package-0.0.1-py3-none-any.whl.sigstore")
with bundle_path.open("rb") as f:
    sigstore_bundle = Bundle.from_json(f.read())
attestation_object = Attestation.from_bundle(sigstore_bundle)
print(attestation_object.model_dump_json())

# PEP 740 Attestation object -> Sigstore Bundle
attestation_path = Path("attestation.json")
with attestation_path.open("rb") as f:
    attestation = Attestation.model_validate_json(f.read())
bundle = attestation.to_bundle()
print(bundle.to_json())

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pypi_attestations-0.0.11.tar.gz (14.6 kB view details)

Uploaded Source

Built Distribution

pypi_attestations-0.0.11-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

Details for the file pypi_attestations-0.0.11.tar.gz.

File metadata

  • Download URL: pypi_attestations-0.0.11.tar.gz
  • Upload date:
  • Size: 14.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for pypi_attestations-0.0.11.tar.gz
Algorithm Hash digest
SHA256 b730e6b23874d94da0f3817b1f9dd3ecb6a80d685f62a18ad96e5b0396149ded
MD5 f192b02e44d22fcafdca5264b957daad
BLAKE2b-256 7ef1c91a9a7ce29017d213ed02ed81ecbd98845e71e1e4dbc9ea41a186648819

See more details on using hashes here.

File details

Details for the file pypi_attestations-0.0.11-py3-none-any.whl.

File metadata

File hashes

Hashes for pypi_attestations-0.0.11-py3-none-any.whl
Algorithm Hash digest
SHA256 e74329074f049568591e300373e12fcd46a35e21723110856546e33bf2949efa
MD5 921abf6e8e0d7544ff463453e0b17fec
BLAKE2b-256 a4f33950d0f940b1200739a1e79034f99cf585014ce810feaf96bbe98fd8a132

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page