UNPKG

1.42 kBJavaScriptView Raw
1/**
2 * react-router v8.0.0
3 *
4 * Copyright (c) Remix Software Inc.
5 *
6 * This source code is licensed under the MIT license found in the
7 * LICENSE.md file in the root directory of this source tree.
8 *
9 * @license MIT
10 */
11//#region lib/server-runtime/crypto.ts
12const encoder = /* @__PURE__ */ new TextEncoder();
13const sign = async (value, secret) => {
14 let data = encoder.encode(value);
15 let key = await createKey(secret, ["sign"]);
16 let signature = await crypto.subtle.sign("HMAC", key, data);
17 let hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(/=+$/, "");
18 return value + "." + hash;
19};
20const unsign = async (cookie, secret) => {
21 let index = cookie.lastIndexOf(".");
22 let value = cookie.slice(0, index);
23 let hash = cookie.slice(index + 1);
24 let data = encoder.encode(value);
25 let key = await createKey(secret, ["verify"]);
26 try {
27 let signature = byteStringToUint8Array(atob(hash));
28 return await crypto.subtle.verify("HMAC", key, signature, data) ? value : false;
29 } catch (e) {
30 return false;
31 }
32};
33const createKey = async (secret, usages) => crypto.subtle.importKey("raw", encoder.encode(secret), {
34 name: "HMAC",
35 hash: "SHA-256"
36}, false, usages);
37function byteStringToUint8Array(byteString) {
38 let array = new Uint8Array(byteString.length);
39 for (let i = 0; i < byteString.length; i++) array[i] = byteString.charCodeAt(i);
40 return array;
41}
42//#endregion
43export { sign, unsign };