From 2c5f268f166913ca51aa20dcf235b69d0319b5e4 Mon Sep 17 00:00:00 2001 From: David Garske Date: Mon, 8 Apr 2019 06:43:25 -0700 Subject: [PATCH] Port for Telit IoT AppZone SDK * Added new `WOLFSSL_TELIT_M2MB` build option to enable support for RNG, Time, Mutex, FileSystem and Directory. * Added `XTIME_MS` macro to simplify the tls13.c layer time requirement. * Cleanup of the wolfCrypt benchmark and test printf remapping. * Added wolfCrypt optional memory test enabled with `COMPLEX_MEM_TEST`. * Added wolfCrypt test / benchmark feature for allowing "sleep" between long operations using `TEST_SLEEP()`. * Fix for extern with `sp_ModExp_2048` when building with `--cpp` option. --- src/internal.c | 2 +- src/tls.c | 6 + src/tls13.c | 7 + wolfcrypt/benchmark/benchmark.c | 84 +++-- wolfcrypt/src/integer.c | 6 + wolfcrypt/src/logging.c | 7 +- wolfcrypt/src/random.c | 28 ++ wolfcrypt/src/tfm.c | 6 + wolfcrypt/src/wc_port.c | 192 +++++++++++- wolfcrypt/test/test.c | 528 ++++++++++++++++++++------------ wolfssl/internal.h | 2 + wolfssl/wolfcrypt/types.h | 7 + wolfssl/wolfcrypt/wc_port.h | 62 ++++ 13 files changed, 716 insertions(+), 221 deletions(-) diff --git a/src/internal.c b/src/internal.c index 54b3ae637b..7fd79425a1 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6510,7 +6510,7 @@ ProtocolVersion MakeDTLSv1_2(void) #else /* Posix style time */ - #ifndef USER_TIME + #if !defined(USER_TIME) && !defined(USE_WOLF_TM) #include #endif diff --git a/src/tls.c b/src/tls.c index 721c45b4f2..6a8ed3fcb4 100644 --- a/src/tls.c +++ b/src/tls.c @@ -3772,6 +3772,10 @@ static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore) static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore) { +#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) + (void)semaphore; +#endif + if (ssl->options.cipherSuite0 == TLS13_BYTE) return; if (ssl->options.cipherSuite0 == ECC_BYTE || @@ -3786,8 +3790,10 @@ static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore) #endif } +#if !defined(HAVE_FFDHE) || (!defined(HAVE_ECC) && !defined(HAVE_CURVE25519)) /* turns semaphore on to avoid sending this extension. */ TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS)); +#endif } #endif diff --git a/src/tls13.c b/src/tls13.c index e6669052a2..5f1825997e 100644 --- a/src/tls13.c +++ b/src/tls13.c @@ -1164,6 +1164,13 @@ end: { return (word32) XTIME(0) * 1000; } + +#elif defined(XTIME_MS) + word32 TimeNowInMilliseconds(void) + { + return (word32)XTIME_MS(0); + } + #elif defined(USE_WINDOWS_API) /* The time in milliseconds. * Used for tickets to represent difference between when first seen and when diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index aafe06ea08..65a6fccff8 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -33,20 +33,19 @@ /* Macro to disable benchmark */ #ifndef NO_CRYPT_BENCHMARK -#if defined(XMALLOC_USER) || defined(FREESCALE_MQX) - /* MQX classic needs for EXIT_FAILURE */ - #include /* we're using malloc / free direct here */ +/* only for stack size check */ +#ifdef HAVE_STACK_SIZE + #include + #include #endif -#ifdef WOLFSSL_STATIC_MEMORY - #include - static WOLFSSL_HEAP_HINT* HEAP_HINT; +#ifdef USE_FLAT_BENCHMARK_H + #include "benchmark.h" #else - #define HEAP_HINT NULL -#endif /* WOLFSSL_STATIC_MEMORY */ - -#include + #include "wolfcrypt/benchmark/benchmark.h" +#endif +/* printf mappings */ #ifdef FREESCALE_MQX #include #if MQX_USE_IO_OLD @@ -71,11 +70,8 @@ #define printf BSP_Ser_Printf #elif defined(WOLFSSL_ZEPHYR) #include - #define BENCH_EMBEDDED - #define printf printfk - static int printfk(const char *fmt, ...) { int ret; @@ -92,10 +88,36 @@ return ret; } + +#elif defined(WOLFSSL_TELIT_M2MB) + #include + #include + #include + #include "wolfssl/wolfcrypt/wc_port.h" /* for m2mb headers */ + #include "m2m_log.h" /* for M2M_LOG_INFO - not standard API */ + /* remap printf */ + #undef printf + #define printf M2M_LOG_INFO + /* OS requires occasional sleep() */ + #ifndef TEST_SLEEP_MS + #define TEST_SLEEP_MS 50 + #endif + #define TEST_SLEEP() m2mb_os_taskSleep(M2MB_OS_MS2TICKS(TEST_SLEEP_MS)) + /* don't use file system for these tests, since ./certs dir isn't loaded */ + #undef NO_FILESYSTEM + #define NO_FILESYSTEM + #else + #if defined(XMALLOC_USER) || defined(FREESCALE_MQX) + /* MQX classic needs for EXIT_FAILURE */ + #include /* we're using malloc / free direct here */ + #endif + + #include #include #endif +#include #include #include #include @@ -142,18 +164,25 @@ #include #include +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + + +#ifdef WOLFSSL_STATIC_MEMORY + static WOLFSSL_HEAP_HINT* HEAP_HINT; +#else + #define HEAP_HINT NULL +#endif /* WOLFSSL_STATIC_MEMORY */ + #ifndef EXIT_FAILURE #define EXIT_FAILURE 1 #endif -/* only for stack size check */ -#ifdef HAVE_STACK_SIZE - #include - #include -#endif - -#ifdef WOLFSSL_ASYNC_CRYPT - #include +/* optional macro to add sleep between tests */ +#ifndef TEST_SLEEP + /* stub the sleep macro */ + #define TEST_SLEEP() #endif @@ -582,11 +611,6 @@ static const char* bench_desc_words[][9] = { #pragma warning(disable: 4996) #endif -#ifdef USE_FLAT_BENCHMARK_H - #include "benchmark.h" -#else - #include "wolfcrypt/benchmark/benchmark.h" -#endif #ifdef WOLFSSL_CURRTIME_REMAP #define current_time WOLFSSL_CURRTIME_REMAP @@ -1052,6 +1076,8 @@ static void bench_stats_sym_finish(const char* desc, int doAsync, int count, (void)doAsync; (void)ret; + + TEST_SLEEP(); } #ifdef BENCH_ASYM @@ -1095,6 +1121,8 @@ static void bench_stats_asym_finish(const char* algo, int strength, (void)doAsync; (void)ret; + + TEST_SLEEP(); } #endif #endif /* BENCH_ASYM */ @@ -4067,7 +4095,7 @@ static void bench_rsa_helper(int doAsync, RsaKey rsaKey[BENCH_MAX_PENDING], #endif #if !defined(WOLFSSL_RSA_VERIFY_INLINE) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY) - #if !defined(WOLFSSL_MDK5_COMPLv5) + #if !defined(WOLFSSL_MDK5_COMPLv5) /* MDK5 compiler regard this as a executable statement, and does not allow declarations after the line. */ DECLARE_ARRAY_DYNAMIC_DEC(out, byte, BENCH_MAX_PENDING, rsaKeySz, HEAP_HINT); #else @@ -4083,7 +4111,7 @@ static void bench_rsa_helper(int doAsync, RsaKey rsaKey[BENCH_MAX_PENDING], !defined(WOLFSSL_RSA_PUBLIC_ONLY) DECLARE_ARRAY_DYNAMIC_EXE(out, byte, BENCH_MAX_PENDING, rsaKeySz, HEAP_HINT); #endif - + if (!rsa_sign_verify) { #ifndef WOLFSSL_RSA_VERIFY_ONLY /* begin public RSA */ diff --git a/wolfcrypt/src/integer.c b/wolfcrypt/src/integer.c index 24e93d4e59..2551ca1032 100644 --- a/wolfcrypt/src/integer.c +++ b/wolfcrypt/src/integer.c @@ -75,6 +75,9 @@ #endif #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) +#ifdef __cplusplus + extern "C" { +#endif WOLFSSL_LOCAL int sp_ModExp_1024(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res); WOLFSSL_LOCAL int sp_ModExp_1536(mp_int* base, mp_int* exp, mp_int* mod, @@ -83,6 +86,9 @@ WOLFSSL_LOCAL int sp_ModExp_2048(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res); WOLFSSL_LOCAL int sp_ModExp_3072(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res); +#ifdef __cplusplus + } /* extern "C" */ +#endif #endif /* reverse an array, used for radix code */ diff --git a/wolfcrypt/src/logging.c b/wolfcrypt/src/logging.c index 8f83bd5a3f..e5a6e52225 100644 --- a/wolfcrypt/src/logging.c +++ b/wolfcrypt/src/logging.c @@ -26,8 +26,6 @@ #include -/* submitted by eof */ - #include #include #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) @@ -221,6 +219,9 @@ void WOLFSSL_TIME(int count) #elif defined(WOLFSSL_ESPIDF) #include "esp_types.h" #include "esp_log.h" +#elif defined(WOLFSSL_TELIT_M2MB) + #include + #include "m2m_log.h" #else #include /* for default printf stuff */ #endif @@ -261,6 +262,8 @@ static void wolfssl_log(const int logLevel, const char *const logMessage) ESP_LOGI("wolfssl", "%s", logMessage); #elif defined(WOLFSSL_ZEPHYR) printk("%s\n", logMessage); +#elif defined(WOLFSSL_TELIT_M2MB) + M2M_LOG_INFO("%s\n", logMessage); #else fprintf(stderr, "%s\n", logMessage); #endif diff --git a/wolfcrypt/src/random.c b/wolfcrypt/src/random.c index 4b81f09cc1..f6751330e5 100644 --- a/wolfcrypt/src/random.c +++ b/wolfcrypt/src/random.c @@ -150,6 +150,7 @@ int wc_RNG_GenerateByte(WC_RNG* rng, byte* b) #elif defined(WOLFSSL_NUCLEUS) #elif defined(WOLFSSL_PB) #elif defined(WOLFSSL_ZEPHYR) +#elif defined(WOLFSSL_TELIT_M2MB) #else /* include headers that may be needed to get good seed */ #include @@ -2216,6 +2217,33 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) return ret; } +#elif defined(WOLFSSL_TELIT_M2MB) + + #include "stdlib.h" + static long get_timestamp(void) { + long myTime = 0; + INT32 fd = m2mb_rtc_open("/dev/rtc0", 0); + if (fd >= 0) { + M2MB_RTC_TIMEVAL_T timeval; + m2mb_rtc_ioctl(fd, M2MB_RTC_IOCTL_GET_TIMEVAL, &timeval); + myTime = timeval.msec; + m2mb_rtc_close(fd); + } + return myTime; + } + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + int i; + srand(get_timestamp()); + for (i = 0; i < sz; i++ ) { + output[i] = rand() % 256; + if ((i % 8) == 7) { + srand(get_timestamp()); + } + } + return 0; + } + #elif defined(NO_DEV_RANDOM) #error "you need to write an os specific wc_GenerateSeed() here" diff --git a/wolfcrypt/src/tfm.c b/wolfcrypt/src/tfm.c index 64c10a6b0c..fdb7717a58 100644 --- a/wolfcrypt/src/tfm.c +++ b/wolfcrypt/src/tfm.c @@ -59,6 +59,9 @@ #endif #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) +#ifdef __cplusplus + extern "C" { +#endif WOLFSSL_LOCAL int sp_ModExp_1024(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res); WOLFSSL_LOCAL int sp_ModExp_1536(mp_int* base, mp_int* exp, mp_int* mod, @@ -67,6 +70,9 @@ WOLFSSL_LOCAL int sp_ModExp_2048(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res); WOLFSSL_LOCAL int sp_ModExp_3072(mp_int* base, mp_int* exp, mp_int* mod, mp_int* res); +#ifdef __cplusplus + } /* extern "C" */ +#endif #endif diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index 60886138f5..7a72032d6a 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -329,6 +329,39 @@ int wc_ReadDirFirst(ReadDirCtx* ctx, const char* path, char** name) return 0; } } +#elif defined(WOLFSSL_TELIT_M2MB) + ctx->dir = m2mb_fs_opendir((const CHAR*)path); + if (ctx->dir == NULL) { + WOLFSSL_MSG("opendir path verify locations failed"); + return BAD_PATH_ERROR; + } + + while ((ctx->entry = m2mb_fs_readdir(ctx->dir)) != NULL) { + dnameLen = (int)XSTRLEN(ctx->entry->d_name); + + if (pathLen + dnameLen + 2 >= MAX_FILENAME_SZ) { + ret = BAD_PATH_ERROR; + break; + } + XSTRNCPY(ctx->name, path, pathLen + 1); + ctx->name[pathLen] = '/'; + + /* Use dnameLen + 1 for GCC 8 warnings of truncating d_name. Because + * of earlier check it is known that dnameLen is less than + * MAX_FILENAME_SZ - (pathLen + 2) so dnameLen +1 will fit */ + XSTRNCPY(ctx->name + pathLen + 1, ctx->entry->d_name, dnameLen + 1); + + if (m2mb_fs_stat(ctx->name, &ctx->s) != 0) { + WOLFSSL_MSG("stat on name failed"); + ret = BAD_PATH_ERROR; + break; + } + else if (ctx->s.st_mode & M2MB_S_IFREG) { + if (name) + *name = ctx->name; + return 0; + } + } #else ctx->dir = opendir(path); if (ctx->dir == NULL) { @@ -426,6 +459,33 @@ int wc_ReadDirNext(ReadDirCtx* ctx, const char* path, char** name) return 0; } } +#elif defined(WOLFSSL_TELIT_M2MB) + while ((ctx->entry = m2mb_fs_readdir(ctx->dir)) != NULL) { + dnameLen = (int)XSTRLEN(ctx->entry->d_name); + + if (pathLen + dnameLen + 2 >= MAX_FILENAME_SZ) { + ret = BAD_PATH_ERROR; + break; + } + XSTRNCPY(ctx->name, path, pathLen + 1); + ctx->name[pathLen] = '/'; + + /* Use dnameLen + 1 for GCC 8 warnings of truncating d_name. Because + * of earlier check it is known that dnameLen is less than + * MAX_FILENAME_SZ - (pathLen + 2) so dnameLen +1 will fit */ + XSTRNCPY(ctx->name + pathLen + 1, ctx->entry->d_name, dnameLen + 1); + + if (m2mb_fs_stat(ctx->name, &ctx->s) != 0) { + WOLFSSL_MSG("stat on name failed"); + ret = BAD_PATH_ERROR; + break; + } + else if (ctx->s.st_mode & M2MB_S_IFREG) { + if (name) + *name = ctx->name; + return 0; + } + } #else while ((ctx->entry = readdir(ctx->dir)) != NULL) { dnameLen = (int)XSTRLEN(ctx->entry->d_name); @@ -474,6 +534,11 @@ void wc_ReadDirClose(ReadDirCtx* ctx) fs_closedir(ctx->dirp); ctx->dirp = NULL; } +#elif defined(WOLFSSL_TELIT_M2MB) + if (ctx->dir) { + m2mb_fs_closedir(ctx->dir); + ctx->dir = NULL; + } #else if (ctx->dir) { closedir(ctx->dir); @@ -513,7 +578,7 @@ int z_fs_close(XFILE file) return ret; } -#endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */ +#endif /* !NO_FILESYSTEM && !WOLFSSL_ZEPHYR */ wolfSSL_Mutex* wc_InitAndAllocMutex(void) @@ -1628,6 +1693,78 @@ int wolfSSL_CryptHwMutexUnLock(void) { return 0; } +#elif defined(WOLFSSL_TELIT_M2MB) + + int wc_InitMutex(wolfSSL_Mutex* m) + { + M2MB_OS_RESULT_E osRes; + M2MB_OS_MTX_ATTR_HANDLE mtxAttrHandle; + UINT32 inheritVal = 1; + + osRes = m2mb_os_mtx_setAttrItem(&mtxAttrHandle, + CMDS_ARGS( + M2MB_OS_MTX_SEL_CMD_CREATE_ATTR, NULL, + M2MB_OS_MTX_SEL_CMD_NAME, "wolfMtx", + M2MB_OS_MTX_SEL_CMD_INHERIT, inheritVal + ) + ); + if (osRes != M2MB_OS_SUCCESS) { + return BAD_MUTEX_E; + } + + osRes = m2mb_os_mtx_init(m, &mtxAttrHandle); + if (osRes != M2MB_OS_SUCCESS) { + return BAD_MUTEX_E; + } + + return 0; + } + + int wc_FreeMutex(wolfSSL_Mutex* m) + { + M2MB_OS_RESULT_E osRes; + + if (m == NULL) + return BAD_MUTEX_E; + + osRes = m2mb_os_mtx_deinit(*m); + if (osRes != M2MB_OS_SUCCESS) { + return BAD_MUTEX_E; + } + + return 0; + } + + int wc_LockMutex(wolfSSL_Mutex* m) + { + M2MB_OS_RESULT_E osRes; + + if (m == NULL) + return BAD_MUTEX_E; + + osRes = m2mb_os_mtx_get(*m, M2MB_OS_WAIT_FOREVER); + if (osRes != M2MB_OS_SUCCESS) { + return BAD_MUTEX_E; + } + + return 0; + } + + int wc_UnLockMutex(wolfSSL_Mutex* m) + { + M2MB_OS_RESULT_E osRes; + + if (m == NULL) + return BAD_MUTEX_E; + + osRes = m2mb_os_mtx_put(*m); + if (osRes != M2MB_OS_SUCCESS) { + return BAD_MUTEX_E; + } + + return 0; + } + #else #warning No mutex handling defined @@ -1910,6 +2047,59 @@ time_t wiced_pseudo_unix_epoch_time(time_t * timer) return epoch_time; } #endif /* WOLFSSL_WICED */ + +#ifdef WOLFSSL_TELIT_M2MB + time_t m2mb_xtime(time_t * timer) + { + time_t myTime = 0; + INT32 fd = m2mb_rtc_open("/dev/rtc0", 0); + if (fd >= 0) { + M2MB_RTC_TIMEVAL_T timeval; + + m2mb_rtc_ioctl(fd, M2MB_RTC_IOCTL_GET_TIMEVAL, &timeval); + + myTime = timeval.sec; + + m2mb_rtc_close(fd); + } + return myTime; + } + #ifdef WOLFSSL_TLS13 + time_t m2mb_xtime_ms(time_t * timer) + { + time_t myTime = 0; + INT32 fd = m2mb_rtc_open("/dev/rtc0", 0); + if (fd >= 0) { + M2MB_RTC_TIMEVAL_T timeval; + + m2mb_rtc_ioctl(fd, M2MB_RTC_IOCTL_GET_TIMEVAL, &timeval); + + myTime = timeval.sec + timeval.msec; + + m2mb_rtc_close(fd); + } + return myTime; + } + #endif /* WOLFSSL_TLS13 */ + #ifndef NO_CRYPT_BENCHMARK + double m2mb_xtime_bench(int reset) + { + double myTime = 0; + INT32 fd = m2mb_rtc_open("/dev/rtc0", 0); + if (fd >= 0) { + M2MB_RTC_TIMEVAL_T timeval; + + m2mb_rtc_ioctl(fd, M2MB_RTC_IOCTL_GET_TIMEVAL, &timeval); + + myTime = (double)timeval.sec + ((double)timeval.msec / 1000); + + m2mb_rtc_close(fd); + } + return myTime; + } + #endif /* !NO_CRYPT_BENCHMARK */ +#endif /* WOLFSSL_TELIT_M2MB */ + #endif /* !NO_ASN_TIME */ #ifndef WOLFSSL_LEANPSK diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 299182f5cf..6c5fa2c58f 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -25,24 +25,94 @@ #endif #include - -#ifdef XMALLOC_USER - #include /* we're using malloc / free direct here */ -#endif +#include #ifndef NO_CRYPT_TEST -#include -#ifdef WOLFSSL_STATIC_MEMORY - static WOLFSSL_HEAP_HINT* HEAP_HINT; -#else - #define HEAP_HINT NULL -#endif /* WOLFSSL_STATIC_MEMORY */ +/* only for stack size check */ +#ifdef HAVE_STACK_SIZE + #include + #define err_sys err_sys_remap /* remap err_sys */ + #include + #undef err_sys +#endif +#ifdef USE_FLAT_TEST_H + #include "test.h" +#else + #include "wolfcrypt/test/test.h" +#endif + +/* printf mappings */ +#if defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) + #include + #include + #if MQX_USE_IO_OLD + #include + #else + #include + #endif +#elif defined(FREESCALE_KSDK_BM) + #include "fsl_debug_console.h" + #undef printf + #define printf PRINTF +#elif defined(WOLFSSL_APACHE_MYNEWT) + #include + #include + #include "sysinit/sysinit.h" + #include "os/os.h" + #ifdef ARCH_sim + #include "mcu/mcu_sim.h" + #endif + #include "os/os_time.h" +#elif defined(WOLFSSL_ESPIDF) + #include + #include +#elif defined(WOLFSSL_ZEPHYR) + #include + + #define printf printk +#elif defined(MICRIUM) + #include + void BSP_Ser_Printf (CPU_CHAR* format, ...); + #undef printf + #define printf BSP_Ser_Printf +#elif defined(WOLFSSL_PB) + #include + int wolfssl_pb_print(const char*, ...); + #undef printf + #define printf wolfssl_pb_print +#elif defined(WOLFSSL_TELIT_M2MB) + #include "wolfssl/wolfcrypt/wc_port.h" /* for m2mb headers */ + #include "m2m_log.h" /* for M2M_LOG_INFO - not standard API */ + /* remap printf */ + #undef printf + #define printf M2M_LOG_INFO + /* OS requires occasional sleep() */ + #ifndef TEST_SLEEP_MS + #define TEST_SLEEP_MS 50 + #endif + #define TEST_SLEEP() m2mb_os_taskSleep(M2MB_OS_MS2TICKS(TEST_SLEEP_MS)) + /* don't use file system for these tests, since ./certs dir isn't loaded */ + #undef NO_FILESYSTEM + #define NO_FILESYSTEM +#elif defined(THREADX) && !defined(WOLFSSL_WICED) + /* since just testing, use THREADX log printf instead */ + int dc_log_printf(char*, ...); + #undef printf + #define printf dc_log_printf +#else + #ifdef XMALLOC_USER + #include /* we're using malloc / free direct here */ + #endif + + #include +#endif + +#include #include #include #include - #if defined(WOLFSSL_TEST_CERT) || defined(ASN_BER_TO_DER) #include #else @@ -55,13 +125,11 @@ #include #include #include - #if defined(WC_NO_RNG) #include #else #include #endif - #include #include #include @@ -123,14 +191,6 @@ #include #endif -/* only for stack size check */ -#ifdef HAVE_STACK_SIZE - #include - #define err_sys err_sys_remap /* remap err_sys */ - #include - #undef err_sys -#endif - #ifdef _MSC_VER /* 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy */ #pragma warning(disable: 4996) @@ -146,7 +206,6 @@ #include #endif - #if defined(NO_FILESYSTEM) #if !defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048) && \ !defined(USE_CERT_BUFFERS_4096) @@ -157,76 +216,23 @@ #endif #endif +#if defined(WOLFSSL_CERT_GEN) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) + #define ENABLE_ECC384_CERT_GEN_TEST +#endif + #include #ifdef HAVE_NTRU #include "libntruencrypt/ntru_crypto.h" #endif -#if defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) - #include - #include - #if MQX_USE_IO_OLD - #include - #else - #include - #endif -#elif defined(FREESCALE_KSDK_BM) - #include "fsl_debug_console.h" - #undef printf - #define printf PRINTF -#elif defined(WOLFSSL_APACHE_MYNEWT) - #include - #include - #include "sysinit/sysinit.h" - #include "os/os.h" - #ifdef ARCH_sim - #include "mcu/mcu_sim.h" - #endif - #include "os/os_time.h" -#elif defined(WOLFSSL_ESPIDF) - #include - #include -#elif defined(WOLFSSL_ZEPHYR) - #include - - #define printf printk +#ifdef WOLFSSL_STATIC_MEMORY + static WOLFSSL_HEAP_HINT* HEAP_HINT; #else - #include -#endif + #define HEAP_HINT NULL +#endif /* WOLFSSL_STATIC_MEMORY */ -#if defined(WOLFSSL_CERT_GEN) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) - #define ENABLE_ECC384_CERT_GEN_TEST -#endif - - -#if defined(THREADX) && !defined(WOLFSSL_WICED) - /* since just testing, use THREADX log printf instead */ - int dc_log_printf(char*, ...); - #undef printf - #define printf dc_log_printf -#endif - - -#ifdef MICRIUM - #include - void BSP_Ser_Printf (CPU_CHAR* format, ...); - #undef printf - #define printf BSP_Ser_Printf -#elif defined(WOLFSSL_PB) - #include - int wolfssl_pb_print(const char*, ...); - #undef printf - #define printf wolfssl_pb_print -#endif - -#ifdef USE_FLAT_TEST_H - #include "test.h" -#else - #include "wolfcrypt/test/test.h" -#endif - - /* these cases do not have intermediate hashing support */ +/* these cases do not have intermediate hashing support */ #if (defined(WOLFSSL_AFALG_XILINX_SHA3) && !defined(WOLFSSL_AFALG_HASH_KEEP)) #define NO_INTM_HASH_TEST #endif @@ -364,9 +370,7 @@ int decodedCertCache_test(void); #ifdef HAVE_IDEA int idea_test(void); #endif -#ifdef WOLFSSL_STATIC_MEMORY int memory_test(void); -#endif #ifdef HAVE_VALGRIND int mp_test(void); #endif @@ -463,6 +467,24 @@ int wolfssl_pb_print(const char* msg, ...) } #endif /* WOLFSSL_PB */ +/* optional macro to add sleep between tests */ +#ifdef TEST_SLEEP + #include /* for var args */ + static WC_INLINE void test_pass(const char* fmt, ...) + { + va_list args; + va_start(args, fmt); + printf(fmt, args); + va_end(args); + TEST_SLEEP(); + } +#else + /* redirect to printf */ + #define test_pass printf + /* stub the sleep macro */ + #define TEST_SLEEP() +#endif + #ifdef HAVE_STACK_SIZE THREAD_RETURN WOLFSSL_THREAD wolfcrypt_test(void* args) #else @@ -523,24 +545,29 @@ initDefaultName(); if ( (ret = wolfCrypt_SelfTest()) != 0) return err_sys("CAVP selftest failed!\n", ret); else - printf("CAVP selftest passed!\n"); + test_pass("CAVP selftest passed!\n"); #endif if ( (ret = error_test()) != 0) return err_sys("error test failed!\n", ret); else - printf( "error test passed!\n"); + test_pass("error test passed!\n"); + + if ( (ret = memory_test()) != 0) + return err_sys("MEMORY test failed!\n", ret); + else + test_pass("MEMORY test passed!\n"); #ifndef NO_CODING if ( (ret = base64_test()) != 0) return err_sys("base64 test failed!\n", ret); else - printf( "base64 test passed!\n"); + test_pass("base64 test passed!\n"); #ifdef WOLFSSL_BASE16 if ( (ret = base16_test()) != 0) return err_sys("base16 test failed!\n", ret); else - printf( "base16 test passed!\n"); + test_pass("base16 test passed!\n"); #endif #endif /* !NO_CODING */ @@ -548,89 +575,89 @@ initDefaultName(); if ( (ret = asn_test()) != 0) return err_sys("asn test failed!\n", ret); else - printf( "asn test passed!\n"); + test_pass("asn test passed!\n"); #endif #ifndef NO_MD5 if ( (ret = md5_test()) != 0) return err_sys("MD5 test failed!\n", ret); else - printf( "MD5 test passed!\n"); + test_pass("MD5 test passed!\n"); #endif #ifdef WOLFSSL_MD2 if ( (ret = md2_test()) != 0) return err_sys("MD2 test failed!\n", ret); else - printf( "MD2 test passed!\n"); + test_pass("MD2 test passed!\n"); #endif #ifndef NO_MD4 if ( (ret = md4_test()) != 0) return err_sys("MD4 test failed!\n", ret); else - printf( "MD4 test passed!\n"); + test_pass("MD4 test passed!\n"); #endif #ifndef NO_SHA if ( (ret = sha_test()) != 0) return err_sys("SHA test failed!\n", ret); else - printf( "SHA test passed!\n"); + test_pass("SHA test passed!\n"); #endif #ifdef WOLFSSL_SHA224 if ( (ret = sha224_test()) != 0) return err_sys("SHA-224 test failed!\n", ret); else - printf( "SHA-224 test passed!\n"); + test_pass("SHA-224 test passed!\n"); #endif #ifndef NO_SHA256 if ( (ret = sha256_test()) != 0) return err_sys("SHA-256 test failed!\n", ret); else - printf( "SHA-256 test passed!\n"); + test_pass("SHA-256 test passed!\n"); #endif #ifdef WOLFSSL_SHA384 if ( (ret = sha384_test()) != 0) return err_sys("SHA-384 test failed!\n", ret); else - printf( "SHA-384 test passed!\n"); + test_pass("SHA-384 test passed!\n"); #endif #ifdef WOLFSSL_SHA512 if ( (ret = sha512_test()) != 0) return err_sys("SHA-512 test failed!\n", ret); else - printf( "SHA-512 test passed!\n"); + test_pass("SHA-512 test passed!\n"); #endif #ifdef WOLFSSL_SHA3 if ( (ret = sha3_test()) != 0) return err_sys("SHA-3 test failed!\n", ret); else - printf( "SHA-3 test passed!\n"); + test_pass("SHA-3 test passed!\n"); #endif if ( (ret = hash_test()) != 0) return err_sys("Hash test failed!\n", ret); else - printf( "Hash test passed!\n"); + test_pass("Hash test passed!\n"); #ifdef WOLFSSL_RIPEMD if ( (ret = ripemd_test()) != 0) return err_sys("RIPEMD test failed!\n", ret); else - printf( "RIPEMD test passed!\n"); + test_pass("RIPEMD test passed!\n"); #endif #ifdef HAVE_BLAKE2 if ( (ret = blake2b_test()) != 0) return err_sys("BLAKE2b test failed!\n", ret); else - printf( "BLAKE2b test passed!\n"); + test_pass("BLAKE2b test passed!\n"); #endif #ifndef NO_HMAC @@ -638,49 +665,49 @@ initDefaultName(); if ( (ret = hmac_md5_test()) != 0) return err_sys("HMAC-MD5 test failed!\n", ret); else - printf( "HMAC-MD5 test passed!\n"); + test_pass("HMAC-MD5 test passed!\n"); #endif #ifndef NO_SHA if ( (ret = hmac_sha_test()) != 0) return err_sys("HMAC-SHA test failed!\n", ret); else - printf( "HMAC-SHA test passed!\n"); + test_pass("HMAC-SHA test passed!\n"); #endif #ifdef WOLFSSL_SHA224 if ( (ret = hmac_sha224_test()) != 0) return err_sys("HMAC-SHA224 test failed!\n", ret); else - printf( "HMAC-SHA224 test passed!\n"); + test_pass("HMAC-SHA224 test passed!\n"); #endif #ifndef NO_SHA256 if ( (ret = hmac_sha256_test()) != 0) return err_sys("HMAC-SHA256 test failed!\n", ret); else - printf( "HMAC-SHA256 test passed!\n"); + test_pass("HMAC-SHA256 test passed!\n"); #endif #ifdef WOLFSSL_SHA384 if ( (ret = hmac_sha384_test()) != 0) return err_sys("HMAC-SHA384 test failed!\n", ret); else - printf( "HMAC-SHA384 test passed!\n"); + test_pass("HMAC-SHA384 test passed!\n"); #endif #ifdef WOLFSSL_SHA512 if ( (ret = hmac_sha512_test()) != 0) return err_sys("HMAC-SHA512 test failed!\n", ret); else - printf( "HMAC-SHA512 test passed!\n"); + test_pass("HMAC-SHA512 test passed!\n"); #endif #ifdef HAVE_BLAKE2 if ( (ret = hmac_blake2b_test()) != 0) return err_sys("HMAC-BLAKE2 test failed!\n", ret); else - printf( "HMAC-BLAKE2 test passed!\n"); + test_pass("HMAC-BLAKE2 test passed!\n"); #endif #if !defined(NO_HMAC) && defined(WOLFSSL_SHA3) && \ @@ -689,14 +716,14 @@ initDefaultName(); if ( (ret = hmac_sha3_test()) != 0) return err_sys("HMAC-SHA3 test failed!\n", ret); else - printf( "HMAC-SHA3 test passed!\n"); + test_pass("HMAC-SHA3 test passed!\n"); #endif #ifdef HAVE_HKDF if ( (ret = hkdf_test()) != 0) return err_sys("HMAC-KDF test failed!\n", ret); else - printf( "HMAC-KDF test passed!\n"); + test_pass("HMAC-KDF test passed!\n"); #endif #endif /* !NO_HMAC */ @@ -704,7 +731,7 @@ initDefaultName(); if ( (ret = x963kdf_test()) != 0) return err_sys("X963-KDF test failed!\n", ret); else - printf( "X963-KDF test passed!\n"); + test_pass("X963-KDF test passed!\n"); #endif #if defined(HAVE_AESGCM) && defined(WOLFSSL_AES_128) && \ @@ -712,83 +739,83 @@ initDefaultName(); if ( (ret = gmac_test()) != 0) return err_sys("GMAC test failed!\n", ret); else - printf( "GMAC test passed!\n"); + test_pass("GMAC test passed!\n"); #endif #ifndef NO_RC4 if ( (ret = arc4_test()) != 0) return err_sys("ARC4 test failed!\n", ret); else - printf( "ARC4 test passed!\n"); + test_pass("ARC4 test passed!\n"); #endif #ifndef NO_HC128 if ( (ret = hc128_test()) != 0) return err_sys("HC-128 test failed!\n", ret); else - printf( "HC-128 test passed!\n"); + test_pass("HC-128 test passed!\n"); #endif #ifndef NO_RABBIT if ( (ret = rabbit_test()) != 0) return err_sys("Rabbit test failed!\n", ret); else - printf( "Rabbit test passed!\n"); + test_pass("Rabbit test passed!\n"); #endif #ifdef HAVE_CHACHA if ( (ret = chacha_test()) != 0) return err_sys("Chacha test failed!\n", ret); else - printf( "Chacha test passed!\n"); + test_pass("Chacha test passed!\n"); #endif #ifdef HAVE_POLY1305 if ( (ret = poly1305_test()) != 0) return err_sys("POLY1305 test failed!\n", ret); else - printf( "POLY1305 test passed!\n"); + test_pass("POLY1305 test passed!\n"); #endif #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) if ( (ret = chacha20_poly1305_aead_test()) != 0) return err_sys("ChaCha20-Poly1305 AEAD test failed!\n", ret); else - printf( "ChaCha20-Poly1305 AEAD test passed!\n"); + test_pass("ChaCha20-Poly1305 AEAD test passed!\n"); #endif #ifndef NO_DES3 if ( (ret = des_test()) != 0) return err_sys("DES test failed!\n", ret); else - printf( "DES test passed!\n"); + test_pass("DES test passed!\n"); #endif #ifndef NO_DES3 if ( (ret = des3_test()) != 0) return err_sys("DES3 test failed!\n", ret); else - printf( "DES3 test passed!\n"); + test_pass("DES3 test passed!\n"); #endif #ifndef NO_AES if ( (ret = aes_test()) != 0) return err_sys("AES test failed!\n", ret); else - printf( "AES test passed!\n"); + test_pass("AES test passed!\n"); #ifdef WOLFSSL_AES_192 if ( (ret = aes192_test()) != 0) return err_sys("AES192 test failed!\n", ret); else - printf( "AES192 test passed!\n"); + test_pass("AES192 test passed!\n"); #endif #ifdef WOLFSSL_AES_256 if ( (ret = aes256_test()) != 0) return err_sys("AES256 test failed!\n", ret); else - printf( "AES256 test passed!\n"); + test_pass("AES256 test passed!\n"); #endif #ifdef HAVE_AESGCM #if !defined(WOLFSSL_AFALG) && !defined(WOLFSSL_DEVCRYPTO) @@ -800,20 +827,20 @@ initDefaultName(); return err_sys("AES-GCM test failed!\n", ret); } #endif - printf( "AES-GCM test passed!\n"); + test_pass("AES-GCM test passed!\n"); #endif #if defined(HAVE_AESCCM) && defined(WOLFSSL_AES_128) if ( (ret = aesccm_test()) != 0) return err_sys("AES-CCM test failed!\n", ret); else - printf( "AES-CCM test passed!\n"); + test_pass("AES-CCM test passed!\n"); #endif #ifdef HAVE_AES_KEYWRAP if ( (ret = aeskeywrap_test()) != 0) return err_sys("AES Key Wrap test failed!\n", ret); else - printf( "AES Key Wrap test passed!\n"); + test_pass("AES Key Wrap test passed!\n"); #endif #endif @@ -821,96 +848,89 @@ initDefaultName(); if ( (ret = camellia_test()) != 0) return err_sys("CAMELLIA test failed!\n", ret); else - printf( "CAMELLIA test passed!\n"); + test_pass("CAMELLIA test passed!\n"); #endif #ifdef HAVE_IDEA if ( (ret = idea_test()) != 0) return err_sys("IDEA test failed!\n", ret); else - printf( "IDEA test passed!\n"); + test_pass("IDEA test passed!\n"); #endif #ifndef WC_NO_RNG if ( (ret = random_test()) != 0) return err_sys("RANDOM test failed!\n", ret); else - printf( "RANDOM test passed!\n"); + test_pass("RANDOM test passed!\n"); #endif /* WC_NO_RNG */ -#ifdef WOLFSSL_STATIC_MEMORY - if ( (ret = memory_test()) != 0) - return err_sys("MEMORY test failed!\n", ret); - else - printf( "MEMORY test passed!\n"); -#endif - #ifndef NO_RSA #ifdef WC_RSA_NO_PADDING if ( (ret = rsa_no_pad_test()) != 0) return err_sys("RSA NOPAD test failed!\n", ret); else - printf( "RSA NOPAD test passed!\n"); + test_pass("RSA NOPAD test passed!\n"); #endif if ( (ret = rsa_test()) != 0) return err_sys("RSA test failed!\n", ret); else - printf( "RSA test passed!\n"); + test_pass("RSA test passed!\n"); #endif #ifndef NO_DH if ( (ret = dh_test()) != 0) return err_sys("DH test failed!\n", ret); else - printf( "DH test passed!\n"); + test_pass("DH test passed!\n"); #endif #ifndef NO_DSA if ( (ret = dsa_test()) != 0) return err_sys("DSA test failed!\n", ret); else - printf( "DSA test passed!\n"); + test_pass("DSA test passed!\n"); #endif #ifdef WOLFCRYPT_HAVE_SRP if ( (ret = srp_test()) != 0) return err_sys("SRP test failed!\n", ret); else - printf( "SRP test passed!\n"); + test_pass("SRP test passed!\n"); #endif #ifndef NO_PWDBASED if ( (ret = pwdbased_test()) != 0) return err_sys("PWDBASED test failed!\n", ret); else - printf( "PWDBASED test passed!\n"); + test_pass("PWDBASED test passed!\n"); #endif #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) if ( (ret = openssl_test()) != 0) return err_sys("OPENSSL test failed!\n", ret); else - printf( "OPENSSL test passed!\n"); + test_pass("OPENSSL test passed!\n"); if ( (ret = openSSL_evpMD_test()) != 0) return err_sys("OPENSSL (EVP MD) test failed!\n", ret); else - printf( "OPENSSL (EVP MD) passed!\n"); + test_pass("OPENSSL (EVP MD) passed!\n"); if ( (ret = openssl_pkey0_test()) != 0) return err_sys("OPENSSL (PKEY0) test failed!\n", ret); else - printf( "OPENSSL (PKEY0) passed!\n"); + test_pass("OPENSSL (PKEY0) passed!\n"); if ( (ret = openssl_pkey1_test()) != 0) return err_sys("OPENSSL (PKEY1) test failed!\n", ret); else - printf( "OPENSSL (PKEY1) passed!\n"); + test_pass("OPENSSL (PKEY1) passed!\n"); if ( (ret = openssl_evpSig_test()) != 0) return err_sys("OPENSSL (EVP Sign/Verify) test failed!\n", ret); else - printf( "OPENSSL (EVP Sign/Verify) passed!\n"); + test_pass("OPENSSL (EVP Sign/Verify) passed!\n"); #endif @@ -918,18 +938,18 @@ initDefaultName(); if ( (ret = ecc_test()) != 0) return err_sys("ECC test failed!\n", ret); else - printf( "ECC test passed!\n"); + test_pass("ECC test passed!\n"); #if defined(HAVE_ECC_ENCRYPT) && defined(WOLFSSL_AES_128) if ( (ret = ecc_encrypt_test()) != 0) return err_sys("ECC Enc test failed!\n", ret); else - printf( "ECC Enc test passed!\n"); + test_pass("ECC Enc test passed!\n"); #endif #ifdef USE_CERT_BUFFERS_256 if ( (ret = ecc_test_buffers()) != 0) return err_sys("ECC buffer test failed!\n", ret); else - printf( "ECC buffer test passed!\n"); + test_pass("ECC buffer test passed!\n"); #endif #endif @@ -938,7 +958,7 @@ initDefaultName(); if ( (ret = cert_test()) != 0) return err_sys("CERT test failed!\n", ret); else - printf( "CERT test passed!\n"); + test_pass("CERT test passed!\n"); #endif #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_TEST_CERT) && \ @@ -946,7 +966,7 @@ initDefaultName(); if ( (ret = certext_test()) != 0) return err_sys("CERT EXT test failed!\n", ret); else - printf( "CERT EXT test passed!\n"); + test_pass("CERT EXT test passed!\n"); #endif #if defined(WOLFSSL_CERT_GEN_CACHE) && defined(WOLFSSL_TEST_CERT) && \ @@ -954,35 +974,35 @@ initDefaultName(); if ( (ret = decodedCertCache_test()) != 0) return err_sys("DECODED CERT CACHE test failed!\n", ret); else - printf( "DECODED CERT CACHE test passed!\n"); + test_pass("DECODED CERT CACHE test passed!\n"); #endif #ifdef HAVE_CURVE25519 if ( (ret = curve25519_test()) != 0) return err_sys("CURVE25519 test failed!\n", ret); else - printf( "CURVE25519 test passed!\n"); + test_pass("CURVE25519 test passed!\n"); #endif #ifdef HAVE_ED25519 if ( (ret = ed25519_test()) != 0) return err_sys("ED25519 test failed!\n", ret); else - printf( "ED25519 test passed!\n"); + test_pass("ED25519 test passed!\n"); #endif #if defined(WOLFSSL_CMAC) && !defined(NO_AES) if ( (ret = cmac_test()) != 0) return err_sys("CMAC test failed!\n", ret); else - printf( "CMAC test passed!\n"); + test_pass("CMAC test passed!\n"); #endif #ifdef HAVE_LIBZ if ( (ret = compress_test()) != 0) return err_sys("COMPRESS test failed!\n", ret); else - printf( "COMPRESS test passed!\n"); + test_pass("COMPRESS test passed!\n"); #endif #ifdef HAVE_PKCS7 @@ -990,29 +1010,29 @@ initDefaultName(); if ( (ret = pkcs7encrypted_test()) != 0) return err_sys("PKCS7encrypted test failed!\n", ret); else - printf( "PKCS7encrypted test passed!\n"); + test_pass("PKCS7encrypted test passed!\n"); #endif #if defined(HAVE_LIBZ) && !defined(NO_PKCS7_COMPRESSED_DATA) if ( (ret = pkcs7compressed_test()) != 0) return err_sys("PKCS7compressed test failed!\n", ret); else - printf( "PKCS7compressed test passed!\n"); + test_pass("PKCS7compressed test passed!\n"); #endif if ( (ret = pkcs7signed_test()) != 0) return err_sys("PKCS7signed test failed!\n", ret); else - printf( "PKCS7signed test passed!\n"); + test_pass("PKCS7signed test passed!\n"); if ( (ret = pkcs7enveloped_test()) != 0) return err_sys("PKCS7enveloped test failed!\n", ret); else - printf( "PKCS7enveloped test passed!\n"); + test_pass("PKCS7enveloped test passed!\n"); #if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) if ( (ret = pkcs7authenveloped_test()) != 0) return err_sys("PKCS7authenveloped test failed!\n", ret); else - printf( "PKCS7authenveloped test passed!\n"); + test_pass("PKCS7authenveloped test passed!\n"); #endif #endif @@ -1020,14 +1040,14 @@ initDefaultName(); if ( (ret = mp_test()) != 0) return err_sys("mp test failed!\n", ret); else - printf( "mp test passed!\n"); + test_pass("mp test passed!\n"); #endif #if defined(WOLFSSL_PUBLIC_MP) && !defined(WOLFSSL_SP_MATH) if ( (ret = prime_test()) != 0) return err_sys("prime test failed!\n", ret); else - printf( "prime test passed!\n"); + test_pass("prime test passed!\n"); #endif #if defined(ASN_BER_TO_DER) && \ @@ -1036,45 +1056,45 @@ initDefaultName(); if ( (ret = berder_test()) != 0) return err_sys("ber-der test failed!\n", ret); else - printf( "ber-der test passed!\n"); + test_pass("ber-der test passed!\n"); #endif if ( (ret = logging_test()) != 0) return err_sys("logging test failed!\n", ret); else - printf( "logging test passed!\n"); + test_pass("logging test passed!\n"); if ( (ret = mutex_test()) != 0) return err_sys("mutex test failed!\n", ret); else - printf( "mutex test passed!\n"); + test_pass("mutex test passed!\n"); #if defined(USE_WOLFSSL_MEMORY) && !defined(FREERTOS) if ( (ret = memcb_test()) != 0) return err_sys("memcb test failed!\n", ret); else - printf( "memcb test passed!\n"); + test_pass("memcb test passed!\n"); #endif #ifdef WOLFSSL_IMX6_CAAM_BLOB if ( (ret = blob_test()) != 0) return err_sys("blob test failed!\n", ret); else - printf( "blob test passed!\n"); + test_pass("blob test passed!\n"); #endif #ifdef WOLF_CRYPTO_CB if ( (ret = cryptocb_test()) != 0) return err_sys("crypto callback test failed!\n", ret); else - printf( "crypto callback test passed!\n"); + test_pass("crypto callback test passed!\n"); #endif #ifdef WOLFSSL_CERT_PIV if ( (ret = certpiv_test()) != 0) return err_sys("cert piv test failed!\n", ret); else - printf( "cert piv test passed!\n"); + test_pass("cert piv test passed!\n"); #endif #ifdef WOLFSSL_ASYNC_CRYPT @@ -1089,7 +1109,7 @@ initDefaultName(); if (args) ((func_args*)args)->return_code = ret; - printf("Test complete\n"); + test_pass("Test complete\n"); EXIT_TEST(ret); } @@ -8485,19 +8505,54 @@ int random_test(void) #endif /* HAVE_HASHDRBG && !CUSTOM_RAND_GENERATE_BLOCK */ #endif /* WC_NO_RNG */ +#ifndef MEM_TEST_SZ + #define MEM_TEST_SZ 1024 +#endif + +static int simple_mem_test(int sz) +{ + int ret = 0; + byte* b = NULL; + int i; + + b = (byte*)XMALLOC(sz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (b == NULL) { + return -6517; + } + /* utilize memory */ + for (i = 0; i < sz; i++) { + b[i] = (byte)i; + } + /* read back and verify */ + for (i = 0; i < sz; i++) { + if (b[i] != (byte)i) { + ret = -6518; + break; + } + } + XFREE(b, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + return ret; +} -#ifdef WOLFSSL_STATIC_MEMORY int memory_test(void) { int ret = 0; - unsigned int i; +#ifndef USE_FAST_MATH + byte* b = NULL; +#endif +#if defined(COMPLEX_MEM_TEST) || defined(WOLFSSL_STATIC_MEMORY) + int i; +#endif +#ifdef WOLFSSL_STATIC_MEMORY word32 size[] = { WOLFMEM_BUCKETS }; word32 dist[] = { WOLFMEM_DIST }; byte buffer[30000]; /* make large enough to involve many bucket sizes */ int pad = -(int)((wolfssl_word)&(buffer[0])) & (WOLFSSL_STATIC_ALIGN - 1); /* pad to account for if head of buffer is not at set memory * alignment when tests are ran */ +#endif +#ifdef WOLFSSL_STATIC_MEMORY /* check macro settings */ if (sizeof(size)/sizeof(word32) != WOLFMEM_MAX_BUCKETS) { return -6500; @@ -8581,9 +8636,37 @@ int memory_test(void) } (void)dist; /* avoid static analysis warning of variable not used */ +#endif + + /* simple test */ + ret = simple_mem_test(MEM_TEST_SZ); + if (ret != 0) + return ret; + +#ifdef COMPLEX_MEM_TEST + /* test various size blocks */ + for (i = 1; i < MEM_TEST_SZ; i*=2) { + ret = simple_mem_test(i); + if (ret != 0) + return ret; + } +#endif + +#ifndef USE_FAST_MATH + /* realloc test */ + b = (byte*)XMALLOC(MEM_TEST_SZ, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (b) { + b = (byte*)XREALLOC(b, MEM_TEST_SZ+sizeof(word32), HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + } + if (b == NULL) { + return -6519; + } + XFREE(b, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return 0; } -#endif /* WOLFSSL_STATIC_MEMORY */ #ifdef HAVE_NTRU @@ -9974,6 +10057,7 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) XMEMCPY(sig, out, outSz); plain = NULL; + TEST_SLEEP(); do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -9988,6 +10072,7 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) if (ret <= 0) ERROR_OUT(-6819, exit_rsa_pss); plainSz = ret; + TEST_SLEEP(); #ifdef HAVE_SELFTEST ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, plain, plainSz, @@ -10041,6 +10126,7 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) if (ret <= 0) ERROR_OUT(-6822, exit_rsa_pss); outSz = ret; + TEST_SLEEP(); do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -10055,6 +10141,7 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) if (ret <= 0) ERROR_OUT(-6823, exit_rsa_pss); plainSz = ret; + TEST_SLEEP(); do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -10089,6 +10176,7 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) if (ret <= 0) ERROR_OUT(-6825, exit_rsa_pss); plainSz = ret; + TEST_SLEEP(); #ifdef HAVE_SELFTEST ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, plain, plainSz, hash[0], @@ -10128,6 +10216,7 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) } while (ret == WC_PENDING_E); if (ret != PSS_SALTLEN_E) ERROR_OUT(-6828, exit_rsa_pss); + TEST_SLEEP(); do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -10141,6 +10230,7 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) } while (ret == WC_PENDING_E); if (ret != PSS_SALTLEN_E) ERROR_OUT(-6829, exit_rsa_pss); + TEST_SLEEP(); do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -10154,6 +10244,7 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) } while (ret == WC_PENDING_E); if (ret != PSS_SALTLEN_E) ERROR_OUT(-6830, exit_rsa_pss); + TEST_SLEEP(); #ifdef HAVE_SELFTEST ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, plain, plainSz, hash[0], @@ -10286,6 +10377,7 @@ int rsa_no_pad_test(void) if (XMEMCMP(out, tmp, inLen) == 0) { ERROR_OUT(-6907, exit_rsa_nopadding); } + TEST_SLEEP(); /* decrypt with public key and compare result */ do { @@ -10304,6 +10396,7 @@ int rsa_no_pad_test(void) if (XMEMCMP(plain, tmp, inLen) != 0) { ERROR_OUT(-6909, exit_rsa_nopadding); } + TEST_SLEEP(); #endif #ifdef WC_RSA_BLINDING @@ -10332,6 +10425,7 @@ int rsa_no_pad_test(void) if (ret < 0) { ERROR_OUT(-6912, exit_rsa_nopadding); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_VERIFY_ONLY */ #ifndef WOLFSSL_RSA_PUBLIC_ONLY @@ -10351,6 +10445,7 @@ int rsa_no_pad_test(void) if (XMEMCMP(plain, tmp, inLen) != 0) { ERROR_OUT(-6914, exit_rsa_nopadding); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ /* test some bad arguments */ @@ -10922,6 +11017,7 @@ static int rsa_keygen_test(WC_RNG* rng) if (ret != 0) { ERROR_OUT(-6963, exit_rsa); } + TEST_SLEEP(); /* If not using old FIPS, or not using FAST or USER RSA... */ #if !defined(HAVE_FAST_RSA) && !defined(HAVE_USER_RSA) && \ @@ -11143,6 +11239,7 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7006, exit_rsa); } + TEST_SLEEP(); #ifdef WC_RSA_BLINDING { @@ -11171,6 +11268,8 @@ int rsa_test(void) if (XMEMCMP(plain, in, inLen)) { ERROR_OUT(-7009, exit_rsa); } + TEST_SLEEP(); + do { #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); @@ -11188,6 +11287,7 @@ int rsa_test(void) if (XMEMCMP(res, in, inLen)) { ERROR_OUT(-7012, exit_rsa); } + TEST_SLEEP(); do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -11200,6 +11300,8 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7013, exit_rsa); } + TEST_SLEEP(); + #elif defined(WOLFSSL_MP_PUBLIC) (void)outSz; (void)inLen; @@ -11270,6 +11372,7 @@ int rsa_test(void) if (XMEMCMP(plain, in, (size_t)ret)) { ERROR_OUT(-7015, exit_rsa); } + TEST_SLEEP(); #endif #ifndef WOLFSSL_RSA_VERIFY_ONLY @@ -11293,6 +11396,7 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7016, exit_rsa); } + TEST_SLEEP(); idx = (word32)ret; do { @@ -11311,6 +11415,7 @@ int rsa_test(void) if (XMEMCMP(plain, in, inLen)) { ERROR_OUT(-7018, exit_rsa); } + TEST_SLEEP(); #endif /* NO_SHA */ #ifndef NO_SHA256 @@ -11328,6 +11433,7 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7019, exit_rsa); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_VERIFY_ONLY */ idx = (word32)ret; @@ -11348,6 +11454,7 @@ int rsa_test(void) if (XMEMCMP(plain, in, inLen)) { ERROR_OUT(-7021, exit_rsa); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ #ifndef WOLFSSL_RSA_PUBLIC_ONLY @@ -11369,6 +11476,7 @@ int rsa_test(void) if (XMEMCMP(res, in, inLen)) { ERROR_OUT(-7024, exit_rsa); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ /* check fails if not using the same optional label */ @@ -11386,6 +11494,7 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7025, exit_rsa); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_VERIFY_ONLY */ /* TODO: investigate why Cavium Nitrox doesn't detect decrypt error here */ @@ -11404,6 +11513,7 @@ int rsa_test(void) ERROR_OUT(-7026, exit_rsa); } ret = 0; + TEST_SLEEP(); #endif /* !HAVE_CAVIUM */ /* check using optional label with encrypt/decrypt */ @@ -11421,6 +11531,7 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7027, exit_rsa); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_VERIFY_ONLY */ idx = (word32)ret; @@ -11441,6 +11552,7 @@ int rsa_test(void) if (XMEMCMP(plain, in, inLen)) { ERROR_OUT(-7029, exit_rsa); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ #ifndef WOLFSSL_RSA_VERIFY_ONLY @@ -11459,9 +11571,10 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7030, exit_rsa); } + TEST_SLEEP(); -/* TODO: investigate why Cavium Nitrox doesn't detect decrypt error here */ -#if !defined(HAVE_CAVIUM) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) + /* TODO: investigate why Cavium Nitrox doesn't detect decrypt error here */ + #if !defined(HAVE_CAVIUM) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) idx = (word32)ret; do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -11477,12 +11590,13 @@ int rsa_test(void) ERROR_OUT(-7031, exit_rsa); } ret = 0; -#endif /* !HAVE_CAVIUM */ - #endif /* NO_SHA*/ + TEST_SLEEP(); + #endif /* !HAVE_CAVIUM */ + #endif /* NO_SHA */ #endif /* WOLFSSL_RSA_VERIFY_ONLY */ - #endif /* NO_SHA256 */ +#endif /* NO_SHA256 */ - #ifdef WOLFSSL_SHA512 +#ifdef WOLFSSL_SHA512 /* Check valid RSA key size is used while using hash length of SHA512 If key size is less than (hash length * 2) + 2 then is invalid use and test, since OAEP padding requires this. @@ -11501,6 +11615,7 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7032, exit_rsa); } + TEST_SLEEP(); idx = ret; #ifndef WOLFSSL_RSA_PUBLIC_ONLY @@ -11520,9 +11635,10 @@ int rsa_test(void) if (XMEMCMP(plain, in, inLen)) { ERROR_OUT(-7034, exit_rsa); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ } - #endif /* WOLFSSL_SHA512 */ +#endif /* WOLFSSL_SHA512 */ /* check using pkcsv15 padding with _ex API */ XMEMSET(plain, 0, plainSz); @@ -11538,6 +11654,7 @@ int rsa_test(void) if (ret < 0) { ERROR_OUT(-7035, exit_rsa); } + TEST_SLEEP(); idx = (word32)ret; #ifndef WOLFSSL_RSA_PUBLIC_ONLY @@ -11557,6 +11674,7 @@ int rsa_test(void) if (XMEMCMP(plain, in, inLen)) { ERROR_OUT(-7037, exit_rsa); } + TEST_SLEEP(); #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ #endif /* !HAVE_FAST_RSA && !HAVE_FIPS */ #endif /* WC_NO_RSA_OAEP */ @@ -15411,6 +15529,7 @@ static int ecc_test_vector_item(const eccVector* vector) } while (ret == WC_PENDING_E); if (ret != 0) goto done; + TEST_SLEEP(); if (verify != 1) ret = -8309; @@ -15716,6 +15835,7 @@ static int ecc_test_cdh_vectors(void) if (ret != 0) { goto done; } + TEST_SLEEP(); /* read in expected Z */ z = sizeof(sharedB); @@ -15826,6 +15946,7 @@ static int ecc_test_make_pub(WC_RNG* rng) if (ret == 0) { ERROR_OUT(-8320, done); } + TEST_SLEEP(); pubPoint = wc_ecc_new_point_h(HEAP_HINT); if (pubPoint == NULL) { @@ -15836,6 +15957,7 @@ static int ecc_test_make_pub(WC_RNG* rng) if (ret != 0) { ERROR_OUT(-8322, done); } + TEST_SLEEP(); #ifdef HAVE_ECC_KEY_EXPORT /* export should still fail, is private only key */ @@ -15859,6 +15981,7 @@ static int ecc_test_make_pub(WC_RNG* rng) if (ret != 0) { ERROR_OUT(-8324, done); } + TEST_SLEEP(); #ifdef HAVE_ECC_VERIFY /* try verify with private only key */ @@ -15877,6 +16000,7 @@ static int ecc_test_make_pub(WC_RNG* rng) if (verify != 1) { ERROR_OUT(-8326, done); } + TEST_SLEEP(); #ifdef HAVE_ECC_KEY_EXPORT /* exporting the public part should now work */ x = FOURK_BUF; @@ -15921,6 +16045,7 @@ static int ecc_test_make_pub(WC_RNG* rng) if (ret != 0) { ERROR_OUT(-8331, done); } + TEST_SLEEP(); x = FOURK_BUF; do { @@ -15935,6 +16060,7 @@ static int ecc_test_make_pub(WC_RNG* rng) if (ret != 0) { ERROR_OUT(-8332, done); } + TEST_SLEEP(); #endif /* HAVE_ECC_DHE && HAVE_ECC_KEY_EXPORT */ ret = 0; @@ -15982,10 +16108,12 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) #endif if (ret != 0) goto done; + TEST_SLEEP(); ret = wc_ecc_check_key(&userA); if (ret != 0) goto done; + TEST_SLEEP(); derSz = wc_EccKeyToDer(&userA, der, FOURK_BUF); if (derSz < 0) { @@ -15993,7 +16121,7 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) } ret = SaveDerAndPem(der, derSz, pem, FOURK_BUF, eccCaKeyTempFile, - eccCaKeyPemFile, ECC_PRIVATEKEY_TYPE, -6510); + eccCaKeyPemFile, ECC_PRIVATEKEY_TYPE, -8347); if (ret != 0) { goto done; } @@ -16008,12 +16136,12 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) } ret = SaveDerAndPem(der, derSz, NULL, 0, eccPubKeyDerFile, - NULL, 0, -6515); + NULL, 0, -8348); if (ret != 0) { goto done; } - /* test export of PKCS#8 unecrypted private key */ + /* test export of PKCS#8 unencrypted private key */ pkcs8Sz = FOURK_BUF; derSz = wc_EccPrivateKeyToPKCS8(&userA, der, &pkcs8Sz); if (derSz < 0) { @@ -16025,7 +16153,7 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize) } ret = SaveDerAndPem(der, derSz, NULL, 0, eccPkcs8KeyDerFile, - NULL, 0, -6517); + NULL, 0, -8349); if (ret != 0) { goto done; } @@ -16095,6 +16223,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, #endif if (ret != 0) goto done; + TEST_SLEEP(); if (wc_ecc_get_curve_idx(curve_id) != -1) { curveSize = wc_ecc_get_curve_size_from_id(userA.dp->id); @@ -16107,6 +16236,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, ret = wc_ecc_check_key(&userA); if (ret != 0) goto done; + TEST_SLEEP(); ret = wc_ecc_make_key_ex(rng, keySize, &userB, curve_id); #if defined(WOLFSSL_ASYNC_CRYPT) @@ -16114,6 +16244,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, #endif if (ret != 0) goto done; + TEST_SLEEP(); /* only perform the below tests if the key size matches */ if (dp == NULL && keySize > 0 && wc_ecc_size(&userA) != keySize) { @@ -16121,7 +16252,6 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, goto done; } - #ifdef HAVE_ECC_DHE x = ECC_SHARED_SIZE; do { @@ -16134,6 +16264,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, if (ret != 0) { goto done; } + TEST_SLEEP(); y = ECC_SHARED_SIZE; do { @@ -16151,6 +16282,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, if (XMEMCMP(sharedA, sharedB, x)) ERROR_OUT(-8339, done); + TEST_SLEEP(); #endif /* HAVE_ECC_DHE */ #ifdef HAVE_ECC_CDH @@ -16169,6 +16301,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, if (ret != 0) { goto done; } + TEST_SLEEP(); y = ECC_SHARED_SIZE; do { @@ -16186,6 +16319,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, if (XMEMCMP(sharedA, sharedB, x)) ERROR_OUT(-8341, done); + TEST_SLEEP(); /* remove cofactor flag */ wc_ecc_set_flags(&userA, 0); @@ -16223,6 +16357,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, if (XMEMCMP(sharedA, sharedB, y)) ERROR_OUT(-8342, done); + TEST_SLEEP(); #endif /* HAVE_ECC_DHE */ #ifdef HAVE_COMP_KEY @@ -16260,6 +16395,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, if (XMEMCMP(sharedA, sharedB, y)) ERROR_OUT(-8343, done); + TEST_SLEEP(); #endif /* HAVE_ECC_DHE */ #endif /* HAVE_COMP_KEY */ @@ -16286,6 +16422,7 @@ static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, } while (ret == WC_PENDING_E); if (ret != 0) goto done; + TEST_SLEEP(); #ifdef HAVE_ECC_VERIFY for (i=0; i #endif +#elif defined(WOLFSSL_TELIT_M2MB) + /* do nothing */ #else #ifndef SINGLE_THREADED #define WOLFSSL_PTHREADS diff --git a/wolfssl/wolfcrypt/types.h b/wolfssl/wolfcrypt/types.h index 44aebaa5a0..f5a19a26f9 100644 --- a/wolfssl/wolfcrypt/types.h +++ b/wolfssl/wolfcrypt/types.h @@ -257,6 +257,13 @@ const char* file, unsigned int line); #elif defined(XMALLOC_OVERRIDE) /* override the XMALLOC, XFREE and XREALLOC macros */ + #elif defined(WOLFSSL_TELIT_M2MB) + /* Telit M2MB SDK requires use m2mb_os API's, not std malloc/free */ + /* Use of malloc/free will cause CPU reboot */ + #define XMALLOC(s, h, t) ((void)h, (void)t, m2mb_os_malloc((s))) + #define XFREE(p, h, t) {void* xp = (p); if((xp)) m2mb_os_free((xp));} + #define XREALLOC(p, n, h, t) m2mb_os_realloc((p), (n)) + #elif defined(NO_WOLFSSL_MEMORY) /* just use plain C stdlib stuff if desired */ #include diff --git a/wolfssl/wolfcrypt/wc_port.h b/wolfssl/wolfcrypt/wc_port.h index 9aac9b1e8f..c1adf54d07 100644 --- a/wolfssl/wolfcrypt/wc_port.h +++ b/wolfssl/wolfcrypt/wc_port.h @@ -114,6 +114,32 @@ #ifndef SINGLE_THREADED #include #endif +#elif defined(WOLFSSL_TELIT_M2MB) + + /* Telit SDK uses C++ compile option (--cpp), which causes link issue + to API's if wrapped in extern "C" */ + #ifdef __cplusplus + } /* extern "C" */ + #endif + + #include "m2mb_types.h" + #include "m2mb_os_types.h" + #include "m2mb_os_api.h" + #include "m2mb_os.h" + #include "m2mb_os_mtx.h" + #ifndef NO_ASN_TIME + #include "m2mb_rtc.h" + #endif + #ifndef NO_FILESYSTEM + #include "m2mb_fs_posix.h" + #endif + + #undef kB /* eliminate conflict in asn.h */ + + #ifdef __cplusplus + extern "C" { + #endif + #else #ifndef SINGLE_THREADED #define WOLFSSL_PTHREADS @@ -195,6 +221,8 @@ typedef NU_SEMAPHORE wolfSSL_Mutex; #elif defined(WOLFSSL_ZEPHYR) typedef struct k_mutex wolfSSL_Mutex; + #elif defined(WOLFSSL_TELIT_M2MB) + typedef M2MB_OS_MTX_HANDLE wolfSSL_Mutex; #else #error Need a mutex type in multithreaded mode #endif /* USE_WINDOWS_API */ @@ -352,6 +380,19 @@ WOLFSSL_API int wolfCrypt_Cleanup(void); #define XBADFILE NULL #define XFGETS(b,s,f) -2 /* Not ported yet */ +#elif defined(WOLFSSL_TELIT_M2MB) + #define XFILE INT32 + #define XFOPEN(NAME, MODE) m2mb_fs_open((NAME), 0, (MODE)) + #define XFSEEK(F, O, W) m2mb_fs_lseek((F), (O), (W)) + #define XFTELL(F) m2mb_fs_lseek((F), 0, M2MB_SEEK_END) + #define XREWIND(F) (void)F + #define XFREAD(BUF, SZ, AMT, F) m2mb_fs_read((F), (BUF), (SZ)*(AMT)) + #define XFWRITE(BUF, SZ, AMT, F) m2mb_fs_write((F), (BUF), (SZ)*(AMT)) + #define XFCLOSE m2mb_fs_close + #define XSEEK_END M2MB_SEEK_END + #define XBADFILE -1 + #define XFGETS(b,s,f) -2 /* Not ported yet */ + #elif defined(WOLFSSL_USER_FILESYSTEM) /* To be defined in user_settings.h */ #else @@ -400,6 +441,11 @@ WOLFSSL_API int wolfCrypt_Cleanup(void); struct fs_dir_t dir; struct fs_dirent s; struct fs_dir_t* dirp; + + #elif defined(WOLFSSL_TELIT_M2MB) + M2MB_DIR_T* dir; + struct M2MB_DIRENT* entry; + struct M2MB_STAT s; #else struct dirent* entry; DIR* dir; @@ -546,6 +592,22 @@ WOLFSSL_API int wolfCrypt_Cleanup(void); #define USE_WOLF_TM +#elif defined(WOLFSSL_TELIT_M2MB) + typedef long time_t; + extern time_t m2mb_xtime(time_t * timer); + #define XTIME(tl) m2mb_xtime((tl)) + #ifdef WOLFSSL_TLS13 + extern time_t m2mb_xtime_ms(time_t * timer); + #define XTIME_MS(tl) m2mb_xtime_ms((tl)) + #endif + #ifndef NO_CRYPT_BENCHMARK + extern double m2mb_xtime_bench(int reset); + #define WOLFSSL_CURRTIME_REMAP m2mb_xtime_bench + #endif + #define XGMTIME(c, t) gmtime((c)) + #define WOLFSSL_GMTIME + #define USE_WOLF_TM + #else /* default */ /* uses complete facility */