{"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 = new PBKDF2Algo();\n   *     const kdf = new PBKDF2Algo({ keySize: 8 });\n   *     const kdf = new PBKDF2Algo({ 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 = PBKDF2(password, salt);\n *     var key = PBKDF2(password, salt, { keySize: 8 });\n *     var key = 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"}