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 65 66 | 2x 2x | export async function generateHMACSHA256Token( data: Record<string, string> ): Promise<string> { const secret = process.env.HMAC_SECRET; Iif (!secret) { throw new Error("env variable HMAC_SECRET is not set"); } const encoder = new TextEncoder(); const keyData = encoder.encode(secret); 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> { const secret = process.env.HMAC_SECRET; Iif (!token || !data) { throw new Error("token or id is missing"); } Iif (!secret) { throw new Error("env variable HMAC_SECRET is not set"); } const key = await crypto.subtle.importKey( "raw", new TextEncoder().encode(secret), { 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; } |