aboutsummaryrefslogtreecommitdiff
path: root/node_modules/sha.js/hash.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/sha.js/hash.js')
-rw-r--r--node_modules/sha.js/hash.js68
1 files changed, 40 insertions, 28 deletions
diff --git a/node_modules/sha.js/hash.js b/node_modules/sha.js/hash.js
index 09579d2de..f7cbd0714 100644
--- a/node_modules/sha.js/hash.js
+++ b/node_modules/sha.js/hash.js
@@ -1,63 +1,75 @@
+var Buffer = require('safe-buffer').Buffer
+
// prototype class for hash functions
function Hash (blockSize, finalSize) {
- this._block = new Buffer(blockSize)
+ this._block = Buffer.alloc(blockSize)
this._finalSize = finalSize
this._blockSize = blockSize
this._len = 0
- this._s = 0
}
Hash.prototype.update = function (data, enc) {
if (typeof data === 'string') {
enc = enc || 'utf8'
- data = new Buffer(data, enc)
+ data = Buffer.from(data, enc)
}
- var l = this._len += data.length
- var s = this._s || 0
- var f = 0
- var buffer = this._block
+ var block = this._block
+ var blockSize = this._blockSize
+ var length = data.length
+ var accum = this._len
- while (s < l) {
- var t = Math.min(data.length, f + this._blockSize - (s % this._blockSize))
- var ch = (t - f)
+ for (var offset = 0; offset < length;) {
+ var assigned = accum % blockSize
+ var remainder = Math.min(length - offset, blockSize - assigned)
- for (var i = 0; i < ch; i++) {
- buffer[(s % this._blockSize) + i] = data[i + f]
+ for (var i = 0; i < remainder; i++) {
+ block[assigned + i] = data[offset + i]
}
- s += ch
- f += ch
+ accum += remainder
+ offset += remainder
- if ((s % this._blockSize) === 0) {
- this._update(buffer)
+ if ((accum % blockSize) === 0) {
+ this._update(block)
}
}
- this._s = s
+ this._len += length
return this
}
Hash.prototype.digest = function (enc) {
- // Suppose the length of the message M, in bits, is l
- var l = this._len * 8
+ var rem = this._len % this._blockSize
- // Append the bit 1 to the end of the message
- this._block[this._len % this._blockSize] = 0x80
+ this._block[rem] = 0x80
- // and then k zero bits, where k is the smallest non-negative solution to the equation (l + 1 + k) === finalSize mod blockSize
- this._block.fill(0, this._len % this._blockSize + 1)
+ // zero (rem + 1) trailing bits, where (rem + 1) is the smallest
+ // non-negative solution to the equation (length + 1 + (rem + 1)) === finalSize mod blockSize
+ this._block.fill(0, rem + 1)
- if (l % (this._blockSize * 8) >= this._finalSize * 8) {
+ if (rem >= this._finalSize) {
this._update(this._block)
this._block.fill(0)
}
- // to this append the block which is equal to the number l written in binary
- // TODO: handle case where l is > Math.pow(2, 29)
- this._block.writeInt32BE(l, this._blockSize - 4)
+ var bits = this._len * 8
+
+ // uint32
+ if (bits <= 0xffffffff) {
+ this._block.writeUInt32BE(bits, this._blockSize - 4)
+
+ // uint64
+ } else {
+ var lowBits = bits & 0xffffffff
+ var highBits = (bits - lowBits) / 0x100000000
+
+ this._block.writeUInt32BE(highBits, this._blockSize - 8)
+ this._block.writeUInt32BE(lowBits, this._blockSize - 4)
+ }
- var hash = this._update(this._block) || this._hash()
+ this._update(this._block)
+ var hash = this._hash()
return enc ? hash.toString(enc) : hash
}