raw
genesis                 1 // Copyright (c) 2009-2010 Satoshi Nakamoto
genesis 2 // Copyright (c) 2011 The Bitcoin developers
genesis 3 // Distributed under the MIT/X11 software license, see the accompanying
genesis 4 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
genesis 5
genesis 6 #include "headers.h"
genesis 7 #include "db.h"
genesis 8 #include "crypter.h"
genesis 9
genesis 10 std::vector<unsigned char> CKeyStore::GenerateNewKey()
genesis 11 {
genesis 12 RandAddSeedPerfmon();
genesis 13 CKey key;
genesis 14 key.MakeNewKey();
genesis 15 if (!AddKey(key))
genesis 16 throw std::runtime_error("CKeyStore::GenerateNewKey() : AddKey failed");
genesis 17 return key.GetPubKey();
genesis 18 }
genesis 19
genesis 20 bool CKeyStore::GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char> &vchPubKeyOut) const
genesis 21 {
genesis 22 CKey key;
genesis 23 if (!GetKey(address, key))
genesis 24 return false;
genesis 25 vchPubKeyOut = key.GetPubKey();
genesis 26 return true;
genesis 27 }
genesis 28
genesis 29 bool CBasicKeyStore::AddKey(const CKey& key)
genesis 30 {
genesis 31 CRITICAL_BLOCK(cs_KeyStore)
genesis 32 mapKeys[key.GetAddress()] = key.GetSecret();
genesis 33 return true;
genesis 34 }
genesis 35
genesis 36 bool CCryptoKeyStore::SetCrypted()
genesis 37 {
genesis 38 CRITICAL_BLOCK(cs_KeyStore)
genesis 39 {
genesis 40 if (fUseCrypto)
genesis 41 return true;
genesis 42 if (!mapKeys.empty())
genesis 43 return false;
genesis 44 fUseCrypto = true;
genesis 45 }
genesis 46 return true;
genesis 47 }
genesis 48
genesis 49 std::vector<unsigned char> CCryptoKeyStore::GenerateNewKey()
genesis 50 {
genesis 51 RandAddSeedPerfmon();
genesis 52 CKey key;
genesis 53 key.MakeNewKey();
genesis 54 if (!AddKey(key))
genesis 55 throw std::runtime_error("CCryptoKeyStore::GenerateNewKey() : AddKey failed");
genesis 56 return key.GetPubKey();
genesis 57 }
genesis 58
genesis 59 bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
genesis 60 {
genesis 61 CRITICAL_BLOCK(cs_KeyStore)
genesis 62 {
genesis 63 if (!SetCrypted())
genesis 64 return false;
genesis 65
genesis 66 CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin();
genesis 67 for (; mi != mapCryptedKeys.end(); ++mi)
genesis 68 {
genesis 69 const std::vector<unsigned char> &vchPubKey = (*mi).second.first;
genesis 70 const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second;
genesis 71 CSecret vchSecret;
genesis 72 if(!DecryptSecret(vMasterKeyIn, vchCryptedSecret, Hash(vchPubKey.begin(), vchPubKey.end()), vchSecret))
genesis 73 return false;
genesis 74 CKey key;
genesis 75 key.SetSecret(vchSecret);
genesis 76 if (key.GetPubKey() == vchPubKey)
genesis 77 break;
genesis 78 return false;
genesis 79 }
genesis 80 vMasterKey = vMasterKeyIn;
genesis 81 }
genesis 82 return true;
genesis 83 }
genesis 84
genesis 85 bool CCryptoKeyStore::AddKey(const CKey& key)
genesis 86 {
genesis 87 CRITICAL_BLOCK(cs_KeyStore)
genesis 88 {
genesis 89 if (!IsCrypted())
genesis 90 return CBasicKeyStore::AddKey(key);
genesis 91
genesis 92 if (IsLocked())
genesis 93 return false;
genesis 94
genesis 95 std::vector<unsigned char> vchCryptedSecret;
genesis 96 std::vector<unsigned char> vchPubKey = key.GetPubKey();
genesis 97 if (!EncryptSecret(vMasterKey, key.GetSecret(), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret))
genesis 98 return false;
genesis 99
genesis 100 if (!AddCryptedKey(key.GetPubKey(), vchCryptedSecret))
genesis 101 return false;
genesis 102 }
genesis 103 return true;
genesis 104 }
genesis 105
genesis 106
genesis 107 bool CCryptoKeyStore::AddCryptedKey(const std::vector<unsigned char> &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
genesis 108 {
genesis 109 CRITICAL_BLOCK(cs_KeyStore)
genesis 110 {
genesis 111 if (!SetCrypted())
genesis 112 return false;
genesis 113
genesis 114 mapCryptedKeys[CBitcoinAddress(vchPubKey)] = make_pair(vchPubKey, vchCryptedSecret);
genesis 115 }
genesis 116 return true;
genesis 117 }
genesis 118
genesis 119 bool CCryptoKeyStore::GetKey(const CBitcoinAddress &address, CKey& keyOut) const
genesis 120 {
genesis 121 CRITICAL_BLOCK(cs_KeyStore)
genesis 122 {
genesis 123 if (!IsCrypted())
genesis 124 return CBasicKeyStore::GetKey(address, keyOut);
genesis 125
genesis 126 CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address);
genesis 127 if (mi != mapCryptedKeys.end())
genesis 128 {
genesis 129 const std::vector<unsigned char> &vchPubKey = (*mi).second.first;
genesis 130 const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second;
genesis 131 CSecret vchSecret;
genesis 132 if (!DecryptSecret(vMasterKey, vchCryptedSecret, Hash(vchPubKey.begin(), vchPubKey.end()), vchSecret))
genesis 133 return false;
genesis 134 keyOut.SetSecret(vchSecret);
genesis 135 return true;
genesis 136 }
genesis 137 }
genesis 138 return false;
genesis 139 }
genesis 140
genesis 141 bool CCryptoKeyStore::GetPubKey(const CBitcoinAddress &address, std::vector<unsigned char>& vchPubKeyOut) const
genesis 142 {
genesis 143 CRITICAL_BLOCK(cs_KeyStore)
genesis 144 {
genesis 145 if (!IsCrypted())
genesis 146 return CKeyStore::GetPubKey(address, vchPubKeyOut);
genesis 147
genesis 148 CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address);
genesis 149 if (mi != mapCryptedKeys.end())
genesis 150 {
genesis 151 vchPubKeyOut = (*mi).second.first;
genesis 152 return true;
genesis 153 }
genesis 154 }
genesis 155 return false;
genesis 156 }
genesis 157
genesis 158 bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn)
genesis 159 {
genesis 160 CRITICAL_BLOCK(cs_KeyStore)
genesis 161 {
genesis 162 if (!mapCryptedKeys.empty() || IsCrypted())
genesis 163 return false;
genesis 164
genesis 165 fUseCrypto = true;
genesis 166 CKey key;
genesis 167 BOOST_FOREACH(KeyMap::value_type& mKey, mapKeys)
genesis 168 {
genesis 169 if (!key.SetSecret(mKey.second))
genesis 170 return false;
genesis 171 const std::vector<unsigned char> vchPubKey = key.GetPubKey();
genesis 172 std::vector<unsigned char> vchCryptedSecret;
genesis 173 if (!EncryptSecret(vMasterKeyIn, key.GetSecret(), Hash(vchPubKey.begin(), vchPubKey.end()), vchCryptedSecret))
genesis 174 return false;
genesis 175 if (!AddCryptedKey(vchPubKey, vchCryptedSecret))
genesis 176 return false;
genesis 177 }
genesis 178 mapKeys.clear();
genesis 179 }
genesis 180 return true;
genesis 181 }