quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

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 */