aboutsummaryrefslogtreecommitdiff
path: root/src/simplewallet
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2016-04-23 21:46:48 +0100
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2016-07-19 20:39:03 +0100
commit89d9f382a03235338bae65661e66d2d5ffa736d5 (patch)
treea375ca47ca2cf9f03cfb5dd064f3d6090efc6b13 /src/simplewallet
parentMerge pull request #889 (diff)
downloadmonero-89d9f382a03235338bae65661e66d2d5ffa736d5.tar.xz
wallet: add command and RPC to sign/verify data
Signing is done using the spend key, since the view key may be shared. This could be extended later, to let the user choose which key (even a per tx key). simplewallet's sign/verify API uses a file. The RPC uses a string (simplewallet can't easily do strings since commands receive a tokenized set of arguments).
Diffstat (limited to 'src/simplewallet')
-rw-r--r--src/simplewallet/simplewallet.cpp67
-rw-r--r--src/simplewallet/simplewallet.h2
2 files changed, 69 insertions, 0 deletions
diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp
index 4a7a70b8c..1862173b9 100644
--- a/src/simplewallet/simplewallet.cpp
+++ b/src/simplewallet/simplewallet.cpp
@@ -658,6 +658,8 @@ simple_wallet::simple_wallet()
m_cmd_binder.set_handler("set_tx_note", boost::bind(&simple_wallet::set_tx_note, this, _1), tr("Set an arbitrary string note for a txid"));
m_cmd_binder.set_handler("get_tx_note", boost::bind(&simple_wallet::get_tx_note, this, _1), tr("Get a string note for a txid"));
m_cmd_binder.set_handler("status", boost::bind(&simple_wallet::status, this, _1), tr("Show wallet status information"));
+ m_cmd_binder.set_handler("sign", boost::bind(&simple_wallet::sign, this, _1), tr("Sign the contents of a file"));
+ m_cmd_binder.set_handler("verify", boost::bind(&simple_wallet::verify, this, _1), tr("Verify a signature on the contents of a file"));
m_cmd_binder.set_handler("help", boost::bind(&simple_wallet::help, this, _1), tr("Show this help"));
}
//----------------------------------------------------------------------------------------------------
@@ -3368,6 +3370,71 @@ bool simple_wallet::status(const std::vector<std::string> &args)
return true;
}
//----------------------------------------------------------------------------------------------------
+bool simple_wallet::sign(const std::vector<std::string> &args)
+{
+ if (args.size() != 1)
+ {
+ fail_msg_writer() << tr("usage: sign <filename>");
+ return true;
+ }
+ if (m_wallet->watch_only())
+ {
+ fail_msg_writer() << tr("wallet is watch-only and cannot sign");
+ return true;
+ }
+ std::string filename = args[0];
+ std::string data;
+ bool r = epee::file_io_utils::load_file_to_string(filename, data);
+ if (!r)
+ {
+ fail_msg_writer() << tr("failed to read file ") << filename;
+ return true;
+ }
+ std::string signature = m_wallet->sign(data);
+ success_msg_writer() << signature;
+ return true;
+}
+//----------------------------------------------------------------------------------------------------
+bool simple_wallet::verify(const std::vector<std::string> &args)
+{
+ if (args.size() != 3)
+ {
+ fail_msg_writer() << tr("usage: verify <filename> <address> <signature>");
+ return true;
+ }
+ std::string filename = args[0];
+ std::string address_string = args[1];
+ std::string signature= args[2];
+
+ std::string data;
+ bool r = epee::file_io_utils::load_file_to_string(filename, data);
+ if (!r)
+ {
+ fail_msg_writer() << tr("failed to read file ") << filename;
+ return true;
+ }
+
+ cryptonote::account_public_address address;
+ bool has_payment_id;
+ crypto::hash8 payment_id;
+ if(!get_account_integrated_address_from_str(address, has_payment_id, payment_id, m_wallet->testnet(), address_string))
+ {
+ fail_msg_writer() << tr("failed to parse address");
+ return true;
+ }
+
+ r = m_wallet->verify(data, address, signature);
+ if (!r)
+ {
+ fail_msg_writer() << tr("Bad signature from ") << address_string;
+ }
+ else
+ {
+ success_msg_writer() << tr("Good signature from ") << address_string;
+ }
+ return true;
+}
+//----------------------------------------------------------------------------------------------------
bool simple_wallet::process_command(const std::vector<std::string> &args)
{
return m_cmd_binder.process_command_vec(args);
diff --git a/src/simplewallet/simplewallet.h b/src/simplewallet/simplewallet.h
index e0478eb6e..97f30834a 100644
--- a/src/simplewallet/simplewallet.h
+++ b/src/simplewallet/simplewallet.h
@@ -143,6 +143,8 @@ namespace cryptonote
bool get_tx_note(const std::vector<std::string> &args);
bool status(const std::vector<std::string> &args);
bool set_default_fee_multiplier(const std::vector<std::string> &args);
+ bool sign(const std::vector<std::string> &args);
+ bool verify(const std::vector<std::string> &args);
uint64_t get_daemon_blockchain_height(std::string& err);
bool try_connect_to_daemon();