Add behavior to throw away collected entropy on occurrence of a noise alarm.

pull/4497/head
Steven Cooreman 2017-04-06 11:31:49 +02:00 committed by Russ Butler
parent 97ef051eba
commit 59b3bfa0ce
1 changed files with 16 additions and 8 deletions

View File

@ -218,11 +218,11 @@ int sl_trng_poll( TRNG_TypeDef *device,
size_t *olen ) size_t *olen )
{ {
size_t output_len = 0; size_t output_len = 0;
size_t count = 0; size_t chunk_len = 0;
size_t available; size_t available;
int ret = 0; int ret = 0;
while (len > 0) while (output_len < len)
{ {
available = device->FIFOLEVEL * 4; available = device->FIFOLEVEL * 4;
if (available == 0) if (available == 0)
@ -241,7 +241,17 @@ int sl_trng_poll( TRNG_TypeDef *device,
(ret == SL_TRNG_ERR_NOISE_ALARM) ) (ret == SL_TRNG_ERR_NOISE_ALARM) )
{ {
ret = 0; ret = 0;
break; continue;
}
#else
/* Noise alarms trigger a FIFO clearing, and we need to throw
* away the collected entropy. */
if ( (ret == SL_TRNG_ERR_PRELIMINARY_NOISE_ALARM) ||
(ret == SL_TRNG_ERR_NOISE_ALARM) )
{
ret = 0;
output_len = 0;
continue;
} }
#endif #endif
/* Alarm has been signaled so we throw the generated data away. */ /* Alarm has been signaled so we throw the generated data away. */
@ -252,11 +262,9 @@ int sl_trng_poll( TRNG_TypeDef *device,
} }
#endif #endif
count = SL_MIN(len, available); chunk_len = SL_MIN(len - output_len, available);
sl_trng_read_chunk(device, output, count); sl_trng_read_chunk(device, output + output_len, chunk_len);
output += count; output_len += chunk_len;
output_len += count;
len -= count;
} }
*olen = output_len; *olen = output_len;