UNPKG

jose

Version:

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

36 lines (35 loc) • 1.65 kB
import { JOSENotSupported } from "../util/errors.js"; import { validateExtractableOption } from "../lib/key.js"; import { keyAlgorithm, unsupportedAlg, algArgument } from "../lib/key_algorithm.js"; function getModulusLengthOption(options) { const modulusLength = options?.modulusLength ?? 2048; if (typeof modulusLength != "number" || !Number.isInteger(modulusLength) || modulusLength < 2048) throw new JOSENotSupported("Invalid or unsupported modulusLength option provided, 2048 bits or larger keys must be used"); return modulusLength; } async function generateKeyPair(alg, options) { const extractable = validateExtractableOption(options?.extractable), entry = keyAlgorithm(alg, algArgument); entry.secret && unsupportedAlg(algArgument); let algorithm; if (entry.resolve) { const crv = options?.crv ?? "P-256"; if (!["P-256", "P-384", "P-521", "X25519"].includes(crv)) throw new JOSENotSupported("Invalid or unsupported crv option provided, supported values are P-256, P-384, P-521, and X25519"); algorithm = entry.resolve({ crv }); } else { if (entry.crv !== void 0 && options?.crv !== void 0 && options.crv !== entry.crv) throw new JOSENotSupported(`Invalid or unsupported crv option provided, the only supported value for ${alg} is ${entry.crv}`); algorithm = entry.kty[0] === "RSA" ? { ...entry.subtle, publicExponent: Uint8Array.of(1, 0, 1), modulusLength: getModulusLengthOption(options) } : entry.subtle; } return crypto.subtle.generateKey(algorithm, extractable ?? !1, [ ...entry.usages[1], ...entry.usages[0] ]); } export { generateKeyPair };