chinillablspy


Namechinillablspy JSON
Version 1.0.16 PyPI version JSON
download
home_pagehttps://github.com/Chinilla/bls-signatures
SummaryBLS signatures in c++ (with python bindings)
upload_time2022-12-08 08:58:23
maintainer
docs_urlNone
authorMariano Sorgente
requires_python>=3.7
license
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # BLS Signatures implementation

[![Build and Test C++, Javascript, and Python](https://github.com/Chinilla/bls-signatures/actions/workflows/build-test.yaml/badge.svg)](https://github.com/Chinilla/bls-signatures/actions/workflows/build-test.yaml)
![PyPI](https://img.shields.io/pypi/v/chinillablspy?logo=pypi)
![PyPI - Format](https://img.shields.io/pypi/format/chinillablspy?logo=pypi)
![GitHub](https://img.shields.io/github/license/Chinilla/bls-signatures?logo=Github)

[![Total alerts](https://img.shields.io/lgtm/alerts/g/Chinilla/bls-signatures.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Chinilla/bls-signatures/alerts/)
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Chinilla/bls-signatures.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Chinilla/bls-signatures/context:javascript)
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/Chinilla/bls-signatures.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Chinilla/bls-signatures/context:python)
[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/Chinilla/bls-signatures.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Chinilla/bls-signatures/context:cpp)

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](https://github.com/relic-toolkit/relic)
for cryptographic primitives (pairings, EC, hashing) according to the
[IETF BLS RFC](https://datatracker.ietf.org/doc/draft-irtf-cfrg-bls-signature/)
with [these curve parameters](https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/)
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](https://eips.ethereum.org/EIPS/eip-2333) key derivation (including unhardened BIP-32-like keys)
* Key and signature serialization
* Batch verification
* [Python bindings](https://github.com/Chinilla/bls-signatures/tree/main/python-bindings)
* [Pure python bls12-381 and signatures](https://github.com/Chinilla/bls-signatures/tree/main/python-impl)
* [JavaScript bindings](https://github.com/Chinilla/bls-signatures/tree/main/js-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

```c++
#include "bls.hpp"
using namespace bls;
```

## Creating keys and signatures

```c++
// 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

```c++
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

```c++
// 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

```c++
// 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

```c++
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

```c++
// 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](https://github.com/ethereum/EIPs/pull/2333)

```c++
// 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.

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

### Run tests

```bash
./build/src/runtest
```

### Run benchmarks

```bash
./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

```bash
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](https://keybase.io/team/chinilla_network.public).

## 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](https://cmake.org/cmake/help/latest/module/FetchContent.html)
to download [pybind11](https://github.com/pybind/pybind11) for the Python
bindings and relic from a chinilla relic forked repository for Windows. Building
is then managed by [cibuildwheel](https://github.com/joerick/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](https://github.com/Chinilla/chinilla-blockchain/blob/main/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](https://lgtm.com/projects/g/Chinilla/bls-signatures/?mode=list).
Please make sure your build is passing and that it does not increase alerts
at lgtm.

## Specification and test vectors

The [IETF bls draft](https://datatracker.ietf.org/doc/draft-irtf-cfrg-hash-to-curve/)
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](https://www.gnu.org/licenses/lgpl-3.0.html)

## Relic license

Relic is used with the
[Apache 2.0 license](https://github.com/relic-toolkit/relic/blob/master/LICENSE.Apache-2.0)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Chinilla/bls-signatures",
    "name": "chinillablspy",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "",
    "author": "Mariano Sorgente",
    "author_email": "mariano@chinilla.com",
    "download_url": "https://files.pythonhosted.org/packages/2a/e6/734ef14ed06d25a455d28b3c4f4e514708a92d8a3c285c992876a70a8e8f/chinillablspy-1.0.16.tar.gz",
    "platform": null,
    "description": "# BLS Signatures implementation\r\n\r\n[![Build and Test C++, Javascript, and Python](https://github.com/Chinilla/bls-signatures/actions/workflows/build-test.yaml/badge.svg)](https://github.com/Chinilla/bls-signatures/actions/workflows/build-test.yaml)\r\n![PyPI](https://img.shields.io/pypi/v/chinillablspy?logo=pypi)\r\n![PyPI - Format](https://img.shields.io/pypi/format/chinillablspy?logo=pypi)\r\n![GitHub](https://img.shields.io/github/license/Chinilla/bls-signatures?logo=Github)\r\n\r\n[![Total alerts](https://img.shields.io/lgtm/alerts/g/Chinilla/bls-signatures.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Chinilla/bls-signatures/alerts/)\r\n[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Chinilla/bls-signatures.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Chinilla/bls-signatures/context:javascript)\r\n[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/Chinilla/bls-signatures.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Chinilla/bls-signatures/context:python)\r\n[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/Chinilla/bls-signatures.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Chinilla/bls-signatures/context:cpp)\r\n\r\nNOTE: THIS LIBRARY IS NOT YET FORMALLY REVIEWED FOR SECURITY\r\n\r\nNOTE: THIS LIBRARY WAS SHIFTED TO THE IETF BLS SPECIFICATION ON 7/16/20\r\n\r\nImplements BLS signatures with aggregation using [relic toolkit](https://github.com/relic-toolkit/relic)\r\nfor cryptographic primitives (pairings, EC, hashing) according to the\r\n[IETF BLS RFC](https://datatracker.ietf.org/doc/draft-irtf-cfrg-bls-signature/)\r\nwith [these curve parameters](https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/)\r\nfor BLS12-381.\r\n\r\nFeatures:\r\n\r\n* Non-interactive signature aggregation following IETF specification\r\n* Works on Windows, Mac, Linux, BSD\r\n* Efficient verification using Proof of Posssesion (only one pairing per distinct message)\r\n* Aggregate public keys and private keys\r\n* [EIP-2333](https://eips.ethereum.org/EIPS/eip-2333) key derivation (including unhardened BIP-32-like keys)\r\n* Key and signature serialization\r\n* Batch verification\r\n* [Python bindings](https://github.com/Chinilla/bls-signatures/tree/main/python-bindings)\r\n* [Pure python bls12-381 and signatures](https://github.com/Chinilla/bls-signatures/tree/main/python-impl)\r\n* [JavaScript bindings](https://github.com/Chinilla/bls-signatures/tree/main/js-bindings)\r\n\r\n## Before you start\r\n\r\nThis 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.\r\n\r\n## Import the library\r\n\r\n```c++\r\n#include \"bls.hpp\"\r\nusing namespace bls;\r\n```\r\n\r\n## Creating keys and signatures\r\n\r\n```c++\r\n// Example seed, used to generate private key. Always use\r\n// a secure RNG with sufficient entropy to generate a seed (at least 32 bytes).\r\nvector<uint8_t> seed = {0,  50, 6,  244, 24,  199, 1,  25,  52,  88,  192,\r\n                        19, 18, 12, 89,  6,   220, 18, 102, 58,  209, 82,\r\n                        12, 62, 89, 110, 182, 9,   44, 20,  254, 22};\r\n\r\nPrivateKey sk = AugSchemeMPL().KeyGen(seed);\r\nG1Element pk = sk.GetG1Element();\r\n\r\nvector<uint8_t> message = {1, 2, 3, 4, 5};  // Message is passed in as a byte vector\r\nG2Element signature = AugSchemeMPL().Sign(sk, message);\r\n\r\n// Verify the signature\r\nbool ok = AugSchemeMPL().Verify(pk, message, signature);\r\n```\r\n\r\n## Serializing keys and signatures to bytes\r\n\r\n```c++\r\nvector<uint8_t> skBytes = sk.Serialize();\r\nvector<uint8_t> pkBytes = pk.Serialize();\r\nvector<uint8_t> signatureBytes = signature.Serialize();\r\n\r\ncout << Util::HexStr(skBytes) << endl;    // 32 bytes printed in hex\r\ncout << Util::HexStr(pkBytes) << endl;    // 48 bytes printed in hex\r\ncout << Util::HexStr(signatureBytes) << endl;  // 96 bytes printed in hex\r\n```\r\n\r\n## Loading keys and signatures from bytes\r\n\r\n```c++\r\n// Takes vector of 32 bytes\r\nPrivateKey skc = PrivateKey::FromByteVector(skBytes);\r\n\r\n// Takes vector of 48 bytes\r\npk = G1Element::FromByteVector(pkBytes);\r\n\r\n// Takes vector of 96 bytes\r\nsignature = G2Element::FromByteVector(signatureBytes);\r\n```\r\n\r\n## Create aggregate signatures\r\n\r\n```c++\r\n// Generate some more private keys\r\nseed[0] = 1;\r\nPrivateKey sk1 = AugSchemeMPL().KeyGen(seed);\r\nseed[0] = 2;\r\nPrivateKey sk2 = AugSchemeMPL().KeyGen(seed);\r\nvector<uint8_t> message2 = {1, 2, 3, 4, 5, 6, 7};\r\n\r\n// Generate first sig\r\nG1Element pk1 = sk1.GetG1Element();\r\nG2Element sig1 = AugSchemeMPL().Sign(sk1, message);\r\n\r\n// Generate second sig\r\nG1Element pk2 = sk2.GetG1Element();\r\nG2Element sig2 = AugSchemeMPL().Sign(sk2, message2);\r\n\r\n// Signatures can be non-interactively combined by anyone\r\nG2Element aggSig = AugSchemeMPL().Aggregate({sig1, sig2});\r\n\r\nok = AugSchemeMPL().AggregateVerify({pk1, pk2}, {message, message2}, aggSig);\r\n```\r\n\r\n## Arbitrary trees of aggregates\r\n\r\n```c++\r\nseed[0] = 3;\r\nPrivateKey sk3 = AugSchemeMPL().KeyGen(seed);\r\nG1Element pk3 = sk3.GetG1Element();\r\nvector<uint8_t> message3 = {100, 2, 254, 88, 90, 45, 23};\r\nG2Element sig3 = AugSchemeMPL().Sign(sk3, message3);\r\n\r\n\r\nG2Element aggSigFinal = AugSchemeMPL().Aggregate({aggSig, sig3});\r\nok = AugSchemeMPL().AggregateVerify({pk1, pk2, pk3}, {message, message2, message3}, aggSigFinal);\r\n\r\n```\r\n\r\n## Very fast verification with Proof of Possession scheme\r\n\r\n```c++\r\n// If the same message is signed, you can use Proof of Posession (PopScheme) for efficiency\r\n// A proof of possession MUST be passed around with the PK to ensure security.\r\n\r\nG2Element popSig1 = PopSchemeMPL().Sign(sk1, message);\r\nG2Element popSig2 = PopSchemeMPL().Sign(sk2, message);\r\nG2Element popSig3 = PopSchemeMPL().Sign(sk3, message);\r\nG2Element pop1 = PopSchemeMPL().PopProve(sk1);\r\nG2Element pop2 = PopSchemeMPL().PopProve(sk2);\r\nG2Element pop3 = PopSchemeMPL().PopProve(sk3);\r\n\r\nok = PopSchemeMPL().PopVerify(pk1, pop1);\r\nok = PopSchemeMPL().PopVerify(pk2, pop2);\r\nok = PopSchemeMPL().PopVerify(pk3, pop3);\r\nG2Element popSigAgg = PopSchemeMPL().Aggregate({popSig1, popSig2, popSig3});\r\n\r\nok = PopSchemeMPL().FastAggregateVerify({pk1, pk2, pk3}, message, popSigAgg);\r\n\r\n// Aggregate public key, indistinguishable from a single public key\r\nG1Element popAggPk = pk1 + pk2 + pk3;\r\nok = PopSchemeMPL().Verify(popAggPk, message, popSigAgg);\r\n\r\n// Aggregate private keys\r\nPrivateKey aggSk = PrivateKey::Aggregate({sk1, sk2, sk3});\r\nok = (PopSchemeMPL().Sign(aggSk, message) == popSigAgg);\r\n```\r\n\r\n## HD keys using [EIP-2333](https://github.com/ethereum/EIPs/pull/2333)\r\n\r\n```c++\r\n// You can derive 'child' keys from any key, to create arbitrary trees. 4 byte indeces are used.\r\n// Hardened (more secure, but no parent pk -> child pk)\r\nPrivateKey masterSk = AugSchemeMPL().KeyGen(seed);\r\nPrivateKey child = AugSchemeMPL().DeriveChildSk(masterSk, 152);\r\nPrivateKey grandChild = AugSchemeMPL().DeriveChildSk(child, 952)\r\n\r\n// Unhardened (less secure, but can go from parent pk -> child pk), BIP32 style\r\nG1Element masterPk = masterSk.GetG1Element();\r\nPrivateKey childU = AugSchemeMPL().DeriveChildSkUnhardened(masterSk, 22);\r\nPrivateKey grandchildU = AugSchemeMPL().DeriveChildSkUnhardened(childU, 0);\r\n\r\nG1Element childUPk = AugSchemeMPL().DeriveChildPkUnhardened(masterPk, 22);\r\nG1Element grandchildUPk = AugSchemeMPL().DeriveChildPkUnhardened(childUPk, 0);\r\n\r\nok = (grandchildUPk == grandchildU.GetG1Element();\r\n```\r\n\r\n## Build\r\n\r\nCmake 3.14+, a c++ compiler, and python3 (for bindings) are required for building.\r\n\r\n```bash\r\nmkdir build\r\ncd build\r\ncmake ../\r\ncmake --build . -- -j 6\r\n```\r\n\r\n### Run tests\r\n\r\n```bash\r\n./build/src/runtest\r\n```\r\n\r\n### Run benchmarks\r\n\r\n```bash\r\n./build/src/runbench\r\n```\r\n\r\nOn a 3.5 GHz i7 Mac, verification takes about 1.1ms per signature, and signing takes 1.3ms.\r\n\r\n### Link the library to use it\r\n\r\n```bash\r\ng++ -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\r\n```\r\n\r\n## Notes on dependencies\r\n\r\nWe use Libsodium and have GMP as an optional dependency: libsodium gives secure memory\r\nallocation, and GMP speeds up the library by ~ 3x. MPIR is used on Windows via\r\nGitHub Actions instead. To install them, either download them from github and\r\nfollow the instructions for each repo, or use a package manager like APT or\r\nbrew. You can follow the recipe used to build python wheels for multiple\r\nplatforms in `.github/workflows/`.\r\n\r\n## Discussion\r\n\r\nDiscussion about this library and other Chinilla related development is in the #dev\r\nchannel of Chinilla's [public Keybase channels](https://keybase.io/team/chinilla_network.public).\r\n\r\n## Code style\r\n\r\n* Always use vector<uint8_t> for bytes\r\n* Use size_t for size variables\r\n* Uppercase method names\r\n* Prefer static constructors\r\n* Avoid using templates\r\n* Objects allocate and free their own memory\r\n* Use cpplint with default rules\r\n* Use SecAlloc and SecFree when handling secrets\r\n\r\n## ci Building\r\n\r\nThe primary build process for this repository is to use GitHub Actions to\r\nbuild binary wheels for MacOS, Linux (x64 and aarch64), and Windows and publish\r\nthem with a source wheel on PyPi. MacOS ARM64 is supported but not automated\r\ndue to a lack of M1 CI runners. See `.github/workflows/build.yml`. CMake uses\r\n[FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html)\r\nto download [pybind11](https://github.com/pybind/pybind11) for the Python\r\nbindings and relic from a chinilla relic forked repository for Windows. Building\r\nis then managed by [cibuildwheel](https://github.com/joerick/cibuildwheel).\r\nFurther installation is then available via `pip install chinillablspy` e.g. The ci\r\nbuilds include GMP and a statically linked libsodium.\r\n\r\n## Contributing and workflow\r\n\r\nContributions are welcome and more details are available in chinilla-blockchain's\r\n[CONTRIBUTING.md](https://github.com/Chinilla/chinilla-blockchain/blob/main/CONTRIBUTING.md).\r\n\r\nThe main branch is usually the currently released latest version on PyPI.\r\nNote that at times bls-signatures/chinillablspy will be ahead of the release version\r\nthat chinilla-blockchain requires in it's main/release version in preparation\r\nfor a new chinilla-blockchain release. Please branch or fork main and then create\r\na pull request to the main branch. Linear merging is enforced on main and\r\nmerging requires a completed review. PRs will kick off a GitHub actions ci\r\nbuild and analysis of bls-signatures at\r\n[lgtm.com](https://lgtm.com/projects/g/Chinilla/bls-signatures/?mode=list).\r\nPlease make sure your build is passing and that it does not increase alerts\r\nat lgtm.\r\n\r\n## Specification and test vectors\r\n\r\nThe [IETF bls draft](https://datatracker.ietf.org/doc/draft-irtf-cfrg-hash-to-curve/)\r\nis followed. Test vectors can also be seen in the python and cpp test files.\r\n\r\n## Libsodium license\r\n\r\nThe libsodium static library is licensed under the ISC license which requires\r\nthe following copyright notice.\r\n\r\n>ISC License\r\n>\r\n>Copyright (c) 2013-2020\r\n>Frank Denis \\<j at pureftpd dot org\\>\r\n>\r\n>Permission to use, copy, modify, and/or distribute this software for any\r\n>purpose with or without fee is hereby granted, provided that the above\r\n>copyright notice and this permission notice appear in all copies.\r\n>\r\n>THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n>WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n>MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n>ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n>WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n>ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n>OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n\r\n## GMP license\r\n\r\nGMP is distributed under the\r\n[GNU LGPL v3 license](https://www.gnu.org/licenses/lgpl-3.0.html)\r\n\r\n## Relic license\r\n\r\nRelic is used with the\r\n[Apache 2.0 license](https://github.com/relic-toolkit/relic/blob/master/LICENSE.Apache-2.0)\r\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "BLS signatures in c++ (with python bindings)",
    "version": "1.0.16",
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "0378a250c56e73ce4966cd0fc29e8d5d",
                "sha256": "b4d1e5b5785470d62be42db0578b5e73b9ccf8e5f8349c9cbd454477a7960a8b"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp310-cp310-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0378a250c56e73ce4966cd0fc29e8d5d",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 655080,
            "upload_time": "2022-12-08T08:58:10",
            "upload_time_iso_8601": "2022-12-08T08:58:10.300781Z",
            "url": "https://files.pythonhosted.org/packages/20/9e/4c9ad0bb67c0f6a7bb51d4e96bb4d83d53aa201ee1461d6b28ce04dd858b/chinillablspy-1.0.16-cp310-cp310-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "97caaa72a91acf5fc35b7506e172c815",
                "sha256": "82fe087d46b22adae8edba7207fdae3843deaae9a8a9c89deb3d3a3ad40b9c02"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
            "has_sig": false,
            "md5_digest": "97caaa72a91acf5fc35b7506e172c815",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 832249,
            "upload_time": "2022-12-08T08:57:57",
            "upload_time_iso_8601": "2022-12-08T08:57:57.935290Z",
            "url": "https://files.pythonhosted.org/packages/fd/3e/8a0067edcd749469484c0e899aebfcf15138c12b12a9a04ac7f8d1b6cce9/chinillablspy-1.0.16-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "a3c8ba4d832583d8899727d9fef0544d",
                "sha256": "57bf8950068a165533e00c1fc0d872fdf4fbe4b46d2557ea37768949c20ccd6d"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "a3c8ba4d832583d8899727d9fef0544d",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 756116,
            "upload_time": "2022-12-08T08:58:05",
            "upload_time_iso_8601": "2022-12-08T08:58:05.451220Z",
            "url": "https://files.pythonhosted.org/packages/e2/53/441b978e30c0535b18ec40689ca1c0d0039fbba9433dc690c0bc3c423331/chinillablspy-1.0.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "2b0fb5a422700ba64b0095ff1652353a",
                "sha256": "24bd513d4fa00e83138d833e2888c77028d5e8161cdada345915f7bd79e72ea7"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2b0fb5a422700ba64b0095ff1652353a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 2050798,
            "upload_time": "2022-12-08T08:58:14",
            "upload_time_iso_8601": "2022-12-08T08:58:14.045946Z",
            "url": "https://files.pythonhosted.org/packages/a3/e6/82941332a16023e9e566661572681eb2e2a7829b96b42f758781f2c1a8e2/chinillablspy-1.0.16-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "35c5ee72f7c620c9c75974d4c84f743b",
                "sha256": "71b7746471e37bbf5f665fde7a494881bdd67d260b62acbdb21fd26cceb6048a"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp311-cp311-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "35c5ee72f7c620c9c75974d4c84f743b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 655096,
            "upload_time": "2022-12-08T08:57:56",
            "upload_time_iso_8601": "2022-12-08T08:57:56.215859Z",
            "url": "https://files.pythonhosted.org/packages/1f/92/c59859d565c58d2d38510e1ed7b5f889de91fdc8c646613e5fd62ef49303/chinillablspy-1.0.16-cp311-cp311-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "dfc95e47805f562333b796ff9ca26385",
                "sha256": "a40f5b16922336668d06812851ec5ce16454846e3d0854721f6170fcc56916b6"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "dfc95e47805f562333b796ff9ca26385",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 756067,
            "upload_time": "2022-12-08T08:57:50",
            "upload_time_iso_8601": "2022-12-08T08:57:50.848726Z",
            "url": "https://files.pythonhosted.org/packages/ae/92/9312e3cfc5cc26a88e2cef59138d9cf6ba4046bf983a5456ea6edbfcb456/chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "3c1edc4b30d8401b04c67ed70f773913",
                "sha256": "4612ee5eb135458f720e4bb6b4b9540ca82abe58a63cfef06819ee6dd344e73f"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3c1edc4b30d8401b04c67ed70f773913",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 846457,
            "upload_time": "2022-12-08T08:58:16",
            "upload_time_iso_8601": "2022-12-08T08:58:16.964713Z",
            "url": "https://files.pythonhosted.org/packages/50/4f/98a0d88952c2e1de2925dc6743bb355deb9f56a53efce8e62449f5fef307/chinillablspy-1.0.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "da140b21bd07297b30300e36859dc10a",
                "sha256": "39ade07ec8dac5ae1273014300be91445d039b177d6bd64c51960c4fdd232705"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "da140b21bd07297b30300e36859dc10a",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 2050791,
            "upload_time": "2022-12-08T08:58:01",
            "upload_time_iso_8601": "2022-12-08T08:58:01.559893Z",
            "url": "https://files.pythonhosted.org/packages/30/89/8135d3db728c9a21a70e86aebad7b8a43429878974beaff1980f5d8fe0f6/chinillablspy-1.0.16-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "0e08507ba2e66e91e3e66951a42feb38",
                "sha256": "421fb2f5fc1e13e8d39780cd50f4b992ae4428eef79b6ca9d649558194fb1385"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp37-cp37m-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0e08507ba2e66e91e3e66951a42feb38",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 651703,
            "upload_time": "2022-12-08T08:58:11",
            "upload_time_iso_8601": "2022-12-08T08:58:11.985793Z",
            "url": "https://files.pythonhosted.org/packages/71/58/5bada5f657b75068291a3dd4c85b853efbe71395482d1ffba1e57e18b185/chinillablspy-1.0.16-cp37-cp37m-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "84bc22bc221870de80b248d46483d5b8",
                "sha256": "7707b4f7b78e211abafd9e132795b9b3ceb914e3149ecd0da3503105b40f72ff"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
            "has_sig": false,
            "md5_digest": "84bc22bc221870de80b248d46483d5b8",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 832347,
            "upload_time": "2022-12-08T08:57:52",
            "upload_time_iso_8601": "2022-12-08T08:57:52.557615Z",
            "url": "https://files.pythonhosted.org/packages/83/79/bb1f3179d8e4976a643b7cd414812e5088655aa82d317e1d1a7438acbe8c/chinillablspy-1.0.16-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "bc7c4052b8a5b7c4c37bd4edf539ce2c",
                "sha256": "11ccdb3ceca023600cd5efca1302655e82d87ca0e216adf6f2257d68852140f6"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "bc7c4052b8a5b7c4c37bd4edf539ce2c",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 757454,
            "upload_time": "2022-12-08T08:58:08",
            "upload_time_iso_8601": "2022-12-08T08:58:08.918388Z",
            "url": "https://files.pythonhosted.org/packages/8e/7f/5eea1932554d3a289b15141c018c80ba7beedf6257cbaa72c98f0f6087ee/chinillablspy-1.0.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "cbfefb31ca2cc01f413407e597f62a46",
                "sha256": "209f2aebe7b14fc1f218e41a666cbf40b7e66eaf6664bbea21dc441a262a64b0"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "cbfefb31ca2cc01f413407e597f62a46",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 2050326,
            "upload_time": "2022-12-08T08:58:20",
            "upload_time_iso_8601": "2022-12-08T08:58:20.620787Z",
            "url": "https://files.pythonhosted.org/packages/ba/a1/656f67ef15bf7f008a2ba592c35a9a3820d2a65130f458958d1e67c014e5/chinillablspy-1.0.16-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "bec8a675ca6c8e2cc18c6b9e882156e4",
                "sha256": "941972d6a3eee741efc4984aeda6cfa8c6a08d575948ac966dcb61b2c775b3dc"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp38-cp38-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bec8a675ca6c8e2cc18c6b9e882156e4",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 655072,
            "upload_time": "2022-12-08T08:58:18",
            "upload_time_iso_8601": "2022-12-08T08:58:18.338501Z",
            "url": "https://files.pythonhosted.org/packages/d6/cb/b1c08d602d52e803b328156f3acf4564ce052447ea8bdcc4ed1bd9500935/chinillablspy-1.0.16-cp38-cp38-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "ecd911b91ea9e8c89f0274af73efd7d6",
                "sha256": "2aa39fbdf334b6d010973d3d3b2bf9dda0dfce448a96397f564917877f4ae3ba"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ecd911b91ea9e8c89f0274af73efd7d6",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 831977,
            "upload_time": "2022-12-08T08:57:54",
            "upload_time_iso_8601": "2022-12-08T08:57:54.287727Z",
            "url": "https://files.pythonhosted.org/packages/07/e1/a08e626456ee4f3c7eb8029b7fe43c13ebb8fcad19137804b7570c342570/chinillablspy-1.0.16-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "6f351165ba6aec410717ee94c28bf342",
                "sha256": "4aea3e74837b35f4d5e01dc037df346eb3bca341b67fbedbe9a8001d3ea7d1bd"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "6f351165ba6aec410717ee94c28bf342",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 755576,
            "upload_time": "2022-12-08T08:58:07",
            "upload_time_iso_8601": "2022-12-08T08:58:07.421681Z",
            "url": "https://files.pythonhosted.org/packages/a8/cf/fa141d4d4d449dfb59a91c4f393f1edfb110c8d36fee8b94ca38ae4e9847/chinillablspy-1.0.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "ad35a273b49f591d91afd8cbd17c9a5c",
                "sha256": "c380b8cca89e80f62f2a0a147e2fa20ec8c3b65fb10bc32d380fc0a99bcb393a"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ad35a273b49f591d91afd8cbd17c9a5c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 2050760,
            "upload_time": "2022-12-08T08:57:48",
            "upload_time_iso_8601": "2022-12-08T08:57:48.783134Z",
            "url": "https://files.pythonhosted.org/packages/6b/b0/c3a13991e3e4744385deb975340179ae9e35dd6300338f4c08d3e578e36b/chinillablspy-1.0.16-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "42bbb22908dffd2c0836efa9fca1c0b3",
                "sha256": "7250bcb95224b219dda4c393deb171149c922c6dcb88f0a2a7d97a2f8f04710a"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp39-cp39-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "42bbb22908dffd2c0836efa9fca1c0b3",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 655193,
            "upload_time": "2022-12-08T08:58:15",
            "upload_time_iso_8601": "2022-12-08T08:58:15.451456Z",
            "url": "https://files.pythonhosted.org/packages/87/77/2c0a05669ca185d17a40a0c7fb9844565478d0ccac32e01a4af006e2bef8/chinillablspy-1.0.16-cp39-cp39-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "8522c54300cc0118b14a96ee50efd4ac",
                "sha256": "60c49753ea7bd9b0e0a7e3b4aa915df68012edda059e6d38e632ed2982e0a82c"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8522c54300cc0118b14a96ee50efd4ac",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 832617,
            "upload_time": "2022-12-08T08:58:22",
            "upload_time_iso_8601": "2022-12-08T08:58:22.116693Z",
            "url": "https://files.pythonhosted.org/packages/de/0d/1be6084d9f0cc57965f88ac5ccbb6b69d6d880632a7ffff22f38b71cfd26/chinillablspy-1.0.16-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "d523c43e7e7ef3b7eec509686a2e3f60",
                "sha256": "bf1b261e130e2cf765eee81bafebc35078c3cdcd899c27e8af6d8a0cd51c1322"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "d523c43e7e7ef3b7eec509686a2e3f60",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 756116,
            "upload_time": "2022-12-08T08:58:03",
            "upload_time_iso_8601": "2022-12-08T08:58:03.588135Z",
            "url": "https://files.pythonhosted.org/packages/51/59/c5e3b6128b546d1c194b2c3c139604a728c4a4d5101c1058627871d5fb09/chinillablspy-1.0.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "2193ed014d61d324b09c23b739b60e84",
                "sha256": "ac8548686bbb690cf79721dd7ee2c642b5aa22c97f1adc8e4fee9636d81cc944"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2193ed014d61d324b09c23b739b60e84",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 2050887,
            "upload_time": "2022-12-08T08:57:59",
            "upload_time_iso_8601": "2022-12-08T08:57:59.626437Z",
            "url": "https://files.pythonhosted.org/packages/7d/83/3b179954c4f63d3da34ffb16ff2a023b51aed8a0adf29ae497be38a3860c/chinillablspy-1.0.16-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "6b25d578a8149bb277839bb50f8547e1",
                "sha256": "87d70f2b2ae45f7a1a3e239c612c0ad20d0ef87d9e3da07e185b9c6ccf40258a"
            },
            "downloads": -1,
            "filename": "chinillablspy-1.0.16.tar.gz",
            "has_sig": false,
            "md5_digest": "6b25d578a8149bb277839bb50f8547e1",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 163255,
            "upload_time": "2022-12-08T08:58:23",
            "upload_time_iso_8601": "2022-12-08T08:58:23.849930Z",
            "url": "https://files.pythonhosted.org/packages/2a/e6/734ef14ed06d25a455d28b3c4f4e514708a92d8a3c285c992876a70a8e8f/chinillablspy-1.0.16.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-12-08 08:58:23",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "Chinilla",
    "github_project": "bls-signatures",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "chinillablspy"
}
        
Elapsed time: 0.01660s