wallet: refactor: introduce CMasterKey::DEFAULT_DERIVE_ITERATIONS constant
This gets rid of the magic number used in both the `CMasterKey` ctor and the wallet encryption / passphrase change methods.
This commit is contained in:
1 parent
62c209f50d
commit
a6d9b415aa
4 files changed
+16
-13
No files matched your search
@@ -42,6 +42,11 @@ public:
|
|||||||
//! Use this for more parameters to key derivation (currently unused)
|
//! Use this for more parameters to key derivation (currently unused)
|
||||||
std::vector<unsigned char> vchOtherDerivationParameters;
|
std::vector<unsigned char> vchOtherDerivationParameters;
|
||||||
|
|
||||||
|
//! Default/minimum number of key derivation rounds
|
||||||
|
// 25000 rounds is just under 0.1 seconds on a 1.86 GHz Pentium M
|
||||||
|
// ie slightly lower than the lowest hardware we need bother supporting
|
||||||
|
static constexpr unsigned int DEFAULT_DERIVE_ITERATIONS = 25000;
|
||||||
|
|
||||||
SERIALIZE_METHODS(CMasterKey, obj)
|
SERIALIZE_METHODS(CMasterKey, obj)
|
||||||
{
|
{
|
||||||
READWRITE(obj.vchCryptedKey, obj.vchSalt, obj.nDerivationMethod, obj.nDeriveIterations, obj.vchOtherDerivationParameters);
|
READWRITE(obj.vchCryptedKey, obj.vchSalt, obj.nDerivationMethod, obj.nDeriveIterations, obj.vchOtherDerivationParameters);
|
||||||
@@ -49,9 +54,7 @@ public:
|
|||||||
|
|
||||||
CMasterKey()
|
CMasterKey()
|
||||||
{
|
{
|
||||||
// 25000 rounds is just under 0.1 seconds on a 1.86 GHz Pentium M
|
nDeriveIterations = DEFAULT_DERIVE_ITERATIONS;
|
||||||
// ie slightly lower than the lowest hardware we need bother supporting
|
|
||||||
nDeriveIterations = 25000;
|
|
||||||
nDerivationMethod = 0;
|
nDerivationMethod = 0;
|
||||||
vchOtherDerivationParameters = std::vector<unsigned char>(0);
|
vchOtherDerivationParameters = std::vector<unsigned char>(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ FUZZ_TARGET(crypter, .init = initialize_crypter)
|
|||||||
// Limiting the value of rounds since it is otherwise uselessly expensive and causes a timeout when fuzzing.
|
// Limiting the value of rounds since it is otherwise uselessly expensive and causes a timeout when fuzzing.
|
||||||
crypt.SetKeyFromPassphrase(/*key_data=*/secure_string,
|
crypt.SetKeyFromPassphrase(/*key_data=*/secure_string,
|
||||||
/*salt=*/ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_SALT_SIZE),
|
/*salt=*/ConsumeFixedLengthByteVector(fuzzed_data_provider, WALLET_CRYPTO_SALT_SIZE),
|
||||||
/*rounds=*/fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, 25000),
|
/*rounds=*/fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, CMasterKey::DEFAULT_DERIVE_ITERATIONS),
|
||||||
/*derivation_method=*/derivation_method);
|
/*derivation_method=*/derivation_method);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ static void TestEncrypt(const CCrypter& crypt, const std::span<const unsigned ch
|
|||||||
BOOST_AUTO_TEST_CASE(passphrase) {
|
BOOST_AUTO_TEST_CASE(passphrase) {
|
||||||
// These are expensive.
|
// These are expensive.
|
||||||
|
|
||||||
TestCrypter::TestPassphrase("0000deadbeef0000"_hex_u8, "test", 25000,
|
TestCrypter::TestPassphrase("0000deadbeef0000"_hex_u8, "test", CMasterKey::DEFAULT_DERIVE_ITERATIONS,
|
||||||
"fc7aba077ad5f4c3a0988d8daa4810d0d4a0e3bcb53af662998898f33df0556a"_hex_u8,
|
"fc7aba077ad5f4c3a0988d8daa4810d0d4a0e3bcb53af662998898f33df0556a"_hex_u8,
|
||||||
"cf2f2691526dd1aa220896fb8bf7c369"_hex_u8);
|
"cf2f2691526dd1aa220896fb8bf7c369"_hex_u8);
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ BOOST_AUTO_TEST_CASE(passphrase) {
|
|||||||
BOOST_AUTO_TEST_CASE(encrypt) {
|
BOOST_AUTO_TEST_CASE(encrypt) {
|
||||||
constexpr std::array<uint8_t, WALLET_CRYPTO_SALT_SIZE> salt{"0000deadbeef0000"_hex_u8};
|
constexpr std::array<uint8_t, WALLET_CRYPTO_SALT_SIZE> salt{"0000deadbeef0000"_hex_u8};
|
||||||
CCrypter crypt;
|
CCrypter crypt;
|
||||||
crypt.SetKeyFromPassphrase("passphrase", salt, 25000, 0);
|
crypt.SetKeyFromPassphrase("passphrase", salt, CMasterKey::DEFAULT_DERIVE_ITERATIONS, 0);
|
||||||
TestCrypter::TestEncrypt(crypt, "22bcade09ac03ff6386914359cfe885cfeb5f77ff0d670f102f619687453b29d"_hex_u8);
|
TestCrypter::TestEncrypt(crypt, "22bcade09ac03ff6386914359cfe885cfeb5f77ff0d670f102f619687453b29d"_hex_u8);
|
||||||
|
|
||||||
for (int i = 0; i != 100; i++)
|
for (int i = 0; i != 100; i++)
|
||||||
@@ -113,7 +113,7 @@ BOOST_AUTO_TEST_CASE(encrypt) {
|
|||||||
BOOST_AUTO_TEST_CASE(decrypt) {
|
BOOST_AUTO_TEST_CASE(decrypt) {
|
||||||
constexpr std::array<uint8_t, WALLET_CRYPTO_SALT_SIZE> salt{"0000deadbeef0000"_hex_u8};
|
constexpr std::array<uint8_t, WALLET_CRYPTO_SALT_SIZE> salt{"0000deadbeef0000"_hex_u8};
|
||||||
CCrypter crypt;
|
CCrypter crypt;
|
||||||
crypt.SetKeyFromPassphrase("passphrase", salt, 25000, 0);
|
crypt.SetKeyFromPassphrase("passphrase", salt, CMasterKey::DEFAULT_DERIVE_ITERATIONS, 0);
|
||||||
|
|
||||||
// Some corner cases the came up while testing
|
// Some corner cases the came up while testing
|
||||||
TestCrypter::TestDecrypt(crypt,"795643ce39d736088367822cdc50535ec6f103715e3e48f4f3b1a60a08ef59ca"_hex_u8);
|
TestCrypter::TestDecrypt(crypt,"795643ce39d736088367822cdc50535ec6f103715e3e48f4f3b1a60a08ef59ca"_hex_u8);
|
||||||
|
|||||||
@@ -628,8 +628,8 @@ bool CWallet::ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase,
|
|||||||
crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod);
|
crypter.SetKeyFromPassphrase(strNewWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod);
|
||||||
pMasterKey.second.nDeriveIterations = (pMasterKey.second.nDeriveIterations + static_cast<unsigned int>(pMasterKey.second.nDeriveIterations * target / (SteadyClock::now() - start))) / 2;
|
pMasterKey.second.nDeriveIterations = (pMasterKey.second.nDeriveIterations + static_cast<unsigned int>(pMasterKey.second.nDeriveIterations * target / (SteadyClock::now() - start))) / 2;
|
||||||
|
|
||||||
if (pMasterKey.second.nDeriveIterations < 25000)
|
if (pMasterKey.second.nDeriveIterations < CMasterKey::DEFAULT_DERIVE_ITERATIONS)
|
||||||
pMasterKey.second.nDeriveIterations = 25000;
|
pMasterKey.second.nDeriveIterations = CMasterKey::DEFAULT_DERIVE_ITERATIONS;
|
||||||
|
|
||||||
WalletLogPrintf("Wallet passphrase changed to an nDeriveIterations of %i\n", pMasterKey.second.nDeriveIterations);
|
WalletLogPrintf("Wallet passphrase changed to an nDeriveIterations of %i\n", pMasterKey.second.nDeriveIterations);
|
||||||
|
|
||||||
@@ -825,15 +825,15 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
|
|||||||
CCrypter crypter;
|
CCrypter crypter;
|
||||||
constexpr MillisecondsDouble target{100};
|
constexpr MillisecondsDouble target{100};
|
||||||
auto start{SteadyClock::now()};
|
auto start{SteadyClock::now()};
|
||||||
crypter.SetKeyFromPassphrase(strWalletPassphrase, kMasterKey.vchSalt, 25000, kMasterKey.nDerivationMethod);
|
crypter.SetKeyFromPassphrase(strWalletPassphrase, kMasterKey.vchSalt, CMasterKey::DEFAULT_DERIVE_ITERATIONS, kMasterKey.nDerivationMethod);
|
||||||
kMasterKey.nDeriveIterations = static_cast<unsigned int>(25000 * target / (SteadyClock::now() - start));
|
kMasterKey.nDeriveIterations = static_cast<unsigned int>(CMasterKey::DEFAULT_DERIVE_ITERATIONS * target / (SteadyClock::now() - start));
|
||||||
|
|
||||||
start = SteadyClock::now();
|
start = SteadyClock::now();
|
||||||
crypter.SetKeyFromPassphrase(strWalletPassphrase, kMasterKey.vchSalt, kMasterKey.nDeriveIterations, kMasterKey.nDerivationMethod);
|
crypter.SetKeyFromPassphrase(strWalletPassphrase, kMasterKey.vchSalt, kMasterKey.nDeriveIterations, kMasterKey.nDerivationMethod);
|
||||||
kMasterKey.nDeriveIterations = (kMasterKey.nDeriveIterations + static_cast<unsigned int>(kMasterKey.nDeriveIterations * target / (SteadyClock::now() - start))) / 2;
|
kMasterKey.nDeriveIterations = (kMasterKey.nDeriveIterations + static_cast<unsigned int>(kMasterKey.nDeriveIterations * target / (SteadyClock::now() - start))) / 2;
|
||||||
|
|
||||||
if (kMasterKey.nDeriveIterations < 25000)
|
if (kMasterKey.nDeriveIterations < CMasterKey::DEFAULT_DERIVE_ITERATIONS)
|
||||||
kMasterKey.nDeriveIterations = 25000;
|
kMasterKey.nDeriveIterations = CMasterKey::DEFAULT_DERIVE_ITERATIONS;
|
||||||
|
|
||||||
WalletLogPrintf("Encrypting Wallet with an nDeriveIterations of %i\n", kMasterKey.nDeriveIterations);
|
WalletLogPrintf("Encrypting Wallet with an nDeriveIterations of %i\n", kMasterKey.nDeriveIterations);
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user