Botan 2.19.5 Crypto and TLS for C&

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, int rc)
int | ffi_guard_thunk (const char *func_name, std::function< int()> thunk)
template<typename T , uint32_t M>
T & | safe_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 (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)
int | write_str_output (uint8_t out[], size_t *out_len, const std::string &str)
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,
|  | F | func
| ) |  |

Definition at line 77 of file ffi_util.h.

78 {
79 if(!o)
80 return BOTAN_FFI_ERROR_NULL_POINTER;
81
82 if(o->magic_ok() == false)
83 return BOTAN_FFI_ERROR_INVALID_OBJECT;
84
85 T* p = o->unsafe_get();
86 if(p == nullptr)
87 return BOTAN_FFI_ERROR_INVALID_OBJECT;
88
89 return ffi_guard_thunk(func_name, [&]() { return func(*p); });
90 }
BOTAN_FFI_ERROR_INVALID_OBJECT
@ BOTAN_FFI_ERROR_INVALID_OBJECT
Definition: ffi.h:84
BOTAN_FFI_ERROR_NULL_POINTER
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition: ffi.h:77
T
fe T
Definition: ge.cpp:37
Botan_FFI::ffi_guard_thunk
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:89
Botan_FFI::botan_struct::unsafe_get
T * unsafe_get() const
Definition: ffi_util.h:44
Botan_FFI::botan_struct::magic_ok
bool magic_ok() const
Definition: ffi_util.h:42

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

## ◆ 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 106 of file ffi_util.h.

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

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

## ◆ ffi_error_exception_thrown()

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

Definition at line 19 of file ffi.cpp.

20 {
21 std::string val;
22 if(Botan::OS::read_env_variable(val, "BOTAN_FFI_PRINT_EXCEPTIONS") == true && val != "")
23 {
24 std::fprintf(stderr, "in %s exception '%s' returning %d\n", func_name, exn, rc);
25 }
26 return rc;
27 }
Botan::OS::read_env_variable
bool read_env_variable(std::string &value_out, const std::string &var_name)
Definition: os_utils.cpp:387

References Botan::OS::read_env_variable().

Referenced by ffi_delete_object(), and ffi_guard_thunk().

## ◆ ffi_guard_thunk()

int Botan_FFI::ffi_guard_thunk | ( | const char * | func_name,
|  | std::function< int()> | thunk
| ) |  |

Definition at line 89 of file ffi.cpp.

90 {
91 try
92 {
93 return thunk();
94 }
95 catch(std::bad_alloc&)
96 {
97 return ffi_error_exception_thrown(func_name, "bad_alloc", BOTAN_FFI_ERROR_OUT_OF_MEMORY);
98 }
99 catch(Botan_FFI::FFI_Error& e)
100 {
101 return ffi_error_exception_thrown(func_name, e.what(), e.error_code());
102 }
103 catch(Botan::Exception& e)
104 {
105 return ffi_error_exception_thrown(func_name, e.what(), ffi_map_error_type(e.error_type()));
106 }
107 catch(std::exception& e)
108 {
109 return ffi_error_exception_thrown(func_name, e.what());
110 }
111 catch(...)
112 {
113 return ffi_error_exception_thrown(func_name, "unknown exception");
114 }
115
116 return BOTAN_FFI_ERROR_UNKNOWN_ERROR;
117 }
Botan::Exception
Definition: exceptn.h:86
Botan::Exception::what
const char * what() const noexcept override
Definition: exceptn.h:96
Botan::Exception::error_type
virtual ErrorType error_type() const noexcept
Definition: exceptn.h:101
Botan_FFI::FFI_Error
Definition: ffi_util.h:20
Botan_FFI::FFI_Error::error_code
int error_code() const noexcept override
Definition: ffi_util.h:27
BOTAN_FFI_ERROR_OUT_OF_MEMORY
@ BOTAN_FFI_ERROR_OUT_OF_MEMORY
Definition: ffi.h:72
BOTAN_FFI_ERROR_UNKNOWN_ERROR
@ BOTAN_FFI_ERROR_UNKNOWN_ERROR
Definition: ffi.h:90

References BOTAN_FFI_ERROR_OUT_OF_MEMORY, BOTAN_FFI_ERROR_UNKNOWN_ERROR, Botan_FFI::FFI_Error::error_code(), Botan_FFI::FFI_Error::error_type(), ffi_error_exception_thrown(), and Botan::Exception::what().

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_fpe_decrypt(), botan_fpe_encrypt(), botan_fpe_fe1_init(), botan_hash_init(), botan_hex_decode(), botan_hex_encode(), botan_hotp_init(), botan_kdf(), botan_key_unwrap3394(), botan_key_wrap3394(), botan_mac_init(), botan_mceies_decrypt(), botan_mceies_encrypt(), botan_mp_init(), 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_rsa_pkcs1(), botan_privkey_load_sm2(), botan_privkey_load_x25519(), 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_x25519(), botan_pubkey_sm2_compute_za(), botan_pwdhash(), botan_pwdhash_timed(), botan_rng_init(), botan_rng_init_custom(), botan_totp_init(), botan_x509_cert_dup(), botan_x509_cert_get_public_key(), botan_x509_cert_load(), botan_x509_cert_load_file(), botan_x509_cert_verify(), botan_x509_cert_verify_with_crl(), botan_x509_crl_load(), and botan_x509_crl_load_file().

