aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Neus <[email protected]>2016-01-26 22:08:55 +0100
committerDaniel Neus <[email protected]>2016-01-26 22:09:32 +0100
commitb642fa9bc637b3a7fe39f5640b9a2f6f9ea5f581 (patch)
treeb92c905869c876c42b61b4b6a4130ab277ecb704
parent0b021ef91f204fa6326a00c5a1550f5cabc5e3c9 (diff)
move logic back into poll()
prevents filtering out any 0x00000000 outputs from RDRAND/RDSEED
-rw-r--r--src/lib/entropy/rdrand/rdrand.cpp48
-rw-r--r--src/lib/entropy/rdseed/rdseed.cpp48
2 files changed, 36 insertions, 60 deletions
diff --git a/src/lib/entropy/rdrand/rdrand.cpp b/src/lib/entropy/rdrand/rdrand.cpp
index ef8c5882d..13263bb63 100644
--- a/src/lib/entropy/rdrand/rdrand.cpp
+++ b/src/lib/entropy/rdrand/rdrand.cpp
@@ -11,47 +11,35 @@
#include <botan/build.h>
#if !defined(BOTAN_USE_GCC_INLINE_ASM)
-#include <immintrin.h>
+ #include <immintrin.h>
#endif
namespace Botan {
-namespace {
-
-/// @returns 0 if RdRand failed after @param max_retries otherwise the 32 bit random number generated by RdRand
-uint32_t get_32bit_random(const uint32_t max_retries) {
- for(size_t i = 0; i != max_retries; ++i)
- {
- uint32_t r = 0;
-
-#if defined(BOTAN_USE_GCC_INLINE_ASM)
- int cf = 0;
-
- // Encoding of rdrand %eax
- asm(".byte 0x0F, 0xC7, 0xF0; adcl $0,%1" :
- "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc");
-#else
- int cf = _rdrand32_step(&r);
-#endif
- if(1 == cf)
- {
- return r;
- }
- }
- return 0;
- }
-}
-
void Intel_Rdrand::poll(Entropy_Accumulator& accum) {
if(!CPUID::has_rdrand())
return;
for(size_t i = 0; i != BOTAN_ENTROPY_INTEL_RNG_POLLS; ++i)
{
- uint32_t random = get_32bit_random(BOTAN_ENTROPY_RDRAND_RETRIES);
- if(random)
+ for(size_t i = 0; i != BOTAN_ENTROPY_RDRAND_RETRIES; ++i)
{
- accum.add(random, BOTAN_ENTROPY_ESTIMATE_HARDWARE_RNG);
+ uint32_t r = 0;
+
+#if defined(BOTAN_USE_GCC_INLINE_ASM)
+ int cf = 0;
+
+ // Encoding of rdrand %eax
+ asm(".byte 0x0F, 0xC7, 0xF0; adcl $0,%1" :
+ "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc");
+#else
+ int cf = _rdrand32_step(&r);
+#endif
+ if(1 == cf)
+ {
+ accum.add(r, BOTAN_ENTROPY_ESTIMATE_HARDWARE_RNG);
+ break;
+ }
}
}
}
diff --git a/src/lib/entropy/rdseed/rdseed.cpp b/src/lib/entropy/rdseed/rdseed.cpp
index adca605f6..bcef9ad83 100644
--- a/src/lib/entropy/rdseed/rdseed.cpp
+++ b/src/lib/entropy/rdseed/rdseed.cpp
@@ -10,47 +10,35 @@
#include <botan/build.h>
#if !defined(BOTAN_USE_GCC_INLINE_ASM)
-#include <immintrin.h>
+ #include <immintrin.h>
#endif
namespace Botan {
-namespace {
-
-/// @returns 0 if RdSeed failed after @param max_retries otherwise the 32 bit random number generated by RdSeed
-uint32_t get_32bit_random(const uint32_t max_retries) {
- for(size_t i = 0; i != max_retries; ++i)
- {
- uint32_t r = 0;
-
-#if defined(BOTAN_USE_GCC_INLINE_ASM)
- int cf = 0;
-
- // Encoding of rdseed %eax
- asm(".byte 0x0F, 0xC7, 0xF8; adcl $0,%1" :
- "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc");
-#else
- int cf = _rdseed32_step(&r);
-#endif
- if(1 == cf)
- {
- return r;
- }
- }
- return 0;
- }
-}
-
void Intel_Rdseed::poll(Entropy_Accumulator& accum) {
if(!CPUID::has_rdseed())
return;
for(size_t i = 0; i != BOTAN_ENTROPY_INTEL_RNG_POLLS; ++i)
{
- uint32_t random = get_32bit_random(BOTAN_ENTROPY_RDSEED_RETRIES);
- if(random)
+ for(size_t i = 0; i != BOTAN_ENTROPY_RDSEED_RETRIES; ++i)
{
- accum.add(random, BOTAN_ENTROPY_ESTIMATE_HARDWARE_RNG);
+ uint32_t r = 0;
+
+#if defined(BOTAN_USE_GCC_INLINE_ASM)
+ int cf = 0;
+
+ // Encoding of rdseed %eax
+ asm(".byte 0x0F, 0xC7, 0xF8; adcl $0,%1" :
+ "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc");
+#else
+ int cf = _rdseed32_step(&r);
+#endif
+ if(1 == cf)
+ {
+ accum.add(r, BOTAN_ENTROPY_ESTIMATE_HARDWARE_RNG);
+ break;
+ }
}
}
}