;(function (root, factory) { 
 | 
    if (typeof exports === "object") { 
 | 
        // CommonJS 
 | 
        module.exports = exports = factory(require("./core")); 
 | 
    } 
 | 
    else if (typeof define === "function" && define.amd) { 
 | 
        // AMD 
 | 
        define(["./core"], 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 C_enc = C.enc; 
 | 
        var Utf8 = C_enc.Utf8; 
 | 
        var C_algo = C.algo; 
 | 
  
 | 
        /** 
 | 
         * HMAC algorithm. 
 | 
         */ 
 | 
        var HMAC = C_algo.HMAC = Base.extend({ 
 | 
            /** 
 | 
             * Initializes a newly created HMAC. 
 | 
             * 
 | 
             * @param {Hasher} hasher The hash algorithm to use. 
 | 
             * @param {WordArray|string} key The secret key. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); 
 | 
             */ 
 | 
            init: function (hasher, key) { 
 | 
                // Init hasher 
 | 
                hasher = this._hasher = new hasher.init(); 
 | 
  
 | 
                // Convert string to WordArray, else assume WordArray already 
 | 
                if (typeof key == 'string') { 
 | 
                    key = Utf8.parse(key); 
 | 
                } 
 | 
  
 | 
                // Shortcuts 
 | 
                var hasherBlockSize = hasher.blockSize; 
 | 
                var hasherBlockSizeBytes = hasherBlockSize * 4; 
 | 
  
 | 
                // Allow arbitrary length keys 
 | 
                if (key.sigBytes > hasherBlockSizeBytes) { 
 | 
                    key = hasher.finalize(key); 
 | 
                } 
 | 
  
 | 
                // Clamp excess bits 
 | 
                key.clamp(); 
 | 
  
 | 
                // Clone key for inner and outer pads 
 | 
                var oKey = this._oKey = key.clone(); 
 | 
                var iKey = this._iKey = key.clone(); 
 | 
  
 | 
                // Shortcuts 
 | 
                var oKeyWords = oKey.words; 
 | 
                var iKeyWords = iKey.words; 
 | 
  
 | 
                // XOR keys with pad constants 
 | 
                for (var i = 0; i < hasherBlockSize; i++) { 
 | 
                    oKeyWords[i] ^= 0x5c5c5c5c; 
 | 
                    iKeyWords[i] ^= 0x36363636; 
 | 
                } 
 | 
                oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; 
 | 
  
 | 
                // Set initial values 
 | 
                this.reset(); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Resets this HMAC to its initial state. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     hmacHasher.reset(); 
 | 
             */ 
 | 
            reset: function () { 
 | 
                // Shortcut 
 | 
                var hasher = this._hasher; 
 | 
  
 | 
                // Reset 
 | 
                hasher.reset(); 
 | 
                hasher.update(this._iKey); 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Updates this HMAC with a message. 
 | 
             * 
 | 
             * @param {WordArray|string} messageUpdate The message to append. 
 | 
             * 
 | 
             * @return {HMAC} This HMAC instance. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     hmacHasher.update('message'); 
 | 
             *     hmacHasher.update(wordArray); 
 | 
             */ 
 | 
            update: function (messageUpdate) { 
 | 
                this._hasher.update(messageUpdate); 
 | 
  
 | 
                // Chainable 
 | 
                return this; 
 | 
            }, 
 | 
  
 | 
            /** 
 | 
             * Finalizes the HMAC computation. 
 | 
             * Note that the finalize operation is effectively a destructive, read-once operation. 
 | 
             * 
 | 
             * @param {WordArray|string} messageUpdate (Optional) A final message update. 
 | 
             * 
 | 
             * @return {WordArray} The HMAC. 
 | 
             * 
 | 
             * @example 
 | 
             * 
 | 
             *     var hmac = hmacHasher.finalize(); 
 | 
             *     var hmac = hmacHasher.finalize('message'); 
 | 
             *     var hmac = hmacHasher.finalize(wordArray); 
 | 
             */ 
 | 
            finalize: function (messageUpdate) { 
 | 
                // Shortcut 
 | 
                var hasher = this._hasher; 
 | 
  
 | 
                // Compute HMAC 
 | 
                var innerHash = hasher.finalize(messageUpdate); 
 | 
                hasher.reset(); 
 | 
                var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); 
 | 
  
 | 
                return hmac; 
 | 
            } 
 | 
        }); 
 | 
    }()); 
 | 
  
 | 
  
 | 
})); 
 |