/opt/mawid/apps/api/src/whatsapp
Edit: /opt/mawid/apps/api/src/whatsapp/wa-signature.ts (662B)
import { createHmac, timingSafeEqual } from 'node:crypto';
/**
* Validates Meta's X-Hub-Signature-256 header: "sha256=" + HMAC-SHA256(appSecret, rawBody).
*/
export function verifyWaSignature(
rawBody: Buffer | undefined,
signatureHeader: string | undefined,
appSecret: string,
): boolean {
if (!rawBody || !signatureHeader?.startsWith('sha256=')) return false;
const expected = createHmac('sha256', appSecret).update(rawBody).digest('hex');
const received = signatureHeader.slice('sha256='.length);
if (received.length !== expected.length) return false;
return timingSafeEqual(Buffer.from(received, 'utf8'), Buffer.from(expected, 'utf8'));
}