Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/crypter.cpp
Show First 20 Lines • Show All 177 Lines • ▼ Show 20 Lines | bool CCryptoKeyStore::SetCrypted() { | ||||
fUseCrypto = true; | fUseCrypto = true; | ||||
return true; | return true; | ||||
} | } | ||||
bool CCryptoKeyStore::IsLocked() const { | bool CCryptoKeyStore::IsLocked() const { | ||||
if (!IsCrypted()) { | if (!IsCrypted()) { | ||||
return false; | return false; | ||||
} | } | ||||
bool result; | |||||
{ | |||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
result = vMasterKey.empty(); | return vMasterKey.empty(); | ||||
} | |||||
return result; | |||||
} | } | ||||
bool CCryptoKeyStore::Lock() { | bool CCryptoKeyStore::Lock() { | ||||
if (!SetCrypted()) { | if (!SetCrypted()) { | ||||
return false; | return false; | ||||
} | } | ||||
{ | { | ||||
Show All 39 Lines | bool CCryptoKeyStore::Unlock(const CKeyingMaterial &vMasterKeyIn) { | ||||
vMasterKey = vMasterKeyIn; | vMasterKey = vMasterKeyIn; | ||||
fDecryptionThoroughlyChecked = true; | fDecryptionThoroughlyChecked = true; | ||||
} | } | ||||
NotifyStatusChanged(this); | NotifyStatusChanged(this); | ||||
return true; | return true; | ||||
} | } | ||||
bool CCryptoKeyStore::AddKeyPubKey(const CKey &key, const CPubKey &pubkey) { | bool CCryptoKeyStore::AddKeyPubKey(const CKey &key, const CPubKey &pubkey) { | ||||
{ | |||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
if (!IsCrypted()) { | if (!IsCrypted()) { | ||||
return CBasicKeyStore::AddKeyPubKey(key, pubkey); | return CBasicKeyStore::AddKeyPubKey(key, pubkey); | ||||
} | } | ||||
if (IsLocked()) { | if (IsLocked()) { | ||||
return false; | return false; | ||||
} | } | ||||
std::vector<uint8_t> vchCryptedSecret; | std::vector<uint8_t> vchCryptedSecret; | ||||
CKeyingMaterial vchSecret(key.begin(), key.end()); | CKeyingMaterial vchSecret(key.begin(), key.end()); | ||||
if (!EncryptSecret(vMasterKey, vchSecret, pubkey.GetHash(), | if (!EncryptSecret(vMasterKey, vchSecret, pubkey.GetHash(), | ||||
vchCryptedSecret)) { | vchCryptedSecret)) { | ||||
return false; | return false; | ||||
} | } | ||||
if (!AddCryptedKey(pubkey, vchCryptedSecret)) { | if (!AddCryptedKey(pubkey, vchCryptedSecret)) { | ||||
return false; | return false; | ||||
} | } | ||||
} | |||||
return true; | return true; | ||||
} | } | ||||
bool CCryptoKeyStore::AddCryptedKey( | bool CCryptoKeyStore::AddCryptedKey( | ||||
const CPubKey &vchPubKey, const std::vector<uint8_t> &vchCryptedSecret) { | const CPubKey &vchPubKey, const std::vector<uint8_t> &vchCryptedSecret) { | ||||
{ | |||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
if (!SetCrypted()) { | if (!SetCrypted()) { | ||||
return false; | return false; | ||||
} | } | ||||
mapCryptedKeys[vchPubKey.GetID()] = | mapCryptedKeys[vchPubKey.GetID()] = make_pair(vchPubKey, vchCryptedSecret); | ||||
make_pair(vchPubKey, vchCryptedSecret); | |||||
} | |||||
return true; | return true; | ||||
} | } | ||||
bool CCryptoKeyStore::HaveKey(const CKeyID &address) const { | bool CCryptoKeyStore::HaveKey(const CKeyID &address) const { | ||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
if (!IsCrypted()) { | if (!IsCrypted()) { | ||||
return CBasicKeyStore::HaveKey(address); | return CBasicKeyStore::HaveKey(address); | ||||
} | } | ||||
return mapCryptedKeys.count(address) > 0; | return mapCryptedKeys.count(address) > 0; | ||||
} | } | ||||
bool CCryptoKeyStore::GetKey(const CKeyID &address, CKey &keyOut) const { | bool CCryptoKeyStore::GetKey(const CKeyID &address, CKey &keyOut) const { | ||||
{ | |||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
if (!IsCrypted()) { | if (!IsCrypted()) { | ||||
return CBasicKeyStore::GetKey(address, keyOut); | return CBasicKeyStore::GetKey(address, keyOut); | ||||
} | } | ||||
CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); | CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); | ||||
if (mi != mapCryptedKeys.end()) { | if (mi != mapCryptedKeys.end()) { | ||||
const CPubKey &vchPubKey = (*mi).second.first; | const CPubKey &vchPubKey = (*mi).second.first; | ||||
const std::vector<uint8_t> &vchCryptedSecret = (*mi).second.second; | const std::vector<uint8_t> &vchCryptedSecret = (*mi).second.second; | ||||
return DecryptKey(vMasterKey, vchCryptedSecret, vchPubKey, keyOut); | return DecryptKey(vMasterKey, vchCryptedSecret, vchPubKey, keyOut); | ||||
} | } | ||||
} | |||||
return false; | return false; | ||||
} | } | ||||
bool CCryptoKeyStore::GetPubKey(const CKeyID &address, | bool CCryptoKeyStore::GetPubKey(const CKeyID &address, | ||||
CPubKey &vchPubKeyOut) const { | CPubKey &vchPubKeyOut) const { | ||||
{ | |||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
if (!IsCrypted()) { | if (!IsCrypted()) { | ||||
return CBasicKeyStore::GetPubKey(address, vchPubKeyOut); | return CBasicKeyStore::GetPubKey(address, vchPubKeyOut); | ||||
} | } | ||||
CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); | CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); | ||||
if (mi != mapCryptedKeys.end()) { | if (mi != mapCryptedKeys.end()) { | ||||
vchPubKeyOut = (*mi).second.first; | vchPubKeyOut = (*mi).second.first; | ||||
return true; | return true; | ||||
} | } | ||||
// Check for watch-only pubkeys | // Check for watch-only pubkeys | ||||
return CBasicKeyStore::GetPubKey(address, vchPubKeyOut); | return CBasicKeyStore::GetPubKey(address, vchPubKeyOut); | ||||
} | } | ||||
return false; | |||||
} | |||||
std::set<CKeyID> CCryptoKeyStore::GetKeys() const { | std::set<CKeyID> CCryptoKeyStore::GetKeys() const { | ||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
if (!IsCrypted()) { | if (!IsCrypted()) { | ||||
return CBasicKeyStore::GetKeys(); | return CBasicKeyStore::GetKeys(); | ||||
} | } | ||||
std::set<CKeyID> set_address; | std::set<CKeyID> set_address; | ||||
for (const auto &mi : mapCryptedKeys) { | for (const auto &mi : mapCryptedKeys) { | ||||
set_address.insert(mi.first); | set_address.insert(mi.first); | ||||
} | } | ||||
return set_address; | return set_address; | ||||
} | } | ||||
bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial &vMasterKeyIn) { | bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial &vMasterKeyIn) { | ||||
{ | |||||
LOCK(cs_KeyStore); | LOCK(cs_KeyStore); | ||||
if (!mapCryptedKeys.empty() || IsCrypted()) { | if (!mapCryptedKeys.empty() || IsCrypted()) { | ||||
return false; | return false; | ||||
} | } | ||||
fUseCrypto = true; | fUseCrypto = true; | ||||
for (KeyMap::value_type &mKey : mapKeys) { | for (const KeyMap::value_type &mKey : mapKeys) { | ||||
const CKey &key = mKey.second; | const CKey &key = mKey.second; | ||||
CPubKey vchPubKey = key.GetPubKey(); | CPubKey vchPubKey = key.GetPubKey(); | ||||
CKeyingMaterial vchSecret(key.begin(), key.end()); | CKeyingMaterial vchSecret(key.begin(), key.end()); | ||||
std::vector<uint8_t> vchCryptedSecret; | std::vector<uint8_t> vchCryptedSecret; | ||||
if (!EncryptSecret(vMasterKeyIn, vchSecret, vchPubKey.GetHash(), | if (!EncryptSecret(vMasterKeyIn, vchSecret, vchPubKey.GetHash(), | ||||
vchCryptedSecret)) { | vchCryptedSecret)) { | ||||
return false; | return false; | ||||
} | } | ||||
if (!AddCryptedKey(vchPubKey, vchCryptedSecret)) { | if (!AddCryptedKey(vchPubKey, vchCryptedSecret)) { | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
mapKeys.clear(); | mapKeys.clear(); | ||||
} | |||||
return true; | return true; | ||||
} | } |