Skip to main content

BLS signatures in c++ (with python bindings)

Project description

BLS Signatures implementation

Build and Test C++, Javascript, and Python PyPI PyPI - Format GitHub

Total alerts Language grade: JavaScript Language grade: Python Language grade: C/C++

NOTE: THIS LIBRARY IS NOT YET FORMALLY REVIEWED FOR SECURITY

NOTE: THIS LIBRARY WAS SHIFTED TO THE IETF BLS SPECIFICATION ON 7/16/20

Implements BLS signatures with aggregation using relic toolkit for cryptographic primitives (pairings, EC, hashing) according to the IETF BLS RFC with these curve parameters for BLS12-381.

Features:

  • Non-interactive signature aggregation following IETF specification
  • Works on Windows, Mac, Linux, BSD
  • Efficient verification using Proof of Posssesion (only one pairing per distinct message)
  • Aggregate public keys and private keys
  • EIP-2333 key derivation (including unhardened BIP-32-like keys)
  • Key and signature serialization
  • Batch verification
  • Python bindings
  • Pure python bls12-381 and signatures
  • JavaScript bindings

Before you start

This library uses minimum public key sizes (MPL). A G2Element is a signature (96 bytes), and a G1Element is a public key (48 bytes). A private key is a 32 byte integer. There are three schemes: Basic, Augmented, and ProofOfPossession. Augmented should be enough for most use cases, and ProofOfPossession can be used where verification must be fast.

Import the library

#include "bls.hpp"
using namespace bls;

Creating keys and signatures

// Example seed, used to generate private key. Always use
// a secure RNG with sufficient entropy to generate a seed (at least 32 bytes).
vector<uint8_t> seed = {0,  50, 6,  244, 24,  199, 1,  25,  52,  88,  192,
                        19, 18, 12, 89,  6,   220, 18, 102, 58,  209, 82,
                        12, 62, 89, 110, 182, 9,   44, 20,  254, 22};

PrivateKey sk = AugSchemeMPL().KeyGen(seed);
G1Element pk = sk.GetG1Element();

vector<uint8_t> message = {1, 2, 3, 4, 5};  // Message is passed in as a byte vector
G2Element signature = AugSchemeMPL().Sign(sk, message);

// Verify the signature
bool ok = AugSchemeMPL().Verify(pk, message, signature));

Serializing keys and signatures to bytes

vector<uint8_t> skBytes = sk.Serialize();
vector<uint8_t> pkBytes = pk.Serialize();
vector<uint8_t> signatureBytes = signature.Serialize();

cout << Util::HexStr(skBytes) << endl;    // 32 bytes printed in hex
cout << Util::HexStr(pkBytes) << endl;    // 48 bytes printed in hex
cout << Util::HexStr(signatureBytes) << endl;  // 96 bytes printed in hex

Loading keys and signatures from bytes

// Takes vector of 32 bytes
PrivateKey skc = PrivateKey::FromByteVector(skBytes);

// Takes vector of 48 bytes
pk = G1Element::FromByteVector(pkBytes);

// Takes vector of 96 bytes
signature = G2Element::FromByteVector(signatureBytes);

Create aggregate signatures

// Generate some more private keys
seed[0] = 1;
PrivateKey sk1 = AugSchemeMPL().KeyGen(seed);
seed[0] = 2;
PrivateKey sk2 = AugSchemeMPL().KeyGen(seed);
vector<uint8_t> message2 = {1, 2, 3, 4, 5, 6, 7};

// Generate first sig
G1Element pk1 = sk1.GetG1Element();
G2Element sig1 = AugSchemeMPL().Sign(sk1, message);

// Generate second sig
G1Element pk2 = sk2.GetG1Element();
G2Element sig2 = AugSchemeMPL().Sign(sk2, message2);

// Signatures can be non-interactively combined by anyone
G2Element aggSig = AugSchemeMPL().Aggregate({sig1, sig2});

ok = AugSchemeMPL().AggregateVerify({pk1, pk2}, {message, message2}, aggSig);

Arbitrary trees of aggregates

seed[0] = 3;
PrivateKey sk3 = AugSchemeMPL().KeyGen(seed);
G1Element pk3 = sk3.GetG1Element();
vector<uint8_t> message3 = {100, 2, 254, 88, 90, 45, 23};
G2Element sig3 = AugSchemeMPL().Sign(sk3, message3);


G2Element aggSigFinal = AugSchemeMPL().Aggregate({aggSig, sig3});
ok = AugSchemeMPL().AggregateVerify({pk1, pk2, pk3}, {message, message2, message3}, aggSigFinal);

Very fast verification with Proof of Possession scheme

