Swarmauri Vault Transit Key Provider
Project description
Swarmauri Vault Transit Key Provider
HashiCorp Vault Transit engine integration for the Swarmauri key provider interface. Manage hardware-protected keys through Vault, expose public JWK(S) material, rotate versions, and consume Vault RNG and HKDF services without leaving Swarmauri.
Features
- Create and rotate symmetric (
aes256-gcm96) and asymmetric (rsa-3072,ecdsa-p256,ed25519) keys via Vault Transit. - Export public keys in JWK/JWKS form using the built-in
get_public_jwk/jwkshelpers. - Perform signing, verification, encryption, decryption, wrapping, and unwrapping through Vault's REST API.
- Generate cryptographically secure random bytes either from Vault's RNG or local entropy (configurable with
prefer_vault_rng). - Run HKDF derivations with SHA-256 to support envelope encryption or key diversification workflows.
Prerequisites
- Python 3.10 or newer.
- Running HashiCorp Vault instance with the Transit secrets engine enabled and a mount path you can access (default
transit). - Vault token with capabilities such as
transit/keys/*forread,create,update,delete, andtransit/random/*if you plan to use Vault RNG. - The
hvacclient library (installed automatically with this package) unless you inject a custom Vault client.
Installation
# pip
pip install swarmauri_keyprovider_vaulttransit
# poetry
poetry add swarmauri_keyprovider_vaulttransit
# uv (pyproject-based projects)
uv add swarmauri_keyprovider_vaulttransit
Quickstart: Create and Rotate a Signing Key
import asyncio
from swarmauri_core.key_providers.types import KeyAlg, KeySpec, ExportPolicy
from swarmauri_keyprovider_vaulttransit import VaultTransitKeyProvider
async def main() -> None:
provider = VaultTransitKeyProvider(
url="http://localhost:8200",
token="swarmauri-dev-token",
mount="transit",
verify=False,
)
spec = KeySpec(
alg=KeyAlg.ED25519,
export_policy=ExportPolicy.never_export_secret,
label="agents-signing",
)
key_ref = await provider.create_key(spec)
print("Created key", key_ref.kid, "version", key_ref.version)
jwk = await provider.get_public_jwk(key_ref.kid, key_ref.version)
print("Public JWK", jwk)
rotated = await provider.rotate_key(key_ref.kid)
print("Rotated to version", rotated.version)
jwks_payload = await provider.jwks()
print("JWKS contains", [entry["kid"] for entry in jwks_payload["keys"]])
if __name__ == "__main__":
asyncio.run(main())
Encrypt, Wrap, and Derive Keys
import asyncio
from swarmauri_keyprovider_vaulttransit import VaultTransitKeyProvider
async def encrypt_and_wrap() -> None:
provider = VaultTransitKeyProvider(
url="http://localhost:8200",
token="swarmauri-dev-token",
prefer_vault_rng=True,
)
plaintext = b"vault keeps my secrets"
aad = b"tenant::demo"
ciphertext = await provider.encrypt("aes-encryption", plaintext, associated_data=aad)
decrypted = await provider.decrypt("aes-encryption", ciphertext, associated_data=aad)
assert decrypted == plaintext
dek = await provider.random_bytes(32)
wrapped = await provider.wrap("rsa-wrap-key", dek)
unwrapped = await provider.unwrap("rsa-wrap-key", wrapped)
assert unwrapped == dek
derived = await provider.hkdf(
ikm=dek,
salt=b"vault-salt",
info=b"swarmauri/derivation",
length=32,
)
print("Derived key length", len(derived))
# asyncio.run(encrypt_and_wrap())
Configuration Reference
url– Vault server address (e.g.,https://vault.example.com:8200).token– Vault token or wrapped token with permissions for the Transit mount.mount– Transit engine mount path; defaults totransit.namespace– Optional Vault Enterprise namespace header.verify– TLS verification flag or CA bundle path.prefer_vault_rng– WhenTrue,random_bytesuses Vault's RNG; otherwise falls back toos.urandom.client– Provide a pre-configuredhvac.Clientif you manage authentication externally.
Want to help?
If you want to contribute to swarmauri-sdk, read up on our guidelines for contributing.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swarmauri_keyprovider_vaulttransit-0.9.4.dev2.tar.gz.
File metadata
- Download URL: swarmauri_keyprovider_vaulttransit-0.9.4.dev2.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f08bc1659fae2223a1638a6d67755bb5cce5cafb2d2c26b514f0166c38ab8cb4
|
|
| MD5 |
227f76601be00a62ce8e81ec7ec219d4
|
|
| BLAKE2b-256 |
ab25fdf26380703c0a54e8f70d134e466405827d98668de5a7f27d03eab8edbd
|
File details
Details for the file swarmauri_keyprovider_vaulttransit-0.9.4.dev2-py3-none-any.whl.
File metadata
- Download URL: swarmauri_keyprovider_vaulttransit-0.9.4.dev2-py3-none-any.whl
- Upload date:
- Size: 12.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46686d140da95166f3aae739d0c845706efe10cc5d2722b19b163f280679e844
|
|
| MD5 |
8507e4838221f32eb0aee0f6c7f17b17
|
|
| BLAKE2b-256 |
8893484ba862673ead1df5d3002f7e5c27710b1d39db97aee4b96d5bb4dec375
|