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
JavaScript
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
};