aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib/id-management.js
diff options
context:
space:
mode:
authorDan Finlay <dan@danfinlay.com>2016-06-16 05:58:06 +0800
committerDan Finlay <dan@danfinlay.com>2016-06-16 05:58:06 +0800
commitae3993b6d752207115a4767247caddbb42c197e3 (patch)
tree47db9af76524b0b9b0e07d9dbb70f3482e245097 /app/scripts/lib/id-management.js
parent37e552e95d67c8cf0273d0bb00eccd6ba0424f64 (diff)
downloadtangerine-wallet-browser-ae3993b6d752207115a4767247caddbb42c197e3.tar
tangerine-wallet-browser-ae3993b6d752207115a4767247caddbb42c197e3.tar.gz
tangerine-wallet-browser-ae3993b6d752207115a4767247caddbb42c197e3.tar.bz2
tangerine-wallet-browser-ae3993b6d752207115a4767247caddbb42c197e3.tar.lz
tangerine-wallet-browser-ae3993b6d752207115a4767247caddbb42c197e3.tar.xz
tangerine-wallet-browser-ae3993b6d752207115a4767247caddbb42c197e3.tar.zst
tangerine-wallet-browser-ae3993b6d752207115a4767247caddbb42c197e3.zip
Factor idManagement into its own module
Diffstat (limited to 'app/scripts/lib/id-management.js')
-rw-r--r--app/scripts/lib/id-management.js79
1 files changed, 79 insertions, 0 deletions
diff --git a/app/scripts/lib/id-management.js b/app/scripts/lib/id-management.js
new file mode 100644
index 000000000..0edd2e336
--- /dev/null
+++ b/app/scripts/lib/id-management.js
@@ -0,0 +1,79 @@
+const ethUtil = require('ethereumjs-util')
+
+module.exports = IdManagement
+
+function IdManagement(opts) {
+ if (!opts) opts = {}
+
+ this.keyStore = opts.keyStore
+ this.derivedKey = opts.derivedKey
+ this.hdPathString = "m/44'/60'/0'/0"
+
+ this.getAddresses = function(){
+ return keyStore.getAddresses(this.hdPathString).map(function(address){ return '0x'+address })
+ }
+
+ this.signTx = function(txParams){
+ // normalize values
+ txParams.to = ethUtil.addHexPrefix(txParams.to)
+ txParams.from = ethUtil.addHexPrefix(txParams.from)
+ txParams.value = ethUtil.addHexPrefix(txParams.value)
+ txParams.data = ethUtil.addHexPrefix(txParams.data)
+ txParams.gasLimit = ethUtil.addHexPrefix(txParams.gasLimit || txParams.gas)
+ txParams.nonce = ethUtil.addHexPrefix(txParams.nonce)
+ var tx = new Transaction(txParams)
+
+ // sign tx
+ var privKeyHex = this.exportPrivateKey(txParams.from)
+ var privKey = ethUtil.toBuffer(privKeyHex)
+ tx.sign(privKey)
+
+ // Add the tx hash to the persisted meta-tx object
+ var txHash = ethUtil.bufferToHex(tx.hash())
+ var metaTx = configManager.getTx(txParams.metamaskId)
+ metaTx.hash = txHash
+ configManager.updateTx(metaTx)
+
+ // return raw serialized tx
+ var rawTx = ethUtil.bufferToHex(tx.serialize())
+ return rawTx
+ }
+
+ this.signMsg = function(address, message){
+ // sign message
+ var privKeyHex = this.exportPrivateKey(address)
+ var privKey = ethUtil.toBuffer(privKeyHex)
+ var msgHash = ethUtil.sha3(message)
+ var msgBuffer = new Buffer(message.replace('0x',''), 'hex')
+ var msgSig = ethUtil.ecsign(msgBuffer, privKey)
+ var rawMsgSig = ethUtil.bufferToHex(concatSig(msgSig.v, msgSig.r, msgSig.s))
+ return rawMsgSig
+ }
+
+ this.getSeed = function(){
+ return this.keyStore.getSeed(this.derivedKey)
+ }
+
+ this.exportPrivateKey = function(address) {
+ var privKeyHex = ethUtil.addHexPrefix(this.keyStore.exportPrivateKey(address, this.derivedKey, this.hdPathString))
+ return privKeyHex
+ }
+}
+
+function pad_with_zeroes(number, length){
+ var my_string = '' + number;
+ while (my_string.length < length) {
+ my_string = '0' + my_string;
+ }
+ return my_string;
+}
+
+function concatSig(v, r, s) {
+ r = pad_with_zeroes(ethUtil.fromSigned(r), 64)
+ s = pad_with_zeroes(ethUtil.fromSigned(s), 64)
+ v = ethUtil.bufferToInt(v)
+ r = ethUtil.toUnsigned(r).toString('hex')
+ s = ethUtil.toUnsigned(s).toString('hex')
+ v = ethUtil.stripHexPrefix(ethUtil.intToHex(v))
+ return ethUtil.addHexPrefix(r.concat(s, v).toString("hex"))
+}