aboutsummaryrefslogtreecommitdiff
path: root/node_modules/browserify-aes/authCipher.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/browserify-aes/authCipher.js')
-rw-r--r--node_modules/browserify-aes/authCipher.js128
1 files changed, 74 insertions, 54 deletions
diff --git a/node_modules/browserify-aes/authCipher.js b/node_modules/browserify-aes/authCipher.js
index 1107a01a5..c6e8a76cb 100644
--- a/node_modules/browserify-aes/authCipher.js
+++ b/node_modules/browserify-aes/authCipher.js
@@ -1,42 +1,79 @@
var aes = require('./aes')
+var Buffer = require('safe-buffer').Buffer
var Transform = require('cipher-base')
var inherits = require('inherits')
var GHASH = require('./ghash')
var xor = require('buffer-xor')
-inherits(StreamCipher, Transform)
-module.exports = StreamCipher
+var incr32 = require('./incr32')
-function StreamCipher (mode, key, iv, decrypt) {
- if (!(this instanceof StreamCipher)) {
- return new StreamCipher(mode, key, iv)
+function xorTest (a, b) {
+ var out = 0
+ if (a.length !== b.length) out++
+
+ var len = Math.min(a.length, b.length)
+ for (var i = 0; i < len; ++i) {
+ out += (a[i] ^ b[i])
+ }
+
+ return out
+}
+
+function calcIv (self, iv, ck) {
+ if (iv.length === 12) {
+ self._finID = Buffer.concat([iv, Buffer.from([0, 0, 0, 1])])
+ return Buffer.concat([iv, Buffer.from([0, 0, 0, 2])])
+ }
+ var ghash = new GHASH(ck)
+ var len = iv.length
+ var toPad = len % 16
+ ghash.update(iv)
+ if (toPad) {
+ toPad = 16 - toPad
+ ghash.update(Buffer.alloc(toPad, 0))
}
+ ghash.update(Buffer.alloc(8, 0))
+ var ivBits = len * 8
+ var tail = Buffer.alloc(8)
+ tail.writeUIntBE(ivBits, 0, 8)
+ ghash.update(tail)
+ self._finID = ghash.state
+ var out = Buffer.from(self._finID)
+ incr32(out)
+ return out
+}
+function StreamCipher (mode, key, iv, decrypt) {
Transform.call(this)
- this._finID = Buffer.concat([iv, new Buffer([0, 0, 0, 1])])
- iv = Buffer.concat([iv, new Buffer([0, 0, 0, 2])])
+
+ var h = Buffer.alloc(4, 0)
+
this._cipher = new aes.AES(key)
- this._prev = new Buffer(iv.length)
- this._cache = new Buffer('')
- this._secCache = new Buffer('')
+ var ck = this._cipher.encryptBlock(h)
+ this._ghash = new GHASH(ck)
+ iv = calcIv(this, iv, ck)
+
+ this._prev = Buffer.from(iv)
+ this._cache = Buffer.allocUnsafe(0)
+ this._secCache = Buffer.allocUnsafe(0)
this._decrypt = decrypt
this._alen = 0
this._len = 0
- iv.copy(this._prev)
this._mode = mode
- var h = new Buffer(4)
- h.fill(0)
- this._ghash = new GHASH(this._cipher.encryptBlock(h))
+
this._authTag = null
this._called = false
}
+
+inherits(StreamCipher, Transform)
+
StreamCipher.prototype._update = function (chunk) {
if (!this._called && this._alen) {
var rump = 16 - (this._alen % 16)
if (rump < 16) {
- rump = new Buffer(rump)
- rump.fill(0)
+ rump = Buffer.alloc(rump, 0)
this._ghash.update(rump)
}
}
+
this._called = true
var out = this._mode.encrypt(this, chunk)
if (this._decrypt) {
@@ -47,51 +84,34 @@ StreamCipher.prototype._update = function (chunk) {
this._len += chunk.length
return out
}
+
StreamCipher.prototype._final = function () {
- if (this._decrypt && !this._authTag) {
- throw new Error('Unsupported state or unable to authenticate data')
- }
+ if (this._decrypt && !this._authTag) throw new Error('Unsupported state or unable to authenticate data')
+
var tag = xor(this._ghash.final(this._alen * 8, this._len * 8), this._cipher.encryptBlock(this._finID))
- if (this._decrypt) {
- if (xorTest(tag, this._authTag)) {
- throw new Error('Unsupported state or unable to authenticate data')
- }
- } else {
- this._authTag = tag
- }
+ if (this._decrypt && xorTest(tag, this._authTag)) throw new Error('Unsupported state or unable to authenticate data')
+
+ this._authTag = tag
this._cipher.scrub()
}
+
StreamCipher.prototype.getAuthTag = function getAuthTag () {
- if (!this._decrypt && Buffer.isBuffer(this._authTag)) {
- return this._authTag
- } else {
- throw new Error('Attempting to get auth tag in unsupported state')
- }
+ if (this._decrypt || !Buffer.isBuffer(this._authTag)) throw new Error('Attempting to get auth tag in unsupported state')
+
+ return this._authTag
}
+
StreamCipher.prototype.setAuthTag = function setAuthTag (tag) {
- if (this._decrypt) {
- this._authTag = tag
- } else {
- throw new Error('Attempting to set auth tag in unsupported state')
- }
+ if (!this._decrypt) throw new Error('Attempting to set auth tag in unsupported state')
+
+ this._authTag = tag
}
+
StreamCipher.prototype.setAAD = function setAAD (buf) {
- if (!this._called) {
- this._ghash.update(buf)
- this._alen += buf.length
- } else {
- throw new Error('Attempting to set AAD in unsupported state')
- }
-}
-function xorTest (a, b) {
- var out = 0
- if (a.length !== b.length) {
- out++
- }
- var len = Math.min(a.length, b.length)
- var i = -1
- while (++i < len) {
- out += (a[i] ^ b[i])
- }
- return out
+ if (this._called) throw new Error('Attempting to set AAD in unsupported state')
+
+ this._ghash.update(buf)
+ this._alen += buf.length
}
+
+module.exports = StreamCipher