Skip to main content

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

Metadata

Release files for opaque-ke-py 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for opaque-ke-py 0.1.2
File Actions
opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details for opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl
opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ x86-64 Details for opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl
opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ ARM64 Details for opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl
opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64 Details for opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl
opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 Details for opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64 Details for opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl CPython 3.13 CPython 3.13 free-threading Windows x86-64 Details for opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl
opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 free-threading Linux musl 1.2+ x86-64 Details for opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl
opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl CPython 3.13 CPython 3.13 free-threading Linux musl 1.2+ ARM64 Details for opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl
opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 free-threading Linux glibc 2.28+ ARM64 Details for opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl
opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 free-threading Linux glibc 2.17+ x86-64 Details for opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl CPython 3.13 CPython 3.13 free-threading macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64 Details for opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl CPython 3.8 abi3 Windows x86-64 Details for opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl
opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl CPython 3.8 abi3 Linux musl 1.2+ x86-64 Details for opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl
opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl CPython 3.8 abi3 Linux musl 1.2+ ARM64 Details for opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl
opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl CPython 3.8 abi3 Linux glibc 2.28+ ARM64 Details for opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl
opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.8 abi3 Linux glibc 2.17+ x86-64 Details for opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl CPython 3.8 abi3 macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64 Details for opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Total release size: 8.8 MB

Release files / opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl

Download URL opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl
Size 246.3 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
f28a9730b0fdcad55f25a1dedefb71bb5be1e89134c0355310271dfac0bac001
BLAKE2b-256 checksum
How to use checksums
d13680d0c3ac9e66c6a3c9c21eb352cab585ceff0a0d0a0514c261b433011f2e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl

Download URL opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl
Size 573.4 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
249d376c8756b4ee5c9e2b5be205fbaa7ebbc3e558e12fbf8ef73d9a6ebb6727
BLAKE2b-256 checksum
How to use checksums
b90e6a16d3925d6fc0c8294c7aa8fe48d503fea29ffc3412f07ddd5cd9033556
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl

Download URL opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl
Size 575.2 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
7d978daa0a0f4ed537f1c6d0fa67653580ea1e5bc7e2e9e5b0f353c68da447e4
BLAKE2b-256 checksum
How to use checksums
0923769f53c6f5388347701f860e213a333bd3a32d456b9b07cd57a932958f1e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl

Download URL opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 392.4 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
4cd9b051e590da3ab362b23b5c7f491afd6b4ab209c0f62f07ec6566c6e46497
BLAKE2b-256 checksum
How to use checksums
a4c81eb39f48ca3633650f417af43f55f4b85adbffbd55e2c8def70e8f12c651
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 403.1 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
6199f42a5c9d7d23e8d6eb074b688a8d4a45f55ada4fd4ff25b31e4751586506
BLAKE2b-256 checksum
How to use checksums
7b1e7c08ddb1da81e218900b1960806bfd297b0b6671731367d84652ef7e031b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Download URL opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Size 711.3 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
fcb0b78daf880551736267c06789ba7b8e580131d4c76e52662045b1e4eb9608
BLAKE2b-256 checksum
How to use checksums
ae8a855d28b34793f434aacc0831616b2f8d0003013cf0f8fd50f1fd8f875bec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl

Download URL opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl
Size 245.5 kB
Tags CPython 3.13 CPython 3.13 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
ebde1910fda9cc3e9829a5cde3dbb33ffc8fc2992e7d0a6784249d9603b463c2
BLAKE2b-256 checksum
How to use checksums
fc4cc130e294842241c69306d712aa574633369cfa4ecf2f11e32d07fa254e22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl

Download URL opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl
Size 573.0 kB
Tags CPython 3.13 CPython 3.13 free-threading Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
f446d57dc21862483410acbb214ab027e38d265d7c4e5b38172462be9957ed14
BLAKE2b-256 checksum
How to use checksums
07342bef50f2553729d388d566ce21cca8614959148e62cf0785fff9eb7e541e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl

