raw
genesis                 1 // Copyright (c) 2009-2010 Satoshi Nakamoto
genesis 2 // Copyright (c) 2011 The Bitcoin developers
genesis 3 // Distributed under the MIT/X11 software license, see the accompanying
genesis 4 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
genesis 5 #ifndef BITCOIN_KEYSTORE_H
genesis 6 #define BITCOIN_KEYSTORE_H
genesis 7
genesis 8 #include "crypter.h"
genesis 9
genesis 10 // A virtual base class for key stores
genesis 11 class CKeyStore
genesis 12 {
genesis 13 protected:
genesis 14 mutable CCriticalSection cs_KeyStore;
genesis 15
genesis 16 public:
genesis 17 // Add a key to the store.
genesis 18 virtual bool AddKey(const CKey& key) =0;
genesis 19
genesis 20 // Check whether a key corresponding to a given address is present in the store.
genesis 21 virtual bool HaveKey(const CBitcoinAddress &address) const =0;
genesis 22
genesis 23 // Retrieve a key corresponding to a given address from the store.
genesis 24 // Return true if succesful.
genesis 25 virtual bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const =0;
genesis 26
genesis 27 // Retrieve only the public key corresponding to a given address.
genesis 28 // This may succeed even if GetKey fails (e.g., encrypted wallets)
genesis 29 virtual bool GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char>& vchPubKeyOut) const;
genesis 30
funken_prikey_tools 31 virtual bool GetSecret(const CBitcoinAddress &address, CSecret& vchSecret) const
funken_prikey_tools 32 {
funken_prikey_tools 33 CKey key;
funken_prikey_tools 34 if (!GetKey(address, key))
funken_prikey_tools 35 return false;
funken_prikey_tools 36 vchSecret = key.GetSecret();
funken_prikey_tools 37 return true;
funken_prikey_tools 38 }
funken_prikey_tools 39
genesis 40 // Generate a new key, and add it to the store
genesis 41 virtual std::vector<unsigned char> GenerateNewKey();
genesis 42 };
genesis 43
genesis 44 typedef std::map<CBitcoinAddress, CSecret> KeyMap;
genesis 45
genesis 46 // Basic key store, that keeps keys in an address->secret map
genesis 47 class CBasicKeyStore : public CKeyStore
genesis 48 {
genesis 49 protected:
genesis 50 KeyMap mapKeys;
genesis 51
genesis 52 public:
genesis 53 bool AddKey(const CKey& key);
genesis 54 bool HaveKey(const CBitcoinAddress &address) const
genesis 55 {
genesis 56 bool result;
genesis 57 CRITICAL_BLOCK(cs_KeyStore)
genesis 58 result = (mapKeys.count(address) > 0);
genesis 59 return result;
genesis 60 }
genesis 61 bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const
genesis 62 {
genesis 63 CRITICAL_BLOCK(cs_KeyStore)
genesis 64 {
genesis 65 KeyMap::const_iterator mi = mapKeys.find(address);
genesis 66 if (mi != mapKeys.end())
genesis 67 {
genesis 68 keyOut.SetSecret((*mi).second);
genesis 69 return true;
genesis 70 }
genesis 71 }
genesis 72 return false;
genesis 73 }
genesis 74 };
genesis 75
genesis 76 typedef std::map<CBitcoinAddress, std::pair<std::vector<unsigned char>, std::vector<unsigned char> > > CryptedKeyMap;
genesis 77
genesis 78 // Keystore which keeps the private keys encrypted
genesis 79 // It derives from the basic key store, which is used if no encryption is active.
genesis 80 class CCryptoKeyStore : public CBasicKeyStore
genesis 81 {
genesis 82 private:
genesis 83 CryptedKeyMap mapCryptedKeys;
genesis 84
genesis 85 CKeyingMaterial vMasterKey;
genesis 86
genesis 87 // if fUseCrypto is true, mapKeys must be empty
genesis 88 // if fUseCrypto is false, vMasterKey must be empty
genesis 89 bool fUseCrypto;
genesis 90
genesis 91 protected:
genesis 92 bool SetCrypted();
genesis 93
genesis 94 // will encrypt previously unencrypted keys
genesis 95 bool EncryptKeys(CKeyingMaterial& vMasterKeyIn);
genesis 96
genesis 97 bool Unlock(const CKeyingMaterial& vMasterKeyIn);
genesis 98
genesis 99 public:
genesis 100 CCryptoKeyStore() : fUseCrypto(false)
genesis 101 {
genesis 102 }
genesis 103
genesis 104 bool IsCrypted() const
genesis 105 {
genesis 106 return fUseCrypto;
genesis 107 }
genesis 108
genesis 109 bool IsLocked() const
genesis 110 {
genesis 111 if (!IsCrypted())
genesis 112 return false;
genesis 113 bool result;
genesis 114 CRITICAL_BLOCK(cs_KeyStore)
genesis 115 result = vMasterKey.empty();
genesis 116 return result;
genesis 117 }
genesis 118
genesis 119 bool Lock()
genesis 120 {
genesis 121 if (!SetCrypted())
genesis 122 return false;
genesis 123
genesis 124 CRITICAL_BLOCK(cs_KeyStore)
genesis 125 vMasterKey.clear();
genesis 126
genesis 127 return true;
genesis 128 }
genesis 129
genesis 130 virtual bool AddCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
genesis 131 std::vector<unsigned char> GenerateNewKey();
genesis 132 bool AddKey(const CKey& key);
genesis 133 bool HaveKey(const CBitcoinAddress &address) const
genesis 134 {
genesis 135 CRITICAL_BLOCK(cs_KeyStore)
genesis 136 {
genesis 137 if (!IsCrypted())
genesis 138 return CBasicKeyStore::HaveKey(address);
genesis 139 return mapCryptedKeys.count(address) > 0;
genesis 140 }
genesis 141 return false;
genesis 142 }
genesis 143 bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const;
genesis 144 bool GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char>& vchPubKeyOut) const;
genesis 145 };
genesis 146
genesis 147 #endif