30 #define NASM_RDRAND_ASM_AVAILABLE 1 31 #define NASM_RDSEED_ASM_AVAILABLE 1 37 #if defined(CRYPTOPP_CPUID_AVAILABLE) 38 # if defined(CRYPTOPP_MSC_VERSION) 39 # if (CRYPTOPP_MSC_VERSION >= 1700) 40 # define ALL_RDRAND_INTRIN_AVAILABLE 1 42 # define MASM_RDRAND_ASM_AVAILABLE 1 44 # if (CRYPTOPP_MSC_VERSION >= 1800) 45 # define ALL_RDSEED_INTRIN_AVAILABLE 1 47 # define MASM_RDSEED_ASM_AVAILABLE 1 49 # elif defined(CRYPTOPP_LLVM_CLANG_VERSION) || defined(CRYPTOPP_APPLE_CLANG_VERSION) 50 # if defined(__RDRND__) 51 # define ALL_RDRAND_INTRIN_AVAILABLE 1 53 # define GCC_RDRAND_ASM_AVAILABLE 1 55 # if defined(__RDSEED__) 56 # define ALL_RDSEED_INTRIN_AVAILABLE 1 58 # define GCC_RDSEED_ASM_AVAILABLE 1 60 # elif defined(__SUNPRO_CC) 61 # if defined(__RDRND__) && (__SUNPRO_CC >= 0x5130) 62 # define ALL_RDRAND_INTRIN_AVAILABLE 1 63 # elif (__SUNPRO_CC >= 0x5100) 64 # define GCC_RDRAND_ASM_AVAILABLE 1 66 # if defined(__RDSEED__) && (__SUNPRO_CC >= 0x5140) 67 # define ALL_RDSEED_INTRIN_AVAILABLE 1 68 # elif (__SUNPRO_CC >= 0x5100) 69 # define GCC_RDSEED_ASM_AVAILABLE 1 71 # elif defined(CRYPTOPP_GCC_VERSION) 72 # if defined(__RDRND__) && (CRYPTOPP_GCC_VERSION >= 40700) && !defined(__OPTIMIZE__) 73 # define ALL_RDRAND_INTRIN_AVAILABLE 1 75 # define GCC_RDRAND_ASM_AVAILABLE 1 77 # if defined(__RDSEED__) && (CRYPTOPP_GCC_VERSION >= 40800) && !defined(__OPTIMIZE__) 78 # define ALL_RDSEED_INTRIN_AVAILABLE 1 80 # define GCC_RDSEED_ASM_AVAILABLE 1 88 #if (ALL_RDRAND_INTRIN_AVAILABLE || ALL_RDSEED_INTRIN_AVAILABLE) 89 # include <immintrin.h> 90 # if defined(__GNUC__) && (CRYPTOPP_GCC_VERSION >= 40700) 91 # include <x86intrin.h> 93 # if defined(__has_include) 94 # if __has_include(<x86intrin.h>) 95 # include <x86intrin.h> 100 typedef unsigned char byte;
102 #if MASM_RDRAND_ASM_AVAILABLE 103 extern "C" void CRYPTOPP_FASTCALL MASM_RDRAND_GenerateBlock(
byte*,
size_t);
106 #if MASM_RDSEED_ASM_AVAILABLE 107 extern "C" void CRYPTOPP_FASTCALL MASM_RDSEED_GenerateBlock(
byte*,
size_t);
110 #if NASM_RDRAND_ASM_AVAILABLE 111 extern "C" void NASM_RDRAND_GenerateBlock(
byte*,
size_t);
114 #if NASM_RDSEED_ASM_AVAILABLE 115 extern "C" void NASM_RDSEED_GenerateBlock(
byte*,
size_t);
123 #if defined(CRYPTOPP_CPUID_AVAILABLE) 126 inline void RDRAND32(
void* output)
128 #if defined(__SUNPRO_CC) 132 ".byte 0x0f, 0xc7, 0xf0;\n" 134 :
"=a" (*reinterpret_cast<word32*>(output))
137 #elif defined(GCC_RDRAND_ASM_AVAILABLE) && (CRYPTOPP_GCC_VERSION >= 40700) 145 :
"=a" (*reinterpret_cast<word32*>(output))
148 #elif defined(GCC_RDRAND_ASM_AVAILABLE) && (CRYPTOPP_GCC_VERSION >= 30200) 152 ".byte 0x0f, 0xc7, 0xf0;\n" 154 :
"=a" (*reinterpret_cast<word32*>(output))
157 #elif defined(ALL_RDRAND_INTRIN_AVAILABLE) 158 while(!_rdrand32_step(reinterpret_cast<word32*>(output))) {}
161 CRYPTOPP_UNUSED(output);
166 #if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 168 inline void RDRAND64(
void* output)
170 #if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5100) 174 ".byte 0x48, 0x0f, 0xc7, 0xf0;\n" 176 :
"=a" (*reinterpret_cast<word64*>(output))
179 #elif defined(GCC_RDRAND_ASM_AVAILABLE) && (CRYPTOPP_GCC_VERSION >= 40700) 187 :
"=a" (*reinterpret_cast<word64*>(output))
190 #elif defined(GCC_RDRAND_ASM_AVAILABLE) && (CRYPTOPP_GCC_VERSION >= 30200) 194 ".byte 0x48, 0x0f, 0xc7, 0xf0;\n" 196 :
"=a" (*reinterpret_cast<word64*>(output))
199 #elif defined(ALL_RDRAND_INTRIN_AVAILABLE) 200 while(!_rdrand64_step(reinterpret_cast<unsigned long long*>(output))) {}
203 CRYPTOPP_UNUSED(output);
207 #endif // CRYPTOPP_BOOL_X64, CRYPTOPP_BOOL_X32 and RDRAND64 218 if (size == 0)
return;
220 #if defined(NASM_RDRAND_ASM_AVAILABLE) 222 NASM_RDRAND_GenerateBlock(output, size);
224 #elif defined(MASM_RDRAND_ASM_AVAILABLE) 226 MASM_RDRAND_GenerateBlock(output, size);
228 #elif CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 230 for (i = 0; i < size/8; i++)
231 RDRAND64(reinterpret_cast<word64*>(output)+i);
240 ::memcpy(output, &val, size);
242 #elif CRYPTOPP_BOOL_X86 244 for (i = 0; i < size/4; i++)
245 RDRAND32(reinterpret_cast<word32*>(output)+i);
254 ::memcpy(output, &val, size);
258 CRYPTOPP_UNUSED(output);
259 throw NotImplemented(
"RDRAND: failed to find a suitable implementation");
283 inline void RDSEED32(
void* output)
285 #if defined(__SUNPRO_CC) 289 ".byte 0x0f, 0xc7, 0xf8;\n" 291 :
"=a" (*reinterpret_cast<word32*>(output))
294 #elif defined(GCC_RDSEED_ASM_AVAILABLE) && (CRYPTOPP_GCC_VERSION >= 40800) 302 :
"=a" (*reinterpret_cast<word32*>(output))
305 #elif defined(GCC_RDSEED_ASM_AVAILABLE) && (CRYPTOPP_GCC_VERSION >= 30200) 309 ".byte 0x0f, 0xc7, 0xf8;\n" 311 :
"=a" (*reinterpret_cast<word32*>(output))
314 #elif defined(ALL_RDSEED_INTRIN_AVAILABLE) 315 while(!_rdseed32_step(reinterpret_cast<word32*>(output))) {}
318 CRYPTOPP_UNUSED(output);
323 #if CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 325 inline void RDSEED64(
void* output)
327 #if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5100) 331 ".byte 0x48, 0x0f, 0xc7, 0xf8;\n" 333 :
"=a" (*reinterpret_cast<word64*>(output))
336 #elif defined(GCC_RDSEED_ASM_AVAILABLE) && (CRYPTOPP_GCC_VERSION >= 40800) 344 :
"=a" (*reinterpret_cast<word64*>(output))
347 #elif defined(GCC_RDSEED_ASM_AVAILABLE) && (CRYPTOPP_GCC_VERSION >= 30200) 351 ".byte 0x48, 0x0f, 0xc7, 0xf8;\n" 353 :
"=a" (*reinterpret_cast<word64*>(output))
356 #elif defined(ALL_RDSEED_INTRIN_AVAILABLE) 357 while(!_rdseed64_step(reinterpret_cast<unsigned long long*>(output))) {}
360 CRYPTOPP_UNUSED(output);
364 #endif // CRYPTOPP_BOOL_X64 and RDSEED64 375 if (size == 0)
return;
377 #if defined(NASM_RDSEED_ASM_AVAILABLE) 379 NASM_RDSEED_GenerateBlock(output, size);
381 #elif defined(MASM_RDSEED_ASM_AVAILABLE) 383 MASM_RDSEED_GenerateBlock(output, size);
385 #elif CRYPTOPP_BOOL_X64 || CRYPTOPP_BOOL_X32 387 for (i = 0; i < size/8; i++)
388 RDSEED64(reinterpret_cast<word64*>(output)+i);
397 ::memcpy(output, &val, size);
399 #elif CRYPTOPP_BOOL_X86 401 for (i = 0; i < size/4; i++)
402 RDSEED32(reinterpret_cast<word32*>(output)+i);
411 ::memcpy(output, &val, size);
413 #endif // CRYPTOPP_BOOL_X64, CRYPTOPP_BOOL_X32 and RDSEED64 432 #else // CRYPTOPP_CPUID_AVAILABLE 441 CRYPTOPP_UNUSED(output); CRYPTOPP_UNUSED(size);
456 CRYPTOPP_UNUSED(output); CRYPTOPP_UNUSED(size);
virtual void DiscardBytes(size_t n)
Generate and discard n bytes.
size_type SizeInBytes() const
Provides the number of bytes in the SecBlock.
Abstract base classes that provide a uniform interface to this library.
Library configuration file.
Classes for RDRAND and RDSEED.
bool HasRDRAND()
Determines RDRAND availability.
RDSEED()
Construct a RDSEED generator.
Classes and functions for secure memory allocations.
Exception thrown when a RDRAND generator encounters a generator related error.
virtual void DiscardBytes(size_t n)
Generate and discard n bytes.
A method was called which was not implemented.
bool HasRDSEED()
Determines RDSEED availability.
Fixed size stack-based SecBlock.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
Functions for CPU features and intrinsics.
virtual void GenerateBlock(byte *output, size_t size)
Generate random array of bytes.
T1 RoundUpToMultipleOf(const T1 &n, const T2 &m)
Rounds a value up to a multiple of a second value.
Crypto++ library namespace.
Exception thrown when a RDSEED generator encounters a generator related error.
RDRAND()
Construct a RDRAND generator.
byte * BytePtr()
Provides a byte pointer to the first element in the memory block.