1use std::sync::{Arc, Mutex};
6
7#[derive(Clone)]
9pub struct CryptoService {
10 keys: Arc<Mutex<KeyStore>>,
11}
12
13struct KeyStore {
14 symmetric_keys: Vec<SymmetricKey>,
15 key_counter: u64,
16}
17
18#[derive(Clone, Debug)]
19struct SymmetricKey {
20 id: u64,
21 key: [u8; 32],
22 created_at: u128,
23}
24
25impl CryptoService {
26 pub fn new() -> Self {
27 Self {
28 keys: Arc::new(Mutex::new(KeyStore {
29 symmetric_keys: Vec::new(),
30 key_counter: 0,
31 })),
32 }
33 }
34
35 pub fn generate_key(&self) -> u64 {
37 let mut keys = self.keys.lock().unwrap();
38 let key_id = keys.key_counter;
39 keys.key_counter += 1;
40
41 let mut key = [0u8; 32];
43 for (i, byte) in key.iter_mut().enumerate() {
44 *byte = ((key_id * 7919 + i as u64 * 3571) % 256) as u8;
45 }
46
47 let timestamp = std::time::SystemTime::now()
48 .duration_since(std::time::UNIX_EPOCH)
49 .unwrap()
50 .as_millis();
51
52 keys.symmetric_keys.push(SymmetricKey {
53 id: key_id,
54 key,
55 created_at: timestamp,
56 });
57
58 key_id
59 }
60
61 pub fn encrypt(&self, key_id: u64, data: &[u8]) -> Vec<u8> {
63 let keys = self.keys.lock().unwrap();
64
65 if let Some(key) = keys.symmetric_keys.iter().find(|k| k.id == key_id) {
66 data.iter()
67 .enumerate()
68 .map(|(i, &byte)| byte ^ key.key[i % 32])
69 .collect()
70 } else {
71 data.to_vec()
72 }
73 }
74
75 pub fn decrypt(&self, key_id: u64, data: &[u8]) -> Vec<u8> {
77 self.encrypt(key_id, data)
79 }
80
81 pub fn hash(&self, data: &[u8]) -> String {
83 let mut hash: u64 = 5381;
84 for &byte in data {
85 hash = hash.wrapping_mul(33).wrapping_add(byte as u64);
86 }
87 format!("{:016x}", hash)
88 }
89
90 pub fn verify(&self, data: &[u8], expected_hash: &str) -> bool {
92 self.hash(data) == expected_hash
93 }
94
95 pub fn sign(&self, key_id: u64, data: &[u8]) -> String {
97 let keys = self.keys.lock().unwrap();
98
99 if let Some(key) = keys.symmetric_keys.iter().find(|k| k.id == key_id) {
100 let mut signature: u64 = 5381;
101 for (i, &byte) in data.iter().enumerate() {
102 signature = signature
103 .wrapping_mul(33)
104 .wrapping_add(byte as u64)
105 .wrapping_add(key.key[i % 32] as u64);
106 }
107 format!("{:016x}", signature)
108 } else {
109 String::new()
110 }
111 }
112
113 pub fn stats(&self) -> CryptoStats {
115 let keys = self.keys.lock().unwrap();
116 CryptoStats {
117 total_keys: keys.symmetric_keys.len(),
118 keys_generated: keys.key_counter,
119 }
120 }
121}
122
123impl Default for CryptoService {
124 fn default() -> Self {
125 Self::new()
126 }
127}
128
129#[derive(Debug, Clone)]
130pub struct CryptoStats {
131 pub total_keys: usize,
132 pub keys_generated: u64,
133}
134
135impl std::fmt::Display for CryptoStats {
136 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
137 write!(
138 f,
139 "CryptoStats[keys={}, generated={}]",
140 self.total_keys, self.keys_generated
141 )
142 }
143}
144
145#[derive(Clone)]
147pub struct SecureChannel {
148 crypto: CryptoService,
149 key_id: u64,
150}
151
152impl SecureChannel {
153 pub fn new(crypto: CryptoService) -> Self {
154 let key_id = crypto.generate_key();
155 Self { crypto, key_id }
156 }
157
158 pub fn send(&self, message: &[u8]) -> Vec<u8> {
160 self.crypto.encrypt(self.key_id, message)
161 }
162
163 pub fn receive(&self, encrypted: &[u8]) -> Vec<u8> {
165 self.crypto.decrypt(self.key_id, encrypted)
166 }
167
168 pub fn key_id(&self) -> u64 {
170 self.key_id
171 }
172}