Merge pull request #4670

a35b55b Dont run full check every time we decrypt wallet. (Matt Corallo)
1e21c17 Make CCryptoKeyStore::Unlock check all keys. (Gregory Maxwell)
This commit is contained in:
Wladimir J. van der Laan 2014-08-19 12:23:28 +02:00
commit dd2819701a
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
2 changed files with 29 additions and 5 deletions

View File

@ -152,6 +152,8 @@ bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
if (!SetCrypted()) if (!SetCrypted())
return false; return false;
bool keyPass = false;
bool keyFail = false;
CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin(); CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin();
for (; mi != mapCryptedKeys.end(); ++mi) for (; mi != mapCryptedKeys.end(); ++mi)
{ {
@ -159,16 +161,35 @@ bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second; const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second;
CKeyingMaterial vchSecret; CKeyingMaterial vchSecret;
if(!DecryptSecret(vMasterKeyIn, vchCryptedSecret, vchPubKey.GetHash(), vchSecret)) if(!DecryptSecret(vMasterKeyIn, vchCryptedSecret, vchPubKey.GetHash(), vchSecret))
return false; {
keyFail = true;
break;
}
if (vchSecret.size() != 32) if (vchSecret.size() != 32)
return false; {
keyFail = true;
break;
}
CKey key; CKey key;
key.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed()); key.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed());
if (key.GetPubKey() == vchPubKey) if (key.GetPubKey() != vchPubKey)
{
keyFail = true;
break;
}
keyPass = true;
if (fDecryptionThoroughlyChecked)
break; break;
return false;
} }
if (keyPass && keyFail)
{
LogPrintf("The wallet is probably corrupted: Some keys decrypt but not all.");
assert(false);
}
if (keyFail || !keyPass)
return false;
vMasterKey = vMasterKeyIn; vMasterKey = vMasterKeyIn;
fDecryptionThoroughlyChecked = true;
} }
NotifyStatusChanged(this); NotifyStatusChanged(this);
return true; return true;

View File

@ -121,6 +121,9 @@ private:
// if fUseCrypto is false, vMasterKey must be empty // if fUseCrypto is false, vMasterKey must be empty
bool fUseCrypto; bool fUseCrypto;
// keeps track of whether Unlock has run a thourough check before
bool fDecryptionThoroughlyChecked;
protected: protected:
bool SetCrypted(); bool SetCrypted();
@ -130,7 +133,7 @@ protected:
bool Unlock(const CKeyingMaterial& vMasterKeyIn); bool Unlock(const CKeyingMaterial& vMasterKeyIn);
public: public:
CCryptoKeyStore() : fUseCrypto(false) CCryptoKeyStore() : fUseCrypto(false), fDecryptionThoroughlyChecked(false)
{ {
} }