Skip to main content

Python bindings for the OPAQUE-KE asymmetric password-authenticated key exchange protocol

Project description

opaque-ke-py

Python bindings for the OPAQUE-KE asymmetric password-authenticated key exchange (aPAKE) protocol.

What is OPAQUE?

OPAQUE is a secure asymmetric password-authenticated key exchange protocol that provides strong security guarantees:

  • Server never sees the password: The server doesn't store passwords in plaintext or even hashed form
  • Resistant to pre-computation attacks: Even if the server is compromised, attackers cannot perform offline dictionary attacks
  • Mutual authentication: Both client and server authenticate each other
  • Establishes a shared session key: After successful authentication, both parties share a strong cryptographic session key

Installation

From source

You'll need Rust and Python 3.12+ installed.

# Install maturin (Rust/Python build tool)
pip install maturin

# Build and install
maturin build --release
pip install target/wheels/opaque_ke_py-*.whl

From PyPI (when published)

pip install opaque-ke-py

Quick Start

import opaque_ke_py

# Server setup (done once when server initializes)
server_setup = opaque_ke_py.server_setup()

# Registration flow
username = b"alice"
password = b"correct-horse-battery-staple"

# 1. Client starts registration
client_reg_start = opaque_ke_py.client_registration_start(password)
registration_request = client_reg_start.get_message()
client_reg_state = client_reg_start.get_state()

# 2. Server processes registration request
server_reg_start = opaque_ke_py.server_registration_start(
    server_setup,
    registration_request,
    username
)
registration_response = server_reg_start.get_message()

# 3. Client finishes registration
client_reg_finish = opaque_ke_py.client_registration_finish(
    password,
    client_reg_state,
    registration_response
)
registration_upload = client_reg_finish.get_message()

# 4. Server stores password file
server_reg_finish = opaque_ke_py.server_registration_finish(registration_upload)
password_file = server_reg_finish.get_password_file()
# Store password_file securely in database

# Login flow
# 1. Client starts login
client_login_start = opaque_ke_py.client_login_start(password)
credential_request = client_login_start.get_message()
client_login_state = client_login_start.get_state()

# 2. Server processes login request
server_login_start = opaque_ke_py.server_login_start(
    server_setup,
    password_file,
    credential_request,
    username
)
credential_response = server_login_start.get_message()
server_login_state = server_login_start.get_state()

# 3. Client finishes login
client_login_finish = opaque_ke_py.client_login_finish(
    password,
    client_login_state,
    credential_response
)
credential_finalization = client_login_finish.get_message()
client_session_key = client_login_finish.get_session_key()

# 4. Server finishes login
server_login_finish = opaque_ke_py.server_login_finish(
    server_login_state,
    credential_finalization
)
server_session_key = server_login_finish.get_session_key()

# Both client and server now have matching session keys
assert client_session_key == server_session_key

Complete Example

See example.py for a complete working example demonstrating:

  • Server setup
  • User registration
  • User login
  • Session key establishment
  • Failed login handling

Run it with:

python example.py

API Reference

Server Setup

server_setup() -> ServerSetupData

Generate server setup containing the server's keypair. This should be done once when the server starts and the result should be stored securely.

Registration Flow

1. Client Registration Start

client_registration_start(password: bytes) -> ClientRegistrationStartData

Client initiates registration with their password.

Returns:

  • get_message(): Message to send to server
  • get_state(): Client state to keep private

2. Server Registration Start

server_registration_start(
    server_setup: ServerSetupData,
    registration_request: bytes,
    username: bytes
) -> ServerRegistrationStartData

Server processes the registration request.

Returns:

  • get_message(): Message to send back to client

3. Client Registration Finish

client_registration_finish(
    password: bytes,
    client_state: bytes,
    registration_response: bytes
) -> ClientRegistrationFinishData

Client completes registration.

Returns:

  • get_message(): Final message to send to server
  • get_export_key(): Export key for additional key derivation

4. Server Registration Finish

server_registration_finish(
    registration_upload: bytes
) -> ServerRegistrationFinishData

Server completes registration and generates password file.

Returns:

  • get_password_file(): Password file to store in database

Login Flow

1. Client Login Start

client_login_start(password: bytes) -> ClientLoginStartData

Client initiates login with their password.

Returns:

  • get_message(): Message to send to server
  • get_state(): Client state to keep private

