Skip to main content

OpenADP Python SDK for distributed secret sharing and advanced data protection

Project description

OpenADP Python SDK

A Python implementation of the OpenADP (Open Advanced Data Protection) client, providing distributed secret sharing and threshold cryptography for secure data protection.

Overview

OpenADP is an open-source distributed secret sharing system designed to protect against nation-state attacks. This Python SDK provides complete interoperability with the Go implementation, allowing you to:

  • Generate and recover encryption keys using threshold cryptography
  • Communicate securely with OpenADP servers using Noise-NK protocol
  • Manage multiple servers with automatic failover
  • Perform Ed25519 elliptic curve operations and Shamir secret sharing

Features

  • 🔐 Cryptographic Operations: Ed25519 elliptic curve operations, Shamir secret sharing, HKDF key derivation
  • 🛡️ Secure Communication: Noise-NK protocol implementation for encrypted client-server communication
  • 🌐 Multi-Server Support: Automatic server discovery, failover, and load balancing
  • 🔄 Cross-Language Compatibility: Full interoperability with Go implementation
  • 📡 JSON-RPC 2.0: Standards-compliant API communication
  • 🚀 Easy to Use: Simple high-level API for common operations

Installation

Prerequisites

  • Python 3.8 or higher
  • pip package manager

Install from PyPI (when published)

pip install openadp

Install from Source

git clone https://github.com/openadp/openadp.git
cd openadp/sdk/python
pip install -e .

Dependencies

The SDK requires:

  • cryptography>=41.0.0 - For cryptographic operations
  • requests>=2.28.0 - For HTTP client functionality

Quick Start

Basic Key Generation and Recovery

from openadp import MultiServerClient
from openadp.keygen import generate_encryption_key, recover_encryption_key

# Generate an encryption key with distributed backup
key, auth_code = generate_encryption_key(
    password="your_secure_password",
    uid="user@example.com",
    did="device_identifier", 
    bid="backup_identifier"
)

print(f"Generated 256-bit key: {key.hex()}")
print(f"Auth code (save this!): {auth_code}")

# Later, recover the key from a different device
client = MultiServerClient()
recovered_key = recover_encryption_key(
    password="your_secure_password",
    auth_code=auth_code,
    uid="user@example.com",
    did="device_identifier",
    bid="backup_identifier",
    client=client
)

print(f"Recovered key: {recovered_key.hex()}")
assert key == recovered_key  # Keys match!

Direct Client Usage

from openadp import EncryptedOpenADPClient, discover_servers

# Discover available servers
servers = discover_servers()
print(f"Found {len(servers)} servers")

# Create encrypted client with server public key
server = servers[0]
public_key = base64.b64decode(server.public_key.split(':')[1])
client = EncryptedOpenADPClient(server.url, public_key)

# Test connectivity
try:
    client.ping()
    print("✅ Connected to server successfully")
except Exception as e:
    print(f"❌ Connection failed: {e}")

# Get server information
info = client.get_server_info()
print(f"Server version: {info['version']}")

Multi-Server Operations

from openadp import MultiServerClient, ServerInfo

# Create client with automatic server discovery
client = MultiServerClient()
print(f"Connected to {client.get_live_server_count()} servers")

# Or specify servers manually
server_infos = [
    ServerInfo(
        url="https://server1.example.com",
        public_key="ed25519:AAAAC3NzaC1lZDI1NTE5AAAAIExampleKey1",
        country="US"
    ),
    ServerInfo(
        url="https://server2.example.com", 
        public_key="ed25519:AAAAC3NzaC1lZDI1NTE5AAAAIExampleKey2",
        country="EU"
    )
]

client = MultiServerClient.from_server_info(server_infos)

# List available backups
backups = client.list_backups("user@example.com")
for backup in backups:
    print(f"Backup: {backup['bid']}, Version: {backup['version']}")

API Reference

Core Classes

MultiServerClient

High-level client managing multiple OpenADP servers with automatic failover.

client = MultiServerClient(
    servers_url="https://servers.openadp.org",  # Server registry URL
    fallback_servers=None,                      # Fallback server URLs
    echo_timeout=10,                           # Connection timeout
    max_workers=10                             # Concurrent connection limit
)

EncryptedOpenADPClient

JSON-RPC client with Noise-NK encryption support.

client = EncryptedOpenADPClient(
    url="https://server.example.com",
    server_public_key=public_key_bytes,  # 32-byte Ed25519 public key
    timeout=30
)

OpenADPClient

Basic JSON-RPC client without encryption (for testing only).

