Skip to main content

Python bindings for NIST-standardized post-quantum cryptography, powered by OpenSSL. Honoring Alkindi, the 9th-century pioneer of cryptography.

Project description

Alkindi

In honor of Alkindi (الكِندي), the 9th-century pioneer of cryptography

Status: Alpha License: Apache-2.0

High-performance Python bindings for NIST-standardized post-quantum cryptography, powered by OpenSSL.


Table of Contents


About

The project is named after Alkindi (الكِنْدي), the 9th-century Arab Muslim polymath who pioneered cryptanalysis and frequency analysis, laying the foundations for modern cryptography.

Alkindi makes quantum-resistant cryptography straightforward and accessible in Python by providing clean, type-safe bindings to OpenSSL's implementations of NIST-standardized post-quantum algorithms. As quantum computers advance, traditional public-key systems like RSA and elliptic curves become vulnerable. Alkindi provides the cryptographic primitives needed to protect against both classical and quantum attacks.

Supported Algorithms

  • ML-KEM (formerly Kyber) — Key encapsulation mechanisms for secure key exchange
    Based on lattice cryptography, ML-KEM enables two parties to establish a shared secret over an insecure channel. Available in three security levels (ML-KEM-512, ML-KEM-768, ML-KEM-1024) corresponding to AES-128, AES-192, and AES-256 equivalent security.

  • ML-DSA (formerly Dilithium) — Digital signatures for authentication and integrity
    Lattice-based signatures that provide quantum-resistant authentication. Three parameter sets (ML-DSA-44, ML-DSA-65, ML-DSA-87) offer balanced trade-offs between signature size and security strength.

  • SLH-DSA (formerly SPHINCS+) — Hash-based signatures for conservative security guarantees
    Unlike lattice-based schemes, SLH-DSA relies only on hash function security, making it ideal for long-term signatures and applications requiring minimal cryptographic assumptions. Available in multiple variants optimized for either speed or size.

Alkindi uses CFFI to interface directly with OpenSSL's C implementations, achieving high performance with minimal overhead. The library provides a thread-safe API with full type annotations for enhanced developer experience.

Status: Alpha — Alkindi is under active development with the explicit goal of becoming a production-grade, thoroughly reviewed PQC library for Python. APIs may change before version 1.0.0.


Why Alkindi?

Alkindi bridges the gap between enterprise-grade cryptography and Python developer ergonomics, bringing NIST-standardized post-quantum algorithms to your applications with production readiness in mind:

Feature Description
Battle-tested backend Built on OpenSSL, leveraging decades of cryptographic engineering and security audits rather than implementing algorithms from scratch.
Standards-first Uses NIST-standardized post-quantum algorithms exclusively and avoids experimental or pre-standard variants.
High performance CFFI-based bindings call OpenSSL directly, achieving near-native C performance with minimal Python overhead.
Type-safe, simple API Full type hints and a thread-safe design for safer concurrent usage and superior developer experience.
Minimal attack surface A deliberately focused API that is easier to reason about, audit, and review than a sprawling cryptographic toolkit.

Installation

From PyPI (Coming Soon)

pip install alkindi

From Source

Requirements: Python 3.10+ and C compiler

# Clone the repository
git clone https://github.com/alraddady/alkindi.git
cd alkindi

# Build OpenSSL with PQC support
./scripts/build_openssl.sh

# Install Alkindi
pip install -e .

# Or install with development dependencies
pip install -e ".[dev]"

Quick Start

Key Encapsulation (ML-KEM)

from alkindi import KEM

# Generate a keypair for the receiver
keypair = KEM.generate_keypair("ML-KEM-768")

# Sender: encapsulate a shared secret
ciphertext, shared_secret_sender = KEM.encapsulate("ML-KEM-768", keypair.public_key)

# Receiver: decapsulate to recover the shared secret
shared_secret_receiver = KEM.decapsulate("ML-KEM-768", keypair.private_key, ciphertext)

# Both parties now share the same secret
assert shared_secret_sender == shared_secret_receiver

Deterministic Key Generation

Pass a 64-byte seed to produce the same keypair every time. The seed is the concatenation of the two FIPS 203 internal seeds d || z.

import os

seed = os.urandom(64)
keypair = KEM.generate_keypair("ML-KEM-768", seed=seed)
keypair2 = KEM.generate_keypair("ML-KEM-768", seed=seed)
assert keypair.public_key == keypair2.public_key

Digital Signatures (ML-DSA / SLH-DSA)

from alkindi import Signature

# Generate a keypair for the signer
keypair = Signature.generate_keypair("ML-DSA-65")

# Sign a message
message = b"Hello, quantum world!"
signature = Signature.sign("ML-DSA-65", keypair.private_key, message)

# Verify the signature
is_valid = Signature.verify("ML-DSA-65", keypair.public_key, message, signature)
print(f"Signature valid: {is_valid}")  # True

