Merge pull request #5970 from TomoYamanaka/master

RZ_A1LU: Fix TRNG function
pull/6042/head
Cruz Monrreal 2018-02-07 20:06:17 -06:00 committed by GitHub
commit f8cc42689c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 27 additions and 13 deletions

View File

@ -19,6 +19,12 @@
#include "platform/mbed_wait_api.h"
#define ESP32_I2C_ADDR (0x28<<1)
#define RETRY_CNT_MAX (20)
/* Implementation that should never be optimized out by the compiler */
static void mbedtls_zeroize( void *v, size_t n ) {
volatile unsigned char *p = (unsigned char *)v; while( n-- ) *p++ = 0;
}
extern "C" void trng_init_esp32(void)
{
@ -59,27 +65,35 @@ extern "C" int trng_get_bytes_esp32(uint8_t *output, size_t length, size_t *outp
char recv_data[4];
size_t idx = 0;
int i;
int err_cnt = 0;
int retry_cnt = 0;
while (idx < length) {
if ((output == NULL) || (output_length == NULL)) {
return -1;
}
while ((retry_cnt < RETRY_CNT_MAX) && (idx < length)) {
send_data[0] = 0;
ret = mI2c.write(ESP32_I2C_ADDR, send_data, 1);
ret = mI2c.write(ESP32_I2C_ADDR, send_data, sizeof(send_data));
if (ret == 0) {
mI2c.read(ESP32_I2C_ADDR, recv_data, sizeof(recv_data));
for (i = 0; (i < 4) && (idx < length); i++) {
output[idx++] = recv_data[i];
}
} else {
err_cnt++;
if (err_cnt >= 20) {
break;
ret = mI2c.read(ESP32_I2C_ADDR, recv_data, sizeof(recv_data));
if (ret == 0) {
for (i = 0; (i < sizeof(recv_data)) && (idx < length); i++) {
output[idx++] = recv_data[i];
}
}
}
if (ret != 0) {
retry_cnt++;
wait_ms(100);
}
}
if (output_length != NULL) {
*output_length = idx;
if (retry_cnt >= RETRY_CNT_MAX) {
idx = 0;
mbedtls_zeroize(output, length);
}
*output_length = idx;
mbedtls_zeroize(recv_data, sizeof(recv_data));
return (idx != 0 ? 0 : -1);
}