Botan  2.15.0
Crypto and TLS for C++11
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

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

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

280  {
281  return ffi_guard_thunk(__func__, [=]() -> int {
282  if(*out_len < Botan::base64_decode_max_output(in_len))
283  {
284  *out_len = Botan::base64_decode_max_output(in_len);
286  }
287 
288  *out_len = Botan::base64_decode(out, std::string(base64_str, in_len));
289  return BOTAN_FFI_SUCCESS;
290  });
291  }
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:89
size_t base64_decode_max_output(size_t input_length)
Definition: base64.cpp:224
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:181

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

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

271  {
272  return ffi_guard_thunk(__func__, [=]() -> int {
273  const std::string base64 = Botan::base64_encode(in, len);
274  return Botan_FFI::write_str_output(out, out_len, base64);
275  });
276  }
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:89
int write_str_output(uint8_t out[], size_t *out_len, const std::string &str)
Definition: ffi_util.h:160
size_t base64_encode(char out[], const uint8_t in[], size_t input_length, size_t &input_consumed, bool final_inputs)
Definition: base64.cpp:166

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

References Botan::constant_time_compare().

Referenced by botan_same_mem().

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

◆ 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.

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.

126  {
127  switch(err)
128  {
129  case BOTAN_FFI_SUCCESS:
130  return "OK";
131 
133  return "Invalid verifier";
134 
136  return "Invalid input";
137 
139  return "Invalid authentication code";
140 
142  return "Insufficient buffer space";
143 
145  return "Exception thrown";
146 
148  return "Out of memory";
149 
151  return "Error while calling system API";
152 
154  return "Internal error";
155 
157  return "Bad flag";
158 
160  return "Null pointer argument";
161 
163  return "Bad parameter";
164 
166  return "Key not set on object";
167 
169  return "Invalid key length";
170 
172  return "Invalid object state";
173 
175  return "Not implemented";
176 
178  return "Invalid object handle";
179 
181  return "TLS error";
182 
184  return "HTTP error";
185 
187  return "Unknown error";
188  }
189 
190  return "Unknown error";
191  }

◆ 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.

References BOTAN_FFI_SUCCESS.

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

◆ 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 out

Definition at line 262 of file ffi.cpp.

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

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

◆ 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, 1 on failure

Definition at line 253 of file ffi.cpp.

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

254  {
255  return ffi_guard_thunk(__func__, [=]() -> int {
256  const bool uppercase = (flags & BOTAN_FFI_HEX_LOWER_CASE) == 0;
257  Botan::hex_encode(out, in, len, uppercase);
258  return BOTAN_FFI_SUCCESS;
259  });
260  }
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:89
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
Definition: hex.cpp:14
Flags flags(Flag flags)
Definition: p11.h:858
#define BOTAN_FFI_HEX_LOWER_CASE
Definition: ffi.h:153

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

References botan_constant_time_compare().

243  {
244  return botan_constant_time_compare(x, y, len);
245  }
int botan_constant_time_compare(const uint8_t *x, const uint8_t *y, size_t len)
Definition: ffi.cpp:237

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

References BOTAN_FFI_SUCCESS, and Botan::secure_scrub_memory().

248  {
249  Botan::secure_scrub_memory(mem, bytes);
250  return BOTAN_FFI_SUCCESS;
251  }
void secure_scrub_memory(void *ptr, size_t n)
Definition: os_utils.cpp:66

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

References Botan::version_datestamp().

235 { return Botan::version_datestamp(); }
uint32_t version_datestamp()
Definition: version.cpp:67

◆ botan_version_major()

uint32_t botan_version_major ( void  )

Return the major version of the library

Definition at line 232 of file ffi.cpp.

References Botan::version_major().

232 { return Botan::version_major(); }
uint32_t version_major()
Definition: version.cpp:72

◆ botan_version_minor()

uint32_t botan_version_minor ( void  )

Return the minor version of the library

Definition at line 233 of file ffi.cpp.

References Botan::version_minor().

233 { return Botan::version_minor(); }
uint32_t version_minor()
Definition: version.cpp:73

◆ botan_version_patch()

uint32_t botan_version_patch ( void  )

Return the patch version of the library

Definition at line 234 of file ffi.cpp.

References Botan::version_patch().

234 { return Botan::version_patch(); }
uint32_t version_patch()
Definition: version.cpp:74

◆ botan_version_string()

const char* botan_version_string ( void  )

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

Definition at line 227 of file ffi.cpp.

References Botan::version_cstr().

228  {
229  return Botan::version_cstr();
230  }
const char * version_cstr()
Definition: version.cpp:29