| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 | ;(function (root, factory, undef) {	if (typeof exports === "object") {		// CommonJS		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));	}	else if (typeof define === "function" && define.amd) {		// AMD		define(["./core", "./sha1", "./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 SHA1 = C_algo.SHA1;	    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: SHA1	         * @property {number} iterations The number of iterations to perform. Default: 1	         */	        cfg: Base.extend({	            keySize: 128/32,	            hasher: SHA1,	            iterations: 1	        }),	        /**	         * 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;}));
 |