use std::sync::{Arc, Mutex};
#[derive(Clone)]
pub struct CryptoService {
keys: Arc<Mutex<KeyStore>>,
}
struct KeyStore {
symmetric_keys: Vec<SymmetricKey>,
key_counter: u64,
}
#[derive(Clone, Debug)]
struct SymmetricKey {
id: u64,
key: [u8; 32],
created_at: u128,
}
impl CryptoService {
pub fn new() -> Self {
Self {
keys: Arc::new(Mutex::new(KeyStore {
symmetric_keys: Vec::new(),
key_counter: 0,
})),
}
}
pub fn generate_key(&self) -> u64 {
let mut keys = self.keys.lock().unwrap();
let key_id = keys.key_counter;
keys.key_counter += 1;
let mut key = [0u8; 32];
for (i, byte) in key.iter_mut().enumerate() {
*byte = ((key_id * 7919 + i as u64 * 3571) % 256) as u8;
}
let timestamp = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_millis();
keys.symmetric_keys.push(SymmetricKey {
id: key_id,
key,
created_at: timestamp,
});
key_id
}
pub fn encrypt(&self, key_id: u64, data: &[u8]) -> Vec<u8> {
let keys = self.keys.lock().unwrap();
if let Some(key) = keys.symmetric_keys.iter().find(|k| k.id == key_id) {
data.iter()
.enumerate()
.map(|(i, &byte)| byte ^ key.key[i % 32])
.collect()
} else {
data.to_vec()
}
}
pub fn decrypt(&self, key_id: u64, data: &[u8]) -> Vec<u8> {
self.encrypt(key_id, data)
}
pub fn hash(&self, data: &[u8]) -> String {
let mut hash: u64 = 5381;
for &byte in data {
hash = hash.wrapping_mul(33).wrapping_add(byte as u64);
}
format!("{:016x}", hash)
}
pub fn verify(&self, data: &[u8], expected_hash: &str) -> bool {
self.hash(data) == expected_hash
}
pub fn sign(&self, key_id: u64, data: &[u8]) -> String {
let keys = self.keys.lock().unwrap();
if let Some(key) = keys.symmetric_keys.iter().find(|k| k.id == key_id) {
let mut signature: u64 = 5381;
for (i, &byte) in data.iter().enumerate() {
signature = signature
.wrapping_mul(33)
.wrapping_add(byte as u64)
.wrapping_add(key.key[i % 32] as u64);
}
format!("{:016x}", signature)
} else {
String::new()
}
}
pub fn stats(&self) -> CryptoStats {
let keys = self.keys.lock().unwrap();
CryptoStats {
total_keys: keys.symmetric_keys.len(),
keys_generated: keys.key_counter,
}
}
}
impl Default for CryptoService {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct CryptoStats {
pub total_keys: usize,
pub keys_generated: u64,
}
impl std::fmt::Display for CryptoStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"CryptoStats[keys={}, generated={}]",
self.total_keys, self.keys_generated
)
}
}
#[derive(Clone)]
pub struct SecureChannel {
crypto: CryptoService,
key_id: u64,
}
impl SecureChannel {
pub fn new(crypto: CryptoService) -> Self {
let key_id = crypto.generate_key();
Self { crypto, key_id }
}
pub fn send(&self, message: &[u8]) -> Vec<u8> {
self.crypto.encrypt(self.key_id, message)
}
pub fn receive(&self, encrypted: &[u8]) -> Vec<u8> {
self.crypto.decrypt(self.key_id, encrypted)
}
pub fn key_id(&self) -> u64 {
self.key_id
}
}