]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/errors.c
Import bearssl-6433cc2
[FreeBSD/FreeBSD.git] / tools / errors.c
1 /*
2  * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining 
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be 
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <stdint.h>
29 #include <errno.h>
30
31 #include "brssl.h"
32 #include "bearssl.h"
33
34 static struct {
35         int err;
36         const char *name;
37         const char *comment;
38 } errors[] = {
39         {
40                 BR_ERR_BAD_PARAM,
41                 "BR_ERR_BAD_PARAM",
42                 "Caller-provided parameter is incorrect."
43         }, {
44                 BR_ERR_BAD_STATE,
45                 "BR_ERR_BAD_STATE",
46                 "Operation requested by the caller cannot be applied with"
47                 " the current context state (e.g. reading data while"
48                 " outgoing data is waiting to be sent)."
49         }, {
50                 BR_ERR_UNSUPPORTED_VERSION,
51                 "BR_ERR_UNSUPPORTED_VERSION",
52                 "Incoming protocol or record version is unsupported."
53         }, {
54                 BR_ERR_BAD_VERSION,
55                 "BR_ERR_BAD_VERSION",
56                 "Incoming record version does not match the expected version."
57         }, {
58                 BR_ERR_BAD_LENGTH,
59                 "BR_ERR_BAD_LENGTH",
60                 "Incoming record length is invalid."
61         }, {
62                 BR_ERR_TOO_LARGE,
63                 "BR_ERR_TOO_LARGE",
64                 "Incoming record is too large to be processed, or buffer"
65                 " is too small for the handshake message to send."
66         }, {
67                 BR_ERR_BAD_MAC,
68                 "BR_ERR_BAD_MAC",
69                 "Decryption found an invalid padding, or the record MAC is"
70                 " not correct."
71         }, {
72                 BR_ERR_NO_RANDOM,
73                 "BR_ERR_NO_RANDOM",
74                 "No initial entropy was provided, and none can be obtained"
75                 " from the OS."
76         }, {
77                 BR_ERR_UNKNOWN_TYPE,
78                 "BR_ERR_UNKNOWN_TYPE",
79                 "Incoming record type is unknown."
80         }, {
81                 BR_ERR_UNEXPECTED,
82                 "BR_ERR_UNEXPECTED",
83                 "Incoming record or message has wrong type with regards to"
84                 " the current engine state."
85         }, {
86                 BR_ERR_BAD_CCS,
87                 "BR_ERR_BAD_CCS",
88                 "ChangeCipherSpec message from the peer has invalid contents."
89         }, {
90                 BR_ERR_BAD_ALERT,
91                 "BR_ERR_BAD_ALERT",
92                 "Alert message from the peer has invalid contents"
93                 " (odd length)."
94         }, {
95                 BR_ERR_BAD_HANDSHAKE,
96                 "BR_ERR_BAD_HANDSHAKE",
97                 "Incoming handshake message decoding failed."
98         }, {
99                 BR_ERR_OVERSIZED_ID,
100                 "BR_ERR_OVERSIZED_ID",
101                 "ServerHello contains a session ID which is larger than"
102                 " 32 bytes."
103         }, {
104                 BR_ERR_BAD_CIPHER_SUITE,
105                 "BR_ERR_BAD_CIPHER_SUITE",
106                 "Server wants to use a cipher suite that we did not claim"
107                 " to support. This is also reported if we tried to advertise"
108                 " a cipher suite that we do not support."
109         }, {
110                 BR_ERR_BAD_COMPRESSION,
111                 "BR_ERR_BAD_COMPRESSION",
112                 "Server wants to use a compression that we did not claim"
113                 " to support."
114         }, {
115                 BR_ERR_BAD_FRAGLEN,
116                 "BR_ERR_BAD_FRAGLEN",
117                 "Server's max fragment length does not match client's."
118         }, {
119                 BR_ERR_BAD_SECRENEG,
120                 "BR_ERR_BAD_SECRENEG",
121                 "Secure renegotiation failed."
122         }, {
123                 BR_ERR_EXTRA_EXTENSION,
124                 "BR_ERR_EXTRA_EXTENSION",
125                 "Server sent an extension type that we did not announce,"
126                 " or used the same extension type several times in a"
127                 " single ServerHello."
128         }, {
129                 BR_ERR_BAD_SNI,
130                 "BR_ERR_BAD_SNI",
131                 "Invalid Server Name Indication contents (when used by"
132                 " the server, this extension shall be empty)."
133         }, {
134                 BR_ERR_BAD_HELLO_DONE,
135                 "BR_ERR_BAD_HELLO_DONE",
136                 "Invalid ServerHelloDone from the server (length is not 0)."
137         }, {
138                 BR_ERR_LIMIT_EXCEEDED,
139                 "BR_ERR_LIMIT_EXCEEDED",
140                 "Internal limit exceeded (e.g. server's public key is too"
141                 " large)."
142         }, {
143                 BR_ERR_BAD_FINISHED,
144                 "BR_ERR_BAD_FINISHED",
145                 "Finished message from peer does not match the expected"
146                 " value."
147         }, {
148                 BR_ERR_RESUME_MISMATCH,
149                 "BR_ERR_RESUME_MISMATCH",
150                 "Session resumption attempt with distinct version or cipher"
151                 " suite."
152         }, {
153                 BR_ERR_INVALID_ALGORITHM,
154                 "BR_ERR_INVALID_ALGORITHM",
155                 "Unsupported or invalid algorithm (ECDHE curve, signature"
156                 " algorithm, hash function)."
157         }, {
158                 BR_ERR_BAD_SIGNATURE,
159                 "BR_ERR_BAD_SIGNATURE",
160                 "Invalid signature in ServerKeyExchange or"
161                 " CertificateVerify message."
162         }, {
163                 BR_ERR_WRONG_KEY_USAGE,
164                 "BR_ERR_WRONG_KEY_USAGE",
165                 "Peer's public key does not have the proper type or is"
166                 " not allowed for the requested operation."
167         }, {
168                 BR_ERR_NO_CLIENT_AUTH,
169                 "BR_ERR_NO_CLIENT_AUTH",
170                 "Client did not send a certificate upon request, or the"
171                 " client certificate could not be validated."
172         }, {
173                 BR_ERR_IO,
174                 "BR_ERR_IO",
175                 "I/O error or premature close on transport stream."
176         }, {
177                 BR_ERR_X509_INVALID_VALUE,
178                 "BR_ERR_X509_INVALID_VALUE",
179                 "Invalid value in an ASN.1 structure."
180         },
181         {
182                 BR_ERR_X509_TRUNCATED,
183                 "BR_ERR_X509_TRUNCATED",
184                 "Truncated certificate or other ASN.1 object."
185         },
186         {
187                 BR_ERR_X509_EMPTY_CHAIN,
188                 "BR_ERR_X509_EMPTY_CHAIN",
189                 "Empty certificate chain (no certificate at all)."
190         },
191         {
192                 BR_ERR_X509_INNER_TRUNC,
193                 "BR_ERR_X509_INNER_TRUNC",
194                 "Decoding error: inner element extends beyond outer element"
195                 " size."
196         },
197         {
198                 BR_ERR_X509_BAD_TAG_CLASS,
199                 "BR_ERR_X509_BAD_TAG_CLASS",
200                 "Decoding error: unsupported tag class (application or"
201                 " private)."
202         },
203         {
204                 BR_ERR_X509_BAD_TAG_VALUE,
205                 "BR_ERR_X509_BAD_TAG_VALUE",
206                 "Decoding error: unsupported tag value."
207         },
208         {
209                 BR_ERR_X509_INDEFINITE_LENGTH,
210                 "BR_ERR_X509_INDEFINITE_LENGTH",
211                 "Decoding error: indefinite length."
212         },
213         {
214                 BR_ERR_X509_EXTRA_ELEMENT,
215                 "BR_ERR_X509_EXTRA_ELEMENT",
216                 "Decoding error: extraneous element."
217         },
218         {
219                 BR_ERR_X509_UNEXPECTED,
220                 "BR_ERR_X509_UNEXPECTED",
221                 "Decoding error: unexpected element."
222         },
223         {
224                 BR_ERR_X509_NOT_CONSTRUCTED,
225                 "BR_ERR_X509_NOT_CONSTRUCTED",
226                 "Decoding error: expected constructed element, but is"
227                 " primitive."
228         },
229         {
230                 BR_ERR_X509_NOT_PRIMITIVE,
231                 "BR_ERR_X509_NOT_PRIMITIVE",
232                 "Decoding error: expected primitive element, but is"
233                 " constructed."
234         },
235         {
236                 BR_ERR_X509_PARTIAL_BYTE,
237                 "BR_ERR_X509_PARTIAL_BYTE",
238                 "Decoding error: BIT STRING length is not multiple of 8."
239         },
240         {
241                 BR_ERR_X509_BAD_BOOLEAN,
242                 "BR_ERR_X509_BAD_BOOLEAN",
243                 "Decoding error: BOOLEAN value has invalid length."
244         },
245         {
246                 BR_ERR_X509_OVERFLOW,
247                 "BR_ERR_X509_OVERFLOW",
248                 "Decoding error: value is off-limits."
249         },
250         {
251                 BR_ERR_X509_BAD_DN,
252                 "BR_ERR_X509_BAD_DN",
253                 "Invalid distinguished name."
254         },
255         {
256                 BR_ERR_X509_BAD_TIME,
257                 "BR_ERR_X509_BAD_TIME",
258                 "Invalid date/time representation."
259         },
260         {
261                 BR_ERR_X509_UNSUPPORTED,
262                 "BR_ERR_X509_UNSUPPORTED",
263                 "Certificate contains unsupported features that cannot be"
264                 " ignored."
265         },
266         {
267                 BR_ERR_X509_LIMIT_EXCEEDED,
268                 "BR_ERR_X509_LIMIT_EXCEEDED",
269                 "Key or signature size exceeds internal limits."
270         },
271         {
272                 BR_ERR_X509_WRONG_KEY_TYPE,
273                 "BR_ERR_X509_WRONG_KEY_TYPE",
274                 "Key type does not match that which was expected."
275         },
276         {
277                 BR_ERR_X509_BAD_SIGNATURE,
278                 "BR_ERR_X509_BAD_SIGNATURE",
279                 "Signature is invalid."
280         },
281         {
282                 BR_ERR_X509_TIME_UNKNOWN,
283                 "BR_ERR_X509_TIME_UNKNOWN",
284                 "Validation time is unknown."
285         },
286         {
287                 BR_ERR_X509_EXPIRED,
288                 "BR_ERR_X509_EXPIRED",
289                 "Certificate is expired or not yet valid."
290         },
291         {
292                 BR_ERR_X509_DN_MISMATCH,
293                 "BR_ERR_X509_DN_MISMATCH",
294                 "Issuer/Subject DN mismatch in the chain."
295         },
296         {
297                 BR_ERR_X509_BAD_SERVER_NAME,
298                 "BR_ERR_X509_BAD_SERVER_NAME",
299                 "Expected server name was not found in the chain."
300         },
301         {
302                 BR_ERR_X509_CRITICAL_EXTENSION,
303                 "BR_ERR_X509_CRITICAL_EXTENSION",
304                 "Unknown critical extension in certificate."
305         },
306         {
307                 BR_ERR_X509_NOT_CA,
308                 "BR_ERR_X509_NOT_CA",
309                 "Not a CA, or path length constraint violation."
310         },
311         {
312                 BR_ERR_X509_FORBIDDEN_KEY_USAGE,
313                 "BR_ERR_X509_FORBIDDEN_KEY_USAGE",
314                 "Key Usage extension prohibits intended usage."
315         },
316         {
317                 BR_ERR_X509_WEAK_PUBLIC_KEY,
318                 "BR_ERR_X509_WEAK_PUBLIC_KEY",
319                 "Public key found in certificate is too small."
320         },
321         {
322                 BR_ERR_X509_NOT_TRUSTED,
323                 "BR_ERR_X509_NOT_TRUSTED",
324                 "Chain could not be linked to a trust anchor."
325         },
326         { 0, 0, 0 }
327 };
328
329 /* see brssl.h */
330 const char *
331 find_error_name(int err, const char **comment)
332 {
333         size_t u;
334
335         for (u = 0; errors[u].name; u ++) {
336                 if (errors[u].err == err) {
337                         if (comment != NULL) {
338                                 *comment = errors[u].comment;
339                         }
340                         return errors[u].name;
341                 }
342         }
343         return NULL;
344 }