aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/entropy
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2016-07-19 14:57:12 -0400
committerJack Lloyd <[email protected]>2016-07-19 14:57:12 -0400
commit4e78e6ea5608edddda8929f3b43a978e89f927ba (patch)
treeb2da95ad40377650878f1b1218ec6e8bea3e6c5b /src/lib/entropy
parent308c7d5eda678566edd26e9ab20edbe772f46363 (diff)
Add RDRAND_RNG
For those that are willing to trust uninspectible hardware. :) Changes RDRAND entropy source to call RDRAND_RNG Add --rdrand flag to rng cmdlet
Diffstat (limited to 'src/lib/entropy')
-rw-r--r--src/lib/entropy/rdrand/info.txt16
-rw-r--r--src/lib/entropy/rdrand/rdrand.cpp32
2 files changed, 9 insertions, 39 deletions
diff --git a/src/lib/entropy/rdrand/info.txt b/src/lib/entropy/rdrand/info.txt
index e3e1a2a50..ebc7fb747 100644
--- a/src/lib/entropy/rdrand/info.txt
+++ b/src/lib/entropy/rdrand/info.txt
@@ -1,6 +1,8 @@
define ENTROPY_SRC_RDRAND 20131128
-need_isa rdrand
+<requires>
+rdrand_rng
+</requires>
<source>
rdrand.cpp
@@ -9,15 +11,3 @@ rdrand.cpp
<header:internal>
rdrand.h
</header:internal>
-
-<arch>
-x86_32
-x86_64
-</arch>
-
-<cc>
-gcc
-clang
-icc
-msvc
-</cc>
diff --git a/src/lib/entropy/rdrand/rdrand.cpp b/src/lib/entropy/rdrand/rdrand.cpp
index fb04d7b78..7fa05c605 100644
--- a/src/lib/entropy/rdrand/rdrand.cpp
+++ b/src/lib/entropy/rdrand/rdrand.cpp
@@ -7,40 +7,20 @@
*/
#include <botan/internal/rdrand.h>
+#include <botan/rdrand_rng.h>
#include <botan/cpuid.h>
#include <botan/build.h>
-#if !defined(BOTAN_USE_GCC_INLINE_ASM)
- #include <immintrin.h>
-#endif
-
namespace Botan {
size_t Intel_Rdrand::poll(RandomNumberGenerator& rng) {
- if(CPUID::has_rdrand())
+ if(CPUID::has_rdrand() && BOTAN_ENTROPY_INTEL_RNG_POLLS > 0)
{
- for(size_t p = 0; p != BOTAN_ENTROPY_INTEL_RNG_POLLS; ++p)
- {
- for(size_t i = 0; i != BOTAN_ENTROPY_RDRAND_RETRIES; ++i)
- {
- uint32_t r = 0;
-
-#if defined(BOTAN_USE_GCC_INLINE_ASM)
- int cf = 0;
+ RDRAND_RNG rdrand_rng;
+ secure_vector<uint8_t> buf(4 * BOTAN_ENTROPY_INTEL_RNG_POLLS);
- // 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)
- {
- rng.add_entropy_T(r);
- break;
- }
- }
- }
+ rdrand_rng.randomize(buf.data(), buf.size());
+ rng.add_entropy(buf.data(), buf.size());
}
// RDRAND is used but not trusted