MediaSigner
MediaSigner packages the asynchronous Signer facade that orchestrates registered
SigningBase providers. Moving the facade into a standalone plugin keeps the
core standards library lightweight while still enabling drop-in discovery of
specialised signers such as CMS, JWS, OpenPGP, PDF, and XMLDSig providers.
Features
- Unified signing façade – talk to every installed
SigningBasethrough a single async API that automatically discovers entry-point contributions. - Format-aware routing – delegates signing and verification to the provider
registered for a format token such as
jws,pdf, orxmld. - Optional plugin bundles – install curated extras (e.g.
[plugins]) to bring in all available signer backends in one step. - Key-provider integration – share Swarmauri key providers with the facade so opaque key references resolve before signature creation.
- Production-ready CLI – inspect capabilities, sign payloads, and verify results directly from the command line for fast automation.
Installation
Using uv
uv add MediaSigner
# install every optional backend
uv add "MediaSigner[plugins]"
The [plugins] extra pulls in CMS, JWS, OpenPGP, PDF, and XMLDSig signers.
Using pip
pip install MediaSigner
# with every optional backend
pip install "MediaSigner[plugins]"
Usage
import asyncio
from MediaSigner import MediaSigner
from swarmauri_core.key_providers.IKeyProvider import IKeyProvider
# Optionally pass a key provider so plugins receive a shared source for
# retrieving signing material.
key_provider: IKeyProvider | None = None
signer = MediaSigner(key_provider=key_provider)
async def sign_payload(payload: bytes) -> None:
signatures = await signer.sign_bytes("jws", key="my-key", payload=payload)
assert signatures, "At least one signature should be returned"
print(signer.supports("jws"))
asyncio.run(sign_payload(b"payload"))
Integrating a key provider
Any Swarmauri key provider can be shared with the facade so backends receive ready-to-use key material:
import asyncio
from MediaSigner import MediaSigner
from swarmauri_keyprovider_inmemory import InMemoryKeyProvider
provider = InMemoryKeyProvider(keys={"local://demo": b"secret"})
signer = MediaSigner(key_provider=provider)
async def main() -> None:
signatures = await signer.sign_bytes(
"jws",
key="local://demo",
payload=b"demo",
alg="HS256",
opts={"kid": "demo"},
)
print(signatures[0].mode)
asyncio.run(main())
Discover installed plugins
Use the facade to list installed signers and inspect their capabilities:
for format_name in signer.supported_formats():
capabilities = signer.supports(format_name)
print(format_name, list(capabilities))
Why this structure?
- Separation of concerns – standards remain focused on common abstractions while the plugin encapsulates optional dependencies.
- Explicit opt-in – downstream projects can install only the signing stacks they need via the curated extras.
- Consistent ergonomics – usage matches the historical
swarmauri_standard.signing.Signerimport, preserving existing tutorials and code samples.
Command line utility
MediaSigner ships a small CLI for quick inspection and automation:
media-signer list # List available formats
media-signer supports jws # Show capability metadata
media-signer sign-bytes jws \
--alg HS256 \
--key key.json \
--input payload.bin \
--output signatures.json
media-signer verify-bytes jws \
--input payload.bin \
--sigs signatures.json \
--opts verify-keys.json
The CLI expects JSON files describing KeyRef objects and verification
materials matching the selected plugin.
Project Resources
- Source: https://github.com/swarmauri/swarmauri-sdk/tree/main/pkgs/plugins/media_signer
- Documentation: https://github.com/swarmauri/swarmauri-sdk/tree/main/pkgs/plugins/media_signer#readme
- Issues: https://github.com/swarmauri/swarmauri-sdk/issues
- Releases: https://github.com/swarmauri/swarmauri-sdk/releases
- Discussions: https://github.com/orgs/swarmauri/discussions
Metadata
Release files for MediaSigner 0.6.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mediasigner-0.6.5.tar.gz | 10.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mediasigner-0.6.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.2 kB
Release files / mediasigner-0.6.5.tar.gz
| Download URL | mediasigner-0.6.5.tar.gz |
|---|---|
| Size | 10.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
29902c2fb5b6fc1ca2cbc80dcbc814f8933714d7ea2fc033bd49da31a0737083
|
|
BLAKE2b-256 checksum How to use checksums |
6d8e346e5d870129c2bb92a88d822ee6226bf0a0be74d3d50ab745f2ba70ba26
|
| 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 / mediasigner-0.6.5-py3-none-any.whl
| Download URL | mediasigner-0.6.5-py3-none-any.whl |
|---|---|
| Size | 11.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a42cf72611f4927e7a9896f940111a4d45ecfdc66588e0249534d9efc21e318a
|
|
BLAKE2b-256 checksum How to use checksums |
db4c600e67c35c2c6a62a9b8d98d8f0a28436ffe97de8a94b51afc014f1edd31
|
| 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}
|