Botan  2.11.0
Crypto and TLS for C++11
Functions
ffi_cipher.cpp File Reference
#include <botan/ffi.h>
#include <botan/internal/ffi_util.h>
#include <botan/aead.h>

Go to the source code of this file.

Functions

int botan_cipher_clear (botan_cipher_t cipher)
 
int botan_cipher_destroy (botan_cipher_t cipher)
 
int botan_cipher_get_default_nonce_length (botan_cipher_t cipher, size_t *nl)
 
int botan_cipher_get_keyspec (botan_cipher_t cipher, size_t *out_minimum_keylength, size_t *out_maximum_keylength, size_t *out_keylength_modulo)
 
int botan_cipher_get_tag_length (botan_cipher_t cipher, size_t *tl)
 
int botan_cipher_get_update_granularity (botan_cipher_t cipher, size_t *ug)
 
int botan_cipher_init (botan_cipher_t *cipher, const char *cipher_name, uint32_t flags)
 
int botan_cipher_name (botan_cipher_t cipher, char *name, size_t *name_len)
 
int botan_cipher_output_length (botan_cipher_t cipher, size_t in_len, size_t *out_len)
 
int botan_cipher_query_keylen (botan_cipher_t cipher, size_t *out_minimum_keylength, size_t *out_maximum_keylength)
 
int botan_cipher_reset (botan_cipher_t cipher)
 
int botan_cipher_set_associated_data (botan_cipher_t cipher, const uint8_t *ad, size_t ad_len)
 
int botan_cipher_set_key (botan_cipher_t cipher, const uint8_t *key, size_t key_len)
 
int botan_cipher_start (botan_cipher_t cipher_obj, const uint8_t *nonce, size_t nonce_len)
 
int botan_cipher_update (botan_cipher_t cipher_obj, uint32_t flags, uint8_t output_ptr[], size_t orig_output_size, size_t *output_written, const uint8_t input_ptr[], size_t orig_input_size, size_t *input_consumed)
 
int botan_cipher_valid_nonce_length (botan_cipher_t cipher, size_t nl)
 

Function Documentation

◆ botan_cipher_clear()

int botan_cipher_clear ( botan_cipher_t  hash)

Reset the key, nonce, AD and all other state on this cipher object

Definition at line 39 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, and Botan::SymmetricAlgorithm::clear().

40  {
41  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { c.clear(); });
42  }
virtual void clear()=0
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_destroy()

int botan_cipher_destroy ( botan_cipher_t  cipher)

Destroy the cipher object

Returns
0 if success, error if invalid object handle

Definition at line 34 of file ffi_cipher.cpp.

References BOTAN_FFI_CHECKED_DELETE.

35  {
36  return BOTAN_FFI_CHECKED_DELETE(cipher);
37  }
#define BOTAN_FFI_CHECKED_DELETE(o)
Definition: ffi_util.h:120

◆ botan_cipher_get_default_nonce_length()

int botan_cipher_get_default_nonce_length ( botan_cipher_t  cipher,
size_t *  nl 
)

Get the default nonce length of this cipher

Definition at line 210 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, and Botan::Cipher_Mode::default_nonce_length().

211  {
212  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { *nl = c.default_nonce_length(); });
213  }
virtual size_t default_nonce_length() const =0
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_get_keyspec()

int botan_cipher_get_keyspec ( botan_cipher_t  ,
size_t *  min_keylen,
size_t *  max_keylen,
size_t *  mod_keylen 
)

Get information about the supported key lengths.

Definition at line 67 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, Botan::SymmetricAlgorithm::key_spec(), and Botan::Key_Length_Specification::minimum_keylength().

71  {
72  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, {
73  if(out_minimum_keylength)
74  *out_minimum_keylength = c.key_spec().minimum_keylength();
75  if(out_maximum_keylength)
76  *out_maximum_keylength = c.key_spec().maximum_keylength();
77  if(out_keylength_modulo)
78  *out_keylength_modulo = c.key_spec().keylength_multiple();
79  });
80  }
virtual Key_Length_Specification key_spec() const =0
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92
size_t minimum_keylength() const
Definition: key_spec.h:61

