-
Notifications
You must be signed in to change notification settings - Fork 3k
STM32: TRNG: remove call to deprecated HAL_RNG_GetRandomNumber #5179
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,19 +23,20 @@ | |
#include <stdlib.h> | ||
#include "cmsis.h" | ||
#include "trng_api.h" | ||
#include "mbed_error.h" | ||
#include "mbed_critical.h" | ||
|
||
/** trng_get_byte | ||
* @brief Get one byte of entropy from the RNG, assuming it is up and running. | ||
* @param obj TRNG obj | ||
* @param pointer to the hardware generated random byte. | ||
*/ | ||
static void trng_get_byte(trng_t *obj, unsigned char *byte ) | ||
{ | ||
*byte = (unsigned char)HAL_RNG_GetRandomNumber(&obj->handle); | ||
} | ||
static uint8_t users = 0; | ||
|
||
void trng_init(trng_t *obj) | ||
{ | ||
uint32_t dummy; | ||
|
||
/* We're only supporting a single user of RNG */ | ||
if (core_util_atomic_incr_u8(&users, 1) > 1 ) { | ||
error("Only 1 RNG instance supported\r\n"); | ||
} | ||
|
||
#if defined(TARGET_STM32L4) | ||
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; | ||
|
||
|
@@ -50,11 +51,13 @@ void trng_init(trng_t *obj) | |
|
||
/* Initialize RNG instance */ | ||
obj->handle.Instance = RNG; | ||
obj->handle.State = HAL_RNG_STATE_RESET; | ||
obj->handle.Lock = HAL_UNLOCKED; | ||
|
||
HAL_RNG_Init(&obj->handle); | ||
|
||
/* first random number generated after setting the RNGEN bit should not be used */ | ||
HAL_RNG_GetRandomNumber(&obj->handle); | ||
|
||
HAL_RNG_GenerateRandomNumber(&obj->handle, &dummy); | ||
} | ||
|
||
void trng_free(trng_t *obj) | ||
|
@@ -63,23 +66,32 @@ void trng_free(trng_t *obj) | |
HAL_RNG_DeInit(&obj->handle); | ||
/* RNG Peripheral clock disable - assume we're the only users of RNG */ | ||
__HAL_RCC_RNG_CLK_DISABLE(); | ||
|
||
users = 0; | ||
} | ||
|
||
int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length) | ||
{ | ||
int ret; | ||
int ret = 0; | ||
volatile uint8_t random[4]; | ||
*output_length = 0; | ||
|
||
/* Get Random byte */ | ||
for( uint32_t i = 0; i < length; i++ ){ | ||
trng_get_byte(obj, output + i ); | ||
while ((*output_length < length) && (ret ==0)) { | ||
if ( HAL_RNG_GenerateRandomNumber(&obj->handle, (uint32_t *)random ) != HAL_OK) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What happens if we call There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. HAL would return an error in such case. |
||
ret = -1; | ||
} else { | ||
for (uint8_t i =0; (i < 4) && (*output_length < length) ; i++) { | ||
*output++ = random[i]; | ||
*output_length += 1; | ||
random[i] = 0; | ||
} | ||
} | ||
} | ||
|
||
*output_length = length; | ||
/* Just be extra sure that we didn't do it wrong */ | ||
if( ( __HAL_RNG_GET_FLAG(&obj->handle, (RNG_FLAG_CECS | RNG_FLAG_SECS)) ) != 0 ) { | ||
ret = -1; | ||
} else { | ||
ret = 0; | ||
} | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I know that I am being paranoid, but could we please wipe the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. sure - will do so and post an update There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok I made an update and now random is erased immediately after use. |
||
return( ret ); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
line 36 - uses atomic access, not here when you are setting it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the free case, I don't have to test the value, I just have to set it to unused, so I preferred to keep it simple: as there is only 1 user, once freed, it will always be 0.
An alternative is to throw an error in case of unbalanced, (like in sleep manager):
but that seemed overkill to me ...
I can do the change anyway if people think it's of added value.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, can be as it is.
Why init can be called only once - one owner limitation?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes - one HW only and only one client in MBED in features/mbedtls/platform/src/mbed_trng.c, so I'll stick to it for now.