Skip to main content

OpenSSH-based signer for Swarmauri

Project description

Swarmauri Logo

PyPI - Downloads Hits PyPI - Python Version PyPI - License PyPI - swarmauri_signing_ssh


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 -Y for 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 -Y support) must be available on PATH.
  • Install the optional cbor extra (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 calling verify_bytes or verify_envelope. Verification fails immediately when the list is missing or empty.
  • Override the namespace used by ssh-keygen -Y through opts["namespace"] (defaults to "file").
  • Supply the expected signer identity with opts["identity"]. Identities default to signer{i} based on index order.
  • Restrict acceptable signatures via the require mapping. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

swarmauri_signing_ssh-0.3.0.dev32.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

swarmauri_signing_ssh-0.3.0.dev32-py3-none-any.whl (12.8 kB view details)

Uploaded Python 3

File details

Details for the file swarmauri_signing_ssh-0.3.0.dev32.tar.gz.

File metadata

  • Download URL: swarmauri_signing_ssh-0.3.0.dev32.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","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

Hashes for swarmauri_signing_ssh-0.3.0.dev32.tar.gz
Algorithm Hash digest
SHA256 48eb7d20d27a2601880926b637ac73ebbdae42c6c6d7b50325a9eaa7a3d871dc
MD5 1b324e9fc9bcc71a95017b4b3430cff1
BLAKE2b-256 2d84121aa4d36e2a8bf782c1150115980266e4eef461a6d561bc67400789cc9a

See more details on using hashes here.

File details

Details for the file swarmauri_signing_ssh-0.3.0.dev32-py3-none-any.whl.

File metadata

  • Download URL: swarmauri_signing_ssh-0.3.0.dev32-py3-none-any.whl
  • Upload date:
  • Size: 12.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","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

Hashes for swarmauri_signing_ssh-0.3.0.dev32-py3-none-any.whl
Algorithm Hash digest
SHA256 48bdbe8ff8b83ee72daea2d31fbb34dea7977fecdb59992cf0c02bf96a70418e
MD5 930d53dc3a61d0b442388cbe71c06024
BLAKE2b-256 4238eec934efa79fb880935bcebf2589bfe9ed73def87deea1c020f1658fb26d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page