Botan  2.7.0
Crypto and TLS for C++11
Classes | Functions
Botan_FFI Namespace Reference

Classes

struct  botan_struct
 
class  FFI_Error
 

Functions

template<typename T , uint32_t M, typename F >
int apply_fn (botan_struct< T, M > *o, const char *func_name, F func)
 
template<typename T , uint32_t M>
int ffi_delete_object (botan_struct< T, M > *obj, const char *func_name)
 
int ffi_error_exception_thrown (const char *func_name, const char *exn)
 
template<typename Thunk >
int ffi_guard_thunk (const char *func_name, Thunk thunk)
 
template<typename T , uint32_t M>
Tsafe_get (botan_struct< T, M > *p)
 
int write_output (uint8_t out[], size_t *out_len, const uint8_t buf[], size_t buf_len)
 
int write_str_output (uint8_t out[], size_t *out_len, const std::string &str)
 
int write_str_output (char out[], size_t *out_len, const std::string &str)
 
int write_str_output (char out[], size_t *out_len, const std::vector< uint8_t > &str_vec)
 
template<typename Alloc >
int write_vec_output (uint8_t out[], size_t *out_len, const std::vector< uint8_t, Alloc > &buf)
 

Function Documentation

◆ apply_fn()

template<typename T , uint32_t M, typename F >
int Botan_FFI::apply_fn ( botan_struct< T, M > *  o,
const char *  func_name,
func 
)

Definition at line 87 of file ffi_util.h.

References BOTAN_FFI_ERROR_INVALID_OBJECT, BOTAN_FFI_ERROR_NULL_POINTER, ffi_guard_thunk(), Botan_FFI::botan_struct< T, MAGIC >::magic_ok(), and Botan_FFI::botan_struct< T, MAGIC >::unsafe_get().

88  {
89  if(!o)
91 
92  if(o->magic_ok() == false)
94 
95  return ffi_guard_thunk(func_name, [&]() { return func(*o->unsafe_get()); });
96  }
int ffi_guard_thunk(const char *func_name, Thunk thunk)
Definition: ffi_util.h:64

◆ ffi_delete_object()

template<typename T , uint32_t M>
int Botan_FFI::ffi_delete_object ( botan_struct< T, M > *  obj,
const char *  func_name 
)

Definition at line 103 of file ffi_util.h.

References BOTAN_FFI_ERROR_INVALID_OBJECT, BOTAN_FFI_SUCCESS, ffi_error_exception_thrown(), and Botan_FFI::botan_struct< T, MAGIC >::magic_ok().

104  {
105  try
106  {
107  if(obj == nullptr)
108  return BOTAN_FFI_SUCCESS; // ignore delete of null objects
109 
110  if(obj->magic_ok() == false)
112 
113  delete obj;
114  return BOTAN_FFI_SUCCESS;
115  }
116  catch(std::exception& e)
117  {
118  return ffi_error_exception_thrown(func_name, e.what());
119  }
120  catch(...)
121  {
122  return ffi_error_exception_thrown(func_name, "unknown exception");
123  }
124  }
int ffi_error_exception_thrown(const char *func_name, const char *exn)
Definition: ffi.cpp:17

◆ ffi_error_exception_thrown()

int Botan_FFI::ffi_error_exception_thrown ( const char *  func_name,
const char *  exn 
)

Definition at line 17 of file ffi.cpp.

References BOTAN_FFI_ERROR_EXCEPTION_THROWN.

Referenced by ffi_delete_object(), and ffi_guard_thunk().

18  {
19  fprintf(stderr, "in %s exception %s\n", func_name, exn);
21  }

◆ ffi_guard_thunk()

template<typename Thunk >
int Botan_FFI::ffi_guard_thunk ( const char *  func_name,
Thunk  thunk 
)

Definition at line 64 of file ffi_util.h.

References BOTAN_FFI_ERROR_UNKNOWN_ERROR, and ffi_error_exception_thrown().

Referenced by apply_fn(), botan_base64_decode(), botan_base64_encode(), botan_bcrypt_generate(), botan_bcrypt_is_valid(), botan_block_cipher_init(), botan_cipher_init(), botan_cipher_start(), botan_cipher_update(), botan_hash_init(), botan_hex_decode(), botan_hex_encode(), botan_kdf(), botan_key_unwrap3394(), botan_key_wrap3394(), botan_mac_init(), botan_mceies_decrypt(), botan_mceies_encrypt(), botan_mp_init(), botan_pbkdf(), botan_pbkdf_timed(), botan_pk_op_decrypt_create(), botan_pk_op_encrypt_create(), botan_pk_op_key_agreement_create(), botan_pk_op_sign_create(), botan_pk_op_verify_create(), botan_pkcs_hash_id(), botan_privkey_create(), botan_privkey_create_dsa(), botan_privkey_create_elgamal(), botan_privkey_export_pubkey(), botan_privkey_load(), botan_privkey_load_dh(), botan_privkey_load_dsa(), botan_privkey_load_ecdh(), botan_privkey_load_ecdsa(), botan_privkey_load_ed25519(), botan_privkey_load_elgamal(), botan_privkey_load_rsa(), botan_privkey_load_sm2(), botan_privkey_load_sm2_enc(), botan_pubkey_load(), botan_pubkey_load_dh(), botan_pubkey_load_dsa(), botan_pubkey_load_ecdh(), botan_pubkey_load_ecdsa(), botan_pubkey_load_ed25519(), botan_pubkey_load_elgamal(), botan_pubkey_load_rsa(), botan_pubkey_load_sm2(), botan_pubkey_load_sm2_enc(), botan_pubkey_sm2_compute_za(), botan_rng_init(), botan_x509_cert_get_public_key(), botan_x509_cert_load(), and botan_x509_cert_load_file().

