'use strict';

var assert = require('assert');
var crypto = require('crypto');
var Buffer = require('buffer').Buffer;

var des = require('../');

var fixtures = require('./fixtures');
var bin = fixtures.bin;

describe('DES-EDE-CBC', function() {
  var CBC = des.CBC.instantiate(des.EDE);

  describe('encryption/decryption', function() {
    var vectors = [
      {
        key: new Array(4).join('133457799bbcdff1'),
        iv: '0102030405060708',
        input: '0123456789abcdef'
      },
      {
        key: new Array(4).join('0000000000000000'),
        iv: 'ffffffffffffffff',
        input: '0000000000000000'
      },
      {
        key: new Array(4).join('a3a3a3a3b3b3b3b3'),
        iv: 'cdcdcdcdcdcdcdcd',
        input: 'cccccccccccccccc'
      },
      {
        key: new Array(4).join('deadbeefabbadead'),
        iv: 'a0da0da0da0da0da',
        input: '0102030405060708090a'
      },
      {
        key: 'aabbccddeeff0011' + '1111222233334444' + 'ffffeeeeddddcccc',
        iv: 'fefefefefefefefe',
        input: '0102030405060708090a0102030405060708090a0102030405060708090a' +
               '0102030405060708090a0102030405060607080a0102030405060708090a'
      }
    ];

    vectors.forEach(function(vec, i) {
      it('should encrypt vector ' + i, function() {
        var key = new Buffer(vec.key, 'hex');
        var iv = new Buffer(vec.iv, 'hex');
        var input = new Buffer(vec.input, 'hex');

        var enc = CBC.create({
          type: 'encrypt',
          key: key,
          iv: iv
        });
        var out = new Buffer(enc.update(input).concat(enc.final()));

        var cipher = crypto.createCipheriv('des-ede3-cbc', key, iv);
        var expected = Buffer.concat([ cipher.update(input), cipher.final() ]);

        assert.deepEqual(out, expected);

        var dec = CBC.create({
          type: 'decrypt',
          key: key,
          iv: iv
        });
        assert.deepEqual(new Buffer(dec.update(out).concat(dec.final())),
                         input);
      });
    });
  });
});
