28 #define DEBUG_TYPE "rng"
38 RandomNumberGenerator::RandomNumberGenerator(
StringRef Salt) {
41 dbgs() <<
"Warning! Using unseeded random number generator.\n"
49 std::vector<uint32_t> Data;
50 Data.resize(2 + Salt.
size());
54 std::copy(Salt.
begin(), Salt.
end(), Data.begin() + 2);
56 std::seed_seq SeedSeq(Data.begin(), Data.end());
57 Generator.seed(SeedSeq);
68 if (CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL,
69 CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
71 if (CryptGenRandom(hProvider, Size, static_cast<BYTE *>(Buffer)))
72 return std::error_code();
74 return std::error_code(GetLastError(), std::system_category());
76 int Fd = open(
"/dev/urandom", O_RDONLY);
79 ssize_t BytesRead =
read(Fd, Buffer, Size);
81 Ret = std::error_code(errno, std::system_category());
82 else if (BytesRead != static_cast<ssize_t>(Size))
83 Ret = std::error_code(EIO, std::system_category());
85 Ret = std::error_code(errno, std::system_category());
89 return std::error_code(errno, std::system_category());
static cl::opt< unsigned long long > Seed("rng-seed", cl::value_desc("seed"), cl::desc("Seed for the random number generator"), cl::init(0))
value_type read(const void *memory)
Read a value of a particular endianness from memory.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE size_t size() const
size - Get the string size.
initializer< Ty > init(const Ty &Val)
std::error_code getRandomBytes(void *Buffer, size_t Size)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
generator_type::result_type result_type
result_type operator()()
Returns a random number in the range [0, Max).
StringRef - Represent a constant reference to a string, i.e.