crypto-es
Version:
A cryptography algorithms library compatible with ES6 and TypeScript
1 lines • 4.78 kB
Source Map (JSON)
{"version":3,"file":"pbkdf2.mjs","names":[],"sources":["../src/pbkdf2.ts"],"sourcesContent":["import {\n Base,\n WordArray,\n} from './core';\nimport { SHA256Algo } from './sha256';\nimport { HMAC } from './hmac';\n\ninterface PBKDF2Cfg {\n keySize?: number;\n hasher?: typeof SHA256Algo;\n iterations?: number;\n}\n\n/**\n * Password-Based Key Derivation Function 2 algorithm.\n */\nexport class PBKDF2Algo extends Base {\n cfg: PBKDF2Cfg;\n\n /**\n * Initializes a newly created key derivation function.\n *\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n *\n * @example\n *\n * const kdf = CryptoJS.algo.PBKDF2.create();\n * const kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n * const kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n */\n constructor(cfg?: PBKDF2Cfg) {\n super();\n\n /**\n * Configuration options.\n * \n * The default `hasher` and `interations` is different from CryptoJs to enhance security:\n * https://github.com/entronad/crypto-es/security/advisories/GHSA-mpj8-q39x-wq5h\n *\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n * @property {Hasher} hasher The hasher to use. Default: SHA256\n * @property {number} iterations The number of iterations to perform. Default: 250000\n */\n this.cfg = Object.assign(\n {},\n {\n keySize: 128 / 32,\n hasher: SHA256Algo,\n iterations: 250000,\n },\n cfg,\n );\n }\n\n /**\n * Computes the Password-Based Key Derivation Function 2.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n *\n * @return {WordArray} The derived key.\n *\n * @example\n *\n * const key = kdf.compute(password, salt);\n */\n compute(password: WordArray | string, salt: WordArray | string): WordArray {\n // Shortcut\n const { cfg } = this;\n\n // Init HMAC\n const hmac = HMAC.create(cfg.hasher!, password);\n\n // Initial values\n const derivedKey = WordArray.create();\n const blockIndex = WordArray.create([0x00000001]);\n\n // Shortcuts\n const derivedKeyWords = derivedKey.words;\n const blockIndexWords = blockIndex.words;\n const { keySize, iterations } = cfg;\n\n // Generate key\n while (derivedKeyWords.length < keySize!) {\n const block = hmac.update(salt).finalize(blockIndex);\n hmac.reset();\n\n // Shortcuts\n const blockWords = block.words;\n const blockWordsLength = blockWords.length;\n\n // Iterations\n let intermediate = block;\n for (let i = 1; i < iterations!; i += 1) {\n intermediate = hmac.finalize(intermediate);\n hmac.reset();\n\n // Shortcut\n const intermediateWords = intermediate.words;\n\n // XOR intermediate with block\n for (let j = 0; j < blockWordsLength; j += 1) {\n blockWords[j] ^= intermediateWords[j];\n }\n }\n\n derivedKey.concat(block);\n blockIndexWords[0] += 1;\n }\n derivedKey.sigBytes = keySize! * 4;\n\n return derivedKey;\n }\n}\n\n/**\n * Computes the Password-Based Key Derivation Function 2.\n *\n * @param {WordArray|string} password The password.\n * @param {WordArray|string} salt A salt.\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\n *\n * @return {WordArray} The derived key.\n *\n * @static\n *\n * @example\n *\n * var key = CryptoJS.PBKDF2(password, salt);\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n */\nexport const PBKDF2 = (password: WordArray | string, salt: WordArray | string, cfg?: PBKDF2Cfg): WordArray => new PBKDF2Algo(cfg).compute(password, salt);"],"mappings":";;;;;;;AAgBA,IAAa,aAAb,cAAgC,KAAK;CACnC;;;;;;;;;;;;CAaA,YAAY,KAAiB;AAC3B;;;;;;;;;;;AAYA,OAAK,MAAM,OAAO,OAChB,EAAE,EACF;GACE,SAAS,MAAM;GACf,QAAQ;GACR,YAAY;GACb,EACD;CAEH;;;;;;;;;;;;;CAcD,QAAQ,UAA8B,MAAqC;EAEzE,MAAM,EAAE,KAAK,GAAG;EAGhB,MAAM,OAAO,KAAK,OAAO,IAAI,QAAS;EAGtC,MAAM,aAAa,UAAU;EAC7B,MAAM,aAAa,UAAU,OAAO,CAAC,EAAW;EAGhD,MAAM,kBAAkB,WAAW;EACnC,MAAM,kBAAkB,WAAW;EACnC,MAAM,EAAE,SAAS,YAAY,GAAG;AAGhC,SAAO,gBAAgB,SAAS,SAAU;GACxC,MAAM,QAAQ,KAAK,OAAO,MAAM,SAAS;AACzC,QAAK;GAGL,MAAM,aAAa,MAAM;GACzB,MAAM,mBAAmB,WAAW;GAGpC,IAAI,eAAe;AACnB,QAAK,IAAI,IAAI,GAAG,IAAI,YAAa,KAAK,GAAG;AACvC,mBAAe,KAAK,SAAS;AAC7B,SAAK;IAGL,MAAM,oBAAoB,aAAa;AAGvC,SAAK,IAAI,IAAI,GAAG,IAAI,kBAAkB,KAAK,EACzC,YAAW,MAAM,kBAAkB;GAEtC;AAED,cAAW,OAAO;AAClB,mBAAgB,MAAM;EACvB;AACD,aAAW,WAAW,UAAW;AAEjC,SAAO;CACR;AACF;;;;;;;;;;;;;;;;;;AAmBD,MAAa,UAAU,UAA8B,MAA0B,QAA+B,IAAI,WAAW,KAAK,QAAQ,UAAU"}