X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fkeystore.h;h=fa70933d7cd5609c9c60290c41a83f993d88d772;hb=58ac600b2c94f12309fc5e18933891590dc1eb4c;hp=4095535493545aedbd86bc196d084e03870e3e3e;hpb=acd6501610817eee0bd1c8ea9c591f043affbaec;p=novacoin.git diff --git a/src/keystore.h b/src/keystore.h index 4095535..fa70933 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -1,113 +1,125 @@ -// Copyright (c) 2009-2011 Satoshi Nakamoto & Bitcoin developers +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2011 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying -// file license.txt or http://www.opensource.org/licenses/mit-license.php. +// file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_KEYSTORE_H #define BITCOIN_KEYSTORE_H -typedef std::vector > CMasterKey; +#include "crypter.h" class CKeyStore { -public: +protected: mutable CCriticalSection cs_KeyStore; +public: + virtual ~CKeyStore() {} + virtual bool AddKey(const CKey& key) =0; - virtual bool HaveKey(const std::vector &vchPubKey) const =0; - virtual bool GetPrivKey(const std::vector &vchPubKey, CPrivKey& keyOut) const =0; + virtual bool HaveKey(const CBitcoinAddress &address) const =0; + virtual bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const =0; + virtual bool GetPubKey(const CBitcoinAddress &address, std::vector& vchPubKeyOut) const; virtual std::vector GenerateNewKey(); }; +typedef std::map KeyMap; + class CBasicKeyStore : public CKeyStore { protected: - std::map, CPrivKey> mapKeys; + KeyMap mapKeys; public: bool AddKey(const CKey& key); - bool HaveKey(const std::vector &vchPubKey) const + bool HaveKey(const CBitcoinAddress &address) const { - return (mapKeys.count(vchPubKey) > 0); + bool result; + CRITICAL_BLOCK(cs_KeyStore) + result = (mapKeys.count(address) > 0); + return result; } - bool GetPrivKey(const std::vector &vchPubKey, CPrivKey& keyOut) const + bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const { - std::map, CPrivKey>::const_iterator mi = mapKeys.find(vchPubKey); - if (mi != mapKeys.end()) + CRITICAL_BLOCK(cs_KeyStore) { - keyOut = (*mi).second; - return true; + KeyMap::const_iterator mi = mapKeys.find(address); + if (mi != mapKeys.end()) + { + keyOut.SetSecret((*mi).second); + return true; + } } return false; } }; +typedef std::map, std::vector > > CryptedKeyMap; + class CCryptoKeyStore : public CBasicKeyStore { private: - std::map, std::vector > mapCryptedKeys; + CryptedKeyMap mapCryptedKeys; - CMasterKey vMasterKey; + CKeyingMaterial vMasterKey; // if fUseCrypto is true, mapKeys must be empty // if fUseCrypto is false, vMasterKey must be empty bool fUseCrypto; protected: - bool IsCrypted() const - { - return fUseCrypto; - } - - bool SetCrypted() - { - if (fUseCrypto) - return true; - if (!mapKeys.empty()) - return false; - fUseCrypto = true; - } + bool SetCrypted(); // will encrypt previously unencrypted keys - bool GenerateMasterKey(); + bool EncryptKeys(CKeyingMaterial& vMasterKeyIn); - bool GetMasterKey(CMasterKey &vMasterKeyOut) const - { - if (!IsCrypted()) - return false; - if (IsLocked()) - return false; - vMasterKeyOut = vMasterKey; - return true; - } - bool Unlock(const CMasterKey& vMasterKeyIn); + bool Unlock(const CKeyingMaterial& vMasterKeyIn); public: CCryptoKeyStore() : fUseCrypto(false) { } + bool IsCrypted() const + { + return fUseCrypto; + } + bool IsLocked() const { if (!IsCrypted()) return false; - return vMasterKey.empty(); + bool result; + CRITICAL_BLOCK(cs_KeyStore) + result = vMasterKey.empty(); + return result; } bool Lock() { if (!SetCrypted()) return false; - vMasterKey.clear(); + + CRITICAL_BLOCK(cs_KeyStore) + vMasterKey.clear(); + + return true; } virtual bool AddCryptedKey(const std::vector &vchPubKey, const std::vector &vchCryptedSecret); + std::vector GenerateNewKey(); bool AddKey(const CKey& key); - bool HaveKey(const std::vector &vchPubKey) const + bool HaveKey(const CBitcoinAddress &address) const { - if (!IsCrypted()) - return CBasicKeyStore::HaveKey(vchPubKey); - return mapCryptedKeys.count(vchPubKey) > 0; + CRITICAL_BLOCK(cs_KeyStore) + { + if (!IsCrypted()) + return CBasicKeyStore::HaveKey(address); + return mapCryptedKeys.count(address) > 0; + } + return false; } - bool GetPrivKey(const std::vector &vchPubKey, CPrivKey& keyOut) const; + bool GetKey(const CBitcoinAddress &address, CKey& keyOut) const; + bool GetPubKey(const CBitcoinAddress &address, std::vector& vchPubKeyOut) const; }; #endif