9#include <botan/internal/ffi_util.h>
10#include <botan/internal/ffi_rng.h>
11#include <botan/system_rng.h>
12#include <botan/auto_rng.h>
16#if defined(BOTAN_HAS_PROCESSOR_RNG)
17 #include <botan/processor_rng.h>
27 if(rng_out ==
nullptr)
30 const std::string rng_type_s(rng_type ? rng_type :
"system");
32 std::unique_ptr<Botan::RandomNumberGenerator> rng;
34 if(rng_type_s ==
"system")
38 else if(rng_type_s ==
"user" || rng_type_s ==
"user-threadsafe")
42 else if(rng_type_s ==
"null")
46#if defined(BOTAN_HAS_PROCESSOR_RNG)
58 *rng_out =
new botan_rng_struct(rng.release());
64 int(* get_cb)(
void* context, uint8_t* out,
size_t out_len),
65 int(* add_entropy_cb)(
void* context,
const uint8_t input[],
size_t length),
66 void(* destroy_cb)(
void* context))
69 if(rng_out ==
nullptr)
72 if(rng_name ==
nullptr)
81 Custom_RNG(
const std::string&
name,
void* context,
82 int(* get_cb)(
void* context, uint8_t* out,
size_t out_len),
83 int(* add_entropy_cb)(
void* context,
const uint8_t input[],
size_t length),
84 void(* destroy_cb)(
void* context)) :
89 m_add_entropy_cb = add_entropy_cb;
90 m_destroy_cb = destroy_cb;
97 m_destroy_cb(m_context);
101 void randomize(uint8_t output[],
size_t length)
override
103 int rc = m_get_cb(m_context, output, length);
112 return m_add_entropy_cb !=
nullptr;
115 void add_entropy(
const uint8_t input[],
size_t length)
override
117 if(m_add_entropy_cb ==
nullptr)
122 int rc = m_add_entropy_cb(m_context, input, length);
129 std::string
name()
const override
134 void clear()
override
146 std::function<int(
void* context, uint8_t* out,
size_t out_len)> m_get_cb;
147 std::function<int(
void* context,
const uint8_t input[],
size_t length)> m_add_entropy_cb;
148 std::function<void(
void* context)> m_destroy_cb;
151 std::unique_ptr<Botan::RandomNumberGenerator> rng(
new Custom_RNG(rng_name, context, get_cb, add_entropy_cb, destroy_cb));
153 *rng_out =
new botan_rng_struct(rng.release());
virtual bool accepts_input() const =0
virtual void reseed_from_rng(RandomNumberGenerator &rng, size_t poll_bits=BOTAN_RNG_RESEED_POLL_BITS)
virtual bool is_seeded() const =0
virtual void randomize(uint8_t output[], size_t length)=0
virtual std::string name() const =0
virtual void add_entropy(const uint8_t input[], size_t length)=0
struct botan_rng_struct * botan_rng_t
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
@ BOTAN_FFI_ERROR_NULL_POINTER
int botan_rng_reseed_from_rng(botan_rng_t rng, botan_rng_t source_rng, size_t bits)
int botan_rng_init_custom(botan_rng_t *rng_out, const char *rng_name, void *context, int(*get_cb)(void *context, uint8_t *out, size_t out_len), int(*add_entropy_cb)(void *context, const uint8_t input[], size_t length), void(*destroy_cb)(void *context))
int botan_rng_reseed(botan_rng_t rng, size_t bits)
int botan_rng_add_entropy(botan_rng_t rng, const uint8_t *input, size_t len)
int botan_rng_init(botan_rng_t *rng_out, const char *rng_type)
int botan_rng_get(botan_rng_t rng, uint8_t *out, size_t out_len)
int botan_rng_destroy(botan_rng_t rng)
#define BOTAN_FFI_DO(T, obj, param, block)
#define BOTAN_FFI_CHECKED_DELETE(o)
std::string to_string(const BER_Object &obj)
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
T & safe_get(botan_struct< T, M > *p)
RandomNumberGenerator & system_rng()