// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2011 The Bitcoin developers
+// Copyright (c) 2009-2012 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.
#include "headers.h"
-#include "db.h"
#include "crypter.h"
-
-std::vector<unsigned char> CKeyStore::GenerateNewKey()
-{
- RandAddSeedPerfmon();
- CKey key;
- key.MakeNewKey();
- if (!AddKey(key))
- throw std::runtime_error("CKeyStore::GenerateNewKey() : AddKey failed");
- return key.GetPubKey();
-}
+#include "db.h"
+#include "script.h"
bool CKeyStore::GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char> &vchPubKeyOut) const
{
bool CBasicKeyStore::AddKey(const CKey& key)
{
+ bool fCompressed = false;
+ CSecret secret = key.GetSecret(fCompressed);
+ CRITICAL_BLOCK(cs_KeyStore)
+ mapKeys[CBitcoinAddress(key.GetPubKey())] = make_pair(secret, fCompressed);
+ return true;
+}
+
+bool CBasicKeyStore::AddCScript(const CScript& redeemScript)
+{
CRITICAL_BLOCK(cs_KeyStore)
- mapKeys[key.GetAddress()] = key.GetSecret();
+ mapScripts[Hash160(redeemScript)] = redeemScript;
return true;
}
+bool CBasicKeyStore::HaveCScript(const uint160& hash) const
+{
+ bool result;
+ CRITICAL_BLOCK(cs_KeyStore)
+ result = (mapScripts.count(hash) > 0);
+ return result;
+}
+
+
+bool CBasicKeyStore::GetCScript(const uint160 &hash, CScript& redeemScriptOut) const
+{
+ CRITICAL_BLOCK(cs_KeyStore)
+ {
+ ScriptMap::const_iterator mi = mapScripts.find(hash);
+ if (mi != mapScripts.end())
+ {
+ redeemScriptOut = (*mi).second;
+ return true;
+ }
+ }
+ return false;
+}
+
bool CCryptoKeyStore::SetCrypted()
{
CRITICAL_BLOCK(cs_KeyStore)
return true;
}
-std::vector<unsigned char> CCryptoKeyStore::GenerateNewKey()
-{
- RandAddSeedPerfmon();
- CKey key;
- key.MakeNewKey();
- if (!AddKey(key))
- throw std::runtime_error("CCryptoKeyStore::GenerateNewKey() : AddKey failed");
- return key.GetPubKey();
-}
-
bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
{
CRITICAL_BLOCK(cs_KeyStore)
if (vchSecret.size() != 32)
return false;
CKey key;
+ key.SetPubKey(vchPubKey);
key.SetSecret(vchSecret);
if (key.GetPubKey() == vchPubKey)
break;
std::vector<unsigned char> vchCryptedSecret;
std::vector<unsigned char> vchPubKey = key.GetPubKey();
- if (!EncryptSecret(vMasterKey, key.GetSecret(), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret))
+ bool fCompressed;
+ if (!EncryptSecret(vMasterKey, key.GetSecret(fCompressed), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret))
return false;
if (!AddCryptedKey(key.GetPubKey(), vchCryptedSecret))
return false;
if (vchSecret.size() != 32)
return false;
+ keyOut.SetPubKey(vchPubKey);
keyOut.SetSecret(vchSecret);
return true;
}
return false;
fUseCrypto = true;
- CKey key;
BOOST_FOREACH(KeyMap::value_type& mKey, mapKeys)
{
- if (!key.SetSecret(mKey.second))
+ CKey key;
+ if (!key.SetSecret(mKey.second.first, mKey.second.second))
return false;
const std::vector<unsigned char> vchPubKey = key.GetPubKey();
std::vector<unsigned char> vchCryptedSecret;
- if (!EncryptSecret(vMasterKeyIn, key.GetSecret(), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret))
+ bool fCompressed;
+ if (!EncryptSecret(vMasterKeyIn, key.GetSecret(fCompressed), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret))
return false;
if (!AddCryptedKey(vchPubKey, vchCryptedSecret))
return false;