use crate::error::Result;
use sha2::{ Digest, Sha256 };
pub struct Verify;
impl Verify {
pub fn check<D, T>(data: D, tag: Option<T>) -> Result where D: AsRef<[u8]>, T: AsRef<str> {
let tag = match tag.as_ref() {
Some(tag) => tag.as_ref(),
None => return Ok(())
};
match tag.split_once("=") {
Some(("sha256", hash)) => Self::check_sha256(data.as_ref(), hash),
Some((algo, _)) => Err(einval!("Unsupported hash algorithm: {}", algo)),
None => Err(einval!("Invalid resource hash"))
}
}
fn check_sha256(data: &[u8], hash: &str) -> Result {
match format!("{:x}", Sha256::digest(data)).as_str() {
computed_hash if computed_hash == hash => Ok(()),
computed_hash => Err(einval!("Hash mismatch; expected: {}, got: {}", hash, computed_hash))
}
}
}