Adding secure PrivateKey feature

floDapps.securePrivKey(pwd): replaces the stored private key with encrypted variant.
Changed made in startup function getCredentials to support securePrivateKey.

Improved and promisified clearCredentials.
This commit is contained in:
sairajzero 2020-05-06 00:31:44 +05:30
parent 0308af983f
commit d90e9f6ed4

View File

@ -8781,16 +8781,6 @@ Bitcoin.Util = {
}) })
}, },
privKeyInput: function () {
return new Promise((resolve, reject) => {
var privKey = prompt("Enter Private Key: ")
if (privKey === null)
reject(null)
else
resolve(privKey)
})
},
startUpFunctions: { startUpFunctions: {
readSupernodeListFromAPI: function () { readSupernodeListFromAPI: function () {
@ -8876,7 +8866,19 @@ Bitcoin.Util = {
getCredentials: function () { getCredentials: function () {
var readSharesFromIDB = function (indexArr) { const defaultInput = function (type) {
return new Promise((resolve, reject) => {
let inputVal = prompt(`Enter ${type}: `)
if (inputVal === null)
reject(null)
else
resolve(inputVal)
})
}
const inputFn = this.getCredentials.privKeyInput || defaultInput;
const readSharesFromIDB = function (indexArr) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var promises = [] var promises = []
for (var i = 0; i < indexArr.length; i++) for (var i = 0; i < indexArr.length; i++)
@ -8891,7 +8893,7 @@ Bitcoin.Util = {
}) })
} }
var writeSharesToIDB = function (shares, i = 0, resultIndexes = []) { const writeSharesToIDB = function (shares, i = 0, resultIndexes = []) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (i >= shares.length) if (i >= shares.length)
return resolve(resultIndexes) return resolve(resultIndexes)
@ -8907,7 +8909,7 @@ Bitcoin.Util = {
}) })
} }
var getPrivateKeyCredentials = function () { const getPrivateKeyCredentials = function () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var indexArr = localStorage.getItem(`${floGlobals.application}#privKey`) var indexArr = localStorage.getItem(`${floGlobals.application}#privKey`)
if (indexArr) { if (indexArr) {
@ -8916,7 +8918,7 @@ Bitcoin.Util = {
.catch(error => reject(error)) .catch(error => reject(error))
} else { } else {
var privKey; var privKey;
floDapps.util.privKeyInput().then(result => { inputFn("PRIVATE_KEY").then(result => {
try { try {
if (!result) if (!result)
return reject("Empty Private Key") return reject("Empty Private Key")
@ -8956,16 +8958,38 @@ Bitcoin.Util = {
}) })
} }
const checkIfPinRequired = function(key){
return new Promise((resolve, reject) => {
if(key.length == 52)
resolve(key)
else {
inputFn("PIN/Password").then(pwd => {
try{
let privKey = Crypto.AES.decrypt(key, pwd);
resolve(privKey)
}catch(error){
reject("Access Denied: Incorrect PIN/Password")
}
}).catch(error => reject("Access Denied: PIN/Password required"))
}
})
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getPrivateKeyCredentials().then(privKey => { getPrivateKeyCredentials().then(key => {
myPrivKey = privKey checkIfPinRequired(key).then(privKey => {
myPubKey = floCrypto.getPubKeyHex(myPrivKey) try{
myFloID = floCrypto.getFloIDfromPubkeyHex(myPubKey) myPrivKey = privKey
resolve('Login Credentials loaded successful') myPubKey = floCrypto.getPubKeyHex(myPrivKey)
myFloID = floCrypto.getFloIDfromPubkeyHex(myPubKey)
resolve('Login Credentials loaded successful')
}catch(error){
reject("Corrupted Private Key")
}
}).catch(error => reject(error))
}).catch(error => reject(error)) }).catch(error => reject(error))
}) })
} }
}, },
callStartUpFunction: function (fname) { callStartUpFunction: function (fname) {
@ -9021,7 +9045,7 @@ Bitcoin.Util = {
}, },
setCustomPrivKeyInput: function (customFn) { setCustomPrivKeyInput: function (customFn) {
this.util.privKeyInput = customFn this.util.startUpFunctions.getCredentials.privKeyInput = customFn
}, },
setAppObjectStores: function (appObs) { setAppObjectStores: function (appObs) {
@ -9049,13 +9073,30 @@ Bitcoin.Util = {
}, },
clearCredentials: function () { clearCredentials: function () {
var indexArr = localStorage.getItem(`${floGlobals.application}#privKey`) return new Promise((resolve, reject) => {
if (!indexArr) compactIDB.clearData('credentials').then(result => {
return `privKey credentials not found!` localStorage.removeItem(`${floGlobals.application}#privKey`)
indexArr = JSON.parse(indexArr) resolve("privKey credentials deleted!")
indexArr.forEach(i => compactIDB.removeData('credentials', i)) }).catch(error => reject(error))
localStorage.removeItem(`${floGlobals.application}#privKey`) })
return `privKey credentials deleted!` },
securePrivKey: function(pwd){
return new Promise((resolve, reject) => {
let indexArr = localStorage.getItem(`${floGlobals.application}#privKey`)
if(!indexArr)
return reject("PrivKey not found");
indexArr = JSON.parse(indexArr)
let encryptedKey = Crypto.AES.encrypt(myPrivKey, pwd);
let threshold = indexArr.length;
let shares = floCrypto.createShamirsSecretShares(encryptedKey, threshold, threshold)
let promises = [];
for(var i=0; i<threshold;i++)
promises.push(compactIDB.writeData("credentials", shares[i], indexArr[i], floGlobals.application));
Promise.all(promises)
.then(results => resolve("Private Key Secured"))
.catch(error => reject(error))
})
}, },
objectDataMapper: function (object, path, data) { objectDataMapper: function (object, path, data) {