66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'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];
 | 
						|
  }
 | 
						|
};
 |