UNPKG

jose

Version:

Universal 'JSON Web Almost Everything' - JWA, JWS, JWE, JWT, JWK with no dependencies

95 lines (94 loc) 4.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const errors_js_1 = require("../util/errors.js"); const aeskw_js_1 = require("../runtime/aeskw.js"); const ECDH = require("../runtime/ecdhes.js"); const pbes2kw_js_1 = require("../runtime/pbes2kw.js"); const rsaes_js_1 = require("../runtime/rsaes.js"); const aesgcmkw_js_1 = require("../runtime/aesgcmkw.js"); const base64url_js_1 = require("../runtime/base64url.js"); const cek_js_1 = require("../lib/cek.js"); function assertEnryptedKey(encryptedKey) { if (!encryptedKey) { throw new errors_js_1.JWEInvalid('JWE Encrypted Key missing'); } } function assertHeaderParameter(joseHeader, parameter, name) { if (joseHeader[parameter] === undefined) { throw new errors_js_1.JWEInvalid(`JOSE Header ${name} (${parameter}) missing`); } } async function decryptKeyManagement(alg, key, encryptedKey, joseHeader) { switch (alg) { case 'dir': { if (encryptedKey !== undefined) { throw new errors_js_1.JWEInvalid('Encountered unexpected JWE Encrypted Key'); } return key; } case 'ECDH-ES': if (encryptedKey !== undefined) { throw new errors_js_1.JWEInvalid('Encountered unexpected JWE Encrypted Key'); } case 'ECDH-ES+A128KW': case 'ECDH-ES+A192KW': case 'ECDH-ES+A256KW': { assertHeaderParameter(joseHeader, 'epk', 'Ephemeral Public Key'); if (!ECDH.ecdhAllowed(key)) { throw new errors_js_1.JOSENotSupported('ECDH-ES with the provided key is not allowed or not supported by your javascript runtime'); } const ephemeralKey = await ECDH.publicJwkToEphemeralKey(joseHeader.epk); let partyUInfo; let partyVInfo; if (joseHeader.apu !== undefined) partyUInfo = base64url_js_1.decode(joseHeader.apu); if (joseHeader.apv !== undefined) partyVInfo = base64url_js_1.decode(joseHeader.apv); const sharedSecret = await ECDH.deriveKey(ephemeralKey, key, alg === 'ECDH-ES' ? joseHeader.enc : alg, parseInt(alg.substr(-5, 3), 10) || cek_js_1.bitLengths.get(joseHeader.enc), partyUInfo, partyVInfo); if (alg === 'ECDH-ES') { return sharedSecret; } assertEnryptedKey(encryptedKey); const kwAlg = alg.substr(-6); return aeskw_js_1.unwrap(kwAlg, sharedSecret, encryptedKey); } case 'RSA1_5': case 'RSA-OAEP': case 'RSA-OAEP-256': case 'RSA-OAEP-384': case 'RSA-OAEP-512': { assertEnryptedKey(encryptedKey); return rsaes_js_1.decrypt(alg, key, encryptedKey); } case 'PBES2-HS256+A128KW': case 'PBES2-HS384+A192KW': case 'PBES2-HS512+A256KW': { assertEnryptedKey(encryptedKey); assertHeaderParameter(joseHeader, 'p2c', 'PBES2 Count'); assertHeaderParameter(joseHeader, 'p2s', 'PBES2 Salt'); const { p2c } = joseHeader; const p2s = base64url_js_1.decode(joseHeader.p2s); return pbes2kw_js_1.decrypt(alg, key, encryptedKey, p2c, p2s); } case 'A128KW': case 'A192KW': case 'A256KW': { assertEnryptedKey(encryptedKey); return aeskw_js_1.unwrap(alg, key, encryptedKey); } case 'A128GCMKW': case 'A192GCMKW': case 'A256GCMKW': { assertEnryptedKey(encryptedKey); assertHeaderParameter(joseHeader, 'iv', 'Initialization Vector'); assertHeaderParameter(joseHeader, 'tag', 'Authentication Tag'); const iv = base64url_js_1.decode(joseHeader.iv); const tag = base64url_js_1.decode(joseHeader.tag); return aesgcmkw_js_1.unwrap(alg, key, encryptedKey, iv, tag); } default: { throw new errors_js_1.JOSENotSupported('unsupported or invalid "alg" (JWE Algorithm) header value'); } } } exports.default = decryptKeyManagement;