1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2012 The Bitcoin developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef BITCOIN_KEYSTORE_H
6 #define BITCOIN_KEYSTORE_H
11 /** A virtual base class for key stores */
15 mutable CCriticalSection cs_KeyStore;
18 virtual ~CKeyStore() {}
20 // Add a key to the store.
21 virtual bool AddKey(const CKey& key) =0;
23 // Check whether a key corresponding to a given address is present in the store.
24 virtual bool HaveKey(const CBitcoinAddress &address) const =0;
25 virtual bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const =0;
26 virtual void GetKeys(std::set<CBitcoinAddress> &setAddress) const =0;
27 virtual bool GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char>& vchPubKeyOut) const;
29 // Support for BIP 0013 : see https://en.bitcoin.it/wiki/BIP_0013
30 virtual bool AddCScript(const CScript& redeemScript) =0;
31 virtual bool HaveCScript(const uint160 &hash) const =0;
32 virtual bool GetCScript(const uint160 &hash, CScript& redeemScriptOut) const =0;
34 virtual bool GetSecret(const CBitcoinAddress &address, CSecret& vchSecret, bool &fCompressed) const
37 if (!GetKey(address, key))
39 vchSecret = key.GetSecret(fCompressed);
44 typedef std::map<CBitcoinAddress, std::pair<CSecret, bool> > KeyMap;
45 typedef std::map<uint160, CScript > ScriptMap;
47 /** Basic key store, that keeps keys in an address->secret map */
48 class CBasicKeyStore : public CKeyStore
55 bool AddKey(const CKey& key);
56 bool HaveKey(const CBitcoinAddress &address) const
61 result = (mapKeys.count(address) > 0);
65 void GetKeys(std::set<CBitcoinAddress> &setAddress) const
70 KeyMap::const_iterator mi = mapKeys.begin();
71 while (mi != mapKeys.end())
73 setAddress.insert((*mi).first);
78 bool GetKey(const CBitcoinAddress &address, CKey &keyOut) const
82 KeyMap::const_iterator mi = mapKeys.find(address);
83 if (mi != mapKeys.end())
86 keyOut.SetSecret((*mi).second.first, (*mi).second.second);
92 virtual bool AddCScript(const CScript& redeemScript);
93 virtual bool HaveCScript(const uint160 &hash) const;
94 virtual bool GetCScript(const uint160 &hash, CScript& redeemScriptOut) const;
97 typedef std::map<CBitcoinAddress, std::pair<std::vector<unsigned char>, std::vector<unsigned char> > > CryptedKeyMap;
99 /** Keystore which keeps the private keys encrypted.
100 * It derives from the basic key store, which is used if no encryption is active.
102 class CCryptoKeyStore : public CBasicKeyStore
105 CryptedKeyMap mapCryptedKeys;
107 CKeyingMaterial vMasterKey;
109 // if fUseCrypto is true, mapKeys must be empty
110 // if fUseCrypto is false, vMasterKey must be empty
116 // will encrypt previously unencrypted keys
117 bool EncryptKeys(CKeyingMaterial& vMasterKeyIn);
119 bool Unlock(const CKeyingMaterial& vMasterKeyIn);
122 CCryptoKeyStore() : fUseCrypto(false)
126 bool IsCrypted() const
131 bool IsLocked() const
138 result = vMasterKey.empty();
156 virtual bool AddCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret);
157 bool AddKey(const CKey& key);
158 bool HaveKey(const CBitcoinAddress &address) const
163 return CBasicKeyStore::HaveKey(address);
164 return mapCryptedKeys.count(address) > 0;
168 bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const;
169 bool GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char>& vchPubKeyOut) const;
170 void GetKeys(std::set<CBitcoinAddress> &setAddress) const
174 CBasicKeyStore::GetKeys(setAddress);
178 CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin();
179 while (mi != mapCryptedKeys.end())
181 setAddress.insert((*mi).first);