Refactor keytime/metadata and wallet encryption bugfix
Refactor keytime: * Key metadata is kept in a CWallet::mapKeyMetadata (std::map<CKeyId,CKeyMetadata>). * When generating a new key, time is put in that map, and new key is written. * AddKeyPubKey and AddCryptedKey do not take a creation time argument, but instead pull it from that map, if it exists there. Bugfix: * AddKeyPubKey and AddCryptedKey in CWallet didn't override the CKeyStore definition anymore. This is fixed, as they no longed need the nCreationTime argument now. Also a few related other changes: * Metadata can be overwritten. * Only GenerateNewKey calls GetTime(), as it's the only place where we know for sure a key was not constructed earlier. * When the nTimeFirstKey is known to be inaccurate, it is set to the value 1 (instead of 0, which would mean unknown). * Use CPubKey instead of std::vector<unsigned char> where possible.
This commit is contained in:
@@ -40,18 +40,20 @@ CPubKey CWallet::GenerateNewKey()
|
||||
SetMinVersion(FEATURE_COMPRPUBKEY);
|
||||
|
||||
CPubKey pubkey = secret.GetPubKey();
|
||||
|
||||
// Create new metadata
|
||||
int64 nCreationTime = GetTime();
|
||||
mapKeyMetadata[pubkey.GetID()] = CKeyMetadata(nCreationTime);
|
||||
if (!nTimeFirstKey || nCreationTime < nTimeFirstKey)
|
||||
nTimeFirstKey = nCreationTime;
|
||||
|
||||
if (!AddKeyPubKey(secret, pubkey))
|
||||
throw std::runtime_error("CWallet::GenerateNewKey() : AddKey failed");
|
||||
return pubkey;
|
||||
}
|
||||
|
||||
bool CWallet::AddKeyPubKey(const CKey& secret, const CPubKey &pubkey,
|
||||
int64 nCreateTime)
|
||||
bool CWallet::AddKeyPubKey(const CKey& secret, const CPubKey &pubkey)
|
||||
{
|
||||
if (!nCreateTime)
|
||||
nCreateTime = GetTime();
|
||||
if (!nTimeFirstKey || (nCreateTime < nTimeFirstKey))
|
||||
nTimeFirstKey = nCreateTime;
|
||||
if (!CCryptoKeyStore::AddKeyPubKey(secret, pubkey))
|
||||
return false;
|
||||
if (!fFileBacked)
|
||||
@@ -59,19 +61,14 @@ bool CWallet::AddKeyPubKey(const CKey& secret, const CPubKey &pubkey,
|
||||
if (!IsCrypted()) {
|
||||
return CWalletDB(strWalletFile).WriteKey(pubkey,
|
||||
secret.GetPrivKey(),
|
||||
nCreateTime);
|
||||
mapKeyMetadata[pubkey.GetID()]);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CWallet::AddCryptedKey(const CPubKey &vchPubKey,
|
||||
const vector<unsigned char> &vchCryptedSecret,
|
||||
int64 nCreateTime)
|
||||
const vector<unsigned char> &vchCryptedSecret)
|
||||
{
|
||||
if (!nCreateTime)
|
||||
nCreateTime = GetTime();
|
||||
if (!nTimeFirstKey || (nCreateTime < nTimeFirstKey))
|
||||
nTimeFirstKey = nCreateTime;
|
||||
if (!CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret))
|
||||
return false;
|
||||
if (!fFileBacked)
|
||||
@@ -81,15 +78,24 @@ bool CWallet::AddCryptedKey(const CPubKey &vchPubKey,
|
||||
if (pwalletdbEncryption)
|
||||
return pwalletdbEncryption->WriteCryptedKey(vchPubKey,
|
||||
vchCryptedSecret,
|
||||
nCreateTime);
|
||||
mapKeyMetadata[vchPubKey.GetID()]);
|
||||
else
|
||||
return CWalletDB(strWalletFile).WriteCryptedKey(vchPubKey,
|
||||
vchCryptedSecret,
|
||||
nCreateTime);
|
||||
mapKeyMetadata[vchPubKey.GetID()]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CWallet::LoadKeyMetadata(const CPubKey &pubkey, const CKeyMetadata &meta)
|
||||
{
|
||||
if (meta.nCreateTime && (!nTimeFirstKey || meta.nCreateTime < nTimeFirstKey))
|
||||
nTimeFirstKey = meta.nCreateTime;
|
||||
|
||||
mapKeyMetadata[pubkey.GetID()] = meta;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CWallet::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector<unsigned char> &vchCryptedSecret)
|
||||
{
|
||||
return CCryptoKeyStore::AddCryptedKey(vchPubKey, vchCryptedSecret);
|
||||
|
||||
Reference in New Issue
Block a user