Skip to main content

BLS signatures in c++ (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

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.11.tar.gz (161.6 kB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.10 Windows x86-64

blspy-1.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (746.0 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

blspy-1.0.11-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (824.9 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64

blspy-1.0.11-cp310-cp310-macosx_12_0_arm64.whl (620.4 kB view details)

Uploaded CPython 3.10 macOS 12.0+ ARM64

blspy-1.0.11-cp310-cp310-macosx_10_14_x86_64.whl (649.0 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

blspy-1.0.11-cp39-cp39-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.9 Windows x86-64

blspy-1.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (746.2 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

blspy-1.0.11-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (825.0 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

blspy-1.0.11-cp39-cp39-macosx_12_0_arm64.whl (620.4 kB view details)

Uploaded CPython 3.9 macOS 12.0+ ARM64

blspy-1.0.11-cp39-cp39-macosx_10_14_x86_64.whl (649.1 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

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

Uploaded CPython 3.8 Windows x86-64

blspy-1.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (745.3 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

blspy-1.0.11-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (824.7 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

blspy-1.0.11-cp38-cp38-macosx_10_14_x86_64.whl (649.0 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

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

Uploaded CPython 3.7m Windows x86-64

blspy-1.0.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (751.4 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

blspy-1.0.11-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (826.3 kB view details)

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

blspy-1.0.11-cp37-cp37m-macosx_10_14_x86_64.whl (645.7 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: blspy-1.0.11.tar.gz
  • Upload date:
  • Size: 161.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.8.12

File hashes

Hashes for blspy-1.0.11.tar.gz
Algorithm Hash digest
SHA256 dd361c21eff064b912f49a6e0d8f6b9125942b0f498554aa8c2e4818d89c1ed0
MD5 6c975587f582332d3c8557ae48acd43a
BLAKE2b-256 4fcf68615777a6c4bb042a1ec7f08fa7bdf57a132dd0aad8703952b2f71aa67a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blspy-1.0.11-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/4.0.0 CPython/3.8.10

File hashes

Hashes for blspy-1.0.11-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c2706ede164f0266e6dead18beaa8920a41e6e243a99377567ba3dd96f5dfb77
MD5 cf5d38dd6436561c60362f8a8333b214
BLAKE2b-256 24367029f7ab6519a3b093ff4a51387f633da675aa98970ebd4a387a7859fbc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c5d745987ab389928681b8d7889d9572c92e3b5b5d54506db8783e1ad3968bf2
MD5 83806a494cd5c8f35a073ef318bb1686
BLAKE2b-256 d4e59f5d53c5e0294ec40d2d8ec8d5a12185eb9ee444dde0cd666456020ddc3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 28dfb411debb9b37a623376b3e23875522fec2aa793af22d69a5279167b67049
MD5 d16d6f331042aa12b3cd5686e0723f43
BLAKE2b-256 8f3c8d814581b1fcff1f57a336c8bad6913e4fec3a51465927fcb4acd2fd6de0

See more details on using hashes here.

File details

Details for the file blspy-1.0.11-cp310-cp310-macosx_12_0_arm64.whl.

File metadata

  • Download URL: blspy-1.0.11-cp310-cp310-macosx_12_0_arm64.whl
  • Upload date:
  • Size: 620.4 kB
  • Tags: CPython 3.10, macOS 12.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.1 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12

File hashes

Hashes for blspy-1.0.11-cp310-cp310-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 b0e6c13ecd72f97d0471f5149f1a72eb25c96216ebf8daf636f69a5427d7b0c1
MD5 acdbc80e522166e709403e4188ac8223
BLAKE2b-256 fa295df23ffaaf9a6459fa59135bce467486e287af80677cf00e65a32fb30326

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 51c65449e481e1211960ae1bc5a22e69ffb30ba2a560f6e4effbc69fad6afc67
MD5 50810963665be20fbf5962ca31cdb5b5
BLAKE2b-256 9798a90d76984689762e38ce7dc5cee88093884bae4a1e3778516d979363722e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blspy-1.0.11-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.8.10

File hashes

Hashes for blspy-1.0.11-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ee1eba323d085bfd9c6f22bf4213f7c50ba35340929f49f6f513737866ca5c04
MD5 371fb277c7898d7bc5b22b3753effcf9
BLAKE2b-256 72b7e35b1bc3228f7eafc3951e5ebec541565d3fc1cb9e5f9b507085248ec5d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 167411f4b27d3efcbb10cd5f97d602e66746801bf38b9771e7d68a23af3d1f29
MD5 92b5be2cc1ad0c95fca735aeebc58bc6
BLAKE2b-256 a6ba577699de602d7451eafefb0d20b78292011289e267a75fe0336d644e112f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 979844b0411e51b7cc255bc9a9137b548e46a9bbcd8e3fada677be6b11b62042
MD5 21ef363a1032bfa80c02c02131453fe2
BLAKE2b-256 f64f83354a08167f7e3c0f02c2f9b4e19afbb7889c81288276203a87eda866d3

See more details on using hashes here.

File details

Details for the file blspy-1.0.11-cp39-cp39-macosx_12_0_arm64.whl.

File metadata

  • Download URL: blspy-1.0.11-cp39-cp39-macosx_12_0_arm64.whl
  • Upload date:
  • Size: 620.4 kB
  • Tags: CPython 3.9, macOS 12.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.1 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.12

File hashes

Hashes for blspy-1.0.11-cp39-cp39-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 f24a3d365ffa7f225a8033dcc497e25a39952a4ce5e62ad9a8e695543e673a59
MD5 d95c644de11fd876ef7955c88f758e31
BLAKE2b-256 7b98ff3e8373347fba82093f6868d20eb0d5d8a771d57286ab1a6222f254ce68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 f3d58a1fd02388b37eddda0fc341f6f40298e36e8123413bf51999a4155cb9a1
MD5 e3d9d2daa0630a15be5c0bcee9181c3b
BLAKE2b-256 ba7a8d86f3b569f2be2de922ca397c83c2136aa163f9c4f9b02b5079850dea91

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blspy-1.0.11-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/4.0.0 CPython/3.8.10

File hashes

Hashes for blspy-1.0.11-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 ba30d001ce3b66f87997122a1bacfa5e624c29d8ec219b60972ea1417361d41d
MD5 58f551dbe7b3617394d8a1fdc4c86fde
BLAKE2b-256 dc3e48f146be51c09e3f49daf70d8db24c92f9666393fee37740938d56602455

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5ea7cc09c959421d00e91d886ed7ac770b39c538f1160dbd2cea3d4c109c4a8f
MD5 f69b3696f8830b61da9b0e13deb7fe50
BLAKE2b-256 7239f2f23cf82e7078eb0be35f6adec1895f704e121fc07056fea492e928ce9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7aafac8d66ef47eb523aaa4e978b09ecaa1124bc9a3aafeadf2296472c278f1b
MD5 aefc89606714276cf21cdb406605c13f
BLAKE2b-256 715def0cbc1ab51c7b0c62bcb8880a24afb2a6aba51cc96359b050a7a296abf5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 4d52601295a73a546cd333bb911a1a7d62f16945314090301760d504117a0feb
MD5 e5f31ee4e29e2ab3c7fe95fc42d65268
BLAKE2b-256 1aeda8833d8f5c312a9b6e148a15ca632a463c5730bed0e695b83139223a1118

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blspy-1.0.11-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/4.0.0 CPython/3.8.10

File hashes

Hashes for blspy-1.0.11-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 9c3956300b1eefe52616ec3e773b15c0b6a069523f84664219bef60bb31cda3c
MD5 6a8ea2e8b12515e4318414eba2b46f55
BLAKE2b-256 03792e0a4274ec94759836e546633896de2f582ed89d65d6ea946b02d8860691

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5d44385c39d6dfa0a80d0f1bb427ef9c4d195b17faba471507a984383f04ed30
MD5 18041175fcbf892b813c35416d4f32f8
BLAKE2b-256 91b9b4b8f4b3cdecca1b58e90f1c6e2f1347c7249a45dfddc7ecac23690c63fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 21645fd4b42930b663f9fd5657b7c27308d67906cd090bd55ea36a3f1fbbc524
MD5 dff10c160890cba3b982dafbc2e22e6a
BLAKE2b-256 30cf6d04850e9d8a458b87c65126fa598fd3e41b38c6d7617ba42dd0bd9282ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blspy-1.0.11-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 6bcc537aad5325e050a343c6f36be3df6cddcfc9b9cf93b45bdc9c2817ca5e83
MD5 5bbb45dd5bdfbd6b6effd5732d1fa994
BLAKE2b-256 c02c12f4cd1dc4ed5713a5ae6a08d258770f63a7a680689315b3dc6d6b244ab5

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