HAL HASH Overview

Introducing HASH

group HASH_Introduction

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

HMAC is suitable for applications requiring message authentication.

The HASH processor computes FIPS (Federal Information Processing Standards) approved digests of length of 160, 224, 256 bits, for messages of any length less than 264 bits (for SHA-1, SHA-224 and SHA-256) or less than 2128 bits (for SHA-384, SHA-512).

Module and files

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

Module and files diagram

Component diagram

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

@startuml
top to bottom direction
hide stereotype
skinparam DefaultFontName Arial
skinparam linetype polyline
skinparam nodesep 45
skinparam ranksep 55

' Corporate color chart
!$C_DARK_BLUE      = "#03234B"
!$C_DARK_BLUE_75   = "#425A78"
!$C_DARK_BLUE_50   = "#8191A5"
!$C_DARK_BLUE_25   = "#C0C8D2"
!$C_LIGHT_BLUE     = "#3CB4E6"
!$C_LIGHT_BLUE_75  = "#6DC6ED"
!$C_LIGHT_BLUE_50  = "#9EDAF3"
!$C_LIGHT_BLUE_25  = "#CEEDF9"
!$C_YELLOW         = "#FFD200"
!$C_PINK           = "#E6007E"
!$C_DARK_GREY      = "#525A63"

!$USE_COLOR = 0

' Default mapping
' - outside boxes (packages): dark blue
' - inside boxes/components/interfaces: light blue
' - highlight boxes: <<highlight>> stereotype (yellow)
' - primary connectors: pink
' - secondary connectors: use explicit color -[#525A63]->
!if ($USE_COLOR == 1)
skinparam PackageBackgroundColor $C_LIGHT_BLUE_25
skinparam PackageBorderColor $C_DARK_BLUE
skinparam PackageFontColor $C_DARK_BLUE

skinparam DefaultFontColor $C_DARK_BLUE
skinparam TitleFontColor $C_DARK_BLUE
skinparam LegendFontColor $C_DARK_BLUE
skinparam NoteFontColor $C_DARK_BLUE

skinparam ComponentBackgroundColor $C_LIGHT_BLUE
skinparam ComponentBorderColor $C_LIGHT_BLUE_25
skinparam ComponentFontColor $C_LIGHT_BLUE_25

skinparam InterfaceBackgroundColor $C_LIGHT_BLUE
skinparam InterfaceBorderColor $C_LIGHT_BLUE_25
skinparam InterfaceFontColor $C_DARK_BLUE

skinparam ArrowColor $C_PINK
skinparam ArrowFontColor $C_DARK_BLUE

skinparam component<<highlight>> {
  BackgroundColor $C_YELLOW
  BorderColor $C_DARK_BLUE
  FontColor $C_DARK_BLUE
}
!endif
' The Driver name to be customized according to the driver
' Example CRC, I2C, NVM, FLASH, ....
!$ppp = "HASH"

' The HAL driver use a core driver - default value 0
!$use_ppp_core = 0

' When using a core driver : the core driver name
!$core = "XXX" + "_CORE"

' enable/disable LL RCC interfaces depandencies - default value 0
!$use_ll_rcc = 0

' the driver provide an LL layer : default value 1
' Set to 0 if core is set to 1
!if ($use_ppp_core == 1)
!$use_ppp_ll = 0
!else
' Set to 0 if the driver has No LL layer (ex: HASH, CCB, ..)
!$use_ppp_ll = 0
!endif
' the driver provide a HAL Layer : default value 1
!$use_ppp_hal = 1

' the HAL driver use HAL services : default value 1
!$use_hal_service = 1

' the HAL driver use HAL RCC services : default value 1
!$use_hal_rcc = 1

' the HAL driver use HAL DMA services : default value 1
!$use_hal_dma = 1

' The driver use HAL_RCC_PPP_GetClockFreq()
!$use_kernel_clock = 0

' HAL driver use depandencies with generic instead of interfaces
!$use_hal_generic_dep = 0

' The driver use interrupts : default value 1
' Example CCB -->  no interrupts
!$use_ppp_isr = 1

' The driver use an extented file : default value 0
' Example of Usage NVM, FLASH
!$use_hal_ppp_extend = 0

' The HAL Driver extension name
!$ppp_extend = "EXT"

' The HAL Driver interface
!$hal_api_itf = "HAL " + $ppp + " API"

' The HAL Driver extended interface
!$hal_api_ext_itf = "HAL " + $ppp + " " + $ppp_extend + " API"

' The Use Application Interface
!$appli_itf = $ppp+ " User Callback"
!$appli_ext_itf = "\n" + $ppp+ " " + $ppp_extend + " User Callback"

' The HAL PPP name
!$ppp_name = "HAL_" + $ppp
!$ppp_ext_name = "HAL_" + $ppp+ "_" + $ppp_extend

' The PPP isr
!$ppp_ISR  = $ppp + " ISR"
!$ppp_ext_ISR = $ppp+ " " + $ppp_extend + " ISR"

' The LL Driver name
!$ll_ppp   = "LL_" + $ppp

!$hal_dma_itf = "HAL_DMA_StartDirectXfer_IT_Opt()\nHAL_DMA_Abort_IT"
!if ($use_kernel_clock == 1)
!$hal_rcc_itf = "\t\t\tHAL_RCC_"+$ppp+"_GetClockFreq()\n\t\t\tHAL_RCC_"+$ppp+"_EnableClock()"
!else
!$hal_rcc_itf = "\t\t\tHAL_RCC_"+$ppp+"_EnableClock()"
!endif

!$hal_ppp_itf = "Half transfer complete\nTransfer complete\nError callback\nAbort callback"

' HAL Generic interface for the PPP driver
!$hal_generic_itf = "HAL_GetTick()"

!$ll_ppp_itf = "LL " + $ppp +" API"

' HW
!$ppp_xIRQ = $ppp+"x_IRQ"


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

title $ppp Software Component Diagram

Package "Application Layer" {

  component [Appli]
  !if ($use_ppp_isr == 1)
  interface "$appli_itf" as APPLI_Interface
  [Appli] -r- APPLI_Interface
  !if ($use_hal_ppp_extend == 1)
  interface "$appli_ext_itf" as APPLI_EXT_Interface
  [Appli] -l- APPLI_EXT_Interface
  !endif
  !endif
}

