• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * \file error.h
3  *
4  * \brief Error to string translation
5  */
6 /*
7  *  Copyright The Mbed TLS Contributors
8  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
9  */
10 #ifndef MBEDTLS_ERROR_H
11 #define MBEDTLS_ERROR_H
12 
13 #if !defined(MBEDTLS_CONFIG_FILE)
14 #include "mbedtls/config.h"
15 #else
16 #include MBEDTLS_CONFIG_FILE
17 #endif
18 
19 #include <stddef.h>
20 
21 #if (defined(__ARMCC_VERSION) || defined(_MSC_VER)) && \
22     !defined(inline) && !defined(__cplusplus)
23 #define inline __inline
24 #endif
25 
26 /**
27  * Error code layout.
28  *
29  * Currently we try to keep all error codes within the negative space of 16
30  * bits signed integers to support all platforms (-0x0001 - -0x7FFF). In
31  * addition we'd like to give two layers of information on the error if
32  * possible.
33  *
34  * For that purpose the error codes are segmented in the following manner:
35  *
36  * 16 bit error code bit-segmentation
37  *
38  * 1 bit  - Unused (sign bit)
39  * 3 bits - High level module ID
40  * 5 bits - Module-dependent error code
41  * 7 bits - Low level module errors
42  *
43  * For historical reasons, low-level error codes are divided in even and odd,
44  * even codes were assigned first, and -1 is reserved for other errors.
45  *
46  * Low-level module errors (0x0002-0x007E, 0x0001-0x007F)
47  *
48  * Module   Nr  Codes assigned
49  * ERROR     2  0x006E          0x0001
50  * MPI       7  0x0002-0x0010
51  * GCM       3  0x0012-0x0014   0x0013-0x0013
52  * BLOWFISH  3  0x0016-0x0018   0x0017-0x0017
53  * THREADING 3  0x001A-0x001E
54  * AES       5  0x0020-0x0022   0x0021-0x0025
55  * CAMELLIA  3  0x0024-0x0026   0x0027-0x0027
56  * XTEA      2  0x0028-0x0028   0x0029-0x0029
57  * BASE64    2  0x002A-0x002C
58  * OID       1  0x002E-0x002E   0x000B-0x000B
59  * PADLOCK   1  0x0030-0x0030
60  * DES       2  0x0032-0x0032   0x0033-0x0033
61  * CTR_DBRG  4  0x0034-0x003A
62  * ENTROPY   3  0x003C-0x0040   0x003D-0x003F
63  * NET      13  0x0042-0x0052   0x0043-0x0049
64  * ARIA      4  0x0058-0x005E
65  * ASN1      7  0x0060-0x006C
66  * CMAC      1  0x007A-0x007A
67  * PBKDF2    1  0x007C-0x007C
68  * HMAC_DRBG 4                  0x0003-0x0009
69  * CCM       3                  0x000D-0x0011
70  * ARC4      1                  0x0019-0x0019
71  * MD2       1                  0x002B-0x002B
72  * MD4       1                  0x002D-0x002D
73  * MD5       1                  0x002F-0x002F
74  * RIPEMD160 1                  0x0031-0x0031
75  * SHA1      1                  0x0035-0x0035 0x0073-0x0073
76  * SHA256    1                  0x0037-0x0037 0x0074-0x0074
77  * SHA512    1                  0x0039-0x0039 0x0075-0x0075
78  * CHACHA20  3                  0x0051-0x0055
79  * POLY1305  3                  0x0057-0x005B
80  * CHACHAPOLY 2 0x0054-0x0056
81  * PLATFORM  2  0x0070-0x0072
82  *
83  * High-level module nr (3 bits - 0x0...-0x7...)
84  * Name      ID  Nr of Errors
85  * PEM       1   9
86  * PKCS#12   1   4 (Started from top)
87  * X509      2   20
88  * PKCS5     2   4 (Started from top)
89  * DHM       3   11
90  * PK        3   15 (Started from top)
91  * RSA       4   11
92  * ECP       4   10 (Started from top)
93  * MD        5   5
94  * HKDF      5   1 (Started from top)
95  * SSL       5   2 (Started from 0x5F00)
96  * CIPHER    6   8 (Started from 0x6080)
97  * SSL       6   24 (Started from top, plus 0x6000)
98  * SSL       7   32
99  *
100  * Module dependent error code (5 bits 0x.00.-0x.F8.)
101  */
102 
103 #ifdef __cplusplus
104 extern "C" {
105 #endif
106 
107 /** Generic error */
108 #define MBEDTLS_ERR_ERROR_GENERIC_ERROR       -0x0001
109 /** This is a bug in the library */
110 #define MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED -0x006E
111 
112 /**
113  * \brief Combines a high-level and low-level error code together.
114  *
115  *        Wrapper macro for mbedtls_error_add(). See that function for
116  *        more details.
117  */
118 #define MBEDTLS_ERROR_ADD(high, low) \
119     mbedtls_error_add(high, low, __FILE__, __LINE__)
120 
121 #if defined(MBEDTLS_TEST_HOOKS)
122 /**
123  * \brief Testing hook called before adding/combining two error codes together.
124  *        Only used when invasive testing is enabled via MBEDTLS_TEST_HOOKS.
125  */
126 extern void (*mbedtls_test_hook_error_add)(int, int, const char *, int);
127 #endif
128 
129 /**
130  * \brief Combines a high-level and low-level error code together.
131  *
132  *        This function can be called directly however it is usually
133  *        called via the #MBEDTLS_ERROR_ADD macro.
134  *
135  *        While a value of zero is not a negative error code, it is still an
136  *        error code (that denotes success) and can be combined with both a
137  *        negative error code or another value of zero.
138  *
139  * \note  When invasive testing is enabled via #MBEDTLS_TEST_HOOKS, also try to
140  *        call \link mbedtls_test_hook_error_add \endlink.
141  *
142  * \param high      high-level error code. See error.h for more details.
143  * \param low       low-level error code. See error.h for more details.
144  * \param file      file where this error code addition occurred.
145  * \param line      line where this error code addition occurred.
146  */
mbedtls_error_add(int high,int low,const char * file,int line)147 static inline int mbedtls_error_add(int high, int low,
148                                     const char *file, int line)
149 {
150 #if defined(MBEDTLS_TEST_HOOKS)
151     if (*mbedtls_test_hook_error_add != NULL) {
152         (*mbedtls_test_hook_error_add)(high, low, file, line);
153     }
154 #endif
155     (void) file;
156     (void) line;
157 
158     return high + low;
159 }
160 
161 /**
162  * \brief Translate an Mbed TLS error code into a string representation.
163  *        The result is truncated if necessary and always includes a
164  *        terminating null byte.
165  *
166  * \param errnum    error code
167  * \param buffer    buffer to place representation in
168  * \param buflen    length of the buffer
169  */
170 void mbedtls_strerror(int errnum, char *buffer, size_t buflen);
171 
172 /**
173  * \brief Translate the high-level part of an Mbed TLS error code into a string
174  *        representation.
175  *
176  * This function returns a const pointer to an un-modifiable string. The caller
177  * must not try to modify the string. It is intended to be used mostly for
178  * logging purposes.
179  *
180  * \param error_code    error code
181  *
182  * \return The string representation of the error code, or \c NULL if the error
183  *         code is unknown.
184  */
185 const char *mbedtls_high_level_strerr(int error_code);
186 
187 /**
188  * \brief Translate the low-level part of an Mbed TLS error code into a string
189  *        representation.
190  *
191  * This function returns a const pointer to an un-modifiable string. The caller
192  * must not try to modify the string. It is intended to be used mostly for
193  * logging purposes.
194  *
195  * \param error_code    error code
196  *
197  * \return The string representation of the error code, or \c NULL if the error
198  *         code is unknown.
199  */
200 const char *mbedtls_low_level_strerr(int error_code);
201 
202 #ifdef __cplusplus
203 }
204 #endif
205 
206 #endif /* error.h */
207