Skip to main content

BLS signatures in c++ (python bindings)

Project description

BLS Signatures implementation

Build and Test C++, Javascript, and Python PyPI PyPI - Format GitHub

CodeQL

Coverage Status

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

klspy-2.0.3.tar.gz (148.3 kB view details)

Uploaded Source

Built Distributions

klspy-2.0.3-cp312-cp312-win_amd64.whl (269.3 kB view details)

Uploaded CPython 3.12 Windows x86-64

klspy-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (357.6 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

klspy-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (330.3 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

klspy-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl (323.5 kB view details)

Uploaded CPython 3.12 macOS 11.0+ x86-64

klspy-2.0.3-cp311-cp311-win_amd64.whl (269.6 kB view details)

Uploaded CPython 3.11 Windows x86-64

klspy-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (358.4 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

klspy-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (333.4 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

klspy-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl (321.8 kB view details)

Uploaded CPython 3.11 macOS 11.0+ x86-64

klspy-2.0.3-cp310-cp310-win_amd64.whl (268.5 kB view details)

Uploaded CPython 3.10 Windows x86-64

klspy-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (357.5 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

klspy-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (331.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

klspy-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl (320.6 kB view details)

Uploaded CPython 3.10 macOS 11.0+ x86-64

klspy-2.0.3-cp39-cp39-win_amd64.whl (262.7 kB view details)

Uploaded CPython 3.9 Windows x86-64

klspy-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (357.8 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

klspy-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (331.9 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

klspy-2.0.3-cp39-cp39-macosx_11_0_x86_64.whl (320.6 kB view details)

Uploaded CPython 3.9 macOS 11.0+ x86-64

klspy-2.0.3-cp38-cp38-win_amd64.whl (268.3 kB view details)

Uploaded CPython 3.8 Windows x86-64

klspy-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (356.9 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

klspy-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (331.1 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

klspy-2.0.3-cp38-cp38-macosx_11_0_x86_64.whl (320.3 kB view details)

Uploaded CPython 3.8 macOS 11.0+ x86-64

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

Hashes for klspy-2.0.3.tar.gz
Algorithm Hash digest
SHA256 1d31ad5adef6266ab1760911fd193e1c529ab2a9febac6e834ba35c57908dcc6
MD5 a4da980053cbeab80ab72ffa53f9e22f
BLAKE2b-256 f3bc070a5c86ca3f32ad29fc01ad405745c03cd949fab98fb9311e54d8322463

See more details on using hashes here.

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

Hashes for klspy-2.0.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f0bbf237ce3d6f72a54d2bbff2d31cc53a481963a02fb80fffb72ded7b69b2e3
MD5 cf9a99865f1bb4769808df5cbb38fa03
BLAKE2b-256 fb00666bcb5081f1e9d7fa396f9a691d0f92dc3ddae67d60fcf5b504bb98046c

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0437e17e575ae0dd7ab330031712ad1c3be0432eff9394f4cae9aa046edec83f
MD5 14598cddbbb2c6b83a89c31021ba3148
BLAKE2b-256 fd8fab672a833e5333438a5f0572b9a7a5b00e76cb4a897851c7916475ae3d4b

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2627b5c95324c5c2688e87e604f789d66a62824a0d6a5e6058ed507cb41b2ccb
MD5 3d2278c9ba75b017ddb462beccf8f8b1
BLAKE2b-256 a9b2a6ac902c8b1adb8943ea387578a8099513e3d1e9e00c24eaf7ba2dfb4f8b

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 6cd08c2235f5d3255f0231124230a579af777fea57d6a4e98536c2dbf27bd10a
MD5 da08b85660bb13931b20f9e3845ab8f0
BLAKE2b-256 15df93a46973b442f30b719d154ee7553bf991564bf598f159fbc7ab2067c920

See more details on using hashes here.

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

Hashes for klspy-2.0.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 274c032077219bb999726774813bedc2f61511f72f88e33d9b3986dc6e184969
MD5 9ab23d72771490a75af12210b00d654f
BLAKE2b-256 447bf5c375ac770ff15b1de7e8844c35465386b515b1e4ec563ce8115c15120c

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3b4059f67a5a9f9637bc52fda7951fcaf230ee7adc1ac74a0bf6843abb08e34b
MD5 3d0649840595e3c600ef3364314a008d
BLAKE2b-256 066172612c74f6b6d164e295ed255b461743a598d730e9526133f50925d01a2d

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f04a81daabaa16482a48519a77edc637d14f679d5fdeab7b4c0c1f54b57dd41c
MD5 dbbcd01a505a070cb4f4d48a3a01adab
BLAKE2b-256 0a15a683fa0a9ad5131c5af3a780590cc38558e45be55cfa546a4196a16b9c51

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c0fd6b34cee4f270ad8def82c8b382acec48ee4dc1b0fd23890094e074a83cb5
MD5 9e2ecb3e65771776f5370247db9300ce
BLAKE2b-256 993f6a3b7b7ad92ff94881735a27a5962b1acd875bc2db3c60a2781c65b1716e

See more details on using hashes here.

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

Hashes for klspy-2.0.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 270d8d9b82c4034c9b19ab99edb9106c5565191e3e068fb60fd26fb82b41ac14
MD5 0d15abb900eee6ac740c85780762a566
BLAKE2b-256 93ad36294d1423bf38cb8e32c3ae0e4d7734c7106e80587ed30990e93efbb5da

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d0eabe0014265b533f36cebf737591af0bc5d62e0bdd836e56a751319b21abe8
MD5 24f231ed542664ab541ae40093d33a43
BLAKE2b-256 d0beef2d985d949fb5a876e73cef13876223243a54b2cb826b4a11350a13c04e

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b2aa8fbd73b1c1eb8bb0e0f1a8f5358e1d4e2d255c338668178e2a7128d52d41
MD5 3dd64c4b501fc1f0cabbdb37bdf935b3
BLAKE2b-256 e9e15b012ba4e3a13e29f57a626ce1eeaf4da10d993ce266d133c9fd28b3ae11

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 f57707fbc6eed93475580b2e56d39a8e8f46b1057cc0186a3fc3d8541ed81fb6
MD5 3daf5fbf93ef87f2451385df56a1e5a4
BLAKE2b-256 8acd102f388af2098ba29928f4de11cb7356b96897ec39b71e7f66870f0424ae

See more details on using hashes here.

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

Hashes for klspy-2.0.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 7e10298cd55db847f3fc4284d2b606be4741ef0d7154ecfe542827d372052b1a
MD5 e2f4f667f04a6f1462c4261489251c60
BLAKE2b-256 516648537bda65980f57f873e52a625a62111290be20b4ce967ff4e37abe9a3b

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 165e226dcc8265d902fb84cedeb93a690faf17b7b1bfd86071ffd030e51584fc
MD5 0c23d64159e5da513ebe5a64821868cc
BLAKE2b-256 e7051f08ed72bb29e36ca63254f57e251e9545191b577e00689ce046cf61f953

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ce20e2b42327ebc9711975fea7b49e919f55c5dde8ef90e756944e25d80d552e
MD5 dd5e58a390f0871e9aa197608a4cbea8
BLAKE2b-256 33fde9d27062832ffd97c21b3241432736a8ebab2a5a3d3e05f98e765fedf8a2

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 0266a625ed720a72bc0add432426290187d9631a7e53b74f31e4837c7df2c870
MD5 f914347d5706669deebaa0f1edac9249
BLAKE2b-256 126b632657cd6b6488128136018a38b8b616414ead146a629f45f827cec51a8d

See more details on using hashes here.

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

Hashes for klspy-2.0.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e6de7d7ac4e3789f0939d7382aaa3aa79c1a938bde4d01de3d2e52eeed0fbcd9
MD5 18e260545153c4a7c80c424593f8f245
BLAKE2b-256 6586141a51866b297120ac631c3864353a6ea9d24adee36ddf782ba8e1b6a74d

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 927aff995332a5269ee66a8394e3250c3c692688e6b6ad029051d5ff1d225290
MD5 0d6c5832b1b444ec5cf4f6e6e37e2580
BLAKE2b-256 f91f260806269c52ffad78e89c70742b42eba7cc44f282033f9b9a6e76cdddf2

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bde87966e2d02871f6d77a8ff9c4112326af3528fc87a2e46a2e7db96a6d4440
MD5 de41db7941837d6c65fc96c2228c9119
BLAKE2b-256 3cd7f215e106f8f68d9dffb0d54fb2464e69cde744ac6540e1ed74605d9acca7

See more details on using hashes here.

File details

Details for the file klspy-2.0.3-cp38-cp38-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for klspy-2.0.3-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 4c5a29ee2141bd0fe6f0f7514e83139b7bf436b11fef90d40a27201e2ebf7615
MD5 1a067efb1a43cf7489b52e8c88ed1e6f
BLAKE2b-256 e3444cef5a6b7f50edc85bdf0b099e093073beb8c53159d8e32554c3498f3988

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page