From c9cfcd5253b29ef7240e556a847f525c38729fa0 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Fri, 14 Oct 2016 13:21:00 -0700 Subject: [PATCH] Got encrypting working, not yet decrypting --- .gitignore | 3 +- app/scripts/lib/encryptor.js | 44 +++++++++-- test/integration/bundle.js | 103 ------------------------- test/integration/lib/encryptor-test.js | 15 +++- testem.yml | 1 + 5 files changed, 51 insertions(+), 115 deletions(-) delete mode 100644 test/integration/bundle.js diff --git a/.gitignore b/.gitignore index fa8a9151f..0b649d486 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ dist - node_modules temp .tmp @@ -7,10 +6,10 @@ temp app/bower_components test/bower_components package - .DS_Store builds/ notes.txt app/.DS_Store development/bundle.js builds.zip +test/integration/bundle.js diff --git a/app/scripts/lib/encryptor.js b/app/scripts/lib/encryptor.js index 607825764..1ce95954f 100644 --- a/app/scripts/lib/encryptor.js +++ b/app/scripts/lib/encryptor.js @@ -1,28 +1,54 @@ var vector = global.crypto.getRandomValues(new Uint8Array(16)) -var key = null module.exports = { encrypt, decrypt, convertArrayBufferViewtoString, keyFromPassword, + encryptWithKey, + decryptWithKey, } // Takes a Pojo, returns encrypted text. function encrypt (password, dataObj) { + return keyFromPassword(password) + .then(function (passwordDerivedKey) { + return encryptWithKey(passwordDerivedKey, dataObj) + }) +} + +function encryptWithKey (key, dataObj) { var data = JSON.stringify(dataObj) - global.crypto.subtle.encrypt({name: 'AES-CBC', iv: vector}, key, convertStringToArrayBufferView(data)).then(function(result){ + var dataBuffer = convertStringToArrayBufferView(data) + + return global.crypto.subtle.encrypt({ + name: 'AES-GCM', + iv: vector + }, key, dataBuffer).then(function(result){ const encryptedData = new Uint8Array(result) - return encryptedData - }, - function(e){ - console.log(e.message) + const encryptedStr = encryptedData.toString() + return encryptedStr }) } // Takes encrypted text, returns the restored Pojo. function decrypt (password, text) { + return keyFromPassword(password) + .then(function (key) { + return decryptWithKey(key, 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) + .then(function(result){ + debugger + const decryptedData = new Uint8Array(result) + const decryptedStr = convertArrayBufferViewtoString(decryptedData)) + const decryptedObj = JSON.parse(decryptedStr) + return decryptedObj + }) } function convertStringToArrayBufferView (str) { @@ -44,8 +70,10 @@ function convertArrayBufferViewtoString (buffer) { } function keyFromPassword (password) { - global.crypto.subtle.digest({name: 'SHA-256'}, convertStringToArrayBufferView(password)).then(function(result){ - return global.crypto.subtle.importKey('raw', result, {name: 'AES-CBC'}, false, ['encrypt', 'decrypt']) + var passBuffer = convertStringToArrayBufferView(password) + return global.crypto.subtle.digest('SHA-256', passBuffer) + .then(function (passHash){ + return global.crypto.subtle.importKey('raw', passHash, {name: 'AES-GCM'}, false, ['encrypt', 'decrypt']) }) } diff --git a/test/integration/bundle.js b/test/integration/bundle.js deleted file mode 100644 index 5058259b1..000000000 --- a/test/integration/bundle.js +++ /dev/null @@ -1,103 +0,0 @@ -window.QUnit = QUnit; (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o