From 898f9165c2e5ce271ae0e795e25b760bb6fb3e7b Mon Sep 17 00:00:00 2001 From: Kyle Zsembery Date: Mon, 23 Nov 2020 15:27:34 +1100 Subject: [PATCH] sign and verify --- .../main-process/modules/wallet-rpc.js | 106 +++++++++ .../{ => advanced}/check_transaction.vue | 56 ++++- .../{ => advanced}/prove_transaction.vue | 32 ++- src/components/advanced/sign_and_verify.vue | 202 ++++++++++++++++++ src/components/advanced/signature_dialog.vue | 58 +++++ src/css/app.styl | 2 +- src/gateway/gateway.js | 8 + src/i18n/en-us.js | 19 +- src/pages/wallet/advanced.vue | 14 +- src/store/gateway/mutations.js | 15 ++ src/store/gateway/state.js | 13 ++ 11 files changed, 504 insertions(+), 21 deletions(-) rename src/components/{ => advanced}/check_transaction.vue (77%) rename src/components/{ => advanced}/prove_transaction.vue (85%) create mode 100644 src/components/advanced/sign_and_verify.vue create mode 100644 src/components/advanced/signature_dialog.vue diff --git a/src-electron/main-process/modules/wallet-rpc.js b/src-electron/main-process/modules/wallet-rpc.js index f551e15..7f762a8 100644 --- a/src-electron/main-process/modules/wallet-rpc.js +++ b/src-electron/main-process/modules/wallet-rpc.js @@ -390,6 +390,14 @@ export class WalletRPC { ); break; + case "sign": + this.sign(params.data); + break; + + case "verify": + this.verify(params.data, params.address, params.signature); + break; + case "add_address_book": this.addAddressBook( params.address, @@ -1281,6 +1289,104 @@ export class WalletRPC { } } + async sign(data) { + // set to loading + this.sendGateway("set_sign_status", { + code: 0, + sending: true + }); + try { + const rpcData = await this.sendRPC("sign", { data }); + if ( + !rpcData || + rpcData.hasOwnProperty("error") || + !rpcData.hasOwnProperty("result") + ) { + const error = rpcData?.error?.message || "Unknown error"; + this.sendGateway("set_sign_status", { + code: -1, + message: error, + sending: false + }); + return; + } + const signature = rpcData.result.signature; + + this.sendGateway("set_sign_status", { + code: 1, + sending: false, + signature: signature + }); + return; + } catch (err) { + console.debug(`Failed to sign data: ${data} with error: ${err}`); + this.sendGateway("set_sign_status", { + code: -1, + message: err, + sending: false + }); + } + } + + async verify(data, address, signature) { + this.sendGateway("set_verify_status", { + code: 0, + sending: true + }); + try { + const rpcData = await this.sendRPC("verify", { + data, + address, + signature + }); + if ( + !rpcData || + rpcData.hasOwnProperty("error") || + !rpcData.hasOwnProperty("result") + ) { + let errorI18n = ""; + const error = rpcData.error.message || "Unknown error"; + if (error && error.includes("Invalid address")) { + errorI18n = "notification.errors.invalidAddress"; + } + this.sendGateway("set_verify_status", { + code: -1, + message: "", + i18n: errorI18n || "Unknown error", + sending: false + }); + return; + } + const good = rpcData.result.good; + if (good) { + // success + this.sendGateway("set_verify_status", { + code: 1, + sending: false, + i18n: "notification.positive.signatureVerified", + message: "" + }); + } else { + // error + this.sendGateway("set_verify_status", { + code: -1, + sending: false, + i18n: "notification.errors.invalidSignature", + message: "" + }); + } + + return; + } catch (err) { + this.sendGateway("set_verify_status", { + code: -1, + message: err.toString(), + i18n: "", + sending: false + }); + } + } + stake(password, amount, service_node_key, destination) { crypto.pbkdf2( password, diff --git a/src/components/check_transaction.vue b/src/components/advanced/check_transaction.vue similarity index 77% rename from src/components/check_transaction.vue rename to src/components/advanced/check_transaction.vue index eb530ff..3aa0216 100644 --- a/src/components/check_transaction.vue +++ b/src/components/advanced/check_transaction.vue @@ -1,9 +1,14 @@