cloudconvert_sdk/
webhook.rs1use hmac::{Hmac, KeyInit, Mac};
8use sha2::Sha256;
9
10use crate::{Error, Result, SigningSecret};
11
12type HmacSha256 = Hmac<Sha256>;
13
14pub fn verify_signature(
16 payload: impl AsRef<[u8]>,
17 signature_hex: impl AsRef<str>,
18 signing_secret: &SigningSecret,
19) -> Result<bool> {
20 let expected = hex::decode(signature_hex.as_ref()).map_err(|_| Error::InvalidSignatureHex)?;
21 let mut mac = HmacSha256::new_from_slice(signing_secret.expose().as_bytes())
22 .map_err(|_| Error::InvalidSignatureHex)?;
23 mac.update(payload.as_ref());
24 Ok(mac.verify_slice(&expected).is_ok())
25}
26
27pub fn sign_payload(payload: impl AsRef<[u8]>, signing_secret: &SigningSecret) -> Result<String> {
29 let mut mac = HmacSha256::new_from_slice(signing_secret.expose().as_bytes())
30 .map_err(|_| Error::InvalidSignatureHex)?;
31 mac.update(payload.as_ref());
32 Ok(hex::encode(mac.finalize().into_bytes()))
33}