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))