#endif
#include "crypter.h"
+#include "scrypt.h"
bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
{
int i = 0;
if (nDerivationMethod == 0)
+ {
i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],
(unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV);
+ }
+
+ if (nDerivationMethod == 1)
+ {
+ // Passphrase conversion
+ uint256 scryptHash = scrypt_salted_multiround_hash((const void*)strKeyData.c_str(), strKeyData.size(), &chSalt[0], 8, nRounds);
+
+ i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],
+ (unsigned char *)&scryptHash, sizeof scryptHash, nRounds, chKey, chIV);
+ OPENSSL_cleanse(&scryptHash, sizeof scryptHash);
+ }
+
if (i != (int)WALLET_CRYPTO_KEY_SIZE)
{
- memset(&chKey, 0, sizeof chKey);
- memset(&chIV, 0, sizeof chIV);
+ OPENSSL_cleanse(&chKey, sizeof chKey);
+ OPENSSL_cleanse(&chIV, sizeof chIV);
return false;
}