Skip to main content

Crate latticearc

Crate latticearc 

Source
Expand description

LatticeArc - Post-Quantum Cryptography Library

Production-ready post-quantum cryptography. Hybrid ML-KEM+X25519 by default, all 4 NIST standards (FIPS 203–206), post-quantum TLS, and FIPS 140-3 backend — one crate, zero unsafe.

IMPORTANT: LatticeArc is NOT FIPS 140-3 certified. Only the aws-lc-rs backend algorithms (ML-KEM, AES-GCM, HKDF, SHA-2) run through a FIPS 140-3 validated module. ML-DSA (fips204), SLH-DSA (fips205), and FN-DSA (fn-dsa) implement NIST-standard algorithms but use non-validated crate implementations. Use --features fips to enable the validated aws-lc-rs backend.

§Why LatticeArc?

Without LatticeArcWith LatticeArc
~50 lines for hybrid encrypt3 lines
Manage 4 key vectors manuallySingle EncryptKey::Hybrid
Research NIST parameter setsUseCase auto-selects
Manual secret zeroizationAutomatic via Zeroize

§Algorithm Validation Status

AlgorithmStandardBackendFIPS Validated
ML-KEMFIPS 203aws-lc-rsYes
AES-256-GCMSP 800-38Daws-lc-rsYes
HKDF-SHA256SP 800-56Caws-lc-rsYes
SHA-256FIPS 180-4aws-lc-rsYes
ML-DSAFIPS 204fips204No
SLH-DSAFIPS 205fips205No
FN-DSAFIPS 206fn-dsaNo

§Unified API with CryptoConfig

All cryptographic operations use CryptoConfig for configuration. This builder pattern provides automatic algorithm selection based on use case or security level, with optional Zero Trust session verification.

use latticearc::{encrypt, decrypt, CryptoConfig, EncryptKey, DecryptKey};

// Hybrid encryption: ML-KEM-768 + X25519 + HKDF + AES-256-GCM
let (pk, sk) = latticearc::generate_hybrid_keypair()?;
let encrypted = encrypt(b"secret", EncryptKey::Hybrid(&pk), CryptoConfig::new())?;
let decrypted = decrypt(&encrypted, DecryptKey::Hybrid(&sk), CryptoConfig::new())?;

§Digital Signatures

use latticearc::{generate_signing_keypair, sign_with_key, verify, CryptoConfig};

let message = b"Document to sign";

// Generate a persistent signing keypair (ML-DSA-65 + Ed25519 hybrid)
let (pk, sk, scheme) = generate_signing_keypair(CryptoConfig::new())?;

// Sign with the persistent keypair
let signed = sign_with_key(message, &sk, &pk, CryptoConfig::new())?;

// Verify (uses public key embedded in SignedData)
let is_valid = verify(&signed, CryptoConfig::new())?;

§Feature Flags

FeatureDescription
fipsFIPS 140-3 validated backend via aws-lc-rs. Requires CMake + Go build tools. Without this feature, aws-lc-rs uses its default non-FIPS backend (C compiler only).
fips-self-testPower-up KAT self-tests (ML-KEM via aws-lc-rs, AES-GCM, SHA-3). ML-DSA and SLH-DSA use non-validated crate implementations — not FIPS-boundary.
zkp-serdeSerialization support for ZKP types (enables serde_with for Schnorr/Sigma protocol structs).
formal-verificationCompilation marker: enables formal verification harness code (Kani proofs). Does not run proofs — use cargo kani separately.
kaniCompilation marker: enables Kani bounded model checking proof harnesses. Requires cargo kani to execute proofs.
sawCompilation marker: enables SAW formal verification markers (inherited from aws-lc-rs). Does not run SAW proofs at build time.

§More Examples

§Symmetric Encryption

use latticearc::{encrypt, decrypt, CryptoConfig, CryptoScheme, EncryptKey, DecryptKey};

let key = [0u8; 32];  // 256-bit key for AES-256-GCM
let encrypted = encrypt(b"secret", EncryptKey::Symmetric(&key),
    CryptoConfig::new().force_scheme(CryptoScheme::Symmetric))?;
let decrypted = decrypt(&encrypted, DecryptKey::Symmetric(&key), CryptoConfig::new())?;

§With Use Case Selection

use latticearc::{encrypt, CryptoConfig, UseCase, EncryptKey};

