|  | /* BEGIN_HEADER */ | 
|  |  | 
|  | /* This test module exercises the platform_* module. Since, depending on the | 
|  | * underlying operating system, the time routines are not always reliable, | 
|  | * this suite only performs very basic sanity checks of the timing API. | 
|  | */ | 
|  |  | 
|  | #include <limits.h> | 
|  |  | 
|  | #if defined(MBEDTLS_HAVE_TIME) | 
|  | #include "mbedtls/platform_time.h" | 
|  |  | 
|  | #if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ | 
|  | defined(__MINGW32__) || defined(_WIN64) | 
|  | #include <windows.h> | 
|  | #elif _POSIX_C_SOURCE >= 199309L | 
|  | #include <time.h> | 
|  | #else | 
|  | #include <unistd.h> | 
|  | #endif | 
|  | void sleep_ms(int milliseconds) | 
|  | { | 
|  | #if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ | 
|  | defined(__MINGW32__) || defined(_WIN64) | 
|  | Sleep(milliseconds); | 
|  | #elif _POSIX_C_SOURCE >= 199309L | 
|  | struct timespec ts; | 
|  | ts.tv_sec = milliseconds / 1000; | 
|  | ts.tv_nsec = (milliseconds % 1000) * 1000000; | 
|  | nanosleep(&ts, NULL); | 
|  | #else | 
|  | usleep(milliseconds * 1000); | 
|  | #endif | 
|  | } | 
|  | #endif | 
|  |  | 
|  | /* END_HEADER */ | 
|  |  | 
|  | /* BEGIN_DEPENDENCIES */ | 
|  |  | 
|  | /* END_DEPENDENCIES */ | 
|  |  | 
|  | /* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ | 
|  | void time_get_milliseconds() | 
|  | { | 
|  | mbedtls_ms_time_t current = mbedtls_ms_time(); | 
|  | (void) current; | 
|  | /* This goto is added to avoid warnings from the generated code. */ | 
|  | goto exit; | 
|  | } | 
|  | /* END_CASE */ | 
|  |  | 
|  | /* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ | 
|  | void time_get_seconds() | 
|  | { | 
|  | mbedtls_time_t current = mbedtls_time(NULL); | 
|  | (void) current; | 
|  | /* This goto is added to avoid warnings from the generated code. */ | 
|  | goto exit; | 
|  | } | 
|  | /* END_CASE */ | 
|  |  | 
|  | /* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ | 
|  | void time_delay_milliseconds(int delay_ms) | 
|  | { | 
|  | mbedtls_ms_time_t current = mbedtls_ms_time(); | 
|  | mbedtls_ms_time_t elapsed_ms; | 
|  |  | 
|  | /* | 
|  | * WARNING: DO NOT ENABLE THIS TEST. We keep the code here to document the | 
|  | *          reason. | 
|  | * | 
|  | *          Windows CI reports random test fail on platform-suite. It might | 
|  | *          be caused by this case. | 
|  | */ | 
|  | sleep_ms(delay_ms); | 
|  |  | 
|  | elapsed_ms = mbedtls_ms_time() - current; | 
|  | TEST_ASSERT(elapsed_ms >= delay_ms && elapsed_ms < 4000 + delay_ms); | 
|  | /* This goto is added to avoid warnings from the generated code. */ | 
|  | goto exit; | 
|  | } | 
|  | /* END_CASE */ | 
|  |  | 
|  | /* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ | 
|  |  | 
|  | /* | 
|  | * WARNING: DO NOT ENABLE THIS TEST. We keep the code here to document the | 
|  | *          reason. | 
|  | * | 
|  | *          The test often failed on the CI. See #1517. CI failures cannot be | 
|  | *          completely avoided due to out-of-sync clock sources. | 
|  | */ | 
|  | void time_delay_seconds(int delay_secs) | 
|  | { | 
|  | mbedtls_time_t current = mbedtls_time(NULL); | 
|  | mbedtls_time_t elapsed_secs; | 
|  |  | 
|  | sleep_ms(delay_secs * 1000); | 
|  |  | 
|  | elapsed_secs = mbedtls_time(NULL) - current; | 
|  |  | 
|  | /* | 
|  | * `mbedtls_time()` was defined as c99 function `time()`, returns the number | 
|  | * of seconds since the Epoch. And it is affected by discontinuous changes | 
|  | * from automatic drift adjustment or time setting system call. The POSIX.1 | 
|  | * specification for clock_settime says that discontinuous changes in | 
|  | * CLOCK_REALTIME should not affect `nanosleep()`. | 
|  | * | 
|  | * If discontinuous changes occur during `nanosleep()`, we will get | 
|  | * `elapsed_secs < delay_secs` for backward or `elapsed_secs > delay_secs` | 
|  | * for forward. | 
|  | * | 
|  | * The following tolerance windows cannot be guaranteed. | 
|  | * PLEASE DO NOT ENABLE IT IN CI TEST. | 
|  | */ | 
|  | TEST_ASSERT(elapsed_secs - delay_secs >= -1 && | 
|  | elapsed_secs - delay_secs <   4); | 
|  | /* This goto is added to avoid warnings from the generated code. */ | 
|  | goto exit; | 
|  | } | 
|  | /* END_CASE */ | 
|  |  | 
|  | /* BEGIN_CASE */ | 
|  | void check_mbedtls_calloc_overallocation(intmax_t num, intmax_t size) | 
|  | { | 
|  | unsigned char *buf; | 
|  | buf = mbedtls_calloc((size_t) num, (size_t) size); | 
|  | /* Dummy usage of the pointer to prevent optimizing it */ | 
|  | mbedtls_printf("calloc pointer : %p\n", buf); | 
|  | TEST_ASSERT(buf == NULL); | 
|  |  | 
|  | exit: | 
|  | mbedtls_free(buf); | 
|  | } | 
|  | /* END_CASE */ |