Skip to main content

Crate pqfile

Crate pqfile 

Source
Expand description

Quantum-resistant file encryption library.

pqfile provides authenticated, post-quantum file encryption using NIST-standardised algorithms. All format versions are stable on disk and documented in docs/FORMAT.md.

§Algorithms

  • Key encapsulation: ML-KEM-512, ML-KEM-768 (default), ML-KEM-1024 (NIST FIPS 203)
  • Hybrid mode: X25519 + ML-KEM-768 via HKDF-SHA256
  • Symmetric cipher: ChaCha20-Poly1305 (RFC 8439)
  • Session key wrapping: AES-256-GCM (multi-recipient modes)
  • Signatures: ML-DSA-65 (NIST FIPS 204)
  • Passphrase protection: Argon2id (m=64 MiB, t=3, p=1) + AES-256-GCM

§Quick start

use pqfile::{keygen, encrypt, decrypt};

// Generate a key pair
let (pub_pem, priv_pem) = keygen::keygen_bytes(768, None).unwrap();

// Encrypt
let plaintext = b"hello, post-quantum world";
let ciphertext = encrypt::encrypt_bytes(&pub_pem, plaintext).unwrap();

// Decrypt
let recovered = decrypt::decrypt_bytes(&priv_pem, &ciphertext, None).unwrap();
assert_eq!(recovered, plaintext);

§Streaming

For large files, use the streaming API to avoid loading the entire file into memory:

use pqfile::{keygen, encrypt, decrypt};
use std::io::Cursor;

let (pub_pem, priv_pem) = keygen::keygen_bytes(768, None).unwrap();
let plaintext = b"streaming data";

let mut ct = Vec::new();
encrypt::encrypt_stream(&pub_pem, plaintext.len() as u64, pqfile::format::CHUNK_SIZE,
    &mut Cursor::new(plaintext), &mut ct).unwrap();

let mut out = Vec::new();
decrypt::decrypt_stream(&priv_pem, &mut ct.as_slice(), &mut out, None).unwrap();
assert_eq!(out, plaintext);

§Stability

The public API is not yet stabilised for 1.0. Breaking changes between minor versions are possible until a stable 1.0 release is announced. See the roadmap.

Modules§

archive
Encrypted multi-file archive support (PQFA format).
decrypt
Decryption: all format versions v2 through v7, all KEM variants.
encrypt
Encryption: single-recipient, multi-recipient, compressed, and parallel modes.
error
Error types.
format
On-disk format constants and header structs.
keygen
Key generation: ML-KEM (512/768/1024), hybrid X25519+ML-KEM-768.
passphrase
Passphrase-based key protection (Argon2id + AES-256-GCM).
reader
Streaming decryptor: PqfReader<R> implements std::io::Read.
rekey
Rekey: transfer a v3/v5 file to a new recipient without re-encrypting.
revoke
Key revocation: create and check .revoked sidecar files.
shamir
Shamir secret sharing: split and reconstruct private keys (M-of-N).
sign
ML-DSA-65 signing key generation, signing, and verification.
signcrypt
Signcrypt: sign-then-encrypt and decrypt-then-verify in a single step.