client = OpenADPClient("https://server.example.com")

Key Generation Functions

generate_encryption_key()

Generate a new encryption key with distributed backup.

key, auth_code = generate_encryption_key(
    password="user_password",
    uid="user@example.com",      # User identifier  
    did="device_id",             # Device identifier
    bid="backup_id",             # Backup identifier
    client=None,                 # Optional: custom client
    max_guesses=10,              # Recovery attempt limit
    expiration=None              # Optional: expiration timestamp
)

recover_encryption_key()

Recover an encryption key from distributed backup.

key = recover_encryption_key(
    password="user_password",
    auth_code="auth_code_from_generation",
    uid="user@example.com",
    did="device_id", 
    bid="backup_id",
    client=None                  # Optional: custom client
)

Server Discovery

from openadp import discover_servers, get_fallback_servers

# Discover servers from registry
servers = discover_servers("https://servers.openadp.org")

# Get hardcoded fallback servers
fallback = get_fallback_servers()

# Get servers by country
by_country = get_servers_by_country()
us_servers = by_country.get("US", [])

Cryptographic Operations

from openadp.crypto import (
    Point2D, G, H, 
    point_multiply, point_add, point_compress,
    shamir_split, shamir_recover,
    hkdf_derive
)

# Point operations
point = point_multiply(G, 12345)
compressed = point_compress(point)

# Hash to point
hash_point = H("data1", "data2", "data3")

# Shamir secret sharing
shares = shamir_split(secret_bytes, threshold=3, num_shares=5)
recovered = shamir_recover(shares[:3])  # Any 3 shares

Error Handling

The SDK uses structured error handling with specific error codes:

from openadp import OpenADPError, ErrorCode

try:
    key, auth_code = generate_encryption_key(...)
except OpenADPError as e:
    if e.code == ErrorCode.NO_LIVE_SERVERS:
        print("No servers available")
    elif e.code == ErrorCode.AUTHENTICATION_FAILED:
        print("Authentication failed")
    elif e.code == ErrorCode.NETWORK_FAILURE:
        print("Network error")
    else:
        print(f"Error {e.code}: {e.message}")

Testing

Run the test suite to verify the installation:

# Run built-in tests
python -m openadp.test_client

# Or if installed with console script
openadp-test

# Run with pytest (if installed)
cd sdk/python
pytest tests/

Security Considerations

  • Server Public Keys: Always verify server public keys through trusted channels
  • Authentication Codes: Store authentication codes securely - they're required for key recovery
  • Password Security: Use strong, unique passwords for key generation
  • Network Security: The SDK uses Noise-NK encryption, but ensure HTTPS for additional protection

Compatibility

This Python SDK is fully compatible with:

  • Go OpenADP implementation (same cryptographic operations)
  • OpenADP servers (identical JSON-RPC API)
  • Cross-language key recovery (keys generated in Python can be recovered in Go and vice versa)

Development

Running Tests

cd sdk/python
pip install -e ".[dev]"
pytest tests/ -v

Code Formatting

black openadp/
isort openadp/
mypy openadp/

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

Changelog

Version 1.0.0

  • Initial release with full Go compatibility
  • Complete Noise-NK protocol implementation
  • Multi-server client with automatic failover
  • Comprehensive cryptographic operations
  • Cross-language key generation and recovery

Project details


Download files

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

Source Distribution

openadp-0.1.2.tar.gz (46.2 kB view details)

Uploaded Source

Built Distribution

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

openadp-0.1.2-py3-none-any.whl (36.1 kB view details)

Uploaded Python 3

File details

Details for the file openadp-0.1.2.tar.gz.

File metadata

  • Download URL: openadp-0.1.2.tar.gz
  • Upload date:
  • Size: 46.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for openadp-0.1.2.tar.gz
Algorithm Hash digest
SHA256 02500c3a383a95dc61d0fd995223b0d1fbde9bf6a2e27724d383f944b0773883
MD5 dfac18e7a12a1121592ccdac8bc9ed65
BLAKE2b-256 fa5390284ebb51a84d1d8a246cf1e7df0e263f2862e71fda641957377bc2cb61

See more details on using hashes here.

File details

Details for the file openadp-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: openadp-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 36.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for openadp-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 16322ddd10afc5549a7ad80ff3ce82f43f721bdb9d892136dd552a0c91f62f30
MD5 297ad84b88b56cd4e2e538290b8bd955
BLAKE2b-256 2f36259665d01958853fd1fb4b564539ed6f3c28b25885ef9317b7ee7a5976b6

See more details on using hashes here.

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