diff options
author | frankiebee <frankie.diamond@gmail.com> | 2018-03-08 09:16:35 +0800 |
---|---|---|
committer | frankiebee <frankie.diamond@gmail.com> | 2018-03-08 09:16:35 +0800 |
commit | 8adb03074c6315b4bdcffdd22abca2c84c7a6985 (patch) | |
tree | 28ef1c54f5287206f89db5276df3a82bba00ae78 /app/scripts/edge-encryptor.js | |
parent | 62febac87659ddf78a34dd0dac1ee8a38d8c8e77 (diff) | |
parent | 303801d2768a264a27a51916e5debf778739ee0c (diff) | |
download | tangerine-wallet-browser-8adb03074c6315b4bdcffdd22abca2c84c7a6985.tar tangerine-wallet-browser-8adb03074c6315b4bdcffdd22abca2c84c7a6985.tar.gz tangerine-wallet-browser-8adb03074c6315b4bdcffdd22abca2c84c7a6985.tar.bz2 tangerine-wallet-browser-8adb03074c6315b4bdcffdd22abca2c84c7a6985.tar.lz tangerine-wallet-browser-8adb03074c6315b4bdcffdd22abca2c84c7a6985.tar.xz tangerine-wallet-browser-8adb03074c6315b4bdcffdd22abca2c84c7a6985.tar.zst tangerine-wallet-browser-8adb03074c6315b4bdcffdd22abca2c84c7a6985.zip |
Merge branch 'master' into retry-tx-refractor
Diffstat (limited to 'app/scripts/edge-encryptor.js')
-rw-r--r-- | app/scripts/edge-encryptor.js | 69 |
1 files changed, 69 insertions, 0 deletions
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 |