diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2016-05-19 04:13:47 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2016-05-19 04:13:47 +0300 |
commit | aebc96e6efc369c09a95fb641ca90935930cf19b (patch) | |
tree | 38db5723b71c13804a88e9e129f9a20807b78f4e /include/aes/error.h | |
parent | README update (diff) | |
download | aes-tools-aebc96e6efc369c09a95fb641ca90935930cf19b.tar.gz aes-tools-aebc96e6efc369c09a95fb641ca90935930cf19b.zip |
rename the project
Diffstat (limited to 'include/aes/error.h')
-rw-r--r-- | include/aes/error.h | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/include/aes/error.h b/include/aes/error.h new file mode 100644 index 0000000..a51284f --- /dev/null +++ b/include/aes/error.h @@ -0,0 +1,184 @@ +/** + * \file + * \author Egor Tensin <Egor.Tensin@gmail.com> + * \date 2015 + * \copyright This file is licensed under the terms of the MIT License. + * See LICENSE.txt for details. + */ + +#pragma once + +/** + * \defgroup aesni_error_handling Error handling + * \ingroup aesni + * \brief Error data structures and formatting functions. + * + * Some library functions cannot fail, which is simple. + * Other functions return an error code. + * You can check if a function exited with an error by passing the returned + * error code to aesni_is_error(). + * + * Some possibly-may-fail functions accept a pointer to an "error details" + * structure. + * This pointer can always be `NULL`. + * In this case, simply an error code is returned. + * Otherwise, the error details structure is filled with appropriate info about + * the error, possibly including a few details like invalid arguments names, + * etc. + * + * You can format an error details structure using the formatting functions. + * \{ + */ + +#include <stdlib.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * \brief API status codes. + */ +typedef enum +{ + 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 while decrypting + AESNI_NOT_IMPLEMENTED_ERROR, ///< Not implemented + AESNI_MISSING_PADDING_ERROR, + AESNI_MEMORY_ALLOCATION_ERROR, +} +AesNI_StatusCode; + +static __inline int aesni_is_error(AesNI_StatusCode ec) +{ + return ec != AESNI_SUCCESS; +} + +/** + * \brief Retrieves a simple error message for an error code. + * + * For example, + * \code{.c} + * printf("%s\n", aesni_strerror(AESNI_NULL_ARGUMENT_ERROR)); + * \endcode + * would print + * \code + * Invalid argument value NULL + * \endcode + * + * \param[in] ec The error code. + * \return A pointer to a statically-allocated C string. + */ +const char* aesni_strerror(AesNI_StatusCode ec); + +#define AESNI_MAX_CALL_STACK_LENGTH 32 + +/** + * \brief Stores error details: error code & possibly a few parameters. + */ +typedef struct +{ + AesNI_StatusCode ec; ///< Error code + + union + { + struct { char param_name[32]; } null_arg; + struct + { + char src[128]; + char what[32]; + } + parse_error; + struct { char what[128]; } not_implemented; + } + params; + + void* call_stack[AESNI_MAX_CALL_STACK_LENGTH]; + size_t call_stack_size; +} +AesNI_ErrorDetails; + +/** + * \brief Extracts an error code from error details. + * + * \param[in] err_details The error details structure. Must not be `NULL`. + * \return The error code stored in the error details. + */ +static __inline AesNI_StatusCode aesni_get_error_code( + const AesNI_ErrorDetails* err_details) +{ + return err_details->ec; +} + +/** + * \brief Formats a pretty error message, including error parameters. + * + * \param[in] err_details The pointer to error details. Must not be `NULL`. + * \param[out] dest The pointer to the destination string buffer. + * \param[in] dest_size The size of the destination buffer, in bytes. + * \return If `dest` is NULL, the number of bytes required to store the full + * error message, and the number of characters written (excluding the + * terminating '\0' character) otherwise. + */ +size_t aesni_format_error( + const AesNI_ErrorDetails* err_details, + char* dest, + size_t dest_size); + +/** + * \brief Initializes an error details structure. + * + * \param[out] err_details The error details structure to fill. + */ +AesNI_StatusCode aesni_success( + 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] param_name The parameter name. Must not be `NULL`. + */ +AesNI_StatusCode aesni_error_null_argument( + 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_error_parse( + AesNI_ErrorDetails* err_details, + const char* src, + const char* what); + +/** + * \brief Builds error details from an invalid PKCS7 padding error. + * + * \param[out] err_details The error details structure to fill. + */ +AesNI_StatusCode aesni_error_invalid_pkcs7_padding( + AesNI_ErrorDetails* err_details); + +AesNI_StatusCode aesni_error_not_implemented( + AesNI_ErrorDetails* err_details, + const char* what); + +AesNI_StatusCode aesni_error_missing_padding( + AesNI_ErrorDetails* err_details); + +AesNI_StatusCode aesni_error_memory_allocation( + AesNI_ErrorDetails* err_details); + +#ifdef __cplusplus +} +#endif + +/** + * \} + */ |