use hmac::{Hmac, Mac};
use sha2::Sha256;
type HmacSha256 = Hmac<Sha256>;
pub fn verify_signature(payload: &[u8], signature: &str, secret: &str) -> bool {
let mut mac = match HmacSha256::new_from_slice(secret.as_bytes()) {
Ok(m) => m,
Err(_) => return false,
};
mac.update(payload);
let expected = hex::encode(mac.finalize().into_bytes());
expected == signature
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_verify_signature() {
let secret = "test-secret";
let payload = b"hello world";
let mut mac = HmacSha256::new_from_slice(secret.as_bytes()).unwrap();
mac.update(payload);
let sig = hex::encode(mac.finalize().into_bytes());
assert!(verify_signature(payload, &sig, secret));
assert!(!verify_signature(payload, "wrong", secret));
}
}