◆ botan_cipher_get_tag_length()

int botan_cipher_get_tag_length ( botan_cipher_t  cipher,
size_t *  tag_size 
)

Get the tag length of the cipher (0 for non-AEAD modes)

Definition at line 220 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, and Botan::Cipher_Mode::tag_size().

221  {
222  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { *tl = c.tag_size(); });
223  }
virtual size_t tag_size() const
Definition: cipher_mode.h:174
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_get_update_granularity()

int botan_cipher_get_update_granularity ( botan_cipher_t  cipher,
size_t *  ug 
)

Return the update granularity of the cipher; botan_cipher_update must be called with blocks of this size, except for the final.

Definition at line 215 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, and Botan::Cipher_Mode::update_granularity().

216  {
217  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { *ug = c.update_granularity(); });
218  }
virtual size_t update_granularity() const =0
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_init()

int botan_cipher_init ( botan_cipher_t cipher,
const char *  name,
uint32_t  flags 
)

Initialize a cipher object

Definition at line 21 of file ffi_cipher.cpp.

References BOTAN_CIPHER_INIT_FLAG_ENCRYPT, BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION, BOTAN_FFI_ERROR_NOT_IMPLEMENTED, BOTAN_FFI_SUCCESS, Botan::Cipher_Mode::create(), Botan::DECRYPTION, Botan::ENCRYPTION, Botan_FFI::ffi_guard_thunk(), and Botan::PKCS11::flags().

22  {
23  return ffi_guard_thunk(__func__, [=]() -> int {
25  const Botan::Cipher_Dir dir = encrypt_p ? Botan::ENCRYPTION : Botan::DECRYPTION;
26  std::unique_ptr<Botan::Cipher_Mode> mode(Botan::Cipher_Mode::create(cipher_name, dir));
27  if(!mode)
29  *cipher = new botan_cipher_struct(mode.release());
30  return BOTAN_FFI_SUCCESS;
31  });
32  }
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:86
#define BOTAN_CIPHER_INIT_FLAG_ENCRYPT
Definition: ffi.h:424
#define BOTAN_CIPHER_INIT_FLAG_MASK_DIRECTION
Definition: ffi.h:423
Flags flags(Flag flags)
Definition: p11.h:858
static std::unique_ptr< Cipher_Mode > create(const std::string &algo, Cipher_Dir direction, const std::string &provider="")
Definition: cipher_mode.cpp:54
Cipher_Dir
Definition: cipher_mode.h:23

◆ botan_cipher_name()

int botan_cipher_name ( botan_cipher_t  cipher,
char *  name,
size_t *  name_len 
)

Return the name of the cipher object

Definition at line 225 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, name, and Botan_FFI::write_str_output().

226  {
227  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, {
228  return write_str_output(name, name_len, c.name()); });
229  }
int write_str_output(uint8_t out[], size_t *out_len, const std::string &str)
Definition: ffi_util.h:151
std::string name
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_output_length()

int botan_cipher_output_length ( botan_cipher_t  cipher,
size_t  in_len,
size_t *  out_len 
)

Return the output length of this cipher, for a particular input length.

Definition at line 49 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, BOTAN_FFI_ERROR_NULL_POINTER, and Botan::Cipher_Mode::output_length().

50  {
51  if(out_len == nullptr)
53 
54  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { *out_len = c.output_length(in_len); });
55  }
virtual size_t output_length(size_t input_length) const =0
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_query_keylen()

int botan_cipher_query_keylen ( botan_cipher_t  ,
size_t *  out_minimum_keylength,
size_t *  out_maximum_keylength 
)

Get information about the key lengths. Prefer botan_cipher_get_keyspec

