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;
527 use scirs2_core::Rng;
528 let mut rand_gen = rng();
529 (0..size).map(|_| rand_gen.random_range(0..=255)).collect()
530 }
531
532 pub async fn stats(&self) -> E2EEStats {
534 self.stats.read().await.clone()
535 }
536}
537
538#[derive(Debug, Clone, Default, Serialize, Deserialize)]
540pub struct E2EEStats {
541 pub messages_encrypted: u64,
543
544 pub messages_decrypted: u64,
546
547 pub keys_generated: u64,
549
550 pub keys_rotated: u64,
552
553 pub encryption_failures: u64,
555
556 pub decryption_failures: u64,
558}
559
560pub struct HomomorphicEncryption {
562 config: E2EEConfig,
563}
564
565impl HomomorphicEncryption {
566 pub fn new(config: E2EEConfig) -> Self {
568 Self { config }
569 }
570
571 pub fn add(&self, a: &[u8], b: &[u8]) -> Result<Vec<u8>> {
573 let mut result = Vec::new();
575 for i in 0..a.len().min(b.len()) {
576 result.push(a[i].wrapping_add(b[i]));
577 }
578 Ok(result)
579 }
580
581 pub fn multiply_scalar(&self, encrypted: &[u8], scalar: u64) -> Result<Vec<u8>> {
583 let result = encrypted
585 .iter()
586 .map(|&x| x.wrapping_mul(scalar as u8))
587 .collect();
588 Ok(result)
589 }
590}
591
592pub struct ZeroKnowledgeProof {
594 config: E2EEConfig,
595}
596
597impl ZeroKnowledgeProof {
598 pub fn new(config: E2EEConfig) -> Self {
600 Self { config }
601 }
602
603 pub fn prove_range(&self, _value: u64, _min: u64, _max: u64) -> Result<Vec<u8>> {
605 Ok(vec![0u8; 64])
607 }
608
609 pub fn verify_range(&self, _proof: &[u8], _min: u64, _max: u64) -> Result<bool> {
611 Ok(true)
613 }
614
615 pub fn prove_membership(&self, _element: &[u8], _set: &[Vec<u8>]) -> Result<Vec<u8>> {
617 Ok(vec![0u8; 64])
619 }
620
621 pub fn verify_membership(&self, _proof: &[u8], _set: &[Vec<u8>]) -> Result<bool> {
623 Ok(true)
625 }
626}
627
628#[cfg(test)]
629mod tests {
630 use super::*;
631
632 #[tokio::test]
633 async fn test_key_generation() {
634 let config = E2EEConfig::default();
635 let manager = E2EEManager::new(config).unwrap();
636
637 let key_pair = manager.generate_key_pair("user-1").await.unwrap();
638 assert!(!key_pair.public_key.is_empty());
639 assert!(!key_pair.private_key.is_empty());
640 }
641
642 #[tokio::test]
643 async fn test_encryption_decryption() {
644 let config = E2EEConfig::default();
645 let manager = E2EEManager::new(config).unwrap();
646
647 manager.generate_key_pair("sender").await.unwrap();
649 manager.generate_key_pair("recipient").await.unwrap();
650
651 let plaintext = b"Hello, encrypted world!";
652 let encrypted = manager.encrypt("recipient", plaintext).await.unwrap();
653
654 assert_eq!(encrypted.recipients, vec!["recipient"]);
655 assert!(!encrypted.ciphertext.is_empty());
656 }
657
658 #[tokio::test]
659 async fn test_key_rotation() {
660 let config = E2EEConfig::default();
661 let manager = E2EEManager::new(config).unwrap();
662
663 let key1 = manager.generate_key_pair("user-1").await.unwrap();
664 let key2 = manager.rotate_keys("user-1").await.unwrap();
665
666 assert_ne!(key1.key_id, key2.key_id);
667
668 let stats = manager.stats().await;
669 assert_eq!(stats.keys_rotated, 1);
670 }
671
672 #[tokio::test]
673 async fn test_key_expiration() {
674 let mut config = E2EEConfig::default();
675 config.key_rotation.max_key_age = ChronoDuration::seconds(1);
676
677 let manager = E2EEManager::new(config).unwrap();
678 let key = manager.generate_key_pair("user-1").await.unwrap();
679
680 assert!(!key.is_expired());
681 }
682
683 #[tokio::test]
684 async fn test_homomorphic_addition() {
685 let config = E2EEConfig {
686 homomorphic_encryption: true,
687 ..Default::default()
688 };
689
690 let he = HomomorphicEncryption::new(config);
691
692 let encrypted_a = vec![5u8, 10, 15];
693 let encrypted_b = vec![3u8, 7, 12];
694
695 let result = he.add(&encrypted_a, &encrypted_b).unwrap();
696 assert_eq!(result.len(), 3);
697 }
698
699 #[tokio::test]
700 async fn test_zero_knowledge_proof() {
701 let config = E2EEConfig {
702 zero_knowledge_proofs: true,
703 ..Default::default()
704 };
705
706 let zkp = ZeroKnowledgeProof::new(config);
707
708 let proof = zkp.prove_range(50, 0, 100).unwrap();
710 let valid = zkp.verify_range(&proof, 0, 100).unwrap();
711
712 assert!(valid);
713 }
714
715 #[tokio::test]
716 async fn test_perfect_forward_secrecy() {
717 let config = E2EEConfig {
718 perfect_forward_secrecy: true,
719 ..Default::default()
720 };
721
722 let manager = E2EEManager::new(config).unwrap();
723 manager.generate_key_pair("recipient").await.unwrap();
724
725 let msg1 = manager.encrypt("recipient", b"message 1").await.unwrap();
726 let msg2 = manager.encrypt("recipient", b"message 2").await.unwrap();
727
728 assert!(msg1.ephemeral_public_key.is_some());
730 assert!(msg2.ephemeral_public_key.is_some());
731 }
732}