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:
Pieter Wuille
2013-06-20 01:13:55 +02:00
parent 25dbb92860
commit 4addb2c066
4 changed files with 36 additions and 28 deletions

View File

@@ -30,7 +30,7 @@ class CKeyMetadata
public:
static const int CURRENT_VERSION=1;
int nVersion;
int64 nCreateTime;
int64 nCreateTime; // 0 means unknown
CKeyMetadata()
{
@@ -52,7 +52,7 @@ public:
void SetNull()
{
nVersion = CKeyMetadata::CURRENT_VERSION;
nCreateTime = GetTime();
nCreateTime = 0;
}
};
@@ -84,13 +84,12 @@ public:
}
bool WriteKey(const CPubKey& vchPubKey, const CPrivKey& vchPrivKey,
int64 nCreateTime)
const CKeyMetadata &keyMeta)
{
nWalletDBUpdated++;
CKeyMetadata keyMeta(nCreateTime);
if (!Write(std::make_pair(std::string("keymeta"), vchPubKey),
keyMeta, false))
keyMeta))
return false;
return Write(std::make_pair(std::string("key"), vchPubKey), vchPrivKey, false);
@@ -98,14 +97,13 @@ public:
bool WriteCryptedKey(const CPubKey& vchPubKey,
const std::vector<unsigned char>& vchCryptedSecret,
int64 nCreateTime)
const CKeyMetadata &keyMeta)
{
const bool fEraseUnencryptedKey = true;
nWalletDBUpdated++;
CKeyMetadata keyMeta(nCreateTime);
if (!Write(std::make_pair(std::string("keymeta"), vchPubKey),
keyMeta, false))
keyMeta))
return false;
if (!Write(std::make_pair(std::string("ckey"), vchPubKey), vchCryptedSecret, false))