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 Chinilla related development is in the #dev channel of Chinilla'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 chinilla relic forked repository for Windows. Building is then managed by cibuildwheel. Further installation is then available via pip install chinillablspy e.g. The ci builds include GMP and a statically linked libsodium.

Contributing and workflow

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

The main branch is usually the currently released latest version on PyPI. Note that at times bls-signatures/chinillablspy will be ahead of the release version that chinilla-blockchain requires in it's main/release version in preparation for a new chinilla-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


Download files

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

Source Distribution

chinillablspy-1.0.16.tar.gz (163.3 kB view details)

Uploaded Source

Built Distributions

chinillablspy-1.0.16-cp311-cp311-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.11 Windows x86-64

chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (846.5 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (756.1 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

chinillablspy-1.0.16-cp311-cp311-macosx_10_14_x86_64.whl (655.1 kB view details)

Uploaded CPython 3.11 macOS 10.14+ x86-64

chinillablspy-1.0.16-cp310-cp310-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

chinillablspy-1.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (756.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

chinillablspy-1.0.16-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (832.2 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64

chinillablspy-1.0.16-cp310-cp310-macosx_10_14_x86_64.whl (655.1 kB view details)

Uploaded CPython 3.10 macOS 10.14+ x86-64

chinillablspy-1.0.16-cp39-cp39-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.9 Windows x86-64

chinillablspy-1.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (756.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

chinillablspy-1.0.16-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (832.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

chinillablspy-1.0.16-cp39-cp39-macosx_10_14_x86_64.whl (655.2 kB view details)

Uploaded CPython 3.9 macOS 10.14+ x86-64

chinillablspy-1.0.16-cp38-cp38-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.8 Windows x86-64

chinillablspy-1.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (755.6 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

chinillablspy-1.0.16-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (832.0 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

chinillablspy-1.0.16-cp38-cp38-macosx_10_14_x86_64.whl (655.1 kB view details)

Uploaded CPython 3.8 macOS 10.14+ x86-64

chinillablspy-1.0.16-cp37-cp37m-win_amd64.whl (2.1 MB view details)

Uploaded CPython 3.7m Windows x86-64

chinillablspy-1.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (757.5 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

chinillablspy-1.0.16-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (832.3 kB view details)

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

chinillablspy-1.0.16-cp37-cp37m-macosx_10_14_x86_64.whl (651.7 kB view details)

Uploaded CPython 3.7m macOS 10.14+ x86-64

File details

Details for the file chinillablspy-1.0.16.tar.gz.

File metadata

  • Download URL: chinillablspy-1.0.16.tar.gz
  • Upload date:
  • Size: 163.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.15

File hashes

Hashes for chinillablspy-1.0.16.tar.gz
Algorithm Hash digest
SHA256 87d70f2b2ae45f7a1a3e239c612c0ad20d0ef87d9e3da07e185b9c6ccf40258a
MD5 6b25d578a8149bb277839bb50f8547e1
BLAKE2b-256 2ae6734ef14ed06d25a455d28b3c4f4e514708a92d8a3c285c992876a70a8e8f

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 39ade07ec8dac5ae1273014300be91445d039b177d6bd64c51960c4fdd232705
MD5 da140b21bd07297b30300e36859dc10a
BLAKE2b-256 30898135d3db728c9a21a70e86aebad7b8a43429878974beaff1980f5d8fe0f6

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4612ee5eb135458f720e4bb6b4b9540ca82abe58a63cfef06819ee6dd344e73f
MD5 3c1edc4b30d8401b04c67ed70f773913
BLAKE2b-256 504f98a0d88952c2e1de2925dc6743bb355deb9f56a53efce8e62449f5fef307

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a40f5b16922336668d06812851ec5ce16454846e3d0854721f6170fcc56916b6
MD5 dfc95e47805f562333b796ff9ca26385
BLAKE2b-256 ae929312e3cfc5cc26a88e2cef59138d9cf6ba4046bf983a5456ea6edbfcb456

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp311-cp311-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 71b7746471e37bbf5f665fde7a494881bdd67d260b62acbdb21fd26cceb6048a
MD5 35c5ee72f7c620c9c75974d4c84f743b
BLAKE2b-256 1f92c59859d565c58d2d38510e1ed7b5f889de91fdc8c646613e5fd62ef49303

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 24bd513d4fa00e83138d833e2888c77028d5e8161cdada345915f7bd79e72ea7
MD5 2b0fb5a422700ba64b0095ff1652353a
BLAKE2b-256 a3e682941332a16023e9e566661572681eb2e2a7829b96b42f758781f2c1a8e2

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 57bf8950068a165533e00c1fc0d872fdf4fbe4b46d2557ea37768949c20ccd6d
MD5 a3c8ba4d832583d8899727d9fef0544d
BLAKE2b-256 e253441b978e30c0535b18ec40689ca1c0d0039fbba9433dc690c0bc3c423331

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 82fe087d46b22adae8edba7207fdae3843deaae9a8a9c89deb3d3a3ad40b9c02
MD5 97caaa72a91acf5fc35b7506e172c815
BLAKE2b-256 fd3e8a0067edcd749469484c0e899aebfcf15138c12b12a9a04ac7f8d1b6cce9

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp310-cp310-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 b4d1e5b5785470d62be42db0578b5e73b9ccf8e5f8349c9cbd454477a7960a8b
MD5 0378a250c56e73ce4966cd0fc29e8d5d
BLAKE2b-256 209e4c9ad0bb67c0f6a7bb51d4e96bb4d83d53aa201ee1461d6b28ce04dd858b

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ac8548686bbb690cf79721dd7ee2c642b5aa22c97f1adc8e4fee9636d81cc944
MD5 2193ed014d61d324b09c23b739b60e84
BLAKE2b-256 7d833b179954c4f63d3da34ffb16ff2a023b51aed8a0adf29ae497be38a3860c

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bf1b261e130e2cf765eee81bafebc35078c3cdcd899c27e8af6d8a0cd51c1322
MD5 d523c43e7e7ef3b7eec509686a2e3f60
BLAKE2b-256 5159c5e3b6128b546d1c194b2c3c139604a728c4a4d5101c1058627871d5fb09

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 60c49753ea7bd9b0e0a7e3b4aa915df68012edda059e6d38e632ed2982e0a82c
MD5 8522c54300cc0118b14a96ee50efd4ac
BLAKE2b-256 de0d1be6084d9f0cc57965f88ac5ccbb6b69d6d880632a7ffff22f38b71cfd26

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 7250bcb95224b219dda4c393deb171149c922c6dcb88f0a2a7d97a2f8f04710a
MD5 42bbb22908dffd2c0836efa9fca1c0b3
BLAKE2b-256 87772c0a05669ca185d17a40a0c7fb9844565478d0ccac32e01a4af006e2bef8

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 c380b8cca89e80f62f2a0a147e2fa20ec8c3b65fb10bc32d380fc0a99bcb393a
MD5 ad35a273b49f591d91afd8cbd17c9a5c
BLAKE2b-256 6bb0c3a13991e3e4744385deb975340179ae9e35dd6300338f4c08d3e578e36b

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4aea3e74837b35f4d5e01dc037df346eb3bca341b67fbedbe9a8001d3ea7d1bd
MD5 6f351165ba6aec410717ee94c28bf342
BLAKE2b-256 a8cffa141d4d4d449dfb59a91c4f393f1edfb110c8d36fee8b94ca38ae4e9847

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2aa39fbdf334b6d010973d3d3b2bf9dda0dfce448a96397f564917877f4ae3ba
MD5 ecd911b91ea9e8c89f0274af73efd7d6
BLAKE2b-256 07e1a08e626456ee4f3c7eb8029b7fe43c13ebb8fcad19137804b7570c342570

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 941972d6a3eee741efc4984aeda6cfa8c6a08d575948ac966dcb61b2c775b3dc
MD5 bec8a675ca6c8e2cc18c6b9e882156e4
BLAKE2b-256 d6cbb1c08d602d52e803b328156f3acf4564ce052447ea8bdcc4ed1bd9500935

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 209f2aebe7b14fc1f218e41a666cbf40b7e66eaf6664bbea21dc441a262a64b0
MD5 cbfefb31ca2cc01f413407e597f62a46
BLAKE2b-256 baa1656f67ef15bf7f008a2ba592c35a9a3820d2a65130f458958d1e67c014e5

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 11ccdb3ceca023600cd5efca1302655e82d87ca0e216adf6f2257d68852140f6
MD5 bc7c4052b8a5b7c4c37bd4edf539ce2c
BLAKE2b-256 8e7f5eea1932554d3a289b15141c018c80ba7beedf6257cbaa72c98f0f6087ee

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 7707b4f7b78e211abafd9e132795b9b3ceb914e3149ecd0da3503105b40f72ff
MD5 84bc22bc221870de80b248d46483d5b8
BLAKE2b-256 8379bb1f3179d8e4976a643b7cd414812e5088655aa82d317e1d1a7438acbe8c

See more details on using hashes here.

File details

Details for the file chinillablspy-1.0.16-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for chinillablspy-1.0.16-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 421fb2f5fc1e13e8d39780cd50f4b992ae4428eef79b6ca9d649558194fb1385
MD5 0e08507ba2e66e91e3e66951a42feb38
BLAKE2b-256 71585bada5f657b75068291a3dd4c85b853efbe71395482d1ffba1e57e18b185

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