§falcon — FN-DSA (FIPS 206) Post-Quantum Digital Signatures
Native Rust implementation of FN-DSA (FFT over NTRU-Lattice-Based
Digital Signature Algorithm), the NIST FIPS 206 standard formerly known
as Falcon. Ported from the C reference by
Thomas Pornin.
§Quick start — Pure FN-DSA
use falcon::prelude::*;
let kp = FnDsaKeyPair::generate(9).unwrap();
let sig = kp.sign(b"Hello, post-quantum world!", &DomainSeparation::None).unwrap();
FnDsaSignature::verify(sig.to_bytes(), kp.public_key(),
b"Hello, post-quantum world!", &DomainSeparation::None).unwrap();
§HashFN-DSA — pre-hash large messages
use falcon::prelude::*;
let kp = FnDsaKeyPair::generate(9).unwrap();
let domain = DomainSeparation::Prehashed {
alg: PreHashAlgorithm::Sha256,
context: b"my-protocol-v1", };
let sig = kp.sign(b"large document ...", &domain).unwrap();
FnDsaSignature::verify(sig.to_bytes(), kp.public_key(),
b"large document ...", &domain).unwrap();
§Key serialization
let kp = FnDsaKeyPair::generate(9).unwrap();
let private_key = kp.private_key().to_vec(); let public_key = kp.public_key().to_vec(); let restored = FnDsaKeyPair::from_keys(&private_key, &public_key).unwrap();
let restored2 = FnDsaKeyPair::from_private_key(&private_key).unwrap();
assert_eq!(public_key, restored2.public_key());
§Security levels
logn | Variant | NIST Level | Private Key | Public Key | Signature |
| 9 | FN-DSA-512 | I | 1281 B | 897 B | 666 B |
| 10 | FN-DSA-1024 | V | 2305 B | 1793 B | 1280 B |
§Modules
| Module | Description |
prelude | Re-exports all core public types — use falcon::prelude::* |
safe_api | High-level SDK: keygen, sign, verify, serialization |
falcon | Low-level C-equivalent API (streamed signing, expanded keys) |
codec, shake, rng, … | Internal ports of the C reference |
§Features
| Feature | Default | Description |
std | ✅ | OS-level entropy via /dev/urandom |
| (no std) | — | no_std / WASM — use generate_deterministic |
serde | — | Serialize/Deserialize for all public types |