UNPKG

jose

Version:

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

48 lines (47 loc) 1.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.decrypt = exports.encrypt = void 0; const util_1 = require("util"); const crypto_1 = require("crypto"); const random_js_1 = require("./random.js"); const buffer_utils_js_1 = require("../lib/buffer_utils.js"); const base64url_js_1 = require("./base64url.js"); const aeskw_js_1 = require("./aeskw.js"); const check_p2s_js_1 = require("../lib/check_p2s.js"); const webcrypto_js_1 = require("./webcrypto.js"); const pbkdf2 = util_1.promisify(crypto_1.pbkdf2); exports.encrypt = async (alg, key, cek, p2c = Math.floor(Math.random() * 2049) + 2048, p2s = random_js_1.default(new Uint8Array(16))) => { check_p2s_js_1.default(p2s); const salt = buffer_utils_js_1.p2s(alg, p2s); const keylen = parseInt(alg.substr(13, 3), 10) >> 3; let password; if (webcrypto_js_1.isCryptoKey(key)) { password = webcrypto_js_1.getKeyObject(key).export(); } else if (key instanceof crypto_1.KeyObject) { password = key.export(); } else { password = key; } const derivedKey = await pbkdf2(password, salt, p2c, keylen, `sha${alg.substr(8, 3)}`); const encryptedKey = await aeskw_js_1.wrap(alg.substr(-6), derivedKey, cek); return { encryptedKey, p2c, p2s: base64url_js_1.encode(p2s) }; }; exports.decrypt = async (alg, key, encryptedKey, p2c, p2s) => { check_p2s_js_1.default(p2s); const salt = buffer_utils_js_1.p2s(alg, p2s); const keylen = parseInt(alg.substr(13, 3), 10) >> 3; let password; if (webcrypto_js_1.isCryptoKey(key)) { password = webcrypto_js_1.getKeyObject(key).export(); } else if (key instanceof crypto_1.KeyObject) { password = key.export(); } else { password = key; } const derivedKey = await pbkdf2(password, salt, p2c, keylen, `sha${alg.substr(8, 3)}`); return aeskw_js_1.unwrap(alg.substr(-6), derivedKey, encryptedKey); };