8#include <botan/esdm_rng.h>
10#include <esdm/esdm_rpc_client.h>
24 [[nodiscard]]
static std::shared_ptr<void> instance() {
25 static ESDM_Context g_instance;
26 return g_instance.acquire();
30 ESDM_Context() =
default;
32 [[nodiscard]] std::shared_ptr<void> acquire() {
33 std::scoped_lock lk(m_mutex);
35 if(esdm_rpcc_init_unpriv_service(
nullptr) != 0) {
39 return std::shared_ptr<void>{
nullptr, [
this](
void*) { this->release(); }};
43 std::scoped_lock lk(m_mutex);
45 esdm_rpcc_fini_unpriv_service();
56 m_prediction_resistance(prediction_resistance), m_ctx(ESDM_Context::instance()) {}
73 esdm_invoke(esdm_rpcc_write_data(in.data(), in.size()));
85 if(m_prediction_resistance) {
86 esdm_invoke(esdm_rpcc_get_random_bytes_pr(out.data(), out.size()));
88 esdm_invoke(esdm_rpcc_get_random_bytes_full(out.data(), out.size()));
93 if(ret !=
static_cast<ssize_t
>(out.size())) {
void fill_bytes_with_input(std::span< uint8_t > out, std::span< const uint8_t > in) override
RandomNumberGenerator & esdm_rng()