saorsa_core/quantum_crypto/
mod.rs1pub mod ant_quic_integration;
22pub mod types;
23
24pub use self::types::{
27 FrostCommitment, FrostGroupPublicKey, FrostKeyShare, FrostPublicKey, FrostSignature, GroupId,
28 HandshakeParameters, ParticipantId, PeerId, QuantumPeerIdentity, SecureSession, SessionId,
29 SessionState,
30};
31
32pub use self::ant_quic_integration::{
34 create_default_pqc_config,
36 create_pqc_memory_pool,
38 create_pqc_only_config,
39 generate_hybrid_kem_keypair,
41 generate_hybrid_signature_keypair,
42 generate_ml_dsa_keypair,
44 generate_ml_kem_keypair,
46 hybrid_kem_decapsulate,
47 hybrid_kem_encapsulate,
48 hybrid_sign,
49 hybrid_verify,
50 ml_dsa_sign,
51 ml_dsa_verify,
52 ml_kem_decapsulate,
53 ml_kem_encapsulate,
54};
55
56use serde::{Deserialize, Serialize};
57use thiserror::Error;
58
59pub use saorsa_pqc::{
61 ChaCha20Poly1305Cipher,
63 EncryptedMessage,
65 HybridKem,
67 HybridPublicKeyEncryption,
68 MlDsa65,
69
70 MlDsaOperations,
71
72 MlKem768,
74 MlKemOperations,
76 SymmetricEncryptedMessage,
77
78 SymmetricError,
80
81 SymmetricKey,
82
83 init as saorsa_pqc_init,
85 pqc::types::{
87 HybridKemCiphertext, HybridKemPublicKey, HybridKemSecretKey, HybridSignaturePublicKey,
88 HybridSignatureSecretKey, HybridSignatureValue, MlDsaPublicKey, MlDsaSecretKey,
89 MlDsaSignature, MlKemCiphertext, MlKemPublicKey, MlKemSecretKey, PqcError,
90 PqcResult as SaorsaPqcResult, SharedSecret,
91 },
92};
93
94#[derive(Debug, Error)]
96pub enum QuantumCryptoError {
97 #[error("ML-KEM error: {0}")]
98 MlKemError(String),
99
100 #[error("ML-DSA error: {0}")]
101 MlDsaError(String),
102
103 #[error("Key generation failed: {0}")]
104 KeyGenerationError(String),
105
106 #[error("Invalid key material: {0}")]
107 InvalidKeyError(String),
108
109 #[error("Signature verification failed")]
110 SignatureVerificationFailed,
111
112 #[error("Encapsulation failed: {0}")]
113 EncapsulationError(String),
114
115 #[error("Decapsulation failed: {0}")]
116 DecapsulationError(String),
117
118 #[error("Unsupported algorithm: {0}")]
119 UnsupportedAlgorithm(String),
120}
121
122pub type Result<T> = std::result::Result<T, QuantumCryptoError>;
124
125#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
127pub struct CryptoCapabilities {
128 pub supports_ml_kem: bool,
129 pub supports_ml_dsa: bool,
130 pub supports_frost: bool,
131 pub supports_hybrid: bool,
132 pub threshold_capable: bool,
133 pub supported_versions: Vec<ProtocolVersion>,
134}
135
136impl Default for CryptoCapabilities {
137 fn default() -> Self {
138 Self {
139 supports_ml_kem: true,
140 supports_ml_dsa: true,
141 supports_frost: true,
142 supports_hybrid: true,
143 threshold_capable: true,
144 supported_versions: vec![ProtocolVersion::V1, ProtocolVersion::V2],
145 }
146 }
147}
148
149#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
151pub enum ProtocolVersion {
152 V1,
154 V2,
156}
157
158pub fn negotiate_algorithms(
162 local_caps: &CryptoCapabilities,
163 remote_caps: &CryptoCapabilities,
164) -> Result<NegotiatedAlgorithms> {
165 let use_ml_kem = local_caps.supports_ml_kem && remote_caps.supports_ml_kem;
167 let use_ml_dsa = local_caps.supports_ml_dsa && remote_caps.supports_ml_dsa;
168 let use_hybrid = local_caps.supports_hybrid && remote_caps.supports_hybrid;
169
170 let version = local_caps
172 .supported_versions
173 .iter()
174 .find(|v| remote_caps.supported_versions.contains(v))
175 .copied()
176 .ok_or_else(|| {
177 QuantumCryptoError::UnsupportedAlgorithm("No common protocol version".to_string())
178 })?;
179
180 let kem_algorithm = if use_ml_kem {
182 KemAlgorithm::MlKem768
183 } else {
184 return Err(QuantumCryptoError::UnsupportedAlgorithm(
185 "No common KEM algorithm".to_string(),
186 ));
187 };
188
189 let signature_algorithm = if use_ml_dsa {
190 SignatureAlgorithm::MlDsa65
191 } else {
192 return Err(QuantumCryptoError::UnsupportedAlgorithm(
193 "No common signature algorithm".to_string(),
194 ));
195 };
196
197 Ok(NegotiatedAlgorithms {
198 kem_algorithm,
199 signature_algorithm,
200 hybrid_mode: use_hybrid,
201 protocol_version: version,
202 })
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize)]
207pub struct NegotiatedAlgorithms {
208 pub kem_algorithm: KemAlgorithm,
209 pub signature_algorithm: SignatureAlgorithm,
210 pub hybrid_mode: bool,
211 pub protocol_version: ProtocolVersion,
212}
213
214#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
216pub enum KemAlgorithm {
217 MlKem768,
218}
219
220#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
222pub enum SignatureAlgorithm {
223 MlDsa65,
224}
225
226#[cfg(test)]
227mod tests {
228 use super::*;
229
230 #[test]
231 fn test_saorsa_pqc_availability() {
232 let _ml_kem = MlKem768;
234 let _ml_dsa = MlDsa65;
235 let _hybrid_kem = HybridKem::default();
236 let _hybrid_pke = HybridPublicKeyEncryption::default();
238
239 println!("✅ saorsa-pqc 0.3.0 types are available");
240 println!("✅ Confirmed we are using saorsa-pqc effectively");
241 println!("✅ ChaCha20Poly1305 integration ready for use");
242 }
243
244 #[test]
245 fn test_algorithm_negotiation() {
246 let local_caps = CryptoCapabilities::default();
247 let remote_caps = CryptoCapabilities {
248 supports_ml_kem: true,
249 supports_ml_dsa: true,
250 supports_frost: false,
251 supports_hybrid: true,
252 threshold_capable: false,
253 supported_versions: vec![ProtocolVersion::V1],
254 };
255
256 let negotiated = negotiate_algorithms(&local_caps, &remote_caps).unwrap();
257 assert_eq!(negotiated.kem_algorithm, KemAlgorithm::MlKem768);
258 assert_eq!(negotiated.signature_algorithm, SignatureAlgorithm::MlDsa65);
259 }
260}