saorsa_core/quantum_crypto/
mod.rs1pub mod ant_quic_integration;
22pub mod hybrid;
23pub mod types;
24
25pub use self::types::{
28 Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature, FrostCommitment, FrostGroupPublicKey,
29 FrostKeyShare, FrostPublicKey, FrostSignature, GroupId, HandshakeParameters, ParticipantId,
30 PeerId, QuantumPeerIdentity, SecureSession, SessionId, SessionState,
31};
32
33pub use self::ant_quic_integration::{
35 create_default_pqc_config,
37 create_pqc_memory_pool,
39 create_pqc_only_config,
40 generate_hybrid_kem_keypair,
42 generate_hybrid_signature_keypair,
43 generate_ml_dsa_keypair,
45 generate_ml_kem_keypair,
47 hybrid_kem_decapsulate,
48 hybrid_kem_encapsulate,
49 hybrid_sign,
50 hybrid_verify,
51 ml_dsa_sign,
52 ml_dsa_verify,
53 ml_kem_decapsulate,
54 ml_kem_encapsulate,
55};
56
57use serde::{Deserialize, Serialize};
58use thiserror::Error;
59
60pub use saorsa_pqc::{
62 ChaCha20Poly1305Cipher,
64 EncryptedMessage,
66 HybridKem,
68 HybridPublicKeyEncryption,
69
70 HybridSignature,
71 MlDsa65,
72
73 MlDsaOperations,
74
75 MlKem768,
77 MlKemOperations,
79 SymmetricEncryptedMessage,
80
81 SymmetricError,
83
84 SymmetricKey,
85
86 init as saorsa_pqc_init,
88 pqc::types::{
90 HybridKemCiphertext, HybridKemPublicKey, HybridKemSecretKey, HybridSignaturePublicKey,
91 HybridSignatureSecretKey, HybridSignatureValue, MlDsaPublicKey, MlDsaSecretKey,
92 MlDsaSignature, MlKemCiphertext, MlKemPublicKey, MlKemSecretKey, PqcError,
93 PqcResult as SaorsaPqcResult, SharedSecret,
94 },
95};
96
97#[derive(Debug, Error)]
99pub enum QuantumCryptoError {
100 #[error("ML-KEM error: {0}")]
101 MlKemError(String),
102
103 #[error("ML-DSA error: {0}")]
104 MlDsaError(String),
105
106 #[error("Key generation failed: {0}")]
107 KeyGenerationError(String),
108
109 #[error("Invalid key material: {0}")]
110 InvalidKeyError(String),
111
112 #[error("Signature verification failed")]
113 SignatureVerificationFailed,
114
115 #[error("Encapsulation failed: {0}")]
116 EncapsulationError(String),
117
118 #[error("Decapsulation failed: {0}")]
119 DecapsulationError(String),
120
121 #[error("Unsupported algorithm: {0}")]
122 UnsupportedAlgorithm(String),
123}
124
125pub type Result<T> = std::result::Result<T, QuantumCryptoError>;
127
128#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
130pub struct CryptoCapabilities {
131 pub supports_ml_kem: bool,
132 pub supports_ml_dsa: bool,
133 pub supports_frost: bool,
134 pub supports_hybrid: bool,
135 pub threshold_capable: bool,
136 pub supported_versions: Vec<ProtocolVersion>,
137}
138
139impl Default for CryptoCapabilities {
140 fn default() -> Self {
141 Self {
142 supports_ml_kem: true,
143 supports_ml_dsa: true,
144 supports_frost: true,
145 supports_hybrid: true,
146 threshold_capable: true,
147 supported_versions: vec![ProtocolVersion::V1, ProtocolVersion::V2],
148 }
149 }
150}
151
152#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
154pub enum ProtocolVersion {
155 V1,
157 V2,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
163pub enum SignatureScheme {
164 Classical(Vec<u8>),
166
167 PostQuantum(Vec<u8>),
169
170 Dual {
172 classical: Vec<u8>,
173 post_quantum: Vec<u8>,
174 },
175}
176
177impl SignatureScheme {
183 }
185
186#[allow(dead_code)]
198fn generate_ed25519_keypair() -> Result<(Vec<u8>, Vec<u8>)> {
199 use ed25519_dalek::SigningKey;
200 use rand::rngs::OsRng;
201
202 let signing_key = SigningKey::generate(&mut OsRng);
203 let public_key = signing_key.verifying_key().to_bytes().to_vec();
204
205 let mut private_key = vec![0u8; 64];
207 private_key[..32].copy_from_slice(&signing_key.to_bytes());
208 private_key[32..].copy_from_slice(&public_key);
209
210 Ok((public_key, private_key))
211}
212
213pub fn negotiate_algorithms(
215 local_caps: &CryptoCapabilities,
216 remote_caps: &CryptoCapabilities,
217) -> Result<NegotiatedAlgorithms> {
218 let use_ml_kem = local_caps.supports_ml_kem && remote_caps.supports_ml_kem;
220 let use_ml_dsa = local_caps.supports_ml_dsa && remote_caps.supports_ml_dsa;
221 let use_hybrid = local_caps.supports_hybrid && remote_caps.supports_hybrid;
222
223 let version = local_caps
225 .supported_versions
226 .iter()
227 .find(|v| remote_caps.supported_versions.contains(v))
228 .copied()
229 .ok_or_else(|| {
230 QuantumCryptoError::UnsupportedAlgorithm("No common protocol version".to_string())
231 })?;
232
233 Ok(NegotiatedAlgorithms {
234 kem_algorithm: if use_ml_kem {
235 KemAlgorithm::MlKem768
236 } else {
237 KemAlgorithm::ClassicalEcdh
238 },
239 signature_algorithm: if use_ml_dsa {
240 SignatureAlgorithm::MlDsa65
241 } else {
242 SignatureAlgorithm::Ed25519
243 },
244 hybrid_mode: use_hybrid,
245 protocol_version: version,
246 })
247}
248
249#[derive(Debug, Clone, Serialize, Deserialize)]
251pub struct NegotiatedAlgorithms {
252 pub kem_algorithm: KemAlgorithm,
253 pub signature_algorithm: SignatureAlgorithm,
254 pub hybrid_mode: bool,
255 pub protocol_version: ProtocolVersion,
256}
257
258#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
260pub enum KemAlgorithm {
261 MlKem768,
262 ClassicalEcdh,
263}
264
265#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
267pub enum SignatureAlgorithm {
268 MlDsa65,
269 Ed25519,
270}
271
272#[cfg(test)]
273mod tests {
274 use super::*;
275
276 #[test]
277 fn test_saorsa_pqc_availability() {
278 let _ml_kem = MlKem768::default();
280 let _ml_dsa = MlDsa65::default();
281 let _hybrid_kem = HybridKem::default();
282 let _hybrid_sig = HybridSignature::default();
283 let _hybrid_pke = HybridPublicKeyEncryption::default();
284
285 println!("✅ saorsa-pqc 0.3.0 types are available");
286 println!("✅ Confirmed we are using saorsa-pqc effectively");
287 println!("✅ ChaCha20Poly1305 integration ready for use");
288 }
289
290 #[test]
291 fn test_algorithm_negotiation() {
292 let local_caps = CryptoCapabilities::default();
293 let remote_caps = CryptoCapabilities {
294 supports_ml_kem: true,
295 supports_ml_dsa: false,
296 supports_frost: false,
297 supports_hybrid: true,
298 threshold_capable: false,
299 supported_versions: vec![ProtocolVersion::V1],
300 };
301
302 let negotiated = negotiate_algorithms(&local_caps, &remote_caps).unwrap();
303 assert_eq!(negotiated.kem_algorithm, KemAlgorithm::MlKem768);
304 assert_eq!(negotiated.signature_algorithm, SignatureAlgorithm::Ed25519);
305 assert!(negotiated.hybrid_mode);
306 }
307}