webbuf_blake3/
lib.rs

1use blake3::Hasher;
2
3#[cfg(feature = "wasm")]
4use wasm_bindgen::prelude::*;
5
6#[cfg_attr(feature = "wasm", wasm_bindgen)]
7pub fn blake3_hash(data: &[u8]) -> Result<Vec<u8>, String> {
8    let mut hasher = Hasher::new();
9    hasher.update(data);
10    Ok(hasher.finalize().as_bytes().to_vec())
11}
12
13#[cfg_attr(feature = "wasm", wasm_bindgen)]
14pub fn double_blake3_hash(data: &[u8]) -> Result<Vec<u8>, String> {
15    let first_hash = blake3_hash(data)?;
16    blake3_hash(&first_hash)
17}
18
19#[cfg_attr(feature = "wasm", wasm_bindgen)]
20pub fn blake3_mac(key: &[u8], data: &[u8]) -> Result<Vec<u8>, String> {
21    // Ensure the key is exactly 32 bytes
22    let key32: [u8; 32] = key
23        .try_into()
24        .map_err(|_| "Key must be exactly 32 bytes".to_string())?;
25
26    let mut hasher = Hasher::new_keyed(&key32);
27    hasher.update(data);
28    Ok(hasher.finalize().as_bytes().to_vec())
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34    use hex::{decode, encode};
35
36    #[test]
37    fn test_hash() {
38        let pub_key_hex = "03d03a42c710b7cf9085bd3115338f72b86f2d77859b6afe6d33b13ea8957a9722";
39        let expected_pkh_hex = "38a12c6cf034632042b3b9deb2aabfdc798fac879d2f833638d59cf58549bc2d";
40
41        let pub_key = decode(pub_key_hex).expect("Decoding failed");
42        let expected_pkh = decode(expected_pkh_hex).expect("Decoding failed");
43
44        let pkh = blake3_hash(&pub_key).unwrap();
45        let pkh_hex = encode(pkh);
46        let expected_pkh_hex = encode(expected_pkh);
47
48        assert_eq!(pkh_hex, expected_pkh_hex);
49    }
50
51    #[test]
52    fn test_double_hash() {
53        let pub_key_hex = "0341ee98513da8509fea0c89b81aca409e56f5aaa3076fb78233850ad0e54e2628";
54        let expected_pkh_hex = "51544e51d07a92f41854bd2a14d0f33dcbc936b8910eb9c699b656cd89308132";
55
56        let pub_key = decode(pub_key_hex).expect("Decoding failed");
57        let expected_pkh = decode(expected_pkh_hex).expect("Decoding failed");
58
59        let pkh = double_blake3_hash(&pub_key).unwrap();
60        let pkh_hex = encode(pkh);
61        let expected_pkh_hex = encode(expected_pkh);
62
63        assert_eq!(pkh_hex, expected_pkh_hex);
64    }
65
66    #[test]
67    fn test_blake3_mac() {
68        let key_str = "key";
69        let key_data = key_str.as_bytes();
70        let key = blake3_hash(key_data).unwrap();
71
72        let data_str = "data";
73        let data = data_str.as_bytes();
74        let mac = blake3_mac(&key, data).unwrap();
75        let expected_mac_hex = "438f903a8fc5997489497c30477dc32c5ece10f44049e302b85a83603960ec27";
76
77        assert_eq!(encode(mac), expected_mac_hex);
78    }
79}