All files / Rindu/utils hmacToken.ts

9.09% Statements 2/22
0% Branches 0/5
0% Functions 0/4
9.09% Lines 2/22

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 662x                                                             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;
}