/*
 * This file is part of the openHiTLS project.
 *
 * openHiTLS is licensed under the Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

/**
 * @defgroup hitls_errno
 * @ingroup tls
 * @brief error module
 */

#ifndef HITLS_ERROR_H
#define HITLS_ERROR_H

#include <stdint.h>
#include "hitls_type.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @ingroup tls_error
 * @brief   Return success
 */
#define HITLS_SUCCESS 0
#define HITLS_X509_V_OK 0

/**
 * @ingroup tls_error
 * @brief   Indicates that the connection is blocked. You can call HITLS_Connect to continue the connection.
 * This problem is usually caused by read and write operations.
 */
#define HITLS_WANT_CONNECT 1

/**
 * @ingroup tls_error
 * @brief   Indicates that the connection is blocked and the HITLS_Accept can be called to continue the connection.
 * This problem is usually caused by read and write operations.
 */
#define HITLS_WANT_ACCEPT 2

/**
 * @ingroup tls_error
 * @brief   indicates that the receiving buffer is empty and the interface can be
 * called to continue receiving data.
 */
#define HITLS_WANT_READ 3

/**
 * @ingroup tls_error
 * @brief   The sending buffer is full and the interface can be called to continue sending data.
 */
#define HITLS_WANT_WRITE 4

/**
 * @ingroup tls_error
 * @brief   An unrecoverable fatal error occurs in the TLS protocol, usually a protocol error.
 */
#define HITLS_ERR_TLS 5

/**
 * @ingroup tls_error
 * @brief   An unrecoverable I/O error occurs,
 * which is usually a low level receiving and receiving exception or an unknown error occurs.
 */
#define HITLS_ERR_SYSCALL  6

#define HITLS_WANT_BACKUP 7

/**
 * @ingroup tls_error
 * @brief   The operation did not complete because an application callback set by
 * HITLS_CFG_SetClientHelloCb() has asked to be called again.
 */
#define HITLS_WANT_CLIENT_HELLO_CB 8

/**
 * @ingroup tls_error
 * @brief   The operation did not complete because an application callback set by
 * HITLS_CFG_SetCertCb() has asked to be called again.
 */
#define HITLS_WANT_X509_LOOKUP 9

/**
 * @ingroup tls_error
 *
 * Error code returned by the TLS module
 */
