UNPKG

workcraft-js

Version:

Node module for Workcraft Workers

69 lines (68 loc) 2 kB
import { isJWK } from '../lib/is_jwk.js'; import { decode } from './base64url.js'; import importJWK from './jwk_to_key.js'; const exportKeyValue = (k) => decode(k); let privCache; let pubCache; const isKeyObject = (key) => { return key?.[Symbol.toStringTag] === 'KeyObject'; }; const importAndCache = async (cache, key, jwk, alg, freeze = false) => { let cached = cache.get(key); if (cached?.[alg]) { return cached[alg]; } const cryptoKey = await importJWK({ ...jwk, alg }); if (freeze) Object.freeze(key); if (!cached) { cache.set(key, { [alg]: cryptoKey }); } else { cached[alg] = cryptoKey; } return cryptoKey; }; const normalizePublicKey = (key, alg) => { if (isKeyObject(key)) { let jwk = key.export({ format: 'jwk' }); delete jwk.d; delete jwk.dp; delete jwk.dq; delete jwk.p; delete jwk.q; delete jwk.qi; if (jwk.k) { return exportKeyValue(jwk.k); } pubCache || (pubCache = new WeakMap()); return importAndCache(pubCache, key, jwk, alg); } if (isJWK(key)) { if (key.k) return decode(key.k); pubCache || (pubCache = new WeakMap()); const cryptoKey = importAndCache(pubCache, key, key, alg, true); return cryptoKey; } return key; }; const normalizePrivateKey = (key, alg) => { if (isKeyObject(key)) { let jwk = key.export({ format: 'jwk' }); if (jwk.k) { return exportKeyValue(jwk.k); } privCache || (privCache = new WeakMap()); return importAndCache(privCache, key, jwk, alg); } if (isJWK(key)) { if (key.k) return decode(key.k); privCache || (privCache = new WeakMap()); const cryptoKey = importAndCache(privCache, key, key, alg, true); return cryptoKey; } return key; }; export default { normalizePublicKey, normalizePrivateKey };