Skip to main content

arcanum_pqc/
lib.rs

1//! # Arcanum Post-Quantum Cryptography
2//!
3//! Post-quantum cryptographic algorithms resistant to attacks by quantum computers.
4//!
5//! ## NIST Standards
6//!
7//! These algorithms are standardized by NIST for post-quantum cryptography:
8//!
9//! ### Key Encapsulation Mechanisms (KEMs)
10//!
11//! - **ML-KEM** (Module-Lattice KEM, formerly CRYSTALS-Kyber): FIPS 203
12//!   - ML-KEM-512: 128-bit security
13//!   - ML-KEM-768: 192-bit security (recommended)
14//!   - ML-KEM-1024: 256-bit security
15//!
16//! ### Digital Signatures
17//!
18//! - **ML-DSA** (Module-Lattice Digital Signature, formerly CRYSTALS-Dilithium): FIPS 204
19//!   - ML-DSA-44: 128-bit security
20//!   - ML-DSA-65: 192-bit security (recommended)
21//!   - ML-DSA-87: 256-bit security
22//!
23//! - **SLH-DSA** (Stateless Hash-based Digital Signature, formerly SPHINCS+): FIPS 205
24//!   - Hash-based, very conservative security assumptions
25//!
26//! ## Hybrid Schemes
27//!
28//! Hybrid schemes combine classical and post-quantum algorithms for defense-in-depth:
29//!
30//! - **X25519-ML-KEM-768**: Classical ECDH + ML-KEM
31//!
32//! ## Example
33//!
34//! ```ignore
35//! use arcanum_pqc::prelude::*;
36//!
37//! // ML-KEM key encapsulation
38//! let (dk, ek) = MlKem768::generate_keypair();
39//! let (ciphertext, shared_secret) = MlKem768::encapsulate(&ek);
40//! let decapsulated = MlKem768::decapsulate(&dk, &ciphertext)?;
41//! assert_eq!(shared_secret, decapsulated);
42//!
43//! // ML-DSA signatures
44//! let (sk, vk) = MlDsa65::generate_keypair();
45//! let signature = MlDsa65::sign(&sk, b"message");
46//! assert!(MlDsa65::verify(&vk, b"message", &signature).is_ok());
47//! ```
48
49#![deny(unsafe_code)]
50#![warn(rust_2018_idioms)]
51#![allow(missing_docs, clippy::too_many_arguments, dead_code, unused_imports)]
52#![allow(clippy::duplicated_attributes, clippy::int_plus_one)]
53#![allow(clippy::needless_range_loop, clippy::assertions_on_constants)]
54#![allow(clippy::unnecessary_cast, clippy::let_and_return)]
55#![allow(clippy::expect_fun_call, clippy::manual_range_contains)]
56#![allow(clippy::assign_op_pattern, clippy::clone_on_copy)]
57#![allow(clippy::doc_overindented_list_items, clippy::manual_div_ceil)]
58#![allow(clippy::needless_borrows_for_generic_args)]
59#![allow(
60    unused_variables,
61    unused_unsafe,
62    deprecated,
63    unused_assignments,
64    unused_mut
65)]
66#![cfg_attr(not(feature = "std"), no_std)]
67
68#[cfg(not(feature = "std"))]
69extern crate alloc;
70
71#[cfg(feature = "ml-kem")]
72pub mod kem;
73
74#[cfg(feature = "ml-dsa")]
75pub mod dsa;
76
77#[cfg(feature = "ml-dsa-native")]
78pub mod ml_dsa;
79
80/// Arcanum-DSA: SIMD-optimized digital signatures (experimental)
81///
82/// Variant of ML-DSA with parameters optimized for modern SIMD architectures.
83/// Maintains equivalent or stronger security while enabling efficient batching.
84#[cfg(feature = "ml-dsa-native")]
85pub mod arcanum_dsa;
86
87#[cfg(feature = "slh-dsa")]
88pub mod slh_dsa;
89
90#[cfg(feature = "hybrid")]
91pub mod hybrid;
92
93mod traits;
94
95pub use traits::{KeyEncapsulation, PostQuantumSignature};
96
97#[cfg(feature = "ml-kem")]
98pub use kem::{MlKem512, MlKem768, MlKem1024};
99
100#[cfg(feature = "ml-dsa")]
101pub use dsa::{MlDsa44Ops, MlDsa65, MlDsa87Ops};
102
103#[cfg(feature = "hybrid")]
104pub use hybrid::X25519MlKem768;
105
106/// Prelude for convenient imports.
107pub mod prelude {
108    pub use crate::traits::{KeyEncapsulation, PostQuantumSignature};
109
110    #[cfg(feature = "ml-kem")]
111    pub use crate::kem::{MlKem512, MlKem768, MlKem1024};
112
113    #[cfg(feature = "ml-dsa")]
114    pub use crate::dsa::{MlDsa44Ops, MlDsa65, MlDsa87Ops};
115
116    #[cfg(feature = "hybrid")]
117    pub use crate::hybrid::X25519MlKem768;
118}