Botan 2.19.5 Crypto and TLS for C&

Namespaces | Functions
ffi.cpp File Reference
`#include <botan/ffi.h>`
`#include <botan/internal/ffi_util.h>`
`#include <botan/internal/os_utils.h>`
`#include <botan/version.h>`
`#include <botan/mem_ops.h>`
`#include <botan/hex.h>`
`#include <botan/base64.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)
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::ffi_error_exception_thrown (const char *func_name, const char *exn, int rc)
int | Botan_FFI::ffi_guard_thunk (const char *func_name, std::function< int()> thunk)

## 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 282 of file ffi.cpp.

284 {
285 return ffi_guard_thunk(__func__, [=]() -> int {
286 if(*out_len < Botan::base64_decode_max_output(in_len))
287 {
288 *out_len = Botan::base64_decode_max_output(in_len);
289 return BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE;
290 }
291
292 *out_len = Botan::base64_decode(out, std::string(base64_str, in_len));
293 return BOTAN_FFI_SUCCESS;
294 });
295 }
BOTAN_FFI_SUCCESS
@ BOTAN_FFI_SUCCESS
Definition: ffi.h:63
BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE
@ BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE
Definition: ffi.h:69
Botan_FFI::ffi_guard_thunk
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:89
Botan::base64_decode
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:200
Botan::base64_decode_max_output
size_t base64_decode_max_output(size_t input_length)
Definition: base64.cpp:243

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

Definition at line 274 of file ffi.cpp.

275 {
276 return ffi_guard_thunk(__func__, [=]() -> int {
277 const std::string base64 = Botan::base64_encode(in, len);
278 return Botan_FFI::write_str_output(out, out_len, base64);
279 });
280 }
Botan_FFI::write_str_output
int write_str_output(uint8_t out[], size_t *out_len, const std::string &str)
Definition: ffi_util.h:160
Botan::base64_encode
size_t base64_encode(char out[], const uint8_t in[], size_t input_length, size_t &input_consumed, bool final_inputs)
Definition: base64.cpp:185

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 241 of file ffi.cpp.

242 {
243 return Botan::constant_time_compare(x, y, len) ? 0 : -1;
244 }
Botan::constant_time_compare
bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len)
Definition: mem_ops.h:82

References Botan::constant_time_compare().

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 125 of file ffi.cpp.

126 {
127 switch(err)
128 {
129 case BOTAN_FFI_SUCCESS:
130 return "OK";
131
132 case BOTAN_FFI_INVALID_VERIFIER:
133 return "Invalid verifier";
134
135 case BOTAN_FFI_ERROR_INVALID_INPUT:
136 return "Invalid input";
137
138 case BOTAN_FFI_ERROR_BAD_MAC:
139 return "Invalid authentication code";
140
141 case BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE:
142 return "Insufficient buffer space";
143
144 case BOTAN_FFI_ERROR_EXCEPTION_THROWN:
145 return "Exception thrown";
146
147 case BOTAN_FFI_ERROR_OUT_OF_MEMORY:
148 return "Out of memory";
149
150 case BOTAN_FFI_ERROR_SYSTEM_ERROR:
151 return "Error while calling system API";
152
153 case BOTAN_FFI_ERROR_INTERNAL_ERROR:
154 return "Internal error";
155
156 case BOTAN_FFI_ERROR_BAD_FLAG:
157 return "Bad flag";
158
159 case BOTAN_FFI_ERROR_NULL_POINTER:
160 return "Null pointer argument";
161
162 case BOTAN_FFI_ERROR_BAD_PARAMETER:
163 return "Bad parameter";
164
165 case BOTAN_FFI_ERROR_KEY_NOT_SET:
166 return "Key not set on object";
167
168 case BOTAN_FFI_ERROR_INVALID_KEY_LENGTH:
169 return "Invalid key length";
170
171 case BOTAN_FFI_ERROR_INVALID_OBJECT_STATE:
172 return "Invalid object state";
173
174 case BOTAN_FFI_ERROR_NOT_IMPLEMENTED:
175 return "Not implemented";
176
177 case BOTAN_FFI_ERROR_INVALID_OBJECT:
178 return "Invalid object handle";
179
180 case BOTAN_FFI_ERROR_TLS_ERROR:
181 return "TLS error";
182
183 case BOTAN_FFI_ERROR_HTTP_ERROR:
184 return "HTTP error";
185
186 case BOTAN_FFI_ERROR_UNKNOWN_ERROR:
187 return "Unknown error";
188 }
189
190 return "Unknown error";
191 }
BOTAN_FFI_ERROR_NOT_IMPLEMENTED
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
Definition: ffi.h:83
BOTAN_FFI_ERROR_INVALID_KEY_LENGTH
@ BOTAN_FFI_ERROR_INVALID_KEY_LENGTH
Definition: ffi.h:80
BOTAN_FFI_ERROR_KEY_NOT_SET
@ BOTAN_FFI_ERROR_KEY_NOT_SET
Definition: ffi.h:79
BOTAN_FFI_ERROR_TLS_ERROR
@ BOTAN_FFI_ERROR_TLS_ERROR
Definition: ffi.h:86
BOTAN_FFI_ERROR_EXCEPTION_THROWN
@ BOTAN_FFI_ERROR_EXCEPTION_THROWN
Definition: ffi.h:71
BOTAN_FFI_ERROR_OUT_OF_MEMORY
@ BOTAN_FFI_ERROR_OUT_OF_MEMORY
Definition: ffi.h:72
BOTAN_FFI_ERROR_INTERNAL_ERROR
@ BOTAN_FFI_ERROR_INTERNAL_ERROR
Definition: ffi.h:74
BOTAN_FFI_INVALID_VERIFIER
@ BOTAN_FFI_INVALID_VERIFIER
Definition: ffi.h:64
BOTAN_FFI_ERROR_INVALID_OBJECT
@ BOTAN_FFI_ERROR_INVALID_OBJECT
Definition: ffi.h:84
BOTAN_FFI_ERROR_UNKNOWN_ERROR
@ BOTAN_FFI_ERROR_UNKNOWN_ERROR
Definition: ffi.h:90
BOTAN_FFI_ERROR_HTTP_ERROR
@ BOTAN_FFI_ERROR_HTTP_ERROR
Definition: ffi.h:87
BOTAN_FFI_ERROR_BAD_FLAG
@ BOTAN_FFI_ERROR_BAD_FLAG
Definition: ffi.h:76
BOTAN_FFI_ERROR_INVALID_INPUT
@ BOTAN_FFI_ERROR_INVALID_INPUT
Definition: ffi.h:66
BOTAN_FFI_ERROR_NULL_POINTER
@ BOTAN_FFI_ERROR_NULL_POINTER
Definition: ffi.h:77
BOTAN_FFI_ERROR_SYSTEM_ERROR
@ BOTAN_FFI_ERROR_SYSTEM_ERROR
Definition: ffi.h:73
BOTAN_FFI_ERROR_INVALID_OBJECT_STATE
@ BOTAN_FFI_ERROR_INVALID_OBJECT_STATE
Definition: ffi.h:81
BOTAN_FFI_ERROR_BAD_MAC
@ BOTAN_FFI_ERROR_BAD_MAC
Definition: ffi.h:67
BOTAN_FFI_ERROR_BAD_PARAMETER
@ BOTAN_FFI_ERROR_BAD_PARAMETER
Definition: ffi.h:78

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_NOT_IMPLEMENTED, BOTAN_FFI_ERROR_NULL_POINTER, BOTAN_FFI_ERROR_OUT_OF_MEMORY, BOTAN_FFI_ERROR_SYSTEM_ERROR, BOTAN_FFI_ERROR_TLS_ERROR, BOTAN_FFI_ERROR_UNKNOWN_ERROR, BOTAN_FFI_INVALID_VERIFIER, and BOTAN_FFI_SUCCESS.

## ◆ 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 196 of file ffi.cpp.

197 {
198 return BOTAN_HAS_FFI;
199 }

## ◆ 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 201 of file ffi.cpp.

202 {
203 // This is the API introduced in 2.18
204 if(api_version == 20210220)
205 return BOTAN_FFI_SUCCESS;
206
207 // This is the API introduced in 2.13
208 if(api_version == 20191214)
209 return BOTAN_FFI_SUCCESS;
210
211 // This is the API introduced in 2.8
212 if(api_version == 20180713)
213 return BOTAN_FFI_SUCCESS;
214
215 // This is the API introduced in 2.3
216 if(api_version == 20170815)
217 return BOTAN_FFI_SUCCESS;
218
219 // This is the API introduced in 2.1
220 if(api_version == 20170327)
221 return BOTAN_FFI_SUCCESS;
222
223 // This is the API introduced in 2.0
224 if(api_version == 20150515)
225 return BOTAN_FFI_SUCCESS;
226
227 // Something else:
228 return -1;
229 }

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_str | a string of hex chars (whitespace is ignored)
  in_len | the length of hex_str
  out | the output buffer should be at least strlen(hex_str)/2 bytes
  out_len | the size of out

Definition at line 266 of file ffi.cpp.

267 {
268 return ffi_guard_thunk(__func__, [=]() -> int {
269 const std::vector<uint8_t> bin = Botan::hex_decode(hex_str, in_len);
270 return Botan_FFI::write_vec_output(out, out_len, bin);
271 });
272 }
Botan_FFI::write_vec_output
int write_vec_output(uint8_t out[], size_t *out_len, const std::vector< uint8_t, Alloc > &buf)
Definition: ffi_util.h:155
Botan::hex_decode
size_t hex_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool ignore_ws)
Definition: hex.cpp:89

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

  x | is some binary data
  len | length of x in bytes
  out | an array of at least x*2 bytes
  flags | flags out be upper or lower case?

Returns
  0 on success, 1 on failure

Definition at line 257 of file ffi.cpp.

258 {
259 return ffi_guard_thunk(__func__, [=]() -> int {
260 const bool uppercase = (flags & BOTAN_FFI_HEX_LOWER_CASE) == 0;
261 Botan::hex_encode(out, in, len, uppercase);
262 return BOTAN_FFI_SUCCESS;
263 });
264 }
BOTAN_FFI_HEX_LOWER_CASE
#define BOTAN_FFI_HEX_LOWER_CASE
Definition: ffi.h:154
Botan::PKCS11::flags
Flags flags(Flag flags)
Definition: p11.h:860
Botan::hex_encode
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
Definition: hex.cpp:31

References BOTAN_FFI_HEX_LOWER_CASE, BOTAN_FFI_SUCCESS, Botan_FFI::ffi_guard_thunk(), Botan::PKCS11::flags(), 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 246 of file ffi.cpp.

247 {
248 return botan_constant_time_compare(x, y, len);
249 }
botan_constant_time_compare
int botan_constant_time_compare(const uint8_t *x, const uint8_t *y, size_t len)
Definition: ffi.cpp:241

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 251 of file ffi.cpp.

252 {
253 Botan::secure_scrub_memory(mem, bytes);
254 return BOTAN_FFI_SUCCESS;
255 }
Botan::secure_scrub_memory
void secure_scrub_memory(void *ptr, size_t n)
Definition: os_utils.cpp:66

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, or 0 if an unreleased version

Definition at line 239 of file ffi.cpp.

239{ return Botan::version_datestamp(); }
Botan::version_datestamp
uint32_t version_datestamp()
Definition: version.cpp:75

References Botan::version_datestamp().

## ◆ botan_version_major()

uint32_t botan_version_major | ( | void |  | ) |

Return the major version of the library

Definition at line 236 of file ffi.cpp.

236{ return Botan::version_major(); }
Botan::version_major
uint32_t version_major()
Definition: version.cpp:80

References Botan::version_major().

## ◆ botan_version_minor()

uint32_t botan_version_minor | ( | void |  | ) |

Return the minor version of the library

Definition at line 237 of file ffi.cpp.

237{ return Botan::version_minor(); }
Botan::version_minor
uint32_t version_minor()
Definition: version.cpp:81

References Botan::version_minor().

## ◆ botan_version_patch()

uint32_t botan_version_patch | ( | void |  | ) |

Return the patch version of the library

Definition at line 238 of file ffi.cpp.

238{ return Botan::version_patch(); }
Botan::version_patch
uint32_t version_patch()
Definition: version.cpp:82

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 231 of file ffi.cpp.

232 {
233 return Botan::version_cstr();
234 }
Botan::version_cstr
const char * version_cstr()
Definition: version.cpp:33

References Botan::version_cstr().