| Crates.io | oqs-safe |
| lib.rs | oqs-safe |
| version | 0.2.5 |
| created_at | 2025-10-08 13:13:52.677188+00 |
| updated_at | 2025-11-13 14:47:14.671358+00 |
| description | Stable, minimal, safe Rust wrapper over libOQS for PQ KEM/SIG (ML-KEM/Dilithium) with explicit mock-only dev mode. |
| homepage | |
| repository | https://github.com/0rlych1kk4/oqs-safe |
| max_upload_size | |
| id | 1873980 |
| size | 52,027 |
oqs-safe is a stable, minimal safe Rust wrapper over [libOQS] for NIST Post-Quantum Cryptography (PQC):
Zeroizes secrets • Safe newtypes • Compile-time guardrails • Resilient to liboqs naming drift (“ML-KEM-768” ↔ “Kyber768”, “ML-DSA-44” ↔ “Dilithium2”)
oqs-safe = { version = "0.2", features = ["kyber768", "dilithium2"] }
Production (real liboqs backend):
oqs-safe = { version = "0.2", default-features = false, features = ["liboqs", "kyber768", "dilithium2"] }
git clone https://github.com/open-quantum-safe/liboqs cd liboqs && mkdir build && cd build cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DOQS_DIST_BUILD=ON -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX="$HOME/.local/liboqs" .. ninja && ninja install
Make oqs-safe find and load liboqs: export LIBOQS_DIR="$HOME/.local/liboqs"
macOS: ensure runtime linking finds liboqs.dylib: export DYLD_FALLBACK_LIBRARY_PATH="$HOME/.local/liboqs/lib:${DYLD_FALLBACK_LIBRARY_PATH}"
Optional: pkg-config: export PKG_CONFIG_PATH="$HOME/.local/liboqs/lib/pkgconfig:${PKG_CONFIG_PATH}"
use oqs_safe::kem::{Kem, Kyber768};
let (pk, sk) = Kyber768::keypair()?; let (ct, ss1) = Kyber768::encapsulate(&pk)?; let ss2 = Kyber768::decapsulate(&ct, &sk)?; assert_eq!(ss1.len(), ss2.len());
use oqs_safe::sig::{Dilithium2, SignatureScheme};
let (pk, sk) = Dilithium2::keypair()?; let msg = b"hello pqc"; let sig = Dilithium2::sign(&sk, msg)?; Dilithium2::verify(&pk, msg, &sig)?;
use oqs_safe::kem::{Kem, Kyber768}; use hkdf::Hkdf; use sha2::Sha256;
let (_, sk) = Kyber768::keypair()?;
let (ct, ss1) = Kyber768::encapsulate(&Kyber768::keypair()?.0)?;
let ss = Kyber768::decapsulate(&ct, &sk)?;
let hk = Hkdf::
Mock backend (fast, no native deps): cargo run --example kem_roundtrip --features "kyber768" cargo run --example dsa_sign_verify --features "dilithium2"
Real backend: cargo run --example kem_roundtrip --features "liboqs,kyber768" cargo run --example dsa_sign_verify --features "liboqs,dilithium2"
Tests:
Mock + negative-path tests: cargo test --features "mock,kyber768,dilithium2,testing"
Real liboqs: cargo test --features "liboqs,kyber768,dilithium2"
Linking Tips:
macOS:
To ensure binaries find liboqs.dylib, embed an rpath:
.cargo/config.toml: [target.aarch64-apple-darwin] rustflags = ["-C", "link-arg=-Wl,-rpath,@executable_path/../lib"]
Linux:
Use PKG_CONFIG_PATH or LD_LIBRARY_PATH=$HOME/.local/liboqs/lib.: