mirror of
https://github.com/kvazar-network/kevacoin.git
synced 2025-01-23 13:24:18 +00:00
Move CCryptoKeyStore to crypter.cpp
This breaks the dependency on crypter for disable-wallet builds.
This commit is contained in:
parent
ae6ea5a6fa
commit
829c920387
@ -39,7 +39,6 @@ version.o: obj/build.h
|
|||||||
libbitcoin_server_a_SOURCES = \
|
libbitcoin_server_a_SOURCES = \
|
||||||
addrman.cpp \
|
addrman.cpp \
|
||||||
alert.cpp \
|
alert.cpp \
|
||||||
crypter.cpp \
|
|
||||||
rpcserver.cpp \
|
rpcserver.cpp \
|
||||||
bloom.cpp \
|
bloom.cpp \
|
||||||
chainparams.cpp \
|
chainparams.cpp \
|
||||||
@ -61,6 +60,7 @@ libbitcoin_server_a_SOURCES = \
|
|||||||
|
|
||||||
libbitcoin_wallet_a_SOURCES = \
|
libbitcoin_wallet_a_SOURCES = \
|
||||||
db.cpp \
|
db.cpp \
|
||||||
|
crypter.cpp \
|
||||||
miner.cpp \
|
miner.cpp \
|
||||||
rpcdump.cpp \
|
rpcdump.cpp \
|
||||||
rpcmining.cpp \
|
rpcmining.cpp \
|
||||||
|
157
src/crypter.cpp
157
src/crypter.cpp
@ -4,9 +4,11 @@
|
|||||||
|
|
||||||
#include "crypter.h"
|
#include "crypter.h"
|
||||||
|
|
||||||
|
#include "script.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
#include <openssl/aes.h>
|
#include <openssl/aes.h>
|
||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
|
|
||||||
@ -117,3 +119,156 @@ bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned
|
|||||||
return false;
|
return false;
|
||||||
return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));
|
return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CCryptoKeyStore::SetCrypted()
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
if (fUseCrypto)
|
||||||
|
return true;
|
||||||
|
if (!mapKeys.empty())
|
||||||
|
return false;
|
||||||
|
fUseCrypto = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCryptoKeyStore::Lock()
|
||||||
|
{
|
||||||
|
if (!SetCrypted())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
vMasterKey.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
NotifyStatusChanged(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
if (!SetCrypted())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin();
|
||||||
|
for (; mi != mapCryptedKeys.end(); ++mi)
|
||||||
|
{
|
||||||
|
const CPubKey &vchPubKey = (*mi).second.first;
|
||||||
|
const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second;
|
||||||
|
CKeyingMaterial vchSecret;
|
||||||
|
if(!DecryptSecret(vMasterKeyIn, vchCryptedSecret, vchPubKey.GetHash(), vchSecret))
|
||||||
|
return false;
|
||||||
|
if (vchSecret.size() != 32)
|
||||||
|
return false;
|
||||||
|
CKey key;
|
||||||
|
key.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed());
|
||||||
|
if (key.GetPubKey() == vchPubKey)
|
||||||
|
break;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
vMasterKey = vMasterKeyIn;
|
||||||
|
}
|
||||||
|
NotifyStatusChanged(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCryptoKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
if (!IsCrypted())
|
||||||
|
return CBasicKeyStore::AddKeyPubKey(key, pubkey);
|
||||||
|
|
||||||
|
if (IsLocked())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::vector<unsigned char> vchCryptedSecret;
|
||||||
|
CKeyingMaterial vchSecret(key.begin(), key.end());
|
||||||
|
if (!EncryptSecret(vMasterKey, vchSecret, pubkey.GetHash(), vchCryptedSecret))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!AddCryptedKey(pubkey, vchCryptedSecret))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool CCryptoKeyStore::AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
if (!SetCrypted())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
mapCryptedKeys[vchPubKey.GetID()] = make_pair(vchPubKey, vchCryptedSecret);
|
||||||
|
}
|
||||||
|
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<unsigned char> &vchCryptedSecret = (*mi).second.second;
|
||||||
|
CKeyingMaterial vchSecret;
|
||||||
|
if (!DecryptSecret(vMasterKey, vchCryptedSecret, vchPubKey.GetHash(), vchSecret))
|
||||||
|
return false;
|
||||||
|
if (vchSecret.size() != 32)
|
||||||
|
return false;
|
||||||
|
keyOut.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCryptoKeyStore::GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const
|
||||||
|
{
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
if (!IsCrypted())
|
||||||
|
return CKeyStore::GetPubKey(address, vchPubKeyOut);
|
||||||
|
|
||||||
|
CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address);
|
||||||
|
if (mi != mapCryptedKeys.end())
|
||||||
|
{
|
||||||
|
vchPubKeyOut = (*mi).second.first;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
if (!mapCryptedKeys.empty() || IsCrypted())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
fUseCrypto = true;
|
||||||
|
BOOST_FOREACH(KeyMap::value_type& mKey, mapKeys)
|
||||||
|
{
|
||||||
|
const CKey &key = mKey.second;
|
||||||
|
CPubKey vchPubKey = key.GetPubKey();
|
||||||
|
CKeyingMaterial vchSecret(key.begin(), key.end());
|
||||||
|
std::vector<unsigned char> vchCryptedSecret;
|
||||||
|
if (!EncryptSecret(vMasterKeyIn, vchSecret, vchPubKey.GetHash(), vchCryptedSecret))
|
||||||
|
return false;
|
||||||
|
if (!AddCryptedKey(vchPubKey, vchCryptedSecret))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
mapKeys.clear();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "allocators.h"
|
#include "allocators.h"
|
||||||
#include "serialize.h"
|
#include "serialize.h"
|
||||||
|
#include "keystore.h"
|
||||||
|
|
||||||
class uint256;
|
class uint256;
|
||||||
|
|
||||||
@ -106,4 +107,86 @@ public:
|
|||||||
bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext);
|
bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext);
|
||||||
bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext);
|
bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext);
|
||||||
|
|
||||||
|
/** Keystore which keeps the private keys encrypted.
|
||||||
|
* It derives from the basic key store, which is used if no encryption is active.
|
||||||
|
*/
|
||||||
|
class CCryptoKeyStore : public CBasicKeyStore
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
CryptedKeyMap mapCryptedKeys;
|
||||||
|
|
||||||
|
CKeyingMaterial vMasterKey;
|
||||||
|
|
||||||
|
// if fUseCrypto is true, mapKeys must be empty
|
||||||
|
// if fUseCrypto is false, vMasterKey must be empty
|
||||||
|
bool fUseCrypto;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool SetCrypted();
|
||||||
|
|
||||||
|
// will encrypt previously unencrypted keys
|
||||||
|
bool EncryptKeys(CKeyingMaterial& vMasterKeyIn);
|
||||||
|
|
||||||
|
bool Unlock(const CKeyingMaterial& vMasterKeyIn);
|
||||||
|
|
||||||
|
public:
|
||||||
|
CCryptoKeyStore() : fUseCrypto(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsCrypted() const
|
||||||
|
{
|
||||||
|
return fUseCrypto;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsLocked() const
|
||||||
|
{
|
||||||
|
if (!IsCrypted())
|
||||||
|
return false;
|
||||||
|
bool result;
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
result = vMasterKey.empty();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Lock();
|
||||||
|
|
||||||
|
virtual bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
|
||||||
|
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
|
||||||
|
bool HaveKey(const CKeyID &address) const
|
||||||
|
{
|
||||||
|
{
|
||||||
|
LOCK(cs_KeyStore);
|
||||||
|
if (!IsCrypted())
|
||||||
|
return CBasicKeyStore::HaveKey(address);
|
||||||
|
return mapCryptedKeys.count(address) > 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool GetKey(const CKeyID &address, CKey& keyOut) const;
|
||||||
|
bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
|
||||||
|
void GetKeys(std::set<CKeyID> &setAddress) const
|
||||||
|
{
|
||||||
|
if (!IsCrypted())
|
||||||
|
{
|
||||||
|
CBasicKeyStore::GetKeys(setAddress);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setAddress.clear();
|
||||||
|
CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin();
|
||||||
|
while (mi != mapCryptedKeys.end())
|
||||||
|
{
|
||||||
|
setAddress.insert((*mi).first);
|
||||||
|
mi++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wallet status (encrypted, locked) changed.
|
||||||
|
* Note: Called without locks held.
|
||||||
|
*/
|
||||||
|
boost::signals2::signal<void (CCryptoKeyStore* wallet)> NotifyStatusChanged;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
152
src/keystore.cpp
152
src/keystore.cpp
@ -56,155 +56,3 @@ bool CBasicKeyStore::GetCScript(const CScriptID &hash, CScript& redeemScriptOut)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCryptoKeyStore::SetCrypted()
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
if (fUseCrypto)
|
|
||||||
return true;
|
|
||||||
if (!mapKeys.empty())
|
|
||||||
return false;
|
|
||||||
fUseCrypto = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCryptoKeyStore::Lock()
|
|
||||||
{
|
|
||||||
if (!SetCrypted())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
vMasterKey.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
NotifyStatusChanged(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
if (!SetCrypted())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin();
|
|
||||||
for (; mi != mapCryptedKeys.end(); ++mi)
|
|
||||||
{
|
|
||||||
const CPubKey &vchPubKey = (*mi).second.first;
|
|
||||||
const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second;
|
|
||||||
CKeyingMaterial vchSecret;
|
|
||||||
if(!DecryptSecret(vMasterKeyIn, vchCryptedSecret, vchPubKey.GetHash(), vchSecret))
|
|
||||||
return false;
|
|
||||||
if (vchSecret.size() != 32)
|
|
||||||
return false;
|
|
||||||
CKey key;
|
|
||||||
key.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed());
|
|
||||||
if (key.GetPubKey() == vchPubKey)
|
|
||||||
break;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
vMasterKey = vMasterKeyIn;
|
|
||||||
}
|
|
||||||
NotifyStatusChanged(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCryptoKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
if (!IsCrypted())
|
|
||||||
return CBasicKeyStore::AddKeyPubKey(key, pubkey);
|
|
||||||
|
|
||||||
if (IsLocked())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
std::vector<unsigned char> vchCryptedSecret;
|
|
||||||
CKeyingMaterial vchSecret(key.begin(), key.end());
|
|
||||||
if (!EncryptSecret(vMasterKey, vchSecret, pubkey.GetHash(), vchCryptedSecret))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!AddCryptedKey(pubkey, vchCryptedSecret))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool CCryptoKeyStore::AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
if (!SetCrypted())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
mapCryptedKeys[vchPubKey.GetID()] = make_pair(vchPubKey, vchCryptedSecret);
|
|
||||||
}
|
|
||||||
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<unsigned char> &vchCryptedSecret = (*mi).second.second;
|
|
||||||
CKeyingMaterial vchSecret;
|
|
||||||
if (!DecryptSecret(vMasterKey, vchCryptedSecret, vchPubKey.GetHash(), vchSecret))
|
|
||||||
return false;
|
|
||||||
if (vchSecret.size() != 32)
|
|
||||||
return false;
|
|
||||||
keyOut.Set(vchSecret.begin(), vchSecret.end(), vchPubKey.IsCompressed());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCryptoKeyStore::GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const
|
|
||||||
{
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
if (!IsCrypted())
|
|
||||||
return CKeyStore::GetPubKey(address, vchPubKeyOut);
|
|
||||||
|
|
||||||
CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address);
|
|
||||||
if (mi != mapCryptedKeys.end())
|
|
||||||
{
|
|
||||||
vchPubKeyOut = (*mi).second.first;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
if (!mapCryptedKeys.empty() || IsCrypted())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
fUseCrypto = true;
|
|
||||||
BOOST_FOREACH(KeyMap::value_type& mKey, mapKeys)
|
|
||||||
{
|
|
||||||
const CKey &key = mKey.second;
|
|
||||||
CPubKey vchPubKey = key.GetPubKey();
|
|
||||||
CKeyingMaterial vchSecret(key.begin(), key.end());
|
|
||||||
std::vector<unsigned char> vchCryptedSecret;
|
|
||||||
if (!EncryptSecret(vMasterKeyIn, vchSecret, vchPubKey.GetHash(), vchCryptedSecret))
|
|
||||||
return false;
|
|
||||||
if (!AddCryptedKey(vchPubKey, vchCryptedSecret))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
mapKeys.clear();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
@ -93,87 +93,4 @@ public:
|
|||||||
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
|
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
|
||||||
typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
|
typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
|
||||||
|
|
||||||
|
|
||||||
/** Keystore which keeps the private keys encrypted.
|
|
||||||
* It derives from the basic key store, which is used if no encryption is active.
|
|
||||||
*/
|
|
||||||
class CCryptoKeyStore : public CBasicKeyStore
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
CryptedKeyMap mapCryptedKeys;
|
|
||||||
|
|
||||||
CKeyingMaterial vMasterKey;
|
|
||||||
|
|
||||||
// if fUseCrypto is true, mapKeys must be empty
|
|
||||||
// if fUseCrypto is false, vMasterKey must be empty
|
|
||||||
bool fUseCrypto;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool SetCrypted();
|
|
||||||
|
|
||||||
// will encrypt previously unencrypted keys
|
|
||||||
bool EncryptKeys(CKeyingMaterial& vMasterKeyIn);
|
|
||||||
|
|
||||||
bool Unlock(const CKeyingMaterial& vMasterKeyIn);
|
|
||||||
|
|
||||||
public:
|
|
||||||
CCryptoKeyStore() : fUseCrypto(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsCrypted() const
|
|
||||||
{
|
|
||||||
return fUseCrypto;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsLocked() const
|
|
||||||
{
|
|
||||||
if (!IsCrypted())
|
|
||||||
return false;
|
|
||||||
bool result;
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
result = vMasterKey.empty();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Lock();
|
|
||||||
|
|
||||||
virtual bool AddCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
|
|
||||||
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
|
|
||||||
bool HaveKey(const CKeyID &address) const
|
|
||||||
{
|
|
||||||
{
|
|
||||||
LOCK(cs_KeyStore);
|
|
||||||
if (!IsCrypted())
|
|
||||||
return CBasicKeyStore::HaveKey(address);
|
|
||||||
return mapCryptedKeys.count(address) > 0;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bool GetKey(const CKeyID &address, CKey& keyOut) const;
|
|
||||||
bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
|
|
||||||
void GetKeys(std::set<CKeyID> &setAddress) const
|
|
||||||
{
|
|
||||||
if (!IsCrypted())
|
|
||||||
{
|
|
||||||
CBasicKeyStore::GetKeys(setAddress);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setAddress.clear();
|
|
||||||
CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin();
|
|
||||||
while (mi != mapCryptedKeys.end())
|
|
||||||
{
|
|
||||||
setAddress.insert((*mi).first);
|
|
||||||
mi++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wallet status (encrypted, locked) changed.
|
|
||||||
* Note: Called without locks held.
|
|
||||||
*/
|
|
||||||
boost::signals2::signal<void (CCryptoKeyStore* wallet)> NotifyStatusChanged;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user