Skip to main content

av_core/
digest.rs

1//! SHA-256 digest helpers used by receipts, chains, and audit stubs.
2
3use sha2::{Digest, Sha256};
4
5/// SHA-256 of `data`, hex-encoded (lowercase, 64 chars).
6pub fn sha256_hex(data: &[u8]) -> String {
7    hex::encode(Sha256::digest(data))
8}
9
10/// SHA-256 over the concatenation of `parts` (no separator — callers must
11/// ensure unambiguous framing, e.g. fixed-width prefix or hash-of-hash).
12pub fn sha256_concat_hex(parts: &[&[u8]]) -> String {
13    let mut h = Sha256::new();
14    for p in parts {
15        h.update(p);
16    }
17    hex::encode(h.finalize())
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23
24    #[test]
25    fn known_vector_empty() {
26        assert_eq!(
27            sha256_hex(b""),
28            "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
29        );
30    }
31
32    #[test]
33    fn known_vector_abc() {
34        assert_eq!(
35            sha256_hex(b"abc"),
36            "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
37        );
38    }
39
40    #[test]
41    fn concat_equals_joined() {
42        assert_eq!(sha256_concat_hex(&[b"ab", b"c"]), sha256_hex(b"abc"));
43    }
44}