Skip to main content

secp256k1-based signer for Swarmauri

Project description

Swarmauri Logo

PyPI - Downloads Hits PyPI - Python Version PyPI - License PyPI - swarmauri_signing_secp256k1


Swarmauri Signing Secp256k1

An opinionated secp256k1 ECDSA signer that implements the Swarmauri ISigning interface for detached signatures over raw bytes and canonicalized envelopes.

Features

  • Asynchronous APIsign_bytes, verify_bytes, sign_envelope, and verify_envelope operate with asyncio and return canonical Swarmauri signature payloads.
  • Multiple canonicalizations – JSON canonicalization is always available, while CBOR canonicalization can be enabled with the optional cbor2 dependency.
  • Flexible key loading – accepts PEM strings/paths, JWK dictionaries, or native cryptography key objects via the KeyRef protocol.
  • Deterministic verification requirements – verification expects one or more secp256k1 public keys provided through opts["pubkeys"].
  • Signature format control – DER encoding is returned by default; supply opts={"format": "RAW"} when signing or verifying to work with JOSE-style r || s concatenated signatures.

Installation

The package requires cryptography and, optionally, cbor2 when CBOR canonicalization is needed.

pip install swarmauri_signing_secp256k1

# install with CBOR canonicalization support
pip install "swarmauri_signing_secp256k1[cbor]"
poetry add swarmauri_signing_secp256k1
uv add swarmauri_signing_secp256k1

# with the optional CBOR extra
uv add "swarmauri_signing_secp256k1[cbor]"

Usage

Sign and verify raw bytes

The signer derives a key identifier (kid) from the provided private key and requires the corresponding public key when verifying signatures.

import asyncio

from cryptography.hazmat.primitives.asymmetric import ec

from swarmauri_signing_secp256k1 import Secp256k1EnvelopeSigner


async def main() -> bool:
    signer = Secp256k1EnvelopeSigner()

    private_key = ec.generate_private_key(ec.SECP256K1())
    key_ref = {"kind": "cryptography_obj", "obj": private_key}

    payload = b"hello from secp256k1"
    signatures = await signer.sign_bytes(key_ref, payload)

    public_key_ref = {
        "kind": "cryptography_obj",
        "obj": private_key.public_key(),
    }
    is_valid = await signer.verify_bytes(
        payload,
        signatures,
        opts={"pubkeys": [public_key_ref]},
    )

    print(f"Signature valid? {is_valid}")
    assert is_valid
    return is_valid


if __name__ == "__main__":
    asyncio.run(main())

Canonicalized envelopes

To sign envelopes, pass JSON-serializable dictionaries (and optionally canon="cbor"). Canonicalization reuses the same raw signing logic shown above:

envelope = {"payload": {"msg": "hello"}}
signatures = await signer.sign_envelope(key_ref, envelope, canon="json")
is_valid = await signer.verify_envelope(
    envelope,
    signatures,
    opts={"pubkeys": [public_key_ref]},
)

Entry Point

The signer registers under the swarmauri.signings entry point as Secp256k1EnvelopeSigner.

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_secp256k1-0.3.0.dev29.tar.gz (13.0 kB view details)

Uploaded Source

Built Distribution

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

File details

Details for the file swarmauri_signing_secp256k1-0.3.0.dev29.tar.gz.

File metadata

  • Download URL: swarmauri_signing_secp256k1-0.3.0.dev29.tar.gz
  • Upload date:
  • Size: 13.0 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_secp256k1-0.3.0.dev29.tar.gz
Algorithm Hash digest
SHA256 1b1a0f09a0c95bbc4c7e5c759753b7cc0f7e0e20393bebc034e3b38c4c2c3ed2
MD5 88c16a0fbace8825d2bf4bade4008a1e
BLAKE2b-256 913559087726dfc434362eceb6177231b2fd279970a7361559200fb9da079f61

See more details on using hashes here.

File details

Details for the file swarmauri_signing_secp256k1-0.3.0.dev29-py3-none-any.whl.

File metadata

  • Download URL: swarmauri_signing_secp256k1-0.3.0.dev29-py3-none-any.whl
  • Upload date:
  • Size: 12.9 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_secp256k1-0.3.0.dev29-py3-none-any.whl
Algorithm Hash digest
SHA256 2f955635f5817df2037bb492f9eaf6fcf0dbcb331a398da047ba9186aa33afae
MD5 5e946a111bcd71b83c04c70a8e11a228
BLAKE2b-256 9ef914098fbd16b8066f5a45d4cc72ae86524a474ac54687340883590599b28d

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