Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 45x 4x 4x | import { hmacSecret } from "./environment";
export async function generateHMACSHA256Token(
data: Record<string, string>
): Promise<string> {
Iif (!hmacSecret) {
throw new Error("env variable HMAC_SECRET is not set");
}
const encoder = new TextEncoder();
const keyData = encoder.encode(hmacSecret);
const key = await crypto.subtle.importKey(
"raw",
keyData,
{ name: "HMAC", hash: "SHA-256" },
false,
["sign"]
);
const dataToSign = encoder.encode(JSON.stringify(data));
const signature = await crypto.subtle.sign("HMAC", key, dataToSign);
return bufferToHex(signature);
}
function bufferToHex(arrayBuffer: ArrayBuffer): string {
return Array.prototype.map
.call(new Uint8Array(arrayBuffer), (n: number) =>
n.toString(16).padStart(2, "0")
)
.join("");
}
export async function verifyHMACSHA256Token(
token: string,
data: Record<string, string>
): Promise<boolean> {
Iif (!token || !data) {
throw new Error("token or id is missing");
}
Iif (!hmacSecret) {
throw new Error("env variable HMAC_SECRET is not set");
}
const key = await crypto.subtle.importKey(
"raw",
new TextEncoder().encode(hmacSecret),
{ name: "HMAC", hash: { name: "SHA-256" } },
false,
["sign"]
);
const verifyToken = bufferToHex(
await crypto.subtle.sign(
"HMAC",
key,
new TextEncoder().encode(JSON.stringify(data))
)
);
const isValidToken = token === verifyToken;
return isValidToken;
}
|