# Tampering detection
is_valid = Signature.verify("ML-DSA-65", keypair.public_key, b"Tampered message", signature)
print(f"Tampered signature valid: {is_valid}")  # False

Context Strings

ML-DSA and SLH-DSA support an optional context string (up to 255 bytes) that is cryptographically bound to the signature. The same context must be supplied at both signing and verification time.

ctx = b"the quick brown fox jumps over the lazy dog"
signature = Signature.sign("ML-DSA-65", keypair.private_key, message, context=ctx)

# Verification succeeds only with the correct context
Signature.verify("ML-DSA-65", keypair.public_key, message, signature, context=ctx)   # True
Signature.verify("ML-DSA-65", keypair.public_key, message, signature)                 # False

Key Serialization (DER/PEM)

Keys converts raw key bytes to and from standard wire formats for storage and interoperability:

  • Public keys → SubjectPublicKeyInfo (SPKI / X.509)
  • Private keys → PKCS#8 PrivateKeyInfo (unencrypted)
from alkindi import KEM, Keys

keypair = KEM.generate_keypair("ML-KEM-768")
keys = Keys("ML-KEM-768")

# Export to DER or PEM
public_pem  = keys.public_key_to_pem(keypair.public_key)
private_der = keys.private_key_to_der(keypair.private_key)

# Import back to raw bytes
public_key  = keys.public_key_from_pem(public_pem)
private_key = keys.private_key_from_der(private_der)

Keys works with all ML-KEM, ML-DSA, and SLH-DSA algorithms. Bind it once to an algorithm, then call encode/decode methods without repeating the algorithm name.


Documentation

Algorithm Selection Guide

Choosing the right algorithm and parameter set depends on your security requirements, performance constraints, and use case. For detailed guidance on selecting appropriate algorithms, see the Algorithm Selection Guide.

NIST Standards

Additional Resources


Contributing

Contributions are welcome! Please review our Contributing Guidelines before submitting pull requests or opening issues.


License

Licensed under the Apache License 2.0. See LICENSE for complete terms.


Acknowledgments

Alkindi stands on the shoulders of giants. I would like to thank the following organizations and teams for their foundational work:

  • National Institute of Standards and Technology (NIST): for standardizing post-quantum cryptography
  • OpenSSL Project: for providing the cryptographic foundation
  • Algorithm Development Teams:
    • Kyber developers
    • Dilithium developers
    • SPHINCS+ developers
  • Open Quantum Safe (OQS): for their pioneering work in making post-quantum cryptography practical and for fostering a welcoming community

My sincere gratitude also extends to the broader open-source community, whose collaborative spirit and tireless contributions make projects like this possible.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

alkindi-0.0.3-cp313-cp313-win_amd64.whl (886.0 kB view details)

Uploaded CPython 3.13Windows x86-64

alkindi-0.0.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

alkindi-0.0.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

