Skip to main content

river_data_core/
crypto.rs

1use sha2::{Digest, Sha256};
2
3#[must_use]
4pub fn hash_token(raw_token: &str) -> String {
5    let mut hasher = Sha256::new();
6    hasher.update(raw_token.as_bytes());
7    format!("{:x}", hasher.finalize())
8}
9
10#[must_use]
11pub fn generate_token() -> String {
12    use rand::Rng;
13    let bytes: [u8; 32] = rand::rng().random();
14    bytes.iter().map(|b| format!("{b:02x}")).collect()
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20
21    #[test]
22    fn hash_is_deterministic() {
23        let a = hash_token("test-token");
24        let b = hash_token("test-token");
25        assert_eq!(a, b);
26        assert_eq!(a.len(), 64);
27    }
28
29    #[test]
30    fn generate_is_unique() {
31        let a = generate_token();
32        let b = generate_token();
33        assert_ne!(a, b);
34        assert_eq!(a.len(), 64);
35    }
36}