use sha2::{Digest, Sha256};
pub fn generate_device_token() -> String {
use rand::Rng;
let mut rng = rand::thread_rng();
let mut bytes = [0u8; 32];
rng.fill(&mut bytes);
format!("edda_dev_{}", hex::encode(bytes))
}
pub fn hash_token(raw_token: &str) -> String {
let mut hasher = Sha256::new();
hasher.update(raw_token.as_bytes());
hex::encode(hasher.finalize())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn token_format() {
let tok = generate_device_token();
assert!(
tok.starts_with("edda_dev_"),
"token should start with prefix"
);
assert_eq!(tok.len(), 73, "token should be 73 chars");
}
#[test]
fn tokens_are_unique() {
let t1 = generate_device_token();
let t2 = generate_device_token();
assert_ne!(t1, t2, "two generated tokens must differ");
}
#[test]
fn hash_round_trip() {
let tok = generate_device_token();
let h1 = hash_token(&tok);
let h2 = hash_token(&tok);
assert_eq!(h1, h2, "same input must produce same hash");
assert_eq!(h1.len(), 64);
}
#[test]
fn different_tokens_different_hashes() {
let t1 = generate_device_token();
let t2 = generate_device_token();
assert_ne!(hash_token(&t1), hash_token(&t2));
}
}