From 1c791c4d2e7f280b634a5fe1bb449d5d05c9db7c Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Fri, 14 Oct 2016 15:59:07 -0700 Subject: [PATCH] Got basic encryptor working --- app/scripts/lib/encryptor.js | 44 ++++++++++++++++++++++---- test/integration/lib/encryptor-test.js | 31 ++++++++++++++---- 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/app/scripts/lib/encryptor.js b/app/scripts/lib/encryptor.js index 1ce95954f..207a9fc3c 100644 --- a/app/scripts/lib/encryptor.js +++ b/app/scripts/lib/encryptor.js @@ -1,3 +1,4 @@ +var ethUtil = require('ethereumjs-util') var vector = global.crypto.getRandomValues(new Uint8Array(16)) module.exports = { @@ -7,6 +8,8 @@ module.exports = { keyFromPassword, encryptWithKey, decryptWithKey, + serializeBufferForStorage, + serializeBufferFromStorage, } // Takes a Pojo, returns encrypted text. @@ -24,10 +27,9 @@ function encryptWithKey (key, dataObj) { return global.crypto.subtle.encrypt({ name: 'AES-GCM', iv: vector - }, key, dataBuffer).then(function(result){ - const encryptedData = new Uint8Array(result) - const encryptedStr = encryptedData.toString() - return encryptedStr + }, key, dataBuffer).then(function(buf){ + var buffer = new Uint8Array(buf) + return serializeBufferForStorage(buffer) }) } @@ -41,11 +43,12 @@ function decrypt (password, text) { // AUDIT: See if this still works when generating a fresh vector function decryptWithKey (key, text) { - return crypto.subtle.decrypt({name: "AES-CBC", iv: vector}, key, encrypted_data) + const encryptedData = serializeBufferFromStorage(text) + return crypto.subtle.decrypt({name: "AES-GCM", iv: vector}, key, encryptedData) .then(function(result){ - debugger const decryptedData = new Uint8Array(result) - const decryptedStr = convertArrayBufferViewtoString(decryptedData)) + const decryptedStr = convertArrayBufferViewtoString(decryptedData) + const numArr = decryptedStr.split(',') const decryptedObj = JSON.parse(decryptedStr) return decryptedObj }) @@ -77,3 +80,30 @@ function keyFromPassword (password) { }) } +function serializeBufferFromStorage (str) { + str = ethUtil.stripHexPrefix(str) + var buf = new Uint8Array(str.length/2) + for (var i = 0; i < str.length; i+= 2) { + var seg = str.substr(i, 2) + buf[i/2] = parseInt(seg, 16) + } + return buf +} + +// Should return a string, ready for storage, in hex format. +function serializeBufferForStorage (buffer) { + var result = '0x' + var len = buffer.length || buffer.byteLength + for (var i = 0; i < len; i++) { + result += unprefixedHex(buffer[i]) + } + return result +} + +function unprefixedHex (num) { + var hex = num.toString(16) + while (hex.length < 2) { + hex = '0' + hex + } + return hex +} diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js index f5cdea835..3297ad177 100644 --- a/test/integration/lib/encryptor-test.js +++ b/test/integration/lib/encryptor-test.js @@ -1,6 +1,27 @@ var encryptor = require('../../../app/scripts/lib/encryptor') -QUnit.test('encryptor', function(assert) { +QUnit.test('encryptor:serializeBufferForStorage', function (assert) { + assert.expect(1) + var buf = new Buffer(2) + buf[0] = 16 + buf[1] = 1 + + var output = encryptor.serializeBufferForStorage(buf) + + var expect = '0x1001' + assert.equal(expect, output) +}) + +QUnit.test('encryptor:serializeBufferFromStorage', function (assert) { + assert.expect(2) + var input = '0x1001' + var output = encryptor.serializeBufferFromStorage(input) + + assert.equal(output[0], 16) + assert.equal(output[1], 1) +}) + +QUnit.test('encryptor:encrypt & decrypt', function(assert) { var done = assert.async(); var password, data, encrypted @@ -9,19 +30,15 @@ QUnit.test('encryptor', function(assert) { encryptor.encrypt(password, data) .then(function(encryptedStr) { - assert.equal(typeof encryptedStr, 'string', 'returns a string') - - // Now try decrypting!jk - // return encryptor.decrypt(password, encryptedStr) - }) .then(function (decryptedObj) { - assert.equal(decryptedObj, data, 'decrypted what was encrypted') + assert.deepEqual(decryptedObj, data, 'decrypted what was encrypted') done() }) .catch(function(reason) { + debugger assert.ifError(reason, 'threw an error') })