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.
Metadata
Release files for tigrbl_api_hpks 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tigrbl_api_hpks-0.1.2.tar.gz | 20.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tigrbl_api_hpks-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.2 kB
Release files / tigrbl_api_hpks-0.1.2.tar.gz
| Download URL | tigrbl_api_hpks-0.1.2.tar.gz |
|---|---|
| Size | 20.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2354af24dfe78b30657808c2151a8be666048520bf7143f0497856e5a799fe17
|
|
BLAKE2b-256 checksum How to use checksums |
0fa00af8c35a43852e67a5042e1a8b39ddd7f9c2f10af206f9a733632d093a5a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / tigrbl_api_hpks-0.1.2-py3-none-any.whl
| Download URL | tigrbl_api_hpks-0.1.2-py3-none-any.whl |
|---|---|
| Size | 21.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f1b0e2742d7c226a550a8beb98fca878715049b9cae1bf33b19bff153c351627
|
|
BLAKE2b-256 checksum How to use checksums |
a6c6814da1ee345146a73c42badab070a498649be0d26f4a0bc57eb44540250d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|