mbedtls: Use LowPowerTimer/Timer for timing

Previously we used `gettimeofday()` for Mbed TLS timing, but its
implementation provided by Mbed OS is only precise to seconds. The
microsecond component of the output `struct timeval` is always set
to zero. But Mbed TLS requires millisecond precision.

To provide required timing precision, switch to use `LowPowerTicker`
or (microsecond) `Ticker`. `LowPowerTicker` is preferred as it saves
power and Mbed TLS does not require microsecond precision.
pull/14772/head
Lingkai Dong 2021-06-11 12:10:39 +01:00
parent 2a73d44343
commit f96f98e60e
2 changed files with 16 additions and 14 deletions

View File

@ -24,11 +24,9 @@
#include "mbedtls/timing.h"
#if defined(MBEDTLS_TIMING_ALT)
#include <time.h>
struct mbedtls_timing_hr_time
{
struct timeval start;
unsigned long start;
};
typedef struct mbedtls_timing_delay_context

View File

@ -25,6 +25,8 @@
#endif
#include "mbedtls/timing.h"
#include "drivers/Timeout.h"
#include "drivers/Timer.h"
#include "drivers/LowPowerTimer.h"
#include <chrono>
extern "C" {
@ -46,22 +48,24 @@ extern "C" void mbedtls_set_alarm(int seconds)
#if !defined(HAVE_HARDCLOCK)
#define HAVE_HARDCLOCK
#include "platform/mbed_rtc_time.h"
static int hardclock_init = 0;
static struct timeval tv_init;
static int timer_init = 0;
extern "C" unsigned long mbedtls_timing_hardclock(void)
{
struct timeval tv_cur;
#if DEVICE_LPTICKER
static mbed::LowPowerTimer timer;
#elif DEVICE_USTICKER
static mbed::Timer timer;
#else
#error "MBEDTLS_TIMING_C requires either LPTICKER or USTICKER"
#endif
if (hardclock_init == 0)
{
gettimeofday(&tv_init, NULL);
hardclock_init = 1;
if (timer_init == 0) {
timer.reset();
timer.start();
timer_init = 1;
}
gettimeofday(&tv_cur, NULL);
return((tv_cur.tv_sec - tv_init.tv_sec) * 1000000
+ (tv_cur.tv_usec - tv_init.tv_usec));
return timer.elapsed_time().count();
}
#endif /* !HAVE_HARDCLOCK */