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