sentinel_crypto/hash/
blake3.rs

1use serde_json::Value;
2use tracing::trace;
3
4use crate::{error::CryptoError, hash_trait::HashFunction};
5
6/// Blake3 hash implementation.
7/// Uses the BLAKE3 cryptographic hash function, which provides high performance
8/// and security. Supports parallel computation for large inputs.
9///
10/// Design choice: BLAKE3 was chosen for its speed (faster than SHA-256/512),
11/// security (based on BLAKE2), and parallel processing capabilities.
12/// It's a rustcrypto crate, preferred over ring for this use case.
13pub struct Blake3Hasher;
14
15impl HashFunction for Blake3Hasher {
16    fn hash_data(data: &Value) -> Result<String, CryptoError> {
17        trace!("Hashing data with Blake3");
18        let json_str = serde_json::to_string(data).map_err(CryptoError::from)?;
19        let hash = blake3::hash(json_str.as_bytes());
20        let hash_str = hash.to_hex().to_string();
21        trace!("Blake3 hash computed: {}", hash_str);
22        Ok(hash_str)
23    }
24}
25
26impl crate::hash_trait::private::Sealed for Blake3Hasher {}
27
28#[test]
29fn test_blake3_hash() {
30    let data = serde_json::json!({"key": "value", "number": 42});
31    let hash = Blake3Hasher::hash_data(&data).unwrap();
32    assert_eq!(hash.len(), 64);
33    let hash2 = Blake3Hasher::hash_data(&data).unwrap();
34    assert_eq!(hash, hash2);
35}