Get rid of fCompressedPubKey attribute.
[novacoin.git] / src / key.cpp
index 45270a0..6657ffd 100644 (file)
@@ -165,15 +165,14 @@ const unsigned char vchMaxModHalfOrder[32] = {
 
 const unsigned char *vchZero = NULL;
 
-void CKey::SetCompressedPubKey()
+void CKey::SetCompressedPubKey(bool fCompressed)
 {
-    EC_KEY_set_conv_form(pkey, POINT_CONVERSION_COMPRESSED);
-    fCompressedPubKey = true;
+    EC_KEY_set_conv_form(pkey, fCompressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED);
 }
 
 void CKey::Reset()
 {
-    fCompressedPubKey = fSet = false;
+    fSet = false;
     if (pkey != NULL)
         EC_KEY_free(pkey);
     pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
@@ -193,7 +192,6 @@ CKey::CKey(const CKey& b)
     if (pkey == NULL)
         throw key_error("CKey::CKey(const CKey&) : EC_KEY_dup failed");
     fSet = b.fSet;
-    fCompressedPubKey = b.fCompressedPubKey;
 }
 
 CKey::CKey(const CSecret& b, bool fCompressed)
@@ -209,7 +207,6 @@ CKey& CKey::operator=(const CKey& b)
     if (!EC_KEY_copy(pkey, b.pkey))
         throw key_error("CKey::operator=(const CKey&) : EC_KEY_copy failed");
     fSet = b.fSet;
-    fCompressedPubKey = b.fCompressedPubKey;
     return (*this);
 }
 
@@ -226,7 +223,7 @@ bool CKey::IsNull() const
 
 bool CKey::IsCompressed() const
 {
-    return fCompressedPubKey;
+    return (EC_KEY_get_conv_form(pkey) == POINT_CONVERSION_COMPRESSED);
 }
 
 bool CKey::CheckSignatureElement(const unsigned char *vch, int len, bool half) {
@@ -264,8 +261,7 @@ void CKey::MakeNewKey(bool fCompressed)
 {
     if (!EC_KEY_generate_key(pkey))
         throw key_error("CKey::MakeNewKey() : EC_KEY_generate_key failed");
-    if (fCompressed)
-        SetCompressedPubKey();
+    SetCompressedPubKey(fCompressed);
     fSet = true;
 }
 
@@ -311,8 +307,7 @@ bool CKey::SetSecret(const CSecret& vchSecret, bool fCompressed)
     }
     BN_clear_free(bn);
     fSet = true;
-    if (fCompressed || fCompressedPubKey)
-        SetCompressedPubKey();
+    SetCompressedPubKey(fCompressed);
     return true;
 }
 
@@ -327,39 +322,19 @@ CSecret CKey::GetSecret(bool &fCompressed) const
     int n=BN_bn2bin(bn,&vchRet[32 - nBytes]);
     if (n != nBytes)
         throw key_error("CKey::GetSecret(): BN_bn2bin failed");
-    fCompressed = fCompressedPubKey;
+    fCompressed = IsCompressed();
     return vchRet;
 }
 
 bool CKey::WritePEM(BIO *streamObj, const SecureString &strPassKey) const // dumppem 4KJLA99FyqMMhjjDe7KnRXK4sjtv9cCtNS /tmp/test.pem 123
 {
     EVP_PKEY *evpKey = EVP_PKEY_new();
-    bool result = true;
+    if (!EVP_PKEY_assign_EC_KEY(evpKey, pkey))
+        return error("CKey::WritePEM() : Error initializing EVP_PKEY instance.");
+    if(!PEM_write_bio_PKCS8PrivateKey(streamObj, evpKey, EVP_aes_256_cbc(), (char *)&strPassKey[0], strPassKey.size(), NULL, NULL))
+        return error("CKey::WritePEM() : Error writing private key data to stream object");
 
-    do
-    {
-        if (!EVP_PKEY_assign_EC_KEY(evpKey, pkey))
-        {
-            result = error("CKey::WritePEM() : Error initializing EVP_PKEY instance.");
-            break;
-        }
-
-        if(!PEM_write_bio_PKCS8PrivateKey(streamObj, evpKey, EVP_aes_256_cbc(), (char *)&strPassKey[0], strPassKey.size(), NULL, NULL))
-        {
-            result = error("CKey::WritePEM() : Error writing private key data to stream object");
-            break;
-        }
-
-        if(!PEM_write_bio_PUBKEY(streamObj, evpKey))
-        {
-            result = error("CKey::WritePEM() : Error writing public key data to stream object");
-            break;
-        }
-    }
-    while(false);
-
-    EVP_PKEY_free(evpKey);
-    return result;
+    return true;
 }
 
 CSecret CKey::GetSecret() const
@@ -442,6 +417,7 @@ bool CKey::SignCompact(uint256 hash, std::vector<unsigned char>& vchSig)
     vchSig.resize(65,0);
     int nBitsR = BN_num_bits(sig->r);
     int nBitsS = BN_num_bits(sig->s);
+    bool fCompressedPubKey = IsCompressed();
     if (nBitsR <= 256 && nBitsS <= 256)
     {
         int8_t nRecId = -1;
@@ -449,8 +425,7 @@ bool CKey::SignCompact(uint256 hash, std::vector<unsigned char>& vchSig)
         {
             CKey keyRec;
             keyRec.fSet = true;
-            if (fCompressedPubKey)
-                keyRec.SetCompressedPubKey();
+            keyRec.SetCompressedPubKey(fCompressedPubKey);
             if (ECDSA_SIG_recover_key_GFp(keyRec.pkey, sig, (unsigned char*)&hash, sizeof(hash), i, 1) == 1)
                 if (keyRec.GetPubKey() == this->GetPubKey())
                 {
@@ -781,6 +756,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;
@@ -1048,7 +1025,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;
 
@@ -1192,6 +1170,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;