// Library selects optimal hybrid algorithm for the use case
let (pk, _sk) = latticearc::generate_hybrid_keypair()?;
let encrypted = encrypt(b"data", EncryptKey::Hybrid(&pk),
    CryptoConfig::new().use_case(UseCase::FileStorage))?;

§Zero Trust Session Verification

For production deployments, use VerifiedSession to enable Zero Trust verification before each operation:

use latticearc::{
    encrypt, decrypt, CryptoConfig, VerifiedSession, generate_keypair,
    EncryptKey, DecryptKey,
};

// Step 1: Generate a keypair (done once, typically at provisioning)
let (pk, sk) = generate_keypair()?;

// Step 2: Establish a verified session (performs challenge-response)
let session = VerifiedSession::establish(&pk, sk.as_ref())?;

// Step 3: Hybrid encryption with session verification
let (enc_pk, enc_sk) = latticearc::generate_hybrid_keypair()?;
let encrypted = encrypt(b"secret", EncryptKey::Hybrid(&enc_pk),
    CryptoConfig::new().session(&session))?;
let decrypted = decrypt(&encrypted, DecryptKey::Hybrid(&enc_sk),
    CryptoConfig::new().session(&session))?;

§Hybrid Encryption (ML-KEM-768 + X25519)

Use the unified API with EncryptKey::Hybrid / DecryptKey::Hybrid:

use latticearc::{encrypt, decrypt, CryptoConfig, EncryptKey, DecryptKey};

let (pk, sk) = latticearc::generate_hybrid_keypair()?;
let encrypted = encrypt(b"secret data", EncryptKey::Hybrid(&pk), CryptoConfig::new())?;
let decrypted = decrypt(&encrypted, DecryptKey::Hybrid(&sk), CryptoConfig::new())?;

§Hybrid Signatures (ML-DSA-65 + Ed25519)

use latticearc::{generate_hybrid_signing_keypair, sign_hybrid, verify_hybrid_signature, SecurityMode};

// Generate a hybrid signing keypair (ML-DSA-65 + Ed25519)
let (pk, sk) = generate_hybrid_signing_keypair(SecurityMode::Unverified)?;

// Sign (both ML-DSA and Ed25519 signatures generated)
let signature = sign_hybrid(b"document", &sk, SecurityMode::Unverified)?;

// Verify (both must pass for signature to be valid)
let valid = verify_hybrid_signature(b"document", &signature, &pk, SecurityMode::Unverified)?;

§Session Lifecycle

Sessions have a 30-minute default lifetime:

use latticearc::{encrypt, CryptoConfig, VerifiedSession, generate_keypair, CoreError, EncryptKey};

let (pk, sk) = generate_keypair()?;
let session = VerifiedSession::establish(&pk, sk.as_ref())?;

// Check session properties
assert!(session.is_valid());  // Not expired
let _ = session.session_id(); // Unique ID for audit
let _ = session.expires_at(); // Expiration time

// Validate before critical operations
session.verify_valid()?;  // Returns Err(SessionExpired) if expired

// Refresh if expired
if !session.is_valid() {
    let new_session = VerifiedSession::establish(&pk, sk.as_ref())?;
}

§Complete Example

use latticearc::{
    encrypt, decrypt, generate_signing_keypair, sign_with_key, verify,
    generate_hybrid_keypair, CryptoConfig, CoreError,
    EncryptKey, DecryptKey,
};

fn secure_workflow() -> Result<(), CoreError> {
    // --- Hybrid Encryption (unified API) ---
    let (enc_pk, enc_sk) = generate_hybrid_keypair()?;
    let encrypted = encrypt(b"confidential", EncryptKey::Hybrid(&enc_pk),
        CryptoConfig::new())?;
    let decrypted = decrypt(&encrypted, DecryptKey::Hybrid(&enc_sk),
        CryptoConfig::new())?;

    // --- Digital Signatures ---
    let (sign_pk, sign_sk, _scheme) = generate_signing_keypair(CryptoConfig::new())?;
    let signed = sign_with_key(b"important document", &sign_sk, &sign_pk, CryptoConfig::new())?;
    let is_valid = verify(&signed, CryptoConfig::new())?;
    assert!(is_valid);

    Ok(())
}

Re-exports§

