aboutsummaryrefslogtreecommitdiff
path: root/src/keystore.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/keystore.h')
-rw-r--r--src/keystore.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/keystore.h b/src/keystore.h
new file mode 100644
index 0000000000..b917bf20b4
--- /dev/null
+++ b/src/keystore.h
@@ -0,0 +1,114 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_KEYSTORE_H
+#define BITCOIN_KEYSTORE_H
+
+#include "key.h"
+#include "pubkey.h"
+#include "script/script.h"
+#include "script/standard.h"
+#include "sync.h"
+
+#include <boost/signals2/signal.hpp>
+#include <boost/variant.hpp>
+
+/** A virtual base class for key stores */
+class CKeyStore
+{
+protected:
+ mutable CCriticalSection cs_KeyStore;
+
+public:
+ virtual ~CKeyStore() {}
+
+ //! Add a key to the store.
+ virtual bool AddKeyPubKey(const CKey &key, const CPubKey &pubkey) =0;
+ virtual bool AddKey(const CKey &key);
+
+ //! Check whether a key corresponding to a given address is present in the store.
+ virtual bool HaveKey(const CKeyID &address) const =0;
+ virtual bool GetKey(const CKeyID &address, CKey& keyOut) const =0;
+ virtual void GetKeys(std::set<CKeyID> &setAddress) const =0;
+ virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const =0;
+
+ //! Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki
+ virtual bool AddCScript(const CScript& redeemScript) =0;
+ virtual bool HaveCScript(const CScriptID &hash) const =0;
+ virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const =0;
+
+ //! Support for Watch-only addresses
+ virtual bool AddWatchOnly(const CScript &dest) =0;
+ virtual bool RemoveWatchOnly(const CScript &dest) =0;
+ virtual bool HaveWatchOnly(const CScript &dest) const =0;
+ virtual bool HaveWatchOnly() const =0;
+};
+
+typedef std::map<CKeyID, CKey> KeyMap;
+typedef std::map<CKeyID, CPubKey> WatchKeyMap;
+typedef std::map<CScriptID, CScript > ScriptMap;
+typedef std::set<CScript> WatchOnlySet;
+
+/** Basic key store, that keeps keys in an address->secret map */
+class CBasicKeyStore : public CKeyStore
+{
+protected:
+ KeyMap mapKeys;
+ WatchKeyMap mapWatchKeys;
+ ScriptMap mapScripts;
+ WatchOnlySet setWatchOnly;
+
+public:
+ bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey);
+ bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const;
+ bool HaveKey(const CKeyID &address) const
+ {
+ bool result;
+ {
+ LOCK(cs_KeyStore);
+ result = (mapKeys.count(address) > 0);
+ }
+ return result;
+ }
+ void GetKeys(std::set<CKeyID> &setAddress) const
+ {
+ setAddress.clear();
+ {
+ LOCK(cs_KeyStore);
+ KeyMap::const_iterator mi = mapKeys.begin();
+ while (mi != mapKeys.end())
+ {
+ setAddress.insert((*mi).first);
+ mi++;
+ }
+ }
+ }
+ bool GetKey(const CKeyID &address, CKey &keyOut) const
+ {
+ {
+ LOCK(cs_KeyStore);
+ KeyMap::const_iterator mi = mapKeys.find(address);
+ if (mi != mapKeys.end())
+ {
+ keyOut = mi->second;
+ return true;
+ }
+ }
+ return false;
+ }
+ virtual bool AddCScript(const CScript& redeemScript);
+ virtual bool HaveCScript(const CScriptID &hash) const;
+ virtual bool GetCScript(const CScriptID &hash, CScript& redeemScriptOut) const;
+
+ virtual bool AddWatchOnly(const CScript &dest);
+ virtual bool RemoveWatchOnly(const CScript &dest);
+ virtual bool HaveWatchOnly(const CScript &dest) const;
+ virtual bool HaveWatchOnly() const;
+};
+
+typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
+typedef std::map<CKeyID, std::pair<CPubKey, std::vector<unsigned char> > > CryptedKeyMap;
+
+#endif // BITCOIN_KEYSTORE_H