use sha2::{Digest, Sha256};
pub fn sha256(data: &[u8]) -> [u8; 32] {
let mut h = Sha256::new();
h.update(data);
h.finalize().into()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sha256_empty_matches_known_digest() {
let expected =
hex_to_bytes("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
assert_eq!(sha256(b""), expected);
}
fn hex_to_bytes(s: &str) -> [u8; 32] {
let mut out = [0u8; 32];
for (i, chunk) in s.as_bytes().chunks(2).enumerate() {
let hi = hex_nibble(chunk[0]);
let lo = hex_nibble(chunk[1]);
out[i] = (hi << 4) | lo;
}
out
}
fn hex_nibble(c: u8) -> u8 {
match c {
b'0'..=b'9' => c - b'0',
b'a'..=b'f' => c - b'a' + 10,
_ => panic!("bad hex char"),
}
}
}