test_suite_debug.function (9692B)
1 /* BEGIN_HEADER */ 2 #include "debug_internal.h" 3 #include "string.h" 4 #include "mbedtls/pk.h" 5 #include <test/ssl_helpers.h> 6 7 #if defined(_WIN32) 8 # include <stdlib.h> 9 # include <crtdbg.h> 10 #endif 11 12 // Dummy type for builds without MBEDTLS_HAVE_TIME 13 #if !defined(MBEDTLS_HAVE_TIME) 14 typedef int64_t mbedtls_ms_time_t; 15 #endif 16 17 typedef enum { 18 PRINTF_SIZET, 19 PRINTF_LONGLONG, 20 PRINTF_MS_TIME, 21 } printf_format_indicator_t; 22 23 const char *const printf_formats[] = { 24 [PRINTF_SIZET] = "%" MBEDTLS_PRINTF_SIZET, 25 [PRINTF_LONGLONG] = "%" MBEDTLS_PRINTF_LONGLONG, 26 [PRINTF_MS_TIME] = "%" MBEDTLS_PRINTF_MS_TIME, 27 }; 28 29 struct buffer_data { 30 char buf[2000]; 31 char *ptr; 32 }; 33 34 #if defined(MBEDTLS_SSL_TLS_C) 35 static void string_debug(void *data, int level, const char *file, int line, const char *str) 36 { 37 struct buffer_data *buffer = (struct buffer_data *) data; 38 char *p = buffer->ptr; 39 ((void) level); 40 41 memcpy(p, file, strlen(file)); 42 p += strlen(file); 43 44 *p++ = '('; 45 *p++ = '0' + (line / 1000) % 10; 46 *p++ = '0' + (line / 100) % 10; 47 *p++ = '0' + (line / 10) % 10; 48 *p++ = '0' + (line / 1) % 10; 49 *p++ = ')'; 50 *p++ = ':'; 51 *p++ = ' '; 52 53 #if defined(MBEDTLS_THREADING_C) 54 /* Skip "thread ID" (up to the first space) as it is not predictable */ 55 while (*str++ != ' ') { 56 ; 57 } 58 #endif 59 60 memcpy(p, str, strlen(str)); 61 p += strlen(str); 62 63 /* Detect if debug messages output partial lines and mark them */ 64 if (p[-1] != '\n') { 65 *p++ = '*'; 66 } 67 68 buffer->ptr = p; 69 } 70 #endif /* MBEDTLS_SSL_TLS_C */ 71 72 #if defined(_WIN32) 73 static void noop_invalid_parameter_handler( 74 const wchar_t *expression, 75 const wchar_t *function, 76 const wchar_t *file, 77 unsigned int line, 78 uintptr_t pReserved) 79 { 80 (void) expression; 81 (void) function; 82 (void) file; 83 (void) line; 84 (void) pReserved; 85 } 86 #endif /* _WIN32 */ 87 88 /* END_HEADER */ 89 90 /* BEGIN_DEPENDENCIES 91 * depends_on:MBEDTLS_DEBUG_C 92 * END_DEPENDENCIES 93 */ 94 95 /* BEGIN_CASE */ 96 void printf_int_expr(int format_indicator, intmax_t sizeof_x, intmax_t x, char *result) 97 { 98 #if defined(_WIN32) 99 /* Windows treats any invalid format specifiers passsed to the CRT as fatal assertion failures. 100 Disable this behaviour temporarily, so the rest of the test cases can complete. */ 101 _invalid_parameter_handler saved_handler = 102 _set_invalid_parameter_handler(noop_invalid_parameter_handler); 103 104 // Disable assertion pop-up window in Debug builds 105 int saved_report_mode = _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_REPORT_MODE); 106 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG); 107 #endif 108 109 const char *format = printf_formats[format_indicator]; 110 char *output = NULL; 111 const size_t n = strlen(result); 112 113 /* Nominal case: buffer just large enough */ 114 TEST_CALLOC(output, n + 1); 115 if ((size_t) sizeof_x <= sizeof(int)) { // Any smaller integers would be promoted to an int due to calling a vararg function 116 TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, (int) x)); 117 } else if (sizeof_x == sizeof(long)) { 118 TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, (long) x)); 119 } else if (sizeof_x == sizeof(long long)) { 120 TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, (long long) x)); 121 } else { 122 TEST_FAIL( 123 "sizeof_x <= sizeof(int) || sizeof_x == sizeof(long) || sizeof_x == sizeof(long long)"); 124 } 125 TEST_MEMORY_COMPARE(result, n + 1, output, n + 1); 126 127 exit: 128 mbedtls_free(output); 129 output = NULL; 130 131 #if defined(_WIN32) 132 // Restore default Windows behaviour 133 _set_invalid_parameter_handler(saved_handler); 134 _CrtSetReportMode(_CRT_ASSERT, saved_report_mode); 135 (void) saved_report_mode; 136 #endif 137 } 138 /* END_CASE */ 139 140 /* BEGIN_CASE depends_on:MBEDTLS_SSL_TLS_C */ 141 void debug_print_msg_threshold(int threshold, int level, char *file, 142 int line, char *result_str) 143 { 144 mbedtls_ssl_context ssl; 145 mbedtls_ssl_config conf; 146 struct buffer_data buffer; 147 148 MD_PSA_INIT(); 149 150 mbedtls_ssl_init(&ssl); 151 mbedtls_ssl_config_init(&conf); 152 memset(buffer.buf, 0, 2000); 153 buffer.ptr = buffer.buf; 154 155 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, 156 MBEDTLS_SSL_IS_CLIENT, 157 MBEDTLS_SSL_TRANSPORT_STREAM, 158 MBEDTLS_SSL_PRESET_DEFAULT), 159 0); 160 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 161 mbedtls_ssl_conf_dbg(&conf, string_debug, &buffer); 162 163 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 164 165 mbedtls_debug_set_threshold(threshold); 166 167 mbedtls_debug_print_msg(&ssl, level, file, line, 168 "Text message, 2 == %d", 2); 169 170 TEST_ASSERT(strcmp(buffer.buf, result_str) == 0); 171 172 exit: 173 mbedtls_ssl_free(&ssl); 174 mbedtls_ssl_config_free(&conf); 175 MD_PSA_DONE(); 176 } 177 /* END_CASE */ 178 179 /* BEGIN_CASE depends_on:MBEDTLS_SSL_TLS_C */ 180 void mbedtls_debug_print_ret(char *file, int line, char *text, int value, 181 char *result_str) 182 { 183 mbedtls_ssl_context ssl; 184 mbedtls_ssl_config conf; 185 struct buffer_data buffer; 186 187 MD_PSA_INIT(); 188 189 mbedtls_ssl_init(&ssl); 190 mbedtls_ssl_config_init(&conf); 191 memset(buffer.buf, 0, 2000); 192 buffer.ptr = buffer.buf; 193 194 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, 195 MBEDTLS_SSL_IS_CLIENT, 196 MBEDTLS_SSL_TRANSPORT_STREAM, 197 MBEDTLS_SSL_PRESET_DEFAULT), 198 0); 199 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 200 mbedtls_ssl_conf_dbg(&conf, string_debug, &buffer); 201 202 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 203 204 mbedtls_debug_print_ret(&ssl, 0, file, line, text, value); 205 206 TEST_ASSERT(strcmp(buffer.buf, result_str) == 0); 207 208 exit: 209 mbedtls_ssl_free(&ssl); 210 mbedtls_ssl_config_free(&conf); 211 MD_PSA_DONE(); 212 } 213 /* END_CASE */ 214 215 /* BEGIN_CASE depends_on:MBEDTLS_SSL_TLS_C */ 216 void mbedtls_debug_print_buf(char *file, int line, char *text, 217 data_t *data, char *result_str) 218 { 219 mbedtls_ssl_context ssl; 220 mbedtls_ssl_config conf; 221 struct buffer_data buffer; 222 223 MD_PSA_INIT(); 224 225 mbedtls_ssl_init(&ssl); 226 mbedtls_ssl_config_init(&conf); 227 memset(buffer.buf, 0, 2000); 228 buffer.ptr = buffer.buf; 229 230 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, 231 MBEDTLS_SSL_IS_CLIENT, 232 MBEDTLS_SSL_TRANSPORT_STREAM, 233 MBEDTLS_SSL_PRESET_DEFAULT), 234 0); 235 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 236 mbedtls_ssl_conf_dbg(&conf, string_debug, &buffer); 237 238 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 239 240 mbedtls_debug_print_buf(&ssl, 0, file, line, text, data->x, data->len); 241 242 TEST_ASSERT(strcmp(buffer.buf, result_str) == 0); 243 244 exit: 245 mbedtls_ssl_free(&ssl); 246 mbedtls_ssl_config_free(&conf); 247 MD_PSA_DONE(); 248 } 249 /* END_CASE */ 250 251 /* BEGIN_CASE depends_on:MBEDTLS_SSL_TLS_C:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:!MBEDTLS_X509_REMOVE_INFO */ 252 void mbedtls_debug_print_crt(char *crt_file, char *file, int line, 253 char *prefix, char *result_str) 254 { 255 mbedtls_x509_crt crt; 256 mbedtls_ssl_context ssl; 257 mbedtls_ssl_config conf; 258 struct buffer_data buffer; 259 260 mbedtls_ssl_init(&ssl); 261 mbedtls_ssl_config_init(&conf); 262 mbedtls_x509_crt_init(&crt); 263 MD_OR_USE_PSA_INIT(); 264 265 memset(buffer.buf, 0, 2000); 266 buffer.ptr = buffer.buf; 267 268 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, 269 MBEDTLS_SSL_IS_CLIENT, 270 MBEDTLS_SSL_TRANSPORT_STREAM, 271 MBEDTLS_SSL_PRESET_DEFAULT), 272 0); 273 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 274 mbedtls_ssl_conf_dbg(&conf, string_debug, &buffer); 275 276 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 277 278 TEST_ASSERT(mbedtls_x509_crt_parse_file(&crt, crt_file) == 0); 279 mbedtls_debug_print_crt(&ssl, 0, file, line, prefix, &crt); 280 281 TEST_ASSERT(strcmp(buffer.buf, result_str) == 0); 282 283 exit: 284 mbedtls_x509_crt_free(&crt); 285 mbedtls_ssl_free(&ssl); 286 mbedtls_ssl_config_free(&conf); 287 MD_OR_USE_PSA_DONE(); 288 } 289 /* END_CASE */ 290 291 /* BEGIN_CASE depends_on:MBEDTLS_SSL_TLS_C:MBEDTLS_BIGNUM_C */ 292 void mbedtls_debug_print_mpi(char *value, char *file, int line, 293 char *prefix, char *result_str) 294 { 295 mbedtls_ssl_context ssl; 296 mbedtls_ssl_config conf; 297 struct buffer_data buffer; 298 mbedtls_mpi val; 299 300 MD_PSA_INIT(); 301 302 mbedtls_ssl_init(&ssl); 303 mbedtls_ssl_config_init(&conf); 304 mbedtls_mpi_init(&val); 305 memset(buffer.buf, 0, 2000); 306 buffer.ptr = buffer.buf; 307 308 TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, 309 MBEDTLS_SSL_IS_CLIENT, 310 MBEDTLS_SSL_TRANSPORT_STREAM, 311 MBEDTLS_SSL_PRESET_DEFAULT), 312 0); 313 mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); 314 mbedtls_ssl_conf_dbg(&conf, string_debug, &buffer); 315 316 TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); 317 318 TEST_ASSERT(mbedtls_test_read_mpi(&val, value) == 0); 319 320 mbedtls_debug_print_mpi(&ssl, 0, file, line, prefix, &val); 321 322 TEST_ASSERT(strcmp(buffer.buf, result_str) == 0); 323 324 exit: 325 mbedtls_mpi_free(&val); 326 mbedtls_ssl_free(&ssl); 327 mbedtls_ssl_config_free(&conf); 328 MD_PSA_DONE(); 329 } 330 /* END_CASE */