2. Server Login Start

server_login_start(
    server_setup: ServerSetupData,
    password_file: bytes,
    credential_request: bytes,
    username: bytes
) -> ServerLoginStartData

Server processes the login request.

Returns:

  • get_message(): Message to send back to client
  • get_state(): Server state to keep private

3. Client Login Finish

client_login_finish(
    password: bytes,
    client_state: bytes,
    credential_response: bytes
) -> ClientLoginFinishData

Client completes login. Raises ValueError if authentication fails.

Returns:

  • get_message(): Final message to send to server
  • get_session_key(): Shared session key for encrypted communication
  • get_export_key(): Export key for additional key derivation

4. Server Login Finish

server_login_finish(
    server_state: bytes,
    credential_finalization: bytes
) -> ServerLoginFinishData

Server completes login. Raises ValueError if authentication fails.

Returns:

  • get_session_key(): Shared session key for encrypted communication

Security Considerations

⚠️ CRITICAL: Python Memory Limitations

Python bytes are immutable and cannot be reliably zeroized from memory. This is a fundamental limitation of Python's memory management model.

What this means:

  • Passwords passed to this library may persist in Python's heap memory until garbage collection
  • They may be written to swap files or appear in core dumps
  • Memory scraping malware could potentially extract passwords from process memory

When it's appropriate:

  • ✅ Standard web applications with reasonable security requirements
  • ✅ Internal tools with trusted environments
  • ✅ Prototyping and development
  • ✅ Applications where TLS + standard practices provide sufficient security

