7#ifndef BOTAN_FFI_UTILS_H_
8#define BOTAN_FFI_UTILS_H_
14#include <botan/exceptn.h>
15#include <botan/mem_ops.h>
23 Exception(
"FFI error", what),
27 int error_code() const noexcept
override {
return m_err_code; }
35template<
typename T, u
int32_t MAGIC>
40 m_magic(MAGIC), m_obj(
std::move(obj)) {}
44 bool magic_ok()
const {
return (m_magic == MAGIC); }
52 std::unique_ptr<T> m_obj;
55#define BOTAN_FFI_DECLARE_STRUCT(NAME, TYPE, MAGIC) \
56 struct NAME final : public Botan_FFI::botan_struct<TYPE, MAGIC> { \
57 explicit NAME(std::unique_ptr<TYPE> x) : botan_struct(std::move(x)) {} \
64template<
typename T, u
int32_t M>
78int ffi_guard_thunk(
const char* func_name,
const std::function<
int ()>& thunk);
80template<
typename T, u
int32_t M,
typename F>
96#define BOTAN_FFI_DO(T, obj, param, block) \
97 apply_fn(obj, __func__, \
98 [=](T& param) -> int { do { block } while(0); return BOTAN_FFI_SUCCESS; })
105#define BOTAN_FFI_RETURNING(T, obj, param, block) \
106 apply_fn(obj, __func__, \
107 [=](T& param) -> int { do { block } while(0); })
109template<
typename T, u
int32_t M>
126#define BOTAN_FFI_CHECKED_DELETE(o) ffi_delete_object(o, __func__)
128inline int write_output(uint8_t out[],
size_t* out_len,
const uint8_t buf[],
size_t buf_len)
130 if(out_len ==
nullptr)
133 const size_t avail = *out_len;
136 if((avail >= buf_len) && (out !=
nullptr))
151template<
typename Alloc>
152int write_vec_output(uint8_t out[],
size_t* out_len,
const std::vector<uint8_t, Alloc>& buf)
154 return write_output(out, out_len, buf.data(), buf.size());
169inline int write_str_output(
char out[],
size_t* out_len,
const std::vector<uint8_t>& str_vec)
FFI_Error(const std::string &what, int err_code)
Botan::ErrorType error_type() const noexcept override
int error_code() const noexcept override
int(* final)(unsigned char *, CTX *)
#define BOTAN_UNSTABLE_API
@ BOTAN_FFI_ERROR_EXCEPTION_THROWN
@ BOTAN_FFI_ERROR_INVALID_OBJECT
@ BOTAN_FFI_ERROR_NULL_POINTER
@ BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE
int apply_fn(botan_struct< T, M > *o, const char *func_name, F func)
int ffi_error_exception_thrown(const char *func_name, const char *exn, int rc)
int ffi_delete_object(botan_struct< T, M > *obj, const char *func_name)
T & safe_get(botan_struct< T, M > *p)
int write_str_output(uint8_t out[], size_t *out_len, const std::string &str)
int ffi_guard_thunk(const char *func_name, const std::function< int()> &thunk)
int write_vec_output(uint8_t out[], size_t *out_len, const std::vector< uint8_t, Alloc > &buf)
int write_output(uint8_t out[], size_t *out_len, const uint8_t buf[], size_t buf_len)
constexpr void copy_mem(T *out, const T *in, size_t n)
constexpr void clear_mem(T *ptr, size_t n)
const uint8_t * cast_char_ptr_to_uint8(const char *s)
botan_struct(std::unique_ptr< T > obj)