Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
Diff: targets/TARGET_STM/trng_api.c
- Revision:
- 177:d650f5d4c87a
- Parent:
- 149:156823d33999
--- a/targets/TARGET_STM/trng_api.c Wed Oct 25 14:53:38 2017 +0100 +++ b/targets/TARGET_STM/trng_api.c Wed Nov 08 13:50:44 2017 +0000 @@ -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 @@ /* 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 @@ 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) { + 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; } return( ret );