Skip to main content

cloudconvert_sdk/
webhook.rs

1use hmac::{Hmac, KeyInit, Mac};
2use sha2::Sha256;
3
4use crate::{Error, Result, SigningSecret};
5
6type HmacSha256 = Hmac<Sha256>;
7
8pub fn verify_signature(
9    payload: impl AsRef<[u8]>,
10    signature_hex: impl AsRef<str>,
11    signing_secret: &SigningSecret,
12) -> Result<bool> {
13    let expected = hex::decode(signature_hex.as_ref()).map_err(|_| Error::InvalidSignatureHex)?;
14    let mut mac = HmacSha256::new_from_slice(signing_secret.expose().as_bytes())
15        .map_err(|_| Error::InvalidSignatureHex)?;
16    mac.update(payload.as_ref());
17    Ok(mac.verify_slice(&expected).is_ok())
18}
19
20pub fn sign_payload(payload: impl AsRef<[u8]>, signing_secret: &SigningSecret) -> Result<String> {
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(hex::encode(mac.finalize().into_bytes()))
25}