Skip to content

Commit

Permalink
Merge #10115: Avoid reading the old hd master key during wallet encry…
Browse files Browse the repository at this point in the history
…ption

185c7f0 Avoid reading the old hd master key during wallet encryption (Matt Corallo)

Tree-SHA512: b744e8490c0e948355bb77b2695902bb99f89a68af46aa2be9120bd2ccf3c340eb8a56340fec117f9a935192298028945c9b18120ee6b8b23e7da8ffdb635745
  • Loading branch information
laanwj committed May 3, 2017
2 parents 83073de + 185c7f0 commit d3dce0e
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 13 deletions.
14 changes: 4 additions & 10 deletions src/wallet/wallet.cpp
Expand Up @@ -621,12 +621,9 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)

// if we are using HD, replace the HD master key (seed) with a new one
if (IsHDEnabled()) {
CKey key;
CPubKey masterPubKey = GenerateNewHDMasterKey();
// preserve the old chains version to not break backward compatibility
CHDChain oldChain = GetHDChain();
if (!SetHDMasterKey(masterPubKey, &oldChain))
if (!SetHDMasterKey(GenerateNewHDMasterKey())) {
return false;
}
}

NewKeyPool();
Expand Down Expand Up @@ -1324,17 +1321,14 @@ CPubKey CWallet::GenerateNewHDMasterKey()
return pubkey;
}

bool CWallet::SetHDMasterKey(const CPubKey& pubkey, CHDChain *possibleOldChain)
bool CWallet::SetHDMasterKey(const CPubKey& pubkey)
{
LOCK(cs_wallet);
// store the keyid (hash160) together with
// the child index counter in the database
// as a hdchain object
CHDChain newHdChain;
if (possibleOldChain) {
// preserve the old chains version
newHdChain.nVersion = possibleOldChain->nVersion;
}
newHdChain.nVersion = CanSupportFeature(FEATURE_HD_SPLIT) ? CHDChain::VERSION_HD_CHAIN_SPLIT : CHDChain::VERSION_HD_BASE;
newHdChain.masterKeyID = pubkey.GetID();
SetHDChain(newHdChain, false);

Expand Down
7 changes: 4 additions & 3 deletions src/wallet/wallet.h
Expand Up @@ -1100,9 +1100,10 @@ class CWallet : public CCryptoKeyStore, public CValidationInterface
CPubKey GenerateNewHDMasterKey();

/* Set the current HD master key (will reset the chain child index counters)
If possibleOldChain is provided, the parameters from the old chain (version)
will be preserved. */
bool SetHDMasterKey(const CPubKey& key, CHDChain *possibleOldChain = nullptr);
Sets the master key's version based on the current wallet version (so the
caller must ensure the current wallet version is correct before calling
this function). */
bool SetHDMasterKey(const CPubKey& key);
};

/** A key allocated from the key pool. */
Expand Down

0 comments on commit d3dce0e

Please sign in to comment.