aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/include
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2015-06-15 21:32:42 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2015-06-15 21:32:42 +0300
commit3f5df3abf1386ce9071046bb00e5eae27a10e2ef (patch)
treec37bdb612d3c0e0175d5092c9d6be8a7b90335f5 /include
parentcode style (diff)
downloadaes-tools-3f5df3abf1386ce9071046bb00e5eae27a10e2ef.tar.gz
aes-tools-3f5df3abf1386ce9071046bb00e5eae27a10e2ef.zip
handle block parsing errors the standard way
Diffstat (limited to '')
-rw-r--r--include/aesni/data.h71
-rw-r--r--include/aesni/error.h45
2 files changed, 64 insertions, 52 deletions
diff --git a/include/aesni/data.h b/include/aesni/data.h
index 8b8162e..188b3e4 100644
--- a/include/aesni/data.h
+++ b/include/aesni/data.h
@@ -11,6 +11,8 @@
#pragma once
+#include "error.h"
+
/**
* \defgroup aesni_data Data
* \brief Data structures and I/O functions
@@ -49,7 +51,7 @@ static __inline AesNI_Block128 aesni_load_block128(const void* src)
* `NULL`.
* \return The loaded 128-bit block.
*/
-static __inline AesNI_Block128 aseni_load_block128_aligned(const void* src)
+static __inline AesNI_Block128 aesni_load_block128_aligned(const void* src)
{
return _mm_load_si128((AesNI_Block128*) src);
}
@@ -201,11 +203,9 @@ typedef struct
}
AesNI_KeySchedule256;
-static __inline AesNI_Block128 __fastcall aesni_reverse_byte_order128(
- AesNI_Block128 block)
+static __inline AesNI_Block128 __fastcall aesni_reverse_byte_order128(AesNI_Block128 block)
{
- return _mm_shuffle_epi8(block, aesni_make_block128(
- 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f));
+ return _mm_shuffle_epi8(block, aesni_make_block128(0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f));
}
static __inline AesNI_Block128 __fastcall aesni_le2be128(AesNI_Block128 block)
@@ -226,14 +226,6 @@ AesNI_BlockString128 aesni_format_block128(AesNI_Block128*);
AesNI_BlockString192 aesni_format_block192(AesNI_Block192*);
AesNI_BlockString256 aesni_format_block256(AesNI_Block256*);
-AesNI_BlockString128 aesni_format_block128_le(AesNI_Block128*);
-AesNI_BlockString192 aesni_format_block192_le(AesNI_Block192*);
-AesNI_BlockString256 aesni_format_block256_le(AesNI_Block256*);
-
-AesNI_BlockString128 aesni_format_block128_be(AesNI_Block128*);
-AesNI_BlockString192 aesni_format_block192_be(AesNI_Block192*);
-AesNI_BlockString256 aesni_format_block256_be(AesNI_Block256*);
-
typedef struct { char str[49]; } AesNI_BlockMatrixString128;
typedef struct { char str[73]; } AesNI_BlockMatrixString192;
typedef struct { char str[97]; } AesNI_BlockMatrixString256;
@@ -242,41 +234,44 @@ AesNI_BlockMatrixString128 aesni_format_block128_as_matrix(AesNI_Block128*);
AesNI_BlockMatrixString192 aesni_format_block192_as_matrix(AesNI_Block192*);
AesNI_BlockMatrixString256 aesni_format_block256_as_matrix(AesNI_Block256*);
-AesNI_BlockMatrixString128 aesni_format_block128_be_as_matrix(AesNI_Block128*);
-AesNI_BlockMatrixString192 aesni_format_block192_be_as_matrix(AesNI_Block192*);
-AesNI_BlockMatrixString256 aesni_format_block256_be_as_matrix(AesNI_Block256*);
-
void aesni_print_block128(AesNI_Block128*);
void aesni_print_block192(AesNI_Block192*);
void aesni_print_block256(AesNI_Block256*);
-void aesni_print_block128_le(AesNI_Block128*);
-void aesni_print_block192_le(AesNI_Block192*);
-void aesni_print_block256_le(AesNI_Block256*);
-
-void aesni_print_block128_be(AesNI_Block128*);
-void aesni_print_block192_be(AesNI_Block192*);
-void aesni_print_block256_be(AesNI_Block256*);
-
void aesni_print_block128_as_matrix(AesNI_Block128*);
void aesni_print_block192_as_matrix(AesNI_Block192*);
void aesni_print_block256_as_matrix(AesNI_Block256*);
-void aesni_print_block128_be_as_matrix(AesNI_Block128*);
-void aesni_print_block192_be_as_matrix(AesNI_Block192*);
-void aesni_print_block256_be_as_matrix(AesNI_Block256*);
+AesNI_StatusCode aesni_parse_block128(
+ AesNI_Block128* dest,
+ const char* src,
+ AesNI_ErrorDetails* err_details);
-int aesni_parse_block128(AesNI_Block128*, const char*);
-int aesni_parse_block192(AesNI_Block192*, const char*);
-int aesni_parse_block256(AesNI_Block256*, const char*);
+AesNI_StatusCode aesni_parse_block192(
+ AesNI_Block192* dest,
+ const char* src,
+ AesNI_ErrorDetails* err_details);
-int aesni_parse_block128_le(AesNI_Block128*, const char*);
-int aesni_parse_block192_le(AesNI_Block192*, const char*);
-int aesni_parse_block256_le(AesNI_Block256*, const char*);
-
-int aesni_parse_block128_be(AesNI_Block128*, const char*);
-int aesni_parse_block192_be(AesNI_Block192*, const char*);
-int aesni_parse_block256_be(AesNI_Block256*, const char*);
+/**
+ * \brief Parses a 256-bit block, from the least significant to the most significant byte.
+ *
+ * The block is parsed from a hexadecimal number represented using the big endian notation.
+ *
+ * The source string may optionally start with "0x" or "0X".
+ * Then 64 characters in the range [0-9a-fA-F] must follow.
+ *
+ * \param[out] dest The pointer to the parsed block. Must not be `NULL`.
+ * \param[in] src The pointer to the source C string. Must not be `NULL`.
+ * \param[out] err_details The error details structure.
+ * \retval AESNI_SUCCESS If parsed successfully.
+ * \retval AESNI_NULL_ARGUMENT_ERROR If either `dest` or `src` is `NULL`.
+ * \retval AESNI_PARSE_ERROR If `src` couldn't be parsed as a valid 256-bit block.
+ * \sa aesni_error_handling.
+ */
+AesNI_StatusCode aesni_parse_block256(
+ AesNI_Block256* dest,
+ const char* src,
+ AesNI_ErrorDetails* err_details);
#ifdef __cplusplus
}
diff --git a/include/aesni/error.h b/include/aesni/error.h
index 349ebe4..d4dcb81 100644
--- a/include/aesni/error.h
+++ b/include/aesni/error.h
@@ -44,11 +44,10 @@ extern "C"
*/
typedef enum
{
- AESNI_SUCCESS, ///< Indicates an operation
-
- AESNI_ERROR_NULL_ARGUMENT, ///< Invalid argument value NULL
-
- AESNI_ERROR_INVALID_PKCS7_PADDING, ///< Invalid PKCS7 padding
+ AESNI_SUCCESS, ///< Everything went fine
+ AESNI_NULL_ARGUMENT_ERROR, ///< Invalid argument value NULL
+ AESNI_PARSE_ERROR, ///< Couldn't parse
+ AESNI_INVALID_PKCS7_PADDING_ERROR, ///< Invalid PKCS7 padding
}
AesNI_StatusCode;
@@ -62,7 +61,7 @@ static __inline int aesni_is_error(AesNI_StatusCode ec)
*
* For example,
* \code{.c}
- * printf("%s\n", aesni_strerror(AESNI_ERROR_NULL_ARGUMENT));
+ * printf("%s\n", aesni_strerror(AESNI_NULL_ARGUMENT_ERROR));
* \endcode
* would print
* \code
@@ -85,9 +84,17 @@ typedef struct
{
struct
{
- char arg_name[32]; ///< Name of the NULL argument
+ char param_name[32]; ///< Name of the NULL argument
+ }
+ null_arg_error;
+ ///< `NULL` argument error (AESNI_NULL_ARGUMENT_ERROR) parameters
+
+ struct
+ {
+ char src[128]; ///< The string that failed to be parsed
}
- null_arg; ///< `NULL` argument error parameters
+ parse_error;
+ ///< Parse error (AESNI_PARSE_ERROR) parameters
}
params;
}
@@ -121,29 +128,39 @@ size_t aesni_format_error(
size_t dest_size);
/**
- * \brief Initializes error details structure.
+ * \brief Initializes an error details structure.
*
* \param[out] err_details The error details structure to fill.
*/
-AesNI_StatusCode aesni_make_error_success(
+AesNI_StatusCode aesni_initialize_error_details(
AesNI_ErrorDetails* err_details);
/**
* \brief Builds error details from a `NULL` argument error.
*
* \param[out] err_details The error details structure to fill.
- * \param[in] arg_name The `NULL` argument name. Must not be `NULL`.
+ * \param[in] param_name The parameter name. Must not be `NULL`.
+ */
+AesNI_StatusCode aesni_make_null_argument_error(
+ AesNI_ErrorDetails* err_details,
+ const char* param_name);
+
+/**
+ * \brief Builds error details from a parse error.
+ *
+ * \param[out] err_details The error details structure to fill.
+ * \param[in] src The string that failed to be parsed.
*/
-AesNI_StatusCode aesni_make_error_null_argument(
+AesNI_StatusCode aesni_make_parse_error(
AesNI_ErrorDetails* err_details,
- const char* arg_name);
+ const char* src);
/**
* \brief Builds error details from an invalid PKCS7 padding error.
*
* \param[out] err_details The error details structure to fill.
*/
-AesNI_StatusCode aesni_make_error_invalid_pkcs7_padding(
+AesNI_StatusCode aesni_make_invalid_pkcs7_padding_error(
AesNI_ErrorDetails* err_details);
#ifdef __cplusplus