Download URL opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl
Size 575.4 kB
Tags CPython 3.13 CPython 3.13 free-threading Linux musl 1.2+ ARM64
SHA-256 checksum
How to use checksums
41cc137487c696d74936484a4c0bf78be98fac2162527d3bfa50d9f33b76fc0a
BLAKE2b-256 checksum
How to use checksums
2d73d5b4f250a26fbb2226ebd7fa53334a3c4d0781db6a07e9f9da08687731ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl

Download URL opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl
Size 392.4 kB
Tags CPython 3.13 CPython 3.13 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
0c9731126bd170a6ade1bd707530d1a3ba48da64528b3c4a0d740397c42d1c4b
BLAKE2b-256 checksum
How to use checksums
5725896313078f90e1407be4db02e652bdba97dc80d06ab09efde716d752e187
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 403.1 kB
Tags CPython 3.13 CPython 3.13 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
68ba0f9b2c924ba715e763f6ecc47a7c76385f490672937a27d07f89c9003962
BLAKE2b-256 checksum
How to use checksums
6e7b67b89c65e7d1d5644f9cc0c82a21e5e714fb0b6fbaa0fcf85d17d0e1403b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Download URL opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Size 711.2 kB
Tags CPython 3.13 CPython 3.13 free-threading macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0b1319900214a05302de0bdc8dce6bb7724f0e749c35a5aaf344a53258450686
BLAKE2b-256 checksum
How to use checksums
798ceab3a2720e68f7d6a2e75a843d0b64403e754a24d4326f402bc53b256307
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl

Download URL opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl
Size 252.2 kB
Tags CPython 3.8 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
be687c8fc609a10412442b883c51a177c471d5eaee1254788c287334152a25fc
BLAKE2b-256 checksum
How to use checksums
3550c58b045300abfeeb1aaffddb67c83635b47ed6260d0a1dc2282239c97319
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl

Download URL opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl
Size 581.7 kB
Tags CPython 3.8 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
b09ccf3d0975d498ddeee0f9bc8b3e56587ed4e669f3ba54a25f76644ea20f54
BLAKE2b-256 checksum
How to use checksums
9290906d231ecaa7c3d19404327ca5fffe23186622ec38b86af7190beffd3c95
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl

Download URL opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl
Size 583.4 kB
Tags CPython 3.8 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
138ffeeaba969483eafea11be491837b4732a11f20b00f1e50022153463514f4
BLAKE2b-256 checksum
How to use checksums
d2385d69bfc3d3799f95821a36e69930a978f333070312c58918dc394a6a962f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl

Download URL opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl
Size 400.4 kB
Tags CPython 3.8 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
ee5e3a34b70f8bba9952a40712cd0e6eca99837a1d237be0afd8b5fc2d1d316d
BLAKE2b-256 checksum
How to use checksums
119ea2703ce5d8260450a6f04e8409be261082d3e3201dc201d3af6063a77dd6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 413.0 kB
Tags CPython 3.8 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
9a260bf9953c3b551f2a846eb4833f00650c302bb9191a1bd84e05dbac6bb393
BLAKE2b-256 checksum
How to use checksums
75ddb7529336eb7dd8c42d5da6f9f885199422669cb9c42280ec25b8e5ba8343
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Release files / opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl

Download URL opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Size 726.6 kB
Tags CPython 3.8 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
73bd1ac34861ecd4357da76b7457c776f9e859ed88627a6f3158ae08b194d5e0
BLAKE2b-256 checksum
How to use checksums
5d5f3c7af187f2289fa47df2e4f93e6ee1d6b104686fbbd773da55acab3a0ede
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

Security for opaque-ke-py 0.1.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 18 files in this release have been uploaded with provenance metadata.

Select from 18 files

Attestation for opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 8, 2025.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page