27#if CRYPTOPP_MSC_VERSION 
   28# pragma warning(disable: 4702) 
   31#if defined(CRYPTOPP_RDRAND_AVAILABLE) 
   32# if defined(CRYPTOPP_MSC_VERSION) 
   33#   define MASM_RDRAND_ASM_AVAILABLE 1 
   35# if (__SUNPRO_CC >= 0x5100) || (CRYPTOPP_APPLE_CLANG_VERSION >= 30000) || \ 
   36     (CRYPTOPP_LLVM_CLANG_VERSION >= 20800) || (CRYPTOPP_GCC_VERSION >= 30200) 
   37#   define GCC_RDRAND_ASM_AVAILABLE 1 
   41#if defined(CRYPTOPP_RDSEED_AVAILABLE) 
   42# if defined(CRYPTOPP_MSC_VERSION) 
   43#   define MASM_RDSEED_ASM_AVAILABLE 1 
   45# if (__SUNPRO_CC >= 0x5100) || (CRYPTOPP_APPLE_CLANG_VERSION >= 30000) || \ 
   46     (CRYPTOPP_LLVM_CLANG_VERSION >= 20800) || (CRYPTOPP_GCC_VERSION >= 30200) 
   47#   define GCC_RDSEED_ASM_AVAILABLE 1 
   51typedef unsigned char byte;
 
   53#if MASM_RDRAND_ASM_AVAILABLE 
   54extern "C" void CRYPTOPP_FASTCALL MASM_RDRAND_GenerateBlock(
byte*, 
size_t);
 
   57#if MASM_RDSEED_ASM_AVAILABLE 
   58extern "C" void CRYPTOPP_FASTCALL MASM_RDSEED_GenerateBlock(
byte*, 
size_t);
 
   66#if defined(CRYPTOPP_RDRAND_AVAILABLE) 
   69inline void RDRAND32(
void* output)
 
   71    CRYPTOPP_UNUSED(output);  
 
   72# if defined(GCC_RDRAND_ASM_AVAILABLE) 
   76        ".byte 0x0f, 0xc7, 0xf0;\n" 
   78        : 
"=a" (*reinterpret_cast<
word32*>(output))
 
   84# if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32) 
   86inline void RDRAND64(
void* output)
 
   88    CRYPTOPP_UNUSED(output);  
 
   89# if defined(GCC_RDRAND_ASM_AVAILABLE) 
   93        ".byte 0x48, 0x0f, 0xc7, 0xf0;\n" 
   95        : 
"=a" (*reinterpret_cast<
word64*>(output))
 
  111    if (size == 0) 
return;
 
  113# if defined(MASM_RDRAND_ASM_AVAILABLE) 
  115    MASM_RDRAND_GenerateBlock(output, size);
 
  117# elif defined(GCC_RDRAND_ASM_AVAILABLE) 
  119#   if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32) 
  121    for (i = 0; i < size/8; i++)
 
  122        RDRAND64(output+i*8);
 
  131        std::memcpy(output, &val, size);
 
  135    for (i = 0; i < size/4; i++)
 
  136        RDRAND32(output+i*4);
 
  145        std::memcpy(output, &val, size);
 
  150    CRYPTOPP_UNUSED(output);
 
  151    throw NotImplemented(
"RDRAND: failed to find a suitable implementation");
 
  176#if defined(CRYPTOPP_RDSEED_AVAILABLE) 
  179inline void RDSEED32(
void* output)
 
  181    CRYPTOPP_UNUSED(output);  
 
  182# if defined(GCC_RDSEED_ASM_AVAILABLE) 
  186        ".byte 0x0f, 0xc7, 0xf8;\n" 
  188        : 
"=a" (*reinterpret_cast<
word32*>(output))
 
  194# if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32) 
  196inline void RDSEED64(
void* output)
 
  198    CRYPTOPP_UNUSED(output);  
 
  199# if defined(GCC_RDSEED_ASM_AVAILABLE) 
  203        ".byte 0x48, 0x0f, 0xc7, 0xf8;\n" 
  205        : 
"=a" (*reinterpret_cast<
word64*>(output))
 
  221    if (size == 0) 
return;
 
  223# if defined(MASM_RDSEED_ASM_AVAILABLE) 
  225    MASM_RDSEED_GenerateBlock(output, size);
 
  227# elif defined(GCC_RDSEED_ASM_AVAILABLE) 
  228#   if (CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32) 
  230    for (i = 0; i < size/8; i++)
 
  231        RDSEED64(output+i*8);
 
  240        std::memcpy(output, &val, size);
 
  244    for (i = 0; i < size/4; i++)
 
  245        RDSEED32(output+i*4);
 
  254        std::memcpy(output, &val, size);
 
  259    CRYPTOPP_UNUSED(output);
 
  260    throw NotImplemented(
"RDSEED: failed to find a suitable implementation");
 
  285#if !defined(CRYPTOPP_RDRAND_AVAILABLE) 
  295    CRYPTOPP_UNUSED(output); CRYPTOPP_UNUSED(size);
 
 
  306#if !defined(CRYPTOPP_RDSEED_AVAILABLE) 
  316    CRYPTOPP_UNUSED(output); CRYPTOPP_UNUSED(size);
 
 
Fixed size stack-based SecBlock.
 
A method was called which was not implemented.
 
Exception thrown when a RDRAND generator encounters a generator related error.
 
RDRAND()
Construct a RDRAND generator.
 
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
 
virtual void DiscardBytes(size_t n)
Generate and discard n bytes.
 
Exception thrown when a RDSEED generator encounters a generator related error.
 
RDSEED()
Construct a RDSEED generator.
 
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
 
virtual void DiscardBytes(size_t n)
Generate and discard n bytes.
 
size_type SizeInBytes() const
Provides the number of bytes in the SecBlock.
 
byte * BytePtr()
Provides a byte pointer to the first element in the memory block.
 
Library configuration file.
 
unsigned char byte
8-bit unsigned datatype
 
unsigned int word32
32-bit unsigned datatype
 
unsigned long long word64
64-bit unsigned datatype
 
Functions for CPU features and intrinsics.
 
Abstract base classes that provide a uniform interface to this library.
 
T1 RoundUpToMultipleOf(const T1 &n, const T2 &m)
Rounds a value up to a multiple of a second value.
 
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
 
Crypto++ library namespace.
 
Classes for RDRAND and RDSEED.
 
Classes and functions for secure memory allocations.
 
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.