|
19 | 19 | #include "platform/mbed_wait_api.h"
|
20 | 20 |
|
21 | 21 | #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 | +} |
22 | 28 |
|
23 | 29 | extern "C" void trng_init_esp32(void)
|
24 | 30 | {
|
@@ -59,27 +65,35 @@ extern "C" int trng_get_bytes_esp32(uint8_t *output, size_t length, size_t *outp
|
59 | 65 | char recv_data[4];
|
60 | 66 | size_t idx = 0;
|
61 | 67 | int i;
|
62 |
| - int err_cnt = 0; |
| 68 | + int retry_cnt = 0; |
| 69 | + |
| 70 | + if ((output == NULL) || (output_length == NULL)) { |
| 71 | + return -1; |
| 72 | + } |
63 | 73 |
|
64 |
| - while (idx < length) { |
| 74 | + while ((retry_cnt < RETRY_CNT_MAX) && (idx < length)) { |
65 | 75 | 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)); |
67 | 77 | 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 | + } |
76 | 83 | }
|
| 84 | + } |
| 85 | + if (ret != 0) { |
| 86 | + retry_cnt++; |
77 | 87 | wait_ms(100);
|
78 | 88 | }
|
79 | 89 | }
|
80 |
| - if (output_length != NULL) { |
81 |
| - *output_length = idx; |
| 90 | + if (retry_cnt >= RETRY_CNT_MAX) { |
| 91 | + idx = 0; |
| 92 | + mbedtls_zeroize(output, length); |
82 | 93 | }
|
| 94 | + *output_length = idx; |
| 95 | + |
| 96 | + mbedtls_zeroize(recv_data, sizeof(recv_data)); |
83 | 97 |
|
84 | 98 | return (idx != 0 ? 0 : -1);
|
85 | 99 | }
|
|
0 commit comments