Rename some hardware RNG related functions
This commit is contained in:
parent
05fde14e3a
commit
d3f54d1c82
1 changed files with 13 additions and 8 deletions
|
@ -78,7 +78,7 @@ static inline int64_t GetPerformanceCounter()
|
||||||
static std::atomic<bool> hwrand_initialized{false};
|
static std::atomic<bool> hwrand_initialized{false};
|
||||||
static bool rdrand_supported = false;
|
static bool rdrand_supported = false;
|
||||||
static constexpr uint32_t CPUID_F1_ECX_RDRAND = 0x40000000;
|
static constexpr uint32_t CPUID_F1_ECX_RDRAND = 0x40000000;
|
||||||
static void RDRandInit()
|
static void InitHardwareRand()
|
||||||
{
|
{
|
||||||
uint32_t eax, ebx, ecx, edx;
|
uint32_t eax, ebx, ecx, edx;
|
||||||
if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) && (ecx & CPUID_F1_ECX_RDRAND)) {
|
if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) && (ecx & CPUID_F1_ECX_RDRAND)) {
|
||||||
|
@ -87,7 +87,7 @@ static void RDRandInit()
|
||||||
hwrand_initialized.store(true);
|
hwrand_initialized.store(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RDRandReport()
|
static void ReportHardwareRand()
|
||||||
{
|
{
|
||||||
assert(hwrand_initialized.load(std::memory_order_relaxed));
|
assert(hwrand_initialized.load(std::memory_order_relaxed));
|
||||||
if (rdrand_supported) {
|
if (rdrand_supported) {
|
||||||
|
@ -98,11 +98,16 @@ static void RDRandReport()
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static void RDRandInit() {}
|
/* Access to other hardware random number generators could be added here later,
|
||||||
static void RDRandReport() {}
|
* assuming it is sufficiently fast (in the order of a few hundred CPU cycles).
|
||||||
|
* Slower sources should probably be invoked separately, and/or only from
|
||||||
|
* RandAddSeedSleep (which is called during idle background operation).
|
||||||
|
*/
|
||||||
|
static void InitHardwareRand() {}
|
||||||
|
static void ReportHardwareRand() {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool GetHWRand(unsigned char* ent32) {
|
static bool GetHardwareRand(unsigned char* ent32) {
|
||||||
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
|
||||||
assert(hwrand_initialized.load(std::memory_order_relaxed));
|
assert(hwrand_initialized.load(std::memory_order_relaxed));
|
||||||
if (rdrand_supported) {
|
if (rdrand_supported) {
|
||||||
|
@ -296,7 +301,7 @@ struct RNGState {
|
||||||
uint64_t m_counter = 0;
|
uint64_t m_counter = 0;
|
||||||
|
|
||||||
explicit RNGState() {
|
explicit RNGState() {
|
||||||
RDRandInit();
|
InitHardwareRand();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -361,7 +366,7 @@ void GetStrongRandBytes(unsigned char* out, int num)
|
||||||
hasher.Write(buf, 32);
|
hasher.Write(buf, 32);
|
||||||
|
|
||||||
// Third source: HW RNG, if available.
|
// Third source: HW RNG, if available.
|
||||||
if (GetHWRand(buf)) {
|
if (GetHardwareRand(buf)) {
|
||||||
hasher.Write(buf, 32);
|
hasher.Write(buf, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -512,5 +517,5 @@ void RandomInit()
|
||||||
// Invoke RNG code to trigger initialization (if not already performed)
|
// Invoke RNG code to trigger initialization (if not already performed)
|
||||||
GetRNGState();
|
GetRNGState();
|
||||||
|
|
||||||
RDRandReport();
|
ReportHardwareRand();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue