| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | ;(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 MD5 = C_algo.MD5;	    /**	     * This key derivation function is meant to conform with EVP_BytesToKey.	     * www.openssl.org/docs/crypto/EVP_BytesToKey.html	     */	    var EvpKDF = C_algo.EvpKDF = Base.extend({	        /**	         * Configuration options.	         *	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)	         * @property {Hasher} hasher The hash algorithm to use. Default: MD5	         * @property {number} iterations The number of iterations to perform. Default: 1	         */	        cfg: Base.extend({	            keySize: 128/32,	            hasher: MD5,	            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.EvpKDF.create();	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });	         */	        init: function (cfg) {	            this.cfg = this.cfg.extend(cfg);	        },	        /**	         * Derives a key from a password.	         *	         * @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) {	            var block;	            // Shortcut	            var cfg = this.cfg;	            // Init hasher	            var hasher = cfg.hasher.create();	            // Initial values	            var derivedKey = WordArray.create();	            // Shortcuts	            var derivedKeyWords = derivedKey.words;	            var keySize = cfg.keySize;	            var iterations = cfg.iterations;	            // Generate key	            while (derivedKeyWords.length < keySize) {	                if (block) {	                    hasher.update(block);	                }	                block = hasher.update(password).finalize(salt);	                hasher.reset();	                // Iterations	                for (var i = 1; i < iterations; i++) {	                    block = hasher.finalize(block);	                    hasher.reset();	                }	                derivedKey.concat(block);	            }	            derivedKey.sigBytes = keySize * 4;	            return derivedKey;	        }	    });	    /**	     * Derives a key from a password.	     *	     * @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.EvpKDF(password, salt);	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });	     */	    C.EvpKDF = function (password, salt, cfg) {	        return EvpKDF.create(cfg).compute(password, salt);	    };	}());	return CryptoJS.EvpKDF;}));
 |