43 lines
961 B
TypeScript
43 lines
961 B
TypeScript
export async function generateSecretKey() {
|
|
const key = await crypto.subtle.generateKey(
|
|
{ name: "HMAC", hash: "SHA-512" },
|
|
true,
|
|
["sign", "verify"],
|
|
);
|
|
|
|
return key;
|
|
}
|
|
|
|
let cacheKey: CryptoKey | undefined;
|
|
let previousKey = "invalid";
|
|
|
|
export async function prepareSecretKey() {
|
|
const key = Deno.env.get("SECRET_KEY");
|
|
if (key === previousKey) {
|
|
return cacheKey!;
|
|
}
|
|
if (key) {
|
|
const jwk = JSON.parse(key) as JsonWebKey;
|
|
previousKey = key;
|
|
{
|
|
const key = await crypto.subtle.importKey(
|
|
"jwk",
|
|
jwk,
|
|
{ name: "HMAC", hash: "SHA-512" },
|
|
true,
|
|
["sign", "verify"],
|
|
);
|
|
cacheKey = key;
|
|
return key;
|
|
}
|
|
} else {
|
|
const key = await generateSecretKey();
|
|
const out = await crypto.subtle.exportKey("jwk", key);
|
|
const outStr = JSON.stringify(out);
|
|
Deno.env.set("SECRET_KEY", outStr);
|
|
cacheKey = key;
|
|
previousKey = outStr;
|
|
return key;
|
|
}
|
|
}
|