| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | /*CryptoJS v3.1.2code.google.com/p/crypto-js(c) 2009-2013 by Jeff Mott. All rights reserved.code.google.com/p/crypto-js/wiki/License*/(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);    };}());
 |