alkindi-0.0.3-cp313-cp313-macosx_14_0_arm64.whl (944.7 kB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

alkindi-0.0.3-cp312-cp312-win_amd64.whl (886.0 kB view details)

Uploaded CPython 3.12Windows x86-64

alkindi-0.0.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

alkindi-0.0.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

alkindi-0.0.3-cp312-cp312-macosx_14_0_arm64.whl (944.7 kB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

alkindi-0.0.3-cp311-cp311-win_amd64.whl (885.9 kB view details)

Uploaded CPython 3.11Windows x86-64

alkindi-0.0.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

alkindi-0.0.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

alkindi-0.0.3-cp311-cp311-macosx_14_0_arm64.whl (944.6 kB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

alkindi-0.0.3-cp310-cp310-win_amd64.whl (885.9 kB view details)

Uploaded CPython 3.10Windows x86-64

alkindi-0.0.3-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

alkindi-0.0.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

alkindi-0.0.3-cp310-cp310-macosx_14_0_arm64.whl (944.6 kB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

Details for the file alkindi-0.0.3-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: alkindi-0.0.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 886.0 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for alkindi-0.0.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 05925e3274786018a863c2914317c4cbebbc11a3dcad5c4de5012698494897d9
MD5 c0fe6776d15d2efb2a1c1692f475967e
BLAKE2b-256 65c8b3de526f0da20099bd2e12aa361f015fba362c09cb56387b7bdc24b70c96

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp313-cp313-win_amd64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3aa518495f0ff8400c496dd59bb9def14e52aaf15d314c9d5ef8baabc0cad244
MD5 1c8d3ac42178eefd5f7bc0435a5e60e4
BLAKE2b-256 edef33625c2f6751cd7b94b543840a93923c53ba7c950dc1c0375692c44c7936

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bb116cf1a2fb7ceaf2fe843c31487ce552daaef878edcf6c0bea2e123def671d
MD5 726c389581b406e4bdf60a8a27267f97
BLAKE2b-256 702e94b3abebc6982a6889c2b9e32f45a0765594c202cf00f97ad84e01addb22

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 c25b34d72fd6adddf3e5ee0f199df8e9ebe51462f1165a62dc0ef0f55c488e67
MD5 c1645e0e3b69c06569fb0951014b2afb
BLAKE2b-256 f17d52ca9714e88ec28fc99419555dacaa21fe101a535d7b2ba52528e3438b86

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp313-cp313-macosx_14_0_arm64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: alkindi-0.0.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 886.0 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for alkindi-0.0.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 56e77b78517ba258f7d26a1bbe4088225267be688df8fb859f39b434f05f20d0
MD5 3a12812c2dbaf423e2e14a5bd7bc76f9
BLAKE2b-256 a692f9f50bf2d99be8fd1af78e6fa9726f973c5805a03bb481a884c100c0c1e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp312-cp312-win_amd64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4244d8353b918b85c001cfa1f381429f8b3d7ff75988e3f381c23127f154cd41
MD5 e957525b371d8b01e4e5adedeeb0bc7f
BLAKE2b-256 ad68e80e327b00f1963fbbe92f32555962b8cabb016adf48ac06d020b314cc19

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8efd8a09215f7058595db418514528e23effb4cb6691fdc7bdf62345717219bf
MD5 02ead25e3c4858922005a49a9ce8c3ac
BLAKE2b-256 79a06fb8346e172475305f6d31a358215fac0d4b3f17210957ff81ec45489cf1

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 2686e5c4e358b523b02fb9e14cd84f239bcfd4ea21660ce3c8194729804f8240
MD5 2dd4710682503fb050359c874a5f3acb
BLAKE2b-256 b15ab5c7652b068aa4c4932540768e121c1a38a6c21e20dff9a08cb808cc49f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp312-cp312-macosx_14_0_arm64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: alkindi-0.0.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 885.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for alkindi-0.0.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9d91452b22f145f8892f1a8fd455ba0737d0813de7bb4dcbb224ccf80de37ad3
MD5 24d886e939040863e75a3490076da392
BLAKE2b-256 1ae0c5fb0d28f9142b97cc5252d7c48f68b2a4c8190da244c1c24ebe5be4be2e

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp311-cp311-win_amd64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9af819b02716d934e148d08aacc1bcaea0cd07d2bb3ee1e6ccb5690211c76770
MD5 441e8f32236956742342ba6a90c8b03a
BLAKE2b-256 839b23bcacd3b77a75a3b51d761d5f361d465fac6a59f54fffc7b28229760cb6

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6bb2bfa660523f9ac484e3e283585beabd91f9b20493b716f47f559465b2d45b
MD5 7debaf1ee1f89352fa6b7bad7e3614af
BLAKE2b-256 33987894c8d5d11e7b2e153da624132c3d2eed9e86373852a05ab792e8d6d253

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f9e4e856e4a0f1d8ca687857b4604c164198a997b7e54aac697be8e4cad0ae52
MD5 c3105004f7a11d288c06f1ed627f1f23
BLAKE2b-256 34c3a1dac8544d7b2e0870d72f1f8aa0c885087e5e629d7857eb224e56145760

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp311-cp311-macosx_14_0_arm64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: alkindi-0.0.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 885.9 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for alkindi-0.0.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e0f12028fe0debcf072ab92b10ddf923ff77b2fc0a3623a07de1cac9850f883c
MD5 5abe6218567cfada27b4a97004e5d286
BLAKE2b-256 2ba9ec78c4710f2afa7ea595d10063f0761a85c74ff0164b874630cccfd30d4f

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp310-cp310-win_amd64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f12f0baa372ed7c116ed1255492c2f44a1a4b12793b0923691a44b6f58206c13
MD5 e68ab9f0801aea4e26e718a3708464f1
BLAKE2b-256 bbb083bdb020f98c514cff3cc825c8444713af3723d50d569daf8b8e47d3c946

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 76d4c15b990552365c024513e28b4fd664f636c333f3d27280bc5f196fba58bc
MD5 0c4355818637ed95f368900cf0f9c683
BLAKE2b-256 4ee3fdf140147ad4df8542328eee568d4083f5539ffd9b95cd707b7d15fa6533

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file alkindi-0.0.3-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for alkindi-0.0.3-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 9ee514797af5163e1d27ad8664aea9ecc7d25d656a41eb83504add44f219e880
MD5 2fe36bdbabfef6d32a1702acbe32f1dd
BLAKE2b-256 859ff346e588134253f9dcd1eb8e3ca6ffdd928adbe76c922314828fe98d1181

See more details on using hashes here.

Provenance

The following attestation bundles were made for alkindi-0.0.3-cp310-cp310-macosx_14_0_arm64.whl:

Publisher: python-publish.yml on alraddady/alkindi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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