/* * Entropy Source Using Intel's rdrand instruction * (C) 2012,2015 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include #include #if !defined(BOTAN_USE_GCC_INLINE_ASM) #include #endif namespace Botan { /* * Get the timestamp */ void Intel_Rdrand::poll(Entropy_Accumulator& accum) { if(!CPUID::has_rdrand()) return; const size_t RDRAND_POLLS = 32; for(size_t i = 0; i != RDRAND_POLLS; ++i) { unsigned int 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(cf == 1) accum.add(r, BOTAN_ENTROPY_ESTIMATE_HARDWARE_RNG); } } }