aboutsummaryrefslogblamecommitdiffstats
path: root/docs/jsdocs/edge-encryptor.js.html
blob: e85f444b4d1b291450c3375c284357b5c11650dd (plain) (tree)





































































































































































                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
<!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&lt;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&lt;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>