diff --git a/src/keystore.cpp b/src/keystore.cpp index b40d84659d2f8..39d685b30a01e 100644 --- a/src/keystore.cpp +++ b/src/keystore.cpp @@ -36,33 +36,6 @@ bool CBasicKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey) return true; } -bool CBasicKeyStore::HaveKey(const CKeyID &address) const -{ - LOCK(cs_KeyStore); - return mapKeys.count(address) > 0; -} - -std::set CBasicKeyStore::GetKeys() const -{ - LOCK(cs_KeyStore); - std::set set_address; - for (const auto& mi : mapKeys) { - set_address.insert(mi.first); - } - return set_address; -} - -bool CBasicKeyStore::GetKey(const CKeyID &address, CKey &keyOut) const -{ - LOCK(cs_KeyStore); - KeyMap::const_iterator mi = mapKeys.find(address); - if (mi != mapKeys.end()) { - keyOut = mi->second; - return true; - } - return false; -} - bool CBasicKeyStore::AddCScript(const CScript& redeemScript) { if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE) diff --git a/src/keystore.h b/src/keystore.h index 43ca957ac2dc5..f2c4f3a9a53af 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -65,9 +65,37 @@ class CBasicKeyStore : public CKeyStore public: bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override; bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override; - bool HaveKey(const CKeyID &address) const override; - std::set GetKeys() const override; - bool GetKey(const CKeyID &address, CKey &keyOut) const override; + bool HaveKey(const CKeyID &address) const override + { + bool result; + { + LOCK(cs_KeyStore); + result = (mapKeys.count(address) > 0); + } + return result; + } + std::set GetKeys() const override + { + LOCK(cs_KeyStore); + std::set set_address; + for (const auto& mi : mapKeys) { + set_address.insert(mi.first); + } + return set_address; + } + bool GetKey(const CKeyID &address, CKey &keyOut) const override + { + { + LOCK(cs_KeyStore); + KeyMap::const_iterator mi = mapKeys.find(address); + if (mi != mapKeys.end()) + { + keyOut = mi->second; + return true; + } + } + return false; + } bool AddCScript(const CScript& redeemScript) override; bool HaveCScript(const CScriptID &hash) const override; bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const override; diff --git a/src/wallet/crypter.cpp b/src/wallet/crypter.cpp index b18f9b3531582..5815793ffe7ed 100644 --- a/src/wallet/crypter.cpp +++ b/src/wallet/crypter.cpp @@ -198,15 +198,6 @@ bool CCryptoKeyStore::SetCrypted() return true; } -bool CCryptoKeyStore::IsLocked() const -{ - if (!IsCrypted()) { - return false; - } - LOCK(cs_KeyStore); - return vMasterKey.empty(); -} - bool CCryptoKeyStore::Lock(bool fAllowMixing) { if (!SetCrypted()) @@ -278,23 +269,21 @@ bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn, bool fForMixin bool CCryptoKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey) { - LOCK(cs_KeyStore); - if (!IsCrypted()) { - return CBasicKeyStore::AddKeyPubKey(key, pubkey); - } + { + LOCK(cs_KeyStore); + if (!IsCrypted()) + return CBasicKeyStore::AddKeyPubKey(key, pubkey); - if (IsLocked(true)) { - return false; - } + if (IsLocked(true)) + return false; - std::vector vchCryptedSecret; - CKeyingMaterial vchSecret(key.begin(), key.end()); - if (!EncryptSecret(vMasterKey, vchSecret, pubkey.GetHash(), vchCryptedSecret)) { - return false; - } + std::vector vchCryptedSecret; + CKeyingMaterial vchSecret(key.begin(), key.end()); + if (!EncryptSecret(vMasterKey, vchSecret, pubkey.GetHash(), vchCryptedSecret)) + return false; - if (!AddCryptedKey(pubkey, vchCryptedSecret)) { - return false; + if (!AddCryptedKey(pubkey, vchCryptedSecret)) + return false; } return true; } @@ -302,89 +291,73 @@ bool CCryptoKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey) bool CCryptoKeyStore::AddCryptedKey(const CPubKey &vchPubKey, const std::vector &vchCryptedSecret) { - LOCK(cs_KeyStore); - if (!SetCrypted()) { - return false; - } - - mapCryptedKeys[vchPubKey.GetID()] = make_pair(vchPubKey, vchCryptedSecret); - return true; -} + { + LOCK(cs_KeyStore); + if (!SetCrypted()) + return false; -bool CCryptoKeyStore::HaveKey(const CKeyID &address) const -{ - LOCK(cs_KeyStore); - if (!IsCrypted()) { - return CBasicKeyStore::HaveKey(address); + mapCryptedKeys[vchPubKey.GetID()] = make_pair(vchPubKey, vchCryptedSecret); } - return mapCryptedKeys.count(address) > 0; + return true; } bool CCryptoKeyStore::GetKey(const CKeyID &address, CKey& keyOut) const { - LOCK(cs_KeyStore); - if (!IsCrypted()) { - return CBasicKeyStore::GetKey(address, keyOut); - } - - CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); - if (mi != mapCryptedKeys.end()) { - const CPubKey &vchPubKey = (*mi).second.first; - const std::vector &vchCryptedSecret = (*mi).second.second; - return DecryptKey(vMasterKey, vchCryptedSecret, vchPubKey, keyOut); + LOCK(cs_KeyStore); + if (!IsCrypted()) + return CBasicKeyStore::GetKey(address, keyOut); + + CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); + if (mi != mapCryptedKeys.end()) + { + const CPubKey &vchPubKey = (*mi).second.first; + const std::vector &vchCryptedSecret = (*mi).second.second; + return DecryptKey(vMasterKey, vchCryptedSecret, vchPubKey, keyOut); + } } return false; } bool CCryptoKeyStore::GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const { - LOCK(cs_KeyStore); - if (!IsCrypted()) - return CBasicKeyStore::GetPubKey(address, vchPubKeyOut); - - CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); - if (mi != mapCryptedKeys.end()) { - vchPubKeyOut = (*mi).second.first; - return true; - } - // Check for watch-only pubkeys - return CBasicKeyStore::GetPubKey(address, vchPubKeyOut); -} + LOCK(cs_KeyStore); + if (!IsCrypted()) + return CBasicKeyStore::GetPubKey(address, vchPubKeyOut); -std::set CCryptoKeyStore::GetKeys() const -{ - LOCK(cs_KeyStore); - if (!IsCrypted()) { - return CBasicKeyStore::GetKeys(); - } - std::set set_address; - for (const auto& mi : mapCryptedKeys) { - set_address.insert(mi.first); + CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); + if (mi != mapCryptedKeys.end()) + { + vchPubKeyOut = (*mi).second.first; + return true; + } + // Check for watch-only pubkeys + return CBasicKeyStore::GetPubKey(address, vchPubKeyOut); } - return set_address; } bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn) { - LOCK(cs_KeyStore); - if (!mapCryptedKeys.empty() || IsCrypted()) - return false; - - fUseCrypto = true; - for (KeyMap::value_type& mKey : mapKeys) { - const CKey &key = mKey.second; - CPubKey vchPubKey = key.GetPubKey(); - CKeyingMaterial vchSecret(key.begin(), key.end()); - std::vector vchCryptedSecret; - if (!EncryptSecret(vMasterKeyIn, vchSecret, vchPubKey.GetHash(), vchCryptedSecret)) - return false; - if (!AddCryptedKey(vchPubKey, vchCryptedSecret)) + LOCK(cs_KeyStore); + if (!mapCryptedKeys.empty() || IsCrypted()) return false; + + fUseCrypto = true; + for (KeyMap::value_type& mKey : mapKeys) + { + const CKey &key = mKey.second; + CPubKey vchPubKey = key.GetPubKey(); + CKeyingMaterial vchSecret(key.begin(), key.end()); + std::vector vchCryptedSecret; + if (!EncryptSecret(vMasterKeyIn, vchSecret, vchPubKey.GetHash(), vchCryptedSecret)) + return false; + if (!AddCryptedKey(vchPubKey, vchCryptedSecret)) + return false; + } + mapKeys.clear(); } - mapKeys.clear(); return true; } diff --git a/src/wallet/crypter.h b/src/wallet/crypter.h index d2d80e4550c2f..71ddfa73d6490 100644 --- a/src/wallet/crypter.h +++ b/src/wallet/crypter.h @@ -152,16 +152,69 @@ class CCryptoKeyStore : public CBasicKeyStore { } - bool IsCrypted() const { return fUseCrypto; } - bool IsLocked(bool fForMixing = false) const; + bool IsCrypted() const + { + return fUseCrypto; + } + + // This function should be used in a different combinations to determine + // if CCryptoKeyStore is fully locked so that no operations requiring access + // to private keys are possible: + // IsLocked(true) + // or if CCryptoKeyStore's private keys are available for mixing only: + // !IsLocked(true) && IsLocked() + // or if they are available for everything: + // !IsLocked() + bool IsLocked(bool fForMixing = false) const + { + if (!IsCrypted()) + return false; + bool result; + { + LOCK(cs_KeyStore); + result = vMasterKey.empty(); + } + // fForMixing fOnlyMixingAllowed return + // --------------------------------------- + // true true result + // true false result + // false true true + // false false result + + if(!fForMixing && fOnlyMixingAllowed) return true; + + return result; + } + bool Lock(bool fAllowMixing = false); virtual bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector &vchCryptedSecret); bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override; - bool HaveKey(const CKeyID &address) const override; + bool HaveKey(const CKeyID &address) const override + { + { + LOCK(cs_KeyStore); + if (!IsCrypted()) { + return CBasicKeyStore::HaveKey(address); + } + return mapCryptedKeys.count(address) > 0; + } + return false; + } bool GetKey(const CKeyID &address, CKey& keyOut) const override; bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override; - std::set GetKeys() const override; + std::set GetKeys() const override + { + LOCK(cs_KeyStore); + if (!IsCrypted()) { + return CBasicKeyStore::GetKeys(); + } + std::set set_address; + for (const auto& mi : mapCryptedKeys) { + set_address.insert(mi.first); + } + return set_address; + } virtual bool GetHDChain(CHDChain& hdChainRet) const override;