| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | 'use strict';var utils = require('./utils');var assert = require('minimalistic-assert');function Hmac(hash, key, enc) {  if (!(this instanceof Hmac))    return new Hmac(hash, key, enc);  this.Hash = hash;  this.blockSize = hash.blockSize / 8;  this.outSize = hash.outSize / 8;  this.inner = null;  this.outer = null;  this._init(utils.toArray(key, enc));}module.exports = Hmac;Hmac.prototype._init = function init(key) {  // Shorten key, if needed  if (key.length > this.blockSize)    key = new this.Hash().update(key).digest();  assert(key.length <= this.blockSize);  // Add padding to key  for (var i = key.length; i < this.blockSize; i++)    key.push(0);  for (i = 0; i < key.length; i++)    key[i] ^= 0x36;  this.inner = new this.Hash().update(key);  // 0x36 ^ 0x5c = 0x6a  for (i = 0; i < key.length; i++)    key[i] ^= 0x6a;  this.outer = new this.Hash().update(key);};Hmac.prototype.update = function update(msg, enc) {  this.inner.update(msg, enc);  return this;};Hmac.prototype.digest = function digest(enc) {  this.outer.update(this.inner.digest());  return this.outer.digest(enc);};
 |