New TRNG driver model added to HAL.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12253 110e8d01-0319-4d1e-a829-52ad28d1bb01
This commit is contained in:
parent
ab8cbd8f7c
commit
98aeb732ff
|
@ -71,6 +71,9 @@ endif
|
|||
ifneq ($(findstring HAL_USE_SPI TRUE,$(HALCONF)),)
|
||||
HALSRC += $(CHIBIOS)/os/hal/src/hal_spi.c
|
||||
endif
|
||||
ifneq ($(findstring HAL_USE_TRNG TRUE,$(HALCONF)),)
|
||||
HALSRC += $(CHIBIOS)/os/hal/src/hal_trng.c
|
||||
endif
|
||||
ifneq ($(findstring HAL_USE_UART TRUE,$(HALCONF)),)
|
||||
HALSRC += $(CHIBIOS)/os/hal/src/hal_uart.c
|
||||
endif
|
||||
|
@ -108,6 +111,7 @@ HALSRC = $(CHIBIOS)/os/hal/src/hal.c \
|
|||
$(CHIBIOS)/os/hal/src/hal_serial_usb.c \
|
||||
$(CHIBIOS)/os/hal/src/hal_spi.c \
|
||||
$(CHIBIOS)/os/hal/src/hal_st.c \
|
||||
$(CHIBIOS)/os/hal/src/hal_trng.c \
|
||||
$(CHIBIOS)/os/hal/src/hal_uart.c \
|
||||
$(CHIBIOS)/os/hal/src/hal_usb.c \
|
||||
$(CHIBIOS)/os/hal/src/hal_wdg.c \
|
||||
|
|
|
@ -98,6 +98,10 @@
|
|||
#define HAL_USE_SPI FALSE
|
||||
#endif
|
||||
|
||||
#if !defined(HAL_USE_TRNG)
|
||||
#define HAL_USE_TRNG FALSE
|
||||
#endif
|
||||
|
||||
#if !defined(HAL_USE_UART)
|
||||
#define HAL_USE_UART FALSE
|
||||
#endif
|
||||
|
@ -147,6 +151,7 @@
|
|||
#include "hal_serial.h"
|
||||
#include "hal_sdc.h"
|
||||
#include "hal_spi.h"
|
||||
#include "hal_trng.h"
|
||||
#include "hal_uart.h"
|
||||
#include "hal_usb.h"
|
||||
#include "hal_wdg.h"
|
||||
|
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file hal_trng.h
|
||||
* @brief TRNG Driver macros and structures.
|
||||
*
|
||||
* @addtogroup TRNG
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef HAL_TRNG_H
|
||||
#define HAL_TRNG_H
|
||||
|
||||
#if (HAL_USE_TRNG == TRUE) || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver constants. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver pre-compile time settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Derived constants and error checks. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver data structures and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Driver state machine possible states.
|
||||
*/
|
||||
typedef enum {
|
||||
TRNG_UNINIT = 0, /**< Not initialized. */
|
||||
TRNG_STOP = 1, /**< Stopped. */
|
||||
TRNG_READY = 2, /**< Ready. */
|
||||
TRNG_RUNNING = 3 /**< Generating random number. */
|
||||
} trngstate_t;
|
||||
|
||||
/**
|
||||
* @brief Type of a structure representing a TRNG driver.
|
||||
*/
|
||||
typedef struct TRNGDriver TRNGDriver;
|
||||
|
||||
#include "hal_trng_lld.h"
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver macros. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void trngInit(void);
|
||||
void trngObjectInit(TRNGDriver *trngp);
|
||||
void trngStart(TRNGDriver *trngp, const TRNGConfig *config);
|
||||
void trngStop(TRNGDriver *trngp);
|
||||
bool trngGenerate(TRNGDriver *trngp, size_t size, uint8_t *out);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* HAL_USE_TRNG == TRUE */
|
||||
|
||||
#endif /* HAL_TRNG_H */
|
||||
|
||||
/** @} */
|
|
@ -113,6 +113,9 @@ void halInit(void) {
|
|||
#if (HAL_USE_SPI == TRUE) || defined(__DOXYGEN__)
|
||||
spiInit();
|
||||
#endif
|
||||
#if (HAL_USE_TRNG == TRUE) || defined(__DOXYGEN__)
|
||||
trngInit();
|
||||
#endif
|
||||
#if (HAL_USE_UART == TRUE) || defined(__DOXYGEN__)
|
||||
uartInit();
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,151 @@
|
|||
/*
|
||||
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file hal_trng.c
|
||||
* @brief TRNG Driver code.
|
||||
*
|
||||
* @addtogroup TRNG
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "hal.h"
|
||||
|
||||
#if (HAL_USE_TRNG == TRUE) || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local definitions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief TRNG Driver initialization.
|
||||
* @note This function is implicitly invoked by @p halInit(), there is
|
||||
* no need to explicitly initialize the driver.
|
||||
*
|
||||
* @init
|
||||
*/
|
||||
void trngInit(void) {
|
||||
|
||||
trng_lld_init();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initializes the standard part of a @p TRNGDriver structure.
|
||||
*
|
||||
* @param[out] trngp pointer to the @p TRNGDriver object
|
||||
*
|
||||
* @init
|
||||
*/
|
||||
void trngObjectInit(TRNGDriver *trngp) {
|
||||
|
||||
trngp->state = TRNG_STOP;
|
||||
trngp->config = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Configures and activates the TRNG peripheral.
|
||||
*
|
||||
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||
* @param[in] config pointer to the @p TRNGConfig object or @p NULL for
|
||||
* default configuration
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
void trngStart(TRNGDriver *trngp, const TRNGConfig *config) {
|
||||
|
||||
osalDbgCheck(trngp != NULL);
|
||||
|
||||
osalSysLock();
|
||||
osalDbgAssert((trngp->state == TRNG_STOP) || (trngp->state == TRNG_READY),
|
||||
"invalid state");
|
||||
trngp->config = config;
|
||||
trng_lld_start(trngp);
|
||||
trngp->state = TRNG_READY;
|
||||
osalSysUnlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Deactivates the TRNG peripheral.
|
||||
*
|
||||
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
void trngStop(TRNGDriver *trngp) {
|
||||
|
||||
osalDbgCheck(trngp != NULL);
|
||||
|
||||
osalSysLock();
|
||||
|
||||
osalDbgAssert((trngp->state == TRNG_STOP) || (trngp->state == TRNG_READY),
|
||||
"invalid state");
|
||||
|
||||
trng_lld_stop(trngp);
|
||||
trngp->config = NULL;
|
||||
trngp->state = TRNG_STOP;
|
||||
|
||||
osalSysUnlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief True random numbers generator.
|
||||
* @note The function is blocking and likely performs polled waiting
|
||||
* inside the low level implementation.
|
||||
*
|
||||
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||
* @param[in] size size of output buffer
|
||||
* @param[out] out output buffer
|
||||
* @return The operation status.
|
||||
* @retval false if a random number has been generated.
|
||||
* @retval true if an HW error occurred.
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
bool trngGenerate(TRNGDriver *trngp, size_t size, uint8_t *out) {
|
||||
bool err;
|
||||
|
||||
osalDbgCheck((trngp != NULL) && (out != NULL));
|
||||
|
||||
osalDbgAssert(trngp->state == TRNG_READY, "not ready");
|
||||
|
||||
trngp->state = TRNG_RUNNING;
|
||||
|
||||
err = trng_lld_generate(trngp, size, out);
|
||||
|
||||
trngp->state = TRNG_READY;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif /* HAL_USE_TRNG == TRUE */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,140 @@
|
|||
/*
|
||||
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file hal_trng_lld.c
|
||||
* @brief PLATFORM TRNG subsystem low level driver source.
|
||||
*
|
||||
* @addtogroup TRNG
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "hal.h"
|
||||
|
||||
#if (HAL_USE_TRNG == TRUE) || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local definitions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief TRNGD1 driver identifier.
|
||||
*/
|
||||
#if (PLATFORM_TRNG_USE_TRNG1 == TRUE) || defined(__DOXYGEN__)
|
||||
TRNGDriver TRNGD1;
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver interrupt handlers. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Low level TRNG driver initialization.
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void trng_lld_init(void) {
|
||||
|
||||
#if PLATFORM_TRNG_USE_TRNG1 == TRUE
|
||||
/* Driver initialization.*/
|
||||
trngObjectInit(&TRNGD1);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Configures and activates the TRNG peripheral.
|
||||
*
|
||||
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void trng_lld_start(TRNGDriver *trngp) {
|
||||
|
||||
if (trngp->state == TRNG_STOP) {
|
||||
/* Enables the peripheral.*/
|
||||
#if PLATFORM_TRNG_USE_TRNG1 == TRUE
|
||||
if (&TRNGD1 == trngp) {
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* Configures the peripheral.*/
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Deactivates the TRNG peripheral.
|
||||
*
|
||||
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void trng_lld_stop(TRNGDriver *trngp) {
|
||||
|
||||
if (trngp->state == TRNG_READY) {
|
||||
/* Resets the peripheral.*/
|
||||
|
||||
/* Disables the peripheral.*/
|
||||
#if PLATFORM_TRNG_USE_TRNG1 == TRUE
|
||||
if (&TRNGD1 == trngp) {
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief True random numbers generator.
|
||||
* @note The function is blocking and likely performs polled waiting
|
||||
* inside the low level implementation.
|
||||
*
|
||||
* @param[in] trngp pointer to the @p TRNGDriver object
|
||||
* @param[in] size size of output buffer
|
||||
* @param[out] out output buffer
|
||||
* @return The operation status.
|
||||
* @retval false if a random number has been generated.
|
||||
* @retval true if an HW error occurred.
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
bool trng_lld_generate(TRNGDriver *trngp, size_t size, uint8_t *out) {
|
||||
|
||||
(void)trngp;
|
||||
(void)size;
|
||||
(void)out;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* HAL_USE_TRNG == TRUE */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file hal_trng_lld.h
|
||||
* @brief PLATFORM TRNG subsystem low level driver header.
|
||||
*
|
||||
* @addtogroup TRNG
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef HAL_TRNG_LLD_H
|
||||
#define HAL_TRNG_LLD_H
|
||||
|
||||
#if (HAL_USE_TRNG == TRUE) || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver constants. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver pre-compile time settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @name PLATFORM configuration options
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* @brief TRNGD1 driver enable switch.
|
||||
* @details If set to @p TRUE the support for TRNGD1 is included.
|
||||
* @note The default is @p FALSE.
|
||||
*/
|
||||
#if !defined(PLATFORM_TRNG_USE_TRNG1) || defined(__DOXYGEN__)
|
||||
#define PLATFORM_TRNG_USE_TRNG1 FALSE
|
||||
#endif
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Derived constants and error checks. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver data structures and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief TRNG frequency type.
|
||||
*/
|
||||
typedef uint32_t trngfreq_t;
|
||||
|
||||
/**
|
||||
* @brief TRNG counter type.
|
||||
*/
|
||||
typedef uint16_t trngcnt_t;
|
||||
|
||||
/**
|
||||
* @brief Driver configuration structure.
|
||||
* @note It could be empty on some architectures.
|
||||
*/
|
||||
typedef struct {
|
||||
/* End of the mandatory fields.*/
|
||||
/**
|
||||
* @brief Dummy configuration, it is not needed..
|
||||
*/
|
||||
uint32_t dummy;
|
||||
} TRNGConfig;
|
||||
|
||||
/**
|
||||
* @brief Structure representing a TRNG driver.
|
||||
*/
|
||||
struct TRNGDriver {
|
||||
/**
|
||||
* @brief Driver state.
|
||||
*/
|
||||
trngstate_t state;
|
||||
/**
|
||||
* @brief Current configuration data.
|
||||
*/
|
||||
const TRNGConfig *config;
|
||||
#if defined(TRNG_DRIVER_EXT_FIELDS)
|
||||
TRNG_DRIVER_EXT_FIELDS
|
||||
#endif
|
||||
/* End of the mandatory fields.*/
|
||||
};
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver macros. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#if (PLATFORM_TRNG_USE_TRNG1 == TRUE) && !defined(__DOXYGEN__)
|
||||
extern TRNGDriver TRNGD1;
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void trng_lld_init(void);
|
||||
void trng_lld_start(TRNGDriver *trngp);
|
||||
void trng_lld_stop(TRNGDriver *trngp);
|
||||
bool trng_lld_generate(TRNGDriver *trngp, size_t size, uint8_t *out);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* HAL_USE_TRNG == TRUE */
|
||||
|
||||
#endif /* HAL_TRNG_LLD_H */
|
||||
|
||||
/** @} */
|
|
@ -166,6 +166,13 @@
|
|||
#define HAL_USE_SPI TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the TRNG subsystem.
|
||||
*/
|
||||
#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
|
||||
#define HAL_USE_TRNG TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables the UART subsystem.
|
||||
*/
|
||||
|
|
|
@ -61,6 +61,9 @@ endif
|
|||
ifneq ($(findstring HAL_USE_SPI TRUE,$(HALCONF)),)
|
||||
PLATFORMSRC += ${CHIBIOS}/os/hal/templates/hal_spi_lld.c
|
||||
endif
|
||||
ifneq ($(findstring HAL_USE_TRNG TRUE,$(HALCONF)),)
|
||||
PLATFORMSRC += ${CHIBIOS}/os/hal/templates/hal_trng_lld.c
|
||||
endif
|
||||
ifneq ($(findstring HAL_USE_UART TRUE,$(HALCONF)),)
|
||||
PLATFORMSRC += ${CHIBIOS}/os/hal/templates/hal_uart_lld.c
|
||||
endif
|
||||
|
@ -90,6 +93,7 @@ PLATFORMSRC = ${CHIBIOS}/os/hal/templates/hal_lld.c \
|
|||
${CHIBIOS}/os/hal/templates/hal_serial_lld.c \
|
||||
${CHIBIOS}/os/hal/templates/hal_spi_lld.c \
|
||||
${CHIBIOS}/os/hal/templates/hal_st_lld.c \
|
||||
${CHIBIOS}/os/hal/templates/hal_trng_lld.c \
|
||||
${CHIBIOS}/os/hal/templates/hal_uart_lld.c \
|
||||
${CHIBIOS}/os/hal/templates/hal_usb_lld.c \
|
||||
${CHIBIOS}/os/hal/templates/hal_wdg_lld.c
|
||||
|
|
|
@ -91,6 +91,7 @@
|
|||
*****************************************************************************
|
||||
|
||||
*** Next ***
|
||||
- NEW: Independent TRNG driver model added to HAL.
|
||||
- NEW: TRNG API now takes a new "size" parameter, the API can now generate
|
||||
random numbers of variable size. The crypto driver now does not store
|
||||
a copy of the transient key inside, the low level can do that if
|
||||
|
|
Loading…
Reference in New Issue