use hmac::{Hmac, Mac};
use sha2::Sha256;
const SIGNATURE_PREFIX: &str = "sha256=";
#[must_use]
pub fn verify_webhook_signature(payload: impl AsRef<[u8]>, signature: &str, secret: &str) -> bool {
if secret.is_empty() {
return false;
}
let Some(encoded_digest) = signature.strip_prefix(SIGNATURE_PREFIX) else {
return false;
};
let Ok(digest) = hex::decode(encoded_digest) else {
return false;
};
let Ok(mut mac) = Hmac::<Sha256>::new_from_slice(secret.as_bytes()) else {
return false;
};
mac.update(payload.as_ref());
mac.verify_slice(&digest).is_ok()
}