diff options
author | Csaba Solya <csaba.solya@gmail.com> | 2018-02-22 21:39:32 +0800 |
---|---|---|
committer | Csaba Solya <csaba.solya@gmail.com> | 2018-02-22 21:39:32 +0800 |
commit | 5ec311ba3e01bd9b0a9ff447fd7639d22a7b3d9c (patch) | |
tree | 6f7d21ac75b62605f58049b09e18504b4abc2e22 /app/scripts/edge-encryptor.js | |
parent | 16754fa30744df8b3b3edc0e5229db29f3ad23ec (diff) | |
download | tangerine-wallet-browser-5ec311ba3e01bd9b0a9ff447fd7639d22a7b3d9c.tar tangerine-wallet-browser-5ec311ba3e01bd9b0a9ff447fd7639d22a7b3d9c.tar.gz tangerine-wallet-browser-5ec311ba3e01bd9b0a9ff447fd7639d22a7b3d9c.tar.bz2 tangerine-wallet-browser-5ec311ba3e01bd9b0a9ff447fd7639d22a7b3d9c.tar.lz tangerine-wallet-browser-5ec311ba3e01bd9b0a9ff447fd7639d22a7b3d9c.tar.xz tangerine-wallet-browser-5ec311ba3e01bd9b0a9ff447fd7639d22a7b3d9c.tar.zst tangerine-wallet-browser-5ec311ba3e01bd9b0a9ff447fd7639d22a7b3d9c.zip |
add edge support
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..9d6ac37b3 --- /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 |