OpenPGP sealed-per-recipient MRE provider for Swarmauri
Project description
Swarmauri MRE Crypto PGP
OpenPGP-based multi-recipient encryption providers that implement the
IMreCrypto contract. The package includes three concrete providers, all of
which rely on PGPy for public-key encryption.
Providers that wrap a shared content-encryption key (CEK) additionally require
cryptography.
Highlights
- PGPSealMreCrypto – Implements the
sealed_per_recipientmode. Each recipient receives a sealed copy of the plaintext. Associated data (AAD) is not supported and re-wrapping new recipients requires the original plaintext viaopts["plaintext"]. - PGPSealedCekMreCrypto – Implements the
sealed_cek+aeadmode with an AES-256-GCM payload. The CEK is sealed per recipient and can be re-used to add or rotate recipients without decrypting the payload whenopts["cek"]oropts["opener_identities"]are supplied. - PGPMreCrypto – Composite provider supporting both
enc_once+per_recipient_header(AES-256-GCM payload with OpenPGP headers) andsealed_per_recipient. Re-wrapping shared-payload envelopes requires the CEK viaopts["cek"]or a managing private key supplied throughopts["manage_key"].
All providers fingerprint OpenPGP keys to derive recipient identifiers. Public
keys can be supplied as live PGPKey objects or ASCII-armored blobs using the
following recipient KeyRef forms:
{"kind": "pgpy_pub", "pub": pgpy.PGPKey}{"kind": "pgpy_pub_armored", "pub": "-----BEGIN PGP PUBLIC KEY-----"}{"kind": "pgpy_key", "key": pgpy.PGPKey}(sealed CEK helper that lifts the public subkey from a combined key object)
Use these identity KeyRef forms when opening envelopes:
{"kind": "pgpy_priv", "priv": pgpy.PGPKey}{"kind": "pgpy_priv_armored", "priv": "-----BEGIN PGP PRIVATE KEY-----"}{"kind": "pgpy_key", "key": pgpy.PGPKey}(sealed CEK provider){"kind": "pgpy_key_armored", "key": "-----BEGIN PGP PRIVATE KEY-----"}
Private keys may be locked; pass the unlocking secret in opts["passphrase"].
Installation
Install the provider with your preferred packaging tool:
# pip
pip install swarmauri_mre_crypto_pgp
# Poetry
poetry add swarmauri_mre_crypto_pgp
# uv (project dependency)
uv add swarmauri_mre_crypto_pgp
# uv (virtualenv-only install)
uv pip install swarmauri_mre_crypto_pgp
Usage
import asyncio
from pgpy import PGPKey, PGPUID
from pgpy.constants import (
CompressionAlgorithm,
HashAlgorithm,
KeyFlags,
PubKeyAlgorithm,
SymmetricKeyAlgorithm,
)
from swarmauri_mre_crypto_pgp import PGPMreCrypto
async def main():
# Generate an OpenPGP key pair with pgpy
key = PGPKey.new(PubKeyAlgorithm.RSAEncryptOrSign, 2048)
uid = PGPUID.new("Test User", email="test@example.com")
key.add_uid(
uid,
usage={KeyFlags.EncryptCommunications},
hashes=[HashAlgorithm.SHA256],
ciphers=[SymmetricKeyAlgorithm.AES256],
compression=[CompressionAlgorithm.ZLIB],
)
# Create references understood by the provider
pub_ref = {"kind": "pgpy_pub", "pub": key.pubkey}
priv_ref = {"kind": "pgpy_priv", "priv": key}
# Encrypt for many and open with the private key
mre = PGPMreCrypto()
pt = b"hello"
env = await mre.encrypt_for_many([pub_ref], pt)
rt = await mre.open_for(priv_ref, env)
print(rt)
if __name__ == "__main__":
asyncio.run(main())
Selecting modes
PGPMreCrypto defaults to MreMode.ENC_ONCE_HEADERS. Pass
mode=MreMode.SEALED_PER_RECIPIENT (or the string value) to switch to the
sealed-per-recipient variant. PGPSealedCekMreCrypto always operates in the
sealed_cek+aead mode and will raise when the envelope mode or algorithms do
not match the expected values.
Re-wrapping envelopes
- Sealed per recipient – Re-wrapping with additional recipients requires
opts["plaintext"]so the providers can seal the original payload again. - Shared CEK (enc_once / sealed_cek) – Supply either the decrypted CEK via
opts["cek"]or provide identities capable of opening the envelope throughopts["manage_key"](composite provider) oropts["opener_identities"](sealed CEK provider). Enable payload rotation withopts["rotate_payload_on_revoke"]to generate a fresh CEK when removing recipients.
Entry point
Providers are registered under the swarmauri.mre_cryptos entry point as
PGPSealMreCrypto, PGPSealedCekMreCrypto, and PGPMreCrypto.
Want to help?
If you want to contribute to swarmauri-sdk, read up on our guidelines for contributing that will help you get started.
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_mre_crypto_pgp-0.3.0.dev43.tar.gz.
File metadata
- Download URL: swarmauri_mre_crypto_pgp-0.3.0.dev43.tar.gz
- Upload date:
- Size: 15.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","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 |
0c71853b76d50609bad5004bd8881532c709efc97a49579b3e54a720979b4367
|
|
| MD5 |
8be9369788159e749dece3a23ffcb0e5
|
|
| BLAKE2b-256 |
24fb25ae9b154941c3edb2eb230747261273dca44b8a565ba74702ff01137d2b
|
File details
Details for the file swarmauri_mre_crypto_pgp-0.3.0.dev43-py3-none-any.whl.
File metadata
- Download URL: swarmauri_mre_crypto_pgp-0.3.0.dev43-py3-none-any.whl
- Upload date:
- Size: 18.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","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 |
0c9afdc2f7f3ed043bc257f4149a0c2708b3e5ab94fd9e1ba883e6f6688f67f8
|
|
| MD5 |
472b62273b2e86a3fbd58eabe7f95e47
|
|
| BLAKE2b-256 |
9a82fca7596e4994e7638d709904fea9a32b7bfbe73496d164968963812d2d5b
|