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 serverget_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 serverget_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 serverget_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 clientget_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 serverget_session_key(): Shared session key for encrypted communicationget_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
- Transport Security: ALWAYS use TLS 1.3+ to prevent man-in-the-middle attacks
- Rate Limiting: Implement rate limiting to prevent online guessing attacks (see below)
- Server Setup Storage: Encrypt server setup before storing (contains private key)
- Password File Storage: Store password files securely in your database (they're safe to store)
- State Management: Keep client/server states in memory only, never log or persist them
- Session Key Comparison: Use
constant_time_compare()for comparing sensitive values - 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-kev4.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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl
- Upload date:
- Size: 246.3 kB
- Tags: CPython 3.14t, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f28a9730b0fdcad55f25a1dedefb71bb5be1e89134c0355310271dfac0bac001
|
|
| MD5 |
27fe4f940271caa7139502b64e1217a0
|
|
| BLAKE2b-256 |
d13680d0c3ac9e66c6a3c9c21eb352cab585ceff0a0d0a0514c261b433011f2e
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp314-cp314t-win_amd64.whl -
Subject digest:
f28a9730b0fdcad55f25a1dedefb71bb5be1e89134c0355310271dfac0bac001 - Sigstore transparency entry: 748355392
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 573.4 kB
- Tags: CPython 3.14t, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
249d376c8756b4ee5c9e2b5be205fbaa7ebbc3e558e12fbf8ef73d9a6ebb6727
|
|
| MD5 |
d5b3a3d2fce3006b5bec56db658c43d4
|
|
| BLAKE2b-256 |
b90e6a16d3925d6fc0c8294c7aa8fe48d503fea29ffc3412f07ddd5cd9033556
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl -
Subject digest:
249d376c8756b4ee5c9e2b5be205fbaa7ebbc3e558e12fbf8ef73d9a6ebb6727 - Sigstore transparency entry: 748355367
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 575.2 kB
- Tags: CPython 3.14t, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d978daa0a0f4ed537f1c6d0fa67653580ea1e5bc7e2e9e5b0f353c68da447e4
|
|
| MD5 |
b8f93c88f9bffaea6a4905630cdc1d7f
|
|
| BLAKE2b-256 |
0923769f53c6f5388347701f860e213a333bd3a32d456b9b07cd57a932958f1e
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl -
Subject digest:
7d978daa0a0f4ed537f1c6d0fa67653580ea1e5bc7e2e9e5b0f353c68da447e4 - Sigstore transparency entry: 748355364
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 392.4 kB
- Tags: CPython 3.14t, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cd9b051e590da3ab362b23b5c7f491afd6b4ab209c0f62f07ec6566c6e46497
|
|
| MD5 |
776f3a0cab7eeabd6a762fd62d4bc435
|
|
| BLAKE2b-256 |
a4c81eb39f48ca3633650f417af43f55f4b85adbffbd55e2c8def70e8f12c651
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_28_aarch64.whl -
Subject digest:
4cd9b051e590da3ab362b23b5c7f491afd6b4ab209c0f62f07ec6566c6e46497 - Sigstore transparency entry: 748355371
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
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
- Download URL: opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 403.1 kB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6199f42a5c9d7d23e8d6eb074b688a8d4a45f55ada4fd4ff25b31e4751586506
|
|
| MD5 |
3fce7973de4b92e5fcfaa348dc4589e8
|
|
| BLAKE2b-256 |
7b1e7c08ddb1da81e218900b1960806bfd297b0b6671731367d84652ef7e031b
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
6199f42a5c9d7d23e8d6eb074b688a8d4a45f55ada4fd4ff25b31e4751586506 - Sigstore transparency entry: 748355349
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
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
- Download URL: opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
- Upload date:
- Size: 711.3 kB
- Tags: CPython 3.14t, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fcb0b78daf880551736267c06789ba7b8e580131d4c76e52662045b1e4eb9608
|
|
| MD5 |
e9f4266a71092fc25895fda4b3544bd8
|
|
| BLAKE2b-256 |
ae8a855d28b34793f434aacc0831616b2f8d0003013cf0f8fd50f1fd8f875bec
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl -
Subject digest:
fcb0b78daf880551736267c06789ba7b8e580131d4c76e52662045b1e4eb9608 - Sigstore transparency entry: 748355341
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl
- Upload date:
- Size: 245.5 kB
- Tags: CPython 3.13t, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebde1910fda9cc3e9829a5cde3dbb33ffc8fc2992e7d0a6784249d9603b463c2
|
|
| MD5 |
d42e89d4fa123c708ea8ab77d9a791ce
|
|
| BLAKE2b-256 |
fc4cc130e294842241c69306d712aa574633369cfa4ecf2f11e32d07fa254e22
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp313-cp313t-win_amd64.whl -
Subject digest:
ebde1910fda9cc3e9829a5cde3dbb33ffc8fc2992e7d0a6784249d9603b463c2 - Sigstore transparency entry: 748355354
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 573.0 kB
- Tags: CPython 3.13t, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f446d57dc21862483410acbb214ab027e38d265d7c4e5b38172462be9957ed14
|
|
| MD5 |
909fb86f63624ba1378500e2967e1735
|
|
| BLAKE2b-256 |
07342bef50f2553729d388d566ce21cca8614959148e62cf0785fff9eb7e541e
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl -
Subject digest:
f446d57dc21862483410acbb214ab027e38d265d7c4e5b38172462be9957ed14 - Sigstore transparency entry: 748355362
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 575.4 kB
- Tags: CPython 3.13t, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41cc137487c696d74936484a4c0bf78be98fac2162527d3bfa50d9f33b76fc0a
|
|
| MD5 |
9fc4318731e56f6e78011fb6b8ae8a50
|
|
| BLAKE2b-256 |
2d73d5b4f250a26fbb2226ebd7fa53334a3c4d0781db6a07e9f9da08687731ab
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl -
Subject digest:
41cc137487c696d74936484a4c0bf78be98fac2162527d3bfa50d9f33b76fc0a - Sigstore transparency entry: 748355380
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 392.4 kB
- Tags: CPython 3.13t, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c9731126bd170a6ade1bd707530d1a3ba48da64528b3c4a0d740397c42d1c4b
|
|
| MD5 |
d217868dc10da02275a1915801745b85
|
|
| BLAKE2b-256 |
5725896313078f90e1407be4db02e652bdba97dc80d06ab09efde716d752e187
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_28_aarch64.whl -
Subject digest:
0c9731126bd170a6ade1bd707530d1a3ba48da64528b3c4a0d740397c42d1c4b - Sigstore transparency entry: 748355390
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
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
- Download URL: opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 403.1 kB
- Tags: CPython 3.13t, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
68ba0f9b2c924ba715e763f6ecc47a7c76385f490672937a27d07f89c9003962
|
|
| MD5 |
c42ab5460be4c3013eb200a6cd18d7f5
|
|
| BLAKE2b-256 |
6e7b67b89c65e7d1d5644f9cc0c82a21e5e714fb0b6fbaa0fcf85d17d0e1403b
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
68ba0f9b2c924ba715e763f6ecc47a7c76385f490672937a27d07f89c9003962 - Sigstore transparency entry: 748355377
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
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
- Download URL: opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
- Upload date:
- Size: 711.2 kB
- Tags: CPython 3.13t, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0b1319900214a05302de0bdc8dce6bb7724f0e749c35a5aaf344a53258450686
|
|
| MD5 |
1f0025d5812210856199845d9bb90fa7
|
|
| BLAKE2b-256 |
798ceab3a2720e68f7d6a2e75a843d0b64403e754a24d4326f402bc53b256307
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl -
Subject digest:
0b1319900214a05302de0bdc8dce6bb7724f0e749c35a5aaf344a53258450686 - Sigstore transparency entry: 748355339
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be687c8fc609a10412442b883c51a177c471d5eaee1254788c287334152a25fc
|
|
| MD5 |
c0ea54086b28c26b2d59febb78657030
|
|
| BLAKE2b-256 |
3550c58b045300abfeeb1aaffddb67c83635b47ed6260d0a1dc2282239c97319
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp38-abi3-win_amd64.whl -
Subject digest:
be687c8fc609a10412442b883c51a177c471d5eaee1254788c287334152a25fc - Sigstore transparency entry: 748355386
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 581.7 kB
- Tags: CPython 3.8+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b09ccf3d0975d498ddeee0f9bc8b3e56587ed4e669f3ba54a25f76644ea20f54
|
|
| MD5 |
7cda9eec545448345038a14b8489590f
|
|
| BLAKE2b-256 |
9290906d231ecaa7c3d19404327ca5fffe23186622ec38b86af7190beffd3c95
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_x86_64.whl -
Subject digest:
b09ccf3d0975d498ddeee0f9bc8b3e56587ed4e669f3ba54a25f76644ea20f54 - Sigstore transparency entry: 748355336
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 583.4 kB
- Tags: CPython 3.8+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
138ffeeaba969483eafea11be491837b4732a11f20b00f1e50022153463514f4
|
|
| MD5 |
f7482f1d5240b0a3e936edcabd157b88
|
|
| BLAKE2b-256 |
d2385d69bfc3d3799f95821a36e69930a978f333070312c58918dc394a6a962f
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp38-abi3-musllinux_1_2_aarch64.whl -
Subject digest:
138ffeeaba969483eafea11be491837b4732a11f20b00f1e50022153463514f4 - Sigstore transparency entry: 748355344
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 400.4 kB
- Tags: CPython 3.8+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee5e3a34b70f8bba9952a40712cd0e6eca99837a1d237be0afd8b5fc2d1d316d
|
|
| MD5 |
657849b7f6104714ecdc48eb2d37cd08
|
|
| BLAKE2b-256 |
119ea2703ce5d8260450a6f04e8409be261082d3e3201dc201d3af6063a77dd6
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_28_aarch64.whl -
Subject digest:
ee5e3a34b70f8bba9952a40712cd0e6eca99837a1d237be0afd8b5fc2d1d316d - Sigstore transparency entry: 748355346
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
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
- Download URL: opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 413.0 kB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a260bf9953c3b551f2a846eb4833f00650c302bb9191a1bd84e05dbac6bb393
|
|
| MD5 |
403ecfe344ed72ec6d9738c50c86aaba
|
|
| BLAKE2b-256 |
75ddb7529336eb7dd8c42d5da6f9f885199422669cb9c42280ec25b8e5ba8343
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
9a260bf9953c3b551f2a846eb4833f00650c302bb9191a1bd84e05dbac6bb393 - Sigstore transparency entry: 748355382
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type:
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
- Download URL: opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
- Upload date:
- Size: 726.6 kB
- Tags: CPython 3.8+, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73bd1ac34861ecd4357da76b7457c776f9e859ed88627a6f3158ae08b194d5e0
|
|
| MD5 |
7b868c47ac613ea3c198463757c4e719
|
|
| BLAKE2b-256 |
5d5f3c7af187f2289fa47df2e4f93e6ee1d6b104686fbbd773da55acab3a0ede
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opaque_ke_py-0.1.2-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl -
Subject digest:
73bd1ac34861ecd4357da76b7457c776f9e859ed88627a6f3158ae08b194d5e0 - Sigstore transparency entry: 748355359
- Sigstore integration time:
-
Permalink:
jontyms/opaque-ke-py@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/jontyms
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
py-release.yml@e1de7110e2ed6c0359dc8d30f07afbdbca5f8166 -
Trigger Event:
push
-
Statement type: