Skip to content
Cross-platform Python CFFI bindings for libsecp256k1
Branch: master
Clone or download
Latest commit b20a8ef May 5, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.travis pypy & manylinux2010 (#45) May 4, 2019
_cffi_build compatibility with latest libsecp256k1 (20181105) (#33) Nov 24, 2018
coincurve Use Codecov to track coverage (#41) Dec 2, 2018
tests Add benchmarks (#42) Dec 3, 2018
.codecov.yml Use Codecov to track coverage (#41) Dec 2, 2018
.coveragerc Use tox in CI (#37) Dec 1, 2018
.gitattributes 🍭 Added .gitattributes & .gitignore files Mar 25, 2017
.gitignore
.travis.yml Support Python 3.8 (#44) May 4, 2019
DOWNSTREAM.rst put users in separate file Dec 10, 2018
HISTORY.rst Release 12.0.0 May 5, 2019
LICENSE-APACHE dual license Jul 19, 2017
LICENSE-MIT dual license Jul 19, 2017
MANIFEST.in try a thing Mar 28, 2017
README.rst Release 12.0.0 May 5, 2019
pyproject.toml Use black for code formatting (#40) Dec 2, 2018
release.py Use black for code formatting (#40) Dec 2, 2018
requirements-dev.txt Use tox in CI (#37) Dec 1, 2018
setup.cfg try a thing Mar 28, 2017
setup.py Release 12.0.0 May 5, 2019
setup_support.py Use black for code formatting (#40) Dec 2, 2018
tox.ini Support Python 3.8 (#44) May 4, 2019

README.rst

Coincurve

Travis CI Codecov PyPI - Status PyPI - Version PyPI - Downloads License: MIT/Apache-2.0 Code style: black

This library provides well-tested Python CFFI bindings for libsecp256k1, the heavily optimized C library used by Bitcoin Core for operations on elliptic curve secp256k1.

Table of Contents

Features

  • Fastest available implementation (more than 10x faster than OpenSSL)
  • Clean, easy to use API
  • Frequent updates from libsecp256k1 master
  • Linux, macOS, and Windows all have binary packages for both 64 and 32-bit architectures
  • Linux & macOS use GMP for faster computation
  • Deterministic signatures via RFC 6979
  • Non-malleable signatures (lower-S form) by default
  • Secure, non-malleable ECDH implementation
  • Implements a fix for https://bugs.python.org/issue28150 to support Python 3.6+ on macOS

Users

and many more

Installation

Coincurve is distributed on PyPI and is available on Linux/macOS and Windows and supports Python 2.7/3.5+ and PyPy3.5-v5.8.1+.

$ pip install coincurve

If you are on a system that doesn't have a precompiled binary wheel (e.g. FreeBSD) then pip will fetch source to build yourself. You must have the necessary packages.

On Debian/Ubuntu the necessary system packages are:

  • build-essential
  • automake
  • pkg-config
  • libtool
  • libffi-dev
  • python3-dev (or python-dev for Python 2)
  • libgmp-dev (optional)

On macOS the necessary Homebrew packages are:

  • automake
  • pkg-config
  • libtool
  • libffi
  • gmp (optional)

API

Coincurve provides a simple API.

coincurve.verify_signature

verify_signature(signature, message, public_key, hasher=sha256, context=GLOBAL_CONTEXT)

Verifies some message was signed by the owner of a public key.

  • Parameters:

    • signature (bytes) - The signature to verify.
    • message (bytes) - The message that was supposedly signed.
    • public_key (bytes) - A public key in compressed or uncompressed form.
    • hasher - The hash function to use, can be None. hasher(message) must return 32 bytes.
    • context (coincurve.Context)
  • Returns: bool

coincurve.PrivateKey

All instances have a public_key of type coincurve.PublicKey

PrivateKey(secret=None, context=GLOBAL_CONTEXT)

  • Parameters:

    • secret (bytes) - The secret to use.
    • context (coincurve.Context)

Methods:

classmethod from_hex(hexed, context=GLOBAL_CONTEXT)

classmethod from_int(num, context=GLOBAL_CONTEXT)

classmethod from_pem(pem, context=GLOBAL_CONTEXT)

classmethod from_der(der, context=GLOBAL_CONTEXT)

sign(message, hasher=sha256, custom_nonce=None)

  • Parameters:

    • message (bytes) - The message to sign.
    • hasher - The hash function to use, can be None. hasher(message) must return 32 bytes.
    • custom_nonce - A tuple of arity 2 in the form of (nonce_fn, nonce_data). Refer to: secp256k1.h
  • Returns: bytes. 68 <= len(signature) <= 71

sign_recoverable(message, hasher=sha256)

  • Parameters:

    • message (bytes) - The message to sign.
    • hasher - The hash function to use, can be None. hasher(message) must return 32 bytes.
  • Returns: bytes

ecdh(public_key)

Computes a Diffie-Hellman secret in constant time. Note: This prevents malleability by returning sha256(x) instead of the x coordinate directly. See https://github.com/ofek/coincurve/issues/9.

  • Parameters:

    • public_key (bytes) - Another party's public key in compressed or uncompressed form.
  • Returns: bytes

add(scalar, update=False)

  • Parameters:

    • scalar (bytes) - The scalar to add.
    • update (bool) - If True, will update and return self.
  • Returns: coincurve.PrivateKey

multiply(scalar, update=False)

  • Parameters:

    • scalar (bytes) - The scalar to multiply.
    • update (bool) - If True, will update and return self.
  • Returns: coincurve.PrivateKey

to_hex()

to_int()

to_pem()

to_der()

coincurve.PublicKey

PublicKey(data, context=GLOBAL_CONTEXT)

  • Parameters:

    • data (bytes) - The public key in compressed or uncompressed form.
    • context (coincurve.Context)

Methods:

classmethod from_secret(secret, context=GLOBAL_CONTEXT)

classmethod from_valid_secret(secret, context=GLOBAL_CONTEXT)

classmethod from_point(x, y, context=GLOBAL_CONTEXT)

classmethod from_signature_and_message(serialized_sig, message, hasher=sha256, context=GLOBAL_CONTEXT)

classmethod combine_keys(public_keys, context=GLOBAL_CONTEXT)

  • Parameters:

    • public_keys (list) - A list of coincurve.PublicKey to add.
    • context (coincurve.Context)
  • Returns: coincurve.PublicKey

format(compressed=True)

  • Parameters:

    • compressed (bool)
  • Returns: The public key serialized to bytes.

point()

  • Returns: (x, y)

verify(signature, message, hasher=sha256)

Verifies some message was signed by the owner of this public key.

  • Parameters:

    • signature (bytes) - The signature to verify.
    • message (bytes) - The message that was supposedly signed.
    • hasher - The hash function to use, can be None. hasher(message) must return 32 bytes.
  • Returns: bool

add(scalar, update=False)

  • Parameters:

    • scalar (bytes) - The scalar to add.
    • update (bool) - If True, will update and return self.
  • Returns: coincurve.PublicKey

multiply(scalar, update=False)

  • Parameters:

    • scalar (bytes) - The scalar to multiply.
    • update (bool) - If True, will update and return self.
  • Returns: coincurve.PublicKey

combine(public_keys, update=False)

  • Parameters:

    • public_keys (list) - A list of coincurve.PublicKey to add.
    • update (bool) - If True, will update and return self.
  • Returns: coincurve.PublicKey

License

Coincurve is distributed under the terms of both

at your option.

Credits

  • Contributors of libsecp256k1.
  • Contributors of secp256k1-py. While Coincurve is nearly a complete rewrite, much of the build system provided by ulope remains.

History

Important changes are emphasized.

12.0.0

  • New: Binary wheels on Linux for PyPy3.6 v7.1.1-beta!
  • New: Binary wheels on macOS for Python 3.8.0-alpha.3!
  • New: Binary wheels on Linux are now also built with the new manylinux2010 spec for 64-bit platforms!
  • Improvements from libsecp256k1 master

11.0.0

  • Fix some linking scenarios by placing bundled libsecp256k1 dir first in path
  • Allow override of system libsecp256k1 with environment variable
  • Add benchmarks
  • Use Codecov to track coverage
  • Use black for code formatting

10.0.0

  • Support tox for testing
  • Compatibility with latest libsecp256k1 ECDH API
  • Make libgmp optional when building from source

9.0.0

  • Fixed wheels for macOS
  • Breaking: Drop support for 32-bit macOS

8.0.2

  • No longer package tests

8.0.0

  • New: Binary wheels for Python 3.7!
  • Changed: Binary wheels on macOS for Python 3.5 now use Homebrew Python for compilation due to new security requirements
  • Make build system support new GitHub & PyPI security requirements
  • Improvements from libsecp256k1 master

View all history

You can’t perform that action at this time.