14#ifndef OPENVPN_RANDOM_MTRANDAPI_H
15#define OPENVPN_RANDOM_MTRANDAPI_H
30#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 16
31#define MTRAND_GCC_NO_INLINE __attribute__((noinline))
33#define MTRAND_GCC_NO_INLINE
57 MTRand(
const rand_type::result_type seed)
63 std::string
name()
const override
86 rand_type::result_type
rand()
94 return seed.
rand_get<rand_type::result_type>();
99 std::random_device rd;
101 rand_type::result_type ret;
static rand_type::result_type gen_seed(RandomAPI &seed)
MTRAND_GCC_NO_INLINE void rand_bytes(unsigned char *buf, size_t size) override
Fill a buffer with random bytes.
static rand_type::result_type gen_seed()
MTRAND_GCC_NO_INLINE bool rand_bytes_noexcept(unsigned char *buf, size_t size) override
std::string name() const override
Get the name of the random number generation algorithm.
OPENVPN_EXCEPTION(mtrand_error)
std::mt19937_64 rand_type
MTRand(const rand_type::result_type seed)
rand_type::result_type rand()
RandomByteStore< rand_type > rbs
Abstract base class for random number generators.
T rand_get()
Create a data object filled with random bytes.
unsigned char get_byte(RAND_TYPE &rng)
void fill(T &obj, RAND_TYPE &rng)
Abstract base class for pseudo random number generators.
#define MTRAND_GCC_NO_INLINE
Implementation of the base classes for random number generators.