package "HAL" {
    !if ($use_hal_ppp_extend == 1)
    together {
      component [$ppp_name] <<highlight>>
      component [$ppp_ext_name] <<highlight>>
      [$ppp_name] -[hidden]right- [$ppp_ext_name]
    }
    !if ($use_hal_service == 1)
      [$ppp_name] -[hidden]d- [HAL_SERVICE]
      [$ppp_ext_name] -[hidden]d- [HAL_SERVICE]
    !endif
    !if ($use_hal_dma == 1)
      [$ppp_name] -[hidden]d- [HAL_DMA]
      [$ppp_ext_name] -[hidden]d- [HAL_DMA]
    !endif
    !if ($use_hal_rcc == 1)
      [$ppp_name] -[hidden]d- [HAL_RCC]
      [$ppp_ext_name] -[hidden]d- [HAL_RCC]
    !endif
    !else
    component [$ppp_name] <<highlight>>
    !endif
    !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
    !if ($use_hal_ppp_extend == 1)
    interface "$hal_api_ext_itf" as HAL_PPP_APPLI_EXT_Interface
    [$ppp_name] -u- HAL_PPP_APPLI_Interface
    [$ppp_ext_name] -u- HAL_PPP_APPLI_EXT_Interface
    '[$ppp_ext_name] -u-(
    [$ppp_name] ..> [$ppp_ext_name] : <<include>> / <<use>> \nShared types + common APIs
    !else
    [$ppp_name] -u- HAL_PPP_APPLI_Interface
    !endif

    !if ($use_hal_service == 1)
      component [HAL_SERVICE]
      interface "$hal_generic_itf" as HAL_Service_Interface
      [HAL_SERVICE] -r- HAL_Service_Interface
      !if ($use_hal_generic_dep == 0)
        [$ppp_name] -l-( HAL_Service_Interface
        !if ($use_hal_ppp_extend == 1)
          [$ppp_ext_name] -r-( HAL_Service_Interface
        !endif
      !else
          [$ppp_name] .l.> HAL_Service_Interface : <<use>>
          !if ($use_hal_ppp_extend == 1)
            [$ppp_ext_name] .r.> HAL_Service_Interface : <<use>>
      !endif
    !endif
    !if ($use_hal_dma == 1)
      component [HAL_DMA]
      interface "$hal_dma_itf" as HAL_DMA_Interface
      [HAL_DMA] -u- HAL_DMA_Interface
      !if ($use_hal_generic_dep == 0)
        [HAL_DMA] -u-( HAL_PPP_Interface
        [$ppp_name] --( HAL_DMA_Interface
      !else
        [HAL_DMA] .u.> HAL_PPP_Interface : <<use>>
        [$ppp_name] ..> HAL_DMA_Interface: <<use>>
      !endif
    !endif
    !if ($use_hal_rcc == 1)
      component [HAL_RCC]
      interface "$hal_rcc_itf" as HAL_RCC_Interface
      [HAL_RCC] -l- HAL_RCC_Interface
      !if ($use_hal_generic_dep == 0)
        [$ppp_name] -r-( HAL_RCC_Interface
      !else
        [$ppp_name] .r.> HAL_RCC_Interface: <<use>>
      !endif
    !endif

}

[Appli] -d-( HAL_PPP_APPLI_Interface
!if ($use_hal_ppp_extend == 1)
[Appli] -d-( HAL_PPP_APPLI_EXT_Interface
!endif
!if ($use_ppp_isr == 1)
[$ppp_name] -u-( APPLI_Interface
!if ($use_hal_ppp_extend == 1)
[$ppp_ext_name] -u-( APPLI_EXT_Interface
!endif
!endif
!if ($use_ppp_core ==1)
Package "Core Layer" {
    component [$core]
    interface "core API" as Core_api_itf
    [$core] -u- Core_api_itf
}
[$ppp_name] -d-( Core_api_itf
!endif
package "Low Layer"  {
    together {
      !if ($use_ppp_ll == 1)
        component [$ll_ppp]
      !endif
      component "CMSIS-Devices"
      !if ($use_ppp_isr == 1)
        component [$ppp_ISR]
      !endif
      !if ($use_hal_dma == 1)
        component [DMA ISR]
      !endif
      !if ($use_ppp_ll == 1)
        [$ll_ppp] -[hidden]right- [CMSIS-Devices]
      !endif
      !if ($use_ppp_isr == 1)
        [CMSIS-Devices] -[hidden]right- [$ppp_ISR]
      !endif
      !if ($use_hal_dma == 1)
        !if ($use_ppp_isr == 1)
          [$ppp_ISR] -[hidden]right- [DMA ISR]
        !else
          [CMSIS-Devices] -[hidden]right- [DMA ISR]
        !endif
      !endif
    }
    !if ($use_ppp_ll == 1)
      interface "$ll_ppp_itf" as LL_PPP_Interface
      [$ll_ppp]  -u- LL_PPP_Interface
      LL_PPP_Interface -[hidden]d- [$ll_ppp]
    !endif

    !if ($use_ppp_isr == 1)
    interface "$ppp_ISR" as PPP_ISR
    [$ppp_ISR] -u- PPP_ISR
    PPP_ISR -[hidden]d- [$ppp_ISR]
    !if ($use_hal_ppp_extend == 1)
      interface "$ppp_ext_ISR" as PPP_EXT_ISR
      [$ppp_ISR] -u- PPP_EXT_ISR
      PPP_EXT_ISR -[hidden]d- [$ppp_ISR]
      [$ppp_ext_name] -d-( PPP_EXT_ISR
    !endif
    !endif


    !if ($use_ll_rcc == 1)
      component [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)
      interface "DMA ISR" as DMA_ISR
      [DMA ISR] -u- DMA_ISR
      DMA_ISR -[hidden]d- [DMA ISR]
    !endif

}

package "HW" {
    component [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
}

' Layout hints: packages top -> down, elements left -> right
[Appli] -[hidden]d- [$ppp_name]
!if ($use_hal_ppp_extend == 1)
  [Appli] -[hidden]d- [$ppp_ext_name]
!endif
!if ($use_hal_ppp_extend == 1)
  [$ppp_name] -[hidden]right- [$ppp_ext_name]
!endif
!if ($use_ppp_core == 1)
  [$ppp_name] -[hidden]d- [$core]
  [$core] -[hidden]d- [CMSIS-Devices]
!else
  [$ppp_name] -[hidden]d- [CMSIS-Devices]
!endif
[CMSIS-Devices] -[hidden]d- [STM32_HW]

!if ($use_ppp_ll == 1)
    !if ($use_hal_ppp_extend == 1)
      [$ppp_name] -d-( LL_PPP_Interface
      [$ppp_ext_name] -d-( LL_PPP_Interface
    !else
      [$ppp_name] -d-( LL_PPP_Interface
    !endif
    [$ll_ppp] .r.> [CMSIS-Devices]: $ppp register def
    [STM32_HW] <.u. [$ll_ppp] : $ppp registers R/W
!else
    !if ($use_ppp_core == 1)
      [$core] .l.> [CMSIS-Devices]: $ppp register def
      [STM32_HW] <.u. [$core] : $ppp registers R/W
    !else
      [$ppp_name] .d.> [CMSIS-Devices]: $ppp register def
      [STM32_HW] <.l. [$ppp_name] : $ppp registers R/W
    !endif
!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 HASH module, specifying their locations, default values, and descriptions:

group HASH_Configuration_Table

Configuration inside the HASH driver

Config defines

Description

Default value

Note

PRODUCT

from IDE

NONE

STM32C5XX

USE_ASSERT_DBG_PARAM

from the IDE

NONE

Allows you to use assert parameter checks.

USE_ASSERT_DBG_STATE

from the IDE

NONE

Allows you to use assert state checks.

USE_HAL_HASH_MODULE

from hal_conf.h

1

Enable the HAL HASH module

USE_HAL_CHECK_PARAM

from hal_conf.h

0

Allows you to use runtime parameter checks.

USE_HAL_HASH_REGISTER_CALLBACKS

from hal_conf.h

0

Allows to provide specific callback functions.

USE_HAL_HASH_GET_LAST_ERRORS

from hal_conf.h

0

Allows you to get last error codes.

USE_HAL_HASH_USER_DATA

from hal_conf.h

0

Allows to enable/disable user data.

USE_HAL_HASH_CLK_ENABLE_MODEL

from hal_conf.h

HAL_CLK_ENABLE_NO

Allows to enable the clock model for the HASH.

USE_HAL_HASH_DMA

from hal_conf.h

1

Allows to enable the HASH DMA module service.

USE_HAL_SECURE_CHECK_PARAM

from hal_conf.h

0

Allows to use the runtime check for sensitive APIs.

USE_HAL_CHECK_PROCESS_STATE

from hal_conf.h

0

Allows to use the load and store exclusive