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