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>
42 bool magic_ok()
const {
return (m_magic == MAGIC); }
50 std::unique_ptr<T> m_obj;
53#define BOTAN_FFI_DECLARE_STRUCT(NAME, TYPE, MAGIC) \
54 struct NAME final : public Botan_FFI::botan_struct<TYPE, MAGIC> { explicit NAME(TYPE* x) : botan_struct(x) {} }
60template<
typename T, u
int32_t M>
76template<
typename T, u
int32_t M,
typename F>
92#define BOTAN_FFI_DO(T, obj, param, block) \
93 apply_fn(obj, __func__, \
94 [=](T& param) -> int { do { block } while(0); return BOTAN_FFI_SUCCESS; })
101#define BOTAN_FFI_RETURNING(T, obj, param, block) \
102 apply_fn(obj, __func__, \
103 [=](T& param) -> int { do { block } while(0); })
105template<
typename T, u
int32_t M>
119 catch(std::exception& e)
129#define BOTAN_FFI_CHECKED_DELETE(o) ffi_delete_object(o, __func__)
131inline int write_output(uint8_t out[],
size_t* out_len,
const uint8_t buf[],
size_t buf_len)
133 if(out_len ==
nullptr)
136 const size_t avail = *out_len;
139 if((avail >= buf_len) && (out !=
nullptr))
154template<
typename Alloc>
155int write_vec_output(uint8_t out[],
size_t* out_len,
const std::vector<uint8_t, Alloc>& buf)
157 return write_output(out, out_len, buf.data(), buf.size());
172inline 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)
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
T & safe_get(botan_struct< T, M > *p)
int write_str_output(uint8_t out[], size_t *out_len, const std::string &str)
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)
void copy_mem(T *out, const T *in, size_t n)
void clear_mem(T *ptr, size_t n)
const uint8_t * cast_char_ptr_to_uint8(const char *s)