1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 #ifndef BITCOIN_KEYSTORE_H
7 #define BITCOIN_KEYSTORE_H
13 #include <boost/signals2/signal.hpp>
14 #include <boost/variant.hpp>
19 /** A virtual base class for key stores */
23 mutable CCriticalSection cs_KeyStore;
26 virtual ~CKeyStore() {}
28 //! Add a key to the store.
29 virtual bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) =0;
30 virtual bool AddKey(const CKey &key);
32 //! Check whether a key corresponding to a given address is present in the store.
33 virtual bool HaveKey(const CKeyID &address) const =0;
34 virtual bool GetKey(const CKeyID &address, CKey& keyOut) const =0;
35 virtual void GetKeys(std::set<CKeyID> &setAddress) const =0;
36 virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
38 //! Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki
39 virtual bool AddCScript(const CScript& redeemScript) =0;
40 virtual bool HaveCScript(const CScriptID &hash) const =0;
41 virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const =0;
43 //! Support for Watch-only addresses
44 virtual bool AddWatchOnly(const CScript &dest) =0;
45 virtual bool RemoveWatchOnly(const CScript &dest) =0;
46 virtual bool HaveWatchOnly(const CScript &dest) const =0;
47 virtual bool HaveWatchOnly() const =0;
50 typedef std::map<CKeyID, CKey> KeyMap;
51 typedef std::map<CScriptID, CScript > ScriptMap;
52 typedef std::set<CScript> WatchOnlySet;
54 /** Basic key store, that keeps keys in an address->secret map */
55 class CBasicKeyStore : public CKeyStore
60 WatchOnlySet setWatchOnly;
63 bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
64 bool HaveKey(const CKeyID &address) const
69 result = (mapKeys.count(address) > 0);
73 void GetKeys(std::set<CKeyID> &setAddress) const
78 KeyMap::const_iterator mi = mapKeys.begin();
79 while (mi != mapKeys.end())
81 setAddress.insert((*mi).first);
86 bool GetKey(const CKeyID &address, CKey &keyOut) const
90 KeyMap::const_iterator mi = mapKeys.find(address);
91 if (mi != mapKeys.end())
99 virtual bool AddCScript(const CScript& redeemScript);
100 virtual bool HaveCScript(const CScriptID &hash) const;
101 virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const;
103 virtual bool AddWatchOnly(const CScript &dest);
104 virtual bool RemoveWatchOnly(const CScript &dest);
105 virtual bool HaveWatchOnly(const CScript &dest) const;
106 virtual bool HaveWatchOnly() const;
109 typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
110 typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
112 #endif // BITCOIN_KEYSTORE_H