typedef enum {
    HITLS_NULL_INPUT = 0x02010001,                 /**< Incorrect null pointer input. */
    HITLS_INVALID_INPUT,                           /**< Invalid input, the parameter value is out of the valid range.*/
    HITLS_INTERNAL_EXCEPTION,                      /**< Unexpected internal error, which is unlikely. */
    HITLS_MEMALLOC_FAIL,                           /**< Failed to apply for memory. */
    HITLS_MEMCPY_FAIL,                             /**< Memory Copy Failure. */
    HITLS_UNREGISTERED_CALLBACK,                   /**< Use unregistered callback. */
    HITLS_UNSUPPORT_TLS_VERSION,                   /**< Does not support the protocol. */

    HITLS_CONFIG_FAIL_START = 0x02020001,          /**< config module error code start bit. */
    HITLS_CONFIG_NO_SUITABLE_CIPHER_SUITE,         /**< Unfind a proper cipher suite. */
    HITLS_CONFIG_UNSUPPORT_CIPHER_SUITE,           /**< Unsupported cipher suites. */
    HITLS_CONFIG_INVALID_SET,                      /**< Invalid setting. */
    HITLS_CONFIG_NO_SUITABLE_SIGNATURE_ALGORITHM,  /**< The signature algorithm and the cipher suite are nonmatching. */
    HITLS_CONFIG_NO_GROUPS,                        /**< The group is not set. */
    HITLS_CONFIG_UNSUPPORT_SIGNATURE_ALGORITHM,    /**< Unsupported signature algorithm. */
    HITLS_CONFIG_UNSUPPORT_POINT_FORMATS,          /**< Unsupported the dot format. */
    HITLS_CONFIG_INVALID_VERSION,                  /**< Unsupported the protocol version. */
    HITLS_CONFIG_INVALID_LENGTH,                   /**< Invalid length. */
    HITLS_CONFIG_NO_CERT,                          /**< Unset the certificate. */
    HITLS_CONFIG_NO_PRIVATE_KEY,                   /**< Unset the certificate private key. */
    HITLS_CONFIG_DUP_DH_KEY_FAIL,                  /**< Duplicate DH key failure. */
    HITLS_CFG_ERR_LOAD_CERT_FILE,                  /**< Failed to load the certificate file. */
    HITLS_CFG_ERR_LOAD_CERT_BUFFER,                /**< Failed to load the certificate buffer. */
    HITLS_CFG_ERR_LOAD_KEY_FILE,                   /**< Failed to load the key file. */
    HITLS_CFG_ERR_LOAD_KEY_BUFFER,                 /**< Failed to load the key buffer. */
    HITLS_CONFIG_UNSUPPORT_GROUP,                  /**< Unsupported group. */
    HITLS_CONFIG_UNSUPPORT,                        /**< Unsupported interface */
    HITLS_CONFIG_ERR_LOAD_GROUP_INFO,              /**< Failed to load the group info. */
    HITLS_CONFIG_ERR_LOAD_SIGN_SCHEME_INFO,        /**< Failed to load the signature scheme info. */
    HITLS_CONFIG_DUP_CUSTOM_EXT,                   /**< Duplicate custom extension type detected. */
    HITLS_CONFIG_ERR_MAX_LIMIT_CUSTOM_EXT,         /**< Exceed the max limit of custom extensions. */
    HITLS_CFG_ERR_LOAD_CRL_FILE,                   /**< Failed to load the CRL file. */
    HITLS_CFG_ERR_LOAD_CRL_BUFFER,                 /**< Failed to load the CRL buffer. */
    HITLS_CFG_ERR_MAX_LIMIT_KEYSHARE,              /**< Exceed the max limit of keyshare. */

    HITLS_CM_FAIL_START = 0x02030001,              /**< Error start bit of the conn module. */
    HITLS_CM_LINK_FATAL_ALERTED,                   /**< link sent fatal alert. */
    HITLS_CM_LINK_CLOSED,                          /**< Link has been closed. */
    HITLS_CM_LINK_UNESTABLISHED,                   /**< The current link is not established.
                                                        Do not perform other operations, such as read and write. */
    HITLS_CM_LINK_UNSUPPORT_SECURE_RENEGOTIATION,  /**< The current link Unsupported security renegotiation. */
    HITLS_CM_LINK_HANDSHAKING,                     /**< Link is handshaking, can not set config */

    HITLS_MSG_HANDLE_FAIL_START = 0x02040001,      /**< Start bit of the error code processed by the state machine. */
    HITLS_MSG_HANDLE_UNEXPECTED_MESSAGE,           /**< receives unexpected handshake messages. */
    HITLS_MSG_HANDLE_RANDOM_SIZE_ERR,              /**< Incorrect random number length. */
    HITLS_MSG_HANDLE_UNSUPPORT_POINT_FORMAT,       /**< Unsupported the point format. */
    HITLS_MSG_HANDLE_CIPHER_SUITE_ERR,             /**< cannot find the supported cipher suite. */
    HITLS_MSG_HANDLE_UNSUPPORT_VERSION,            /**< Unsupported version. */
    HITLS_MSG_HANDLE_STATE_ILLEGAL,                /**< Handshake status error. */
    HITLS_MSG_HANDLE_UNSUPPORT_KX_ALG,             /**< Unsupported key exchange algorithm. */
    HITLS_MSG_HANDLE_UNSUPPORT_CERT,               /**< Unsupported certificate. */
    HITLS_MSG_HANDLE_UNKNOWN_CURVE_TYPE,           /**< Unsupported elliptic curve type. */
    HITLS_MSG_HANDLE_VERIFY_FINISHED_FAIL,         /**< Failed to verify the finished message. */
    HITLS_MSG_HANDLE_VERIFY_SIGN_FAIL,             /**< Failed to verify the finished message. */
    HITLS_MSG_HANDLE_INCORRECT_DIGEST_LEN,         /**< Incorrect length of the digest. */
    HITLS_MSG_HANDLE_UNSUPPORT_NAMED_CURVE,        /**< Unsupported ECDH elliptic curves. */
    HITLS_MSG_HANDLE_UNSUPPORT_EXTENSION_TYPE,     /**< Unsupported the extended type. */
    HITLS_MSG_HANDLE_UNSUPPORT_CIPHER_SUITE,       /**< Unsupported cipher suites. */
    HITLS_MSG_HANDLE_COOKIE_ERR,                   /**< Incorrect cookie. */
    HITLS_MSG_VERIFY_COOKIE_ERR,                   /**< Failed to verify the cookie. */
    HITLS_MSG_HANDLE_ERR_ENCODE_ECDH_KEY,          /**< Failed to obtain the ECDH public key. */
    HITLS_MSG_HANDLE_ERR_ENCODE_DH_KEY,            /**< Failed to obtain the DH public key. */
    HITLS_MSG_HANDLE_ERR_GET_DH_PARAMETERS,        /**< Failed to obtain the DH parameter. */
    HITLS_MSG_HANDLE_ERR_GET_DH_KEY,               /**< Failed to generate the DH key. */
    HITLS_MSG_HANDLE_NO_PEER_CERTIFIACATE,         /**< Not receive the peer certificate. */
    HITLS_MSG_HANDLE_ERR_NO_SERVER_CERTIFICATE,    /**< Server has no certificate to send. */
    HITLS_MSG_HANDLE_UNMATCHED_SEQUENCE,           /**< Handshake sequence number nonmatch */
    HITLS_MSG_HANDLE_ILLEGAL_VERSION,              /**< Incorrect version. */
    HITLS_MSG_HANDLE_ILLEGAL_CIPHER_SUITE,         /**< Incorrect cipher suite. */
    HITLS_MSG_HANDLE_ILLEGAL_SELECTED_GROUP,       /**< Incorrect selectedGroup. */
    HITLS_MSG_HANDLE_ILLEGAL_EXTRENED_MASTER_SECRET, /**< Incorrect extended master key. */
    HITLS_MSG_HANDLE_MISSING_EXTENSION,             /**< Message missing the extended field that must be sent */
    HITLS_MSG_HANDLE_DUPLICATE_HELLO_RETYR_REQUEST, /**< Duplicate Hello Retry Request messages */
    HITLS_MSG_HANDLE_ALPN_PROTOCOL_NO_MATCH,        /**< No matching alpn */
    HITLS_MSG_HANDLE_ILLEGAL_PSK_LEN,               /**< Invalid PSK length */
    HITLS_MSG_HANDLE_ILLEGAL_IDENTITY_LEN,          /**< Invalid identity length */
    HITLS_MSG_HANDLE_GET_UNSIGN_DATA_FAIL,          /**< Failed to obtain the unsigned data
                                                         during signature calculation */
    HITLS_MSG_HANDLE_ILLEGAL_SESSION_ID,            /**< Receives an incorrect session ID */
    HITLS_MSG_HANDLE_SNI_UNRECOGNIZED_NAME,         /**< Not accept the extended value of server_name */
    HITLS_MSG_HANDLE_ALPN_UNRECOGNIZED,             /**< Not accept the extended ALPN value */
    HITLS_MSG_HANDLE_ILLEGAL_KEY_UPDATE_TYPE,       /**< Receives an incorrect key update type */
    HITLS_MSG_HANDLE_SYS_TIME_FAIL,                 /**< System time function returns a failure */
    HITLS_MSG_HANDLE_DTLS_CONNECT_TIMEOUT,           /**< DTLS connection timeout */
    HITLS_MSG_HANDLE_UNSECURE_VERSION,              /**< Insecure version. */
    HITLS_MSG_HANDLE_UNSECURE_CIPHER_SUITE,         /**< Insecure cipher suites. */
    HITLS_MSG_HANDLE_RENEGOTIATION_FAIL,            /**< Renegotiation failure */
    HITLS_MSG_HANDLE_SESSION_ID_CTX_ILLEGAL,        /**< Session ID ctx mismatch */
    HITLS_MSG_HANDLE_ENCRYPT_THEN_MAC_ERR,          /**< Failed to change the EncryptThenMac status */
    HITLS_MSG_HANDLE_ILLEGAL_PSK_IDENTITY,          /**< psk identity error */
    HITLS_MSG_HANDLE_PSK_USE_SESSION_FAIL,          /**< The TLS1.3 client fails to process the PSK callback. */
    HITLS_MSG_HANDLE_PSK_FIND_SESSION_FAIL,         /**< The TLS1.3 server fails to process the PSK callback. */
    HITLS_MSG_HANDLE_PSK_SESSION_INVALID_CIPHER_SUITE, /**< TLS1.3 psk session algorithm suite is incorrect. */
    HITLS_MSG_HANDLE_PSK_INVALID,                   /**< TLS1.3 psk check failed. */
    HITLS_MSG_HANDLE_INVALID_CERT_REQ_CTX,          /**< TLS1.3 invalid certificateReqCtx. */
    HITLS_MSG_HANDLE_HANDSHAKE_FAILURE,             /**< TLS1.3 handshake parameters cannot be negotiated. */
    HITLS_MSG_HANDLE_INVALID_COMPRESSION_METHOD,    /**< Receives an incorrect compression algorithm. */
    HITLS_MSG_HANDLE_INVALID_EXTENDED_MASTER_SECRET, /**< The peer Unsupported the extended master key. */
    HITLS_MSG_HANDLE_ERR_CLIENT_HELLO_FRAGMENT,
    HITLS_MSG_HANDLE_INVALID_RECORD_SIZE_LIMIT,      /**< The value of record size limit is invalid. */
    HITLS_MSG_HANDLE_ERR_INAPPROPRIATE_FALLBACK,    /**< The downgrade negotiation failed, and the client supports
                                                        a higher version. */
    HITLS_MSG_HANDLE_DTLS_RETRANSMIT_NOT_TIMEOUT,
    HITLS_MSG_HANDLE_ERR_WITHOUT_TIMEOUT_ACTION,
    HITLS_MSG_HANDLE_ERR_TIMEOUT_REWIND,

    HITLS_PACK_FAIL_START = 0x02050001,             /**< Start bit of the pack error code. */
    HITLS_PACK_UNSUPPORT_VERSION,                   /**< Unsupported version. */
    HITLS_PACK_UNSECURE_VERSION,                    /**< Insecure version. */
    HITLS_PACK_UNSUPPORT_HANDSHAKE_MSG,             /**< Unsupported handshake messages. */
    HITLS_PACK_NOT_ENOUGH_BUF_LENGTH,               /**< Insufficient buffer length. */
    HITLS_PACK_SESSIONID_ERR,                       /**< Failed to assemble the sessionId. */
    HITLS_PACK_COOKIE_ERR,                          /**< Failed to assemble the cookie. */
    HITLS_PACK_CLIENT_CIPHER_SUITE_ERR,             /**< Failed to assemble client_cipher_suite. */
    HITLS_PACK_UNSUPPORT_KX_ALG,                    /**< Unsupported the key negotiation algorithm. */
    HITLS_PACK_UNSUPPORT_KX_CURVE_TYPE,             /**< Unsupported ECDH key negotiation algorithm curve. */
    HITLS_PACK_INVALID_KX_PUBKEY_LENGTH,            /**< Invalid length of the public key for key negotiation */
    HITLS_PACK_SIGNATURE_ERR,                       /**< Failed to assemble the server_kx message signature data. */
    HITLS_PACK_PRE_SHARED_KEY_ERR,                  /**< Failed to assemble the PSK. */

    HITLS_PARSE_FAIL_START = 0x02060001,            /**< Start bit of the parse error code. */
    HITLS_PARSE_UNSUPPORT_VERSION,                  /**< Unsupported Version. */
    HITLS_PARSE_UNSUPPORT_HANDSHAKE_MSG,            /**< Unsupported handshake messages. */
    HITLS_PARSE_INVALID_MSG_LEN,                    /**< Message length error. */
    HITLS_PARSE_DUPLICATE_EXTENDED_MSG,             /**< Duplicate extended messages. */
    HITLS_PARSE_COMPRESSION_METHOD_ERR,             /**< Incorrect compression type. */
    HITLS_PARSE_SERVER_NAME_ERR,                    /**< Failed to parse server_name. */
    HITLS_PARSE_CERT_ERR,                           /**< Failed to parse the certificate. */
    HITLS_PARSE_ECDH_PUBKEY_ERR,                    /**< Failed to parse the ecdh public key. */
    HITLS_PARSE_ECDH_SIGN_ERR,                      /**< Failed to parse the ecdh signature. */
    HITLS_PARSE_UNSUPPORT_KX_ALG,                   /**< Unsupported the key exchange algorithm. */
    HITLS_PARSE_UNSUPPORT_KX_CURVE_TYPE,            /**< Unsupported ECC curve type. */
    HITLS_PARSE_GET_SIGN_PARA_ERR,                  /**< Failed to obtain the signature algorithm and hash algorithm */
    HITLS_PARSE_UNSUPPORT_SIGN_ALG,                 /**< Unsupported the signature algorithm. */
    HITLS_PARSE_VERIFY_SIGN_FAIL,                   /**< Failed to verify the signature. */
    HITLS_PARSE_DH_P_ERR,                           /**< Failed to parse the dh_p. */
    HITLS_PARSE_DH_G_ERR,                           /**< Failed to parse the dh_g. */
    HITLS_PARSE_DH_PUBKEY_ERR,                      /**< Failed to parse the DHE public key. */
    HITLS_PARSE_DH_SIGN_ERR,                        /**< Failed to parse the DHE signature. */
    HITLS_PARSE_UNSUPPORTED_EXTENSION,              /**< Unsupported extended fields. */
    HITLS_PARSE_CA_LIST_ERR,                        /**< Failed to parse the CA name list. */
    HITLS_PARSE_EXCESSIVE_MESSAGE_SIZE,             /**< The length of the parsing exceeds the maximum. */
    HITLS_PARSE_PRE_SHARED_KEY_FAILED,              /**< Failed to parse the PSK extension. */
    HITLS_PARSE_DUPLICATED_KEY_SHARE,               /**< duplicated key share entry. */
    HITLS_PARSE_SESSION_TICKET_FAIL,                /**< parse session ticket fail */

    HITLS_REASS_FAIL_START = 0x02070001,            /**< Reassembly module error code start bit. */
    HITLS_REASS_INVALID_FRAGMENT,                   /**< Receives invalid fragmented messages. */

    HITLS_CCS_FAIL_START = 0x02080001,              /**< ccs module error code start bit. */
    HITLS_CCS_INVALID_CMD,                          /**< Invalid command. */

    HITLS_ALERT_FAIL_START = 0x02090001,            /**< alert module error code start bit. */
    HITLS_ALERT_NO_WANT_SEND,                       /**< No alert messages to be sent. */

    HITLS_REC_FAIL_START = 0x020A0001,              /**< record module error start bit. */
    HITLS_REC_PMTU_TOO_SMALL,                       /**< pmtu is too small to meet the record packet length. */
    HITLS_REC_ERR_BUFFER_NOT_ENOUGH,                /**< Insufficient buffer. */
    HITLS_REC_ERR_TOO_BIG_LENGTH,                   /**< The length of the plaintext data to be written
                                                         exceeds the maximum length of a single record. */
    HITLS_REC_ERR_NOT_SUPPORT_CIPHER,              /**< Unsupported the cipher suites. */
    HITLS_REC_ERR_ENCRYPT,                         /**< Encryption failed. */
    HITLS_REC_ERR_AEAD_NONCE_PARAM,                /**< AEAD nonce input parameter is incorrect. */
    HITLS_REC_ERR_SN_WRAPPING,                     /**< Sequence number Rewind. */
    HITLS_REC_ERR_IO_EXCEPTION,                    /**< The low level I/O is abnormal. */
    HITLS_REC_NORMAL_IO_BUSY,                      /**< Low level I/O is busy, need wait for the next sending. */
    HITLS_REC_NORMAL_RECV_BUF_EMPTY,               /**< The receiving buffer is empty. */
    HITLS_REC_NORMAL_RECV_UNEXPECT_MSG,            /**< If REC receives unexpected messages and the receiver is user,
                                                        needs to recall the previous function. */
    HITLS_REC_NORMAL_RECV_DISORDER_MSG,            /**< The REC receives disordered records,
                                                        to receive disordered finished records. */
    HITLS_REC_INVLAID_RECORD,                      /**< record: invalid record message. */
    HITLS_REC_INVALID_PROTOCOL_VERSION,            /**< record: Incorrect version. */
    HITLS_REC_BAD_RECORD_MAC,                      /**< record: Invalid MAC. */
    HITLS_REC_DECODE_ERROR,                        /**< Decoding failed. */
    HITLS_REC_RECORD_OVERFLOW,                     /**< Record is too long. */
    HITLS_REC_ERR_RECV_UNEXPECTED_MSG,             /**< Record: unexpected message */
    HITLS_REC_ERR_NOT_ON_RECORD_BOUNDARY,          /**< TLS1.3: read key change not on record boundary */
    HITLS_REC_ERR_GENERATE_MAC,                    /**< Failed to generate the MAC address. */
    HITLS_REC_NORMAL_IO_EOF,                       /**< IO object has reached EOF. */
    HITLS_REC_ENCRYPTED_NUMBER_OVERFLOW,           /**< The number of AES-GCM encryption times cannot exceed 2^24.5. */
    HITLS_REC_ERR_DATA_BETWEEN_CCS_AND_FINISHED,   /**< When version is below TLS13,
                                                        must not have data between ccs and finished. */

    HITLS_UIO_FAIL_START = 0x020B0001,             /**< uio module error code start bit. */
    HITLS_UIO_FAIL,                                /**< UIO internal failure. */
    HITLS_UIO_IO_EXCEPTION,                        /**< Low level I/O exception. */
    HITLS_UIO_SCTP_IS_SND_BUF_EMPTY_FAIL,          /**< Failed to obtain whether the sending buffer
                                                        of the UIO object is empty. */
    HITLS_UIO_SCTP_ADD_AUTH_KEY_FAIL,              /**< Failed to add the auth key for the sctp UIO object. */
    HITLS_UIO_SCTP_ACTIVE_AUTH_KEY_FAIL,           /**< Failed to activate the auth key for the sctp UIO object. */
    HITLS_UIO_SCTP_DEL_AUTH_KEY_FAIL,              /**< Failed to delete the auth key for the sctp UIO object. */
    HITLS_UIO_NOT_SET,                             /**< Does not set the UIO object. */
    HITLS_UIO_IO_TYPE_ERROR,                       /**< The type of UIO is wrong. */

    HITLS_CERT_FAIL_START = 0x020C0001,            /**< Certificate module error code start bit. */
    HITLS_CERT_STORE_CTRL_ERR_SET_VERIFY_DEPTH,
    HITLS_CERT_STORE_CTRL_ERR_ADD_CERT_LIST,
    HITLS_CERT_ERR_X509_DUP,                       /**< Failed to duplicate the certificate. */
    HITLS_CERT_ERR_KEY_DUP,                        /**< Failed to duplicate the key. */
    HITLS_CERT_ERR_STORE_DUP,                      /**< Failed to duplicate the store. */
    HITLS_CERT_ERR_CHAIN_DUP,                      /**< Failed to duplicate the certificate chain. */
    HITLS_CERT_CTRL_ERR_GET_ENCODE_LEN,            /**< Failed to obtain the certificate encoding length. */
    HITLS_CERT_CTRL_ERR_GET_PUB_KEY,               /**< Failed to obtain the certificate public key. */
    HITLS_CERT_CTRL_ERR_GET_SIGN_ALGO,             /**< Failed to obtain the signature algorithm. */
    HITLS_CERT_KEY_CTRL_ERR_GET_SIGN_LEN,          /**< Failed to obtain the signature length. */
    HITLS_CERT_KEY_CTRL_ERR_GET_TYPE,              /**< Failed to obtain the key type. */
    HITLS_CERT_KEY_CTRL_ERR_GET_CURVE_NAME,        /**< Failed to obtain the elliptic curve ID. */
    HITLS_CERT_KEY_CTRL_ERR_GET_POINT_FORMAT,      /**< Failed to obtain the point format. */
    HITLS_CERT_KEY_CTRL_ERR_GET_SECBITS,           /**< Failed to obtain security bits. */
    HITLS_CERT_KEY_CTRL_ERR_IS_ENC_USAGE,          /**< Determine whether the certificate fails to be encrypted,
                                                        Applicable to TLCP scenarios. */
    HITLS_CERT_KEY_CTRL_ERR_IS_DIGITAL_SIGN_USAGE,  /**< Determine whether the certificate fails to be digital sign. */
    HITLS_CERT_KEY_CTRL_ERR_IS_KEY_CERT_SIGN_USAGE, /**< Determine whether the certificate fails to be cert sign. */
    HITLS_CERT_KEY_CTRL_ERR_IS_KEY_AGREEMENT_USAGE, /**< Determine whether the certificate fails to be agreement. */
	HITLS_CERT_STORE_CTRL_ERR_SET_VERIFY_FLAGS,     /**< Failed to set the certificate verification flags. */
    HITLS_CERT_KEY_CTRL_ERR_GET_PARAM_ID,           /**< Failed to obtain the parameter ID. */

    HITLS_CERT_ERR_INVALID_KEY_TYPE,                /**< Invalid key type */
    HITLS_CERT_ERR_CHECK_CERT_AND_KEY,              /**< Certificate and private key nonmatch. */
    HITLS_CERT_ERR_NO_CURVE_MATCH,                  /**< Certificate and elliptic curve ID nonmatch. */
    HITLS_CERT_ERR_NO_POINT_FORMAT_MATCH,           /**< Certificate and dot format nonmatch. */
    HITLS_CERT_ERR_NO_SIGN_SCHEME_MATCH,            /**< Certificate and signature algorithm nonmatch. */
    HITLS_CERT_ERR_SELECT_CERTIFICATE,              /**< Failed to select the certificate. */
    HITLS_CERT_ERR_BUILD_CHAIN,                     /**< Failed to construct the certificate chain. */
    HITLS_CERT_ERR_ENCODE_CERT,                     /**< Certificate encoding failure. */
    HITLS_CERT_ERR_PARSE_MSG,                       /**< Certificate decoding failure. */
    HITLS_CERT_ERR_VERIFY_CERT_CHAIN,               /**< Certificate chain verification failure. */
    HITLS_CERT_ERR_CREATE_SIGN,                     /**< Failed to sign using the certificate private key. */
    HITLS_CERT_ERR_VERIFY_SIGN,                     /**< Failed to use the certificate public key
                                                         to verify the signature. */
    HITLS_CERT_ERR_ENCRYPT,                         /**< Failed to encrypt the RSA certificate public key. */
    HITLS_CERT_ERR_DECRYPT,                         /**< Failed to decrypt using the RSA Certificate Private Key */
    HITLS_CERT_ERR_ADD_CHAIN_CERT,                  /**< Failed to add the certificate chain. */
    HITLS_CERT_ERR_MGR_DUP,                         /**< Failed to duplicate the certificate management structure. */
    HITLS_CERT_ERR_INSECURE_SIG_ALG,                /**< Insecure signature algorithm strength. */
    HITLS_CERT_ERR_CA_KEY_WITH_INSECURE_SECBITS,    /**< Insecure CA certificate key security bits. */
    HITLS_CERT_ERR_EE_KEY_WITH_INSECURE_SECBITS,    /**< Insecure EE certificate key security bits. */
    HITLS_CERT_ERR_EXP_CERT,                        /**< No expected certificate included. */
    HITLS_CERT_ERR_ENCODE,                          /**< Failed to encode the certificate. */
    HITLS_CERT_ERR_SET_CERT,                        /**< Failed to set the certificate. */
    HITLS_CERT_ERR_KEYUSAGE,                        /**< Failed to verify the certificate keyusage. */
    HITLS_CERT_ERR_INVALID_STORE_TYPE,              /**< Invalid store type */
    HITLS_CERT_ERR_X509_REF,                        /**< Certificate reference counting error. */
    HITLS_CERT_ERR_NO_KEYUSAGE,                     /**< No keyusage. */
    HITLS_CERT_KEY_CTRL_ERR_IS_DATA_ENC_USAGE,      /**< Determine whether the certificate fails to be data enc. */
    HITLS_CERT_KEY_CTRL_ERR_IS_NON_REPUDIATION_USAGE, /**< Determine whether the certificate fails to be
                                                           non-repudiation. */
    HITLS_CERT_CTRL_ERR_GET_SUBJECT_DN,             /**< Failed to obtain the subject DN of the certificate. */
    HITLS_CERT_STORE_CTRL_ERR_GET_VERIFY_DEPTH,     /**< Get the certificate verification depth error. */
	HITLS_CERT_STORE_CTRL_ERR_GET_VERIFY_FLAGS,    /**< Get the certificate verification flags error. */
    HITLS_CERT_CTRL_ERR_IS_SELF_SIGNED,             /** Determine whether the certificate is a self-signed
                                                        certificate */
    HITLS_CERT_ERR_INSERT_CERTPAIR,                 /**< Certificate insert certPair error. */
    HITLS_CERT_CTRL_ERR_INVALID_CMD,               /**< certificate ctrl invalid command */
	HITLS_CERT_STORE_CTRL_ERR_ADD_CRL_LIST,        /**< Failed to add CRL list to verify store. */
    HITLS_CERT_STORE_CTRL_ERR_CLEAR_CRL_LIST,      /**< Failed to clear CRL list from verify store. */
    HITLS_CERT_STORE_CTRL_ERR_SET_HOST_FLAG,        /**< Failed to set the certificate hostflags. */

    HITLS_CRYPT_FAIL_START = 0x020D0001,           /**< Crypt adaptation module error code start bit. */
    HITLS_CRYPT_ERR_GENERATE_RANDOM,               /**< Failed to generate a random number. */
    HITLS_CRYPT_ERR_HMAC,                          /**< HMAC operation failure. */
    HITLS_CRYPT_ERR_DIGEST,                        /**< Hash operation failure. */
    HITLS_CRYPT_ERR_ENCRYPT,                       /**< Encryption failure. */
    HITLS_CRYPT_ERR_DECRYPT,                       /**< Decryption failure. */
    HITLS_CRYPT_ERR_ENCODE_ECDH_KEY,               /**< Failed to obtain the ECDH public key. */
    HITLS_CRYPT_ERR_CALC_SHARED_KEY,               /**< Failed to calculate the ECDH shared key. */
    HITLS_CRYPT_ERR_ENCODE_DH_KEY,                 /**< Failed to obtain the DH public key. */
    HITLS_CRYPT_ERR_HKDF_EXTRACT,                  /**< HKDF-Extract calculation error. */
    HITLS_CRYPT_ERR_HKDF_EXPAND,                   /**< HKDF-Expand calculation error. */
    HITLS_CRYPT_ERR_KEM_ENCAPSULATE,               /**< KEM-Encapsulate calculation error. */
    HITLS_CRYPT_ERR_KEM_DECAPSULATE,               /**< KEM-Decapsulate calculation error. */
    HITLS_CRYPT_ERR_DH,                            /**< DH failure. */
    HITLS_CRYPT_ERR_KDF,                           /**< KDF failure. */
    HITLS_CRYPT_ERR_GEN_KEY_PAIR,                  /**< Failed to generate key pair */

    HITLS_APP_FAIL_START = 0x020E0001,             /**< APP module error code start bit. */
    HITLS_APP_ERR_TOO_LONG_TO_WRITE,               /**< APP Data written is too long. */
    HITLS_APP_ERR_ZERO_READ_BUF_LEN,               /**< The buffer size read by the APP cannot be 0. */
    HITLS_APP_ERR_WRITE_BAD_RETRY,                 /**< The addresses of the buffers sent twice are inconsistent. */

    HITLS_SESS_FAIL_START = 0x02100001,            /**< Session feature error code start bit. */
    HITLS_SESS_ERR_SESSION_ID_GENRATE,             /**< Session id output error. */
    HITLS_SESS_ERR_DECODE_TICKET,                  /**< Error decoding session ticket object. */
    HITLS_SESS_ERR_SESSION_TICKET_SIZE_INCORRECT,  /**< Session ticket length is incorrect. */
    HITLS_SESS_ERR_SESSION_TICKET_HMAC_FAIL,       /**< Failed to calculate the session ticket hmac. */
    HITLS_SESS_ERR_SESSION_TICKET_KEY_FAIL,        /**< Failed to obtain the ticket key, and then link
                                                        establishment failed, so needs to sent alert. */
    HITLS_SESS_ERR_ENC_VERIFY_RESULT_FAIL,         /**< Failed to verify the encoding result. */
    HITLS_SESS_ERR_ENC_MASTER_SECRET_FAIL,         /**< Failed to encode the master secret. */
    HITLS_SESS_ERR_ENC_EXT_MASTER_SECRET_FAIL,     /**< Failed to encode the extend master secret. */
    HITLS_SESS_ERR_ENC_SESSION_ID_FAIL,            /**< Failed to encode the session ID. */
    HITLS_SESS_ERR_ENC_SESSION_ID_CTX_FAIL,        /**< Failed to encode the session ID context. */
    HITLS_SESS_ERR_ENC_HOST_NAME_FAIL,             /**< Failed to encode the host name. */
    HITLS_SESS_ERR_ENC_TIME_OUT_FAIL,              /**< Failed to encode the time out. */
    HITLS_SESS_ERR_ENC_VERSION_FAIL,               /**< Failed to encode the version. */
    HITLS_SESS_ERR_ENC_CIPHER_SUITE_FAIL,          /**< Failed to encode the ciphersuite. */
    HITLS_SESS_ERR_ENC_START_TIME_FAIL,            /**< Failed to encode the start time. */
    HITLS_SESS_ERR_ENC_PSK_IDENTITY_FAIL,          /**< Failed to encode the PSK identity. */
    HITLS_SESS_ERR_DEC_VERIFY_RESULT_FAIL,         /**< Failed to decode the verify result. */
    HITLS_SESS_ERR_DEC_VERSION_FAIL,               /**< Failed to decode the version. */
    HITLS_SESS_ERR_DEC_CIPHER_SUITE_FAIL,          /**< Fails to decode the cipher suite. */
    HITLS_SESS_ERR_DEC_MASTER_SECRET_FAIL,         /**< Failed to decode the master secret. */
    HITLS_SESS_ERR_DEC_PSK_IDENTITY_FAIL,          /**< Failed to decode the PSK identity. */
    HITLS_SESS_ERR_DEC_START_TIME_FAIL,            /**< Failed to decode the start time. */
    HITLS_SESS_ERR_DEC_TIME_OUT_FAIL,              /**< Failed to decode the time out. */
    HITLS_SESS_ERR_DEC_HOST_NAME_FAIL,             /**< Failed to decode the host name. */
    HITLS_SESS_ERR_DEC_SESSION_ID_CTX_FAIL,        /**< Failed to decode the session ID context. */
    HITLS_SESS_ERR_DEC_SESSION_ID_FAIL,            /**< Failed to decode the session ID. */
    HITLS_SESS_ERR_DEC_EXT_MASTER_SECRET_FAIL,     /**< Failed to decode the extended master secret. */
    HITLS_SESS_ERR_BAD_SESSION,                    /**< Invalid session in the unclosed state. */
    HITLS_SESS_ERR_ENC_PEER_CERT_FAIL,             /**< Failed to encode the peercert. */
    HITLS_SESS_ERR_DEC_PEER_CERT_FAIL,             /**< Failed to decode the peercert. */
    HITLS_SESS_ERR_FLUSH_FAIL,                     /**< Session flush failure. */
    HITLS_SESS_ERR_NOT_FOUND,                      /**< Session not found. */

    HITLS_X509_FAIL_START = 0x02120001,            /**< The X509 feature error code start bit of. */

    HITLS_CERT_SELF_ADAPT_ERR = 0x02130001,
    HITLS_CERT_SELF_ADAPT_INVALID_TIME,
    HITLS_CERT_SELF_ADAPT_UNSUPPORT_FORMAT,
    HITLS_CERT_SELF_ADAPT_BUILD_CERT_CHAIN_ERR,

    HITLS_CALLBACK_CERT_RETRY = 0x02140001,            /**< Certificate callback retry. */
    HITLS_CALLBACK_CERT_ERROR,                         /**< Certificate callback failure. */
    HITLS_CALLBACK_CLIENT_HELLO_ERROR,                 /**< ClientHello callback failure. */
    HITLS_CALLBACK_CLIENT_HELLO_RETRY,                 /**< ClientHello callback retry. */
    HITLS_CALLBACK_CLIENT_HELLO_INVALID_CALL,          /**< Invalid use of HITLS_ClientHelloGet* function. */
    HITLS_CALLBACK_CLIENT_HELLO_EXTENSION_NOT_FOUND,   /**< Extension not found. */
} HITLS_ERROR;

/**
 * @ingroup hitls_error
 * @brief   Obtain the TLS operation error code.
 *
 * @param   ctx [IN] TLS context
 * @param   ret [IN] Return value of the TLS interface called
 * @retval  HITLS_SUCCESS, No error.
 * @retval  HITLS_WANT_CLIENT_HELLO_CB, ClientHello callback needs to be retried.
 * @retval  HITLS_WANT_X509_LOOKUP, Certificate callback needs to be retried.
 * @retval  HITLS_WANT_READ, indicates that the receiving buffer is empty and the interface
 * can be called to continue receiving data.
 * @retval  HITLS_WANT_WRITE, indicates that the sending buffer is full and the interface
 * can be called to continue sending data.
 * @retval  HITLS_ERR_TLS, An unrecoverable fatal error occurs in the TLS protocol, usually a protocol error.
 * @retval  HITLS_ERR_SYSCALL, An unrecoverable I/O error occurs. Generally, the I/O error is caused
 * by the Low level receiving and receiving exception and an unknown error occurs.
 */
int32_t HITLS_GetError(const HITLS_Ctx *ctx, int32_t ret);

#ifdef __cplusplus
}
#endif /* end __cplusplus */

#endif /* end HITLS_ERROR_H */