Random.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Copyright 2018 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "Common/Random.h"
  4. #include <mbedtls/entropy.h>
  5. #include <mbedtls/hmac_drbg.h>
  6. #include "Common/Assert.h"
  7. namespace Common::Random
  8. {
  9. class EntropySeededPRNG final
  10. {
  11. public:
  12. EntropySeededPRNG()
  13. {
  14. mbedtls_entropy_init(&m_entropy);
  15. mbedtls_hmac_drbg_init(&m_context);
  16. const int ret = mbedtls_hmac_drbg_seed(&m_context, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256),
  17. mbedtls_entropy_func, &m_entropy, nullptr, 0);
  18. ASSERT(ret == 0);
  19. }
  20. ~EntropySeededPRNG()
  21. {
  22. mbedtls_hmac_drbg_free(&m_context);
  23. mbedtls_entropy_free(&m_entropy);
  24. }
  25. void Generate(void* buffer, std::size_t size)
  26. {
  27. const int ret = mbedtls_hmac_drbg_random(&m_context, static_cast<u8*>(buffer), size);
  28. ASSERT(ret == 0);
  29. }
  30. private:
  31. mbedtls_entropy_context m_entropy;
  32. mbedtls_hmac_drbg_context m_context;
  33. };
  34. static thread_local EntropySeededPRNG s_esprng;
  35. void Generate(void* buffer, std::size_t size)
  36. {
  37. s_esprng.Generate(buffer, size);
  38. }
  39. } // namespace Common::Random