High-trust OpenPGP keyserver APIs built on the Tigrbl application engine.
Project description
Tigrbl API HPKS 🔐
High-trust OpenPGP keyserver APIs that embrace the HPKS v2 specification while preserving legacy HKP compatibility, powered by the Tigrbl application engine.
✨ Features
- 🔄 Dual-protocol support – serves both legacy
/pks/lookupflows and HPKS v2 JSON/binary routes with consistent persistence. - 🧩 Merge-aware storage – idempotent upserts normalize fingerprints, union metadata, and track revocation state without losing history.
- 📦 Single source of truth – admin CRUD and public HPKS endpoints share the same
openpgp_keystable and Tigrbl handlers. - 🛡️ Spec-aligned responses – machine-readable index output, binary bundle delivery, and required CORS headers baked in.
- ⚙️ Composable operations –
@op_ctxpowered helpers expose reusable alias handlers for/pksworkflows.
📦 Installation
Using uv
uv add tigrbl_api_hpks
Using pip
pip install tigrbl_api_hpks
🚀 Quick Start
import asyncio
from httpx import ASGITransport, AsyncClient
from tigrbl_api_hpks import app
async def bootstrap():
await app.initialize() # create in-memory tables
# Submit an ASCII-armored key bundle via the legacy endpoint
armored_blob = """-----BEGIN PGP PUBLIC KEY BLOCK-----\n...\n-----END PGP PUBLIC KEY BLOCK-----"""
async with AsyncClient(transport=ASGITransport(app=app), base_url="http://testserver") as client:
resp = await client.post(
"/pks/add",
data={"keytext": armored_blob},
headers={"Content-Type": "application/x-www-form-urlencoded"},
)
resp.raise_for_status()
# Lookup via HPKS v2 JSON index
lookup = await client.get("/pks/v2/index/example.com")
print(lookup.json())
asyncio.run(bootstrap())
🧪 Testing
Run the package test suite in isolation:
uv run --package tigrbl_api_hpks --directory pkgs/community/tigrbl_api_hpks pytest
📄 License
This project is licensed under the terms of the Apache 2.0 license.
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 tigrbl_api_hpks-0.1.2.tar.gz.
File metadata
- Download URL: tigrbl_api_hpks-0.1.2.tar.gz
- Upload date:
- Size: 20.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","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 |
2354af24dfe78b30657808c2151a8be666048520bf7143f0497856e5a799fe17
|
|
| MD5 |
b42b664e40fdf4b4247a28db1e8e225c
|
|
| BLAKE2b-256 |
0fa00af8c35a43852e67a5042e1a8b39ddd7f9c2f10af206f9a733632d093a5a
|
File details
Details for the file tigrbl_api_hpks-0.1.2-py3-none-any.whl.
File metadata
- Download URL: tigrbl_api_hpks-0.1.2-py3-none-any.whl
- Upload date:
- Size: 21.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.0 {"installer":{"name":"uv","version":"0.11.0","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 |
f1b0e2742d7c226a550a8beb98fca878715049b9cae1bf33b19bff153c351627
|
|
| MD5 |
cabbf7bdac90d07a8b066a3b97d64d41
|
|
| BLAKE2b-256 |
a6c6814da1ee345146a73c42badab070a498649be0d26f4a0bc57eb44540250d
|