From c9f83fe8bc60a87876242a2dfb5350fceafffca1 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Wed, 18 Apr 2018 17:02:08 -0400 Subject: Add JSDoc to various background scripts --- app/scripts/edge-encryptor.js | 142 +++++++++++++++++++++++++----------------- 1 file changed, 85 insertions(+), 57 deletions(-) (limited to 'app/scripts/edge-encryptor.js') diff --git a/app/scripts/edge-encryptor.js b/app/scripts/edge-encryptor.js index 24c0c93a8..5f6699746 100644 --- a/app/scripts/edge-encryptor.js +++ b/app/scripts/edge-encryptor.js @@ -1,69 +1,97 @@ const asmcrypto = require('asmcrypto.js') const Unibabel = require('browserify-unibabel') +/** + * A Microsoft Edge-specific encryption class that exposes + * the interface expected by eth-keykeyring-controller + */ class EdgeEncryptor { + /** + * Encrypts an arbitrary JavaScript object to cypher text + * + * @param {string} password Password used to unlock a cryptographic key + * @param {Object} dataObject Data to encrypt + * @returns {Object} Object containing cypher text, generation vectors, and salt + */ + encrypt (password, dataObject) { + var salt = this._generateSalt() + return this._keyFromPassword(password, salt) + .then(function (key) { + var data = JSON.stringify(dataObject) + var dataBuffer = Unibabel.utf8ToBuffer(data) + var vector = global.crypto.getRandomValues(new Uint8Array(16)) + var resultbuffer = asmcrypto.AES_GCM.encrypt(dataBuffer, key, vector) - encrypt (password, dataObject) { + var buffer = new Uint8Array(resultbuffer) + var vectorStr = Unibabel.bufferToBase64(vector) + var vaultStr = Unibabel.bufferToBase64(buffer) + return JSON.stringify({ + data: vaultStr, + iv: vectorStr, + salt: salt, + }) + }) + } - var salt = this._generateSalt() - return this._keyFromPassword(password, salt) - .then(function (key) { + /** + * Decrypts an arbitrary JavaScript object from cypher text + * + * @param {string} password Password used to unlock a cryptographic key + * @param {string} text Cypher text of an encrypted JavaScript object + * @returns {Promise} Promise resolving to copy of decrypted JavaScript object + */ + decrypt (password, text) { + const payload = JSON.parse(text) + const salt = payload.salt + return this._keyFromPassword(password, salt) + .then(function (key) { + const encryptedData = Unibabel.base64ToBuffer(payload.data) + const vector = Unibabel.base64ToBuffer(payload.iv) + return new Promise((resolve, reject) => { + var result + try { + result = asmcrypto.AES_GCM.decrypt(encryptedData, key, vector) + } catch (err) { + return reject(new Error('Incorrect password')) + } + const decryptedData = new Uint8Array(result) + const decryptedStr = Unibabel.bufferToUtf8(decryptedData) + const decryptedObj = JSON.parse(decryptedStr) + resolve(decryptedObj) + }) + }) + } - var data = JSON.stringify(dataObject) - var dataBuffer = Unibabel.utf8ToBuffer(data) - var vector = global.crypto.getRandomValues(new Uint8Array(16)) - var resultbuffer = asmcrypto.AES_GCM.encrypt(dataBuffer, key, vector) + /** + * Retrieves a cryptographic key using a password + * + * @private + * @param {string} password Password used to unlock a cryptographic key + * @param {string} salt Random base-64 data + * @returns {Promise} Promise resolving to a derived key + */ + _keyFromPassword (password, salt) { - var buffer = new Uint8Array(resultbuffer) - var vectorStr = Unibabel.bufferToBase64(vector) - var vaultStr = Unibabel.bufferToBase64(buffer) - return JSON.stringify({ - data: vaultStr, - iv: vectorStr, - salt: salt, - }) - }) - } + var passBuffer = Unibabel.utf8ToBuffer(password) + var saltBuffer = Unibabel.base64ToBuffer(salt) + return new Promise((resolve) => { + var key = asmcrypto.PBKDF2_HMAC_SHA256.bytes(passBuffer, saltBuffer, 10000) + resolve(key) + }) + } - decrypt (password, text) { - - const payload = JSON.parse(text) - const salt = payload.salt - return this._keyFromPassword(password, salt) - .then(function (key) { - const encryptedData = Unibabel.base64ToBuffer(payload.data) - const vector = Unibabel.base64ToBuffer(payload.iv) - return new Promise((resolve, reject) => { - var result - try { - result = asmcrypto.AES_GCM.decrypt(encryptedData, key, vector) - } catch (err) { - return reject(new Error('Incorrect password')) - } - const decryptedData = new Uint8Array(result) - const decryptedStr = Unibabel.bufferToUtf8(decryptedData) - const decryptedObj = JSON.parse(decryptedStr) - resolve(decryptedObj) - }) - }) - } - - _keyFromPassword (password, salt) { - - var passBuffer = Unibabel.utf8ToBuffer(password) - var saltBuffer = Unibabel.base64ToBuffer(salt) - return new Promise((resolve) => { - var key = asmcrypto.PBKDF2_HMAC_SHA256.bytes(passBuffer, saltBuffer, 10000) - resolve(key) - }) - } - - _generateSalt (byteCount = 32) { - var view = new Uint8Array(byteCount) - global.crypto.getRandomValues(view) - var b64encoded = btoa(String.fromCharCode.apply(null, view)) - return b64encoded - } + /** + * Generates random base-64 encoded data + * + * @private + * @returns {string} Randomized base-64 encoded data + */ + _generateSalt (byteCount = 32) { + var view = new Uint8Array(byteCount) + global.crypto.getRandomValues(view) + var b64encoded = btoa(String.fromCharCode.apply(null, view)) + return b64encoded + } } module.exports = EdgeEncryptor -- cgit From 1ef6528921263fb9dbae35476a1d9827e1d87508 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Wed, 18 Apr 2018 21:30:13 -0400 Subject: Add JSDoc to various background scripts --- app/scripts/edge-encryptor.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'app/scripts/edge-encryptor.js') diff --git a/app/scripts/edge-encryptor.js b/app/scripts/edge-encryptor.js index 5f6699746..d2e985790 100644 --- a/app/scripts/edge-encryptor.js +++ b/app/scripts/edge-encryptor.js @@ -7,11 +7,11 @@ const Unibabel = require('browserify-unibabel') */ class EdgeEncryptor { /** - * Encrypts an arbitrary JavaScript object to cypher text + * Encrypts an arbitrary JavaScript object to ciphertext * - * @param {string} password Password used to unlock a cryptographic key + * @param {string} password Used to generate a key to encrypt the data * @param {Object} dataObject Data to encrypt - * @returns {Object} Object containing cypher text, generation vectors, and salt + * @returns {Promise} Promise resolving to an object with ciphertext */ encrypt (password, dataObject) { var salt = this._generateSalt() @@ -34,10 +34,10 @@ class EdgeEncryptor { } /** - * Decrypts an arbitrary JavaScript object from cypher text + * Decrypts an arbitrary JavaScript object from ciphertext * - * @param {string} password Password used to unlock a cryptographic key - * @param {string} text Cypher text of an encrypted JavaScript object + * @param {string} password Used to generate a key to decrypt the data + * @param {string} text Ciphertext of an encrypted JavaScript object * @returns {Promise} Promise resolving to copy of decrypted JavaScript object */ decrypt (password, text) { -- cgit From 8636f3bae547ace7d099a3ed516bf013dfe3858e Mon Sep 17 00:00:00 2001 From: bitpshr Date: Thu, 19 Apr 2018 15:12:04 -0400 Subject: Clean up JSDoc for background scripts --- app/scripts/edge-encryptor.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'app/scripts/edge-encryptor.js') diff --git a/app/scripts/edge-encryptor.js b/app/scripts/edge-encryptor.js index d2e985790..dcb06873b 100644 --- a/app/scripts/edge-encryptor.js +++ b/app/scripts/edge-encryptor.js @@ -7,11 +7,11 @@ const Unibabel = require('browserify-unibabel') */ class EdgeEncryptor { /** - * Encrypts an arbitrary JavaScript object to ciphertext + * Encrypts an arbitrary object to ciphertext * * @param {string} password Used to generate a key to encrypt the data * @param {Object} dataObject Data to encrypt - * @returns {Promise} Promise resolving to an object with ciphertext + * @returns {Promise} Promise resolving to an object with ciphertext */ encrypt (password, dataObject) { var salt = this._generateSalt() @@ -34,11 +34,11 @@ class EdgeEncryptor { } /** - * Decrypts an arbitrary JavaScript object from ciphertext + * Decrypts an arbitrary object from ciphertext * * @param {string} password Used to generate a key to decrypt the data - * @param {string} text Ciphertext of an encrypted JavaScript object - * @returns {Promise} Promise resolving to copy of decrypted JavaScript object + * @param {string} text Ciphertext of an encrypted object + * @returns {Promise} Promise resolving to copy of decrypted object */ decrypt (password, text) { const payload = JSON.parse(text) @@ -67,7 +67,7 @@ class EdgeEncryptor { * * @private * @param {string} password Password used to unlock a cryptographic key - * @param {string} salt Random base-64 data + * @param {string} salt Random base64 data * @returns {Promise} Promise resolving to a derived key */ _keyFromPassword (password, salt) { @@ -81,10 +81,10 @@ class EdgeEncryptor { } /** - * Generates random base-64 encoded data + * Generates random base64 encoded data * * @private - * @returns {string} Randomized base-64 encoded data + * @returns {string} Randomized base64 encoded data */ _generateSalt (byteCount = 32) { var view = new Uint8Array(byteCount) -- cgit