blspy


Nameblspy JSON
Version 2.0.2 PyPI version JSON
download
home_pagehttps://github.com/Chia-Network/bls-signatures
SummaryBLS signatures in c++ (python bindings)
upload_time2023-06-26 17:22:02
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/Chia-Network/bls-signatures/actions/workflows/build-test.yaml/badge.svg)](https://github.com/Chia-Network/bls-signatures/actions/workflows/build-test.yaml)
![PyPI](https://img.shields.io/pypi/v/blspy?logo=pypi)
![PyPI - Format](https://img.shields.io/pypi/format/blspy?logo=pypi)
![GitHub](https://img.shields.io/github/license/Chia-Network/bls-signatures?logo=Github)

[![CodeQL](https://github.com/Chia-Network/bls-signatures/actions/workflows/codeql.yml/badge.svg)](https://github.com/Chia-Network/bls-signatures/actions/workflows/codeql.yml)

[![Coverage Status](https://coveralls.io/repos/github/Chia-Network/bls-signatures/badge.svg?branch=main)](https://coveralls.io/github/Chia-Network/bls-signatures?branch=main)

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 [blst library](https://github.com/supranational/blst.git)
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/Chia-Network/bls-signatures/tree/main/python-bindings)
* [Pure python bls12-381 and signatures](https://github.com/Chia-Network/bls-signatures/tree/main/python-impl)
* [JavaScript bindings](https://github.com/Chia-Network/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/src -L./bls-signatures/build/ -l bls yourapp.cpp
```

## Notes on dependencies

We use Libsodium which provides secure memory
allocation. To install it, either download them from github and
follow the instructions for each repo, or use a package manager like APT or
brew. You can follow the recipe used to build python wheels for multiple
platforms in `.github/workflows/`.

## Discussion

Discussion about this library and other Chia related development is in the #dev
channel of Chia's [public Keybase channels](https://keybase.io/team/chia_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. Building
is then managed by [cibuildwheel](https://github.com/joerick/cibuildwheel).
Further installation is then available via `pip install blspy` e.g. The ci
builds include a statically linked libsodium.

## Contributing and workflow

Contributions are welcome and more details are available in chia-blockchain's
[CONTRIBUTING.md](https://github.com/Chia-Network/chia-blockchain/blob/main/CONTRIBUTING.md).

The main branch is usually the currently released latest version on PyPI.
Note that at times bls-signatures/blspy will be ahead of the release version
that chia-blockchain requires in it's main/release version in preparation
for a new chia-blockchain release. Please branch or fork main and then create
a pull request to the main branch. Linear merging is enforced on main and
merging requires a completed review. PRs will kick off a GitHub actions ci
build and analysis of bls-signatures at
[lgtm.com](https://lgtm.com/projects/g/Chia-Network/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.

## BLST license

BLST is used with the
[Apache 2.0 license](https://github.com/supranational/blst/blob/master/LICENSE)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Chia-Network/bls-signatures",
    "name": "blspy",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "",
    "author": "Mariano Sorgente",
    "author_email": "mariano@chia.net",
    "download_url": "https://files.pythonhosted.org/packages/c4/0d/fe4785001d093762561c2cf50c11c34adaffed0f48c8b963a59bea6cfe88/blspy-2.0.2.tar.gz",
    "platform": null,
    "description": "# BLS Signatures implementation\n\n[![Build and Test C++, Javascript, and Python](https://github.com/Chia-Network/bls-signatures/actions/workflows/build-test.yaml/badge.svg)](https://github.com/Chia-Network/bls-signatures/actions/workflows/build-test.yaml)\n![PyPI](https://img.shields.io/pypi/v/blspy?logo=pypi)\n![PyPI - Format](https://img.shields.io/pypi/format/blspy?logo=pypi)\n![GitHub](https://img.shields.io/github/license/Chia-Network/bls-signatures?logo=Github)\n\n[![CodeQL](https://github.com/Chia-Network/bls-signatures/actions/workflows/codeql.yml/badge.svg)](https://github.com/Chia-Network/bls-signatures/actions/workflows/codeql.yml)\n\n[![Coverage Status](https://coveralls.io/repos/github/Chia-Network/bls-signatures/badge.svg?branch=main)](https://coveralls.io/github/Chia-Network/bls-signatures?branch=main)\n\nNOTE: THIS LIBRARY IS NOT YET FORMALLY REVIEWED FOR SECURITY\n\nNOTE: THIS LIBRARY WAS SHIFTED TO THE IETF BLS SPECIFICATION ON 7/16/20\n\nImplements BLS signatures with aggregation using [blst library](https://github.com/supranational/blst.git)\nfor cryptographic primitives (pairings, EC, hashing) according to the\n[IETF BLS RFC](https://datatracker.ietf.org/doc/draft-irtf-cfrg-bls-signature/)\nwith [these curve parameters](https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/)\nfor BLS12-381.\n\nFeatures:\n\n* Non-interactive signature aggregation following IETF specification\n* Works on Windows, Mac, Linux, BSD\n* Efficient verification using Proof of Posssesion (only one pairing per distinct message)\n* Aggregate public keys and private keys\n* [EIP-2333](https://eips.ethereum.org/EIPS/eip-2333) key derivation (including unhardened BIP-32-like keys)\n* Key and signature serialization\n* Batch verification\n* [Python bindings](https://github.com/Chia-Network/bls-signatures/tree/main/python-bindings)\n* [Pure python bls12-381 and signatures](https://github.com/Chia-Network/bls-signatures/tree/main/python-impl)\n* [JavaScript bindings](https://github.com/Chia-Network/bls-signatures/tree/main/js-bindings)\n\n## Before you start\n\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.\n\n## Import the library\n\n```c++\n#include \"bls.hpp\"\nusing namespace bls;\n```\n\n## Creating keys and signatures\n\n```c++\n// Example seed, used to generate private key. Always use\n// a secure RNG with sufficient entropy to generate a seed (at least 32 bytes).\nvector<uint8_t> seed = {0,  50, 6,  244, 24,  199, 1,  25,  52,  88,  192,\n                        19, 18, 12, 89,  6,   220, 18, 102, 58,  209, 82,\n                        12, 62, 89, 110, 182, 9,   44, 20,  254, 22};\n\nPrivateKey sk = AugSchemeMPL().KeyGen(seed);\nG1Element pk = sk.GetG1Element();\n\nvector<uint8_t> message = {1, 2, 3, 4, 5};  // Message is passed in as a byte vector\nG2Element signature = AugSchemeMPL().Sign(sk, message);\n\n// Verify the signature\nbool ok = AugSchemeMPL().Verify(pk, message, signature);\n```\n\n## Serializing keys and signatures to bytes\n\n```c++\nvector<uint8_t> skBytes = sk.Serialize();\nvector<uint8_t> pkBytes = pk.Serialize();\nvector<uint8_t> signatureBytes = signature.Serialize();\n\ncout << Util::HexStr(skBytes) << endl;    // 32 bytes printed in hex\ncout << Util::HexStr(pkBytes) << endl;    // 48 bytes printed in hex\ncout << Util::HexStr(signatureBytes) << endl;  // 96 bytes printed in hex\n```\n\n## Loading keys and signatures from bytes\n\n```c++\n// Takes vector of 32 bytes\nPrivateKey skc = PrivateKey::FromByteVector(skBytes);\n\n// Takes vector of 48 bytes\npk = G1Element::FromByteVector(pkBytes);\n\n// Takes vector of 96 bytes\nsignature = G2Element::FromByteVector(signatureBytes);\n```\n\n## Create aggregate signatures\n\n```c++\n// Generate some more private keys\nseed[0] = 1;\nPrivateKey sk1 = AugSchemeMPL().KeyGen(seed);\nseed[0] = 2;\nPrivateKey sk2 = AugSchemeMPL().KeyGen(seed);\nvector<uint8_t> message2 = {1, 2, 3, 4, 5, 6, 7};\n\n// Generate first sig\nG1Element pk1 = sk1.GetG1Element();\nG2Element sig1 = AugSchemeMPL().Sign(sk1, message);\n\n// Generate second sig\nG1Element pk2 = sk2.GetG1Element();\nG2Element sig2 = AugSchemeMPL().Sign(sk2, message2);\n\n// Signatures can be non-interactively combined by anyone\nG2Element aggSig = AugSchemeMPL().Aggregate({sig1, sig2});\n\nok = AugSchemeMPL().AggregateVerify({pk1, pk2}, {message, message2}, aggSig);\n```\n\n## Arbitrary trees of aggregates\n\n```c++\nseed[0] = 3;\nPrivateKey sk3 = AugSchemeMPL().KeyGen(seed);\nG1Element pk3 = sk3.GetG1Element();\nvector<uint8_t> message3 = {100, 2, 254, 88, 90, 45, 23};\nG2Element sig3 = AugSchemeMPL().Sign(sk3, message3);\n\n\nG2Element aggSigFinal = AugSchemeMPL().Aggregate({aggSig, sig3});\nok = AugSchemeMPL().AggregateVerify({pk1, pk2, pk3}, {message, message2, message3}, aggSigFinal);\n\n```\n\n## Very fast verification with Proof of Possession scheme\n\n```c++\n// If the same message is signed, you can use Proof of Posession (PopScheme) for efficiency\n// A proof of possession MUST be passed around with the PK to ensure security.\n\nG2Element popSig1 = PopSchemeMPL().Sign(sk1, message);\nG2Element popSig2 = PopSchemeMPL().Sign(sk2, message);\nG2Element popSig3 = PopSchemeMPL().Sign(sk3, message);\nG2Element pop1 = PopSchemeMPL().PopProve(sk1);\nG2Element pop2 = PopSchemeMPL().PopProve(sk2);\nG2Element pop3 = PopSchemeMPL().PopProve(sk3);\n\nok = PopSchemeMPL().PopVerify(pk1, pop1);\nok = PopSchemeMPL().PopVerify(pk2, pop2);\nok = PopSchemeMPL().PopVerify(pk3, pop3);\nG2Element popSigAgg = PopSchemeMPL().Aggregate({popSig1, popSig2, popSig3});\n\nok = PopSchemeMPL().FastAggregateVerify({pk1, pk2, pk3}, message, popSigAgg);\n\n// Aggregate public key, indistinguishable from a single public key\nG1Element popAggPk = pk1 + pk2 + pk3;\nok = PopSchemeMPL().Verify(popAggPk, message, popSigAgg);\n\n// Aggregate private keys\nPrivateKey aggSk = PrivateKey::Aggregate({sk1, sk2, sk3});\nok = (PopSchemeMPL().Sign(aggSk, message) == popSigAgg);\n```\n\n## HD keys using [EIP-2333](https://github.com/ethereum/EIPs/pull/2333)\n\n```c++\n// You can derive 'child' keys from any key, to create arbitrary trees. 4 byte indeces are used.\n// Hardened (more secure, but no parent pk -> child pk)\nPrivateKey masterSk = AugSchemeMPL().KeyGen(seed);\nPrivateKey child = AugSchemeMPL().DeriveChildSk(masterSk, 152);\nPrivateKey grandChild = AugSchemeMPL().DeriveChildSk(child, 952)\n\n// Unhardened (less secure, but can go from parent pk -> child pk), BIP32 style\nG1Element masterPk = masterSk.GetG1Element();\nPrivateKey childU = AugSchemeMPL().DeriveChildSkUnhardened(masterSk, 22);\nPrivateKey grandchildU = AugSchemeMPL().DeriveChildSkUnhardened(childU, 0);\n\nG1Element childUPk = AugSchemeMPL().DeriveChildPkUnhardened(masterPk, 22);\nG1Element grandchildUPk = AugSchemeMPL().DeriveChildPkUnhardened(childUPk, 0);\n\nok = (grandchildUPk == grandchildU.GetG1Element();\n```\n\n## Build\n\nCmake 3.14+, a c++ compiler, and python3 (for bindings) are required for building.\n\n```bash\nmkdir build\ncd build\ncmake ../\ncmake --build . -- -j 6\n```\n\n### Run tests\n\n```bash\n./build/src/runtest\n```\n\n### Run benchmarks\n\n```bash\n./build/src/runbench\n```\n\nOn a 3.5 GHz i7 Mac, verification takes about 1.1ms per signature, and signing takes 1.3ms.\n\n### Link the library to use it\n\n```bash\ng++ -Wl,-no_pie -std=c++11 -Ibls-signatures/src -L./bls-signatures/build/ -l bls yourapp.cpp\n```\n\n## Notes on dependencies\n\nWe use Libsodium which provides secure memory\nallocation. To install it, either download them from github and\nfollow the instructions for each repo, or use a package manager like APT or\nbrew. You can follow the recipe used to build python wheels for multiple\nplatforms in `.github/workflows/`.\n\n## Discussion\n\nDiscussion about this library and other Chia related development is in the #dev\nchannel of Chia's [public Keybase channels](https://keybase.io/team/chia_network.public).\n\n## Code style\n\n* Always use vector<uint8_t> for bytes\n* Use size_t for size variables\n* Uppercase method names\n* Prefer static constructors\n* Avoid using templates\n* Objects allocate and free their own memory\n* Use cpplint with default rules\n* Use SecAlloc and SecFree when handling secrets\n\n## ci Building\n\nThe primary build process for this repository is to use GitHub Actions to\nbuild binary wheels for MacOS, Linux (x64 and aarch64), and Windows and publish\nthem with a source wheel on PyPi. MacOS ARM64 is supported but not automated\ndue to a lack of M1 CI runners. See `.github/workflows/build.yml`. CMake uses\n[FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html)\nto download [pybind11](https://github.com/pybind/pybind11) for the Python\nbindings. Building\nis then managed by [cibuildwheel](https://github.com/joerick/cibuildwheel).\nFurther installation is then available via `pip install blspy` e.g. The ci\nbuilds include a statically linked libsodium.\n\n## Contributing and workflow\n\nContributions are welcome and more details are available in chia-blockchain's\n[CONTRIBUTING.md](https://github.com/Chia-Network/chia-blockchain/blob/main/CONTRIBUTING.md).\n\nThe main branch is usually the currently released latest version on PyPI.\nNote that at times bls-signatures/blspy will be ahead of the release version\nthat chia-blockchain requires in it's main/release version in preparation\nfor a new chia-blockchain release. Please branch or fork main and then create\na pull request to the main branch. Linear merging is enforced on main and\nmerging requires a completed review. PRs will kick off a GitHub actions ci\nbuild and analysis of bls-signatures at\n[lgtm.com](https://lgtm.com/projects/g/Chia-Network/bls-signatures/?mode=list).\nPlease make sure your build is passing and that it does not increase alerts\nat lgtm.\n\n## Specification and test vectors\n\nThe [IETF bls draft](https://datatracker.ietf.org/doc/draft-irtf-cfrg-hash-to-curve/)\nis followed. Test vectors can also be seen in the python and cpp test files.\n\n## Libsodium license\n\nThe libsodium static library is licensed under the ISC license which requires\nthe following copyright notice.\n\n>ISC License\n>\n>Copyright (c) 2013-2020\n>Frank Denis \\<j at pureftpd dot org\\>\n>\n>Permission to use, copy, modify, and/or distribute this software for any\n>purpose with or without fee is hereby granted, provided that the above\n>copyright notice and this permission notice appear in all copies.\n>\n>THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n>WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n>MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n>ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n>WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n>ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n>OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n## BLST license\n\nBLST is used with the\n[Apache 2.0 license](https://github.com/supranational/blst/blob/master/LICENSE)\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "BLS signatures in c++ (python bindings)",
    "version": "2.0.2",
    "project_urls": {
        "Homepage": "https://github.com/Chia-Network/bls-signatures"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "642b4c9ca502fbba973021767358d10b9981943ef0c9c53b979de3dc737e5629",
                "md5": "65143bed025703cc0fdaf8781db578cd",
                "sha256": "c053733d674ff92fcb4059b36b75c29337d34afbd900a0bc2113ad86fc447b77"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp310-cp310-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "65143bed025703cc0fdaf8781db578cd",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 315608,
            "upload_time": "2023-06-26T17:21:52",
            "upload_time_iso_8601": "2023-06-26T17:21:52.461106Z",
            "url": "https://files.pythonhosted.org/packages/64/2b/4c9ca502fbba973021767358d10b9981943ef0c9c53b979de3dc737e5629/blspy-2.0.2-cp310-cp310-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "761fac2859ea23bc142af11178e4682f1924325f44dae39377ab5d6d2a034805",
                "md5": "ab1f90f7c8aa40c2d995256868ff0cad",
                "sha256": "dbb053ccb1b48584cc4d357f29c770a2cf3e05faa8b184bd9294e8ed01a565b5"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "ab1f90f7c8aa40c2d995256868ff0cad",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 299633,
            "upload_time": "2023-06-26T17:21:31",
            "upload_time_iso_8601": "2023-06-26T17:21:31.607155Z",
            "url": "https://files.pythonhosted.org/packages/76/1f/ac2859ea23bc142af11178e4682f1924325f44dae39377ab5d6d2a034805/blspy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "75132f328696a1a431a22969bd26706644ffce89955201706cf089e8d1f1d079",
                "md5": "b449afb8fc4362bbdd09397e31a780e2",
                "sha256": "1a0b208b80fa76c9adf296a77aa805127840cf5ca8f1af6e8c223f803d1770c5"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b449afb8fc4362bbdd09397e31a780e2",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 323905,
            "upload_time": "2023-06-26T17:21:25",
            "upload_time_iso_8601": "2023-06-26T17:21:25.129430Z",
            "url": "https://files.pythonhosted.org/packages/75/13/2f328696a1a431a22969bd26706644ffce89955201706cf089e8d1f1d079/blspy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b844a9f525cab80e2fcae0ea9969c5bcf4fab3afb97bed51445035834cee3b01",
                "md5": "553068d7191e5e0895812d6cd41b1adf",
                "sha256": "fc615db0f93911c24bb6512140e8f098f506d455c44fa1830fdb98e2590bc9f0"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "553068d7191e5e0895812d6cd41b1adf",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 348851,
            "upload_time": "2023-06-26T17:21:56",
            "upload_time_iso_8601": "2023-06-26T17:21:56.113860Z",
            "url": "https://files.pythonhosted.org/packages/b8/44/a9f525cab80e2fcae0ea9969c5bcf4fab3afb97bed51445035834cee3b01/blspy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6cd276689f4997b463f365d6a54758db71402d5cb62b599390abadd9d3e9420d",
                "md5": "e4111da2656cd29984c02445a37e1da9",
                "sha256": "c5581b44d0a4e01ba55183cadfc0139b9a97620c7910a5487023918f07b85271"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e4111da2656cd29984c02445a37e1da9",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.7",
            "size": 260090,
            "upload_time": "2023-06-26T17:21:47",
            "upload_time_iso_8601": "2023-06-26T17:21:47.233299Z",
            "url": "https://files.pythonhosted.org/packages/6c/d2/76689f4997b463f365d6a54758db71402d5cb62b599390abadd9d3e9420d/blspy-2.0.2-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8350c34edf114e518079dd04b59d47e6cb188a051ec648184151b7c395dfa53c",
                "md5": "e5fbf410040351b00340e8ce14d39674",
                "sha256": "fdb1dfc95c2563a7c3faa31e729ef972f5be04bcfd4478cc40e97e7df6c81bfb"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp311-cp311-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e5fbf410040351b00340e8ce14d39674",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 315531,
            "upload_time": "2023-06-26T17:21:21",
            "upload_time_iso_8601": "2023-06-26T17:21:21.294637Z",
            "url": "https://files.pythonhosted.org/packages/83/50/c34edf114e518079dd04b59d47e6cb188a051ec648184151b7c395dfa53c/blspy-2.0.2-cp311-cp311-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b6c050920752ba210bad390376b4269dd8a19bd234b64d7364d0aa4e8c482096",
                "md5": "968dbef146c5736be42e20c510d46b63",
                "sha256": "ebff8fdecf5ce5d4fabd9f39d0a1a5bce66e560f7bd7126f300cfebe69ca5aff"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "968dbef146c5736be42e20c510d46b63",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 299610,
            "upload_time": "2023-06-26T17:21:27",
            "upload_time_iso_8601": "2023-06-26T17:21:27.761860Z",
            "url": "https://files.pythonhosted.org/packages/b6/c0/50920752ba210bad390376b4269dd8a19bd234b64d7364d0aa4e8c482096/blspy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "248f408ba8a84d64bfd068c24989420f8970c34a8f288c1004048f50e3045137",
                "md5": "b64db116022cd7db8b3f7f0767db1a2c",
                "sha256": "29731d2f8203bee252bc8b80347486a17c278bf7ab6e0956a44a45a91e2d595d"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b64db116022cd7db8b3f7f0767db1a2c",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 324010,
            "upload_time": "2023-06-26T17:21:33",
            "upload_time_iso_8601": "2023-06-26T17:21:33.668128Z",
            "url": "https://files.pythonhosted.org/packages/24/8f/408ba8a84d64bfd068c24989420f8970c34a8f288c1004048f50e3045137/blspy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "edbbd675b2a9979181eb3130e347469a4c6b910e6697df7b81d7f6dc879e1641",
                "md5": "fb1eb13f04faa1295ed42ce6ec23e463",
                "sha256": "67fe57111005f2ea19536b526c92e70567118fbba1f5bfc5aa59949a52127852"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fb1eb13f04faa1295ed42ce6ec23e463",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 348921,
            "upload_time": "2023-06-26T17:21:42",
            "upload_time_iso_8601": "2023-06-26T17:21:42.824332Z",
            "url": "https://files.pythonhosted.org/packages/ed/bb/d675b2a9979181eb3130e347469a4c6b910e6697df7b81d7f6dc879e1641/blspy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7baad9fedf21eed3203d1e5d31e8b25eff160a363b0e207a5228727f62240f67",
                "md5": "9fff024deaae28ccbcc328df347ba66e",
                "sha256": "7347d140e0f2082f311b944385db2bacbe01363622754a237e9024e417b35f8c"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "9fff024deaae28ccbcc328df347ba66e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.7",
            "size": 260103,
            "upload_time": "2023-06-26T17:21:16",
            "upload_time_iso_8601": "2023-06-26T17:21:16.712814Z",
            "url": "https://files.pythonhosted.org/packages/7b/aa/d9fedf21eed3203d1e5d31e8b25eff160a363b0e207a5228727f62240f67/blspy-2.0.2-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0cf2f03aef423cc0640a4f760d3c7cbac6152a6d45e3109341aee7a19cbc29ed",
                "md5": "1e81d642832a05e6aa242f11bfabf47d",
                "sha256": "e0c7c685aed512adf8691be054c0c0cc87a66b0323f2434a6341fe49076d78ab"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp37-cp37m-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1e81d642832a05e6aa242f11bfabf47d",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 312264,
            "upload_time": "2023-06-26T17:21:48",
            "upload_time_iso_8601": "2023-06-26T17:21:48.810988Z",
            "url": "https://files.pythonhosted.org/packages/0c/f2/f03aef423cc0640a4f760d3c7cbac6152a6d45e3109341aee7a19cbc29ed/blspy-2.0.2-cp37-cp37m-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c589c809bfc0c6d5afca3bf33389b7f41fed1cc614369a2ab425f899bfef648f",
                "md5": "56ca5e6c446d9fe909c4b7244c3795e2",
                "sha256": "368da188d7eb4298e4ca59d253e8a11639534af045959c85f58f4c188fa361c1"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "56ca5e6c446d9fe909c4b7244c3795e2",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 326859,
            "upload_time": "2023-06-26T17:21:37",
            "upload_time_iso_8601": "2023-06-26T17:21:37.346637Z",
            "url": "https://files.pythonhosted.org/packages/c5/89/c809bfc0c6d5afca3bf33389b7f41fed1cc614369a2ab425f899bfef648f/blspy-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d447756a9a63478978d59a91f9216b78a5bc43985998f1bba7a71c692accafd1",
                "md5": "0b07ab7d399a05d6a0decfd37f2091f8",
                "sha256": "a9555039e51281ffe34bcb06215512721b5cd509102db68267eab8b314258c41"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0b07ab7d399a05d6a0decfd37f2091f8",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 352013,
            "upload_time": "2023-06-26T17:22:00",
            "upload_time_iso_8601": "2023-06-26T17:22:00.857538Z",
            "url": "https://files.pythonhosted.org/packages/d4/47/756a9a63478978d59a91f9216b78a5bc43985998f1bba7a71c692accafd1/blspy-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "09fedfc1ecf64838298030447cc31091516509eb4b3e691acae73fc0c933da0e",
                "md5": "d77e45679b3d6eb5d083bd6a674d88fc",
                "sha256": "e31a1a9adbf04b5f09321c5fa6b9fdc50bdc685d2f4c8335444e95513d81090e"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "d77e45679b3d6eb5d083bd6a674d88fc",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.7",
            "size": 259093,
            "upload_time": "2023-06-26T17:21:18",
            "upload_time_iso_8601": "2023-06-26T17:21:18.640166Z",
            "url": "https://files.pythonhosted.org/packages/09/fe/dfc1ecf64838298030447cc31091516509eb4b3e691acae73fc0c933da0e/blspy-2.0.2-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "90896dd3f23dd707f8823db3af6303ecc6d5423777bbd756ff18d3e5b90b327c",
                "md5": "56afca47f78a008db64df6e3631b2ba4",
                "sha256": "b2988f1ac4fa5063d3fb30ff5272ba5b51877d551120085dc9e1257d3228e89c"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp38-cp38-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "56afca47f78a008db64df6e3631b2ba4",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 315575,
            "upload_time": "2023-06-26T17:21:35",
            "upload_time_iso_8601": "2023-06-26T17:21:35.529914Z",
            "url": "https://files.pythonhosted.org/packages/90/89/6dd3f23dd707f8823db3af6303ecc6d5423777bbd756ff18d3e5b90b327c/blspy-2.0.2-cp38-cp38-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ebea991f3bcc1d0ab49e68df91c5eff04cc8a2abd1a25b8b8c9d95f76158b199",
                "md5": "84105dd625acba1df7d105bcf4b0d85d",
                "sha256": "c51b2be0b81b786e6bc786c41735fbda0e335d31e2e163ef735ae56c6d3adb7f"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "84105dd625acba1df7d105bcf4b0d85d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 299503,
            "upload_time": "2023-06-26T17:21:41",
            "upload_time_iso_8601": "2023-06-26T17:21:41.259992Z",
            "url": "https://files.pythonhosted.org/packages/eb/ea/991f3bcc1d0ab49e68df91c5eff04cc8a2abd1a25b8b8c9d95f76158b199/blspy-2.0.2-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3f0dc8274821dbdd94ac85bfdfddc2049dd9172014fd01f7c7959d61c817ef1f",
                "md5": "cba779904ae0eacf2a871c28de362360",
                "sha256": "b0e8fd5f7729e08451e7ef66134f377e4bf88a9ea25a010f27bcf881e89541ee"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "cba779904ae0eacf2a871c28de362360",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 323515,
            "upload_time": "2023-06-26T17:21:50",
            "upload_time_iso_8601": "2023-06-26T17:21:50.416675Z",
            "url": "https://files.pythonhosted.org/packages/3f/0d/c8274821dbdd94ac85bfdfddc2049dd9172014fd01f7c7959d61c817ef1f/blspy-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "25bcd3c5ab682755dd68787676551533751dfef8c8ec84e44b0c38524f4979aa",
                "md5": "40c632dd5270b7b63a77dbc4287cce37",
                "sha256": "5603dc3fb30e622be31dd8d1bbfdd5624291f8c56f076a1d177836959c733cff"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "40c632dd5270b7b63a77dbc4287cce37",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 348573,
            "upload_time": "2023-06-26T17:21:29",
            "upload_time_iso_8601": "2023-06-26T17:21:29.752640Z",
            "url": "https://files.pythonhosted.org/packages/25/bc/d3c5ab682755dd68787676551533751dfef8c8ec84e44b0c38524f4979aa/blspy-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e0ee946b81b8892343bc20f62e343ec0f9e14bd9ac1ee4e3c0a2da9a4eb5cec8",
                "md5": "dee27ad75f727d834787ebc0a20b47a0",
                "sha256": "bf30732ac316b8cafaeaeefa694a96ea4a92922fb86dd3d30f79d48a202e1d51"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "dee27ad75f727d834787ebc0a20b47a0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.7",
            "size": 259993,
            "upload_time": "2023-06-26T17:21:54",
            "upload_time_iso_8601": "2023-06-26T17:21:54.508370Z",
            "url": "https://files.pythonhosted.org/packages/e0/ee/946b81b8892343bc20f62e343ec0f9e14bd9ac1ee4e3c0a2da9a4eb5cec8/blspy-2.0.2-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5d62b09495b3034bef38e53bb795892c83a6f57b5ce0727e778437f8100cc7f4",
                "md5": "39e0082cafb688f37b6cfabe773e99af",
                "sha256": "286a684b1f645d3c38ccc7882a305ed1b038a0e603ff2f482e493c91ab0f0b58"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp39-cp39-macosx_10_14_x86_64.whl",
            "has_sig": false,
            "md5_digest": "39e0082cafb688f37b6cfabe773e99af",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 315653,
            "upload_time": "2023-06-26T17:21:59",
            "upload_time_iso_8601": "2023-06-26T17:21:59.057855Z",
            "url": "https://files.pythonhosted.org/packages/5d/62/b09495b3034bef38e53bb795892c83a6f57b5ce0727e778437f8100cc7f4/blspy-2.0.2-cp39-cp39-macosx_10_14_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "51c243cf203734f1c7372f1fafce97029e29ad7b947b5c7e680660fdc95f1d09",
                "md5": "f8f08e44b88a73894ceb36f8164f4333",
                "sha256": "744043f6e4192f3b431f1433b07144bd198294fd129c9b4a19e0c122474df32b"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "f8f08e44b88a73894ceb36f8164f4333",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 299732,
            "upload_time": "2023-06-26T17:21:14",
            "upload_time_iso_8601": "2023-06-26T17:21:14.299263Z",
            "url": "https://files.pythonhosted.org/packages/51/c2/43cf203734f1c7372f1fafce97029e29ad7b947b5c7e680660fdc95f1d09/blspy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4da0ad5a9e0c2669a5da6f1a51916fa132c429a5658b82dfb5647e2d27ce34fc",
                "md5": "b72a7a25d533828fd34c0ba4f01f7412",
                "sha256": "26fb12e7158230f7169781fddf6a4c15dd4366de26d1531a09df986f9706332a"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b72a7a25d533828fd34c0ba4f01f7412",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 324222,
            "upload_time": "2023-06-26T17:21:39",
            "upload_time_iso_8601": "2023-06-26T17:21:39.067620Z",
            "url": "https://files.pythonhosted.org/packages/4d/a0/ad5a9e0c2669a5da6f1a51916fa132c429a5658b82dfb5647e2d27ce34fc/blspy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e158f351f8e2f1159de01ffa98c14469e23fdd43e6b08fb7410a14284ad29de0",
                "md5": "32257b7194bdd7578d81c38a7ff0b354",
                "sha256": "6b7183ef57f8675c9d29f4f66ba3a65280fd3742200fc4d8f2f7a53b98b77136"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "32257b7194bdd7578d81c38a7ff0b354",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 349453,
            "upload_time": "2023-06-26T17:21:23",
            "upload_time_iso_8601": "2023-06-26T17:21:23.296631Z",
            "url": "https://files.pythonhosted.org/packages/e1/58/f351f8e2f1159de01ffa98c14469e23fdd43e6b08fb7410a14284ad29de0/blspy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2bb7383c679ace716ded9aad9169ba3a19161e3d916e5e2474984bdb9376e1af",
                "md5": "0171b4d734d2aead985af7537f4fbe02",
                "sha256": "21df21e27b5f7ed56e37f8a6272adb9273ba88d0570d26315e28a41e14c37f43"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0171b4d734d2aead985af7537f4fbe02",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.7",
            "size": 260115,
            "upload_time": "2023-06-26T17:21:45",
            "upload_time_iso_8601": "2023-06-26T17:21:45.023946Z",
            "url": "https://files.pythonhosted.org/packages/2b/b7/383c679ace716ded9aad9169ba3a19161e3d916e5e2474984bdb9376e1af/blspy-2.0.2-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c40dfe4785001d093762561c2cf50c11c34adaffed0f48c8b963a59bea6cfe88",
                "md5": "ed05e8f4fbad6a9422008c42e97ebed6",
                "sha256": "9b12d685f3c104d3fe0faf3618f6b824272d131b8ea3843190ad670618736775"
            },
            "downloads": -1,
            "filename": "blspy-2.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "ed05e8f4fbad6a9422008c42e97ebed6",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 142458,
            "upload_time": "2023-06-26T17:22:02",
            "upload_time_iso_8601": "2023-06-26T17:22:02.343263Z",
            "url": "https://files.pythonhosted.org/packages/c4/0d/fe4785001d093762561c2cf50c11c34adaffed0f48c8b963a59bea6cfe88/blspy-2.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-06-26 17:22:02",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Chia-Network",
    "github_project": "bls-signatures",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "blspy"
}
        
Elapsed time: 0.08981s