// If the same message is signed, you can use Proof of Posession (PopScheme) for efficiency
// A proof of possession MUST be passed around with the PK to ensure security.

G2Element popSig1 = PopSchemeMPL().Sign(sk1, message);
G2Element popSig2 = PopSchemeMPL().Sign(sk2, message);
G2Element popSig3 = PopSchemeMPL().Sign(sk3, message);
G2Element pop1 = PopSchemeMPL().PopProve(sk1);
G2Element pop2 = PopSchemeMPL().PopProve(sk2);
G2Element pop3 = PopSchemeMPL().PopProve(sk3);

ok = PopSchemeMPL().PopVerify(pk1, pop1);
ok = PopSchemeMPL().PopVerify(pk2, pop2);
ok = PopSchemeMPL().PopVerify(pk3, pop3);
G2Element popSigAgg = PopSchemeMPL().Aggregate({popSig1, popSig2, popSig3});

ok = PopSchemeMPL().FastAggregateVerify({pk1, pk2, pk3}, message, popSigAgg);

// Aggregate public key, indistinguishable from a single public key
G1Element popAggPk = pk1 + pk2 + pk3;
ok = PopSchemeMPL().Verify(popAggPk, message, popSigAgg);

// Aggregate private keys
PrivateKey aggSk = PrivateKey::Aggregate({sk1, sk2, sk3});
ok = (PopSchemeMPL().Sign(aggSk, message) == popSigAgg);

HD keys using EIP-2333

// You can derive 'child' keys from any key, to create arbitrary trees. 4 byte indeces are used.
// Hardened (more secure, but no parent pk -> child pk)
PrivateKey masterSk = AugSchemeMPL().KeyGen(seed);
PrivateKey child = AugSchemeMPL().DeriveChildSk(masterSk, 152);
PrivateKey grandChild = AugSchemeMPL().DeriveChildSk(child, 952)

// Unhardened (less secure, but can go from parent pk -> child pk), BIP32 style
G1Element masterPk = masterSk.GetG1Element();
PrivateKey childU = AugSchemeMPL().DeriveChildSkUnhardened(masterSk, 22);
PrivateKey grandchildU = AugSchemeMPL().DeriveChildSkUnhardened(childU, 0);

G1Element childUPk = AugSchemeMPL().DeriveChildPkUnhardened(masterPk, 22);
G1Element grandchildUPk = AugSchemeMPL().DeriveChildPkUnhardened(childUPk, 0);

