use alloc::string::String;
use core::fmt::Write;
use sha2::{Digest, Sha256};
use crate::{Error, Result};
#[must_use]
pub fn sha256_prefixed(bytes: &[u8]) -> String {
let digest = Sha256::digest(bytes);
let mut output = String::with_capacity(71);
output.push_str("sha256:");
for byte in digest {
write!(&mut output, "{byte:02x}").expect("writing to a String cannot fail");
}
output
}
pub fn validate_sha256(value: &str) -> Result<()> {
let Some(hex) = value.strip_prefix("sha256:") else {
return Err(Error::Validation("digest prefix must be sha256:"));
};
if hex.len() != 64
|| !hex
.as_bytes()
.iter()
.all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(byte))
{
return Err(Error::Validation(
"digest must contain 64 lowercase hexadecimal digits",
));
}
Ok(())
}