1//===-- RandomNumberGenerator.cpp - Implement RNG class -------------------===//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//===----------------------------------------------------------------------===//
9// This file implements deterministic random number generation (RNG).
10// The current implementation is NOT cryptographically secure as it uses
11// the C++11 <random> facilities.
13//===----------------------------------------------------------------------===//
32 #define DEBUG_TYPE "rng"
45RandomNumberGenerator::RandomNumberGenerator(
StringRef Salt) {
47 <<
"Warning! Using unseeded random number generator.\n");
49 // Combine seed and salts using std::seed_seq.
50 // Data: Seed-low, Seed-high, Salt
51 // Note: std::seed_seq can only store 32-bit values, even though we
52 // are using a 64-bit RNG. This isn't a problem since the Mersenne
53 // twister constructor copies these correctly into its initial state.
54 std::vector<uint32_t>
Data;
61 std::seed_seq SeedSeq(
Data.begin(),
Data.end());
62 Generator.seed(SeedSeq);
69// Get random vector of specified size
73 if (CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL,
74 CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
76 if (CryptGenRandom(hProvider,
Size,
static_cast<BYTE *
>(Buffer)))
77 return std::error_code();
79 return std::error_code(GetLastError(), std::system_category());
81 int Fd = open(
"/dev/urandom", O_RDONLY);
84 ssize_t BytesRead = read(Fd, Buffer,
Size);
87 else if (BytesRead !=
static_cast<ssize_t
>(
Size))
88 Ret = std::error_code(EIO, std::system_category());
static ManagedStatic< cl::opt< uint64_t >, CreateSeed > Seed
ManagedStatic - This transparently changes the behavior of global statics to be lazily constructed on...
generator_type::result_type result_type
LLVM_ABI result_type operator()()
Returns a random number in the range [0, Max).
StringRef - Represent a constant reference to a string, i.e.
constexpr size_t size() const
size - Get the string size.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
ScopedHandle< CryptContextTraits > ScopedCryptContext
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
void initRandomSeedOptions()
LLVM_ABI std::error_code getRandomBytes(void *Buffer, size_t Size)
OutputIt copy(R &&Range, OutputIt Out)
std::error_code errnoAsErrorCode()
Helper to get errno as an std::error_code.