General Security Best Practices

  1. Transport Security: ALWAYS use TLS 1.3+ to prevent man-in-the-middle attacks
  2. Rate Limiting: Implement rate limiting to prevent online guessing attacks (see below)
  3. Server Setup Storage: Encrypt server setup before storing (contains private key)
  4. Password File Storage: Store password files securely in your database (they're safe to store)
  5. State Management: Keep client/server states in memory only, never log or persist them
  6. Session Key Comparison: Use constant_time_compare() for comparing sensitive values
  7. Username Binding: Usernames are cryptographically bound to registrations

Rate Limiting (REQUIRED)

OPAQUE protects against offline dictionary attacks, but you MUST implement rate limiting to prevent online guessing:

from time import time
from collections import defaultdict

# Simple rate limiting example
failed_attempts = defaultdict(list)  # username -> [timestamps]

def check_rate_limit(username: str, max_attempts: int = 5, window_seconds: int = 900):
    """Allow max_attempts failures per window_seconds (default: 5 per 15 min)"""
    now = time()
    # Remove old attempts outside the window
    failed_attempts[username] = [
        ts for ts in failed_attempts[username]
        if now - ts < window_seconds
    ]

    if len(failed_attempts[username]) >= max_attempts:
        raise Exception(f"Rate limit exceeded. Try again later.")

def record_failed_login(username: str):
    """Record a failed login attempt"""
    failed_attempts[username].append(time())

# Use before login
check_rate_limit(username)
try:
    # ... perform login ...
    pass
except ValueError:
    record_failed_login(username)
    raise

Recommended mitigations:

  • Rate limiting: 5 failed attempts per 15 minutes per username
  • IP-based limits: 20 failed attempts per hour per IP address
  • Progressive delays: Exponential backoff after repeated failures
  • Account lockout: Temporary lockout after 10 failures in 1 hour
  • Monitoring: Alert on suspicious patterns (distributed attacks, enumeration attempts)

Server Setup Key Storage

The server setup contains the server's private key. You MUST encrypt it before storage:

from cryptography.fernet import Fernet
import os

# Generate encryption key (store in environment variable or KMS)
storage_key = os.environ.get('SERVER_SETUP_ENCRYPTION_KEY').encode()
cipher = Fernet(storage_key)

# Encrypt before storage
server_setup = opaque_ke_py.server_setup()
plaintext = server_setup.to_bytes()
encrypted = cipher.encrypt(plaintext)

# Store encrypted bytes to disk/database
with open('server_setup.enc', 'wb') as f:
    f.write(encrypted)

# Later: decrypt when loading
with open('server_setup.enc', 'rb') as f:
    encrypted = f.read()
plaintext = cipher.decrypt(encrypted)
server_setup = opaque_ke_py.ServerSetupData.from_bytes(plaintext)

⚠️ NEVER:

  • Log the server setup or its private key
  • Store server setup in plaintext
  • Transmit server setup over the network
  • Include server setup in backups without encryption

State Security

States returned by login/registration functions contain sensitive cryptographic material:

You MUST:

  • ✅ Keep states in memory only (never persist to disk/database)
  • ✅ Never reuse states across different login/registration attempts
  • ✅ Never log or serialize states
  • ✅ Discard states immediately after the protocol completes

States are single-use only. Reusing a state violates the protocol's security guarantees.

Constant-Time Comparisons

When comparing session keys or other sensitive values, use the provided constant-time comparison:

import opaque_ke_py

# ❌ WRONG: Timing attack vulnerable
if client_session_key == server_session_key:
    print("Keys match!")

# ✅ CORRECT: Constant-time comparison
if opaque_ke_py.constant_time_compare(client_session_key, server_session_key):
    print("Keys match!")

Error Handling

This library uses generic error messages to prevent information leakage:

  • "Authentication failed" - Login/registration cryptographic operation failed
  • "Invalid message format" - Deserialization or format error
  • "Registration failed" - Registration protocol error
  • "input too large" - Input exceeds 1 MB limit

Never expose these errors directly to end users. Instead, show user-friendly messages like:

  • "Invalid username or password"
  • "Registration failed, please try again"
  • "An error occurred, please contact support"

Audit Status

  • Underlying Rust library (opaque-ke v4.0.1): Audited by NCC Group for WhatsApp (2021)
  • ⚠️ This Python wrapper: Not independently audited

The underlying cryptographic implementation is solid and has been professionally reviewed. The Python binding layer has been designed following security best practices but has not undergone formal security audit.

Cipher Suite

This wrapper uses the following cryptographic primitives:

  • OPRF: Ristretto255
  • Key Exchange: TripleDH over Ristretto255 with SHA-512
  • Key Stretching Function: Argon2

These provide strong security guarantees and are recommended by the OPAQUE specification.

Development

Building

# Debug build
maturin develop

# Release build
maturin build --release

Testing

# Run the example
python example.py

# Check types
mypy example.py

License

MIT

Credits

This project wraps the opaque-ke Rust implementation by Meta Platforms, Inc.

References

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.

opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl (246.3 kB view details)

Uploaded CPython 3.14tWindows x86-64

opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl (573.4 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl (575.2 kB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl (392.4 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (403.1 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (711.3 kB view details)

Uploaded CPython 3.14tmacOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl (245.5 kB view details)

Uploaded CPython 3.13tWindows x86-64

opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl (573.0 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl (575.4 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl (392.4 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.28+ ARM64

opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (403.1 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (711.2 kB view details)

Uploaded CPython 3.13tmacOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl (252.2 kB view details)

Uploaded CPython 3.8+Windows x86-64

opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl (581.7 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ x86-64

opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl (583.4 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARM64

opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl (400.4 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ ARM64

opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (413.0 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (726.6 kB view details)

Uploaded CPython 3.8+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 f28a9730b0fdcad55f25a1dedefb71bb5be1e89134c0355310271dfac0bac001
MD5 27fe4f940271caa7139502b64e1217a0
BLAKE2b-256 d13680d0c3ac9e66c6a3c9c21eb352cab585ceff0a0d0a0514c261b433011f2e

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 249d376c8756b4ee5c9e2b5be205fbaa7ebbc3e558e12fbf8ef73d9a6ebb6727
MD5 d5b3a3d2fce3006b5bec56db658c43d4
BLAKE2b-256 b90e6a16d3925d6fc0c8294c7aa8fe48d503fea29ffc3412f07ddd5cd9033556

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7d978daa0a0f4ed537f1c6d0fa67653580ea1e5bc7e2e9e5b0f353c68da447e4
MD5 b8f93c88f9bffaea6a4905630cdc1d7f
BLAKE2b-256 0923769f53c6f5388347701f860e213a333bd3a32d456b9b07cd57a932958f1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4cd9b051e590da3ab362b23b5c7f491afd6b4ab209c0f62f07ec6566c6e46497
MD5 776f3a0cab7eeabd6a762fd62d4bc435
BLAKE2b-256 a4c81eb39f48ca3633650f417af43f55f4b85adbffbd55e2c8def70e8f12c651

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6199f42a5c9d7d23e8d6eb074b688a8d4a45f55ada4fd4ff25b31e4751586506
MD5 3fce7973de4b92e5fcfaa348dc4589e8
BLAKE2b-256 7b1e7c08ddb1da81e218900b1960806bfd297b0b6671731367d84652ef7e031b

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 fcb0b78daf880551736267c06789ba7b8e580131d4c76e52662045b1e4eb9608
MD5 e9f4266a71092fc25895fda4b3544bd8
BLAKE2b-256 ae8a855d28b34793f434aacc0831616b2f8d0003013cf0f8fd50f1fd8f875bec

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 ebde1910fda9cc3e9829a5cde3dbb33ffc8fc2992e7d0a6784249d9603b463c2
MD5 d42e89d4fa123c708ea8ab77d9a791ce
BLAKE2b-256 fc4cc130e294842241c69306d712aa574633369cfa4ecf2f11e32d07fa254e22

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f446d57dc21862483410acbb214ab027e38d265d7c4e5b38172462be9957ed14
MD5 909fb86f63624ba1378500e2967e1735
BLAKE2b-256 07342bef50f2553729d388d566ce21cca8614959148e62cf0785fff9eb7e541e

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 41cc137487c696d74936484a4c0bf78be98fac2162527d3bfa50d9f33b76fc0a
MD5 9fc4318731e56f6e78011fb6b8ae8a50
BLAKE2b-256 2d73d5b4f250a26fbb2226ebd7fa53334a3c4d0781db6a07e9f9da08687731ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0c9731126bd170a6ade1bd707530d1a3ba48da64528b3c4a0d740397c42d1c4b
MD5 d217868dc10da02275a1915801745b85
BLAKE2b-256 5725896313078f90e1407be4db02e652bdba97dc80d06ab09efde716d752e187

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 68ba0f9b2c924ba715e763f6ecc47a7c76385f490672937a27d07f89c9003962
MD5 c42ab5460be4c3013eb200a6cd18d7f5
BLAKE2b-256 6e7b67b89c65e7d1d5644f9cc0c82a21e5e714fb0b6fbaa0fcf85d17d0e1403b

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 0b1319900214a05302de0bdc8dce6bb7724f0e749c35a5aaf344a53258450686
MD5 1f0025d5812210856199845d9bb90fa7
BLAKE2b-256 798ceab3a2720e68f7d6a2e75a843d0b64403e754a24d4326f402bc53b256307

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 252.2 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 be687c8fc609a10412442b883c51a177c471d5eaee1254788c287334152a25fc
MD5 c0ea54086b28c26b2d59febb78657030
BLAKE2b-256 3550c58b045300abfeeb1aaffddb67c83635b47ed6260d0a1dc2282239c97319

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b09ccf3d0975d498ddeee0f9bc8b3e56587ed4e669f3ba54a25f76644ea20f54
MD5 7cda9eec545448345038a14b8489590f
BLAKE2b-256 9290906d231ecaa7c3d19404327ca5fffe23186622ec38b86af7190beffd3c95

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 138ffeeaba969483eafea11be491837b4732a11f20b00f1e50022153463514f4
MD5 f7482f1d5240b0a3e936edcabd157b88
BLAKE2b-256 d2385d69bfc3d3799f95821a36e69930a978f333070312c58918dc394a6a962f

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ee5e3a34b70f8bba9952a40712cd0e6eca99837a1d237be0afd8b5fc2d1d316d
MD5 657849b7f6104714ecdc48eb2d37cd08
BLAKE2b-256 119ea2703ce5d8260450a6f04e8409be261082d3e3201dc201d3af6063a77dd6

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9a260bf9953c3b551f2a846eb4833f00650c302bb9191a1bd84e05dbac6bb393
MD5 403ecfe344ed72ec6d9738c50c86aaba
BLAKE2b-256 75ddb7529336eb7dd8c42d5da6f9f885199422669cb9c42280ec25b8e5ba8343

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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

File details

Details for the file opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 73bd1ac34861ecd4357da76b7457c776f9e859ed88627a6f3158ae08b194d5e0
MD5 7b868c47ac613ea3c198463757c4e719
BLAKE2b-256 5d5f3c7af187f2289fa47df2e4f93e6ee1d6b104686fbbd773da55acab3a0ede

See more details on using hashes here.

Provenance

The following attestation bundles were made for opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: py-release.yml on jontyms/opaque-ke-py

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