use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
use hmac::{Hmac, KeyInit, Mac};
use sha2::Sha256;
type HmacSha256 = Hmac<Sha256>;
pub fn sign(secret: &[u8], msg: &[u8]) -> String {
let mut mac = HmacSha256::new_from_slice(secret).expect("HMAC accepts a key of any length");
mac.update(msg);
URL_SAFE_NO_PAD.encode(mac.finalize().into_bytes())
}
pub fn verify(secret: &[u8], msg: &[u8], signature: &str) -> bool {
let Ok(sig) = URL_SAFE_NO_PAD.decode(signature) else {
return false;
};
let Ok(mut mac) = HmacSha256::new_from_slice(secret) else {
return false;
};
mac.update(msg);
mac.verify_slice(&sig).is_ok()
}