# BLS Signatures implementation
[![Build and Test C++, Javascript, and Python](https://github.com/Chik-Network/kls-signatures/actions/workflows/build-test.yaml/badge.svg)](https://github.com/Chik-Network/kls-signatures/actions/workflows/build-test.yaml)
![PyPI](https://img.shields.io/pypi/v/klspy?logo=pypi)
![PyPI - Format](https://img.shields.io/pypi/format/klspy?logo=pypi)
![GitHub](https://img.shields.io/github/license/Chik-Network/kls-signatures?logo=Github)
[![CodeQL](https://github.com/Chik-Network/kls-signatures/actions/workflows/codeql.yml/badge.svg)](https://github.com/Chik-Network/kls-signatures/actions/workflows/codeql.yml)
[![Coverage Status](https://coveralls.io/repos/github/Chik-Network/kls-signatures/badge.svg?branch=main)](https://coveralls.io/github/Chik-Network/kls-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. The blst library has been [audited](https://medium.com/supranational/introducing-blst-2b6a988d68ee).
Features:
* Non-interactive signature aggregation following IETF specification
* Works on Windows, Mac, Linux, BSD, arm64, RISC-V
* 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/Chik-Network/kls-signatures/tree/main/python-bindings)
* [Pure python bls12-381 and signatures](https://github.com/Chik-Network/kls-signatures/tree/main/python-impl)
* [JavaScript bindings](https://github.com/Chik-Network/kls-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, python3 and python[3.x]-dev (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 -Ikls-signatures/src -L./kls-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 Chik related development is in the #chik-development
channel of Chik's [Discord](https://discord.gg/SNbcMMvNBE).
## 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 also supported.
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 klspy` e.g. The ci
builds include a statically linked libsodium.
## Contributing and workflow
Contributions are welcome and more details are available in chik-blockchain's
[CONTRIBUTING.md](https://github.com/Chik-Network/chik-blockchain/blob/main/CONTRIBUTING.md).
The main branch is usually the currently released latest version on PyPI.
Note that at times kls-signatures/klspy will be ahead of the release version
that chik-blockchain requires in it's main/release version in preparation
for a new chik-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
for building and testing.
## 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/Chik-Network/kls-signatures",
"name": "klspy",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": null,
"author": "Mariano Sorgente",
"author_email": "mariano@chiknetwork.com",
"download_url": "https://files.pythonhosted.org/packages/f3/bc/070a5c86ca3f32ad29fc01ad405745c03cd949fab98fb9311e54d8322463/klspy-2.0.3.tar.gz",
"platform": null,
"description": "# BLS Signatures implementation\n\n[![Build and Test C++, Javascript, and Python](https://github.com/Chik-Network/kls-signatures/actions/workflows/build-test.yaml/badge.svg)](https://github.com/Chik-Network/kls-signatures/actions/workflows/build-test.yaml)\n![PyPI](https://img.shields.io/pypi/v/klspy?logo=pypi)\n![PyPI - Format](https://img.shields.io/pypi/format/klspy?logo=pypi)\n![GitHub](https://img.shields.io/github/license/Chik-Network/kls-signatures?logo=Github)\n\n[![CodeQL](https://github.com/Chik-Network/kls-signatures/actions/workflows/codeql.yml/badge.svg)](https://github.com/Chik-Network/kls-signatures/actions/workflows/codeql.yml)\n\n[![Coverage Status](https://coveralls.io/repos/github/Chik-Network/kls-signatures/badge.svg?branch=main)](https://coveralls.io/github/Chik-Network/kls-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. The blst library has been [audited](https://medium.com/supranational/introducing-blst-2b6a988d68ee).\n\nFeatures:\n\n* Non-interactive signature aggregation following IETF specification\n* Works on Windows, Mac, Linux, BSD, arm64, RISC-V\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/Chik-Network/kls-signatures/tree/main/python-bindings)\n* [Pure python bls12-381 and signatures](https://github.com/Chik-Network/kls-signatures/tree/main/python-impl)\n* [JavaScript bindings](https://github.com/Chik-Network/kls-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, python3 and python[3.x]-dev (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 -Ikls-signatures/src -L./kls-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 Chik related development is in the #chik-development\nchannel of Chik's [Discord](https://discord.gg/SNbcMMvNBE).\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 also supported.\nSee `.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 klspy` 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 chik-blockchain's\n[CONTRIBUTING.md](https://github.com/Chik-Network/chik-blockchain/blob/main/CONTRIBUTING.md).\n\nThe main branch is usually the currently released latest version on PyPI.\nNote that at times kls-signatures/klspy will be ahead of the release version\nthat chik-blockchain requires in it's main/release version in preparation\nfor a new chik-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\nfor building and testing.\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": null,
"summary": "BLS signatures in c++ (python bindings)",
"version": "2.0.3",
"project_urls": {
"Homepage": "https://github.com/Chik-Network/kls-signatures"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8acd102f388af2098ba29928f4de11cb7356b96897ec39b71e7f66870f0424ae",
"md5": "3daf5fbf93ef87f2451385df56a1e5a4",
"sha256": "f57707fbc6eed93475580b2e56d39a8e8f46b1057cc0186a3fc3d8541ed81fb6"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "3daf5fbf93ef87f2451385df56a1e5a4",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 320578,
"upload_time": "2024-05-16T08:44:39",
"upload_time_iso_8601": "2024-05-16T08:44:39.625774Z",
"url": "https://files.pythonhosted.org/packages/8a/cd/102f388af2098ba29928f4de11cb7356b96897ec39b71e7f66870f0424ae/klspy-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e9e15b012ba4e3a13e29f57a626ce1eeaf4da10d993ce266d133c9fd28b3ae11",
"md5": "3dd64c4b501fc1f0cabbdb37bdf935b3",
"sha256": "b2aa8fbd73b1c1eb8bb0e0f1a8f5358e1d4e2d255c338668178e2a7128d52d41"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "3dd64c4b501fc1f0cabbdb37bdf935b3",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 331585,
"upload_time": "2024-05-16T08:44:41",
"upload_time_iso_8601": "2024-05-16T08:44:41.138288Z",
"url": "https://files.pythonhosted.org/packages/e9/e1/5b012ba4e3a13e29f57a626ce1eeaf4da10d993ce266d133c9fd28b3ae11/klspy-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d0beef2d985d949fb5a876e73cef13876223243a54b2cb826b4a11350a13c04e",
"md5": "24f231ed542664ab541ae40093d33a43",
"sha256": "d0eabe0014265b533f36cebf737591af0bc5d62e0bdd836e56a751319b21abe8"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "24f231ed542664ab541ae40093d33a43",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 357532,
"upload_time": "2024-05-16T08:44:42",
"upload_time_iso_8601": "2024-05-16T08:44:42.760818Z",
"url": "https://files.pythonhosted.org/packages/d0/be/ef2d985d949fb5a876e73cef13876223243a54b2cb826b4a11350a13c04e/klspy-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "93ad36294d1423bf38cb8e32c3ae0e4d7734c7106e80587ed30990e93efbb5da",
"md5": "0d15abb900eee6ac740c85780762a566",
"sha256": "270d8d9b82c4034c9b19ab99edb9106c5565191e3e068fb60fd26fb82b41ac14"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "0d15abb900eee6ac740c85780762a566",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 268530,
"upload_time": "2024-05-16T08:44:44",
"upload_time_iso_8601": "2024-05-16T08:44:44.276704Z",
"url": "https://files.pythonhosted.org/packages/93/ad/36294d1423bf38cb8e32c3ae0e4d7734c7106e80587ed30990e93efbb5da/klspy-2.0.3-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "993f6a3b7b7ad92ff94881735a27a5962b1acd875bc2db3c60a2781c65b1716e",
"md5": "9e2ecb3e65771776f5370247db9300ce",
"sha256": "c0fd6b34cee4f270ad8def82c8b382acec48ee4dc1b0fd23890094e074a83cb5"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "9e2ecb3e65771776f5370247db9300ce",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 321849,
"upload_time": "2024-05-16T08:44:45",
"upload_time_iso_8601": "2024-05-16T08:44:45.573925Z",
"url": "https://files.pythonhosted.org/packages/99/3f/6a3b7b7ad92ff94881735a27a5962b1acd875bc2db3c60a2781c65b1716e/klspy-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0a15a683fa0a9ad5131c5af3a780590cc38558e45be55cfa546a4196a16b9c51",
"md5": "dbbcd01a505a070cb4f4d48a3a01adab",
"sha256": "f04a81daabaa16482a48519a77edc637d14f679d5fdeab7b4c0c1f54b57dd41c"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "dbbcd01a505a070cb4f4d48a3a01adab",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 333412,
"upload_time": "2024-05-16T08:44:47",
"upload_time_iso_8601": "2024-05-16T08:44:47.866750Z",
"url": "https://files.pythonhosted.org/packages/0a/15/a683fa0a9ad5131c5af3a780590cc38558e45be55cfa546a4196a16b9c51/klspy-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "066172612c74f6b6d164e295ed255b461743a598d730e9526133f50925d01a2d",
"md5": "3d0649840595e3c600ef3364314a008d",
"sha256": "3b4059f67a5a9f9637bc52fda7951fcaf230ee7adc1ac74a0bf6843abb08e34b"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "3d0649840595e3c600ef3364314a008d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 358351,
"upload_time": "2024-05-16T08:44:49",
"upload_time_iso_8601": "2024-05-16T08:44:49.664265Z",
"url": "https://files.pythonhosted.org/packages/06/61/72612c74f6b6d164e295ed255b461743a598d730e9526133f50925d01a2d/klspy-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "447bf5c375ac770ff15b1de7e8844c35465386b515b1e4ec563ce8115c15120c",
"md5": "9ab23d72771490a75af12210b00d654f",
"sha256": "274c032077219bb999726774813bedc2f61511f72f88e33d9b3986dc6e184969"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "9ab23d72771490a75af12210b00d654f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 269560,
"upload_time": "2024-05-16T08:44:51",
"upload_time_iso_8601": "2024-05-16T08:44:51.846364Z",
"url": "https://files.pythonhosted.org/packages/44/7b/f5c375ac770ff15b1de7e8844c35465386b515b1e4ec563ce8115c15120c/klspy-2.0.3-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "15df93a46973b442f30b719d154ee7553bf991564bf598f159fbc7ab2067c920",
"md5": "da08b85660bb13931b20f9e3845ab8f0",
"sha256": "6cd08c2235f5d3255f0231124230a579af777fea57d6a4e98536c2dbf27bd10a"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "da08b85660bb13931b20f9e3845ab8f0",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 323510,
"upload_time": "2024-05-16T08:44:53",
"upload_time_iso_8601": "2024-05-16T08:44:53.560353Z",
"url": "https://files.pythonhosted.org/packages/15/df/93a46973b442f30b719d154ee7553bf991564bf598f159fbc7ab2067c920/klspy-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a9b2a6ac902c8b1adb8943ea387578a8099513e3d1e9e00c24eaf7ba2dfb4f8b",
"md5": "3d2278c9ba75b017ddb462beccf8f8b1",
"sha256": "2627b5c95324c5c2688e87e604f789d66a62824a0d6a5e6058ed507cb41b2ccb"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "3d2278c9ba75b017ddb462beccf8f8b1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 330328,
"upload_time": "2024-05-16T08:44:55",
"upload_time_iso_8601": "2024-05-16T08:44:55.089258Z",
"url": "https://files.pythonhosted.org/packages/a9/b2/a6ac902c8b1adb8943ea387578a8099513e3d1e9e00c24eaf7ba2dfb4f8b/klspy-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fd8fab672a833e5333438a5f0572b9a7a5b00e76cb4a897851c7916475ae3d4b",
"md5": "14598cddbbb2c6b83a89c31021ba3148",
"sha256": "0437e17e575ae0dd7ab330031712ad1c3be0432eff9394f4cae9aa046edec83f"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "14598cddbbb2c6b83a89c31021ba3148",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 357627,
"upload_time": "2024-05-16T08:44:56",
"upload_time_iso_8601": "2024-05-16T08:44:56.998220Z",
"url": "https://files.pythonhosted.org/packages/fd/8f/ab672a833e5333438a5f0572b9a7a5b00e76cb4a897851c7916475ae3d4b/klspy-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "fb00666bcb5081f1e9d7fa396f9a691d0f92dc3ddae67d60fcf5b504bb98046c",
"md5": "cf9a99865f1bb4769808df5cbb38fa03",
"sha256": "f0bbf237ce3d6f72a54d2bbff2d31cc53a481963a02fb80fffb72ded7b69b2e3"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "cf9a99865f1bb4769808df5cbb38fa03",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 269316,
"upload_time": "2024-05-16T08:44:58",
"upload_time_iso_8601": "2024-05-16T08:44:58.903906Z",
"url": "https://files.pythonhosted.org/packages/fb/00/666bcb5081f1e9d7fa396f9a691d0f92dc3ddae67d60fcf5b504bb98046c/klspy-2.0.3-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e3444cef5a6b7f50edc85bdf0b099e093073beb8c53159d8e32554c3498f3988",
"md5": "1a067efb1a43cf7489b52e8c88ed1e6f",
"sha256": "4c5a29ee2141bd0fe6f0f7514e83139b7bf436b11fef90d40a27201e2ebf7615"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp38-cp38-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "1a067efb1a43cf7489b52e8c88ed1e6f",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 320318,
"upload_time": "2024-05-16T08:45:00",
"upload_time_iso_8601": "2024-05-16T08:45:00.123500Z",
"url": "https://files.pythonhosted.org/packages/e3/44/4cef5a6b7f50edc85bdf0b099e093073beb8c53159d8e32554c3498f3988/klspy-2.0.3-cp38-cp38-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3cd7f215e106f8f68d9dffb0d54fb2464e69cde744ac6540e1ed74605d9acca7",
"md5": "de41db7941837d6c65fc96c2228c9119",
"sha256": "bde87966e2d02871f6d77a8ff9c4112326af3528fc87a2e46a2e7db96a6d4440"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "de41db7941837d6c65fc96c2228c9119",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 331135,
"upload_time": "2024-05-16T08:45:01",
"upload_time_iso_8601": "2024-05-16T08:45:01.979504Z",
"url": "https://files.pythonhosted.org/packages/3c/d7/f215e106f8f68d9dffb0d54fb2464e69cde744ac6540e1ed74605d9acca7/klspy-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f91f260806269c52ffad78e89c70742b42eba7cc44f282033f9b9a6e76cdddf2",
"md5": "0d6c5832b1b444ec5cf4f6e6e37e2580",
"sha256": "927aff995332a5269ee66a8394e3250c3c692688e6b6ad029051d5ff1d225290"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "0d6c5832b1b444ec5cf4f6e6e37e2580",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 356936,
"upload_time": "2024-05-16T08:45:04",
"upload_time_iso_8601": "2024-05-16T08:45:04.414437Z",
"url": "https://files.pythonhosted.org/packages/f9/1f/260806269c52ffad78e89c70742b42eba7cc44f282033f9b9a6e76cdddf2/klspy-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6586141a51866b297120ac631c3864353a6ea9d24adee36ddf782ba8e1b6a74d",
"md5": "18e260545153c4a7c80c424593f8f245",
"sha256": "e6de7d7ac4e3789f0939d7382aaa3aa79c1a938bde4d01de3d2e52eeed0fbcd9"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "18e260545153c4a7c80c424593f8f245",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 268320,
"upload_time": "2024-05-16T08:45:05",
"upload_time_iso_8601": "2024-05-16T08:45:05.613956Z",
"url": "https://files.pythonhosted.org/packages/65/86/141a51866b297120ac631c3864353a6ea9d24adee36ddf782ba8e1b6a74d/klspy-2.0.3-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "126b632657cd6b6488128136018a38b8b616414ead146a629f45f827cec51a8d",
"md5": "f914347d5706669deebaa0f1edac9249",
"sha256": "0266a625ed720a72bc0add432426290187d9631a7e53b74f31e4837c7df2c870"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp39-cp39-macosx_11_0_x86_64.whl",
"has_sig": false,
"md5_digest": "f914347d5706669deebaa0f1edac9249",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 320648,
"upload_time": "2024-05-16T08:45:07",
"upload_time_iso_8601": "2024-05-16T08:45:07.014894Z",
"url": "https://files.pythonhosted.org/packages/12/6b/632657cd6b6488128136018a38b8b616414ead146a629f45f827cec51a8d/klspy-2.0.3-cp39-cp39-macosx_11_0_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "33fde9d27062832ffd97c21b3241432736a8ebab2a5a3d3e05f98e765fedf8a2",
"md5": "dd5e58a390f0871e9aa197608a4cbea8",
"sha256": "ce20e2b42327ebc9711975fea7b49e919f55c5dde8ef90e756944e25d80d552e"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "dd5e58a390f0871e9aa197608a4cbea8",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 331908,
"upload_time": "2024-05-16T08:45:08",
"upload_time_iso_8601": "2024-05-16T08:45:08.343051Z",
"url": "https://files.pythonhosted.org/packages/33/fd/e9d27062832ffd97c21b3241432736a8ebab2a5a3d3e05f98e765fedf8a2/klspy-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e7051f08ed72bb29e36ca63254f57e251e9545191b577e00689ce046cf61f953",
"md5": "0c23d64159e5da513ebe5a64821868cc",
"sha256": "165e226dcc8265d902fb84cedeb93a690faf17b7b1bfd86071ffd030e51584fc"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "0c23d64159e5da513ebe5a64821868cc",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 357842,
"upload_time": "2024-05-16T08:45:10",
"upload_time_iso_8601": "2024-05-16T08:45:10.956715Z",
"url": "https://files.pythonhosted.org/packages/e7/05/1f08ed72bb29e36ca63254f57e251e9545191b577e00689ce046cf61f953/klspy-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "516648537bda65980f57f873e52a625a62111290be20b4ce967ff4e37abe9a3b",
"md5": "e2f4f667f04a6f1462c4261489251c60",
"sha256": "7e10298cd55db847f3fc4284d2b606be4741ef0d7154ecfe542827d372052b1a"
},
"downloads": -1,
"filename": "klspy-2.0.3-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "e2f4f667f04a6f1462c4261489251c60",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 262665,
"upload_time": "2024-05-16T08:45:12",
"upload_time_iso_8601": "2024-05-16T08:45:12.157879Z",
"url": "https://files.pythonhosted.org/packages/51/66/48537bda65980f57f873e52a625a62111290be20b4ce967ff4e37abe9a3b/klspy-2.0.3-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f3bc070a5c86ca3f32ad29fc01ad405745c03cd949fab98fb9311e54d8322463",
"md5": "a4da980053cbeab80ab72ffa53f9e22f",
"sha256": "1d31ad5adef6266ab1760911fd193e1c529ab2a9febac6e834ba35c57908dcc6"
},
"downloads": -1,
"filename": "klspy-2.0.3.tar.gz",
"has_sig": false,
"md5_digest": "a4da980053cbeab80ab72ffa53f9e22f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 148337,
"upload_time": "2024-05-16T08:45:14",
"upload_time_iso_8601": "2024-05-16T08:45:14.076266Z",
"url": "https://files.pythonhosted.org/packages/f3/bc/070a5c86ca3f32ad29fc01ad405745c03cd949fab98fb9311e54d8322463/klspy-2.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-05-16 08:45:14",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Chik-Network",
"github_project": "kls-signatures",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "klspy"
}