Definition at line 57 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, Botan::SymmetricAlgorithm::key_spec(), and Botan::Key_Length_Specification::minimum_keylength().

60  {
61  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, {
62  *out_minimum_keylength = c.key_spec().minimum_keylength();
63  *out_maximum_keylength = c.key_spec().maximum_keylength();
64  });
65  }
virtual Key_Length_Specification key_spec() const =0
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92
size_t minimum_keylength() const
Definition: key_spec.h:61

◆ botan_cipher_reset()

int botan_cipher_reset ( botan_cipher_t  cipher)

Reset the message specific state for this cipher. Without resetting the keys, this resets the nonce, and any state associated with any message bits that have been processed so far.

It is conceptually equivalent to calling botan_cipher_clear followed by botan_cipher_set_key with the original key.

Definition at line 44 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, and Botan::Cipher_Mode::reset().

45  {
46  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { c.reset(); });
47  }
virtual void reset()=0
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_set_associated_data()

int botan_cipher_set_associated_data ( botan_cipher_t  cipher,
const uint8_t *  ad,
size_t  ad_len 
)

Set the associated data. Will fail if cipher is not an AEAD

Definition at line 191 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, BOTAN_FFI_ERROR_BAD_PARAMETER, and BOTAN_FFI_SUCCESS.

194  {
195  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, {
196  if(Botan::AEAD_Mode* aead = dynamic_cast<Botan::AEAD_Mode*>(&c))
197  {
198  aead->set_associated_data(ad, ad_len);
199  return BOTAN_FFI_SUCCESS;
200  }
202  });
203  }
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_set_key()

int botan_cipher_set_key ( botan_cipher_t  cipher,
const uint8_t *  key,
size_t  key_len 
)

Set the key for this cipher object

Definition at line 82 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, and Botan::SymmetricAlgorithm::set_key().

84  {
85  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { c.set_key(key, key_len); });
86  }
void set_key(const SymmetricKey &key)
Definition: sym_algo.h:65
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92

◆ botan_cipher_start()

int botan_cipher_start ( botan_cipher_t  cipher,
const uint8_t *  nonce,
size_t  nonce_len 
)

Begin processing a new message using the provided nonce

Definition at line 88 of file ffi_cipher.cpp.

References BOTAN_FFI_SUCCESS, Botan_FFI::ffi_guard_thunk(), Botan_FFI::safe_get(), Botan::Cipher_Mode::start(), and Botan::Cipher_Mode::update_granularity().

90  {
91  return ffi_guard_thunk(__func__, [=]() -> int {
92  Botan::Cipher_Mode& cipher = safe_get(cipher_obj);
93  cipher.start(nonce, nonce_len);
94  cipher_obj->m_buf.reserve(cipher.update_granularity());
95  return BOTAN_FFI_SUCCESS;
96  });
97  }
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:86
virtual size_t update_granularity() const =0
void start(const std::vector< uint8_t, Alloc > &nonce)
Definition: cipher_mode.h:69
T & safe_get(botan_struct< T, M > *p)
Definition: ffi_util.h:61

◆ botan_cipher_update()

int botan_cipher_update ( botan_cipher_t  cipher,
uint32_t  flags,
uint8_t  output[],
size_t  output_size,
size_t *  output_written,
const uint8_t  input_bytes[],
size_t  input_size,
size_t *  input_consumed 
)

Encrypt some data

Definition at line 99 of file ffi_cipher.cpp.

References BOTAN_ASSERT, BOTAN_CIPHER_UPDATE_FLAG_FINAL, BOTAN_FFI_ERROR_BAD_MAC, BOTAN_FFI_SUCCESS, Botan::copy_mem(), Botan_FFI::ffi_guard_thunk(), Botan::Cipher_Mode::finish(), Botan::PKCS11::flags(), Botan::Cipher_Mode::minimum_final_size(), Botan_FFI::safe_get(), Botan::Cipher_Mode::update(), and Botan::Cipher_Mode::update_granularity().

