UNPKG

jose

Version:

JWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes

37 lines (36 loc) • 1.31 kB
import { unsupportedAlg, algArgument } from "../lib/key_algorithm.js"; import { validateExtractableOption } from "../lib/key.js"; async function generateSecret(alg, options) { const extractable = validateExtractableOption(options?.extractable); let keyLengthBits, algorithm, keyUsages; switch (alg) { case "HS256": case "HS384": case "HS512": keyLengthBits = +alg.slice(-3), algorithm = { name: "HMAC", hash: `SHA-${keyLengthBits}`, length: keyLengthBits }, keyUsages = ["sign", "verify"]; break; case "A128CBC-HS256": case "A192CBC-HS384": case "A256CBC-HS512": return crypto.getRandomValues(new Uint8Array(+alg.slice(-3) >> 3)); case "A128KW": case "A192KW": case "A256KW": keyLengthBits = +alg.slice(1, 4), algorithm = { name: "AES-KW", length: keyLengthBits }, keyUsages = ["wrapKey", "unwrapKey"]; break; case "A128GCMKW": case "A192GCMKW": case "A256GCMKW": case "A128GCM": case "A192GCM": case "A256GCM": keyLengthBits = +alg.slice(1, 4), algorithm = { name: "AES-GCM", length: keyLengthBits }, keyUsages = ["encrypt", "decrypt"]; break; default: unsupportedAlg(algArgument); } return crypto.subtle.generateKey(algorithm, extractable ?? !1, keyUsages); } export { generateSecret };