lgx_runtime/utils/
crypto.rs

1use anyhow::Result;
2use base64::Engine;
3use sha2::{Digest, Sha256};
4use tracing::debug;
5use uuid::Uuid;
6
7pub fn hash_string(input: &str) -> Result<String> {
8    debug!("Hashing string of length: {}", input.len());
9    
10    let mut hasher = Sha256::new();
11    hasher.update(input.as_bytes());
12    let result = hasher.finalize();
13    
14    Ok(format!("{:x}", result))
15}
16
17pub fn generate_token() -> Result<String> {
18    debug!("Generating new token");
19    
20    let token = Uuid::new_v4().to_string();
21    let hashed_token = hash_string(&token)?;
22    
23    Ok(hashed_token)
24}
25
26pub fn verify_signature(data: &str, signature: &str, public_key: &str) -> Result<bool> {
27    debug!("Verifying signature for data length: {}", data.len());
28    
29    // For production, this would use proper cryptographic signature verification
30    // For now, we'll use a simple hash-based verification
31    let expected_signature = hash_string(&format!("{}{}", data, public_key))?;
32    
33    Ok(signature == expected_signature)
34}
35
36pub fn encrypt_data(data: &str, key: &str) -> Result<String> {
37    debug!("Encrypting data of length: {}", data.len());
38    
39    // Simple XOR encryption for demonstration
40    // In production, use proper encryption like AES
41    let key_bytes = key.as_bytes();
42    let data_bytes = data.as_bytes();
43    let mut encrypted = Vec::new();
44    
45    for (i, &byte) in data_bytes.iter().enumerate() {
46        let key_byte = key_bytes[i % key_bytes.len()];
47        encrypted.push(byte ^ key_byte);
48    }
49    
50    Ok(base64::engine::general_purpose::STANDARD.encode(encrypted))
51}
52
53pub fn decrypt_data(encrypted_data: &str, key: &str) -> Result<String> {
54    debug!("Decrypting data");
55    
56    let encrypted_bytes = base64::engine::general_purpose::STANDARD.decode(encrypted_data)?;
57    let key_bytes = key.as_bytes();
58    let mut decrypted = Vec::new();
59    
60    for (i, &byte) in encrypted_bytes.iter().enumerate() {
61        let key_byte = key_bytes[i % key_bytes.len()];
62        decrypted.push(byte ^ key_byte);
63    }
64    
65    Ok(String::from_utf8(decrypted)?)
66}