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:
parent
0308af983f
commit
d90e9f6ed4
@ -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) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user