From 182eaa0b638f6f53e13236ecc50f51aea6787615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Frauenschl=C3=A4ger?= Date: Thu, 26 Oct 2023 10:58:19 +0200 Subject: [PATCH] Zephyr: add support for RTC time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For ASN date validation, the actual wall clock time is needed from an RTC. This commit adds support to read the RTC time in case it is available in the Zephyr system. If the RTC is not available or an error occurs during the readout, we fallback to the old implementation which only supports relative time since boot. Signed-off-by: Tobias Frauenschläger --- wolfcrypt/src/wc_port.c | 24 ++++++++++++++++++++++++ wolfssl/wolfcrypt/wc_port.h | 8 ++++++++ 2 files changed, 32 insertions(+) diff --git a/wolfcrypt/src/wc_port.c b/wolfcrypt/src/wc_port.c index 6547996e7..28ae8ab09 100644 --- a/wolfcrypt/src/wc_port.c +++ b/wolfcrypt/src/wc_port.c @@ -3164,6 +3164,30 @@ time_t z_time(time_t * timer) { struct timespec ts; + #if defined(CONFIG_RTC) && \ + (defined(CONFIG_PICOLIBC) || defined(CONFIG_NEWLIB_LIBC)) + /* Try to obtain the actual time from an RTC */ + static const struct device *rtc = DEVICE_DT_GET(DT_NODELABEL(rtc)); + + if (device_is_ready(rtc)) { + struct rtc_time rtc_time; + struct tm *tm_time = rtc_time_to_tm(&rtc_time); + + int ret = rtc_get_time(rtc, &rtc_time); + + if (ret == 0) { + time_t epochTime = mktime(tm_time); + + if (timer != NULL) + *timer = epochTime; + + return epochTime; + } + } + #endif + + /* Fallback to uptime since boot. This works for relative times, but + * not for ASN.1 date validation */ if (clock_gettime(CLOCK_REALTIME, &ts) == 0) if (timer != NULL) *timer = ts.tv_sec; diff --git a/wolfssl/wolfcrypt/wc_port.h b/wolfssl/wolfcrypt/wc_port.h index c337ae0de..2cd79590e 100644 --- a/wolfssl/wolfcrypt/wc_port.h +++ b/wolfssl/wolfcrypt/wc_port.h @@ -985,6 +985,14 @@ WOLFSSL_ABI WOLFSSL_API int wolfCrypt_Cleanup(void); #include #endif + #if defined(CONFIG_RTC) + #if defined(CONFIG_PICOLIBC) || defined(CONFIG_NEWLIB_LIBC) + #include + #else + #warning "RTC support needs picolibc or newlib (nano)" + #endif + #endif + time_t z_time(time_t *timer); #define XTIME(tl) z_time((tl))