Skip to content

Commit f8cc426

Browse files
authored
Merge pull request #5970 from TomoYamanaka/master
RZ_A1LU: Fix TRNG function
2 parents 1ac115d + 412a79d commit f8cc426

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

targets/TARGET_RENESAS/TARGET_RZ_A1XX/TARGET_GR_LYCHEE/trng_api_esp32.cpp

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@
1919
#include "platform/mbed_wait_api.h"
2020

2121
#define ESP32_I2C_ADDR (0x28<<1)
22+
#define RETRY_CNT_MAX (20)
23+
24+
/* Implementation that should never be optimized out by the compiler */
25+
static void mbedtls_zeroize( void *v, size_t n ) {
26+
volatile unsigned char *p = (unsigned char *)v; while( n-- ) *p++ = 0;
27+
}
2228

2329
extern "C" void trng_init_esp32(void)
2430
{
@@ -59,27 +65,35 @@ extern "C" int trng_get_bytes_esp32(uint8_t *output, size_t length, size_t *outp
5965
char recv_data[4];
6066
size_t idx = 0;
6167
int i;
62-
int err_cnt = 0;
68+
int retry_cnt = 0;
69+
70+
if ((output == NULL) || (output_length == NULL)) {
71+
return -1;
72+
}
6373

64-
while (idx < length) {
74+
while ((retry_cnt < RETRY_CNT_MAX) && (idx < length)) {
6575
send_data[0] = 0;
66-
ret = mI2c.write(ESP32_I2C_ADDR, send_data, 1);
76+
ret = mI2c.write(ESP32_I2C_ADDR, send_data, sizeof(send_data));
6777
if (ret == 0) {
68-
mI2c.read(ESP32_I2C_ADDR, recv_data, sizeof(recv_data));
69-
for (i = 0; (i < 4) && (idx < length); i++) {
70-
output[idx++] = recv_data[i];
71-
}
72-
} else {
73-
err_cnt++;
74-
if (err_cnt >= 20) {
75-
break;
78+
ret = mI2c.read(ESP32_I2C_ADDR, recv_data, sizeof(recv_data));
79+
if (ret == 0) {
80+
for (i = 0; (i < sizeof(recv_data)) && (idx < length); i++) {
81+
output[idx++] = recv_data[i];
82+
}
7683
}
84+
}
85+
if (ret != 0) {
86+
retry_cnt++;
7787
wait_ms(100);
7888
}
7989
}
80-
if (output_length != NULL) {
81-
*output_length = idx;
90+
if (retry_cnt >= RETRY_CNT_MAX) {
91+
idx = 0;
92+
mbedtls_zeroize(output, length);
8293
}
94+
*output_length = idx;
95+
96+
mbedtls_zeroize(recv_data, sizeof(recv_data));
8397

8498
return (idx != 0 ? 0 : -1);
8599
}

0 commit comments

Comments
 (0)