From eba0ab5db2893b945fc3af3dbe4534864c1a0083 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Thu, 15 Dec 2022 17:41:41 +0800 Subject: [PATCH 01/22] Add million seconds time type. From RFC8446, the unit of ticket age is million seconds Signed-off-by: Jerry Yu --- include/mbedtls/check_config.h | 6 ++++++ include/mbedtls/debug.h | 4 ++++ include/mbedtls/mbedtls_config.h | 2 ++ include/mbedtls/platform_time.h | 6 ++++++ 4 files changed, 18 insertions(+) diff --git a/include/mbedtls/check_config.h b/include/mbedtls/check_config.h index 1efabdc1f..d3c9a9f11 100644 --- a/include/mbedtls/check_config.h +++ b/include/mbedtls/check_config.h @@ -448,6 +448,12 @@ #error "MBEDTLS_PLATFORM_TIME_MACRO defined, but not all prerequisites" #endif +#if defined(MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO) &&\ + ( !defined(MBEDTLS_PLATFORM_C) ||\ + !defined(MBEDTLS_HAVE_TIME) ) +#error "MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO defined, but not all prerequisites" +#endif + #if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) ||\ !defined(MBEDTLS_HAVE_TIME) ) diff --git a/include/mbedtls/debug.h b/include/mbedtls/debug.h index 2b0d00e4c..c1ad03275 100644 --- a/include/mbedtls/debug.h +++ b/include/mbedtls/debug.h @@ -131,6 +131,10 @@ #endif \ /* (defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 0) || (defined(_MSC_VER) && _MSC_VER < 1800) */ +#if !defined(MBEDTLS_PRINTF_MS_TIME) +#define MBEDTLS_PRINTF_MS_TIME MBEDTLS_PRINTF_LONGLONG +#endif /* MBEDTLS_PRINTF_MS_TIME */ + #ifdef __cplusplus extern "C" { #endif diff --git a/include/mbedtls/mbedtls_config.h b/include/mbedtls/mbedtls_config.h index 11c3139bd..34fdfccd2 100644 --- a/include/mbedtls/mbedtls_config.h +++ b/include/mbedtls/mbedtls_config.h @@ -3609,6 +3609,7 @@ //#define MBEDTLS_PLATFORM_SETBUF_MACRO setbuf /**< Default setbuf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ +//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO signed long long /**< Default millionseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It MUST be signed 64bit integer at least */ //#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ /* Note: your snprintf must correctly zero-terminate the buffer! */ @@ -3616,6 +3617,7 @@ //#define MBEDTLS_PLATFORM_VSNPRINTF_MACRO vsnprintf /**< Default vsnprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ +//#define MBEDTLS_PRINTF_MS_TIME MBEDTLS_PRINTF_LONGLONG /**< Default fmt for printf. That's avoid compiler warning if mbedtls_ms_time_t is redefined */ /** \def MBEDTLS_CHECK_RETURN * diff --git a/include/mbedtls/platform_time.h b/include/mbedtls/platform_time.h index eae6f5f87..e6f7e23bf 100644 --- a/include/mbedtls/platform_time.h +++ b/include/mbedtls/platform_time.h @@ -39,6 +39,12 @@ typedef MBEDTLS_PLATFORM_TIME_TYPE_MACRO mbedtls_time_t; typedef time_t mbedtls_time_t; #endif /* MBEDTLS_PLATFORM_TIME_TYPE_MACRO */ +#if defined(MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO) +typedef MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO mbedtls_ms_time_t; +#else +typedef signed long long mbedtls_ms_time_t; +#endif /* MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO */ + /* * The function pointers for time */ From 38257491aa7984eb5bfa2162b0155ccb897a9a6b Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Thu, 15 Dec 2022 17:54:47 +0800 Subject: [PATCH 02/22] Add milliseconds time function We provide windows and posix implementation for it. With MBEDTLS_PLATFORM_MS_TIME_ALT, user can provide their own implementation. Signed-off-by: Jerry Yu --- include/mbedtls/check_config.h | 6 +++++ include/mbedtls/mbedtls_config.h | 1 + include/mbedtls/platform_time.h | 10 ++++++++ library/platform_util.c | 40 ++++++++++++++++++++++++++++++++ scripts/config.py | 2 +- 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/include/mbedtls/check_config.h b/include/mbedtls/check_config.h index d3c9a9f11..18e6b5677 100644 --- a/include/mbedtls/check_config.h +++ b/include/mbedtls/check_config.h @@ -454,6 +454,12 @@ #error "MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO defined, but not all prerequisites" #endif +#if defined(MBEDTLS_PLATFORM_MS_TIME_ALT) && \ + ( !defined(MBEDTLS_PLATFORM_C) || \ + !defined(MBEDTLS_HAVE_TIME) ) +#error "MBEDTLS_PLATFORM_MS_TIME_ALT defined, but not all prerequisites" +#endif + #if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) ||\ !defined(MBEDTLS_HAVE_TIME) ) diff --git a/include/mbedtls/mbedtls_config.h b/include/mbedtls/mbedtls_config.h index 34fdfccd2..cfde4b7d0 100644 --- a/include/mbedtls/mbedtls_config.h +++ b/include/mbedtls/mbedtls_config.h @@ -234,6 +234,7 @@ //#define MBEDTLS_PLATFORM_VSNPRINTF_ALT //#define MBEDTLS_PLATFORM_NV_SEED_ALT //#define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT +//#define MBEDTLS_PLATFORM_MS_TIME_ALT /** * \def MBEDTLS_DEPRECATED_WARNING diff --git a/include/mbedtls/platform_time.h b/include/mbedtls/platform_time.h index e6f7e23bf..11618072f 100644 --- a/include/mbedtls/platform_time.h +++ b/include/mbedtls/platform_time.h @@ -45,6 +45,16 @@ typedef MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO mbedtls_ms_time_t; typedef signed long long mbedtls_ms_time_t; #endif /* MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO */ +/** + * \brief Get time in milliseconds. + * + * \return Current time in milliseconds + * + * \note If MBEDTLS_PLATFORM_MS_TIME_ALT defined, users can provide their own + * implementation. + */ +mbedtls_ms_time_t mbedtls_ms_time(void); + /* * The function pointers for time */ diff --git a/library/platform_util.c b/library/platform_util.c index f935b900e..1f60404fd 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -165,3 +165,43 @@ extern inline void mbedtls_put_unaligned_uint32(void *p, uint32_t x); extern inline uint64_t mbedtls_get_unaligned_uint64(const void *p); extern inline void mbedtls_put_unaligned_uint64(void *p, uint64_t x); + +#if defined(MBEDTLS_HAVE_TIME) && !defined(MBEDTLS_PLATFORM_MS_TIME_ALT) + +#include +#if !defined(_WIN32) && (defined(unix) || \ + defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ + defined(__MACH__))) +#include +#endif /* !_WIN32 && (unix || __unix || __unix__ || + * (__APPLE__ && __MACH__)) */ +#if (defined(_POSIX_VERSION) && _POSIX_VERSION >= 199309L) +mbedtls_ms_time_t mbedtls_ms_time(void) +{ + int ret; + struct timespec tv; + mbedtls_ms_time_t current_ms; + + ret = clock_gettime(CLOCK_REALTIME, &tv); + if (ret) { + return 0; + } + + current_ms = tv.tv_sec; + + return current_ms*1000 + tv.tv_nsec / 1000000; +} +#elif defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || \ + defined(__MINGW32__) || defined(_WIN64) +#include +mbedtls_ms_time_t mbedtls_ms_time(void) +{ + SYSTEMTIME st; + + GetSystemTime(&st); + return time(NULL)*1000LL + st.wMilliseconds; +} +#else +#error "No mbedtls_ms_time available" +#endif +#endif /* MBEDTLS_HAVE_TIME && !MBEDTLS_PLATFORM_MS_TIME_ALT */ diff --git a/scripts/config.py b/scripts/config.py index a53c470f0..06fc3fafb 100755 --- a/scripts/config.py +++ b/scripts/config.py @@ -229,7 +229,7 @@ def is_seamless_alt(name): Exclude alternative implementations of library functions since they require an implementation of the relevant functions and an xxx_alt.h header. """ - if name == 'MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT': + if name in ('MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT', 'MBEDTLS_PLATFORM_MS_TIME_ALT'): # Similar to non-platform xxx_ALT, requires platform_alt.h return False return name.startswith('MBEDTLS_PLATFORM_') From 947fd3d6ea30f2180d4671e73090ba76ad69f165 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Mon, 30 Jan 2023 13:27:54 +0800 Subject: [PATCH 03/22] Implement ms time with GetSystemTimeAsFile time. There's a potential race condition with calling time(NULL) after GetSystemTime(). See https://learn.microsoft.com/en-us/archive/msdn-magazine/2004/march/implementing-a-high-resolution-time-provider-for-windows Signed-off-by: Jerry Yu --- library/platform_util.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/library/platform_util.c b/library/platform_util.c index 1f60404fd..e885a921e 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -196,10 +196,13 @@ mbedtls_ms_time_t mbedtls_ms_time(void) #include mbedtls_ms_time_t mbedtls_ms_time(void) { - SYSTEMTIME st; + FILETIME ct; + mbedtls_ms_time_t current_ms; - GetSystemTime(&st); - return time(NULL)*1000LL + st.wMilliseconds; + GetSystemTimeAsFileTime(&ct); + current_ms = ((mbedtls_ms_time_t) ct.dwLowDateTime + + ((mbedtls_ms_time_t) (ct.dwHighDateTime) << 32LL))/10; + return current_ms; } #else #error "No mbedtls_ms_time available" From b1d3015e27693426592830b61882661a4879be61 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Tue, 31 Jan 2023 12:48:07 +0800 Subject: [PATCH 04/22] Add more comment for mbedtls_ms_time Signed-off-by: Jerry Yu --- include/mbedtls/platform_time.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/include/mbedtls/platform_time.h b/include/mbedtls/platform_time.h index 11618072f..5c9f07683 100644 --- a/include/mbedtls/platform_time.h +++ b/include/mbedtls/platform_time.h @@ -46,12 +46,17 @@ typedef signed long long mbedtls_ms_time_t; #endif /* MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO */ /** - * \brief Get time in milliseconds. + * \brief Get time in milliseconds. * - * \return Current time in milliseconds + * \return Current time in milliseconds which is monotonically increasing. * * \note If MBEDTLS_PLATFORM_MS_TIME_ALT defined, users can provide their own * implementation. + * + * \warning This function is used for time difference only. The start time is + * not defined. A well defined time function is not required in + * TLS negotiation. + * */ mbedtls_ms_time_t mbedtls_ms_time(void); From eb30684d559d3abb3ce905297a3df905ab2d7f8a Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Tue, 31 Jan 2023 12:49:45 +0800 Subject: [PATCH 05/22] Change type of mbedtls_ms_time_t Signed-off-by: Jerry Yu --- include/mbedtls/platform_time.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/mbedtls/platform_time.h b/include/mbedtls/platform_time.h index 5c9f07683..246120ed3 100644 --- a/include/mbedtls/platform_time.h +++ b/include/mbedtls/platform_time.h @@ -42,7 +42,8 @@ typedef time_t mbedtls_time_t; #if defined(MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO) typedef MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO mbedtls_ms_time_t; #else -typedef signed long long mbedtls_ms_time_t; +#include +typedef int64_t mbedtls_ms_time_t; #endif /* MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO */ /** From 67bf677badb7d783dbda579ddb23ddedd157f6da Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Fri, 3 Feb 2023 11:16:13 +0800 Subject: [PATCH 06/22] fix comments issues Signed-off-by: Jerry Yu --- include/mbedtls/mbedtls_config.h | 2 +- include/mbedtls/platform_time.h | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/mbedtls/mbedtls_config.h b/include/mbedtls/mbedtls_config.h index cfde4b7d0..4fafda64e 100644 --- a/include/mbedtls/mbedtls_config.h +++ b/include/mbedtls/mbedtls_config.h @@ -3610,7 +3610,7 @@ //#define MBEDTLS_PLATFORM_SETBUF_MACRO setbuf /**< Default setbuf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ -//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO signed long long /**< Default millionseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It MUST be signed 64bit integer at least */ +//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t /**< Default millionseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It MUST be signed 64bit integer at least */ //#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ /* Note: your snprintf must correctly zero-terminate the buffer! */ diff --git a/include/mbedtls/platform_time.h b/include/mbedtls/platform_time.h index 246120ed3..3158e2a83 100644 --- a/include/mbedtls/platform_time.h +++ b/include/mbedtls/platform_time.h @@ -49,14 +49,14 @@ typedef int64_t mbedtls_ms_time_t; /** * \brief Get time in milliseconds. * - * \return Current time in milliseconds which is monotonically increasing. + * \return Monotonically-increasing current time in milliseconds. * - * \note If MBEDTLS_PLATFORM_MS_TIME_ALT defined, users can provide their own - * implementation. + * \note Define MBEDTLS_PLATFORM_MS_TIME_ALT to be able to provide an + * alternative implementation * - * \warning This function is used for time difference only. The start time is - * not defined. A well defined time function is not required in - * TLS negotiation. + * \warning This function returns a monotonically-increasing time value from a + * start time that will differ from platform to platform, and possibly + * from run to run of the process. * */ mbedtls_ms_time_t mbedtls_ms_time(void); From 041c8c10f9d31bd46061ad363cfc0a54faf8d24c Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Fri, 3 Feb 2023 13:15:09 +0800 Subject: [PATCH 07/22] Add std PRI macro for printing milliseconds Signed-off-by: Jerry Yu --- include/mbedtls/debug.h | 2 +- include/mbedtls/platform_time.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/mbedtls/debug.h b/include/mbedtls/debug.h index c1ad03275..74f5d5560 100644 --- a/include/mbedtls/debug.h +++ b/include/mbedtls/debug.h @@ -132,7 +132,7 @@ /* (defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO == 0) || (defined(_MSC_VER) && _MSC_VER < 1800) */ #if !defined(MBEDTLS_PRINTF_MS_TIME) -#define MBEDTLS_PRINTF_MS_TIME MBEDTLS_PRINTF_LONGLONG +#define MBEDTLS_PRINTF_MS_TIME PRId64 #endif /* MBEDTLS_PRINTF_MS_TIME */ #ifdef __cplusplus diff --git a/include/mbedtls/platform_time.h b/include/mbedtls/platform_time.h index 3158e2a83..c7973d9fc 100644 --- a/include/mbedtls/platform_time.h +++ b/include/mbedtls/platform_time.h @@ -43,6 +43,7 @@ typedef time_t mbedtls_time_t; typedef MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO mbedtls_ms_time_t; #else #include +#include typedef int64_t mbedtls_ms_time_t; #endif /* MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO */ From 1ae2b2f034fda38bb4cdcee207730c3df21fd2f7 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Tue, 21 Feb 2023 15:37:12 +0800 Subject: [PATCH 08/22] Improve code style Signed-off-by: Jerry Yu --- include/mbedtls/check_config.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/mbedtls/check_config.h b/include/mbedtls/check_config.h index 18e6b5677..70f8a16f9 100644 --- a/include/mbedtls/check_config.h +++ b/include/mbedtls/check_config.h @@ -449,14 +449,12 @@ #endif #if defined(MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) ||\ - !defined(MBEDTLS_HAVE_TIME) ) + ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_MS_TIME_ALT) && \ - ( !defined(MBEDTLS_PLATFORM_C) || \ - !defined(MBEDTLS_HAVE_TIME) ) + ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_MS_TIME_ALT defined, but not all prerequisites" #endif From 10ce540a8c440184d04d53cf510bd8727a9a3506 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Tue, 21 Feb 2023 15:39:02 +0800 Subject: [PATCH 09/22] Put *MS_TIME* into together. If MS_TIME_TYPE is changed, the printf fmt string should be changed also. Otherwise, compiler might report fmt warning Signed-off-by: Jerry Yu --- include/mbedtls/mbedtls_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/mbedtls/mbedtls_config.h b/include/mbedtls/mbedtls_config.h index 4fafda64e..ec6581d77 100644 --- a/include/mbedtls/mbedtls_config.h +++ b/include/mbedtls/mbedtls_config.h @@ -3610,7 +3610,6 @@ //#define MBEDTLS_PLATFORM_SETBUF_MACRO setbuf /**< Default setbuf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ -//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t /**< Default millionseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It MUST be signed 64bit integer at least */ //#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ /* Note: your snprintf must correctly zero-terminate the buffer! */ @@ -3618,7 +3617,8 @@ //#define MBEDTLS_PLATFORM_VSNPRINTF_MACRO vsnprintf /**< Default vsnprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ -//#define MBEDTLS_PRINTF_MS_TIME MBEDTLS_PRINTF_LONGLONG /**< Default fmt for printf. That's avoid compiler warning if mbedtls_ms_time_t is redefined */ +//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t /**< Default millionseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It MUST be signed 64bit integer at least */ +//#define MBEDTLS_PRINTF_MS_TIME PRId64 /**< Default fmt for printf. That's avoid compiler warning if mbedtls_ms_time_t is redefined */ /** \def MBEDTLS_CHECK_RETURN * From 3bfe133832130f4da5e18fa362cc0ce914e25a9c Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Wed, 22 Feb 2023 15:01:05 +0800 Subject: [PATCH 10/22] Improve readability Signed-off-by: Jerry Yu --- library/platform_util.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/library/platform_util.c b/library/platform_util.c index e885a921e..6c65524b4 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -169,12 +169,11 @@ extern inline void mbedtls_put_unaligned_uint64(void *p, uint64_t x); #if defined(MBEDTLS_HAVE_TIME) && !defined(MBEDTLS_PLATFORM_MS_TIME_ALT) #include -#if !defined(_WIN32) && (defined(unix) || \ - defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ - defined(__MACH__))) +#if !defined(_WIN32) && \ + (defined(unix) || defined(__unix) || defined(__unix__) || \ + (defined(__APPLE__) && defined(__MACH__))) #include -#endif /* !_WIN32 && (unix || __unix || __unix__ || - * (__APPLE__ && __MACH__)) */ +#endif /* !_WIN32 && (unix || __unix || __unix__ || (__APPLE__ && __MACH__)) */ #if (defined(_POSIX_VERSION) && _POSIX_VERSION >= 199309L) mbedtls_ms_time_t mbedtls_ms_time(void) { From 05bc87866edd5ad52a8d8d3e7411b17d7dee6d27 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Thu, 23 Feb 2023 11:20:45 +0800 Subject: [PATCH 11/22] Improve documents about ms_time And fix typo error Signed-off-by: Jerry Yu --- include/mbedtls/mbedtls_config.h | 2 +- programs/ssl/ssl_client2.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/mbedtls/mbedtls_config.h b/include/mbedtls/mbedtls_config.h index ec6581d77..e8e60d6eb 100644 --- a/include/mbedtls/mbedtls_config.h +++ b/include/mbedtls/mbedtls_config.h @@ -3617,7 +3617,7 @@ //#define MBEDTLS_PLATFORM_VSNPRINTF_MACRO vsnprintf /**< Default vsnprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ -//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t /**< Default millionseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It MUST be signed 64bit integer at least */ +//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t //#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t /**< Default milliseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It MUST be at least 30 bits signed integer. */ //#define MBEDTLS_PRINTF_MS_TIME PRId64 /**< Default fmt for printf. That's avoid compiler warning if mbedtls_ms_time_t is redefined */ /** \def MBEDTLS_CHECK_RETURN diff --git a/programs/ssl/ssl_client2.c b/programs/ssl/ssl_client2.c index 4b3799f93..6c75381aa 100644 --- a/programs/ssl/ssl_client2.c +++ b/programs/ssl/ssl_client2.c @@ -424,7 +424,7 @@ int main(void) " reconnect=%%d number of reconnections using session resumption\n" \ " default: 0 (disabled)\n" \ " reco_server_name=%%s default: NULL\n" \ - " reco_delay=%%d default: 0 millionseconds\n" \ + " reco_delay=%%d default: 0 milliseconds\n" \ " reco_mode=%%d 0: copy session, 1: serialize session\n" \ " default: 1\n" \ " reconnect_hard=%%d default: 0 (disabled)\n" \ From 029e659bbbd41dcfaf5e2f011c20a4fb024f22b1 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Thu, 23 Feb 2023 11:25:36 +0800 Subject: [PATCH 12/22] Return seconds when clock_gettime error Signed-off-by: Jerry Yu --- library/platform_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/platform_util.c b/library/platform_util.c index 6c65524b4..2b48f4f6a 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -183,7 +183,7 @@ mbedtls_ms_time_t mbedtls_ms_time(void) ret = clock_gettime(CLOCK_REALTIME, &tv); if (ret) { - return 0; + return time(NULL) * 1000; } current_ms = tv.tv_sec; From f181e549682a0f24d1ea2cb2c2299b9ec96942a3 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Thu, 23 Feb 2023 17:16:26 +0800 Subject: [PATCH 13/22] Revert minimal integer requests Roll back to 64bits Signed-off-by: Jerry Yu --- include/mbedtls/mbedtls_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mbedtls/mbedtls_config.h b/include/mbedtls/mbedtls_config.h index e8e60d6eb..0deaa7bdb 100644 --- a/include/mbedtls/mbedtls_config.h +++ b/include/mbedtls/mbedtls_config.h @@ -3617,7 +3617,7 @@ //#define MBEDTLS_PLATFORM_VSNPRINTF_MACRO vsnprintf /**< Default vsnprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ -//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t //#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t /**< Default milliseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It MUST be at least 30 bits signed integer. */ +//#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t //#define MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO int64_t /**< Default milliseconds time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled. It must be signed, and at least 64 bits. If it is changed from the default, MBEDTLS_PRINTF_MS_TIME must be updated to match.*/ //#define MBEDTLS_PRINTF_MS_TIME PRId64 /**< Default fmt for printf. That's avoid compiler warning if mbedtls_ms_time_t is redefined */ /** \def MBEDTLS_CHECK_RETURN From 8049346989a429fba584c24e1cdb997835e0f1b7 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Thu, 2 Mar 2023 18:05:10 +0800 Subject: [PATCH 14/22] Add change log entry for `mbedtls_ms_time` Signed-off-by: Jerry Yu --- ChangeLog.d/add-milliseconds-time-api.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 ChangeLog.d/add-milliseconds-time-api.txt diff --git a/ChangeLog.d/add-milliseconds-time-api.txt b/ChangeLog.d/add-milliseconds-time-api.txt new file mode 100644 index 000000000..d0dedaf63 --- /dev/null +++ b/ChangeLog.d/add-milliseconds-time-api.txt @@ -0,0 +1,7 @@ +API changes + * Add `mbedtls_ms_time` function, `mbedtls_ms_time_t` type to get + milliseconds. That is required for TLS 1.3 ticket lifetime. And + `mbedtls_ms_time` allows alternative implementation with + `MBEDTLS_PLATFORM_MS_TIME_ALT`, `MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO` and + `MBEDTLS_PRINTF_MS_TIME`. + From 9a12df022e5c6c808b786afbd3d3d8d2019880f1 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Fri, 3 Mar 2023 12:55:16 +0800 Subject: [PATCH 15/22] Add tests for time rountine Signed-off-by: Jerry Yu --- tests/suites/test_suite_platform.data | 6 ++++ tests/suites/test_suite_platform.function | 38 +++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 tests/suites/test_suite_platform.data create mode 100644 tests/suites/test_suite_platform.function diff --git a/tests/suites/test_suite_platform.data b/tests/suites/test_suite_platform.data new file mode 100644 index 000000000..4276b8fb7 --- /dev/null +++ b/tests/suites/test_suite_platform.data @@ -0,0 +1,6 @@ + +Time: get milliseconds +time_get_milliseconds: + +Time: get seconds +time_get_seconds: diff --git a/tests/suites/test_suite_platform.function b/tests/suites/test_suite_platform.function new file mode 100644 index 000000000..dad464ba2 --- /dev/null +++ b/tests/suites/test_suite_platform.function @@ -0,0 +1,38 @@ +/* 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 + +#if defined(MBEDTLS_HAVE_TIME) +#include "mbedtls/platform_time.h" +#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 */ From 3373ccaa180efff072aa0896621fb8d470c01e1e Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Mon, 13 Mar 2023 11:39:43 +0800 Subject: [PATCH 16/22] Update changelog Signed-off-by: Jerry Yu --- ChangeLog.d/add-milliseconds-time-api.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ChangeLog.d/add-milliseconds-time-api.txt b/ChangeLog.d/add-milliseconds-time-api.txt index d0dedaf63..d9e939fad 100644 --- a/ChangeLog.d/add-milliseconds-time-api.txt +++ b/ChangeLog.d/add-milliseconds-time-api.txt @@ -1,7 +1,5 @@ API changes - * Add `mbedtls_ms_time` function, `mbedtls_ms_time_t` type to get - milliseconds. That is required for TLS 1.3 ticket lifetime. And - `mbedtls_ms_time` allows alternative implementation with - `MBEDTLS_PLATFORM_MS_TIME_ALT`, `MBEDTLS_PLATFORM_MS_TIME_TYPE_MACRO` and - `MBEDTLS_PRINTF_MS_TIME`. + * Add new millisecond time type `mbedtls_ms_time_t` and `mbedtls_ms_time()` + function, needed for TLS 1.3 ticket lifetimes. Alternative implementations + can be created using an ALT interface. From c5b48a6f042187fd73a9d068cedbb56a269cc716 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Mon, 13 Mar 2023 14:28:06 +0800 Subject: [PATCH 17/22] Add time test with delay Signed-off-by: Jerry Yu --- tests/suites/test_suite_platform.data | 6 +++ tests/suites/test_suite_platform.function | 55 +++++++++++++++++++++-- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/tests/suites/test_suite_platform.data b/tests/suites/test_suite_platform.data index 4276b8fb7..e6c90732f 100644 --- a/tests/suites/test_suite_platform.data +++ b/tests/suites/test_suite_platform.data @@ -4,3 +4,9 @@ time_get_milliseconds: Time: get seconds time_get_seconds: + +Time: delay milliseconds +time_delay_milliseconds:20 + +Time: delay seconds +time_delay_seconds:1 diff --git a/tests/suites/test_suite_platform.function b/tests/suites/test_suite_platform.function index dad464ba2..478c52da7 100644 --- a/tests/suites/test_suite_platform.function +++ b/tests/suites/test_suite_platform.function @@ -9,13 +9,36 @@ #if defined(MBEDTLS_HAVE_TIME) #include "mbedtls/platform_time.h" + +#ifdef WIN32 +#include +#elif _POSIX_C_SOURCE >= 199309L +#include +#else +#include +#endif +void sleep_ms(int milliseconds) +{ +#ifdef WIN32 + 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_DEPENDENCIES */ + +/* END_DEPENDENCIES */ + + /* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ void time_get_milliseconds() @@ -36,3 +59,29 @@ void time_get_seconds() 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(); + + sleep_ms(delay_ms); + + current = mbedtls_ms_time() - current; + TEST_ASSERT(current == delay_ms || current == delay_ms + 1); + /* 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_seconds(int delay) +{ + mbedtls_time_t current = mbedtls_time(NULL); + sleep_ms(delay*1000); + current = mbedtls_time(NULL) - current; + TEST_ASSERT(current == delay); + /* This goto is added to avoid warnings from the generated code. */ + goto exit; +} +/* END_CASE */ From 1f7dd8df9b2a4cd235ad18561fad3827279bb6f3 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Mon, 13 Mar 2023 18:29:43 +0800 Subject: [PATCH 18/22] fix random fails Signed-off-by: Jerry Yu --- tests/suites/test_suite_platform.data | 2 +- tests/suites/test_suite_platform.function | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/suites/test_suite_platform.data b/tests/suites/test_suite_platform.data index e6c90732f..689aa57e3 100644 --- a/tests/suites/test_suite_platform.data +++ b/tests/suites/test_suite_platform.data @@ -6,7 +6,7 @@ Time: get seconds time_get_seconds: Time: delay milliseconds -time_delay_milliseconds:20 +time_delay_milliseconds:100 Time: delay seconds time_delay_seconds:1 diff --git a/tests/suites/test_suite_platform.function b/tests/suites/test_suite_platform.function index 478c52da7..d5d4cdf72 100644 --- a/tests/suites/test_suite_platform.function +++ b/tests/suites/test_suite_platform.function @@ -64,23 +64,27 @@ void time_get_seconds() void time_delay_milliseconds(int delay_ms) { mbedtls_ms_time_t current = mbedtls_ms_time(); + mbedtls_ms_time_t elapsed_ms; sleep_ms(delay_ms); - current = mbedtls_ms_time() - current; - TEST_ASSERT(current == delay_ms || current == delay_ms + 1); + elapsed_ms = mbedtls_ms_time() - current; + TEST_ASSERT(elapsed_ms >= delay_ms && elapsed_ms < 500 + delay_ms); /* 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_seconds(int delay) +void time_delay_seconds(int delay_secs) { mbedtls_time_t current = mbedtls_time(NULL); - sleep_ms(delay*1000); - current = mbedtls_time(NULL) - current; - TEST_ASSERT(current == delay); + mbedtls_time_t elapsed_secs; + + sleep_ms(delay_secs * 1000); + + elapsed_secs = mbedtls_time(NULL) - current; + TEST_ASSERT(elapsed_secs >= delay_secs && elapsed_secs < 4 + delay_secs); /* This goto is added to avoid warnings from the generated code. */ goto exit; } From e7ea823d435f445d2fb14838fcdf96a56a3381fe Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Tue, 14 Mar 2023 17:33:42 +0800 Subject: [PATCH 19/22] remove extra spaces Signed-off-by: Jerry Yu --- tests/suites/test_suite_platform.function | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/suites/test_suite_platform.function b/tests/suites/test_suite_platform.function index d5d4cdf72..cf0a785fe 100644 --- a/tests/suites/test_suite_platform.function +++ b/tests/suites/test_suite_platform.function @@ -43,7 +43,7 @@ void sleep_ms(int milliseconds) /* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ void time_get_milliseconds() { - mbedtls_ms_time_t current = mbedtls_ms_time(); + mbedtls_ms_time_t current = mbedtls_ms_time(); (void) current; /* This goto is added to avoid warnings from the generated code. */ goto exit; @@ -53,7 +53,7 @@ void time_get_milliseconds() /* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ void time_get_seconds() { - mbedtls_time_t current = mbedtls_time(NULL); + mbedtls_time_t current = mbedtls_time(NULL); (void) current; /* This goto is added to avoid warnings from the generated code. */ goto exit; @@ -63,8 +63,8 @@ void time_get_seconds() /* 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; + mbedtls_ms_time_t current = mbedtls_ms_time(); + mbedtls_ms_time_t elapsed_ms; sleep_ms(delay_ms); @@ -78,8 +78,8 @@ void time_delay_milliseconds(int delay_ms) /* BEGIN_CASE depends_on:MBEDTLS_HAVE_TIME */ void time_delay_seconds(int delay_secs) { - mbedtls_time_t current = mbedtls_time(NULL); - mbedtls_time_t elapsed_secs; + mbedtls_time_t current = mbedtls_time(NULL); + mbedtls_time_t elapsed_secs; sleep_ms(delay_secs * 1000); From 205a7413076d7402e3d7bb1668f1a8e49c634292 Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Wed, 15 Mar 2023 18:58:51 +0800 Subject: [PATCH 20/22] change the clock source to MONOTONIC We need a non-settable source to avoid security issues. Signed-off-by: Jerry Yu --- library/platform_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/platform_util.c b/library/platform_util.c index 2b48f4f6a..d8d970837 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -181,7 +181,7 @@ mbedtls_ms_time_t mbedtls_ms_time(void) struct timespec tv; mbedtls_ms_time_t current_ms; - ret = clock_gettime(CLOCK_REALTIME, &tv); + ret = clock_gettime(CLOCK_MONOTONIC, &tv); if (ret) { return time(NULL) * 1000; } From 02d684061babe371a96fca8192b10d66d504323f Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Tue, 14 Mar 2023 17:35:05 +0800 Subject: [PATCH 21/22] Adjust time delay tests to fix fails Signed-off-by: Jerry Yu --- tests/suites/test_suite_platform.data | 2 +- tests/suites/test_suite_platform.function | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/suites/test_suite_platform.data b/tests/suites/test_suite_platform.data index 689aa57e3..557b586eb 100644 --- a/tests/suites/test_suite_platform.data +++ b/tests/suites/test_suite_platform.data @@ -6,7 +6,7 @@ Time: get seconds time_get_seconds: Time: delay milliseconds -time_delay_milliseconds:100 +time_delay_milliseconds:1000 Time: delay seconds time_delay_seconds:1 diff --git a/tests/suites/test_suite_platform.function b/tests/suites/test_suite_platform.function index cf0a785fe..54ddd42c3 100644 --- a/tests/suites/test_suite_platform.function +++ b/tests/suites/test_suite_platform.function @@ -69,7 +69,7 @@ void time_delay_milliseconds(int delay_ms) sleep_ms(delay_ms); elapsed_ms = mbedtls_ms_time() - current; - TEST_ASSERT(elapsed_ms >= delay_ms && elapsed_ms < 500 + delay_ms); + TEST_ASSERT(elapsed_ms >= delay_ms && elapsed_ms < 4000 + delay_ms); /* This goto is added to avoid warnings from the generated code. */ goto exit; } From f52078f5a17dd508c47a79d2312ff4bc8c38070c Mon Sep 17 00:00:00 2001 From: Jerry Yu Date: Thu, 16 Mar 2023 11:23:19 +0800 Subject: [PATCH 22/22] fix win32 ms time fail `GetSystemTimeAsFileTime` returns 100 nano seconds elapsed time, not 100 micro seconds. Signed-off-by: Jerry Yu --- library/platform_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/platform_util.c b/library/platform_util.c index d8d970837..c784ea414 100644 --- a/library/platform_util.c +++ b/library/platform_util.c @@ -200,7 +200,7 @@ mbedtls_ms_time_t mbedtls_ms_time(void) GetSystemTimeAsFileTime(&ct); current_ms = ((mbedtls_ms_time_t) ct.dwLowDateTime + - ((mbedtls_ms_time_t) (ct.dwHighDateTime) << 32LL))/10; + ((mbedtls_ms_time_t) (ct.dwHighDateTime) << 32LL))/10000; return current_ms; } #else