diff options
author | Dan Finlay <542863+danfinlay@users.noreply.github.com> | 2018-03-07 01:39:57 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-07 01:39:57 +0800 |
commit | dd9cac69aed9a16f9bcf738e90dcd2c864f07bb5 (patch) | |
tree | ecf1ef9b50f3ad61293d56b4aca4d632ee884ad6 /app | |
parent | 5f8a632fec0e83b148e4e0b7fc95339fb870d804 (diff) | |
parent | d8038c0de046e7e34f019143eb74238a13a1d69e (diff) | |
download | tangerine-wallet-browser-dd9cac69aed9a16f9bcf738e90dcd2c864f07bb5.tar tangerine-wallet-browser-dd9cac69aed9a16f9bcf738e90dcd2c864f07bb5.tar.gz tangerine-wallet-browser-dd9cac69aed9a16f9bcf738e90dcd2c864f07bb5.tar.bz2 tangerine-wallet-browser-dd9cac69aed9a16f9bcf738e90dcd2c864f07bb5.tar.lz tangerine-wallet-browser-dd9cac69aed9a16f9bcf738e90dcd2c864f07bb5.tar.xz tangerine-wallet-browser-dd9cac69aed9a16f9bcf738e90dcd2c864f07bb5.tar.zst tangerine-wallet-browser-dd9cac69aed9a16f9bcf738e90dcd2c864f07bb5.zip |
Merge pull request #3309 from scsaba/edge-support
Add Edge Support
Diffstat (limited to 'app')
-rw-r--r-- | app/scripts/background.js | 8 | ||||
-rw-r--r-- | app/scripts/edge-encryptor.js | 69 |
2 files changed, 77 insertions, 0 deletions
diff --git a/app/scripts/background.js b/app/scripts/background.js index 4487ff318..601ae0372 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -16,6 +16,7 @@ const firstTimeState = require('./first-time-state') const setupRaven = require('./lib/setupRaven') const reportFailedTxToSentry = require('./lib/reportFailedTxToSentry') const setupMetamaskMeshMetrics = require('./lib/setupMetamaskMeshMetrics') +const EdgeEncryptor = require('./edge-encryptor') const STORAGE_KEY = 'metamask-config' @@ -32,6 +33,12 @@ global.METAMASK_NOTIFIER = notificationManager const release = platform.getVersion() const raven = setupRaven({ release }) +// browser check if it is Edge - https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser +// Internet Explorer 6-11 +const isIE = !!document.documentMode +// Edge 20+ +const isEdge = !isIE && !!window.StyleMedia + let popupIsOpen = false let openMetamaskTabsIDs = {} @@ -81,6 +88,7 @@ function setupController (initState) { initState, // platform specific api platform, + encryptor: isEdge ? new EdgeEncryptor() : undefined, }) global.metamaskController = controller diff --git a/app/scripts/edge-encryptor.js b/app/scripts/edge-encryptor.js new file mode 100644 index 000000000..24c0c93a8 --- /dev/null +++ b/app/scripts/edge-encryptor.js @@ -0,0 +1,69 @@ +const asmcrypto = require('asmcrypto.js') +const Unibabel = require('browserify-unibabel') + +class EdgeEncryptor { + + 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, + }) + }) + } + + 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 + } +} + +module.exports = EdgeEncryptor |