10#include <botan/auto_rng.h> 
   11#include <botan/system_rng.h> 
   12#include <botan/internal/ffi_rng.h> 
   13#include <botan/internal/ffi_util.h> 
   18#if defined(BOTAN_HAS_PROCESSOR_RNG) 
   19   #include <botan/processor_rng.h> 
   22#if defined(BOTAN_HAS_JITTER_RNG) 
   23   #include <botan/jitter_rng.h> 
   25#if defined(BOTAN_HAS_ESDM_RNG) 
   26   #include <botan/esdm_rng.h> 
   35      if(rng_out == 
nullptr) {
 
   39      const std::string rng_type_s(rng_type != 
nullptr ? rng_type : 
"system");
 
   41      std::unique_ptr<Botan::RandomNumberGenerator> rng;
 
   43      if(rng_type_s == 
"system") {
 
   44         rng = std::make_unique<Botan::System_RNG>();
 
   45      } 
else if(rng_type_s == 
"user" || rng_type_s == 
"user-threadsafe") {
 
   46         rng = std::make_unique<Botan::AutoSeeded_RNG>();
 
   47      } 
else if(rng_type_s == 
"null") {
 
   48         rng = std::make_unique<Botan::Null_RNG>();
 
   50#if defined(BOTAN_HAS_PROCESSOR_RNG) 
   52         rng = std::make_unique<Botan::Processor_RNG>();
 
   55#if defined(BOTAN_HAS_JITTER_RNG) 
   56      else if(rng_type_s == 
"jitter") {
 
   57         rng = std::make_unique<Botan::Jitter_RNG>();
 
   60#if defined(BOTAN_HAS_ESDM_RNG) 
   61      else if(rng_type_s == 
"esdm-full") {
 
   62         rng = std::make_unique<Botan::ESDM_RNG>(
false);
 
   63      } 
else if(rng_type_s == 
"esdm-pr") {
 
   64         rng = std::make_unique<Botan::ESDM_RNG>(
true);
 
 
   79                          int (*get_cb)(
void* context, uint8_t* out, 
size_t out_len),
 
   80                          int (*add_entropy_cb)(
void* context, 
const uint8_t input[], 
size_t length),
 
   81                          void (*destroy_cb)(
void* context)) {
 
   83      if(rng_out == 
nullptr) {
 
   87      if(rng_name == 
nullptr) {
 
   91      if(get_cb == 
nullptr) {
 
   97            Custom_RNG(std::string_view name,
 
   99                       int (*get_cb)(
void* context, uint8_t* out, 
size_t out_len),
 
  100                       int (*add_entropy_cb)(
void* context, 
const uint8_t input[], 
size_t length),
 
  101                       void (*destroy_cb)(
void* context)) :
 
  105                  m_add_entropy_cb(add_entropy_cb),
 
  106                  m_destroy_cb(destroy_cb) {}
 
  108            ~Custom_RNG()
 override {
 
  110                  m_destroy_cb(m_context);
 
  114            Custom_RNG(
const Custom_RNG& other) = 
delete;
 
  115            Custom_RNG(Custom_RNG&& other) = 
delete;
 
  116            Custom_RNG& operator=(
const Custom_RNG& other) = 
delete;
 
  117            Custom_RNG& operator=(Custom_RNG&& other) = 
delete;
 
  120            void fill_bytes_with_input(std::span<uint8_t> output, std::span<const uint8_t> input)
 override {
 
  121               if(accepts_input() && !input.empty()) {
 
  122                  int rc = m_add_entropy_cb(m_context, input.data(), input.size());
 
  128               if(!output.empty()) {
 
  129                  int rc = m_get_cb(m_context, output.data(), output.size());
 
  137            bool accepts_input()
 const override { 
return m_add_entropy_cb != 
nullptr; }
 
  139            std::string name()
 const override { 
return m_name; }
 
  141            void clear()
 override {}
 
  143            bool is_seeded()
 const override { 
return true; }
 
  148            std::function<int(
void* context, uint8_t* out, 
size_t out_len)> m_get_cb;
 
  149            std::function<int(
void* context, 
const uint8_t input[], 
size_t length)> m_add_entropy_cb;
 
  150            std::function<void(
void* context)> m_destroy_cb;
 
  153      auto rng = std::make_unique<Custom_RNG>(rng_name, context, get_cb, add_entropy_cb, destroy_cb);
 
 
  164   return BOTAN_FFI_VISIT(rng, [=](
auto& r) { r.randomize(out, out_len); });
 
 
  179   return BOTAN_FFI_VISIT(rng, [=](
auto& r) { r.add_entropy(input, len); });
 
 
void randomize(std::span< uint8_t > output)
 
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_system_rng_get(uint8_t *out, size_t out_len)
 
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_VISIT(obj, lambda)
 
#define BOTAN_FFI_CHECKED_DELETE(o)
 
T & safe_get(botan_struct< T, M > *p)
 
BOTAN_FFI_ERROR ffi_new_object(T *obj, Args &&... args)
 
int ffi_guard_thunk(const char *func_name, T thunk)
 
RandomNumberGenerator & system_rng()