Botan  2.4.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/version.h>
#include <botan/mem_ops.h>
#include <botan/hex.h>
#include <botan/base64.h>
#include <cstdio>

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

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

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

109  {
110  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
111  if(*out_len < Botan::base64_decode_max_output(in_len))
112  {
113  *out_len = Botan::base64_decode_max_output(in_len);
115  }
116 
117  *out_len = Botan::base64_decode(out, std::string(base64_str, in_len));
118  return BOTAN_FFI_SUCCESS;
119  });
120  }
#define BOTAN_FFI_SUCCESS
Definition: ffi.h:137
size_t base64_decode_max_output(size_t input_length)
Definition: base64.cpp:256
int ffi_guard_thunk(const char *func_name, Thunk thunk)
Definition: ffi_util.h:64
size_t base64_decode(uint8_t output[], const char input[], size_t input_length, size_t &input_consumed, bool final_inputs, bool ignore_ws)
Definition: base64.cpp:100
#define BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE
Definition: ffi.h:144
#define BOTAN_CURRENT_FUNCTION
Definition: compiler.h:143

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

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

100  {
101  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
102  const std::string base64 = Botan::base64_encode(in, len);
103  return Botan_FFI::write_str_output(out, out_len, base64);
104  });
105  }
int ffi_guard_thunk(const char *func_name, Thunk thunk)
Definition: ffi_util.h:64
int write_str_output(uint8_t out[], size_t *out_len, const std::string &str)
Definition: ffi_util.h:151
size_t base64_encode(char out[], const uint8_t in[], size_t input_length, size_t &input_consumed, bool final_inputs)
Definition: base64.cpp:35
#define BOTAN_CURRENT_FUNCTION
Definition: compiler.h:143

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

References Botan::constant_time_compare().

Referenced by botan_same_mem().

67  {
68  return Botan::constant_time_compare(x, y, len) ? 0 : -1;
69  }
bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len)
Definition: mem_ops.cpp:44

◆ botan_ffi_api_version()

uint32_t botan_ffi_api_version ( )

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

33  {
34  return BOTAN_HAS_FFI;
35  }

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

References BOTAN_FFI_SUCCESS.

38  {
39  // Current API version
40  if(api_version == BOTAN_HAS_FFI)
41  return BOTAN_FFI_SUCCESS;
42 
43  // Older versions that are still supported
44 
45  // This is the 2.1/2.2 API
46  if(api_version == 20170327)
47  return BOTAN_FFI_SUCCESS;
48 
49  // This is the 2.0 API
50  if(api_version == 20150515)
51  return BOTAN_FFI_SUCCESS;
52 
53  return -1;
54  }
#define BOTAN_FFI_SUCCESS
Definition: ffi.h:137

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

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

92  {
93  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
94  const std::vector<uint8_t> bin = Botan::hex_decode(hex_str, in_len);
95  return Botan_FFI::write_vec_output(out, out_len, bin);
96  });
97  }
int ffi_guard_thunk(const char *func_name, Thunk thunk)
Definition: ffi_util.h:64
int write_vec_output(uint8_t out[], size_t *out_len, const std::vector< uint8_t, Alloc > &buf)
Definition: ffi_util.h:146
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
#define BOTAN_CURRENT_FUNCTION
Definition: compiler.h:143

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

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

83  {
84  return ffi_guard_thunk(BOTAN_CURRENT_FUNCTION, [=]() -> int {
85  const bool uppercase = (flags & BOTAN_FFI_HEX_LOWER_CASE) == 0;
86  Botan::hex_encode(out, in, len, uppercase);
87  return BOTAN_FFI_SUCCESS;
88  });
89  }
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)
Definition: hex.cpp:14
#define BOTAN_FFI_SUCCESS
Definition: ffi.h:137
int ffi_guard_thunk(const char *func_name, Thunk thunk)
Definition: ffi_util.h:64
Flags flags(Flag flags)
Definition: p11.h:858
#define BOTAN_FFI_HEX_LOWER_CASE
Definition: ffi.h:172
#define BOTAN_CURRENT_FUNCTION
Definition: compiler.h:143

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

References botan_constant_time_compare().

72  {
73  return botan_constant_time_compare(x, y, len);
74  }
int botan_constant_time_compare(const uint8_t *x, const uint8_t *y, size_t len)
Definition: ffi.cpp:66

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

References BOTAN_FFI_SUCCESS, and Botan::secure_scrub_memory().

77  {
78  Botan::secure_scrub_memory(mem, bytes);
79  return BOTAN_FFI_SUCCESS;
80  }
#define BOTAN_FFI_SUCCESS
Definition: ffi.h:137
void secure_scrub_memory(void *ptr, size_t n)
Definition: os_utils.cpp:37

◆ botan_version_datestamp()

uint32_t botan_version_datestamp ( )

Return the date this version was released as an integer, or 0 if an unreleased version

Definition at line 64 of file ffi.cpp.

References Botan::version_datestamp().

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

◆ botan_version_major()

uint32_t botan_version_major ( )

Return the major version of the library

Definition at line 61 of file ffi.cpp.

References Botan::version_major().

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

◆ botan_version_minor()

uint32_t botan_version_minor ( )

Return the minor version of the library

Definition at line 62 of file ffi.cpp.

References Botan::version_minor().

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

◆ botan_version_patch()

uint32_t botan_version_patch ( )

Return the patch version of the library

Definition at line 63 of file ffi.cpp.

References Botan::version_patch().

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

◆ botan_version_string()

const char* botan_version_string ( )

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

Definition at line 56 of file ffi.cpp.

References Botan::version_cstr().

57  {
58  return Botan::version_cstr();
59  }
const char * version_cstr()
Definition: version.cpp:29