65  {
66  try
67  {
68  return thunk();
69  }
70  catch(std::bad_alloc&)
71  {
72  return ffi_error_exception_thrown(func_name, "bad_alloc");
73  }
74  catch(std::exception& e)
75  {
76  return ffi_error_exception_thrown(func_name, e.what());
77  }
78  catch(...)
79  {
80  return ffi_error_exception_thrown(func_name, "unknown exception");
81  }
82 
84  }
int ffi_error_exception_thrown(const char *func_name, const char *exn)
Definition: ffi.cpp:17

◆ safe_get()

template<typename T , uint32_t M>
T& Botan_FFI::safe_get ( botan_struct< T, M > *  p)

Definition at line 49 of file ffi_util.h.

References Botan_FFI::botan_struct< T, MAGIC >::magic_ok(), T, and Botan_FFI::botan_struct< T, MAGIC >::unsafe_get().

Referenced by botan_bcrypt_generate(), botan_cipher_start(), botan_cipher_update(), botan_mceies_decrypt(), botan_mceies_encrypt(), botan_mp_add(), botan_mp_cmp(), botan_mp_div(), botan_mp_equal(), botan_mp_gcd(), botan_mp_is_prime(), botan_mp_lshift(), botan_mp_mod_inverse(), botan_mp_mod_mul(), botan_mp_mul(), botan_mp_powmod(), botan_mp_rand_bits(), botan_mp_rand_range(), botan_mp_rshift(), botan_mp_set_from_mp(), botan_mp_sub(), botan_mp_swap(), botan_pk_op_decrypt_create(), botan_pk_op_encrypt(), botan_pk_op_encrypt_create(), botan_pk_op_key_agreement_create(), botan_pk_op_sign_create(), botan_pk_op_sign_finish(), botan_pk_op_verify_create(), botan_privkey_check_key(), botan_privkey_create(), botan_privkey_create_dsa(), botan_privkey_create_elgamal(), botan_privkey_export_encrypted_pbkdf_iter(), botan_privkey_export_encrypted_pbkdf_msec(), botan_privkey_export_pubkey(), botan_privkey_get_field(), botan_privkey_load(), botan_privkey_load_dh(), botan_privkey_load_dsa(), botan_privkey_load_ecdh(), botan_privkey_load_ecdsa(), botan_privkey_load_elgamal(), botan_privkey_load_rsa(), botan_privkey_load_sm2(), botan_privkey_load_sm2_enc(), botan_pubkey_check_key(), botan_pubkey_get_field(), botan_pubkey_load_dh(), botan_pubkey_load_dsa(), botan_pubkey_load_ecdh(), botan_pubkey_load_ecdsa(), botan_pubkey_load_elgamal(), botan_pubkey_load_rsa(), botan_pubkey_load_sm2(), botan_pubkey_load_sm2_enc(), botan_pubkey_sm2_compute_za(), and botan_x509_cert_get_public_key().

50  {
51  if(!p)
52  throw FFI_Error("Null pointer argument");
53  if(p->magic_ok() == false)
54  throw FFI_Error("Bad magic in ffi object");
55 
56  T* t = p->unsafe_get();
57  if(t)
58  return *t;
59  else
60  throw FFI_Error("Invalid object pointer");
61  }
fe T
Definition: ge.cpp:37

◆ write_output()

int Botan_FFI::write_output ( uint8_t  out[],
size_t *  out_len,
const uint8_t  buf[],
size_t  buf_len 
)
inline

Definition at line 128 of file ffi_util.h.

References BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_SUCCESS, Botan::clear_mem(), and Botan::copy_mem().

Referenced by botan_pkcs_hash_id(), write_str_output(), and write_vec_output().

129  {
130  const size_t avail = *out_len;
131  *out_len = buf_len;
132 
133  if(avail >= buf_len)
134  {
135  Botan::copy_mem(out, buf, buf_len);
136  return BOTAN_FFI_SUCCESS;
137  }
138  else
139  {
140  Botan::clear_mem(out, avail);
142  }
143  }
void clear_mem(T *ptr, size_t n)
Definition: mem_ops.h:97
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:108

◆ write_str_output() [1/3]

int Botan_FFI::write_str_output ( uint8_t  out[],
size_t *  out_len,
const std::string &  str 
)
inline

◆ write_str_output() [2/3]

int Botan_FFI::write_str_output ( char  out[],
size_t *  out_len,
const std::string &  str 
)
inline

Definition at line 158 of file ffi_util.h.

References Botan::cast_char_ptr_to_uint8(), and write_str_output().

159  {
160  return write_str_output(Botan::cast_char_ptr_to_uint8(out), out_len, str);
161  }
int write_str_output(char out[], size_t *out_len, const std::vector< uint8_t > &str_vec)
Definition: ffi_util.h:163
const uint8_t * cast_char_ptr_to_uint8(const char *s)
Definition: mem_ops.h:131

◆ write_str_output() [3/3]

int Botan_FFI::write_str_output ( char  out[],
size_t *  out_len,
const std::vector< uint8_t > &  str_vec 
)
inline

Definition at line 163 of file ffi_util.h.

References Botan::cast_char_ptr_to_uint8(), and write_output().

164  {
166  out_len,
167  str_vec.data(),
168  str_vec.size());
169  }
const uint8_t * cast_char_ptr_to_uint8(const char *s)
Definition: mem_ops.h:131
int write_output(uint8_t out[], size_t *out_len, const uint8_t buf[], size_t buf_len)
Definition: ffi_util.h:128

◆ write_vec_output()

template<typename Alloc >
int Botan_FFI::write_vec_output ( uint8_t  out[],
size_t *  out_len,
const std::vector< uint8_t, Alloc > &  buf 
)