Skip to main content

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.

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

Metadata

Release files for chinillablspy 1.0.16

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for chinillablspy 1.0.16
File Size Uploaded
chinillablspy-1.0.16.tar.gz 163.3 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for chinillablspy 1.0.16
File
chinillablspy-1.0.16-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ ARM64 Details
chinillablspy-1.0.16-cp311-cp311-macosx_10_14_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.14+ x86-64 Details
chinillablspy-1.0.16-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
chinillablspy-1.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ ARM64 Details
chinillablspy-1.0.16-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.12+ x86-64 Details
chinillablspy-1.0.16-cp310-cp310-macosx_10_14_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.14+ x86-64 Details
chinillablspy-1.0.16-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
chinillablspy-1.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ ARM64 Details
chinillablspy-1.0.16-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.12+ x86-64 Details
chinillablspy-1.0.16-cp39-cp39-macosx_10_14_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.14+ x86-64 Details
chinillablspy-1.0.16-cp38-cp38-win_amd64.whl CPython 3.8 CPython 3.8 Windows x86-64 Details
chinillablspy-1.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.8 CPython 3.8 Linux glibc 2.17+ ARM64 Details
chinillablspy-1.0.16-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.12+ x86-64 Details
chinillablspy-1.0.16-cp38-cp38-macosx_10_14_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.14+ x86-64 Details
chinillablspy-1.0.16-cp37-cp37m-win_amd64.whl CPython 3.7 CPython 3.7 pymalloc Windows x86-64 Details
chinillablspy-1.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ ARM64 Details
chinillablspy-1.0.16-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64 Details
chinillablspy-1.0.16-cp37-cp37m-macosx_10_14_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 10.14+ x86-64 Details

Total release size: 21.6 MB

Release files / chinillablspy-1.0.16.tar.gz

Download URL chinillablspy-1.0.16.tar.gz
Size 163.3 kB
Tags Source
SHA-256 checksum
How to use checksums
87d70f2b2ae45f7a1a3e239c612c0ad20d0ef87d9e3da07e185b9c6ccf40258a
BLAKE2b-256 checksum
How to use checksums
2ae6734ef14ed06d25a455d28b3c4f4e514708a92d8a3c285c992876a70a8e8f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp311-cp311-win_amd64.whl

Download URL chinillablspy-1.0.16-cp311-cp311-win_amd64.whl
Size 2.1 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
39ade07ec8dac5ae1273014300be91445d039b177d6bd64c51960c4fdd232705
BLAKE2b-256 checksum
How to use checksums
30898135d3db728c9a21a70e86aebad7b8a43429878974beaff1980f5d8fe0f6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 846.5 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
4612ee5eb135458f720e4bb6b4b9540ca82abe58a63cfef06819ee6dd344e73f
BLAKE2b-256 checksum
How to use checksums
504f98a0d88952c2e1de2925dc6743bb355deb9f56a53efce8e62449f5fef307
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 756.1 kB
Tags CPython 3.11 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
a40f5b16922336668d06812851ec5ce16454846e3d0854721f6170fcc56916b6
BLAKE2b-256 checksum
How to use checksums
ae929312e3cfc5cc26a88e2cef59138d9cf6ba4046bf983a5456ea6edbfcb456
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp311-cp311-macosx_10_14_x86_64.whl

Download URL chinillablspy-1.0.16-cp311-cp311-macosx_10_14_x86_64.whl
Size 655.1 kB
Tags CPython 3.11 macOS 10.14+ x86-64
SHA-256 checksum
How to use checksums
71b7746471e37bbf5f665fde7a494881bdd67d260b62acbdb21fd26cceb6048a
BLAKE2b-256 checksum
How to use checksums
1f92c59859d565c58d2d38510e1ed7b5f889de91fdc8c646613e5fd62ef49303
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp310-cp310-win_amd64.whl

Download URL chinillablspy-1.0.16-cp310-cp310-win_amd64.whl
Size 2.1 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
24bd513d4fa00e83138d833e2888c77028d5e8161cdada345915f7bd79e72ea7
BLAKE2b-256 checksum
How to use checksums
a3e682941332a16023e9e566661572681eb2e2a7829b96b42f758781f2c1a8e2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL chinillablspy-1.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 756.1 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
57bf8950068a165533e00c1fc0d872fdf4fbe4b46d2557ea37768949c20ccd6d
BLAKE2b-256 checksum
How to use checksums
e253441b978e30c0535b18ec40689ca1c0d0039fbba9433dc690c0bc3c423331
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl

Download URL chinillablspy-1.0.16-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Size 832.2 kB
Tags CPython 3.10 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
82fe087d46b22adae8edba7207fdae3843deaae9a8a9c89deb3d3a3ad40b9c02
BLAKE2b-256 checksum
How to use checksums
fd3e8a0067edcd749469484c0e899aebfcf15138c12b12a9a04ac7f8d1b6cce9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp310-cp310-macosx_10_14_x86_64.whl

Download URL chinillablspy-1.0.16-cp310-cp310-macosx_10_14_x86_64.whl
Size 655.1 kB
Tags CPython 3.10 macOS 10.14+ x86-64
SHA-256 checksum
How to use checksums
b4d1e5b5785470d62be42db0578b5e73b9ccf8e5f8349c9cbd454477a7960a8b
BLAKE2b-256 checksum
How to use checksums
209e4c9ad0bb67c0f6a7bb51d4e96bb4d83d53aa201ee1461d6b28ce04dd858b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp39-cp39-win_amd64.whl

