From 5f3f7465db4444e49dd4a896f88c090b40d0a303 Mon Sep 17 00:00:00 2001 From: CryptoManiac Date: Sat, 5 Mar 2016 23:43:40 +0300 Subject: [PATCH] Malleable keys: remove version byte --- src/key.cpp | 53 ++++++++++++++++++++++++++++------------------------- src/key.h | 32 ++++++++------------------------ src/rpcwallet.cpp | 2 +- 3 files changed, 37 insertions(+), 50 deletions(-) diff --git a/src/key.cpp b/src/key.cpp index 6c0a57d..b1db7cb 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -198,6 +198,14 @@ CKey::CKey(const CKey& b) fCompressedPubKey = b.fCompressedPubKey; } +CKey::CKey(const CSecret& b, bool fCompressed) +{ + pkey = EC_KEY_new_by_curve_name(NID_secp256k1); + if (pkey == NULL) + throw key_error("CKey::CKey(const CKey&) : EC_KEY_dup failed"); + SetSecret(b, fCompressed); +} + CKey& CKey::operator=(const CKey& b) { if (!EC_KEY_copy(pkey, b.pkey)) @@ -323,6 +331,12 @@ CSecret CKey::GetSecret(bool &fCompressed) const return vchRet; } +CSecret CKey::GetSecret() const +{ + bool fCompressed; + return GetSecret(fCompressed); +} + CPrivKey CKey::GetPrivKey() const { int nSize = i2d_ECPrivateKey(pkey, NULL); @@ -735,9 +749,7 @@ bool CMalleablePubKey::SetString(const std::string& strMalleablePubKey) bool CMalleablePubKey::operator==(const CMalleablePubKey &b) { - return (nVersion == b.nVersion && - pubKeyL == b.pubKeyL && - pubKeyH == b.pubKeyH); + return pubKeyL == b.pubKeyL && pubKeyH == b.pubKeyH; } @@ -747,22 +759,18 @@ void CMalleableKey::Reset() { vchSecretL.clear(); vchSecretH.clear(); - - nVersion = 0; } void CMalleableKey::MakeNewKeys() { - CKey L, H; - bool fCompressed = true; - - L.MakeNewKey(true); - H.MakeNewKey(true); + Reset(); - vchSecretL = L.GetSecret(fCompressed); - vchSecretH = H.GetSecret(fCompressed); + CKey keyL, keyH; + keyL.MakeNewKey(); + keyH.MakeNewKey(); - nVersion = CURRENT_VERSION; + vchSecretL = keyL.GetSecret(); + vchSecretH = keyH.GetSecret(); } CMalleableKey::CMalleableKey() @@ -786,23 +794,21 @@ CMalleableKey::~CMalleableKey() bool CMalleableKey::IsNull() const { - return nVersion != CURRENT_VERSION; + return vchSecretL.size() != 32 || vchSecretH.size() != 32; } bool CMalleableKey::SetSecrets(const CSecret &pvchSecretL, const CSecret &pvchSecretH) { Reset(); - CKey L, H; - if (pvchSecretL.size() != 32 || pvchSecretH.size() != 32 || !L.SetSecret(pvchSecretL, true) || !H.SetSecret(pvchSecretH, true)) - { - nVersion = 0; + CKey keyL(pvchSecretL); + CKey keyH(pvchSecretH); + + if (!keyL.IsValid() || !keyL.IsValid()) return false; - } vchSecretL = pvchSecretL; vchSecretH = pvchSecretH; - nVersion = CURRENT_VERSION; return true; } @@ -1021,14 +1027,12 @@ CMalleableKeyView::CMalleableKeyView(const CMalleableKey &b) H.SetSecret(b.vchSecretH, true); vchPubKeyH = H.GetPubKey().Raw(); - nVersion = b.nVersion; } CMalleableKeyView::CMalleableKeyView(const CMalleableKeyView &b) { vchSecretL = b.vchSecretL; vchPubKeyH = b.vchPubKeyH; - nVersion = CURRENT_VERSION; } CMalleableKeyView& CMalleableKeyView::operator=(const CMalleableKey &b) @@ -1038,7 +1042,6 @@ CMalleableKeyView& CMalleableKeyView::operator=(const CMalleableKey &b) CKey H; H.SetSecret(b.vchSecretH, true); vchPubKeyH = H.GetPubKey().Raw(); - nVersion = b.nVersion; return (*this); } @@ -1148,9 +1151,9 @@ std::vector CMalleableKeyView::Raw() const } -bool CMalleableKeyView::IsNull() const +bool CMalleableKeyView::IsValid() const { - return nVersion != CURRENT_VERSION; + return vchSecretL.size() == 32 && GetMalleablePubKey().IsValid(); } //// Asymmetric encryption diff --git a/src/key.h b/src/key.h index c3dea57..bf1557a 100644 --- a/src/key.h +++ b/src/key.h @@ -126,6 +126,7 @@ public: CKey(); CKey(const CKey& b); + CKey(const CSecret& b, bool fCompressed=true); CKey& operator=(const CKey& b); @@ -134,10 +135,11 @@ public: bool IsNull() const; bool IsCompressed() const; - void MakeNewKey(bool fCompressed); + void MakeNewKey(bool fCompressed=true); bool SetPrivKey(const CPrivKey& vchPrivKey); - bool SetSecret(const CSecret& vchSecret, bool fCompressed = false); + bool SetSecret(const CSecret& vchSecret, bool fCompressed = true); CSecret GetSecret(bool &fCompressed) const; + CSecret GetSecret() const; CPrivKey GetPrivKey() const; bool SetPubKey(const CPubKey& vchPubKey); CPubKey GetPubKey() const; @@ -209,7 +211,6 @@ public: class CMalleablePubKey { private: - unsigned char nVersion; CPubKey pubKeyL; CPubKey pubKeyH; friend class CMalleableKey; @@ -217,19 +218,16 @@ private: static const unsigned char CURRENT_VERSION = 1; public: - CMalleablePubKey() { nVersion = CMalleablePubKey::CURRENT_VERSION; } + CMalleablePubKey() { } CMalleablePubKey(const CMalleablePubKey& mpk) { - nVersion = mpk.nVersion; pubKeyL = mpk.pubKeyL; pubKeyH = mpk.pubKeyH; } CMalleablePubKey(const std::string& strMalleablePubKey) { SetString(strMalleablePubKey); } - CMalleablePubKey(const CPubKey &pubKeyInL, const CPubKey &pubKeyInH) : pubKeyL(pubKeyInL), pubKeyH(pubKeyInH) { nVersion = CMalleablePubKey::CURRENT_VERSION; } + CMalleablePubKey(const CPubKey &pubKeyInL, const CPubKey &pubKeyInH) : pubKeyL(pubKeyInL), pubKeyH(pubKeyInH) { } IMPLEMENT_SERIALIZE( - READWRITE(this->nVersion); - nVersion = this->nVersion; READWRITE(pubKeyL); READWRITE(pubKeyH); ) @@ -241,7 +239,6 @@ public: bool operator==(const CMalleablePubKey &b); bool operator!=(const CMalleablePubKey &b) { return !(*this == b); } CMalleablePubKey& operator=(const CMalleablePubKey& mpk) { - nVersion = mpk.nVersion; pubKeyL = mpk.pubKeyL; pubKeyH = mpk.pubKeyH; return *this; @@ -264,14 +261,11 @@ public: class CMalleableKey { private: - unsigned char nVersion; CSecret vchSecretL; CSecret vchSecretH; friend class CMalleableKeyView; - static const unsigned char CURRENT_VERSION = 1; - public: CMalleableKey(); CMalleableKey(const CMalleableKey &b); @@ -279,8 +273,6 @@ public: ~CMalleableKey(); IMPLEMENT_SERIALIZE( - READWRITE(this->nVersion); - nVersion = this->nVersion; READWRITE(vchSecretL); READWRITE(vchSecretH); ) @@ -289,7 +281,6 @@ public: bool SetString(const std::string& strMalleablePubKey); std::vector Raw() const; CMalleableKey& operator=(const CMalleableKey& mk) { - nVersion = mk.nVersion; vchSecretL = mk.vchSecretL; vchSecretH = mk.vchSecretH; return *this; @@ -315,14 +306,11 @@ public: class CMalleableKeyView { private: - unsigned char nVersion; CSecret vchSecretL; CPubKey vchPubKeyH; - static const unsigned char CURRENT_VERSION = 1; - public: - CMalleableKeyView() { nVersion = 0; }; + CMalleableKeyView() { }; CMalleableKeyView(const CMalleableKey &b); CMalleableKeyView(const std::string &strMalleableKey); @@ -331,19 +319,15 @@ public: ~CMalleableKeyView(); IMPLEMENT_SERIALIZE( - READWRITE(this->nVersion); - nVersion = this->nVersion; READWRITE(vchSecretL); READWRITE(vchPubKeyH); ) - bool IsNull() const; - bool IsValid() const { return !IsNull() && GetMalleablePubKey().IsValid(); } + bool IsValid() const; std::string ToString() const; bool SetString(const std::string& strMalleablePubKey); std::vector Raw() const; CMalleableKeyView& operator=(const CMalleableKeyView& mkv) { - nVersion = mkv.nVersion; vchSecretL = mkv.vchSecretL; vchPubKeyH = mkv.vchPubKeyH; return *this; diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index ff627c1..872471c 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -1896,7 +1896,7 @@ Value newmalleablekey(const Array& params, bool fHelp) "newmalleablekey\n" "Make a malleable public/private key pair.\n"); - if (!fTestNet && GetTime() < SMALLDATA_SWITCH_TIME) + if (!(fDebug || fTestNet) && GetTime() < SMALLDATA_SWITCH_TIME) throw runtime_error("This feature has been disabled for mainNet clients"); CMalleableKeyView keyView = pwalletMain->GenerateNewMalleableKey(); -- 1.7.1