blob: 781e72a919e421af693bffd4c1aecd0cb31b8bb7 [file] [log] [blame]
Paul Bakker9d781402011-05-09 16:17:09 +00001/*
2 * Error message information
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Paul Bakker9d781402011-05-09 16:17:09 +00006 */
7
Gilles Peskinedb09ef62020-06-03 01:43:33 +02008#include "common.h"
Paul Bakker9d781402011-05-09 16:17:09 +00009
Gilles Peskine67aed9a2020-11-09 15:14:10 +010010#include "mbedtls/error.h"
11
12#if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY)
13
Gilles Peskineb64e0fe2020-11-09 15:14:10 +010014#if defined(MBEDTLS_ERROR_C)
Paul Bakker0464dd92014-07-09 10:16:18 +020015
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000016#include "mbedtls/platform.h"
Rich Evans6aa04bc2015-01-30 11:18:42 +000017
Paul Bakkerdaae3b72015-02-08 15:49:54 +010018#include <stdio.h>
Gilles Peskine67aed9a2020-11-09 15:14:10 +010019#include <string.h>
Paul Bakker9d781402011-05-09 16:17:09 +000020
Manuel Pégourié-Gonnardf5dc8ec2015-02-13 14:32:17 +000021HEADER_INCLUDED
Paul Bakkerd0a345e2011-11-10 13:03:42 +000022
Gilles Peskine449bd832023-01-11 14:50:10 +010023const char *mbedtls_high_level_strerr(int error_code)
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070024{
Gaurav Aggarwal6ea4fc72020-04-20 16:03:46 -070025 int high_level_error_code;
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070026
Gilles Peskine449bd832023-01-11 14:50:10 +010027 if (error_code < 0) {
Gaurav Aggarwal6ea4fc72020-04-20 16:03:46 -070028 error_code = -error_code;
Gilles Peskine449bd832023-01-11 14:50:10 +010029 }
Gaurav Aggarwal6ea4fc72020-04-20 16:03:46 -070030
31 /* Extract the high-level part from the error code. */
32 high_level_error_code = error_code & 0xFF80;
33
Gilles Peskine449bd832023-01-11 14:50:10 +010034 switch (high_level_error_code) {
35 /* Begin Auto-Generated Code. */
36 HIGH_LEVEL_CODE_CHECKS
Gaurav Aggarwal3d02db22020-04-11 17:14:03 -070037 /* End Auto-Generated Code. */
Gaurav Aggarwala4a2aa52020-04-09 11:39:04 -070038
39 default:
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070040 break;
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070041 }
42
Gilles Peskine449bd832023-01-11 14:50:10 +010043 return NULL;
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070044}
45
Gilles Peskine449bd832023-01-11 14:50:10 +010046const char *mbedtls_low_level_strerr(int error_code)
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070047{
Gaurav Aggarwal6ea4fc72020-04-20 16:03:46 -070048 int low_level_error_code;
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070049
Gilles Peskine449bd832023-01-11 14:50:10 +010050 if (error_code < 0) {
Gaurav Aggarwal6ea4fc72020-04-20 16:03:46 -070051 error_code = -error_code;
Gilles Peskine449bd832023-01-11 14:50:10 +010052 }
Gaurav Aggarwal6ea4fc72020-04-20 16:03:46 -070053
54 /* Extract the low-level part from the error code. */
55 low_level_error_code = error_code & ~0xFF80;
56
Gilles Peskine449bd832023-01-11 14:50:10 +010057 switch (low_level_error_code) {
58 /* Begin Auto-Generated Code. */
59 LOW_LEVEL_CODE_CHECKS
Gaurav Aggarwal3d02db22020-04-11 17:14:03 -070060 /* End Auto-Generated Code. */
Gaurav Aggarwala4a2aa52020-04-09 11:39:04 -070061
62 default:
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070063 break;
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070064 }
65
Gilles Peskine449bd832023-01-11 14:50:10 +010066 return NULL;
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070067}
68
Gilles Peskine449bd832023-01-11 14:50:10 +010069void mbedtls_strerror(int ret, char *buf, size_t buflen)
Paul Bakker9d781402011-05-09 16:17:09 +000070{
71 size_t len;
72 int use_ret;
Gilles Peskine449bd832023-01-11 14:50:10 +010073 const char *high_level_error_description = NULL;
74 const char *low_level_error_description = NULL;
Paul Bakker9d781402011-05-09 16:17:09 +000075
Gilles Peskine449bd832023-01-11 14:50:10 +010076 if (buflen == 0) {
Paul Bakkerb9cfaa02013-10-11 18:58:55 +020077 return;
Gilles Peskine449bd832023-01-11 14:50:10 +010078 }
Paul Bakkerb9cfaa02013-10-11 18:58:55 +020079
Gilles Peskine449bd832023-01-11 14:50:10 +010080 memset(buf, 0x00, buflen);
Paul Bakkerb9cfaa02013-10-11 18:58:55 +020081
Gilles Peskine449bd832023-01-11 14:50:10 +010082 if (ret < 0) {
Paul Bakker9d781402011-05-09 16:17:09 +000083 ret = -ret;
Gilles Peskine449bd832023-01-11 14:50:10 +010084 }
Paul Bakker9d781402011-05-09 16:17:09 +000085
Gilles Peskine449bd832023-01-11 14:50:10 +010086 if (ret & 0xFF80) {
Paul Bakker9d781402011-05-09 16:17:09 +000087 use_ret = ret & 0xFF80;
88
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070089 // Translate high level error code.
Gilles Peskine449bd832023-01-11 14:50:10 +010090 high_level_error_description = mbedtls_high_level_strerr(ret);
Manuel Pégourié-Gonnardfe671f42014-04-11 18:06:44 +020091
Gilles Peskine449bd832023-01-11 14:50:10 +010092 if (high_level_error_description == NULL) {
93 mbedtls_snprintf(buf, buflen, "UNKNOWN ERROR CODE (%04X)", (unsigned int) use_ret);
94 } else {
95 mbedtls_snprintf(buf, buflen, "%s", high_level_error_description);
96 }
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070097
Gaurav Aggarwala4a2aa52020-04-09 11:39:04 -070098#if defined(MBEDTLS_SSL_TLS_C)
Gaurav Aggarwala9f64002020-04-09 01:44:52 -070099 // Early return in case of a fatal error - do not try to translate low
100 // level code.
Gilles Peskine449bd832023-01-11 14:50:10 +0100101 if (use_ret == -(MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE)) {
Gaurav Aggarwala9f64002020-04-09 01:44:52 -0700102 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100103 }
Gaurav Aggarwala4a2aa52020-04-09 11:39:04 -0700104#endif /* MBEDTLS_SSL_TLS_C */
Paul Bakker9d781402011-05-09 16:17:09 +0000105 }
106
107 use_ret = ret & ~0xFF80;
108
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 if (use_ret == 0) {
Paul Bakker9d781402011-05-09 16:17:09 +0000110 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100111 }
Paul Bakker9d781402011-05-09 16:17:09 +0000112
113 // If high level code is present, make a concatenation between both
114 // error strings.
115 //
Gilles Peskine449bd832023-01-11 14:50:10 +0100116 len = strlen(buf);
Paul Bakker9d781402011-05-09 16:17:09 +0000117
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 if (len > 0) {
119 if (buflen - len < 5) {
Paul Bakker9d781402011-05-09 16:17:09 +0000120 return;
Gilles Peskine449bd832023-01-11 14:50:10 +0100121 }
Paul Bakker9d781402011-05-09 16:17:09 +0000122
Gilles Peskine449bd832023-01-11 14:50:10 +0100123 mbedtls_snprintf(buf + len, buflen - len, " : ");
Paul Bakker9d781402011-05-09 16:17:09 +0000124
125 buf += len + 3;
126 buflen -= len + 3;
127 }
128
Gaurav Aggarwala9f64002020-04-09 01:44:52 -0700129 // Translate low level error code.
Gilles Peskine449bd832023-01-11 14:50:10 +0100130 low_level_error_description = mbedtls_low_level_strerr(ret);
Manuel Pégourié-Gonnardfe671f42014-04-11 18:06:44 +0200131
Gilles Peskine449bd832023-01-11 14:50:10 +0100132 if (low_level_error_description == NULL) {
133 mbedtls_snprintf(buf, buflen, "UNKNOWN ERROR CODE (%04X)", (unsigned int) use_ret);
134 } else {
135 mbedtls_snprintf(buf, buflen, "%s", low_level_error_description);
136 }
Paul Bakker9d781402011-05-09 16:17:09 +0000137}
138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200139#else /* MBEDTLS_ERROR_C */
Paul Bakkera0234372013-03-20 14:42:21 +0100140
Paul Bakkera0234372013-03-20 14:42:21 +0100141/*
Tom Cosgrovece7f18c2022-07-28 05:50:56 +0100142 * Provide a dummy implementation when MBEDTLS_ERROR_C is not defined
Paul Bakkera0234372013-03-20 14:42:21 +0100143 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100144void mbedtls_strerror(int ret, char *buf, size_t buflen)
Paul Bakkera0234372013-03-20 14:42:21 +0100145{
146 ((void) ret);
147
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 if (buflen > 0) {
Paul Bakkera0234372013-03-20 14:42:21 +0100149 buf[0] = '\0';
Gilles Peskine449bd832023-01-11 14:50:10 +0100150 }
Paul Bakkera0234372013-03-20 14:42:21 +0100151}
152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153#endif /* MBEDTLS_ERROR_C */
Gilles Peskine67aed9a2020-11-09 15:14:10 +0100154
Chris Jonesef018522021-04-12 17:27:18 +0100155#if defined(MBEDTLS_TEST_HOOKS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100156void (*mbedtls_test_hook_error_add)(int, int, const char *, int);
Chris Jonesef018522021-04-12 17:27:18 +0100157#endif
158
Gilles Peskine67aed9a2020-11-09 15:14:10 +0100159#endif /* MBEDTLS_ERROR_C || MBEDTLS_ERROR_STRERROR_DUMMY */