ok = (grandchildUPk == grandchildU.GetG1Element();

Build

Cmake 3.14+, a c++ compiler, and python3 (for bindings) are required for building.

mkdir build
cd build
cmake ../
cmake --build . -- -j 6

Run tests

./build/src/runtest

Run benchmarks

./build/src/runbench

On a 3.5 GHz i7 Mac, verification takes about 1.1ms per signature, and signing takes 1.3ms.

Link the library to use it

g++ -Wl,-no_pie -std=c++11  -Ibls-signatures/build/_deps/relic-src/include -Ibls-signatures/build/_deps/relic-build/include -Ibls-signatures/src -L./bls-signatures/build/ -l bls yourapp.cpp

Notes on dependencies

We use Libsodium and have GMP as an optional dependency: libsodium gives secure memory allocation, and GMP speeds up the library by ~ 3x. MPIR is used on Windows via GitHub Actions instead. To install them, either download them from github and follow the instructions for each repo, or use a package manager like APT or brew. You can follow the recipe used to build python wheels for multiple platforms in .github/workflows/.

Discussion

Discussion about this library and other Chia related development is in the #dev channel of Chia's public Keybase channels.

Code style

  • Always use vector<uint8_t> for bytes
  • Use size_t for size variables
  • Uppercase method names
  • Prefer static constructors
  • Avoid using templates
  • Objects allocate and free their own memory
  • Use cpplint with default rules
  • Use SecAlloc and SecFree when handling secrets

ci Building

The primary build process for this repository is to use GitHub Actions to build binary wheels for MacOS, Linux (x64 and aarch64), and Windows and publish them with a source wheel on PyPi. MacOS ARM64 is supported but not automated due to a lack of M1 CI runners. See .github/workflows/build.yml. CMake uses FetchContent to download pybind11 for the Python bindings and relic from a chia relic forked repository for Windows. Building is then managed by cibuildwheel. Further installation is then available via pip install blspy e.g. The ci builds include GMP and a statically linked libsodium.

Contributing and workflow

Contributions are welcome and more details are available in chia-blockchain's CONTRIBUTING.md.

The main branch is usually the currently released latest version on PyPI. Note that at times bls-signatures/blspy will be ahead of the release version that chia-blockchain requires in it's main/release version in preparation for a new chia-blockchain release. Please branch or fork main and then create a pull request to the main branch. Linear merging is enforced on main and merging requires a completed review. PRs will kick off a GitHub actions ci build and analysis of bls-signatures at lgtm.com. Please make sure your build is passing and that it does not increase alerts at lgtm.

Specification and test vectors

The IETF bls draft is followed. Test vectors can also be seen in the python and cpp test files.

Libsodium license

The libsodium static library is licensed under the ISC license which requires the following copyright notice.

ISC License

Copyright (c) 2013-2020 Frank Denis <j at pureftpd dot org>

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

GMP license

GMP is distributed under the GNU LGPL v3 license

Relic license

Relic is used with the Apache 2.0 license

Project details


Release history Release notifications | RSS feed

This version

1.0.9

Download files

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

Source Distribution

blspy-1.0.9.tar.gz (161.0 kB view details)

Uploaded Source

Built Distributions

blspy-1.0.9-cp310-cp310-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

blspy-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (744.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

blspy-1.0.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (822.4 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64

blspy-1.0.9-cp310-cp310-macosx_11_0_arm64.whl (625.8 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

blspy-1.0.9-cp310-cp310-macosx_10_14_x86_64.whl (646.3 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

blspy-1.0.9-cp39-cp39-win_amd64.whl (2.0 MB view details)

Uploaded CPython 3.9 Windows x86-64

blspy-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (744.3 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

blspy-1.0.9-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (822.8 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

blspy-1.0.9-cp39-cp39-macosx_11_0_arm64.whl (625.9 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

blspy-1.0.9-cp39-cp39-macosx_10_14_x86_64.whl (646.5 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

blspy-1.0.9-cp38-cp38-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.8 Windows x86-64

blspy-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (743.3 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

blspy-1.0.9-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (822.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

blspy-1.0.9-cp38-cp38-macosx_10_14_x86_64.whl (646.4 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

blspy-1.0.9-cp37-cp37m-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.7m Windows x86-64

blspy-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (748.6 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

blspy-1.0.9-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (824.5 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

blspy-1.0.9-cp37-cp37m-macosx_10_14_x86_64.whl (642.1 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

File details

Details for the file blspy-1.0.9.tar.gz.

File metadata

  • Download URL: blspy-1.0.9.tar.gz
  • Upload date:
  • Size: 161.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for blspy-1.0.9.tar.gz
Algorithm Hash digest
SHA256 ea47a2990ab0877ec6f717355f2c65afed27f5082ff3b369d83ec6ce3ea29396
MD5 be576eb95fb8c8421176096c08e8f1e4
BLAKE2b-256 5fec10a8625f4b22ee7376fc2b199a40f372b26faa8408bc431d81a091cf32b2

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for blspy-1.0.9-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b42128256583ec66d9c54644860d1b5b2d3105f5c2f327a4e7be909931ff551f
MD5 35087d020e8a72391cdf07e674763a86
BLAKE2b-256 cbb2e9b412ce041bf2395417d01a29ea459de575919689284025c874b0355dbc

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blspy-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2b80144635c3db225deac08adf1c2466450682c5a881c5a43f41a3f4aaea83f0
MD5 96b2419561f24acd9e9108b0509a6fb0
BLAKE2b-256 29f739660b8ab43f7d90a00b87baa2848bb0f84ff2e9e7e70bad18780ee4c2bf

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for blspy-1.0.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 0da6cafdd98a6ec22b0ea0d889fd698b7e8f349329ed3083611792f33fdeac48
MD5 84ddc8a7adfd5b12f82f41a51fb15e18
BLAKE2b-256 4ca4c100aaf492419fd081cb9d1fde32d9e66b91068b698e3643b8008ff7b951

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp310-cp310-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 625.8 kB
  • Tags: CPython 3.10, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.9

File hashes

Hashes for blspy-1.0.9-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 996cef585ef3cfdcf769dfd8def1ad2377872747af189f6d9ffacb62ac09b9e7
MD5 9627a8aa4672ad911ca9652def303e9f
BLAKE2b-256 4026b6531f926f87cfdd385863f09a6a071cea21aa22063cafff9f6f3276d0c6

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp310-cp310-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp310-cp310-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 646.3 kB
  • Tags: CPython 3.10, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for blspy-1.0.9-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 7bdaae12b3ec6a95dfad60d198e9a7142400c59fbcbd6457a1caedeb9c3ee8fa
MD5 9fcc90fbf0d6028781cf344f2fabcdfa
BLAKE2b-256 7ab196e74309f639c86931cc01acbe7e35965c05918062fe303227611f5d76c6

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for blspy-1.0.9-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ddb311dd465dda24d7f9a3b0245259fad1858aabf54986e641be5ce6d0ddbfa2
MD5 939c7aea27a43e2016fb90c26230cad6
BLAKE2b-256 26e4cef64ed6b22901ff032845d7091fb1e0bdd4137378920c0412127a69dc9e

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blspy-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 47c1b2b29bceee8c76bb5a0c7365732a6efe55f738657eb8b1e0d61e58cd39e5
MD5 000157530efba2b5d75dfb9d93719ea9
BLAKE2b-256 7285ab93a80d823fbeef4721b333e58bb3b3b71c8434ec226ffa2c9063767bc6

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for blspy-1.0.9-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 145d2d4e99dd21d8d8d55e19f6156054842b9f1d49cf878ab5827ebd2ed31f47
MD5 f5b110eb3908b9082a613bdf6455bdb5
BLAKE2b-256 95a4daaa3e7fb8c47b42dfd17d2b27d745ddb5563ab637fa7b17bf759d75eef0

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 625.9 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.9

File hashes

Hashes for blspy-1.0.9-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 02094b4ce78a5ed2dadc34a509da4a1ae362f1e468062bd15b81235e44456af8
MD5 d0bae6c0d3c0adaa0f011e3c7ec6c040
BLAKE2b-256 a7b103bfe2fbd0b6de98d889e650221a2824468b466e2bfcc676dfdd98d58600

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 646.5 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for blspy-1.0.9-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e32e39d2a9961f9920122f54386fd4b2db10a71c27e40c8a43a5665cbec02739
MD5 163bbc682107c1aab247697e6ef97b07
BLAKE2b-256 76cd1fd1eaf0ec5ccc22b93015e1eeb55e48422ea4fbb9bf8c573656e7750e9b

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for blspy-1.0.9-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 51facd4161e6b28ee8542874ea615a15b263b66a949226cefb23d8ba9507d942
MD5 369e6975248b6629e9f2fd3eecee1229
BLAKE2b-256 656a0d0d1d4df75d7dcd71fd16ae6d7926cd1d1153e6866a2aad4d4fab8c6edd

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blspy-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fa56a2b0f04d7e0e8e33ef89b79a38fb292aaa668eb099f06f9d85fb6e63c5bf
MD5 d72357e5a916737aca84db1a743d8f5e
BLAKE2b-256 93fe75b6d031bd087464c60e4982da5ef3ba86747bc1053f30ab91d00be54e2b

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for blspy-1.0.9-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 72b8166bad7537e469d3c5b77cc4359bf541908833cb1191a84e0487d92ac559
MD5 a9483b9fc6ecffb0005944608ef3c122
BLAKE2b-256 1b2ae0728555aaeb57704ad8866968631bc2bff1183dc3e9331d4bf21d2a6797

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 646.4 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for blspy-1.0.9-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 0efad7ee3a5e163542546537d140b15b1f618942d78f7acc2386cc5d714fd1fd
MD5 83e9583bef125bd375065b8d16494f91
BLAKE2b-256 ec9884a17d42764921e1f86b04877299868d92ebd06b6ea1e3e4671a7d8fc40f

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for blspy-1.0.9-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 6689025bf9e015c5757f4aa383547b3b513cf2e76347a57d554c4ca6f34267a1
MD5 cc9517fda757a2f0327fd93015d9bbec
BLAKE2b-256 e5a21bdd6d78b30d8705c467efe076d006f9661594cf187b4f20206eb8f2a3e9

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for blspy-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 85db3843886215ccbeed6f9394809dea5a16e6e9cfbd8b4ffbd088350ba0c9b0
MD5 167d76380c5528ae4d9b4b801b2a36b5
BLAKE2b-256 433b5a9f139c4b62177a220428895d452be457db5697aed7145170342ba10657

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for blspy-1.0.9-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 9b7d292c9d323ff663fa434e37de9bdf8de2935b6d37566a113dcd1af51d8928
MD5 560b02b5418f078810d81615ef14a22e
BLAKE2b-256 a4a9b615ba45a258d07767be4c5a4b33797731f2b0e6a68f203f77fce03cf68d

See more details on using hashes here.

File details

Details for the file blspy-1.0.9-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: blspy-1.0.9-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 642.1 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.0 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for blspy-1.0.9-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 8538df98412f75ecf57e1b47085f7c6f8219985f220b8c5a4f52ccc3cb3a999d
MD5 df9355cd8b2819daf53973b0b9e6d54b
BLAKE2b-256 6bd8284d7b7c259c357fdfaeb989078e058c545052a98cc5bbb5a97f07fdf061

See more details on using hashes here.

Supported by

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