Download URL chinillablspy-1.0.16-cp39-cp39-win_amd64.whl
Size 2.1 MB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
ac8548686bbb690cf79721dd7ee2c642b5aa22c97f1adc8e4fee9636d81cc944
BLAKE2b-256 checksum
How to use checksums
7d833b179954c4f63d3da34ffb16ff2a023b51aed8a0adf29ae497be38a3860c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL chinillablspy-1.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 756.1 kB
Tags CPython 3.9 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
bf1b261e130e2cf765eee81bafebc35078c3cdcd899c27e8af6d8a0cd51c1322
BLAKE2b-256 checksum
How to use checksums
5159c5e3b6128b546d1c194b2c3c139604a728c4a4d5101c1058627871d5fb09
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl

Download URL chinillablspy-1.0.16-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Size 832.6 kB
Tags CPython 3.9 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
60c49753ea7bd9b0e0a7e3b4aa915df68012edda059e6d38e632ed2982e0a82c
BLAKE2b-256 checksum
How to use checksums
de0d1be6084d9f0cc57965f88ac5ccbb6b69d6d880632a7ffff22f38b71cfd26
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp39-cp39-macosx_10_14_x86_64.whl

Download URL chinillablspy-1.0.16-cp39-cp39-macosx_10_14_x86_64.whl
Size 655.2 kB
Tags CPython 3.9 macOS 10.14+ x86-64
SHA-256 checksum
How to use checksums
7250bcb95224b219dda4c393deb171149c922c6dcb88f0a2a7d97a2f8f04710a
BLAKE2b-256 checksum
How to use checksums
87772c0a05669ca185d17a40a0c7fb9844565478d0ccac32e01a4af006e2bef8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp38-cp38-win_amd64.whl

Download URL chinillablspy-1.0.16-cp38-cp38-win_amd64.whl
Size 2.1 MB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
c380b8cca89e80f62f2a0a147e2fa20ec8c3b65fb10bc32d380fc0a99bcb393a
BLAKE2b-256 checksum
How to use checksums
6bb0c3a13991e3e4744385deb975340179ae9e35dd6300338f4c08d3e578e36b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL chinillablspy-1.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 755.6 kB
Tags CPython 3.8 Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
4aea3e74837b35f4d5e01dc037df346eb3bca341b67fbedbe9a8001d3ea7d1bd
BLAKE2b-256 checksum
How to use checksums
a8cffa141d4d4d449dfb59a91c4f393f1edfb110c8d36fee8b94ca38ae4e9847
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl

Download URL chinillablspy-1.0.16-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Size 832.0 kB
Tags CPython 3.8 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
2aa39fbdf334b6d010973d3d3b2bf9dda0dfce448a96397f564917877f4ae3ba
BLAKE2b-256 checksum
How to use checksums
07e1a08e626456ee4f3c7eb8029b7fe43c13ebb8fcad19137804b7570c342570
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp38-cp38-macosx_10_14_x86_64.whl

Download URL chinillablspy-1.0.16-cp38-cp38-macosx_10_14_x86_64.whl
Size 655.1 kB
Tags CPython 3.8 macOS 10.14+ x86-64
SHA-256 checksum
How to use checksums
941972d6a3eee741efc4984aeda6cfa8c6a08d575948ac966dcb61b2c775b3dc
BLAKE2b-256 checksum
How to use checksums
d6cbb1c08d602d52e803b328156f3acf4564ce052447ea8bdcc4ed1bd9500935
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp37-cp37m-win_amd64.whl

Download URL chinillablspy-1.0.16-cp37-cp37m-win_amd64.whl
Size 2.1 MB
Tags CPython 3.7 CPython 3.7 pymalloc Windows x86-64
SHA-256 checksum
How to use checksums
209f2aebe7b14fc1f218e41a666cbf40b7e66eaf6664bbea21dc441a262a64b0
BLAKE2b-256 checksum
How to use checksums
baa1656f67ef15bf7f008a2ba592c35a9a3820d2a65130f458958d1e67c014e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL chinillablspy-1.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 757.5 kB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
11ccdb3ceca023600cd5efca1302655e82d87ca0e216adf6f2257d68852140f6
BLAKE2b-256 checksum
How to use checksums
8e7f5eea1932554d3a289b15141c018c80ba7beedf6257cbaa72c98f0f6087ee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl

Download URL chinillablspy-1.0.16-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Size 832.3 kB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
7707b4f7b78e211abafd9e132795b9b3ceb914e3149ecd0da3503105b40f72ff
BLAKE2b-256 checksum
How to use checksums
8379bb1f3179d8e4976a643b7cd414812e5088655aa82d317e1d1a7438acbe8c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release files / chinillablspy-1.0.16-cp37-cp37m-macosx_10_14_x86_64.whl

Download URL chinillablspy-1.0.16-cp37-cp37m-macosx_10_14_x86_64.whl
Size 651.7 kB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.14+ x86-64
SHA-256 checksum
How to use checksums
421fb2f5fc1e13e8d39780cd50f4b992ae4428eef79b6ca9d649558194fb1385
BLAKE2b-256 checksum
How to use checksums
71585bada5f657b75068291a3dd4c85b853efbe71395482d1ffba1e57e18b185
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.15

Release history Release notifications | RSS feed

This release

1.0.16 This release

21 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page