1 | import { Buffer } from "node:buffer";
|
2 | import { createHmac, timingSafeEqual } from "node:crypto";
|
3 |
|
4 | function s2b(str: string, encoding: BufferEncoding): Buffer {
|
5 | return Buffer.from(str, encoding);
|
6 | }
|
7 |
|
8 | function safeCompare(a: Buffer, b: Buffer): boolean {
|
9 | if (a.length !== b.length) {
|
10 | return false;
|
11 | }
|
12 | return timingSafeEqual(a, b);
|
13 | }
|
14 |
|
15 | export default function validateSignature(
|
16 | body: string | Buffer,
|
17 | channelSecret: string,
|
18 | signature: string,
|
19 | ): boolean {
|
20 | return safeCompare(
|
21 | createHmac("SHA256", channelSecret).update(body).digest(),
|
22 | s2b(signature, "base64"),
|
23 | );
|
24 | }
|