aboutsummaryrefslogtreecommitdiffstats
path: root/docs/jsdocs/edge-encryptor.js.html
blob: e85f444b4d1b291450c3375c284357b5c11650dd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
<!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>