<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="google" content="notranslate"> <meta http-equiv="Content-Language" content="en"> <title>edge-encryptor.js - Documentation</title> <script src="scripts/prettify/prettify.js"></script> <script src="scripts/prettify/lang-css.js"></script> <script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script> <script src="scripts/semantic.min.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link type="text/css" rel="stylesheet" href="styles/prettify.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc.css"> <link type="text/css" rel="stylesheet" href="styles/semantic.min.css"> <link type="text/css" rel="stylesheet" href="styles/override.css"> </head> <body> <input type="checkbox" id="nav-trigger" class="nav-trigger" /> <label for="nav-trigger" class="navicon-button x"> <div class="navicon"></div> </label> <label for="nav-trigger" class="overlay"></label> <nav> <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><div class="ui vertical accordion"><div class="title"><div class="ui list"><div class="item"><i class="dropdown icon"></i><a href="ComposableObservableStore.html">ComposableObservableStore</a></div></div></div><div class="content"><ul class='methods'><li data-type='method'><a href="ComposableObservableStore.html#getFlatState">getFlatState</a></li><li data-type='method'><a href="ComposableObservableStore.html#updateStructure">updateStructure</a></li></ul></div></li></div><div class="ui vertical accordion"><div class="title"><div class="ui list"><div class="item"><i class="dropdown icon"></i><a href="EdgeEncryptor.html">EdgeEncryptor</a></div></div></div><div class="content"><ul class='methods'><li data-type='method'><a href="EdgeEncryptor.html#decrypt">decrypt</a></li><li data-type='method'><a href="EdgeEncryptor.html#encrypt">encrypt</a></li></ul></div></li></div><div class="ui vertical accordion"><div class="title"><div class="ui list"><div class="item"><i class="dropdown icon"></i><a href="TokenRatesController.html">TokenRatesController</a></div></div></div><div class="content"><ul class='methods'><li data-type='method'><a href="TokenRatesController.html#fetchExchangeRate">fetchExchangeRate</a></li><li data-type='method'><a href="TokenRatesController.html#updateExchangeRates">updateExchangeRates</a></li></ul></div></li></div><div class="ui vertical accordion"><div class="title"><div class="ui list"><div class="item"><i class="inverted dropdown icon"></i><a href="module.exports_module.exports.html">exports</a></div></div></div></li></div></ul><h3>Global</h3><ul><li><a href="global.html#blacklistedDomainCheck">blacklistedDomainCheck</a></li><li><a href="global.html#cleanContextForImports">cleanContextForImports</a></li><li><a href="global.html#config">config</a></li><li><a href="global.html#connectToAccountManager">connectToAccountManager</a></li><li><a href="global.html#doctypeCheck">doctypeCheck</a></li><li><a href="global.html#documentElementCheck">documentElementCheck</a></li><li><a href="global.html#initializePopup">initializePopup</a></li><li><a href="global.html#initialState">initialState</a></li><li><a href="global.html#logStreamDisconnectWarning">logStreamDisconnectWarning</a></li><li><a href="global.html#redirectToPhishingWarning">redirectToPhishingWarning</a></li><li><a href="global.html#restoreContextAfterImports">restoreContextAfterImports</a></li><li><a href="global.html#setupControllerConnection">setupControllerConnection</a></li><li><a href="global.html#setupInjection">setupInjection</a></li><li><a href="global.html#setupStreams">setupStreams</a></li><li><a href="global.html#setupWeb3Connection">setupWeb3Connection</a></li><li><a href="global.html#shouldInjectWeb3">shouldInjectWeb3</a></li><li><a href="global.html#suffixCheck">suffixCheck</a></li></ul> </nav> <div id="main"> <h1 class="page-title">edge-encryptor.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>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) var buffer = new Uint8Array(resultbuffer) var vectorStr = Unibabel.bufferToBase64(vector) var vaultStr = Unibabel.bufferToBase64(buffer) return JSON.stringify({ data: vaultStr, iv: vectorStr, salt: salt, }) }) } /** * 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<Object>} 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) }) }) } /** * 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<Object>} Promise resolving to a derived key */ _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) }) } /** * 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 </code></pre> </article> </section> </div> <br class="clear"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Wed Apr 18 2018 17:21:38 GMT-0400 (EDT) using the radgrad jsdoc theme. Derived from docdash. </footer> <script>prettyPrint();</script> <script src="scripts/linenumber.js"></script> <script>$('.ui.accordion').accordion();</script> </body> </html>