## ◆ safe_get()

template<typename T , uint32_t M>

T & Botan_FFI::safe_get | ( | botan_struct< T, M > * | p | ) |

Definition at line 61 of file ffi_util.h.

62 {
63 if(!p)
64 throw FFI_Error("Null pointer argument", BOTAN_FFI_ERROR_NULL_POINTER);
65 if(p->magic_ok() == false)
66 throw FFI_Error("Bad magic in ffi object", BOTAN_FFI_ERROR_INVALID_OBJECT);
67
68 if(T* t = p->unsafe_get())
69 return *t;
70
71 throw FFI_Error("Invalid object pointer", BOTAN_FFI_ERROR_INVALID_OBJECT);
72 }

References BOTAN_FFI_ERROR_INVALID_OBJECT, BOTAN_FFI_ERROR_NULL_POINTER, 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_fpe_decrypt(), botan_fpe_encrypt(), botan_fpe_fe1_init(), botan_mceies_decrypt(), botan_mceies_encrypt(), botan_mp_add(), botan_mp_add_u32(), 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_sub_u32(), 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_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_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_sm2_compute_za(), botan_rng_reseed_from_rng(), botan_x509_cert_dup(), botan_x509_cert_get_public_key(), botan_x509_cert_verify(), botan_x509_cert_verify_with_crl(), and botan_x509_is_revoked().

## ◆ 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 131 of file ffi_util.h.

132 {
133 if(out_len == nullptr)
134 return BOTAN_FFI_ERROR_NULL_POINTER;
135
136 const size_t avail = *out_len;
137 *out_len = buf_len;
138
139 if((avail >= buf_len) && (out != nullptr))
140 {
141 Botan::copy_mem(out, buf, buf_len);
142 return BOTAN_FFI_SUCCESS;
143 }
144 else
145 {
146 if(out != nullptr)
147 {
148 Botan::clear_mem(out, avail);
149 }
150 return BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE;
151 }
152 }
BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE
@ BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE
Definition: ffi.h:69
Botan::copy_mem
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:133
Botan::clear_mem
void clear_mem(T *ptr, size_t n)
Definition: mem_ops.h:115

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

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

## ◆ write_str_output() [1/3]

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

Definition at line 167 of file ffi_util.h.

168 {
169 return write_str_output(Botan::cast_char_ptr_to_uint8(out), out_len, str);
170 }
Botan_FFI::write_str_output
int write_str_output(char out[], size_t *out_len, const std::vector< uint8_t > &str_vec)
Definition: ffi_util.h:172
Botan::cast_char_ptr_to_uint8
const uint8_t * cast_char_ptr_to_uint8(const char *s)
Definition: mem_ops.h:190

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

## ◆ write_str_output() [2/3]

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

Definition at line 172 of file ffi_util.h.

173 {
174 return write_output(Botan::cast_char_ptr_to_uint8(out),
175 out_len,
176 str_vec.data(),
177 str_vec.size());
178 }
Botan_FFI::write_output
int write_output(uint8_t out[], size_t *out_len, const uint8_t buf[], size_t buf_len)
Definition: ffi_util.h:131

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

## ◆ write_str_output() [3/3]

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

Definition at line 160 of file ffi_util.h.

161 {
162 return write_output(out, out_len,
163 Botan::cast_char_ptr_to_uint8(str.data()),
164 str.size() + 1);
165 }

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

Referenced by botan_base64_encode(), botan_bcrypt_generate(), botan_block_cipher_name(), botan_cipher_name(), botan_hash_name(), botan_mac_name(), botan_mp_to_str(), botan_privkey_algo_name(), botan_privkey_export(), botan_privkey_export_encrypted_pbkdf_iter(), botan_privkey_export_encrypted_pbkdf_msec(), botan_privkey_rsa_get_privkey(), botan_pubkey_algo_name(), botan_pubkey_export(), botan_x509_cert_get_fingerprint(), botan_x509_cert_get_issuer_dn(), botan_x509_cert_get_subject_dn(), botan_x509_cert_get_time_expires(), botan_x509_cert_get_time_starts(), botan_x509_cert_to_string(), and write_str_output().

## ◆ 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
| ) |  |

Definition at line 155 of file ffi_util.h.

156 {
157 return write_output(out, out_len, buf.data(), buf.size());
158 }

References write_output().

Referenced by botan_hex_decode(), botan_key_unwrap3394(), botan_key_wrap3394(), botan_mceies_decrypt(), botan_mceies_encrypt(), botan_pk_op_decrypt(), botan_pk_op_encrypt(), botan_pk_op_key_agreement(), botan_pk_op_key_agreement_export_public(), botan_pk_op_sign_finish(), botan_privkey_export(), botan_privkey_export_encrypted_pbkdf_iter(), botan_privkey_export_encrypted_pbkdf_msec(), botan_privkey_rsa_get_privkey(), botan_pubkey_export(), botan_pubkey_fingerprint(), botan_pubkey_sm2_compute_za(), botan_x509_cert_get_authority_key_id(), botan_x509_cert_get_public_key_bits(), botan_x509_cert_get_serial_number(), and botan_x509_cert_get_subject_key_id().