X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=blobdiff_plain;f=src%2Frpccrypt.cpp;h=91f03026b296d532296ea8c524e6f5f1a5eda1e9;hp=056917636608c91382e1826b959929d0f0dffad2;hb=05df71c9c292877e7469884227fd3ba84d02908b;hpb=b17ed6bfad24c6e140030f0bea4686c0d4c0fbaa diff --git a/src/rpccrypt.cpp b/src/rpccrypt.cpp index 0569176..91f0302 100644 --- a/src/rpccrypt.cpp +++ b/src/rpccrypt.cpp @@ -4,11 +4,8 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "wallet.h" -#include "walletdb.h" #include "bitcoinrpc.h" #include "init.h" -#include "util.h" -#include "ntp.h" #include "base58.h" using namespace json_spirit; @@ -33,20 +30,80 @@ Value decryptdata(const Array& params, bool fHelp) { if (fHelp || params.size() != 2) throw runtime_error( - "decryptdata \n" + "decryptdata \n" "Decrypt octet stream.\n"); EnsureWalletIsUnlocked(); + CKey key; CBitcoinAddress addr(params[0].get_str()); + if (addr.IsValid()) { + CKeyID keyID; + addr.GetKeyID(keyID); + if (!pwalletMain->GetKey(keyID, key)) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "We have no private key for this address"); + } + else { + CBitcoinSecret vchSecret; + if (!vchSecret.SetString(params[0].get_str())) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Provided private key is inconsistent."); + bool fCompressed; + CSecret secret = vchSecret.GetSecret(fCompressed); + key.SetSecret(secret, fCompressed); + } + + vector vchDecrypted; + key.DecryptData(ParseHex(params[1].get_str()), vchDecrypted); + + return HexStr(vchDecrypted); +} + +Value encryptmessage(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 2) + throw runtime_error( + "encryptmessage \n" + "Encrypt message with provided public key.\n"); + + CPubKey pubKey(ParseHex(params[0].get_str())); - CKeyID keyID; - addr.GetKeyID(keyID); + vector vchEncrypted; + string strData = params[1].get_str(); + pubKey.EncryptData(vector(strData.begin(), strData.end()), vchEncrypted); + + return EncodeBase58Check(vchEncrypted); +} + +Value decryptmessage(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 2) + throw runtime_error( + "decryptmessage \n" + "Decrypt message string.\n"); + + EnsureWalletIsUnlocked(); CKey key; - pwalletMain->GetKey(keyID, key); + CBitcoinAddress addr(params[0].get_str()); + if (addr.IsValid()) { + CKeyID keyID; + addr.GetKeyID(keyID); + if (!pwalletMain->GetKey(keyID, key)) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "We have no private key for this address"); + } + else { + CBitcoinSecret vchSecret; + if (!vchSecret.SetString(params[0].get_str())) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Provided private key is inconsistent."); + bool fCompressed; + CSecret secret = vchSecret.GetSecret(fCompressed); + key.SetSecret(secret, fCompressed); + } + vector vchEncrypted; + if (!DecodeBase58Check(params[1].get_str(), vchEncrypted)) + throw runtime_error("Incorrect string"); vector vchDecrypted; - key.DecryptData(ParseHex(params[1].get_str()), vchDecrypted); + key.DecryptData(vchEncrypted, vchDecrypted); - return HexStr(vchDecrypted); + return std::string((const char*)&vchDecrypted[0], vchDecrypted.size()); }