BLS signatures in c++ (python bindings)
Project description
BLS Signatures implementation
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 for cryptographic primitives (pairings, EC, hashing) according to the IETF BLS RFC with these curve parameters for BLS12-381. The blst library has been audited.
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 key derivation (including unhardened BIP-32-like keys)
- Key and signature serialization
- Batch verification
- Python bindings
- Pure python bls12-381 and signatures
- JavaScript bindings
Before you start
This library uses minimum public key sizes (MPL). A G2Element is a signature (96 bytes), and a G1Element is a public key (48 bytes). A private key is a 32 byte integer. There are three schemes: Basic, Augmented, and ProofOfPossession. Augmented should be enough for most use cases, and ProofOfPossession can be used where verification must be fast.
Import the library
#include "bls.hpp"
using namespace bls;
Creating keys and signatures
// Example seed, used to generate private key. Always use
// a secure RNG with sufficient entropy to generate a seed (at least 32 bytes).
vector<uint8_t> seed = {0, 50, 6, 244, 24, 199, 1, 25, 52, 88, 192,
19, 18, 12, 89, 6, 220, 18, 102, 58, 209, 82,
12, 62, 89, 110, 182, 9, 44, 20, 254, 22};
PrivateKey sk = AugSchemeMPL().KeyGen(seed);
G1Element pk = sk.GetG1Element();
vector<uint8_t> message = {1, 2, 3, 4, 5}; // Message is passed in as a byte vector
G2Element signature = AugSchemeMPL().Sign(sk, message);
// Verify the signature
bool ok = AugSchemeMPL().Verify(pk, message, signature);
Serializing keys and signatures to bytes
vector<uint8_t> skBytes = sk.Serialize();
vector<uint8_t> pkBytes = pk.Serialize();
vector<uint8_t> signatureBytes = signature.Serialize();
cout << Util::HexStr(skBytes) << endl; // 32 bytes printed in hex
cout << Util::HexStr(pkBytes) << endl; // 48 bytes printed in hex
cout << Util::HexStr(signatureBytes) << endl; // 96 bytes printed in hex
Loading keys and signatures from bytes
// Takes vector of 32 bytes
PrivateKey skc = PrivateKey::FromByteVector(skBytes);
// Takes vector of 48 bytes
pk = G1Element::FromByteVector(pkBytes);
// Takes vector of 96 bytes
signature = G2Element::FromByteVector(signatureBytes);
Create aggregate signatures
// Generate some more private keys
seed[0] = 1;
PrivateKey sk1 = AugSchemeMPL().KeyGen(seed);
seed[0] = 2;
PrivateKey sk2 = AugSchemeMPL().KeyGen(seed);
vector<uint8_t> message2 = {1, 2, 3, 4, 5, 6, 7};
// Generate first sig
G1Element pk1 = sk1.GetG1Element();
G2Element sig1 = AugSchemeMPL().Sign(sk1, message);
// Generate second sig
G1Element pk2 = sk2.GetG1Element();
G2Element sig2 = AugSchemeMPL().Sign(sk2, message2);
// Signatures can be non-interactively combined by anyone
G2Element aggSig = AugSchemeMPL().Aggregate({sig1, sig2});
ok = AugSchemeMPL().AggregateVerify({pk1, pk2}, {message, message2}, aggSig);
Arbitrary trees of aggregates
seed[0] = 3;
PrivateKey sk3 = AugSchemeMPL().KeyGen(seed);
G1Element pk3 = sk3.GetG1Element();
vector<uint8_t> message3 = {100, 2, 254, 88, 90, 45, 23};
G2Element sig3 = AugSchemeMPL().Sign(sk3, message3);
G2Element aggSigFinal = AugSchemeMPL().Aggregate({aggSig, sig3});
ok = AugSchemeMPL().AggregateVerify({pk1, pk2, pk3}, {message, message2, message3}, aggSigFinal);
Very fast verification with Proof of Possession scheme
// If the same message is signed, you can use Proof of Posession (PopScheme) for efficiency
// A proof of possession MUST be passed around with the PK to ensure security.
G2Element popSig1 = PopSchemeMPL().Sign(sk1, message);
G2Element popSig2 = PopSchemeMPL().Sign(sk2, message);
G2Element popSig3 = PopSchemeMPL().Sign(sk3, message);
G2Element pop1 = PopSchemeMPL().PopProve(sk1);
G2Element pop2 = PopSchemeMPL().PopProve(sk2);
G2Element pop3 = PopSchemeMPL().PopProve(sk3);
ok = PopSchemeMPL().PopVerify(pk1, pop1);
ok = PopSchemeMPL().PopVerify(pk2, pop2);
ok = PopSchemeMPL().PopVerify(pk3, pop3);
G2Element popSigAgg = PopSchemeMPL().Aggregate({popSig1, popSig2, popSig3});
ok = PopSchemeMPL().FastAggregateVerify({pk1, pk2, pk3}, message, popSigAgg);
// Aggregate public key, indistinguishable from a single public key
G1Element popAggPk = pk1 + pk2 + pk3;
ok = PopSchemeMPL().Verify(popAggPk, message, popSigAgg);
// Aggregate private keys
PrivateKey aggSk = PrivateKey::Aggregate({sk1, sk2, sk3});
ok = (PopSchemeMPL().Sign(aggSk, message) == popSigAgg);
HD keys using EIP-2333
// You can derive 'child' keys from any key, to create arbitrary trees. 4 byte indeces are used.
// Hardened (more secure, but no parent pk -> child pk)
PrivateKey masterSk = AugSchemeMPL().KeyGen(seed);
PrivateKey child = AugSchemeMPL().DeriveChildSk(masterSk, 152);
PrivateKey grandChild = AugSchemeMPL().DeriveChildSk(child, 952)
// Unhardened (less secure, but can go from parent pk -> child pk), BIP32 style
G1Element masterPk = masterSk.GetG1Element();
PrivateKey childU = AugSchemeMPL().DeriveChildSkUnhardened(masterSk, 22);
PrivateKey grandchildU = AugSchemeMPL().DeriveChildSkUnhardened(childU, 0);
G1Element childUPk = AugSchemeMPL().DeriveChildPkUnhardened(masterPk, 22);
G1Element grandchildUPk = AugSchemeMPL().DeriveChildPkUnhardened(childUPk, 0);
ok = (grandchildUPk == grandchildU.GetG1Element();
Build
Cmake 3.14+, a c++ compiler, python3 and python[3.x]-dev (for bindings) are required for building.
mkdir build
cd build
cmake ../
cmake --build . -- -j 6
Run tests
./build/src/runtest
Run benchmarks
./build/src/runbench
On a 3.5 GHz i7 Mac, verification takes about 1.1ms per signature, and signing takes 1.3ms.
Link the library to use it
g++ -Wl,-no_pie -std=c++11 -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.
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
to download pybind11 for the Python
bindings. Building
is then managed by 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.
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 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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
File details
Details for the file klspy-2.0.3.tar.gz
.
File metadata
- Download URL: klspy-2.0.3.tar.gz
- Upload date:
- Size: 148.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1d31ad5adef6266ab1760911fd193e1c529ab2a9febac6e834ba35c57908dcc6 |
|
MD5 | a4da980053cbeab80ab72ffa53f9e22f |
|
BLAKE2b-256 | f3bc070a5c86ca3f32ad29fc01ad405745c03cd949fab98fb9311e54d8322463 |
File details
Details for the file klspy-2.0.3-cp312-cp312-win_amd64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 269.3 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f0bbf237ce3d6f72a54d2bbff2d31cc53a481963a02fb80fffb72ded7b69b2e3 |
|
MD5 | cf9a99865f1bb4769808df5cbb38fa03 |
|
BLAKE2b-256 | fb00666bcb5081f1e9d7fa396f9a691d0f92dc3ddae67d60fcf5b504bb98046c |
File details
Details for the file klspy-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 357.6 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0437e17e575ae0dd7ab330031712ad1c3be0432eff9394f4cae9aa046edec83f |
|
MD5 | 14598cddbbb2c6b83a89c31021ba3148 |
|
BLAKE2b-256 | fd8fab672a833e5333438a5f0572b9a7a5b00e76cb4a897851c7916475ae3d4b |
File details
Details for the file klspy-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 330.3 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2627b5c95324c5c2688e87e604f789d66a62824a0d6a5e6058ed507cb41b2ccb |
|
MD5 | 3d2278c9ba75b017ddb462beccf8f8b1 |
|
BLAKE2b-256 | a9b2a6ac902c8b1adb8943ea387578a8099513e3d1e9e00c24eaf7ba2dfb4f8b |
File details
Details for the file klspy-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl
- Upload date:
- Size: 323.5 kB
- Tags: CPython 3.12, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6cd08c2235f5d3255f0231124230a579af777fea57d6a4e98536c2dbf27bd10a |
|
MD5 | da08b85660bb13931b20f9e3845ab8f0 |
|
BLAKE2b-256 | 15df93a46973b442f30b719d154ee7553bf991564bf598f159fbc7ab2067c920 |
File details
Details for the file klspy-2.0.3-cp311-cp311-win_amd64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 269.6 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 274c032077219bb999726774813bedc2f61511f72f88e33d9b3986dc6e184969 |
|
MD5 | 9ab23d72771490a75af12210b00d654f |
|
BLAKE2b-256 | 447bf5c375ac770ff15b1de7e8844c35465386b515b1e4ec563ce8115c15120c |
File details
Details for the file klspy-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 358.4 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3b4059f67a5a9f9637bc52fda7951fcaf230ee7adc1ac74a0bf6843abb08e34b |
|
MD5 | 3d0649840595e3c600ef3364314a008d |
|
BLAKE2b-256 | 066172612c74f6b6d164e295ed255b461743a598d730e9526133f50925d01a2d |
File details
Details for the file klspy-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 333.4 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f04a81daabaa16482a48519a77edc637d14f679d5fdeab7b4c0c1f54b57dd41c |
|
MD5 | dbbcd01a505a070cb4f4d48a3a01adab |
|
BLAKE2b-256 | 0a15a683fa0a9ad5131c5af3a780590cc38558e45be55cfa546a4196a16b9c51 |
File details
Details for the file klspy-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl
- Upload date:
- Size: 321.8 kB
- Tags: CPython 3.11, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c0fd6b34cee4f270ad8def82c8b382acec48ee4dc1b0fd23890094e074a83cb5 |
|
MD5 | 9e2ecb3e65771776f5370247db9300ce |
|
BLAKE2b-256 | 993f6a3b7b7ad92ff94881735a27a5962b1acd875bc2db3c60a2781c65b1716e |
File details
Details for the file klspy-2.0.3-cp310-cp310-win_amd64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 268.5 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 270d8d9b82c4034c9b19ab99edb9106c5565191e3e068fb60fd26fb82b41ac14 |
|
MD5 | 0d15abb900eee6ac740c85780762a566 |
|
BLAKE2b-256 | 93ad36294d1423bf38cb8e32c3ae0e4d7734c7106e80587ed30990e93efbb5da |
File details
Details for the file klspy-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 357.5 kB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d0eabe0014265b533f36cebf737591af0bc5d62e0bdd836e56a751319b21abe8 |
|
MD5 | 24f231ed542664ab541ae40093d33a43 |
|
BLAKE2b-256 | d0beef2d985d949fb5a876e73cef13876223243a54b2cb826b4a11350a13c04e |
File details
Details for the file klspy-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 331.6 kB
- Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b2aa8fbd73b1c1eb8bb0e0f1a8f5358e1d4e2d255c338668178e2a7128d52d41 |
|
MD5 | 3dd64c4b501fc1f0cabbdb37bdf935b3 |
|
BLAKE2b-256 | e9e15b012ba4e3a13e29f57a626ce1eeaf4da10d993ce266d133c9fd28b3ae11 |
File details
Details for the file klspy-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl
- Upload date:
- Size: 320.6 kB
- Tags: CPython 3.10, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f57707fbc6eed93475580b2e56d39a8e8f46b1057cc0186a3fc3d8541ed81fb6 |
|
MD5 | 3daf5fbf93ef87f2451385df56a1e5a4 |
|
BLAKE2b-256 | 8acd102f388af2098ba29928f4de11cb7356b96897ec39b71e7f66870f0424ae |
File details
Details for the file klspy-2.0.3-cp39-cp39-win_amd64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 262.7 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7e10298cd55db847f3fc4284d2b606be4741ef0d7154ecfe542827d372052b1a |
|
MD5 | e2f4f667f04a6f1462c4261489251c60 |
|
BLAKE2b-256 | 516648537bda65980f57f873e52a625a62111290be20b4ce967ff4e37abe9a3b |
File details
Details for the file klspy-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 357.8 kB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 165e226dcc8265d902fb84cedeb93a690faf17b7b1bfd86071ffd030e51584fc |
|
MD5 | 0c23d64159e5da513ebe5a64821868cc |
|
BLAKE2b-256 | e7051f08ed72bb29e36ca63254f57e251e9545191b577e00689ce046cf61f953 |
File details
Details for the file klspy-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 331.9 kB
- Tags: CPython 3.9, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce20e2b42327ebc9711975fea7b49e919f55c5dde8ef90e756944e25d80d552e |
|
MD5 | dd5e58a390f0871e9aa197608a4cbea8 |
|
BLAKE2b-256 | 33fde9d27062832ffd97c21b3241432736a8ebab2a5a3d3e05f98e765fedf8a2 |
File details
Details for the file klspy-2.0.3-cp39-cp39-macosx_11_0_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp39-cp39-macosx_11_0_x86_64.whl
- Upload date:
- Size: 320.6 kB
- Tags: CPython 3.9, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0266a625ed720a72bc0add432426290187d9631a7e53b74f31e4837c7df2c870 |
|
MD5 | f914347d5706669deebaa0f1edac9249 |
|
BLAKE2b-256 | 126b632657cd6b6488128136018a38b8b616414ead146a629f45f827cec51a8d |
File details
Details for the file klspy-2.0.3-cp38-cp38-win_amd64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp38-cp38-win_amd64.whl
- Upload date:
- Size: 268.3 kB
- Tags: CPython 3.8, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e6de7d7ac4e3789f0939d7382aaa3aa79c1a938bde4d01de3d2e52eeed0fbcd9 |
|
MD5 | 18e260545153c4a7c80c424593f8f245 |
|
BLAKE2b-256 | 6586141a51866b297120ac631c3864353a6ea9d24adee36ddf782ba8e1b6a74d |
File details
Details for the file klspy-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 356.9 kB
- Tags: CPython 3.8, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 927aff995332a5269ee66a8394e3250c3c692688e6b6ad029051d5ff1d225290 |
|
MD5 | 0d6c5832b1b444ec5cf4f6e6e37e2580 |
|
BLAKE2b-256 | f91f260806269c52ffad78e89c70742b42eba7cc44f282033f9b9a6e76cdddf2 |
File details
Details for the file klspy-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 331.1 kB
- Tags: CPython 3.8, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bde87966e2d02871f6d77a8ff9c4112326af3528fc87a2e46a2e7db96a6d4440 |
|
MD5 | de41db7941837d6c65fc96c2228c9119 |
|
BLAKE2b-256 | 3cd7f215e106f8f68d9dffb0d54fb2464e69cde744ac6540e1ed74605d9acca7 |
File details
Details for the file klspy-2.0.3-cp38-cp38-macosx_11_0_x86_64.whl
.
File metadata
- Download URL: klspy-2.0.3-cp38-cp38-macosx_11_0_x86_64.whl
- Upload date:
- Size: 320.3 kB
- Tags: CPython 3.8, macOS 11.0+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4c5a29ee2141bd0fe6f0f7514e83139b7bf436b11fef90d40a27201e2ebf7615 |
|
MD5 | 1a067efb1a43cf7489b52e8c88ed1e6f |
|
BLAKE2b-256 | e3444cef5a6b7f50edc85bdf0b099e093073beb8c53159d8e32554c3498f3988 |