1use anyhow::{anyhow, Result};
32use chrono::{DateTime, Duration as ChronoDuration, Utc};
33use serde::{Deserialize, Serialize};
34use std::collections::HashMap;
35use std::sync::Arc;
36use tokio::sync::RwLock;
37use tracing::{debug, info};
38
39use ed25519_dalek::SigningKey;
41use hmac::{Hmac, Mac};
42use sha2::Sha256;
43
44type HmacSha256 = Hmac<Sha256>;
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct E2EEConfig {
49 pub key_exchange: KeyExchangeAlgorithm,
51
52 pub encryption_algorithm: E2EEEncryptionAlgorithm,
54
55 pub perfect_forward_secrecy: bool,
57
58 pub homomorphic_encryption: bool,
60
61 pub zero_knowledge_proofs: bool,
63
64 pub key_rotation: KeyRotationConfig,
66
67 pub post_quantum: bool,
69
70 pub multi_party: MultiPartyConfig,
72}
73
74impl Default for E2EEConfig {
75 fn default() -> Self {
76 Self {
77 key_exchange: KeyExchangeAlgorithm::X25519,
78 encryption_algorithm: E2EEEncryptionAlgorithm::AES256GCM,
79 perfect_forward_secrecy: true,
80 homomorphic_encryption: false,
81 zero_knowledge_proofs: false,
82 key_rotation: KeyRotationConfig::default(),
83 post_quantum: false,
84 multi_party: MultiPartyConfig::default(),
85 }
86 }
87}
88
89#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
91pub enum KeyExchangeAlgorithm {
92 ECDH,
94
95 X25519,
97
98 Kyber512,
100 Kyber768,
101 Kyber1024,
102
103 HybridX25519Kyber768,
105}
106
107#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
109pub enum E2EEEncryptionAlgorithm {
110 AES256GCM,
112
113 ChaCha20Poly1305,
115
116 KyberEncrypt,
118
119 Paillier,
121
122 BFV,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
128pub struct KeyRotationConfig {
129 pub enabled: bool,
131
132 pub rotation_interval: ChronoDuration,
134
135 pub max_key_age: ChronoDuration,
137
138 pub keep_old_keys: bool,
140
141 pub old_key_retention_count: usize,
143}
144
145impl Default for KeyRotationConfig {
146 fn default() -> Self {
147 Self {
148 enabled: true,
149 rotation_interval: ChronoDuration::days(30),
150 max_key_age: ChronoDuration::days(90),
151 keep_old_keys: true,
152 old_key_retention_count: 3,
153 }
154 }
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
159pub struct MultiPartyConfig {
160 pub enabled: bool,
162
163 pub max_parties: usize,
165
166 pub threshold_signatures: bool,
168
169 pub threshold_m: usize,
171 pub threshold_n: usize,
172}
173
174impl Default for MultiPartyConfig {
175 fn default() -> Self {
176 Self {
177 enabled: false,
178 max_parties: 10,
179 threshold_signatures: false,
180 threshold_m: 2,
181 threshold_n: 3,
182 }
183 }
184}
185
186#[derive(Debug, Clone, Serialize, Deserialize)]
188pub struct EncryptedMessage {
189 pub id: String,
191
192 pub sender: String,
194
195 pub recipients: Vec<String>,
197
198 pub algorithm: E2EEEncryptionAlgorithm,
200
201 pub key_exchange: KeyExchangeAlgorithm,
203
204 pub encrypted_keys: HashMap<String, Vec<u8>>,
206
207 pub iv: Vec<u8>,
209
210 pub ciphertext: Vec<u8>,
212
213 pub auth_tag: Option<Vec<u8>>,
215
216 pub signature: Option<Vec<u8>>,
218
219 pub timestamp: DateTime<Utc>,
221
222 pub ephemeral_public_key: Option<Vec<u8>>,
224
225 pub metadata: HashMap<String, String>,
227}
228
229#[derive(Debug, Clone)]
231pub struct KeyPair {
232 pub public_key: Vec<u8>,
234
235 pub private_key: Vec<u8>,
237
238 pub key_id: String,
240
241 pub created_at: DateTime<Utc>,
243
244 pub expires_at: Option<DateTime<Utc>>,
246
247 pub algorithm: KeyExchangeAlgorithm,
249}
250
251impl KeyPair {
252 pub fn is_expired(&self) -> bool {
254 if let Some(expires_at) = self.expires_at {
255 Utc::now() > expires_at
256 } else {
257 false
258 }
259 }
260
261 pub fn should_rotate(&self, rotation_interval: ChronoDuration) -> bool {
263 Utc::now() - self.created_at > rotation_interval || self.is_expired()
264 }
265}
266
267pub struct E2EEManager {
269 config: E2EEConfig,
270 key_pairs: Arc<RwLock<HashMap<String, KeyPair>>>,
271 ephemeral_keys: Arc<RwLock<HashMap<String, KeyPair>>>,
272 public_keys: Arc<RwLock<HashMap<String, Vec<u8>>>>,
273 stats: Arc<RwLock<E2EEStats>>,
274}
275
276impl E2EEManager {
277 pub fn new(config: E2EEConfig) -> Result<Self> {
279 Ok(Self {
280 config,
281 key_pairs: Arc::new(RwLock::new(HashMap::new())),
282 ephemeral_keys: Arc::new(RwLock::new(HashMap::new())),
283 public_keys: Arc::new(RwLock::new(HashMap::new())),
284 stats: Arc::new(RwLock::new(E2EEStats::default())),
285 })
286 }
287
288 pub async fn generate_key_pair(&self, user_id: &str) -> Result<KeyPair> {
290 let key_pair = match self.config.key_exchange {
291 KeyExchangeAlgorithm::X25519 | KeyExchangeAlgorithm::ECDH => {
292 let seed_bytes = Self::generate_random_bytes(32);
295 let mut seed = [0u8; 32];
296 seed.copy_from_slice(&seed_bytes);
297 let signing_key = SigningKey::from_bytes(&seed);
298 let verifying_key = signing_key.verifying_key();
299
300 KeyPair {
301 public_key: verifying_key.to_bytes().to_vec(),
302 private_key: signing_key.to_bytes().to_vec(),
303 key_id: uuid::Uuid::new_v4().to_string(),
304 created_at: Utc::now(),
305 expires_at: Some(Utc::now() + self.config.key_rotation.max_key_age),
306 algorithm: self.config.key_exchange,
307 }
308 }
309 KeyExchangeAlgorithm::Kyber512
310 | KeyExchangeAlgorithm::Kyber768
311 | KeyExchangeAlgorithm::Kyber1024 => {
312 let key_size = match self.config.key_exchange {
314 KeyExchangeAlgorithm::Kyber512 => 64,
315 KeyExchangeAlgorithm::Kyber768 => 96,
316 KeyExchangeAlgorithm::Kyber1024 => 128,
317 _ => 96,
318 };
319
320 KeyPair {
321 public_key: Self::generate_random_bytes(key_size),
322 private_key: Self::generate_random_bytes(key_size),
323 key_id: uuid::Uuid::new_v4().to_string(),
324 created_at: Utc::now(),
325 expires_at: Some(Utc::now() + self.config.key_rotation.max_key_age),
326 algorithm: self.config.key_exchange,
327 }
328 }
329 KeyExchangeAlgorithm::HybridX25519Kyber768 => {
330 KeyPair {
332 public_key: Self::generate_random_bytes(128),
333 private_key: Self::generate_random_bytes(128),
334 key_id: uuid::Uuid::new_v4().to_string(),
335 created_at: Utc::now(),
336 expires_at: Some(Utc::now() + self.config.key_rotation.max_key_age),
337 algorithm: self.config.key_exchange,
338 }
339 }
340 };
341
342 let mut key_pairs = self.key_pairs.write().await;
343 key_pairs.insert(user_id.to_string(), key_pair.clone());
344
345 let mut public_keys = self.public_keys.write().await;
346 public_keys.insert(user_id.to_string(), key_pair.public_key.clone());
347
348 info!("Generated key pair for user: {}", user_id);
349 Ok(key_pair)
350 }
351
352 pub async fn encrypt(&self, recipient: &str, plaintext: &[u8]) -> Result<EncryptedMessage> {
354 let mut stats = self.stats.write().await;
355 stats.messages_encrypted += 1;
356
357 let ephemeral_key = if self.config.perfect_forward_secrecy {
359 Some(self.generate_ephemeral_key().await?)
360 } else {
361 None
362 };
363
364 let symmetric_key = self.derive_symmetric_key(recipient).await?;
366 let iv = Self::generate_random_bytes(12);
367
368 let ciphertext = self.encrypt_payload(plaintext, &symmetric_key, &iv)?;
370
371 let auth_tag = self.generate_auth_tag(&ciphertext, &symmetric_key)?;
373
374 let recipient_public_key = self.get_public_key(recipient).await?;
376 let encrypted_key = self.encrypt_symmetric_key(&symmetric_key, &recipient_public_key)?;
377
378 let mut encrypted_keys = HashMap::new();
379 encrypted_keys.insert(recipient.to_string(), encrypted_key);
380
381 let message = EncryptedMessage {
382 id: uuid::Uuid::new_v4().to_string(),
383 sender: "current-user".to_string(), recipients: vec![recipient.to_string()],
385 algorithm: self.config.encryption_algorithm,
386 key_exchange: self.config.key_exchange,
387 encrypted_keys,
388 iv,
389 ciphertext,
390 auth_tag: Some(auth_tag),
391 signature: None,
392 timestamp: Utc::now(),
393 ephemeral_public_key: ephemeral_key.map(|k| k.public_key),
394 metadata: HashMap::new(),
395 };
396
397 debug!("Encrypted message for recipient: {}", recipient);
398 Ok(message)
399 }
400
401 pub async fn decrypt(&self, message: &EncryptedMessage) -> Result<Vec<u8>> {
403 let mut stats = self.stats.write().await;
404 stats.messages_decrypted += 1;
405
406 let current_user = "current-user"; let encrypted_key = message
409 .encrypted_keys
410 .get(current_user)
411 .ok_or_else(|| anyhow!("No encrypted key for current user"))?;
412
413 let symmetric_key = self
415 .decrypt_symmetric_key(encrypted_key, current_user)
416 .await?;
417
418 if let Some(ref auth_tag) = message.auth_tag {
420 let computed_tag = self.generate_auth_tag(&message.ciphertext, &symmetric_key)?;
421 if auth_tag != &computed_tag {
422 return Err(anyhow!("Authentication tag verification failed"));
423 }
424 }
425
426 let plaintext = self.decrypt_payload(&message.ciphertext, &symmetric_key, &message.iv)?;
428
429 debug!("Decrypted message: {}", message.id);
430 Ok(plaintext)
431 }
432
433 pub async fn rotate_keys(&self, user_id: &str) -> Result<KeyPair> {
435 let key_pairs = self.key_pairs.write().await;
436
437 if self.config.key_rotation.keep_old_keys {
439 if let Some(old_key) = key_pairs.get(user_id) {
440 let mut ephemeral_keys = self.ephemeral_keys.write().await;
441 ephemeral_keys.insert(format!("{}:{}", user_id, old_key.key_id), old_key.clone());
442 }
443 }
444
445 drop(key_pairs); let new_key = self.generate_key_pair(user_id).await?;
448
449 let mut stats = self.stats.write().await;
450 stats.keys_rotated += 1;
451
452 info!("Rotated keys for user: {}", user_id);
453 Ok(new_key)
454 }
455
456 async fn get_public_key(&self, user_id: &str) -> Result<Vec<u8>> {
458 let public_keys = self.public_keys.read().await;
459 public_keys
460 .get(user_id)
461 .cloned()
462 .ok_or_else(|| anyhow!("Public key not found for user: {}", user_id))
463 }
464
465 async fn generate_ephemeral_key(&self) -> Result<KeyPair> {
467 let ephemeral_key = KeyPair {
468 public_key: Self::generate_random_bytes(32),
469 private_key: Self::generate_random_bytes(32),
470 key_id: uuid::Uuid::new_v4().to_string(),
471 created_at: Utc::now(),
472 expires_at: Some(Utc::now() + ChronoDuration::hours(1)), algorithm: self.config.key_exchange,
474 };
475
476 Ok(ephemeral_key)
477 }
478
479 async fn derive_symmetric_key(&self, _recipient: &str) -> Result<Vec<u8>> {
481 Ok(Self::generate_random_bytes(32))
483 }
484
485 fn encrypt_payload(&self, plaintext: &[u8], key: &[u8], iv: &[u8]) -> Result<Vec<u8>> {
487 let mut ciphertext = plaintext.to_vec();
489
490 for (i, byte) in ciphertext.iter_mut().enumerate() {
492 *byte ^= key[i % key.len()] ^ iv[i % iv.len()];
493 }
494
495 Ok(ciphertext)
496 }
497
498 fn decrypt_payload(&self, ciphertext: &[u8], key: &[u8], iv: &[u8]) -> Result<Vec<u8>> {
500 self.encrypt_payload(ciphertext, key, iv)
502 }
503
504 fn generate_auth_tag(&self, data: &[u8], key: &[u8]) -> Result<Vec<u8>> {
506 let mut mac =
507 HmacSha256::new_from_slice(key).map_err(|e| anyhow!("Failed to create HMAC: {}", e))?;
508 mac.update(data);
509 Ok(mac.finalize().into_bytes().to_vec())
510 }
511
512 fn encrypt_symmetric_key(&self, symmetric_key: &[u8], _public_key: &[u8]) -> Result<Vec<u8>> {
514 Ok(symmetric_key.to_vec())
516 }
517
518 async fn decrypt_symmetric_key(&self, encrypted_key: &[u8], _user_id: &str) -> Result<Vec<u8>> {
520 Ok(encrypted_key.to_vec())
522 }
523
524 fn generate_random_bytes(size: usize) -> Vec<u8> {
526 use scirs2_core::random::{rng, RngExt};
527 let mut rand_gen = rng();
528 (0..size).map(|_| rand_gen.random_range(0..=255)).collect()
529 }
530
531 pub async fn stats(&self) -> E2EEStats {
533 self.stats.read().await.clone()
534 }
535}
536
537#[derive(Debug, Clone, Default, Serialize, Deserialize)]
539pub struct E2EEStats {
540 pub messages_encrypted: u64,
542
543 pub messages_decrypted: u64,
545
546 pub keys_generated: u64,
548
549 pub keys_rotated: u64,
551
552 pub encryption_failures: u64,
554
555 pub decryption_failures: u64,
557}
558
559pub struct HomomorphicEncryption {
561 config: E2EEConfig,
562}
563
564impl HomomorphicEncryption {
565 pub fn new(config: E2EEConfig) -> Self {
567 Self { config }
568 }
569
570 pub fn add(&self, a: &[u8], b: &[u8]) -> Result<Vec<u8>> {
572 let mut result = Vec::new();
574 for i in 0..a.len().min(b.len()) {
575 result.push(a[i].wrapping_add(b[i]));
576 }
577 Ok(result)
578 }
579
580 pub fn multiply_scalar(&self, encrypted: &[u8], scalar: u64) -> Result<Vec<u8>> {
582 let result = encrypted
584 .iter()
585 .map(|&x| x.wrapping_mul(scalar as u8))
586 .collect();
587 Ok(result)
588 }
589}
590
591pub struct ZeroKnowledgeProof {
593 config: E2EEConfig,
594}
595
596impl ZeroKnowledgeProof {
597 pub fn new(config: E2EEConfig) -> Self {
599 Self { config }
600 }
601
602 pub fn prove_range(&self, _value: u64, _min: u64, _max: u64) -> Result<Vec<u8>> {
604 Ok(vec![0u8; 64])
606 }
607
608 pub fn verify_range(&self, _proof: &[u8], _min: u64, _max: u64) -> Result<bool> {
610 Ok(true)
612 }
613
614 pub fn prove_membership(&self, _element: &[u8], _set: &[Vec<u8>]) -> Result<Vec<u8>> {
616 Ok(vec![0u8; 64])
618 }
619
620 pub fn verify_membership(&self, _proof: &[u8], _set: &[Vec<u8>]) -> Result<bool> {
622 Ok(true)
624 }
625}
626
627#[cfg(test)]
628mod tests {
629 use super::*;
630
631 #[tokio::test]
632 async fn test_key_generation() {
633 let config = E2EEConfig::default();
634 let manager = E2EEManager::new(config).unwrap();
635
636 let key_pair = manager.generate_key_pair("user-1").await.unwrap();
637 assert!(!key_pair.public_key.is_empty());
638 assert!(!key_pair.private_key.is_empty());
639 }
640
641 #[tokio::test]
642 async fn test_encryption_decryption() {
643 let config = E2EEConfig::default();
644 let manager = E2EEManager::new(config).unwrap();
645
646 manager.generate_key_pair("sender").await.unwrap();
648 manager.generate_key_pair("recipient").await.unwrap();
649
650 let plaintext = b"Hello, encrypted world!";
651 let encrypted = manager.encrypt("recipient", plaintext).await.unwrap();
652
653 assert_eq!(encrypted.recipients, vec!["recipient"]);
654 assert!(!encrypted.ciphertext.is_empty());
655 }
656
657 #[tokio::test]
658 async fn test_key_rotation() {
659 let config = E2EEConfig::default();
660 let manager = E2EEManager::new(config).unwrap();
661
662 let key1 = manager.generate_key_pair("user-1").await.unwrap();
663 let key2 = manager.rotate_keys("user-1").await.unwrap();
664
665 assert_ne!(key1.key_id, key2.key_id);
666
667 let stats = manager.stats().await;
668 assert_eq!(stats.keys_rotated, 1);
669 }
670
671 #[tokio::test]
672 async fn test_key_expiration() {
673 let mut config = E2EEConfig::default();
674 config.key_rotation.max_key_age = ChronoDuration::seconds(1);
675
676 let manager = E2EEManager::new(config).unwrap();
677 let key = manager.generate_key_pair("user-1").await.unwrap();
678
679 assert!(!key.is_expired());
680 }
681
682 #[tokio::test]
683 async fn test_homomorphic_addition() {
684 let config = E2EEConfig {
685 homomorphic_encryption: true,
686 ..Default::default()
687 };
688
689 let he = HomomorphicEncryption::new(config);
690
691 let encrypted_a = vec![5u8, 10, 15];
692 let encrypted_b = vec![3u8, 7, 12];
693
694 let result = he.add(&encrypted_a, &encrypted_b).unwrap();
695 assert_eq!(result.len(), 3);
696 }
697
698 #[tokio::test]
699 async fn test_zero_knowledge_proof() {
700 let config = E2EEConfig {
701 zero_knowledge_proofs: true,
702 ..Default::default()
703 };
704
705 let zkp = ZeroKnowledgeProof::new(config);
706
707 let proof = zkp.prove_range(50, 0, 100).unwrap();
709 let valid = zkp.verify_range(&proof, 0, 100).unwrap();
710
711 assert!(valid);
712 }
713
714 #[tokio::test]
715 async fn test_perfect_forward_secrecy() {
716 let config = E2EEConfig {
717 perfect_forward_secrecy: true,
718 ..Default::default()
719 };
720
721 let manager = E2EEManager::new(config).unwrap();
722 manager.generate_key_pair("recipient").await.unwrap();
723
724 let msg1 = manager.encrypt("recipient", b"message 1").await.unwrap();
725 let msg2 = manager.encrypt("recipient", b"message 2").await.unwrap();
726
727 assert!(msg1.ephemeral_public_key.is_some());
729 assert!(msg2.ephemeral_public_key.is_some());
730 }
731}