Skip to main content

The wallet-relying-party toolkit for personal-data services — verify EUDI wallet presentations (SD-JWT VC) in Python

Project description

vouchkit

The wallet-relying-party toolkit for personal-data services.

vouchkit lets a service become a (wallet-)relying party for the EU Digital Identity Wallet: request and verify wallet presentations with a small, auditable, pure-Python core — built for teams that need to accept the EUDI wallet without adopting a JVM stack or a vendor runtime.

Status: pre-alpha. The SD-JWT VC verification core and the integrator test kit are implemented and adversarially tested. OpenID4VP transport, the Digital Credentials API front-end, and trust-anchor resolution are in active development. Do not use in production yet — but do try it, file issues, and break it.

Why vouchkit

  • Easy to integrate. Pure Python, pip install vouchkit, one runtime dependency (cryptography). A FastAPI/ASGI integration layer and a language-agnostic sidecar are on the roadmap — one engine, two skins.
  • Easy to maintain. Scoped to what the EUDI ARF actually mandates for relying parties (HAIP profile: ES256, sha-256 disclosures, KB-JWT). No speculative surface.
  • Easy to verify programmatically. The test kit ships as public API: mint known-good and deliberately broken presentations in your own CI — no wallet, no trust list, no network. Failures are precise, typed exceptions. Adversarial tests are the spine of the suite.
  • Nothing that blocks a review. Apache-2.0 only (the whole dependency tree), DCO instead of a CLA, no telemetry, and a logging discipline that never touches personal data.

Quick look

from vouchkit import verify_sd_jwt_vc

result = verify_sd_jwt_vc(
    presentation,              # <issuer-jwt>~<disclosure>*~<kb-jwt> from the wallet
    issuer_jwk,                # the issuer key you trust (trust-anchor layer coming)
    expected_aud="https://rp.example",
    expected_nonce=session_nonce,
)
result.claims                  # only what the user disclosed
result.key_binding_verified    # True — the wallet proved holder binding

And in your test suite, no wallet required:

from vouchkit.testkit import TestIssuer, TestHolder

issuer, holder = TestIssuer(), TestHolder()
jwt, disclosures = issuer.issue({"given_name": "Ada"}, holder_jwk=holder.public_jwk)
presentation = holder.present(jwt, disclosures, ["given_name"], aud=AUD, nonce=NONCE)

Vocabulary (per the EUDI Architecture and Reference Framework)

Your service becomes a relying party; the thing you deploy is a relying-party instance; its core is a verifier for PID/(Q)EAA attestations in SD-JWT VC (and later ISO mdoc) format, requested over OpenID4VP.

Roadmap

  1. ✅ SD-JWT VC verification core + integrator test kit
  2. OpenID4VP request/response (signed request objects, direct_post.jwt, DCQL)
  3. Digital Credentials API front-end snippet + session mapping
  4. Trust-anchor resolution (x5c chains, trusted lists)
  5. Sidecar container (REST) · mdoc format · status-list revocation

Contributing

Contributions are welcome under the Apache License 2.0 with a Developer Certificate of Origin sign-off (git commit -s). No CLA.

License

Apache-2.0 — see LICENSE and NOTICE.

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

vouchkit-0.0.1.tar.gz (14.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vouchkit-0.0.1-py3-none-any.whl (14.0 kB view details)

Uploaded Python 3

File details

Details for the file vouchkit-0.0.1.tar.gz.

File metadata

  • Download URL: vouchkit-0.0.1.tar.gz
  • Upload date:
  • Size: 14.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vouchkit-0.0.1.tar.gz
Algorithm Hash digest
SHA256 bd6a469df8d0edbf56f1155c02fd3ea84cdc39cf7aa06656edb064c7cfad93d4
MD5 03f077851227e84dbccfd84d3e7e4b51
BLAKE2b-256 f0dd9aa80b2bbe0213efc71a0386ff5835f0cd0e486b2a3565d6a321ae57fc53

See more details on using hashes here.

Provenance

The following attestation bundles were made for vouchkit-0.0.1.tar.gz:

Publisher: release.yml on vouchkit/vouchkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vouchkit-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: vouchkit-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 14.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vouchkit-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 05f50cd46d20d97ba9f515f6772306b6c305103289646a8501a05e167d9dbd85
MD5 5f0777ba7e48c18e87d631a3b4c0f650
BLAKE2b-256 1d452e81aea27fb029d81b7a4a7cb72fd0a0d78a1e0ef1abd6cab2271584b730

See more details on using hashes here.

Provenance

The following attestation bundles were made for vouchkit-0.0.1-py3-none-any.whl:

Publisher: release.yml on vouchkit/vouchkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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