8#include <botan/esdm_rng.h>
10#include <botan/exceptn.h>
11#include <esdm/esdm_rpc_client.h>
25 [[nodiscard]]
static std::shared_ptr<void> instance() {
26 static ESDM_Context g_instance;
27 return g_instance.acquire();
31 ESDM_Context() =
default;
33 [[nodiscard]] std::shared_ptr<void> acquire() {
34 std::scoped_lock lk(m_mutex);
36 if(esdm_rpcc_init_unpriv_service(
nullptr) != 0) {
37 throw Botan::System_Error(
"unable to initialize ESDM unprivileged service");
40 return std::shared_ptr<void>{
nullptr, [
this](
void*) { this->release(); }};
44 std::scoped_lock lk(m_mutex);
46 esdm_rpcc_fini_unpriv_service();
57 m_prediction_resistance(prediction_resistance), m_ctx(ESDM_Context::instance()) {}
74 esdm_invoke(esdm_rpcc_write_data(in.data(), in.size()));
86 if(m_prediction_resistance) {
87 esdm_invoke(esdm_rpcc_get_random_bytes_pr(out.data(), out.size()));
89 esdm_invoke(esdm_rpcc_get_random_bytes_full(out.data(), out.size()));
94 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()