diff --git a/lib/expmt/cbc.js b/lib/expmt/cbc.js index 8a92e2449..68359242d 100644 --- a/lib/expmt/cbc.js +++ b/lib/expmt/cbc.js @@ -27,6 +27,18 @@ CBC.buf2blockbufs = function(buf, blocksize) { return blockbufs; }; +CBC.blockbufs2buf = function(blockbufs, blocksize) { + var bytesize = blocksize / 8; + + var last = blockbufs[blockbufs.length - 1]; + last = CBC.pkcs7unpad(last); + blockbufs[blockbufs.length - 1] = last; + + var buf = Buffer.concat(blockbufs); + + return buf; +}; + CBC.encrypt = function(messagebuf, ivbuf, blockcipher, cipherkeybuf) { var blocksize = ivbuf.length * 8; var blockbufs = CBC.buf2blockbufs(messagebuf, blocksize); diff --git a/test/test.cbc.js b/test/test.cbc.js index f93e80561..c03de0c6d 100644 --- a/test/test.cbc.js +++ b/test/test.cbc.js @@ -34,6 +34,26 @@ describe('CBC', function() { }); + describe('@buf2blockbufs', function() { + + it('should convert this buffer into one block and back into the same buffer', function() { + var buf = new Buffer(16 - 1); + buf.fill(0); + var blockbufs = CBC.buf2blockbufs(buf, 16 * 8); + var buf2 = CBC.blockbufs2buf(blockbufs, 16 * 8); + buf2.toString('hex').should.equal(buf.toString('hex')); + }); + + it('should convert this buffer into two blocks and back into the same buffer', function() { + var buf = new Buffer(16); + buf.fill(0); + var blockbufs = CBC.buf2blockbufs(buf, 16 * 8); + var buf2 = CBC.blockbufs2buf(blockbufs, 16 * 8); + buf2.toString('hex').should.equal(buf.toString('hex')); + }); + + }); + describe('@encrypt', function() { it('should return this known value', function() {