| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| #ifndef OPENTITAN_SW_DEVICE_LIB_DIF_DIF_EDN_H_ |
| #define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_EDN_H_ |
| |
| /** |
| * @file |
| * @brief <a href="/hw/ip/edn/doc/">Entropy Distribution Network</a> Device |
| * Interface Functions |
| * |
| * This API implements the interface for the Entropy Distribution Network (EDN) |
| * hardware. |
| * |
| * There are two main modes of operation: |
| * |
| * - boot-time: EDN configures the associated CSRNG instance to fetch pre-FIPS |
| * entropy immediately at boot-time or after reset. |
| * - auto refresh: EDN sends reseed and generate commands to the associated |
| * CSRNG instance. The API allows the user to set the CSRNG instantiate, |
| * reseed and generate para meters, as well as the reseed frequency. |
| * |
| * Common set of operations for both boot-time and auto refresh modes: |
| * |
| * - `dif_edn_init()` |
| * - `dif_edn_configure()` |
| * |
| * Order of operations in boot-time request mode: |
| * |
| * - `did_edn_boot_mode_start()` |
| * - `dif_edn_stop()` |
| * |
| * Order of operations in auto refresh mode: |
| * |
| * - `dif_edn_auto_mode_start()` |
| * - `dif_edn_stop()` |
| * |
| * Remaining work: |
| * |
| * - Add error status interface. |
| */ |
| |
| #include <stdint.h> |
| |
| #include "sw/device/lib/base/macros.h" |
| #include "sw/device/lib/base/mmio.h" |
| #include "sw/device/lib/dif/dif_base.h" |
| |
| #include "sw/device/lib/dif/autogen/dif_edn_autogen.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| |
| enum { |
| /** |
| * Maximum seed material number of uint32_t words supported in CSRNG |
| * instantiate and seed commands. |
| */ |
| kDifEntropySeedMaterialMaxWordLen = 12, |
| }; |
| |
| /** |
| * CSRNG additional parameters for instantiate and generate commands. |
| */ |
| typedef struct dif_edn_seed_material { |
| /** |
| * Number of uint32_t words in `data`. Up to |
| * `kDifEntropySeedMaterialMaxWordLen` words can be set to initialize or |
| * reseed the CSRNG. CSRNG will extend the `data` to zeros if the provided |
| * value is less than kDifEntropySeedMaterialMaxWordLen. |
| */ |
| uint32_t len; |
| /** |
| * Seed material used in CSRNG instantiate or generate call. |
| */ |
| uint32_t data[kDifEntropySeedMaterialMaxWordLen]; |
| } dif_edn_seed_material_t; |
| |
| /** |
| * Auto-generate EDN module configuration parameters. |
| */ |
| typedef struct dif_edn_auto_params { |
| /** |
| * CSRNG instantiate command parameters. |
| */ |
| dif_edn_seed_material_t instantiate_params; |
| /** |
| * CSRNG reseed command parameters. |
| */ |
| dif_edn_seed_material_t reseed_params; |
| /** |
| * Number of uint32_t words to request the CSRNG on each generate call rounded |
| * to the nearest 128bit block. |
| */ |
| uint32_t generate_len; |
| /** |
| * Number of generate calls that can be made before a reseed request is made. |
| */ |
| uint32_t reseed_interval; |
| } dif_edn_auto_params_t; |
| |
| /** |
| * Creates a new handle for Entropy Distribution Network. |
| * |
| * This function does not actuate the hardware. |
| * |
| * @param base_addr Hardware instantiation base address. |
| * @param[out] edn Out param for the initialized handle. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_edn_init(mmio_region_t base_addr, dif_edn_t *edn); |
| |
| /** |
| * Configures Entropy Distribution Network with runtime information. |
| * |
| * This function should need to be called once for the lifetime of `handle`. |
| * |
| * @param edn An Entropy Distribution Network handle. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_edn_configure(const dif_edn_t *edn); |
| |
| /** |
| * Enables the Entropy Distribution Network in boot-time mode. |
| * |
| * Each call to this function should be sequenced with a call to |
| * `dif_edn_stop()`. |
| * |
| * @param edn An Entropy Distribution Network handle. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_edn_boot_mode_start(const dif_edn_t *edn); |
| |
| /** |
| * Enables the Entropy Distribution Network in auto refresh mode. |
| * |
| * Each call to this function should be sequenced with a call to |
| * `dif_edn_stop()`. |
| * |
| * @param edn An Entropy Distribution Network handle. |
| * @param config Auto request configuration parameters. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_edn_auto_mode_start(const dif_edn_t *edn, |
| dif_edn_auto_params_t *config); |
| |
| /** |
| * EDN Status flags. |
| */ |
| typedef enum dif_edn_status { |
| /** |
| * Device is actively processing a command in either auto or boot-time mode of |
| * operation. |
| */ |
| kDifEdnStatusCmdRunning, |
| /** |
| * Device has started the boot-time initialization process. |
| */ |
| kDifEdnStatusCmdBootInitAck, |
| } dif_edn_status_t; |
| |
| /** |
| * Queries the Entropy Distribution Network status flags. |
| * |
| * @param edn An Entropy Distribution Network handle. |
| * @param flag Status flag to query. |
| * @param set Flag state (set/unset). |
| * @return The result of the operation. |
| */ |
| dif_result_t dif_edn_get_status(const dif_edn_t *edn, dif_edn_status_t flag, |
| bool *set); |
| |
| /** |
| * Stops the current mode of operation and disables the entropy module. |
| * |
| * @param edn An Entropy Distribution Network handle. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_edn_stop(const dif_edn_t *edn); |
| |
| /** |
| * Locks out Entropy Distribution Network functionality. |
| * |
| * This function is reentrant: calling it while functionality is locked will |
| * have no effect and return `kDifEdnOk`. |
| * |
| * @param edn An Entropy Distribution Network handle. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_edn_lock(const dif_edn_t *edn); |
| |
| /** |
| * Checks whether this Entropy Distribution Network is locked. |
| * |
| * @param edn An Entropy Distribution Network handle. |
| * @param[out] is_locked Out-param for the locked state. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_edn_is_locked(const dif_edn_t *edn, bool *is_locked); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif // __cplusplus |
| |
| #endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_EDN_H_ |