Blame view

node_modules/des.js/lib/des/cbc.js 1.41 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  '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];
    }
  };