;(function (root, factory, undef) { 
 | 
    if (typeof exports === "object") { 
 | 
        // CommonJS 
 | 
        module.exports = exports = factory(require("./core"), require("./sha256"), require("./hmac")); 
 | 
    } 
 | 
    else if (typeof define === "function" && define.amd) { 
 | 
        // AMD 
 | 
        define(["./core", "./sha256", "./hmac"], factory); 
 | 
    } 
 | 
    else { 
 | 
        // Global (browser) 
 | 
        factory(root.CryptoJS); 
 | 
    } 
 | 
}(this, function (CryptoJS) { 
 | 
  
 | 
    (function () { 
 | 
        // Shortcuts 
 | 
        var C = CryptoJS; 
 | 
        var C_lib = C.lib; 
 | 
        var Base = C_lib.Base; 
 | 
        var WordArray = C_lib.WordArray; 
 | 
        var C_algo = C.algo; 
 | 
        var SHA256 = C_algo.SHA256; 
 | 
        var HMAC = C_algo.HMAC; 
 | 
  
 | 
        /** 
 | 
         * Password-Based Key Derivation Function 2 algorithm. 
 | 
         */ 
 | 
        var PBKDF2 = C_algo.PBKDF2 = Base.extend({ 
 | 
            /** 
 | 
             * Configuration options. 
 | 
             * 
 | 
             * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) 
 | 
             * @property {Hasher} hasher The hasher to use. Default: SHA256 
 | 
             * @property {number} iterations The number of iterations to perform. Default: 250000 
 | 
             */ 
 | 
            cfg: Base.extend({ 
 | 
                keySize: 128/32, 
 | 
                hasher: SHA256, 
 | 
                iterations: 250000 
 | 
            }), 
 | 
  
 | 
            /** 
 | 
             * Initializes a newly created key derivation function. 
 | 
             * 
 | 
             * @param {Object} cfg (Optional) The configuration options to use for the derivation. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var kdf = CryptoJS.algo.PBKDF2.create(); 
 | 
             *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); 
 | 
             *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); 
 | 
             */ 
 | 
            init: function (cfg) { 
 | 
                this.cfg = this.cfg.extend(cfg); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Computes the Password-Based Key Derivation Function 2. 
 | 
             * 
 | 
             * @param {WordArray|string} password The password. 
 | 
             * @param {WordArray|string} salt A salt. 
 | 
             * 
 | 
             * @return {WordArray} The derived key. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var key = kdf.compute(password, salt); 
 | 
             */ 
 | 
            compute: function (password, salt) { 
 | 
                // Shortcut 
 | 
                var cfg = this.cfg; 
 | 
  
 | 
                // Init HMAC 
 | 
                var hmac = HMAC.create(cfg.hasher, password); 
 | 
  
 | 
                // Initial values 
 | 
                var derivedKey = WordArray.create(); 
 | 
                var blockIndex = WordArray.create([0x00000001]); 
 | 
  
 | 
                // Shortcuts 
 | 
                var derivedKeyWords = derivedKey.words; 
 | 
                var blockIndexWords = blockIndex.words; 
 | 
                var keySize = cfg.keySize; 
 | 
                var iterations = cfg.iterations; 
 | 
  
 | 
                // Generate key 
 | 
                while (derivedKeyWords.length < keySize) { 
 | 
                    var block = hmac.update(salt).finalize(blockIndex); 
 | 
                    hmac.reset(); 
 | 
  
 | 
                    // Shortcuts 
 | 
                    var blockWords = block.words; 
 | 
                    var blockWordsLength = blockWords.length; 
 | 
  
 | 
                    // Iterations 
 | 
                    var intermediate = block; 
 | 
                    for (var i = 1; i < iterations; i++) { 
 | 
                        intermediate = hmac.finalize(intermediate); 
 | 
                        hmac.reset(); 
 | 
  
 | 
                        // Shortcut 
 | 
                        var intermediateWords = intermediate.words; 
 | 
  
 | 
                        // XOR intermediate with block 
 | 
                        for (var j = 0; j < blockWordsLength; j++) { 
 | 
                            blockWords[j] ^= intermediateWords[j]; 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                    derivedKey.concat(block); 
 | 
                    blockIndexWords[0]++; 
 | 
                } 
 | 
                derivedKey.sigBytes = keySize * 4; 
 | 
  
 | 
                return derivedKey; 
 | 
            } 
 | 
        }); 
 | 
  
 | 
        /** 
 | 
         * Computes the Password-Based Key Derivation Function 2. 
 | 
         * 
 | 
         * @param {WordArray|string} password The password. 
 | 
         * @param {WordArray|string} salt A salt. 
 | 
         * @param {Object} cfg (Optional) The configuration options to use for this computation. 
 | 
         * 
 | 
         * @return {WordArray} The derived key. 
 | 
         * 
 | 
         * @static 
 | 
         * 
 | 
         * @example 
 | 
         * 
 | 
         *     var key = CryptoJS.PBKDF2(password, salt); 
 | 
         *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); 
 | 
         *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); 
 | 
         */ 
 | 
        C.PBKDF2 = function (password, salt, cfg) { 
 | 
            return PBKDF2.create(cfg).compute(password, salt); 
 | 
        }; 
 | 
    }()); 
 | 
  
 | 
  
 | 
    return CryptoJS.PBKDF2; 
 | 
  
 | 
})); 
 |