jose
Version:
JWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes
42 lines (41 loc) • 1.43 kB
JavaScript
import { unsupportedAlg, algArgument } from '../lib/key_algorithm.js';
import { validateExtractableOption } from '../lib/key_options.js';
export async function generateSecret(alg, options) {
const extractable = validateExtractableOption(options?.extractable);
let length;
let algorithm;
let keyUsages;
switch (alg) {
case 'HS256':
case 'HS384':
case 'HS512':
length = +alg.slice(-3);
algorithm = { name: 'HMAC', hash: `SHA-${length}`, length };
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':
length = +alg.slice(1, 4);
algorithm = { name: 'AES-KW', length };
keyUsages = ['wrapKey', 'unwrapKey'];
break;
case 'A128GCMKW':
case 'A192GCMKW':
case 'A256GCMKW':
case 'A128GCM':
case 'A192GCM':
case 'A256GCM':
length = +alg.slice(1, 4);
algorithm = { name: 'AES-GCM', length };
keyUsages = ['encrypt', 'decrypt'];
break;
default:
unsupportedAlg(algArgument);
}
return crypto.subtle.generateKey(algorithm, extractable ?? false, keyUsages);
}