| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | 'use strict';var utils = require('./utils');var assert = require('minimalistic-assert');function BlockHash() {  this.pending = null;  this.pendingTotal = 0;  this.blockSize = this.constructor.blockSize;  this.outSize = this.constructor.outSize;  this.hmacStrength = this.constructor.hmacStrength;  this.padLength = this.constructor.padLength / 8;  this.endian = 'big';  this._delta8 = this.blockSize / 8;  this._delta32 = this.blockSize / 32;}exports.BlockHash = BlockHash;BlockHash.prototype.update = function update(msg, enc) {  // Convert message to array, pad it, and join into 32bit blocks  msg = utils.toArray(msg, enc);  if (!this.pending)    this.pending = msg;  else    this.pending = this.pending.concat(msg);  this.pendingTotal += msg.length;  // Enough data, try updating  if (this.pending.length >= this._delta8) {    msg = this.pending;    // Process pending data in blocks    var r = msg.length % this._delta8;    this.pending = msg.slice(msg.length - r, msg.length);    if (this.pending.length === 0)      this.pending = null;    msg = utils.join32(msg, 0, msg.length - r, this.endian);    for (var i = 0; i < msg.length; i += this._delta32)      this._update(msg, i, i + this._delta32);  }  return this;};BlockHash.prototype.digest = function digest(enc) {  this.update(this._pad());  assert(this.pending === null);  return this._digest(enc);};BlockHash.prototype._pad = function pad() {  var len = this.pendingTotal;  var bytes = this._delta8;  var k = bytes - ((len + this.padLength) % bytes);  var res = new Array(k + this.padLength);  res[0] = 0x80;  for (var i = 1; i < k; i++)    res[i] = 0;  // Append length  len <<= 3;  if (this.endian === 'big') {    for (var t = 8; t < this.padLength; t++)      res[i++] = 0;    res[i++] = 0;    res[i++] = 0;    res[i++] = 0;    res[i++] = 0;    res[i++] = (len >>> 24) & 0xff;    res[i++] = (len >>> 16) & 0xff;    res[i++] = (len >>> 8) & 0xff;    res[i++] = len & 0xff;  } else {    res[i++] = len & 0xff;    res[i++] = (len >>> 8) & 0xff;    res[i++] = (len >>> 16) & 0xff;    res[i++] = (len >>> 24) & 0xff;    res[i++] = 0;    res[i++] = 0;    res[i++] = 0;    res[i++] = 0;    for (t = 8; t < this.padLength; t++)      res[i++] = 0;  }  return res;};
 |