From fed1df53f03af04b584816c0850e388cd6497fe6 Mon Sep 17 00:00:00 2001 From: cryptozoidberg Date: Wed, 5 Apr 2023 19:05:45 +0200 Subject: [PATCH] Implementd rpc for crypto api --- src/wallet/wallet_public_structs_defs.h | 89 +++++++++++++++++++++++++ src/wallet/wallet_rpc_server.cpp | 40 ++++++++++- src/wallet/wallet_rpc_server.h | 17 ++++- 3 files changed, 142 insertions(+), 4 deletions(-) diff --git a/src/wallet/wallet_public_structs_defs.h b/src/wallet/wallet_public_structs_defs.h index fb3a0d6a..3c7467bb 100644 --- a/src/wallet/wallet_public_structs_defs.h +++ b/src/wallet/wallet_public_structs_defs.h @@ -1318,6 +1318,95 @@ namespace wallet_public }; }; + struct COMMAND_SIGN_MESSAGE + { + struct request + { + std::string buff; //base64 encoded data + + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(buff) + END_KV_SERIALIZE_MAP() + }; + + + struct response + { + crypto::signature sig; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE_POD_AS_HEX_STRING(sig) + END_KV_SERIALIZE_MAP() + }; + }; + + struct COMMAND_VALIDATE_SIGNATURE + { + struct request + { + std::string buff; //base64 encoded data + crypto::signature sig; + crypto::public_key pkey; + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(buff) + KV_SERIALIZE_POD_AS_HEX_STRING(sig) + KV_SERIALIZE_POD_AS_HEX_STRING(pkey) + END_KV_SERIALIZE_MAP() + }; + + + struct response + { + BEGIN_KV_SERIALIZE_MAP() + END_KV_SERIALIZE_MAP() + }; + }; + + struct COMMAND_ENCRYPT_DATA + { + struct request + { + std::string buff; //base64 encoded data + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(buff) + END_KV_SERIALIZE_MAP() + }; + + + struct response + { + std::string res_buff; //base64 encoded encrypted data + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(res_buff) + END_KV_SERIALIZE_MAP() + }; + }; + + struct COMMAND_DECRYPT_DATA + { + struct request + { + std::string buff; //base64 encoded encrypted data + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(buff) + END_KV_SERIALIZE_MAP() + }; + + + struct response + { + std::string res_buff; //base64 encoded data + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(res_buff) + END_KV_SERIALIZE_MAP() + }; + }; + struct assets_whitelist { diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp index cf2b2d2a..1bc0011d 100644 --- a/src/wallet/wallet_rpc_server.cpp +++ b/src/wallet/wallet_rpc_server.cpp @@ -1030,9 +1030,45 @@ namespace tools return true; } //------------------------------------------------------------------------------------------------------------------------------ - bool wallet_rpc_server::reset_active_wallet(wallet2& w) + bool on_sign_message(const wallet_public::COMMAND_SIGN_MESSAGE& req, wallet_public::COMMAND_SIGN_MESSAGE::response& res, epee::json_rpc::error& er, connection_context& cntx) { - m_pwallet = &w; + std::string buff = epee::string_encoding::base64_decode(req.buff); + get_wallet()->sign_buffer(buff, res.sig); + return true; + } + //------------------------------------------------------------------------------------------------------------------------------ + bool on_validate_signature(const wallet_public::COMMAND_VALIDATE_SIGNATURE& req, wallet_public::COMMAND_VALIDATE_SIGNATURE::response& res, epee::json_rpc::error& er, connection_context& cntx) + { + std::string buff = epee::string_encoding::base64_decode(req.buff); + bool r = get_wallet()->validate_sign(buff, req.sig, req.pkey); + if (!r) + { + er.code = WALLET_RPC_ERROR_CODE_WRONG_ARGUMENT; + er.message = "WALLET_RPC_ERROR_CODE_WRONG_ARGUMENT"; + return false; + } + return true; + } + //------------------------------------------------------------------------------------------------------------------------------ + bool on_encrypt_data(const wallet_public::COMMAND_ENCRYPT_DATA& req, wallet_public::COMMAND_ENCRYPT_DATA::response& res, epee::json_rpc::error& er, connection_context& cntx) + { + std::string buff = epee::string_encoding::base64_decode(req.buff); + bool r = get_wallet()->encrypt_buffer(buff, res.res_buff); + res.res_buff = epee::string_encoding::base64_encode(res.res_buff); + return true; + } + //------------------------------------------------------------------------------------------------------------------------------ + bool on_decrypt_data(const wallet_public::COMMAND_DECRYPT_DATA& req, wallet_public::COMMAND_DECRYPT_DATA::response& res, epee::json_rpc::error& er, connection_context& cntx) + { + std::string buff = epee::string_encoding::base64_decode(req.buff); + bool r = get_wallet()->encrypt_buffer(buff, res.res_buff); + res.res_buff = epee::string_encoding::base64_encode(res.res_buff); + return true; + } + //------------------------------------------------------------------------------------------------------------------------------ + bool wallet_rpc_server::reset_active_wallet(std::shared_ptr w) + { + m_pwallet = w; return true; } //------------------------------------------------------------------------------------------------------------------------------ diff --git a/src/wallet/wallet_rpc_server.h b/src/wallet/wallet_rpc_server.h index e04b0d47..8d853e2d 100644 --- a/src/wallet/wallet_rpc_server.h +++ b/src/wallet/wallet_rpc_server.h @@ -82,6 +82,11 @@ namespace tools MAP_JON_RPC_WE("mw_get_wallets", on_mw_get_wallets, wallet_public::COMMAND_MW_GET_WALLETS) MAP_JON_RPC_WE("mw_select_wallet", on_mw_select_wallet, wallet_public::COMMAND_MW_SELECT_WALLET) + //basic crypto operations + MAP_JON_RPC_WE("sign_message", on_sign_message, wallet_public::COMMAND_SIGN_MESSAGE) + MAP_JON_RPC_WE("validate_signature", on_validate_signature, wallet_public::COMMAND_VALIDATE_SIGNATURE) + MAP_JON_RPC_WE("encrypt_data", on_encrypt_data, wallet_public::COMMAND_ENCRYPT_DATA) + MAP_JON_RPC_WE("decrypt_data", on_decrypt_data, wallet_public::COMMAND_DECRYPT_DATA) END_JSON_RPC_MAP() END_URI_MAP2() @@ -129,9 +134,17 @@ namespace tools bool on_mw_get_wallets(const wallet_public::COMMAND_MW_GET_WALLETS& req, wallet_public::COMMAND_MW_GET_WALLETS::response& res, epee::json_rpc::error& er, connection_context& cntx); bool on_mw_select_wallet(const wallet_public::COMMAND_MW_SELECT_WALLET& req, wallet_public::COMMAND_MW_SELECT_WALLET::response& res, epee::json_rpc::error& er, connection_context& cntx); + + bool on_sign_message(const wallet_public::COMMAND_SIGN_MESSAGE& req, wallet_public::COMMAND_SIGN_MESSAGE::response& res, epee::json_rpc::error& er, connection_context& cntx); + bool on_validate_signature(const wallet_public::COMMAND_VALIDATE_SIGNATURE& req, wallet_public::COMMAND_VALIDATE_SIGNATURE::response& res, epee::json_rpc::error& er, connection_context& cntx); + bool on_encrypt_data(const wallet_public::COMMAND_ENCRYPT_DATA& req, wallet_public::COMMAND_ENCRYPT_DATA::response& res, epee::json_rpc::error& er, connection_context& cntx); + bool on_decrypt_data(const wallet_public::COMMAND_DECRYPT_DATA& req, wallet_public::COMMAND_DECRYPT_DATA::response& res, epee::json_rpc::error& er, connection_context& cntx); + + + + std::shared_ptr get_wallet(); - - bool reset_active_wallet(wallet2& w); + bool reset_active_wallet(std::shared_ptr w); bool handle_command_line(const boost::program_options::variables_map& vm);