From d2a1ea23d1f40ea70be9c835f2ec949bca3713ea Mon Sep 17 00:00:00 2001 From: CryptoManiac Date: Fri, 1 Apr 2016 23:20:51 +0300 Subject: [PATCH] RPC: In addition to public key pairs, adjustmalleablepubkey method now understands malleable addresses and key views. --- src/key.cpp | 8 +++++++- src/rpcwallet.cpp | 33 ++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/key.cpp b/src/key.cpp index 1c700d0..355d6dd 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -761,6 +761,8 @@ bool CMalleablePubKey::SetString(const std::string& strMalleablePubKey) if (!DecodeBase58Check(strMalleablePubKey, vchTemp)) { throw key_error("CMalleablePubKey::SetString() : Provided key data seems corrupted."); } + if (vchTemp.size() != 68) + return false; CDataStream ssKey(vchTemp, SER_NETWORK, PROTOCOL_VERSION); ssKey >> *this; @@ -1028,7 +1030,8 @@ bool CMalleableKey::SetString(const std::string& strMutableKey) if (!DecodeBase58Check(strMutableKey, vchTemp)) { throw key_error("CMalleableKey::SetString() : Provided key data seems corrupted."); } - + if (vchTemp.size() != 66) + return false; CDataStream ssKey(vchTemp, SER_NETWORK, PROTOCOL_VERSION); ssKey >> *this; @@ -1172,6 +1175,9 @@ bool CMalleableKeyView::SetString(const std::string& strMutableKey) throw key_error("CMalleableKeyView::SetString() : Provided key data seems corrupted."); } + if (vchTemp.size() != 67) + return false; + CDataStream ssKey(vchTemp, SER_NETWORK, PROTOCOL_VERSION); ssKey >> *this; diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index ba586e9..757e7f4 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -1744,6 +1744,7 @@ Value validateaddress(const Array& params, bool fHelp) CMalleableKeyView view; bool isMine = pwalletMain->GetMalleableView(mpk, view); ret.push_back(Pair("ismine", isMine)); + ret.push_back(Pair("PubkeyPair", mpk.ToString())); if (isMine) ret.push_back(Pair("KeyView", view.ToString())); @@ -1981,16 +1982,34 @@ Value adjustmalleablepubkey(const Array& params, bool fHelp) { if (fHelp || params.size() > 2 || params.size() == 0) throw runtime_error( - "adjustmalleablepubkey \n" - "Calculate new public key using provided malleable public key data.\n"); + "adjustmalleablepubkey \n" + "Calculate new public key using provided data.\n"); - string pubKeyPair = params[0].get_str(); + string strData = params[0].get_str(); CMalleablePubKey malleablePubKey; - if (pubKeyPair.size() == 136) { - malleablePubKey.setvch(ParseHex(pubKeyPair)); - } else - malleablePubKey.SetString(pubKeyPair); + do + { + CBitcoinAddress addr(strData); + if (addr.IsValid() && addr.IsPair()) + { + // Initialize malleable pubkey with address data + malleablePubKey = CMalleablePubKey(addr.GetData()); + break; + } + CMalleableKeyView viewTmp(strData); + if (viewTmp.IsValid()) + { + // Shazaam, we have a valid key view here. + malleablePubKey = viewTmp.GetMalleablePubKey(); + break; + } + if (malleablePubKey.SetString(strData)) + break; // A valid public key pair + + throw runtime_error("Though your data seems a valid Base58 string, we were unable to recognize it."); + } + while(false); CPubKey R, vchPubKeyVariant; malleablePubKey.GetVariant(R, vchPubKeyVariant); -- 1.7.1