1*62c56f98SSadaf Ebrahimi/* 2*62c56f98SSadaf Ebrahimi * Error message information 3*62c56f98SSadaf Ebrahimi * 4*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors 5*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 6*62c56f98SSadaf Ebrahimi */ 7*62c56f98SSadaf Ebrahimi 8*62c56f98SSadaf Ebrahimi#include "common.h" 9*62c56f98SSadaf Ebrahimi 10*62c56f98SSadaf Ebrahimi#include "mbedtls/error.h" 11*62c56f98SSadaf Ebrahimi 12*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY) 13*62c56f98SSadaf Ebrahimi 14*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_ERROR_C) 15*62c56f98SSadaf Ebrahimi 16*62c56f98SSadaf Ebrahimi#include "mbedtls/platform.h" 17*62c56f98SSadaf Ebrahimi 18*62c56f98SSadaf Ebrahimi#include <stdio.h> 19*62c56f98SSadaf Ebrahimi#include <string.h> 20*62c56f98SSadaf Ebrahimi 21*62c56f98SSadaf EbrahimiHEADER_INCLUDED 22*62c56f98SSadaf Ebrahimi 23*62c56f98SSadaf Ebrahimiconst char *mbedtls_high_level_strerr(int error_code) 24*62c56f98SSadaf Ebrahimi{ 25*62c56f98SSadaf Ebrahimi int high_level_error_code; 26*62c56f98SSadaf Ebrahimi 27*62c56f98SSadaf Ebrahimi if (error_code < 0) { 28*62c56f98SSadaf Ebrahimi error_code = -error_code; 29*62c56f98SSadaf Ebrahimi } 30*62c56f98SSadaf Ebrahimi 31*62c56f98SSadaf Ebrahimi /* Extract the high-level part from the error code. */ 32*62c56f98SSadaf Ebrahimi high_level_error_code = error_code & 0xFF80; 33*62c56f98SSadaf Ebrahimi 34*62c56f98SSadaf Ebrahimi switch (high_level_error_code) { 35*62c56f98SSadaf Ebrahimi /* Begin Auto-Generated Code. */ 36*62c56f98SSadaf Ebrahimi HIGH_LEVEL_CODE_CHECKS 37*62c56f98SSadaf Ebrahimi /* End Auto-Generated Code. */ 38*62c56f98SSadaf Ebrahimi 39*62c56f98SSadaf Ebrahimi default: 40*62c56f98SSadaf Ebrahimi break; 41*62c56f98SSadaf Ebrahimi } 42*62c56f98SSadaf Ebrahimi 43*62c56f98SSadaf Ebrahimi return NULL; 44*62c56f98SSadaf Ebrahimi} 45*62c56f98SSadaf Ebrahimi 46*62c56f98SSadaf Ebrahimiconst char *mbedtls_low_level_strerr(int error_code) 47*62c56f98SSadaf Ebrahimi{ 48*62c56f98SSadaf Ebrahimi int low_level_error_code; 49*62c56f98SSadaf Ebrahimi 50*62c56f98SSadaf Ebrahimi if (error_code < 0) { 51*62c56f98SSadaf Ebrahimi error_code = -error_code; 52*62c56f98SSadaf Ebrahimi } 53*62c56f98SSadaf Ebrahimi 54*62c56f98SSadaf Ebrahimi /* Extract the low-level part from the error code. */ 55*62c56f98SSadaf Ebrahimi low_level_error_code = error_code & ~0xFF80; 56*62c56f98SSadaf Ebrahimi 57*62c56f98SSadaf Ebrahimi switch (low_level_error_code) { 58*62c56f98SSadaf Ebrahimi /* Begin Auto-Generated Code. */ 59*62c56f98SSadaf Ebrahimi LOW_LEVEL_CODE_CHECKS 60*62c56f98SSadaf Ebrahimi /* End Auto-Generated Code. */ 61*62c56f98SSadaf Ebrahimi 62*62c56f98SSadaf Ebrahimi default: 63*62c56f98SSadaf Ebrahimi break; 64*62c56f98SSadaf Ebrahimi } 65*62c56f98SSadaf Ebrahimi 66*62c56f98SSadaf Ebrahimi return NULL; 67*62c56f98SSadaf Ebrahimi} 68*62c56f98SSadaf Ebrahimi 69*62c56f98SSadaf Ebrahimivoid mbedtls_strerror(int ret, char *buf, size_t buflen) 70*62c56f98SSadaf Ebrahimi{ 71*62c56f98SSadaf Ebrahimi size_t len; 72*62c56f98SSadaf Ebrahimi int use_ret; 73*62c56f98SSadaf Ebrahimi const char *high_level_error_description = NULL; 74*62c56f98SSadaf Ebrahimi const char *low_level_error_description = NULL; 75*62c56f98SSadaf Ebrahimi 76*62c56f98SSadaf Ebrahimi if (buflen == 0) { 77*62c56f98SSadaf Ebrahimi return; 78*62c56f98SSadaf Ebrahimi } 79*62c56f98SSadaf Ebrahimi 80*62c56f98SSadaf Ebrahimi memset(buf, 0x00, buflen); 81*62c56f98SSadaf Ebrahimi 82*62c56f98SSadaf Ebrahimi if (ret < 0) { 83*62c56f98SSadaf Ebrahimi ret = -ret; 84*62c56f98SSadaf Ebrahimi } 85*62c56f98SSadaf Ebrahimi 86*62c56f98SSadaf Ebrahimi if (ret & 0xFF80) { 87*62c56f98SSadaf Ebrahimi use_ret = ret & 0xFF80; 88*62c56f98SSadaf Ebrahimi 89*62c56f98SSadaf Ebrahimi // Translate high level error code. 90*62c56f98SSadaf Ebrahimi high_level_error_description = mbedtls_high_level_strerr(ret); 91*62c56f98SSadaf Ebrahimi 92*62c56f98SSadaf Ebrahimi if (high_level_error_description == NULL) { 93*62c56f98SSadaf Ebrahimi mbedtls_snprintf(buf, buflen, "UNKNOWN ERROR CODE (%04X)", (unsigned int) use_ret); 94*62c56f98SSadaf Ebrahimi } else { 95*62c56f98SSadaf Ebrahimi mbedtls_snprintf(buf, buflen, "%s", high_level_error_description); 96*62c56f98SSadaf Ebrahimi } 97*62c56f98SSadaf Ebrahimi 98*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_SSL_TLS_C) 99*62c56f98SSadaf Ebrahimi // Early return in case of a fatal error - do not try to translate low 100*62c56f98SSadaf Ebrahimi // level code. 101*62c56f98SSadaf Ebrahimi if (use_ret == -(MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE)) { 102*62c56f98SSadaf Ebrahimi return; 103*62c56f98SSadaf Ebrahimi } 104*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_SSL_TLS_C */ 105*62c56f98SSadaf Ebrahimi } 106*62c56f98SSadaf Ebrahimi 107*62c56f98SSadaf Ebrahimi use_ret = ret & ~0xFF80; 108*62c56f98SSadaf Ebrahimi 109*62c56f98SSadaf Ebrahimi if (use_ret == 0) { 110*62c56f98SSadaf Ebrahimi return; 111*62c56f98SSadaf Ebrahimi } 112*62c56f98SSadaf Ebrahimi 113*62c56f98SSadaf Ebrahimi // If high level code is present, make a concatenation between both 114*62c56f98SSadaf Ebrahimi // error strings. 115*62c56f98SSadaf Ebrahimi // 116*62c56f98SSadaf Ebrahimi len = strlen(buf); 117*62c56f98SSadaf Ebrahimi 118*62c56f98SSadaf Ebrahimi if (len > 0) { 119*62c56f98SSadaf Ebrahimi if (buflen - len < 5) { 120*62c56f98SSadaf Ebrahimi return; 121*62c56f98SSadaf Ebrahimi } 122*62c56f98SSadaf Ebrahimi 123*62c56f98SSadaf Ebrahimi mbedtls_snprintf(buf + len, buflen - len, " : "); 124*62c56f98SSadaf Ebrahimi 125*62c56f98SSadaf Ebrahimi buf += len + 3; 126*62c56f98SSadaf Ebrahimi buflen -= len + 3; 127*62c56f98SSadaf Ebrahimi } 128*62c56f98SSadaf Ebrahimi 129*62c56f98SSadaf Ebrahimi // Translate low level error code. 130*62c56f98SSadaf Ebrahimi low_level_error_description = mbedtls_low_level_strerr(ret); 131*62c56f98SSadaf Ebrahimi 132*62c56f98SSadaf Ebrahimi if (low_level_error_description == NULL) { 133*62c56f98SSadaf Ebrahimi mbedtls_snprintf(buf, buflen, "UNKNOWN ERROR CODE (%04X)", (unsigned int) use_ret); 134*62c56f98SSadaf Ebrahimi } else { 135*62c56f98SSadaf Ebrahimi mbedtls_snprintf(buf, buflen, "%s", low_level_error_description); 136*62c56f98SSadaf Ebrahimi } 137*62c56f98SSadaf Ebrahimi} 138*62c56f98SSadaf Ebrahimi 139*62c56f98SSadaf Ebrahimi#else /* MBEDTLS_ERROR_C */ 140*62c56f98SSadaf Ebrahimi 141*62c56f98SSadaf Ebrahimi/* 142*62c56f98SSadaf Ebrahimi * Provide a dummy implementation when MBEDTLS_ERROR_C is not defined 143*62c56f98SSadaf Ebrahimi */ 144*62c56f98SSadaf Ebrahimivoid mbedtls_strerror(int ret, char *buf, size_t buflen) 145*62c56f98SSadaf Ebrahimi{ 146*62c56f98SSadaf Ebrahimi ((void) ret); 147*62c56f98SSadaf Ebrahimi 148*62c56f98SSadaf Ebrahimi if (buflen > 0) { 149*62c56f98SSadaf Ebrahimi buf[0] = '\0'; 150*62c56f98SSadaf Ebrahimi } 151*62c56f98SSadaf Ebrahimi} 152*62c56f98SSadaf Ebrahimi 153*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_ERROR_C */ 154*62c56f98SSadaf Ebrahimi 155*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_HOOKS) 156*62c56f98SSadaf Ebrahimivoid (*mbedtls_test_hook_error_add)(int, int, const char *, int); 157*62c56f98SSadaf Ebrahimi#endif 158*62c56f98SSadaf Ebrahimi 159*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_ERROR_C || MBEDTLS_ERROR_STRERROR_DUMMY */ 160