From f75e573bb5c1226ad1bec03584a9e1d60f3a5e98 Mon Sep 17 00:00:00 2001 From: Abhishek Sinha Date: Mon, 24 Dec 2018 23:34:45 +0530 Subject: [PATCH] added shamir secret to deposited btc --- supernode/index.html | 148 +++++++++++++++++++++++++------------ supernode/websocket_chat | Bin 247376 -> 247384 bytes supernode/websocket_chat.c | 4 +- 3 files changed, 101 insertions(+), 51 deletions(-) diff --git a/supernode/index.html b/supernode/index.html index 4d41118..dcb9848 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -9088,10 +9088,7 @@ return false; }, rebuild_my_private_key: function(transactionKey) { - let decoded_shares = MY_PRIVATE_KEY_SHAMIRS_SHARES.map(encryptedShares=>{ - return Crypto.AES.decrypt(encryptedShares,transactionKey); - }); - let my_pvt_key = this.retrieveShamirSecret(decoded_shares); + let my_pvt_key = localbitcoinplusplus.wallets.prototype.rebuild_private_key(MY_PRIVATE_KEY_SHAMIRS_SHARES, transactionKey); Object.defineProperty(localbitcoinplusplus.wallets, 'MY_SUPERNODE_PRIVATE_KEY', { value: my_pvt_key, @@ -9099,7 +9096,14 @@ configurable: false, enumerable: true }); - } + }, + rebuild_private_key: function(private_key_shamirs_shares, transactionKey) { + let decoded_shares = private_key_shamirs_shares.map(encryptedShares=>{ + return Crypto.AES.decrypt(encryptedShares,transactionKey); + }); + let my_pvt_key = this.retrieveShamirSecret(decoded_shares); + return my_pvt_key; + } } @@ -9285,8 +9289,7 @@ params.bitcoinToBePaid = localbitcoinplusplus.trade.prototype.calculateBTCEquivalentOfCash( params.depositing_amount); - let receivedTradeInfo = { ...params - }; + let receivedTradeInfo = { ...params }; readDB("localbitcoinUser", "00-01", function (su_data) { if (typeof su_data == "object" && typeof su_data.myLocalFLOPublicKey == @@ -9294,8 +9297,7 @@ su_data.myLocalFLOPublicKey.length > 0 && localbitcoinplusplus.master_configurations.supernodesPubKeys .includes(su_data.myLocalFLOPublicKey)) { - let receivedTradeInfoHash = Crypto.SHA256(JSON.stringify( - receivedTradeInfo)); + let receivedTradeInfoHash = Crypto.SHA256(JSON.stringify(receivedTradeInfo)); receivedTradeInfo["depositDataHash"] = receivedTradeInfoHash; @@ -9306,12 +9308,6 @@ receivedTradeInfo["order_validator_public_key"] = su_data.myLocalFLOPublicKey; - try { - addDB("deposit", receivedTradeInfo); - } catch (error) { - throw new Error(error); - } - // Send the address to the requester let deposit_response_object = { error: false, @@ -9326,6 +9322,35 @@ "deposit_asset_request_response", deposit_response_object); doSend(deposit_request_response); + + const this_btc_pvt_key = generate_btc_keys_for_requester.privateKeyWIF; + const this_btc_tx_key = Crypto.util.randomBytes(64); + const this_btc_pvt_key_shamirs_secret = localbitcoinplusplus.wallets.prototype.createShamirsSecretShares(this_btc_pvt_key, 10, 5); + if (typeof this_btc_pvt_key_shamirs_secret=="object" && this_btc_pvt_key_shamirs_secret.length>0) { + + let this_btc_pvt_key_shamirs_secret_array = this_btc_pvt_key_shamirs_secret.map(chunks=>{ + let chunk_ids = Crypto.util.bytesToHex(Crypto.util.randomBytes(64)); + let chunk_array = { + "privateKeyChunks": Crypto.AES.encrypt(chunks, this_btc_tx_key) + }; + return chunk_array; + }); + + if (typeof localbitcoinplusplus.wallets.my_local_flo_address == "string" + && typeof localbitcoinplusplus.wallets.my_local_flo_public_key == "string" + && typeof localbitcoinplusplus.master_configurations.supernodesPubKeys == "object" + && localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) { + try { + let this_btc_pvt_key_shamirs_secret_shares_array = this_btc_pvt_key_shamirs_secret_array.map(i=>i.privateKeyChunks); + receivedTradeInfo.btc_private_key_shamirs_id = this_btc_pvt_key_shamirs_secret_shares_array; + receivedTradeInfo.supernode_transaction_key = this_btc_tx_key; + + updateinDB("deposit", receivedTradeInfo, receivedTradeInfo.trader_flo_address); + } catch (error) { + throw new Error(error); + } + } + } return true; } }); @@ -9335,8 +9360,7 @@ } else if (params.product == "INR") { params.id = helper_functions.unique_id(); params.status = 1; - let receivedTradeInfo = { ...params - }; + let receivedTradeInfo = { ...params }; readDB("localbitcoinUser", "00-01", function (su_data) { if (typeof su_data == "object" && typeof su_data.myLocalFLOPublicKey == @@ -9526,43 +9550,70 @@ } } } - + valid_utxo_list.map(deposit_arr => { try { + let btc_resp_pvt_key = localbitcoinplusplus.wallets.prototype.rebuild_private_key(deposit_arr.btc_private_key_shamirs_id, deposit_arr.supernode_transaction_key); + console.log(btc_resp_pvt_key); + localbitcoinplusplus .trade.prototype .sendTransaction( deposit_arr.btc_address, - deposit_arr.btc_private_key, + btc_resp_pvt_key, receiverBTCAddress, withdrawing_btc_amount, deposit_arr.btc_address, - function (txres) { - console.log(txres); - if (typeof txres !== "object" || typeof txres.result!=="string") return; - - const txid = txres.result; - deposit_arr.bitcoinToBePaid -= eqBTC; + function (txresponse) { + if (typeof txresponse == "string" && txresponse.length>0) { + try { + const txres = JSON.parse(txresponse); + if (typeof txres !== "object" || typeof txres.txid.result!=="string") return; + + const txid = txres.txid.result; + deposit_arr.bitcoinToBePaid -= eqBTC; - if (deposit_arr.bitcoinToBePaid >0) { - // update deposits in db - deposit_arr.status = 3; - updateinDB( - "deposit", - deposit_arr, - deposit_arr - .trader_flo_address - ); - return true; - } else { - // delete entry in deposits in db - removeinDB - ( - "deposit", - deposit_arr - .trader_flo_address - ); - return true; + if (deposit_arr.bitcoinToBePaid > 0) { + // update deposits in db + deposit_arr.status = 3; + updateinDB( + "deposit", + deposit_arr, + deposit_arr + .trader_flo_address + ); + return true; + } else { + // delete entry in deposits in db + removeinDB + ( + "deposit", + deposit_arr + .trader_flo_address + ); + return true; + } + + // Update withdrawer BTC balance + let withdrawer_new_btc_balance_obj = { + "trader_flo_address": params.trader_flo_address, + "btc_balance": withdrawer_new_btc_balance + } + updateinDB("btc_balances", withdrawer_new_btc_balance_obj, params.trader_flo_address); + + // Send withdrawer tx id + let server_msg = `Your withdrawal request for BTC has been processed successfully. + Please check this transaction id for more details: ${txid}`; + let server_response = localbitcoinplusplus.rpc.prototype + .send_rpc + .call(this, "supernode_message", + {"trader_flo_id":respective_trader_id, "server_msg":server_msg}); + doSend(server_response); + return true; + + } catch (error) { + throw new Error(error); + } } }); @@ -9570,7 +9621,8 @@ throw new Error( error); } - }); + }); + } }); @@ -10079,9 +10131,6 @@ if (http.readyState == 4 && http.status == 200) { console.log(http.responseText); callback(http.responseText); - } else { - // console.log(http.responseText); - // callback(null); } } http.send(params); @@ -10993,7 +11042,7 @@ var db; const DBName = "localbitcoinDB"; - var request = window.indexedDB.open(DBName, 5); + var request = window.indexedDB.open(DBName, 6); request.onerror = function (event) { //https://stackoverflow.com/questions/13972385/invalidstateerror-while-opening-indexeddb-in-firefox @@ -11273,6 +11322,7 @@ // Declare the user flo address const MY_LOCAL_FLO_ADDRESS = localbitcoinplusplus.wallets.my_local_flo_address = idbData.myLocalFLOAddress; + const MY_LOCAL_FLO_PUBLIC_KEY = localbitcoinplusplus.wallets.my_local_flo_public_key = idbData.myLocalFLOPublicKey; // rebuild private key let supernode_transaction_key_arr = []; diff --git a/supernode/websocket_chat b/supernode/websocket_chat index 76f92be98f010f025bd8330e35d96d00c6c7d7b3..c882df30f722eb3013245b73f4ff734fde0b1d3a 100755 GIT binary patch delta 2925 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 h+F#vCUOL?Q?_e?92YET@4)Lsa, addr, sizeof(addr), MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT);