Botan 3.9.0
Crypto and TLS for C&
ffi.cpp File Reference
#include <botan/ffi.h>
#include <botan/base64.h>
#include <botan/hex.h>
#include <botan/mem_ops.h>
#include <botan/version.h>
#include <botan/internal/ct_utils.h>
#include <botan/internal/ffi_util.h>
#include <cstdio>
#include <cstdlib>

Go to the source code of this file.

Namespaces

namespace  Botan_FFI

Functions

int botan_base64_decode (const char *base64_str, size_t in_len, uint8_t *out, size_t *out_len)
int botan_base64_encode (const uint8_t *in, size_t len, char *out, size_t *out_len)
int botan_constant_time_compare (const uint8_t *x, const uint8_t *y, size_t len)
const char * botan_error_description (int err)
const char * botan_error_last_exception_message ()
uint32_t botan_ffi_api_version ()
int botan_ffi_supports_api (uint32_t api_version)
int botan_hex_decode (const char *hex_str, size_t in_len, uint8_t *out, size_t *out_len)
int botan_hex_encode (const uint8_t *in, size_t len, char *out, uint32_t flags)
int botan_same_mem (const uint8_t *x, const uint8_t *y, size_t len)
int botan_scrub_mem (void *mem, size_t bytes)
uint32_t botan_version_datestamp ()
uint32_t botan_version_major ()
uint32_t botan_version_minor ()
uint32_t botan_version_patch ()
const char * botan_version_string ()
int Botan_FFI::botan_view_bin_bounce_fn (botan_view_ctx vctx, const uint8_t *buf, size_t len)
int Botan_FFI::botan_view_str_bounce_fn (botan_view_ctx vctx, const char *str, size_t len)
void Botan_FFI::ffi_clear_last_exception ()
int Botan_FFI::ffi_error_exception_thrown (const char *func_name, const char *exn, Botan::ErrorType err)
int Botan_FFI::ffi_error_exception_thrown (const char *func_name, const char *exn, int rc)

Function Documentation

◆ botan_base64_decode()

int botan_base64_decode ( const char * base64_str,
size_t in_len,
uint8_t * out,
size_t * out_len )

Perform base64 decoding

Definition at line 338 of file ffi.cpp.

338 {
339 return ffi_guard_thunk(__func__, [=]() -> int {
340 if(*out_len < Botan::base64_decode_max_output(in_len)) {
341 *out_len = Botan::base64_decode_max_output(in_len);
343 }
344
345 *out_len = Botan::base64_decode(out, std::string(base64_str, in_len));
346 return BOTAN_FFI_SUCCESS;
347 });
348}
@ BOTAN_FFI_SUCCESS
Definition ffi.h:115
@ BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE
Definition ffi.h:123
int ffi_guard_thunk(const char *func_name, T thunk)
Definition ffi_util.h:95
size_t base64_decode(uint8_t out[], const char in[], size_t input_length, size_t &input_consumed, bool final_inputs, bool ignore_ws)
Definition base64.cpp:168
size_t base64_decode_max_output(size_t input_length)
Definition base64.cpp:200

References Botan::base64_decode(), Botan::base64_decode_max_output(), BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_SUCCESS, and Botan_FFI::ffi_guard_thunk().

◆ botan_base64_encode()

int botan_base64_encode ( const uint8_t * x,
size_t len,
char * out,
size_t * out_len )

Perform base64 encoding

Parameters
xthe input data
lenthe length of x
outthe output buffer
out_lenthe size of the output buffer on input, set to the number of bytes written
Returns
0 on success, a negative value on failure

Definition at line 331 of file ffi.cpp.

331 {
332 return ffi_guard_thunk(__func__, [=]() -> int {
333 const std::string base64 = Botan::base64_encode(in, len);
334 return Botan_FFI::write_str_output(out, out_len, base64);
335 });
336}
int write_str_output(char out[], size_t *out_len, const std::string &str)
Definition ffi_util.h:251
size_t base64_encode(char out[], const uint8_t in[], size_t input_length, size_t &input_consumed, bool final_inputs)
Definition base64.cpp:160

References Botan::base64_encode(), Botan_FFI::ffi_guard_thunk(), and Botan_FFI::write_str_output().

◆ botan_constant_time_compare()

int botan_constant_time_compare ( const uint8_t * x,
const uint8_t * y,
size_t len )

Returns 0 if x[0..len] == y[0..len], or otherwise -1

Definition at line 301 of file ffi.cpp.

301 {
302 auto same = Botan::CT::is_equal(x, y, len);
303 // Return 0 if same or -1 otherwise
304 return static_cast<int>(same.select(1, 0)) - 1;
305}
constexpr CT::Mask< T > is_equal(const T x[], const T y[], size_t len)
Definition ct_utils.h:826

References Botan::CT::is_equal().

Referenced by botan_same_mem().

◆ botan_error_description()

const char * botan_error_description ( int err)

Convert an error code into a string. Returns "Unknown error" if the error code is not a known one.

Definition at line 143 of file ffi.cpp.

143 {
144 switch(err) {
146 return "OK";
147
149 return "Invalid verifier";
150
152 return "Invalid input";
153
155 return "Invalid authentication code";
156
158 return "No value available";
159
161 return "Insufficient buffer space";
162
164 return "String conversion error";
165
167 return "Exception thrown";
168
170 return "Out of memory";
171
173 return "Error while calling system API";
174
176 return "Internal error";
177
179 return "Bad flag";
180
182 return "Null pointer argument";
183
185 return "Bad parameter";
186
188 return "Key not set on object";
189
191 return "Invalid key length";
192
194 return "Invalid object state";
195
197 return "Not implemented";
198
200 return "Invalid object handle";
201
203 return "TLS error";
204
206 return "HTTP error";
207
209 default:
210 return "Unknown error";
211 }
212}
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition ffi.h:138
@ BOTAN_FFI_ERROR_INVALID_KEY_LENGTH
Definition ffi.h:135
@ BOTAN_FFI_ERROR_KEY_NOT_SET
Definition ffi.h:134
@ BOTAN_FFI_ERROR_TLS_ERROR
Definition ffi.h:141
@ BOTAN_FFI_ERROR_EXCEPTION_THROWN
Definition ffi.h:126
@ BOTAN_FFI_ERROR_OUT_OF_MEMORY
Definition ffi.h:127
@ BOTAN_FFI_ERROR_INTERNAL_ERROR
Definition ffi.h:129
@ BOTAN_FFI_INVALID_VERIFIER
Definition ffi.h:117
@ BOTAN_FFI_ERROR_INVALID_OBJECT
Definition ffi.h:139
@ BOTAN_FFI_ERROR_UNKNOWN_ERROR
Definition ffi.h:146
@ BOTAN_FFI_ERROR_HTTP_ERROR
Definition ffi.h:142
@ BOTAN_FFI_ERROR_BAD_FLAG
Definition ffi.h:131
@ BOTAN_FFI_ERROR_INVALID_INPUT
Definition ffi.h:119
@ BOTAN_FFI_ERROR_STRING_CONVERSION_ERROR
Definition ffi.h:124
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition ffi.h:132
@ BOTAN_FFI_ERROR_SYSTEM_ERROR
Definition ffi.h:128
@ BOTAN_FFI_ERROR_NO_VALUE
Definition ffi.h:121
@ BOTAN_FFI_ERROR_INVALID_OBJECT_STATE
Definition ffi.h:136
@ BOTAN_FFI_ERROR_BAD_MAC
Definition ffi.h:120
@ BOTAN_FFI_ERROR_BAD_PARAMETER
Definition ffi.h:133

References BOTAN_FFI_ERROR_BAD_FLAG, BOTAN_FFI_ERROR_BAD_MAC, BOTAN_FFI_ERROR_BAD_PARAMETER, BOTAN_FFI_ERROR_EXCEPTION_THROWN, BOTAN_FFI_ERROR_HTTP_ERROR, BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, BOTAN_FFI_ERROR_INTERNAL_ERROR, BOTAN_FFI_ERROR_INVALID_INPUT, BOTAN_FFI_ERROR_INVALID_KEY_LENGTH, BOTAN_FFI_ERROR_INVALID_OBJECT, BOTAN_FFI_ERROR_INVALID_OBJECT_STATE, BOTAN_FFI_ERROR_KEY_NOT_SET, BOTAN_FFI_ERROR_NO_VALUE, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_OUT_OF_MEMORY, BOTAN_FFI_ERROR_STRING_CONVERSION_ERROR, BOTAN_FFI_ERROR_SYSTEM_ERROR, BOTAN_FFI_ERROR_TLS_ERROR, BOTAN_FFI_ERROR_UNKNOWN_ERROR, BOTAN_FFI_INVALID_VERIFIER, and BOTAN_FFI_SUCCESS.

◆ botan_error_last_exception_message()

const char * botan_error_last_exception_message ( void )

Return the message of the last exception caught in this thread.

This pointer can/will be reallocated or overwritten the next time this thread calls any other Botan FFI function and must be copied to persistent storage first.

Definition at line 139 of file ffi.cpp.

139 {
140 return g_last_exception_what.c_str();
141}

◆ botan_ffi_api_version()

uint32_t botan_ffi_api_version ( void )

Return the version of the currently supported FFI API. This is expressed in the form YYYYMMDD of the release date of this version of the API.

Definition at line 217 of file ffi.cpp.

217 {
218 return BOTAN_HAS_FFI;
219}
#define BOTAN_HAS_FFI
Definition build.h:196

References BOTAN_HAS_FFI.

◆ botan_ffi_supports_api()

int botan_ffi_supports_api ( uint32_t api_version)

Return 0 (ok) if the version given is one this library supports. botan_ffi_supports_api(botan_ffi_api_version()) will always return 0.

Definition at line 221 of file ffi.cpp.

221 {
222 // This is the API introduced in 3.8
223 if(api_version == 20250506) {
224 return BOTAN_FFI_SUCCESS;
225 }
226
227 // This is the API introduced in 3.4
228 if(api_version == 20240408) {
229 return BOTAN_FFI_SUCCESS;
230 }
231
232 // This is the API introduced in 3.2
233 if(api_version == 20231009) {
234 return BOTAN_FFI_SUCCESS;
235 }
236
237 // This is the API introduced in 3.1
238 if(api_version == 20230711) {
239 return BOTAN_FFI_SUCCESS;
240 }
241
242 // This is the API introduced in 3.0
243 if(api_version == 20230403) {
244 return BOTAN_FFI_SUCCESS;
245 }
246
247 // This is the API introduced in 2.18
248 if(api_version == 20210220) {
249 return BOTAN_FFI_SUCCESS;
250 }
251
252 // This is the API introduced in 2.13
253 if(api_version == 20191214) {
254 return BOTAN_FFI_SUCCESS;
255 }
256
257 // This is the API introduced in 2.8
258 if(api_version == 20180713) {
259 return BOTAN_FFI_SUCCESS;
260 }
261
262 // This is the API introduced in 2.3
263 if(api_version == 20170815) {
264 return BOTAN_FFI_SUCCESS;
265 }
266
267 // This is the API introduced in 2.1
268 if(api_version == 20170327) {
269 return BOTAN_FFI_SUCCESS;
270 }
271
272 // This is the API introduced in 2.0
273 if(api_version == 20150515) {
274 return BOTAN_FFI_SUCCESS;
275 }
276
277 // Something else:
278 return -1;
279}

References BOTAN_FFI_SUCCESS.

◆ botan_hex_decode()

int botan_hex_decode ( const char * hex_str,
size_t in_len,
uint8_t * out,
size_t * out_len )

Perform hex decoding

Parameters
hex_stra string of hex chars (whitespace is ignored)
in_lenthe length of hex_str
outthe output buffer should be at least strlen(hex_str)/2 bytes
out_lenthe size of the output buffer on input, set to the number of bytes written
Returns
0 on success, a negative value on failure

Definition at line 324 of file ffi.cpp.

