use aes_gcm::{
aead::{Aead, KeyInit},
Aes256Gcm, Nonce,
};
use base64::{engine::general_purpose, Engine as _};
use std::env;
pub struct Shield;
impl Shield {
pub fn default_key() -> String {
Self::get_machine_id()
}
pub fn encrypt(prompt: &str, key_str: &str) -> String {
let key = Self::derive_key(key_str);
let cipher = Aes256Gcm::new(&key.into());
let nonce = Nonce::from_slice(b"aether_nonce");
let ciphertext = cipher
.encrypt(nonce, prompt.as_bytes())
.expect("Encryption failed");
general_purpose::STANDARD.encode(ciphertext)
}
pub fn decrypt(encrypted_prompt: &str, key_str: &str) -> Result<String, String> {
let key = Self::derive_key(key_str);
let cipher = Aes256Gcm::new(&key.into());
let nonce = Nonce::from_slice(b"aether_nonce");
let ciphertext = general_purpose::STANDARD
.decode(encrypted_prompt)
.map_err(|e| e.to_string())?;
let plaintext = cipher
.decrypt(nonce, ciphertext.as_slice())
.map_err(|e| e.to_string())?;
String::from_utf8(plaintext).map_err(|e| e.to_string())
}
fn derive_key(key_str: &str) -> [u8; 32] {
let mut key = [0u8; 32];
let bytes = key_str.as_bytes();
for i in 0..32 {
if i < bytes.len() {
key[i] = bytes[i];
} else {
key[i] = (i as u8).wrapping_mul(0xAF); }
}
key
}
pub fn get_machine_id() -> String {
let username = env::var("USERNAME").or_else(|_| env::var("USER")).unwrap_or_else(|_| "unknown".to_string());
let computername = env::var("COMPUTERNAME").unwrap_or_else(|_| "localhost".to_string());
format!("{}-{}", username, computername)
}
}