zooqueen afe5434dc4 give the crate a workspace root, and the pqc callers the api that exists
cargo could not read the manifest at all:

  error inheriting `aes-gcm` from workspace root manifest's
  workspace.dependencies.aes-gcm: failed to find a workspace root

All 25 dependencies are declared `workspace = true`, which resolves only
against a [workspace.dependencies] table, and the crate was extracted from a
monorepo without one. The versions here are the ones Cargo.lock had already
resolved, so this records what the crate was building against and chooses
nothing new — `cargo build --locked` leaves Cargo.lock untouched.

That got the manifest parsed and the library building, which exposed three
callers written against an ml-kem/ml-dsa that predates the pinned versions:

  Encapsulate and Decapsulate are private at ml_kem's root and public at
    ml_kem::kem, and MlKem768::generate needs KemCore in scope.

  ml-dsa has no Ml_Dsa65, no VerificationKey and no SigningKey::generate.
    Key generation is the KeyGen trait (MlDsa65::key_gen), the pair hands out
    signing_key()/verifying_key(), and signing goes through signature::Signer
    and Verifier.

  ml-dsa is on rand_core 0.9 while ml-kem is on 0.6, so one thread_rng cannot
    serve both. The ml-dsa side takes OsRng from ml-dsa's own re-export, via
    unwrap_err, because OsRng is fallible in 0.9 and key_gen wants an
    infallible CryptoRng. No new dependency.

  integration_test's message list mixed [u8; 9], [u8; 27], [u8; 0] and
    [u8; 1000] in one untyped array, which has no single element type. Typed
    as [&[u8]; 4].

Both examples RUN, not merely compile: ML-KEM encapsulation round-trips,
ML-DSA signatures verify, HQC round-trips. 12 tests pass.

Worth knowing separately: src/ml_kem.rs, src/ml_dsa.rs, src/hqc.rs, src/pqc/
and src/hybrid/ are in no build target — lib.rs declares only symmetric, hash,
error and prelude. Those wrappers are dead files and would not compile as they
stand (src/ml_dsa.rs imports the same Ml_Dsa65 and VerificationKey that do not
exist). Post-quantum is reachable today only as the re-exported upstream
crates, without this crate's SecurityLevel/zeroizing layer over it.
2026-08-10 21:15:45 -07:00

Hanzo Crypto

Modern post-quantum cryptography library with NIST-standardized algorithms, optimized for ARM compatibility including Apple Silicon (M1/M2/M3).

Features

Post-Quantum Cryptography

  • ML-KEM (FIPS 203): Module Lattice Key Encapsulation (formerly Kyber)
    • Pure Rust implementation - no AVX2 assembly issues!
    • ML-KEM-512, ML-KEM-768, ML-KEM-1024
  • ML-DSA (FIPS 204): Module Lattice Digital Signatures (formerly Dilithium)
    • Pure Rust implementation
    • ML-DSA-44, ML-DSA-65, ML-DSA-87
  • HQC: Hamming Quasi-Cyclic code-based cryptography
    • HQC-128, HQC-192, HQC-256

Symmetric Cryptography

  • BLAKE3: Fast cryptographic hashing
  • ChaCha20-Poly1305: Authenticated encryption
  • AES-256-GCM: Authenticated encryption with associated data
  • Argon2: Password hashing

Additional Algorithms

  • X25519: Elliptic curve key exchange (transitional)
  • Ed25519: Elliptic curve signatures (transitional)
  • SHA-3: SHA3-256, SHA3-384, SHA3-512

Installation

[dependencies]
hanzo-crypto = "0.1.0"

Quick Start

use hanzo_crypto::prelude::*;
use hanzo_crypto::{ml_kem, ml_dsa, blake3};

fn main() -> Result<()> {
    // Post-quantum key encapsulation
    use ml_kem::{MlKem768, Encapsulate, Decapsulate};
    let mut rng = rand::thread_rng();
    let (dk, ek) = MlKem768::generate(&mut rng);
    let (ct, ss_sender) = ek.encapsulate(&mut rng)?;
    let ss_receiver = dk.decapsulate(&ct)?;
    assert_eq!(ss_sender, ss_receiver);

    // Post-quantum signatures
    use ml_dsa::{Ml_Dsa65, SigningKey};
    let signing_key = SigningKey::generate(&mut rng)?;
    let message = b"Hello, quantum world!";
    let signature = signing_key.try_sign_with_rng(&mut rng, message)?;
    signing_key.verification_key().verify(message, &signature)?;

    // BLAKE3 hashing
    let hash = blake3::hash(b"Fast hashing with BLAKE3");
    println!("Hash: {}", hash.to_hex());

    Ok(())
}

ARM Compatibility

This library uses pure Rust implementations of ML-KEM and ML-DSA, ensuring full compatibility with ARM processors including Apple Silicon. No AVX2 assembly issues!

Testing

# Run all tests
cargo test

# Run examples
cargo run --example basic

# Run benchmarks
cargo bench

Security Levels

  • Level 1: 128-bit classical security
  • Level 3: 192-bit classical security (recommended)
  • Level 5: 256-bit classical security

License

MIT OR Apache-2.0

S
Description
hanzo-crypto — post-quantum cryptography (ML-KEM, ML-DSA, HQC)
Readme
164 KiB
Languages
Rust 100%