1 /** 2 * \file debug.h 3 * 4 * \brief Functions for controlling and providing debug output from the library. 5 */ 6 /* 7 * Copyright The Mbed TLS Contributors 8 * SPDX-License-Identifier: Apache-2.0 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); you may 11 * not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 18 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 */ 22 #ifndef MBEDTLS_DEBUG_H 23 #define MBEDTLS_DEBUG_H 24 25 #include "mbedtls/build_info.h" 26 27 #include "mbedtls/ssl.h" 28 29 #if defined(MBEDTLS_ECP_C) 30 #include "mbedtls/ecp.h" 31 #endif 32 33 #if defined(MBEDTLS_DEBUG_C) 34 35 #define MBEDTLS_DEBUG_STRIP_PARENS(...) __VA_ARGS__ 36 37 #define MBEDTLS_SSL_DEBUG_MSG(level, args) \ 38 mbedtls_debug_print_msg(ssl, level, __FILE__, __LINE__, \ 39 MBEDTLS_DEBUG_STRIP_PARENS args) 40 41 #define MBEDTLS_SSL_DEBUG_RET(level, text, ret) \ 42 mbedtls_debug_print_ret(ssl, level, __FILE__, __LINE__, text, ret) 43 44 #define MBEDTLS_SSL_DEBUG_BUF(level, text, buf, len) \ 45 mbedtls_debug_print_buf(ssl, level, __FILE__, __LINE__, text, buf, len) 46 47 #if defined(MBEDTLS_BIGNUM_C) 48 #define MBEDTLS_SSL_DEBUG_MPI(level, text, X) \ 49 mbedtls_debug_print_mpi(ssl, level, __FILE__, __LINE__, text, X) 50 #endif 51 52 #if defined(MBEDTLS_ECP_C) 53 #define MBEDTLS_SSL_DEBUG_ECP(level, text, X) \ 54 mbedtls_debug_print_ecp(ssl, level, __FILE__, __LINE__, text, X) 55 #endif 56 57 #if defined(MBEDTLS_X509_CRT_PARSE_C) 58 #if !defined(MBEDTLS_X509_REMOVE_INFO) 59 #define MBEDTLS_SSL_DEBUG_CRT(level, text, crt) \ 60 mbedtls_debug_print_crt(ssl, level, __FILE__, __LINE__, text, crt) 61 #else 62 #define MBEDTLS_SSL_DEBUG_CRT(level, text, crt) do { } while (0) 63 #endif /* MBEDTLS_X509_REMOVE_INFO */ 64 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 65 66 #if defined(MBEDTLS_ECDH_C) 67 #define MBEDTLS_SSL_DEBUG_ECDH(level, ecdh, attr) \ 68 mbedtls_debug_printf_ecdh(ssl, level, __FILE__, __LINE__, ecdh, attr) 69 #endif 70 71 #else /* MBEDTLS_DEBUG_C */ 72 73 #define MBEDTLS_SSL_DEBUG_MSG(level, args) do { } while (0) 74 #define MBEDTLS_SSL_DEBUG_RET(level, text, ret) do { } while (0) 75 #define MBEDTLS_SSL_DEBUG_BUF(level, text, buf, len) do { } while (0) 76 #define MBEDTLS_SSL_DEBUG_MPI(level, text, X) do { } while (0) 77 #define MBEDTLS_SSL_DEBUG_ECP(level, text, X) do { } while (0) 78 #define MBEDTLS_SSL_DEBUG_CRT(level, text, crt) do { } while (0) 79 #define MBEDTLS_SSL_DEBUG_ECDH(level, ecdh, attr) do { } while (0) 80 81 #endif /* MBEDTLS_DEBUG_C */ 82 83 /** 84 * \def MBEDTLS_PRINTF_ATTRIBUTE 85 * 86 * Mark a function as having printf attributes, and thus enable checking 87 * via -wFormat and other flags. This does nothing on builds with compilers 88 * that do not support the format attribute 89 * 90 * Module: library/debug.c 91 * Caller: 92 * 93 * This module provides debugging functions. 94 */ 95 #if defined(__has_attribute) 96 #if __has_attribute(format) 97 #if defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 1 98 #define MBEDTLS_PRINTF_ATTRIBUTE(string_index, first_to_check) \ 99 __attribute__((__format__(gnu_printf, string_index, first_to_check))) 100 #else /* defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 1 */ 101 #define MBEDTLS_PRINTF_ATTRIBUTE(string_index, first_to_check) \ 102 __attribute__((format(printf, string_index, first_to_check))) 103 #endif 104 #else /* __has_attribute(format) */ 105 #define MBEDTLS_PRINTF_ATTRIBUTE(string_index, first_to_check) 106 #endif /* __has_attribute(format) */ 107 #else /* defined(__has_attribute) */ 108 #define MBEDTLS_PRINTF_ATTRIBUTE(string_index, first_to_check) 109 #endif 110 111 /** 112 * \def MBEDTLS_PRINTF_SIZET 113 * 114 * MBEDTLS_PRINTF_xxx: Due to issues with older window compilers 115 * and MinGW we need to define the printf specifier for size_t 116 * and long long per platform. 117 * 118 * Module: library/debug.c 119 * Caller: 120 * 121 * This module provides debugging functions. 122 */ 123 #if (defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 0) || (defined(_MSC_VER) && _MSC_VER < 1800) 124 #include <inttypes.h> 125 #define MBEDTLS_PRINTF_SIZET PRIuPTR 126 #define MBEDTLS_PRINTF_LONGLONG "I64d" 127 #else \ 128 /* (defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 0) || (defined(_MSC_VER) && _MSC_VER < 1800) */ 129 #define MBEDTLS_PRINTF_SIZET "zu" 130 #define MBEDTLS_PRINTF_LONGLONG "lld" 131 #endif \ 132 /* (defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 0) || (defined(_MSC_VER) && _MSC_VER < 1800) */ 133 134 #ifdef __cplusplus 135 extern "C" { 136 #endif 137 138 /** 139 * \brief Set the threshold error level to handle globally all debug output. 140 * Debug messages that have a level over the threshold value are 141 * discarded. 142 * (Default value: 0 = No debug ) 143 * 144 * \param threshold threshold level of messages to filter on. Messages at a 145 * higher level will be discarded. 146 * - Debug levels 147 * - 0 No debug 148 * - 1 Error 149 * - 2 State change 150 * - 3 Informational 151 * - 4 Verbose 152 */ 153 void mbedtls_debug_set_threshold(int threshold); 154 155 /** 156 * \brief Print a message to the debug output. This function is always used 157 * through the MBEDTLS_SSL_DEBUG_MSG() macro, which supplies the ssl 158 * context, file and line number parameters. 159 * 160 * \param ssl SSL context 161 * \param level error level of the debug message 162 * \param file file the message has occurred in 163 * \param line line number the message has occurred at 164 * \param format format specifier, in printf format 165 * \param ... variables used by the format specifier 166 * 167 * \attention This function is intended for INTERNAL usage within the 168 * library only. 169 */ 170 void mbedtls_debug_print_msg(const mbedtls_ssl_context *ssl, int level, 171 const char *file, int line, 172 const char *format, ...) MBEDTLS_PRINTF_ATTRIBUTE(5, 6); 173 174 /** 175 * \brief Print the return value of a function to the debug output. This 176 * function is always used through the MBEDTLS_SSL_DEBUG_RET() macro, 177 * which supplies the ssl context, file and line number parameters. 178 * 179 * \param ssl SSL context 180 * \param level error level of the debug message 181 * \param file file the error has occurred in 182 * \param line line number the error has occurred in 183 * \param text the name of the function that returned the error 184 * \param ret the return code value 185 * 186 * \attention This function is intended for INTERNAL usage within the 187 * library only. 188 */ 189 void mbedtls_debug_print_ret(const mbedtls_ssl_context *ssl, int level, 190 const char *file, int line, 191 const char *text, int ret); 192 193 /** 194 * \brief Output a buffer of size len bytes to the debug output. This function 195 * is always used through the MBEDTLS_SSL_DEBUG_BUF() macro, 196 * which supplies the ssl context, file and line number parameters. 197 * 198 * \param ssl SSL context 199 * \param level error level of the debug message 200 * \param file file the error has occurred in 201 * \param line line number the error has occurred in 202 * \param text a name or label for the buffer being dumped. Normally the 203 * variable or buffer name 204 * \param buf the buffer to be outputted 205 * \param len length of the buffer 206 * 207 * \attention This function is intended for INTERNAL usage within the 208 * library only. 209 */ 210 void mbedtls_debug_print_buf(const mbedtls_ssl_context *ssl, int level, 211 const char *file, int line, const char *text, 212 const unsigned char *buf, size_t len); 213 214 #if defined(MBEDTLS_BIGNUM_C) 215 /** 216 * \brief Print a MPI variable to the debug output. This function is always 217 * used through the MBEDTLS_SSL_DEBUG_MPI() macro, which supplies the 218 * ssl context, file and line number parameters. 219 * 220 * \param ssl SSL context 221 * \param level error level of the debug message 222 * \param file file the error has occurred in 223 * \param line line number the error has occurred in 224 * \param text a name or label for the MPI being output. Normally the 225 * variable name 226 * \param X the MPI variable 227 * 228 * \attention This function is intended for INTERNAL usage within the 229 * library only. 230 */ 231 void mbedtls_debug_print_mpi(const mbedtls_ssl_context *ssl, int level, 232 const char *file, int line, 233 const char *text, const mbedtls_mpi *X); 234 #endif 235 236 #if defined(MBEDTLS_ECP_C) 237 /** 238 * \brief Print an ECP point to the debug output. This function is always 239 * used through the MBEDTLS_SSL_DEBUG_ECP() macro, which supplies the 240 * ssl context, file and line number parameters. 241 * 242 * \param ssl SSL context 243 * \param level error level of the debug message 244 * \param file file the error has occurred in 245 * \param line line number the error has occurred in 246 * \param text a name or label for the ECP point being output. Normally the 247 * variable name 248 * \param X the ECP point 249 * 250 * \attention This function is intended for INTERNAL usage within the 251 * library only. 252 */ 253 void mbedtls_debug_print_ecp(const mbedtls_ssl_context *ssl, int level, 254 const char *file, int line, 255 const char *text, const mbedtls_ecp_point *X); 256 #endif 257 258 #if defined(MBEDTLS_X509_CRT_PARSE_C) && !defined(MBEDTLS_X509_REMOVE_INFO) 259 /** 260 * \brief Print a X.509 certificate structure to the debug output. This 261 * function is always used through the MBEDTLS_SSL_DEBUG_CRT() macro, 262 * which supplies the ssl context, file and line number parameters. 263 * 264 * \param ssl SSL context 265 * \param level error level of the debug message 266 * \param file file the error has occurred in 267 * \param line line number the error has occurred in 268 * \param text a name or label for the certificate being output 269 * \param crt X.509 certificate structure 270 * 271 * \attention This function is intended for INTERNAL usage within the 272 * library only. 273 */ 274 void mbedtls_debug_print_crt(const mbedtls_ssl_context *ssl, int level, 275 const char *file, int line, 276 const char *text, const mbedtls_x509_crt *crt); 277 #endif 278 279 #if defined(MBEDTLS_ECDH_C) 280 typedef enum { 281 MBEDTLS_DEBUG_ECDH_Q, 282 MBEDTLS_DEBUG_ECDH_QP, 283 MBEDTLS_DEBUG_ECDH_Z, 284 } mbedtls_debug_ecdh_attr; 285 286 /** 287 * \brief Print a field of the ECDH structure in the SSL context to the debug 288 * output. This function is always used through the 289 * MBEDTLS_SSL_DEBUG_ECDH() macro, which supplies the ssl context, file 290 * and line number parameters. 291 * 292 * \param ssl SSL context 293 * \param level error level of the debug message 294 * \param file file the error has occurred in 295 * \param line line number the error has occurred in 296 * \param ecdh the ECDH context 297 * \param attr the identifier of the attribute being output 298 * 299 * \attention This function is intended for INTERNAL usage within the 300 * library only. 301 */ 302 void mbedtls_debug_printf_ecdh(const mbedtls_ssl_context *ssl, int level, 303 const char *file, int line, 304 const mbedtls_ecdh_context *ecdh, 305 mbedtls_debug_ecdh_attr attr); 306 #endif 307 308 #ifdef __cplusplus 309 } 310 #endif 311 312 #endif /* debug.h */ 313