// ClientCDKey::Init(RawBuffer) // Initializes key from encrypted binary buffer. Does not validate key. bool ClientCDKey::Init(const RawBuffer& theKeyR) { WTRACE("ClientCDKey::Init(RawBuffer)"); WDBG_LH("ClientCDKey::Init(RawBuffer) Buf=" << theKeyR); mValidity = Unknown; mKey.erase(); mStrKey.erase(); // Init BinKey and validate length mBinKey = theKeyR; if (mBinKey.size() != BINARYKEY_LEN) { WDBG_LH("ClientCDKey::Init(RawBuffer) Key length invalid, len=" << mBinKey.size()); mValidity = Invalid; return false; } // Build symmetric key from Product name __int64 aBuf = 0; if (! DecryptKey(aBuf)) { WDBG_LH("ClientCDKey::Init(RawBuffer) Decrypt of bin key failed."); mValidity = Invalid; return false; } WDBG_LM("ClientCDKey::Init(RawBuffer) Extracting fields."); FieldsFromBuffer(aBuf); return true; }
bool CCryptoKeyStore::GetKey(const CKeyID &address, CKey& keyOut) const { LOCK(cs_KeyStore); if (!IsCrypted()) { return CBasicKeyStore::GetKey(address, keyOut); } CryptedKeyMap::const_iterator mi = mapCryptedKeys.find(address); if (mi != mapCryptedKeys.end()) { const CPubKey &vchPubKey = (*mi).second.first; const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second; return DecryptKey(vMasterKey, vchCryptedSecret, vchPubKey, keyOut); } return false; }
/* * Encrypted private key in WIF format */ std::string WalletUtilityDB::getCryptedKey(CDataStream ssKey, CDataStream ssValue, std::string masterPass) { mPass = masterPass.c_str(); CPubKey vchPubKey; ssKey >> vchPubKey; CKey key; std::vector<unsigned char> vKey; ssValue >> vKey; if (!Unlock()) return ""; if(!DecryptKey(vKey, vchPubKey, key)) return ""; std::string strKey = CBitcoinSecret(key).ToString(); return strKey; }
bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn) { { LOCK(cs_KeyStore); if (!SetCrypted()) return false; bool keyPass = false; bool keyFail = false; CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin(); for (; mi != mapCryptedKeys.end(); ++mi) { const CPubKey &vchPubKey = (*mi).second.first; const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second; CKey key; if (!DecryptKey(vMasterKeyIn, vchCryptedSecret, vchPubKey, key)) { keyFail = true; break; } keyPass = true; if (fDecryptionThoroughlyChecked) break; } if (keyPass && keyFail) { LogPrintf("The wallet is probably corrupted: Some keys decrypt but not all.\n"); assert(false); } if (keyFail || !keyPass) return false; vMasterKey = vMasterKeyIn; fDecryptionThoroughlyChecked = true; } NotifyStatusChanged(this); return true; }
bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn, bool accept_no_keys) { { LOCK(cs_KeyStore); if (!SetCrypted()) return false; bool keyPass = mapCryptedKeys.empty(); // Always pass when there are no encrypted keys bool keyFail = false; CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin(); for (; mi != mapCryptedKeys.end(); ++mi) { const CPubKey &vchPubKey = (*mi).second.first; const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second; CKey key; if (!DecryptKey(vMasterKeyIn, vchCryptedSecret, vchPubKey, key)) { keyFail = true; break; } keyPass = true; if (fDecryptionThoroughlyChecked) break; } if (keyPass && keyFail) { LogPrintf("The wallet is probably corrupted: Some keys decrypt but not all.\n"); throw std::runtime_error("Error unlocking wallet: some keys decrypt but not all. Your wallet file may be corrupt."); } if (keyFail || (!keyPass && !accept_no_keys)) return false; vMasterKey = vMasterKeyIn; fDecryptionThoroughlyChecked = true; } NotifyStatusChanged(this); return true; }