| ;(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; | 
|             } | 
|         }); | 
|     }()); | 
|   | 
|   | 
| })); |