aboutsummaryrefslogtreecommitdiff
path: root/src/keystore.h
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2011-06-25 14:57:32 +0200
committerMatt Corallo <matt@bluematt.me>2011-07-08 15:46:47 +0200
commitacd6501610817eee0bd1c8ea9c591f043affbaec (patch)
treee2b05a5d0bc1a0b890b2b1d6a16713967143ff95 /src/keystore.h
parente94010b2395694d56dd62a2cb956a40ef801a191 (diff)
downloadbitcoin-acd6501610817eee0bd1c8ea9c591f043affbaec.tar.xz
Prepare codebase for Encrypted Keys.
Diffstat (limited to 'src/keystore.h')
-rw-r--r--src/keystore.h89
1 files changed, 86 insertions, 3 deletions
diff --git a/src/keystore.h b/src/keystore.h
index 6080d7d7f5..4095535493 100644
--- a/src/keystore.h
+++ b/src/keystore.h
@@ -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