OpenSSH-based signer for Swarmauri
Project description
swarmauri_signing_ssh
An OpenSSH-based signer implementing the ISigning interface for detached
signatures over raw bytes and canonicalized envelopes.
Features:
- Detached signatures powered by OpenSSH
ssh-keygen -Yfor Ed25519, RSA and ECDSA keys. - Accepts private keys from filesystem paths or in-memory PEM blobs.
- JSON canonicalization built in with optional CBOR canonicalization via
cbor2. - Envelope helpers for canonicalized signing and verification workflows.
Requirements
- OpenSSH
ssh-keygen(v8.2 or newer with-Ysupport) must be available onPATH. - Install the optional
cborextra (swarmauri_signing_ssh[cbor]) to enable CBOR canonicalization.
Installation
pip
pip install swarmauri_signing_ssh
Enable CBOR canonicalization when desired:
pip install "swarmauri_signing_ssh[cbor]"
uv
uv add swarmauri_signing_ssh
uv add "swarmauri_signing_ssh[cbor]"
Poetry
poetry add swarmauri_signing_ssh
poetry add swarmauri_signing_ssh -E cbor
Usage
Supported key references
Provide the signer with a KeyRef dictionary:
{"kind": "path", "priv": "/path/to/id_ed25519", "identity": "optional"}references a private key on disk.{"kind": "pem", "priv": "-----BEGIN OPENSSH PRIVATE KEY-----..."}accepts an OpenSSH private key as text/bytes. The key material is written to a secure temporary file for signing.
The signer derives the corresponding public key line, fingerprint (kid) and
algorithm token automatically.
Verification options
- Pass one or more OpenSSH public key lines via
opts["pubkeys"]when callingverify_bytesorverify_envelope. Verification fails immediately when the list is missing or empty. - Override the namespace used by
ssh-keygen -Ythroughopts["namespace"](defaults to"file"). - Supply the expected signer identity with
opts["identity"]. Identities default tosigner{i}based on index order. - Restrict acceptable signatures via the
requiremapping. Supported keys are"algs","kids"and"min_signers".
README example: sign and verify an SSH signature
import asyncio
import subprocess
import tempfile
from pathlib import Path
from swarmauri_signing_ssh import SshEnvelopeSigner
async def main() -> bool:
signer = SshEnvelopeSigner()
with tempfile.TemporaryDirectory() as tmpdir:
tmpdir_path = Path(tmpdir)
priv_path = tmpdir_path / "id_ed25519"
subprocess.run(
["ssh-keygen", "-t", "ed25519", "-N", "", "-f", str(priv_path)],
check=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
pubkey_line = priv_path.with_suffix(".pub").read_text(encoding="utf-8").strip()
key = {"kind": "path", "priv": str(priv_path), "identity": "readme-demo"}
payload = b"hello ssh signatures"
signatures = await signer.sign_bytes(key, payload)
return await signer.verify_bytes(
payload,
signatures,
opts={"pubkeys": [pubkey_line], "identity": "readme-demo"},
)
if __name__ == "__main__": # pragma: no cover - README execution path
print(asyncio.run(main()))
Running the script prints True once verification succeeds.
Envelope workflows
Use sign_envelope / verify_envelope alongside canonicalize_envelope to
operate on structured payloads. JSON canonicalization is always available;
enable the cbor extra to emit canonical CBOR bytes.
RSA keys default to sha256 hashing but accept hashalg="sha512" via either
the key reference or opts. All signatures are detached (features include
"detached_only"), and multiple signatures can be verified in a single call.
Entry Point
The signer registers under the swarmauri.signings entry point as
SshEnvelopeSigner.
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_signing_ssh-0.3.0.dev48.tar.gz.
File metadata
- Download URL: swarmauri_signing_ssh-0.3.0.dev48.tar.gz
- Upload date:
- Size: 11.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 |
e9884baac0628b937e6acfea64bd7096081c6bb6e55d0ef906b267d268f21042
|
|
| MD5 |
f9be7884b58686316e250bdf11bfe65b
|
|
| BLAKE2b-256 |
0ea70ec9e7f4a0d19e072ea8ded70ab90f0094e62e22ce5b9707e81f67ca9659
|
File details
Details for the file swarmauri_signing_ssh-0.3.0.dev48-py3-none-any.whl.
File metadata
- Download URL: swarmauri_signing_ssh-0.3.0.dev48-py3-none-any.whl
- Upload date:
- Size: 12.8 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 |
20b36b72e988b3b7979e879bb3af90f0921cc9b84e9400cc63c6b6a629950c77
|
|
| MD5 |
689268c985c31f462d31f0040de5555e
|
|
| BLAKE2b-256 |
1525a2ad45945bb74bf21880a0fe5452386d8919e25bca49fcd5699d51b7d43d
|