aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2018-07-24 15:35:43 -0400
committerJack Lloyd <[email protected]>2018-07-24 15:35:43 -0400
commit5d89df3fd37f93f07e04111712f2a21d9f418b74 (patch)
tree61a9866d3c9123925f71226300f51b7a70e489d4 /src/lib
parent552719cee2f90293a01454221997cf781c45df4b (diff)
Add botan_block_cipher_query_keylen plus some new FFI error codes
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ffi/ffi.cpp12
-rw-r--r--src/lib/ffi/ffi.h14
-rw-r--r--src/lib/ffi/ffi_block.cpp15
-rw-r--r--src/lib/ffi/ffi_util.h13
4 files changed, 49 insertions, 5 deletions
diff --git a/src/lib/ffi/ffi.cpp b/src/lib/ffi/ffi.cpp
index b540a9b8e..74c576631 100644
--- a/src/lib/ffi/ffi.cpp
+++ b/src/lib/ffi/ffi.cpp
@@ -14,10 +14,10 @@
namespace Botan_FFI {
-int ffi_error_exception_thrown(const char* func_name, const char* exn)
+int ffi_error_exception_thrown(const char* func_name, const char* exn, int rc)
{
- fprintf(stderr, "in %s exception %s\n", func_name, exn);
- return BOTAN_FFI_ERROR_EXCEPTION_THROWN;
+ fprintf(stderr, "in %s exception '%s' returning %d\n", func_name, exn, rc);
+ return rc;
}
}
@@ -48,6 +48,9 @@ const char* botan_error_description(int err)
case BOTAN_FFI_ERROR_EXCEPTION_THROWN:
return "Exception thrown";
+ case BOTAN_FFI_ERROR_OUT_OF_MEMORY:
+ return "Out of memory";
+
case BOTAN_FFI_ERROR_BAD_FLAG:
return "Bad flag";
@@ -57,6 +60,9 @@ const char* botan_error_description(int err)
case BOTAN_FFI_ERROR_BAD_PARAMETER:
return "Bad parameter";
+ case BOTAN_FFI_ERROR_KEY_NOT_SET:
+ return "Key not set on object";
+
case BOTAN_FFI_ERROR_NOT_IMPLEMENTED:
return "Not implemented";
diff --git a/src/lib/ffi/ffi.h b/src/lib/ffi/ffi.h
index 676a451f1..9deefffb5 100644
--- a/src/lib/ffi/ffi.h
+++ b/src/lib/ffi/ffi.h
@@ -73,9 +73,11 @@ enum BOTAN_FFI_ERROR {
BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE = -10,
BOTAN_FFI_ERROR_EXCEPTION_THROWN = -20,
+ BOTAN_FFI_ERROR_OUT_OF_MEMORY = -21,
BOTAN_FFI_ERROR_BAD_FLAG = -30,
BOTAN_FFI_ERROR_NULL_POINTER = -31,
BOTAN_FFI_ERROR_BAD_PARAMETER = -32,
+ BOTAN_FFI_ERROR_KEY_NOT_SET = -33,
BOTAN_FFI_ERROR_NOT_IMPLEMENTED = -40,
BOTAN_FFI_ERROR_INVALID_OBJECT = -50,
@@ -563,6 +565,18 @@ BOTAN_PUBLIC_API(2,8) int botan_block_cipher_name(botan_block_cipher_t cipher,
char* name, size_t* name_len);
+/**
+* Get the key length limits of this block cipher
+* @param cipher the object to read
+* @param out_minimum_keylength if non-NULL, will be set to minimum keylength of cipher
+* @param out_maximum_keylength if non-NULL, will be set to maximum keylength of cipher
+* @param out_keylength_modulo if non-NULL will be set to byte multiple of valid keys
+*/
+BOTAN_PUBLIC_API(2,8) int botan_block_cipher_query_keylen(botan_block_cipher_t,
+ size_t* out_minimum_keylength,
+ size_t* out_maximum_keylength,
+ size_t* out_keylength_modulo);
+
/*
* Multiple precision integers
*/
diff --git a/src/lib/ffi/ffi_block.cpp b/src/lib/ffi/ffi_block.cpp
index fad492fd4..e19747d2b 100644
--- a/src/lib/ffi/ffi_block.cpp
+++ b/src/lib/ffi/ffi_block.cpp
@@ -85,4 +85,19 @@ int botan_block_cipher_name(botan_block_cipher_t cipher, char* name, size_t* nam
return write_str_output(name, name_len, bc.name()); });
}
+int botan_block_cipher_query_keylen(botan_block_cipher_t cipher,
+ size_t* out_minimum_keylength,
+ size_t* out_maximum_keylength,
+ size_t* out_keylength_modulo)
+ {
+ return BOTAN_FFI_DO(Botan::BlockCipher, cipher, bc, {
+ if(out_minimum_keylength)
+ *out_minimum_keylength = bc.minimum_keylength();
+ if(out_maximum_keylength)
+ *out_maximum_keylength = bc.maximum_keylength();
+ if(out_keylength_modulo)
+ *out_keylength_modulo = bc.key_spec().keylength_multiple();
+ });
+ }
+
}
diff --git a/src/lib/ffi/ffi_util.h b/src/lib/ffi/ffi_util.h
index 9ff1b0e2f..afd359dbb 100644
--- a/src/lib/ffi/ffi_util.h
+++ b/src/lib/ffi/ffi_util.h
@@ -43,7 +43,8 @@ struct botan_struct
struct NAME final : public Botan_FFI::botan_struct<TYPE, MAGIC> { explicit NAME(TYPE* x) : botan_struct(x) {} }
// Declared in ffi.cpp
-int ffi_error_exception_thrown(const char* func_name, const char* exn);
+int ffi_error_exception_thrown(const char* func_name, const char* exn,
+ int rc = BOTAN_FFI_ERROR_EXCEPTION_THROWN);
template<typename T, uint32_t M>
T& safe_get(botan_struct<T,M>* p)
@@ -69,7 +70,15 @@ int ffi_guard_thunk(const char* func_name, Thunk thunk)
}
catch(std::bad_alloc&)
{
- return ffi_error_exception_thrown(func_name, "bad_alloc");
+ return ffi_error_exception_thrown(func_name, "bad_alloc", BOTAN_FFI_ERROR_OUT_OF_MEMORY);
+ }
+ catch(Botan::Key_Not_Set& e)
+ {
+ return ffi_error_exception_thrown(func_name, e.what(), BOTAN_FFI_ERROR_KEY_NOT_SET);
+ }
+ catch(Botan::Invalid_Argument& e)
+ {
+ return ffi_error_exception_thrown(func_name, e.what(), BOTAN_FFI_ERROR_BAD_PARAMETER);
}
catch(std::exception& e)
{