diff --git a/src/core/crypto/key_manager.cpp b/src/core/crypto/key_manager.cpp index a5e759ccc1..9a1b9d7a50 100644 --- a/src/core/crypto/key_manager.cpp +++ b/src/core/crypto/key_manager.cpp @@ -518,17 +518,27 @@ static std::array MGF1(const std::array& seed) { std::array seed_exp{}; std::memcpy(seed_exp.data(), seed.data(), in_size); + EVP_MD_CTX* ctx = EVP_MD_CTX_new(); + const EVP_MD* sha256 = EVP_sha256(); + std::vector out; size_t i = 0; while (out.size() < target_size) { - out.resize(out.size() + 0x20); + size_t offset = out.size(); + out.resize(offset + 0x20); seed_exp[in_size + 3] = u8(i); u32 hash_len = 0; - EVP_Digest(seed_exp.data(), seed_exp.size(), out.data(), &hash_len, EVP_sha256(), nullptr); + + EVP_DigestInit_ex(ctx, sha256, nullptr); + EVP_DigestUpdate(ctx, seed_exp.data(), seed_exp.size()); + EVP_DigestFinal_ex(ctx, out.data() + offset, &hash_len); + ++i; } + EVP_MD_CTX_free(ctx); + std::array target; std::memcpy(target.data(), out.data(), target_size); return target;