Prepare codebase for Encrypted Keys.
This commit is contained in:
committed by
Matt Corallo
parent
e94010b239
commit
acd6501610
@@ -4,12 +4,26 @@
|
||||
#ifndef BITCOIN_KEYSTORE_H
|
||||
#define BITCOIN_KEYSTORE_H
|
||||
|
||||
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CMasterKey;
|
||||
|
||||
class CKeyStore
|
||||
{
|
||||
public:
|
||||
mutable CCriticalSection cs_KeyStore;
|
||||
|
||||
virtual bool AddKey(const CKey& key) =0;
|
||||
virtual bool HaveKey(const std::vector<unsigned char> &vchPubKey) const =0;
|
||||
virtual bool GetPrivKey(const std::vector<unsigned char> &vchPubKey, CPrivKey& keyOut) const =0;
|
||||
virtual std::vector<unsigned char> GenerateNewKey();
|
||||
};
|
||||
|
||||
class CBasicKeyStore : public CKeyStore
|
||||
{
|
||||
protected:
|
||||
std::map<std::vector<unsigned char>, CPrivKey> mapKeys;
|
||||
mutable CCriticalSection cs_mapKeys;
|
||||
virtual bool AddKey(const CKey& key);
|
||||
|
||||
public:
|
||||
bool AddKey(const CKey& key);
|
||||
bool HaveKey(const std::vector<unsigned char> &vchPubKey) const
|
||||
{
|
||||
return (mapKeys.count(vchPubKey) > 0);
|
||||
@@ -24,7 +38,76 @@ public:
|
||||
}
|
||||
return false;
|
||||
}
|
||||
std::vector<unsigned char> GenerateNewKey();
|
||||
};
|
||||
|
||||
class CCryptoKeyStore : public CBasicKeyStore
|
||||
{
|
||||
private:
|
||||
std::map<std::vector<unsigned char>, std::vector<unsigned char> > mapCryptedKeys;
|
||||
|
||||
CMasterKey vMasterKey;
|
||||
|
||||
// if fUseCrypto is true, mapKeys must be empty
|
||||
// if fUseCrypto is false, vMasterKey must be empty
|
||||
bool fUseCrypto;
|
||||
|
||||
protected:
|
||||
bool IsCrypted() const
|
||||
{
|
||||
return fUseCrypto;
|
||||
}
|
||||
|
||||
bool SetCrypted()
|
||||
{
|
||||
if (fUseCrypto)
|
||||
return true;
|
||||
if (!mapKeys.empty())
|
||||
return false;
|
||||
fUseCrypto = true;
|
||||
}
|
||||
|
||||
// will encrypt previously unencrypted keys
|
||||
bool GenerateMasterKey();
|
||||
|
||||
bool GetMasterKey(CMasterKey &vMasterKeyOut) const
|
||||
{
|
||||
if (!IsCrypted())
|
||||
return false;
|
||||
if (IsLocked())
|
||||
return false;
|
||||
vMasterKeyOut = vMasterKey;
|
||||
return true;
|
||||
}
|
||||
bool Unlock(const CMasterKey& vMasterKeyIn);
|
||||
|
||||
public:
|
||||
CCryptoKeyStore() : fUseCrypto(false)
|
||||
{
|
||||
}
|
||||
|
||||
bool IsLocked() const
|
||||
{
|
||||
if (!IsCrypted())
|
||||
return false;
|
||||
return vMasterKey.empty();
|
||||
}
|
||||
|
||||
bool Lock()
|
||||
{
|
||||
if (!SetCrypted())
|
||||
return false;
|
||||
vMasterKey.clear();
|
||||
}
|
||||
|
||||
virtual bool AddCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
|
||||
bool AddKey(const CKey& key);
|
||||
bool HaveKey(const std::vector<unsigned char> &vchPubKey) const
|
||||
{
|
||||
if (!IsCrypted())
|
||||
return CBasicKeyStore::HaveKey(vchPubKey);
|
||||
return mapCryptedKeys.count(vchPubKey) > 0;
|
||||
}
|
||||
bool GetPrivKey(const std::vector<unsigned char> &vchPubKey, CPrivKey& keyOut) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user