diff --git a/hal/targets.json b/hal/targets.json index 5b4796eea41..2cd40bdd4ae 100644 --- a/hal/targets.json +++ b/hal/targets.json @@ -768,10 +768,11 @@ "supported_form_factors": ["ARDUINO", "MORPHO"], "core": "Cortex-M4F", "default_toolchain": "ARM", - "extra_labels": ["STM", "STM32F4", "STM32F410RB"], + "extra_labels": ["STM", "STM32F4", "STM32F410RB","STM32F410Rx"], "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "inherits": ["Target"], "progen": {"target": "nucleo-f410rb"}, + "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT"], "detect_code": ["0740"], "device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], "release_versions": ["2", "5"] @@ -805,10 +806,11 @@ "inherits": ["Target"], "core": "Cortex-M4F", "default_toolchain": "ARM", - "extra_labels": ["STM", "STM32F4", "STM32F429", "STM32F429ZI"], + "extra_labels": ["STM", "STM32F4", "STM32F429", "STM32F429ZI", "STM32F429xx"], "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "progen": {"target": "nucleo-f429zi"}, - "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "RTC_LSI", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], + "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT"], + "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "RTC_LSI", "SERIAL", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], "detect_code": ["0796"], "release_versions": ["2", "5"] }, @@ -854,6 +856,7 @@ "extra_labels": ["STM", "STM32F7", "STM32F746", "STM32F746ZG"], "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "default_toolchain": "ARM", + "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT"], "progen": { "target": "nucleo-f746zg", "iar": { @@ -872,6 +875,7 @@ "extra_labels": ["STM", "STM32F7", "STM32F767", "STM32F767ZI"], "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "default_toolchain": "ARM", + "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT"], "progen": {"target": "nucleo-f767zi"}, "detect_code": ["0818"], "device_has": ["ANALOGIN", "ANALOGOUT", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], @@ -1036,7 +1040,8 @@ "inherits": ["Target"], "core": "Cortex-M4F", "default_toolchain": "ARM", - "extra_labels": ["STM", "STM32F4", "STM32F429", "STM32F429ZI"], + "extra_labels": ["STM", "STM32F4", "STM32F429", "STM32F429ZI", "STM32F429xx"], + "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT"], "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "progen": {"target": "disco-f429zi"}, "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "RTC_LSI", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], @@ -1046,9 +1051,10 @@ "supported_form_factors": ["ARDUINO"], "core": "Cortex-M4F", "default_toolchain": "ARM", - "extra_labels": ["STM", "STM32F4", "STM32F469", "STM32F469NI"], + "extra_labels": ["STM", "STM32F4", "STM32F469", "STM32F469NI", "STM32F469xx"], "supported_toolchains": ["ARM", "uARM", "IAR", "GCC_ARM"], "inherits": ["Target"], + "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT"], "progen": {"target": "disco-f469ni"}, "detect_code": ["0788"], "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], @@ -1070,6 +1076,7 @@ "extra_labels": ["STM", "STM32F7", "STM32F746", "STM32F746NG"], "supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"], "default_toolchain": "ARM", + "macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT"], "progen": {"target": "disco-f746ng"}, "detect_code": ["0815"], "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F4/entropy_hardware_poll.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/entropy_hardware_poll.c new file mode 100644 index 00000000000..7673491cc9f --- /dev/null +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F4/entropy_hardware_poll.c @@ -0,0 +1,85 @@ +/* + * Hardware entropy collector for the STM32F4 family + * + * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#if defined(TARGET_STM32F405xx) || defined(TARGET_STM32F415xx) || defined(TARGET_STM32F407xx) || defined(TARGET_STM32F417xx) ||\ + defined(TARGET_STM32F427xx) || defined(TARGET_STM32F437xx) || defined(TARGET_STM32F429xx) || defined(TARGET_STM32F439xx) ||\ + defined(TARGET_STM32F410Tx) || defined(TARGET_STM32F410Cx) || defined(TARGET_STM32F410Rx) || defined(TARGET_STM32F469xx) ||\ + defined(TARGET_STM32F479xx) +#include +#include "cmsis.h" + +/* RNG handler declaration */ +RNG_HandleTypeDef RngHandle; + + +/** rng_get_byte + * @brief Get one byte of entropy from the RNG, assuming it is up and running. + * @param pointer to the hardware generated random byte. + */ +static void rng_get_byte( unsigned char *byte ) +{ + *byte = (unsigned char)HAL_RNG_GetRandomNumber(&RngHandle); +} + + +/** mbedtls_hardware_poll + * @brief Get len bytes of entropy from the hardware RNG. + * @param data pointer will be NULL + * @param output pointer to the random generated bytes buffer + * @param len input is the requested length of bytes to be generated + * @param olen is the pointer to the length of bytes effectively generated + * @returns 0 if the generation went well. -1 in case of error + */ +int mbedtls_hardware_poll( void *data, unsigned char *output, size_t len, size_t *olen ) +{ + int ret; + ((void) data); + + /* RNG Peripheral clock enable */ + __HAL_RCC_RNG_CLK_ENABLE(); + + /* Initialize RNG instance */ + RngHandle.Instance = RNG; + HAL_RNG_Init(&RngHandle); + + /* Get Random byte */ + for( uint32_t i = 0; i < len; i++ ){ + rng_get_byte( output + i ); + + } + *olen = len; + /* Just be extra sure that we didn't do it wrong */ + if( ( __HAL_RNG_GET_FLAG(&RngHandle, (RNG_FLAG_CECS|RNG_FLAG_SECS)) ) != 0 ) { + ret = -1; + } else { + ret = 0; + } + /*Disable the RNG peripheral */ + HAL_RNG_DeInit(&RngHandle); + /* RNG Peripheral clock disable - assume we're the only users of RNG */ + __HAL_RCC_RNG_CLK_DISABLE(); + + + return( ret ); +} +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F410xx || STM32F469xx || STM32F479xx */ + diff --git a/hal/targets/hal/TARGET_STM/TARGET_STM32F7/entropy_hardware_poll.c b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/entropy_hardware_poll.c new file mode 100644 index 00000000000..4b777fb243e --- /dev/null +++ b/hal/targets/hal/TARGET_STM/TARGET_STM32F7/entropy_hardware_poll.c @@ -0,0 +1,79 @@ +/* + * Hardware entropy collector for the STM32F7 family + * + * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include +#include "cmsis.h" + +/* RNG handler declaration */ +RNG_HandleTypeDef RngHandle; + + +/** rng_get_byte + * @brief Get one byte of entropy from the RNG, assuming it is up and running. + * @param pointer to the hardware generated random byte. + */ +static void rng_get_byte( unsigned char *byte ) +{ + *byte = (unsigned char)HAL_RNG_GetRandomNumber(&RngHandle); +} + + +/** mbedtls_hardware_poll + * @brief Get len bytes of entropy from the hardware RNG. + * @param data pointer will be NULL + * @param output pointer to the random generated bytes buffer + * @param len input is the requested length of bytes to be generated + * @param olen is the pointer to the length of bytes effectively generated + * @returns 0 if the generation went well. -1 in case of error + */ +int mbedtls_hardware_poll( void *data, unsigned char *output, size_t len, size_t *olen ) +{ + int ret; + ((void) data); + + /* RNG Peripheral clock enable */ + __HAL_RCC_RNG_CLK_ENABLE(); + + /* Initialize RNG instance */ + RngHandle.Instance = RNG; + HAL_RNG_Init(&RngHandle); + + /* Get Random byte */ + for( uint32_t i = 0; i < len; i++ ){ + rng_get_byte( output + i ); + + } + *olen = len; + /* Just be extra sure that we didn't do it wrong */ + if( ( __HAL_RNG_GET_FLAG(&RngHandle, (RNG_FLAG_CECS|RNG_FLAG_SECS)) ) != 0 ) { + ret = -1; + } else { + ret = 0; + } + /*Disable the RNG peripheral */ + HAL_RNG_DeInit(&RngHandle); + /* RNG Peripheral clock disable - assume we're the only users of RNG */ + __HAL_RCC_RNG_CLK_DISABLE(); + + + return( ret ); +} +