|
|
@ -1,5 +1,6 @@ |
|
|
|
var Random = require('../random'); |
|
|
|
|
|
|
|
// Cipher Block Chaining
|
|
|
|
// http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29
|
|
|
|
var CBC = function CBC(blockcipher, cipherkeybuf, ivbuf) { |
|
|
|
if (!(this instanceof CBC)) |
|
|
@ -40,6 +41,12 @@ CBC.encryptblock = function(blockbuf, ivbuf, blockcipher, cipherkeybuf) { |
|
|
|
return encbuf; |
|
|
|
}; |
|
|
|
|
|
|
|
CBC.decryptblock = function(encbuf, ivbuf, blockcipher, cipherkeybuf) { |
|
|
|
var xorbuf = blockcipher.decrypt(encbuf, cipherkeybuf); |
|
|
|
var blockbuf = CBC.xorbufs(xorbuf, ivbuf); |
|
|
|
return blockbuf; |
|
|
|
}; |
|
|
|
|
|
|
|
CBC.encryptblocks = function(blockbufs, ivbuf, blockcipher, cipherkeybuf) { |
|
|
|
var encbufs = []; |
|
|
|
|
|
|
@ -55,6 +62,21 @@ CBC.encryptblocks = function(blockbufs, ivbuf, blockcipher, cipherkeybuf) { |
|
|
|
return encbufs; |
|
|
|
}; |
|
|
|
|
|
|
|
CBC.decryptblocks = function(encbufs, ivbuf, blockcipher, cipherkeybuf) { |
|
|
|
var blockbufs = []; |
|
|
|
|
|
|
|
for (var i = 0; i < encbufs.length; i++) { |
|
|
|
var encbuf = encbufs[i]; |
|
|
|
var blockbuf = CBC.decryptblock(encbuf, ivbuf, blockcipher, cipherkeybuf); |
|
|
|
|
|
|
|
blockbufs.push(blockbuf); |
|
|
|
|
|
|
|
ivbuf = encbuf; |
|
|
|
} |
|
|
|
|
|
|
|
return encbufs; |
|
|
|
}; |
|
|
|
|
|
|
|
CBC.pkcs7pad = function(buf, blocksize) { |
|
|
|
var bytesize = blocksize / 8; |
|
|
|
var padbytesize = bytesize - buf.length; |
|
|
|