1 // Copyright (c) 2009-2010 Satoshi Nakamoto 2 // Copyright (c) 2009-2015 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. 5 6 #ifndef BITCOIN_KEYSTORE_H 7 #define BITCOIN_KEYSTORE_H 8 9 #include "key.h" 10 #include "pubkey.h" 11 #include "script/script.h" 12 #include "script/standard.h" 13 #include "sync.h" 14 15 #include <boost/signals2/signal.hpp> 16 #include <boost/variant.hpp> 17 18 /** A virtual base class for key stores */ 19 class CKeyStore 20 { 21 protected: 22 mutable CCriticalSection cs_KeyStore; 23 24 public: ~CKeyStore()25 virtual ~CKeyStore() {} 26 27 //! Add a key to the store. 28 virtual bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) =0; 29 virtual bool AddKey(const CKey &key); 30 31 //! Check whether a key corresponding to a given address is present in the store. 32 virtual bool HaveKey(const CKeyID &address) const =0; 33 virtual bool GetKey(const CKeyID &address, CKey& keyOut) const =0; 34 virtual void GetKeys(std::set<CKeyID> &setAddress) const =0; 35 virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const =0; 36 37 //! Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki 38 virtual bool AddCScript(const CScript& redeemScript) =0; 39 virtual bool HaveCScript(const CScriptID &hash) const =0; 40 virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const =0; 41 42 //! Support for Watch-only addresses 43 virtual bool AddWatchOnly(const CScript &dest) =0; 44 virtual bool RemoveWatchOnly(const CScript &dest) =0; 45 virtual bool HaveWatchOnly(const CScript &dest) const =0; 46 virtual bool HaveWatchOnly() const =0; 47 }; 48 49 typedef std::map<CKeyID, CKey> KeyMap; 50 typedef std::map<CKeyID, CPubKey> WatchKeyMap; 51 typedef std::map<CScriptID, CScript > ScriptMap; 52 typedef std::set<CScript> WatchOnlySet; 53 54 /** Basic key store, that keeps keys in an address->secret map */ 55 class CBasicKeyStore : public CKeyStore 56 { 57 protected: 58 KeyMap mapKeys; 59 WatchKeyMap mapWatchKeys; 60 ScriptMap mapScripts; 61 WatchOnlySet setWatchOnly; 62 63 public: 64 bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey); 65 bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const; HaveKey(const CKeyID & address)66 bool HaveKey(const CKeyID &address) const 67 { 68 bool result; 69 { 70 LOCK(cs_KeyStore); 71 result = (mapKeys.count(address) > 0); 72 } 73 return result; 74 } GetKeys(std::set<CKeyID> & setAddress)75 void GetKeys(std::set<CKeyID> &setAddress) const 76 { 77 setAddress.clear(); 78 { 79 LOCK(cs_KeyStore); 80 KeyMap::const_iterator mi = mapKeys.begin(); 81 while (mi != mapKeys.end()) 82 { 83 setAddress.insert((*mi).first); 84 mi++; 85 } 86 } 87 } GetKey(const CKeyID & address,CKey & keyOut)88 bool GetKey(const CKeyID &address, CKey &keyOut) const 89 { 90 { 91 LOCK(cs_KeyStore); 92 KeyMap::const_iterator mi = mapKeys.find(address); 93 if (mi != mapKeys.end()) 94 { 95 keyOut = mi->second; 96 return true; 97 } 98 } 99 return false; 100 } 101 virtual bool AddCScript(const CScript& redeemScript); 102 virtual bool HaveCScript(const CScriptID &hash) const; 103 virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const; 104 105 virtual bool AddWatchOnly(const CScript &dest); 106 virtual bool RemoveWatchOnly(const CScript &dest); 107 virtual bool HaveWatchOnly(const CScript &dest) const; 108 virtual bool HaveWatchOnly() const; 109 }; 110 111 typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial; 112 typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap; 113 114 #endif // BITCOIN_KEYSTORE_H 115