107  {
108  return ffi_guard_thunk(__func__, [=]() -> int {
109 
110  size_t input_size = orig_input_size;
111  size_t output_size = orig_output_size;
112  const uint8_t* input = input_ptr;
113  uint8_t* output = output_ptr;
114 
115  using namespace Botan;
116  Cipher_Mode& cipher = safe_get(cipher_obj);
117  secure_vector<uint8_t>& mbuf = cipher_obj->m_buf;
118 
119  const bool final_input = (flags & BOTAN_CIPHER_UPDATE_FLAG_FINAL);
120 
121  if(final_input)
122  {
123  mbuf.assign(input, input + input_size);
124  *input_consumed = input_size;
125  *output_written = 0;
126 
127  try
128  {
129  cipher.finish(mbuf);
130  }
132  {
134  }
135 
136  *output_written = mbuf.size();
137 
138  if(mbuf.size() <= output_size)
139  {
140  copy_mem(output, mbuf.data(), mbuf.size());
141  mbuf.clear();
142  return BOTAN_FFI_SUCCESS;
143  }
144 
145  return -1;
146  }
147 
148  if(input_size == 0)
149  {
150  // Currently must take entire buffer in this case
151  *output_written = mbuf.size();
152  if(output_size >= mbuf.size())
153  {
154  copy_mem(output, mbuf.data(), mbuf.size());
155  mbuf.clear();
156  return BOTAN_FFI_SUCCESS;
157  }
158 
159  return -1;
160  }
161 
162  const size_t ud = cipher.update_granularity();
163  BOTAN_ASSERT(cipher.update_granularity() > cipher.minimum_final_size(), "logic error");
164 
165  mbuf.resize(ud);
166  size_t taken = 0, written = 0;
167 
168  while(input_size >= ud && output_size >= ud)
169  {
170  // FIXME we can use process here and avoid the copy
171  copy_mem(mbuf.data(), input, ud);
172  cipher.update(mbuf);
173 
174  input_size -= ud;
175  copy_mem(output, mbuf.data(), ud);
176  input += ud;
177  taken += ud;
178 
179  output_size -= ud;
180  output += ud;
181  written += ud;
182  }
183 
184  *output_written = written;
185  *input_consumed = taken;
186 
187  return BOTAN_FFI_SUCCESS;
188  });
189  }
int ffi_guard_thunk(const char *func_name, std::function< int()> thunk)
Definition: ffi.cpp:86
void update(secure_vector< uint8_t > &buffer, size_t offset=0)
Definition: cipher_mode.h:112
virtual size_t update_granularity() const =0
Flags flags(Flag flags)
Definition: p11.h:858
virtual size_t minimum_final_size() const =0
#define BOTAN_ASSERT(expr, assertion_made)
Definition: assert.h:55
#define BOTAN_CIPHER_UPDATE_FLAG_FINAL
Definition: ffi.h:506
void copy_mem(T *out, const T *in, size_t n)
Definition: mem_ops.h:122
Definition: alg_id.cpp:13
T & safe_get(botan_struct< T, M > *p)
Definition: ffi_util.h:61
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:65
virtual void finish(secure_vector< uint8_t > &final_block, size_t offset=0)=0

◆ botan_cipher_valid_nonce_length()

int botan_cipher_valid_nonce_length ( botan_cipher_t  cipher,
size_t  nl 
)

Return if the specified nonce length is valid for this cipher

Definition at line 205 of file ffi_cipher.cpp.

References BOTAN_FFI_DO, and Botan::Cipher_Mode::valid_nonce_length().

206  {
207  return BOTAN_FFI_DO(Botan::Cipher_Mode, cipher, c, { return c.valid_nonce_length(nl) ? 1 : 0; });
208  }
#define BOTAN_FFI_DO(T, obj, param, block)
Definition: ffi_util.h:92
virtual bool valid_nonce_length(size_t nonce_len) const =0