| 'use strict'; |
| |
| var assert = require('minimalistic-assert'); |
| var inherits = require('inherits'); |
| |
| var proto = {}; |
| |
| function CBCState(iv) { |
| assert.equal(iv.length, 8, 'Invalid IV length'); |
| |
| this.iv = new Array(8); |
| for (var i = 0; i < this.iv.length; i++) |
| this.iv[i] = iv[i]; |
| } |
| |
| function instantiate(Base) { |
| function CBC(options) { |
| Base.call(this, options); |
| this._cbcInit(); |
| } |
| inherits(CBC, Base); |
| |
| var keys = Object.keys(proto); |
| for (var i = 0; i < keys.length; i++) { |
| var key = keys[i]; |
| CBC.prototype[key] = proto[key]; |
| } |
| |
| CBC.create = function create(options) { |
| return new CBC(options); |
| }; |
| |
| return CBC; |
| } |
| |
| exports.instantiate = instantiate; |
| |
| proto._cbcInit = function _cbcInit() { |
| var state = new CBCState(this.options.iv); |
| this._cbcState = state; |
| }; |
| |
| proto._update = function _update(inp, inOff, out, outOff) { |
| var state = this._cbcState; |
| var superProto = this.constructor.super_.prototype; |
| |
| var iv = state.iv; |
| if (this.type === 'encrypt') { |
| for (var i = 0; i < this.blockSize; i++) |
| iv[i] ^= inp[inOff + i]; |
| |
| superProto._update.call(this, iv, 0, out, outOff); |
| |
| for (var i = 0; i < this.blockSize; i++) |
| iv[i] = out[outOff + i]; |
| } else { |
| superProto._update.call(this, inp, inOff, out, outOff); |
| |
| for (var i = 0; i < this.blockSize; i++) |
| out[outOff + i] ^= iv[i]; |
| |
| for (var i = 0; i < this.blockSize; i++) |
| iv[i] = inp[inOff + i]; |
| } |
| }; |