pub use unified_api as core;
pub use prelude::LatticeArcError;
pub use unified_api::AlgorithmSelection;
pub use unified_api::Challenge;
pub use unified_api::ComplianceMode;
pub use unified_api::ContinuousSession;
pub use unified_api::ContinuousVerifiable;
pub use unified_api::CoreError;
pub use unified_api::CryptoConfig;
pub use unified_api::CryptoContext;
pub use unified_api::CryptoPayload;
pub use unified_api::CryptoScheme;
pub use unified_api::DataCharacteristics;
pub use unified_api::DecryptKey;
pub use unified_api::Decryptable;
pub use unified_api::EncryptKey;
pub use unified_api::Encryptable;
pub use unified_api::EncryptedData;
pub use unified_api::EncryptedMetadata;
pub use unified_api::EncryptedOutput;
pub use unified_api::EncryptionScheme;
pub use unified_api::HardwareAccelerator;
pub use unified_api::HardwareAware;
pub use unified_api::HardwareCapabilities;
pub use unified_api::HardwareInfo;
pub use unified_api::HardwareType;
pub use unified_api::HashOutput;
pub use unified_api::HybridComponents;
pub use unified_api::KeyDerivable;
pub use unified_api::KeyPair;
pub use unified_api::PatternType;
pub use unified_api::PerformancePreference;
pub use unified_api::PrivateKey;
pub use unified_api::ProofOfPossession;
pub use unified_api::ProofOfPossessionData;
pub use unified_api::PublicKey;
pub use unified_api::Result;
pub use unified_api::SchemeSelector;
pub use unified_api::SecurityLevel;
pub use unified_api::SecurityMode;
pub use unified_api::Signable;
pub use unified_api::SignedData;
pub use unified_api::SignedMetadata;
pub use unified_api::SymmetricKey;
pub use unified_api::TrustLevel;
pub use unified_api::UseCase;
pub use unified_api::VERSION;
pub use unified_api::Verifiable;
pub use unified_api::VerificationStatus;
pub use unified_api::VerifiedSession;
pub use unified_api::ZeroKnowledgeProof;
pub use unified_api::ZeroTrustAuth;
pub use unified_api::ZeroTrustAuthenticable;
pub use unified_api::ZeroTrustSession;
pub use unified_api::ZeroizedBytes;
pub use unified_api::fips_available;
pub use unified_api::init;
pub use unified_api::init_with_config;
pub use unified_api::decrypt;
pub use unified_api::encrypt;
pub use unified_api::generate_signing_keypair;
pub use unified_api::sign_with_key;
pub use unified_api::verify;
pub use unified_api::generate_hybrid_keypair;
pub use unified_api::generate_hybrid_keypair_with_level;
pub use unified_api::generate_hybrid_signing_keypair;
pub use unified_api::generate_hybrid_signing_keypair_with_config;
pub use unified_api::sign_hybrid;
pub use unified_api::sign_hybrid_with_config;
pub use unified_api::verify_hybrid_signature;
pub use unified_api::verify_hybrid_signature_with_config;
pub use unified_api::key_format::KeyAlgorithm;
pub use unified_api::key_format::KeyData;
pub use unified_api::key_format::KeyType;
pub use unified_api::key_format::PortableKey;
pub use tls::TlsConfig;
pub use tls::TlsConstraints;
pub use tls::TlsContext;
pub use tls::TlsMode;
pub use tls::TlsPolicyEngine;
pub use tls::TlsUseCase;
pub use tls::tls_accept;
pub use tls::tls_connect;

Modules§

hybrid
Hybrid cryptography combining post-quantum and classical algorithms. Hybrid Cryptography for LatticeArc
perf
Performance monitoring and benchmarking utilities. LatticeArc Performance Primitives
prelude
Common prelude with error handling, domain constants, and testing infrastructure. LatticeArc Prelude
primitives
Core cryptographic primitives (KEM, signatures, AEAD, hash, KDF, MAC).
tls
TLS 1.3 with native post-quantum key exchange (rustls 0.23.37+, no extra dependencies).
types
Pure-Rust domain types, traits, configuration, and policy engine.
unified_api
Unified cryptographic API with Zero-Trust security.
zkp
Zero-knowledge proof primitives (Schnorr, Sigma protocols, Pedersen commitments). Non-FIPS: uses non-approved EC operations. Basic Zero-Knowledge Proof Primitives