324 {
325 return ffi_guard_thunk(__func__, [=]() -> int {
326 const std::vector<uint8_t> bin = Botan::hex_decode(hex_str, in_len);
327 return Botan_FFI::write_vec_output(out, out_len, bin);
328 });
329}
int write_vec_output(uint8_t out[], size_t *out_len, std::span< const uint8_t > buf)
Definition ffi_util.h:247
size_t hex_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool ignore_ws)
Definition hex.cpp:73

References Botan_FFI::ffi_guard_thunk(), Botan::hex_decode(), and Botan_FFI::write_vec_output().

◆ botan_hex_encode()

int botan_hex_encode ( const uint8_t * x,
size_t len,
char * out,
uint32_t flags )

Perform hex encoding

Parameters
xis some binary data
lenlength of x in bytes
outan array of at least x*2 bytes
flagsflags out be upper or lower case?
Returns
0 on success, a negative value on failure

Definition at line 316 of file ffi.cpp.

316 {
317 return ffi_guard_thunk(__func__, [=]() -> int {
318 const bool uppercase = (flags & BOTAN_FFI_HEX_LOWER_CASE) == 0;
319 Botan::hex_encode(out, in, len, uppercase);
320 return BOTAN_FFI_SUCCESS;
321 });
322}
#define BOTAN_FFI_HEX_LOWER_CASE
Definition ffi.h:247
Flags flags(Flag flags)
Definition p11.h:848
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
Definition hex.cpp:35

References BOTAN_FFI_HEX_LOWER_CASE, BOTAN_FFI_SUCCESS, Botan_FFI::ffi_guard_thunk(), and Botan::hex_encode().

◆ botan_same_mem()

int botan_same_mem ( const uint8_t * x,
const uint8_t * y,
size_t len )

Deprecated equivalent to botan_constant_time_compare

Definition at line 307 of file ffi.cpp.

307 {
308 return botan_constant_time_compare(x, y, len);
309}
int botan_constant_time_compare(const uint8_t *x, const uint8_t *y, size_t len)
Definition ffi.cpp:301

References botan_constant_time_compare().

◆ botan_scrub_mem()

int botan_scrub_mem ( void * mem,
size_t bytes )

Clear out memory using a system specific approach to bypass elision by the compiler (currently using RtlSecureZeroMemory or tricks with volatile pointers).

Definition at line 311 of file ffi.cpp.

311 {
312 Botan::secure_scrub_memory(mem, bytes);
313 return BOTAN_FFI_SUCCESS;
314}
void secure_scrub_memory(void *ptr, size_t n)
Definition mem_utils.cpp:24

References BOTAN_FFI_SUCCESS, and Botan::secure_scrub_memory().

◆ botan_version_datestamp()

uint32_t botan_version_datestamp ( void )

Return the date this version was released as an integer.

Returns 0 if the library was not built from an official release

Definition at line 297 of file ffi.cpp.

297 {
299}
uint32_t version_datestamp()
Definition version.cpp:32

References Botan::version_datestamp().

◆ botan_version_major()

uint32_t botan_version_major ( void )

Return the major version of the library

Definition at line 285 of file ffi.cpp.

285 {
286 return Botan::version_major();
287}
uint32_t version_major()
Definition version.cpp:55

References Botan::version_major().

◆ botan_version_minor()

uint32_t botan_version_minor ( void )

Return the minor version of the library

Definition at line 289 of file ffi.cpp.

289 {
290 return Botan::version_minor();
291}
uint32_t version_minor()
Definition version.cpp:59

References Botan::version_minor().

◆ botan_version_patch()

uint32_t botan_version_patch ( void )

Return the patch version of the library

Definition at line 293 of file ffi.cpp.

293 {
294 return Botan::version_patch();
295}
uint32_t version_patch()
Definition version.cpp:63

References Botan::version_patch().

◆ botan_version_string()

const char * botan_version_string ( void )

Return a free-form version string, e.g., 2.0.0

Definition at line 281 of file ffi.cpp.

281 {
282 return Botan::version_cstr();
283}
const char * version_cstr()
Definition version.cpp:20

References Botan::version_cstr().