HAL RNG Overview

Introducing RNG

group RNG_Introduction

The RNG hardware abstraction layer provides a set of APIs to configure and control the RNG peripheral on STM32 microcontrollers.

The RNG is a true random number generator that provides full entropy outputs to the application as 32-bit samples. It is composed of a live entropy source (analog) and an internal conditioning component.

The RNG is a NIST SP 800-90B compliant entropy source that can be used to construct a non-deterministic random bit generator (NDRBG).

The RNG true random number generator has been pre-certified to NIST SP800-90B. It has also been tested using the German BSI statistical tests of AIS-31 (T0 to T8).

Module and files

The following diagram illustrates the RNG module and its associated files.

Module and files diagram

Component diagram

The following diagram illustrates the software components involved in the RNG module. It shows the interactions between the user application, HAL drivers, low-level drivers, and the hardware components.

@startuml

!$use_ppp_core = 1
!$use_ppp_ll = 1
!$use_ppp_hal = 1

!$use_api_itf = 1
!$use_hal_itf = 1
!$use_ll_itf = 1
!$use_core_itf = 1

!$use_ppp_isr = 1

!$use_hal_service = 1
!$use_hal_rcc = 1
!$use_hal_dma = 0

!$use_ll_rcc = 0

!$ppp = "RNG"
!$hal_api_itf = "HAL " + $ppp + " API"
!$appli_itf = "User Callback"
!$ppp_name = "HAL_"+$ppp
!$ppp_ISR = $ppp+" ISR"
!$ll_ppp = "LL_"+$ppp
!$hal_dma_itf = "HAL_DMA_StartDirectXfer()\nHAL_DMA_Abort_IT"
!$hal_rcc_itf = "\t\t\t\HAL_RCC_"+$ppp+"_EnableClock()"
!$hal_ppp_itf = "DMA CallBacks\nDMA Half transfer complete CallBack\nError CallBacks"
!$hal_generic_itf = "HAL_GetTick()"
!$ll_ppp_itf = "LL " + $ppp +" API"
!$ppp_xIRQ = $ppp+"x_IRQ"

<style>
componentDiagram {
arrow {
FontSize 8
}
interface {
FontSize 8
}
}
</style>

title $ppp Software Component Diagram

Package "Application Layer" #DarkMagenta {

component [Appli]
interface "$appli_itf" as APPLI_Interface
[Appli] -r- APPLI_Interface
}

package "HAL" #DarkOrange {
[$ppp_name]
!if ($use_hal_dma == 1)
interface "$hal_ppp_itf" as HAL_PPP_Interface
[$ppp_name] -d- HAL_PPP_Interface
!endif
interface "$hal_api_itf" as HAL_PPP_APPLI_Interface
[$ppp_name] -u- HAL_PPP_APPLI_Interface

!if ($use_hal_service == 1)
  [HAL_SERVICE]
  interface "$hal_generic_itf" as HAL_Service_Interface
  [HAL_SERVICE] -r- HAL_Service_Interface
  [$ppp_name] -l-( HAL_Service_Interface
!endif  

!if ($use_hal_dma == 1)
  [HAL_DMA]
  interface "$hal_dma_itf" as HAL_DMA_Interface
  [HAL_DMA] -u- HAL_DMA_Interface
  [HAL_DMA] -u-( HAL_PPP_Interface
  [$ppp_name] --( HAL_DMA_Interface
!endif
!if ($use_hal_rcc == 1)
  [HAL_RCC]
  interface "$hal_rcc_itf" as HAL_RCC_Interface
  [HAL_RCC] -l- HAL_RCC_Interface
  [$ppp_name] -r-( HAL_RCC_Interface
!endif
}

[Appli] -d-( HAL_PPP_APPLI_Interface
[$ppp_name] -u-( APPLI_Interface

package "Low Layer" #Technology {

!if ($use_ppp_ll == 1)
  [$ll_ppp]
  interface "$ll_ppp_itf" as LL_PPP_Interface
  [$ll_ppp]  -u- LL_PPP_Interface
!endif 

!if ($use_ppp_isr == 1) 
interface "$ppp_ISR" as PPP_ISR
[$ppp_ISR] -U- PPP_ISR
[$ppp_ISR]
!endif

[CMSIS-Devices]
!if ($use_ll_rcc == 1)
  [LL_RCC]
  interface "LL RCC API" as LL_RCC_API
  [LL_RCC] -u- LL_RCC_API
  [HAL_RCC] -d-(LL_RCC_API
!endif

!if ($use_hal_dma == 1)
  [DMA ISR]
  interface "DMA ISR" as DMA_ISR
  [DMA ISR] -u- DMA_ISR
!endif  
}

package "HW" #LightCyan {
[STM32_HW]
!if ($use_ppp_isr == 1)
interface "$ppp_xIRQ" as PPPx_IRQ
[STM32_HW] -u- PPPx_IRQ
!endif
!if ($use_hal_dma == 1)
interface "DMAx_IRQ_Ch" as DMA_IRQ_CH
[STM32_HW] -u- DMA_IRQ_CH
[DMA ISR] -d-( DMA_IRQ_CH
[HAL_DMA] --( DMA_ISR
!endif
}
!if ($use_ppp_ll == 1)
[$ppp_name] -d-( LL_PPP_Interface
[$ll_ppp] .r.> [CMSIS-Devices]: $ppp register def
[STM32_HW] <.u. [$ll_ppp] : $ppp registers R/W
!else
[$ppp_name] .d.> [CMSIS-Devices]: $ppp register def
[STM32_HW] <.l. [$ppp_name] : $ppp registers R/W
!endif
!if ($use_ppp_isr == 1)
[$ppp_ISR] -d-( PPPx_IRQ
[$ppp_name] -d-( PPP_ISR
!endif
!if ($use_ll_rcc == 1)
[STM32_HW] <.u. [LL_RCC] : RCC registers R/W
!endif

@enduml

Configuration table

The following table lists the configuration defines for the HAL RNG module, specifying their locations, default values, and descriptions:

group RNG_Configuration_Table

Configuration inside the RNG driver

Configuration defines

Description

Default value

Note

PRODUCT

from IDE

NA

Ex:STM32C5XXxx.

USE_ASSERT_DBG_PARAM

from IDE

None

Enable parameter asserts.

USE_ASSERT_DBG_STATE

from IDE

None

Enable state asserts.

USE_HAL_CHECK_PARAM

from hal_conf.h

0

Parameter runtime check.

USE_HAL_SECURE_CHECK_PARAM

from hal_conf.h

0

Parameter runtime check for sensitive APIs.

USE_HAL_RNG_MODULE

from hal_conf.h

1

Enable the HAL RNG module.

USE_HAL_RNG_CLK_ENABLE_MODEL

from hal_conf.h

HAL_CLK_ENABLE_NO

Enable the HAL_RNG_CLK.

USE_HAL_RNG_REGISTER_CALLBACKS

from hal_conf.h

0

Enable the register callback assert.

USE_HAL_RNG_GET_LAST_ERRORS

from hal_conf.h

0

Allow retrieval of the last error codes.

USE_HAL_RNG_USER_DATA

from hal_conf.h

0

Allow enabling or disabling user data.

RNG_CERT_NIST

from stm32c5xxxx.h

NA

Product-dependent values from DFP.