| // 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_ENTROPY_SRC_H_ | |
| #define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_ENTROPY_SRC_H_ | |
| /** | |
| * @file | |
| * @brief <a href="/hw/ip/entropy_src/doc/">Entropy Source</a> Device Interface | |
| * Functions | |
| */ | |
| #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_entropy_src_autogen.h" | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif // __cplusplus | |
| /** | |
| * A single-bit RNG mode, where only one bit is sampled. | |
| */ | |
| typedef enum dif_entropy_src_single_bit_mode { | |
| /** | |
| * Single-bit-mode, sampling the zeroth bit. | |
| */ | |
| kDifEntropySrcSingleBitMode0 = 0, | |
| /** | |
| * Single-bit-mode, sampling the first bit. | |
| */ | |
| kDifEntropySrcSingleBitMode1 = 1, | |
| /** | |
| * Single-bit-mode, sampling the second bit. | |
| */ | |
| kDifEntropySrcSingleBitMode2 = 2, | |
| /** | |
| * Single-bit-mode, sampling the third bit. | |
| */ | |
| kDifEntropySrcSingleBitMode3 = 3, | |
| /** | |
| * Indicates that single-bit-mode is disabled. | |
| */ | |
| kDifEntropySrcSingleBitModeDisabled = 4, | |
| } dif_entropy_src_single_bit_mode_t; | |
| /** | |
| * Main FSM state. | |
| */ | |
| typedef enum dif_entropy_src_main_fsm { | |
| kDifEntropySrcMainFsmStateIdle = 0x0f5, | |
| kDifEntropySrcMainFsmStateBootHTRunning = 0x1d2, | |
| kDifEntropySrcMainFsmStateBootPostHTChk = 0x16e, | |
| kDifEntropySrcMainFsmStateBootPhaseDone = 0x08e, | |
| kDifEntropySrcMainFsmStateStartupHTStart = 0x02c, | |
| kDifEntropySrcMainFsmStateStartupPhase1 = 0x101, | |
| kDifEntropySrcMainFsmStateStartupPass1 = 0x1a5, | |
| kDifEntropySrcMainFsmStateStartupFail1 = 0x017, | |
| kDifEntropySrcMainFsmStateContHTStart = 0x040, | |
| kDifEntropySrcMainFsmStateContHTRunning = 0x1a2, | |
| kDifEntropySrcMainFsmStateFWInsertStart = 0x0c3, | |
| kDifEntropySrcMainFsmStateFWInsertMsg = 0x059, | |
| kDifEntropySrcMainFsmStateSha3MsgDone = 0x10f, | |
| kDifEntropySrcMainFsmStateSha3Prep = 0x0f8, | |
| kDifEntropySrcMainFsmStateSha3Process = 0x0bf, | |
| kDifEntropySrcMainFsmStateSha3Valid = 0x171, | |
| kDifEntropySrcMainFsmStateSha3Done = 0x198, | |
| kDifEntropySrcMainFsmStateSha3Quiesce = 0x1cd, | |
| kDifEntropySrcMainFsmStateAlertState = 0x1fb, | |
| kDifEntropySrcMainFsmStateAlertHang = 0x15c, | |
| kDifEntropySrcMainFsmStateError = 0x13d | |
| } dif_entropy_src_main_fsm_t; | |
| /** | |
| * Firmware override parameters for an entropy source. | |
| */ | |
| typedef struct dif_entropy_src_fw_override_config { | |
| /** | |
| * Enables firmware to insert entropy bits back into the pre-conditioner block | |
| * via `dif_entropy_fifo_write()` calls. This feature is useful when the | |
| * firmware is required to implement additional health checks, and to perform | |
| * known answer tests of the preconditioner function. | |
| * | |
| * To take effect, this requires the firmware override feature to be enabled. | |
| */ | |
| bool entropy_insert_enable; | |
| /** | |
| * This field sets the depth of the observe FIFO hardware buffer used when | |
| * the firmware override feature is enabled. | |
| */ | |
| uint8_t buffer_threshold; | |
| } dif_entropy_src_fw_override_config_t; | |
| /** | |
| * Runtime configuration for an entropy source. | |
| * | |
| * This struct describes runtime information for one-time configuration of the | |
| * hardware. | |
| */ | |
| typedef struct dif_entropy_src_config { | |
| /** | |
| * If set, FIPS compliant entropy will be generated by this module after being | |
| * processed by an SP 800-90B compliant conditioning function. | |
| * | |
| * Software may opt for implementing FIPS mode of operation without hardware | |
| * support by setting this field to false. In such case, software is | |
| * responsible for implementing the conditioning function. | |
| */ | |
| bool fips_enable; | |
| /** | |
| * If set, entropy will be routed to a firmware-visible register instead of | |
| * being distributed to other hardware IPs. | |
| */ | |
| bool route_to_firmware; | |
| /** | |
| * If set, raw entropy will be sent to CSRNG, bypassing the conditioner block | |
| * and disabling the FIPS flag. Note that the FIPS flag is different from | |
| * running the block in FIPS mode. FIPS mode refers to running the entropy_src | |
| * in continuous mode. | |
| */ | |
| bool bypass_conditioner; | |
| /** | |
| * Specifies which single-bit-mode to use, if any at all. | |
| */ | |
| dif_entropy_src_single_bit_mode_t single_bit_mode; | |
| /** | |
| * Controls the scope (either by-line or by-sum) of the health tests. | |
| * | |
| * If true, the Adaptive Proportion and Markov Tests will accumulate all RNG | |
| * input lines into a single score, and thresholds will be applied to the sum | |
| * of all the entropy input lines. | |
| * | |
| * If false, the RNG input lines are all scored individually. A statistical | |
| * deviation in any one input line, be it due to coincidence or failure, will | |
| * force rejection of the sample, and count toward the total alert count. | |
| */ | |
| bool health_test_threshold_scope; | |
| /** | |
| * The size of the window used for health tests. | |
| * | |
| * Units: bits | |
| */ | |
| uint16_t health_test_window_size; | |
| /** | |
| * The number of health test failures that must occur before an alert is | |
| * triggered. When set to 0, alerts are disabled. | |
| */ | |
| uint16_t alert_threshold; | |
| } dif_entropy_src_config_t; | |
| /** | |
| * A statistical test on the bits emitted by an entropy source. | |
| */ | |
| typedef enum dif_entropy_src_test { | |
| /** | |
| * An SP 800-90B repetition count test. | |
| * | |
| * This test screens for stuck bits, or a total failure of the noise source. | |
| * This test fails if any sequence of bits repeats too many times in a row | |
| * for too many samples. | |
| */ | |
| kDifEntropySrcTestRepetitionCount = 0, | |
| /** | |
| * An SP 800-90B symbol repetition count test. | |
| * | |
| * This is similar to the above, test but is performed on a symbol, instead of | |
| * bit, basis. | |
| */ | |
| kDifEntropySrcTestRepetitionCountSymbol = 1, | |
| /** | |
| * An SP 800-90B adaptive proportion test. | |
| * | |
| * This test screens for statistical bias in the number of ones or zeros | |
| * output by the noise source. | |
| */ | |
| kDifEntropySrcTestAdaptiveProportion = 2, | |
| /** | |
| * A bucket test. | |
| * | |
| * This test looks for correlations between individual noise channels. | |
| */ | |
| kDifEntropySrcTestBucket = 3, | |
| /** | |
| * A "Markov" test. | |
| * | |
| * This test looks for unexpected first-order temporal correlations | |
| * between individual noise channels. | |
| */ | |
| kDifEntropySrcTestMarkov = 4, | |
| /** | |
| * A firmware-driven "mailbox" test. | |
| * | |
| * This test allows firmware to inspect 2kbit blocks of entropy, and signal | |
| * potential concerns to the hardware. | |
| */ | |
| kDifEntropySrcTestMailbox = 5, | |
| /** \internal */ | |
| kDifEntropySrcTestNumVariants = 6, | |
| } dif_entropy_src_test_t; | |
| /** | |
| * Criteria used by various entropy source health tests to decide whether the | |
| * test has failed. | |
| */ | |
| typedef struct dif_entropy_src_health_test_config { | |
| /** | |
| * The entropy source health test type to configure. | |
| */ | |
| dif_entropy_src_test_t test_type; | |
| /** | |
| * The high threshold for the health test. | |
| */ | |
| uint32_t high_threshold; | |
| /** | |
| * The low threshold for the health test. | |
| * | |
| * If the corresponding health test has no low threshold, set to 0, otherwise | |
| * `dif_entropy_src_health_test_configure()` will return `kDifBadArg`. | |
| */ | |
| uint32_t low_threshold; | |
| } dif_entropy_src_health_test_config_t; | |
| /** | |
| * Revision information for an entropy source. | |
| * | |
| * The fields of this struct have an implementation-specific interpretation. | |
| */ | |
| typedef struct dif_entropy_src_revision { | |
| uint8_t abi_revision; | |
| uint8_t hw_revision; | |
| uint8_t chip_type; | |
| } dif_entropy_src_revision_t; | |
| /** | |
| * Statistics on entropy source health tests. | |
| */ | |
| typedef struct dif_entropy_src_health_test_stats { | |
| /** | |
| * High watermark indicating the highest value emitted by a particular test. | |
| */ | |
| uint16_t high_watermark[kDifEntropySrcTestNumVariants]; | |
| /** | |
| * Low watermark indicating the lowest value emitted by a particular test. | |
| * | |
| * Note, some health tests do not emit a low watermark as there is no low | |
| * threshold. For these tests, this value will always be UINT16_MAX. | |
| */ | |
| uint16_t low_watermark[kDifEntropySrcTestNumVariants]; | |
| /** | |
| * The number of times a particular test has failed above the high threshold. | |
| */ | |
| uint32_t high_fails[kDifEntropySrcTestNumVariants]; | |
| /** | |
| * The number of times a particular test has failed below the low threshold. | |
| * | |
| * Note, some health tests do not have a low threshold. For these tests, this | |
| * value will always be 0. | |
| */ | |
| uint32_t low_fails[kDifEntropySrcTestNumVariants]; | |
| } dif_entropy_src_health_test_stats_t; | |
| /** | |
| * Statistics on entropy source health tests failures that triggered alerts. | |
| */ | |
| typedef struct dif_entropy_src_alert_fail_counts { | |
| /** | |
| * The total number of test failures, across all test types, that contributed | |
| * to the alerts fired. | |
| */ | |
| uint16_t total_fails; | |
| /** | |
| * The number of test failures, due to the specific test execeeding the high | |
| * threshold, that cause alerts to be fired. | |
| */ | |
| uint8_t high_fails[kDifEntropySrcTestNumVariants]; | |
| /** | |
| * The number of test failures, due to the specific test execeeding the low | |
| * threshold, that cause alerts to be fired. | |
| * | |
| * Note, some health tests do not have a low threshold. For these tests, this | |
| * value will always be 0. | |
| */ | |
| uint8_t low_fails[kDifEntropySrcTestNumVariants]; | |
| } dif_entropy_src_alert_fail_counts_t; | |
| /** | |
| * SHA3 state machine states. | |
| * | |
| * See `hw/ip/kmac/rtl/sha3_pkg.sv` for more details. | |
| */ | |
| typedef enum dif_entropy_src_sha3_state { | |
| kDifEntropySrcSha3StateIdle = 0, | |
| kDifEntropySrcSha3StateAbsorb = 1, | |
| kDifEntropySrcSha3StateSqueeze = 2, | |
| kDifEntropySrcSha3StateManualRun = 3, | |
| kDifEntropySrcSha3StateFlush = 4, | |
| kDifEntropySrcSha3StateError = 5, | |
| } dif_entropy_src_sha3_state_t; | |
| /** | |
| * Debug status information. | |
| */ | |
| typedef struct dif_entropy_src_debug_state { | |
| /** | |
| * Depth of the entropy source FIFO. | |
| * | |
| * Valid range: [0, 7] | |
| */ | |
| uint8_t entropy_fifo_depth; | |
| /** | |
| * The current state of the SHA3 preconditioner state machine. | |
| * | |
| * See `dif_entropy_src_sha3_state_t` for more details. | |
| */ | |
| dif_entropy_src_sha3_state_t sha3_fsm_state; | |
| /** | |
| * Whether the SHA3 preconditioner has completed processing the current block. | |
| */ | |
| bool sha3_block_processed; | |
| /** | |
| * Whether the SHA3 preconditioner is in the squeezing state. | |
| */ | |
| bool sha3_squeezing; | |
| /** | |
| * Whether the SHA3 preconditioner is in the absorbed state. | |
| */ | |
| bool sha3_absorbed; | |
| /** | |
| * Whether the SHA3 preconditioner has is in an error state. | |
| */ | |
| bool sha3_error; | |
| /** | |
| * Whether the main FSM is in the idle state. | |
| */ | |
| bool main_fsm_is_idle; | |
| /** | |
| * Whether the main FSM is in the boot done state. | |
| */ | |
| bool main_fsm_boot_done; | |
| } dif_entropy_src_debug_state_t; | |
| /** | |
| * Recoverable alerts. | |
| */ | |
| typedef enum dif_entropy_src_alert_cause { | |
| /** | |
| * Triggered when the FIPS_ENABLE field in the CONF register is set to an | |
| * unsupported value. | |
| */ | |
| kDifEntropySrcAlertFipsEnableField = 1U << 0, | |
| /** | |
| * Triggered when the ENTROPY_DATA_REG_ENABLE field in the CONF register is | |
| * set to an unsupported value. | |
| */ | |
| kDifEntropySrcAlertEntropyDataRegEnField = 1U << 1, | |
| /** | |
| * Triggered when the MODULE_ENABLE field in the MODULE_ENABLE register is set | |
| * to an unsupported value. | |
| */ | |
| kDifEntropySrcAlertModuleEnableField = 1U << 2, | |
| /** | |
| * Triggered when the THRESHOLD_SCOPE field in the CONF register is set to an | |
| * unsupported value. | |
| */ | |
| kDifEntropySrcAlertThresholdScopeField = 1U << 3, | |
| /** | |
| * Triggered when the RNG_BIT_ENABLE field in the CONF register is set to an | |
| * unsupported value. | |
| */ | |
| kDifEntropySrcAlertRngBitEnableField = 1U << 5, | |
| /** | |
| * Triggered when the FW_OV_SHA3_START field in the FW_OV_SHA3_START register | |
| * is set to an unsupported value. | |
| */ | |
| kDifEntropySrcAlertFwOvSha3StartField = 1U << 7, | |
| /** | |
| * Triggered when the FW_OV_MODE field in the FW_OV_CONTROL register is set to | |
| * an unsupported value. | |
| */ | |
| kDifEntropySrcAlertFwOvModeField = 1U << 8, | |
| /** | |
| * Triggered when the FW_OV_ENTROPY_INSERT field in the FW_OV_CONTROL register | |
| * is set to an unsupported value. | |
| */ | |
| kDifEntropySrcAlertFwOvEntropyInsertField = 1U << 9, | |
| /** | |
| * Triggered when the ES_ROUTE field in the ENTROPY_CONTROL register is set to | |
| * an unsupported value. | |
| */ | |
| kDifEntropySrcAlertEsRouteField = 1U << 10, | |
| /** | |
| * Triggered when the ES_TYPE field in the ENTROPY_CONTROL register is set to | |
| * an unsupported value. | |
| */ | |
| kDifEntropySrcAlertEsTypeField = 1U << 11, | |
| /** | |
| * Triggered when the main state machine detects a threshold failure state. | |
| */ | |
| kDifEntropySrcAlertMainStateMachine = 1U << 12, | |
| /** | |
| * Triggered when the internal entropy bus value is equal to the prior valid | |
| * value on the bus, indicating a possible attack. | |
| */ | |
| kDifEntropySrcAlertDuplicateValue = 1U << 13, | |
| /** | |
| * Triggered when the ALERT_THRESHOLD register is not configured properly, | |
| * i.e., the upper field must be the exact inverse of the lower field. | |
| */ | |
| kDifEntropySrcAlertThresholdConfig = 1U << 14, | |
| /** | |
| * All alert reasons. | |
| * | |
| * This is useful when clearing all recoverable alerts at once. | |
| */ | |
| kDifEntropySrcAlertAllAlerts = (1U << 15) - 1, | |
| } dif_entropy_src_alert_cause_t; | |
| /** | |
| * Error codes (non-recoverable). | |
| */ | |
| typedef enum dif_entropy_src_error { | |
| /** | |
| * Triggered when a write error has been detected for the esrng FIFO. | |
| */ | |
| kDifEntropySrcErrorRngFifoWrite = 1U << 0, | |
| /** | |
| * Triggered when a read error has been detected for the esrng FIFO. | |
| */ | |
| kDifEntropySrcErrorRngFifoRead = 1U << 1, | |
| /** | |
| * Triggered when a state error has been detected for the esrng FIFO. | |
| */ | |
| kDifEntropySrcErrorRngFifoState = 1U << 2, | |
| /** | |
| * Triggered when a write error has been detected for the observe FIFO. | |
| */ | |
| kDifEntropySrcErrorObserveFifoWrite = 1U << 3, | |
| /** | |
| * Triggered when a read error has been detected for the observe FIFO. | |
| */ | |
| kDifEntropySrcErrorObserveFifoRead = 1U << 4, | |
| /** | |
| * Triggered when a state error has been detected for the observe FIFO. | |
| */ | |
| kDifEntropySrcErrorObserveFifoState = 1U << 5, | |
| /** | |
| * Triggered when a write error has been detected for the esfinal FIFO. | |
| */ | |
| kDifEntropySrcErrorFinalFifoWrite = 1U << 6, | |
| /** | |
| * Triggered when a read error has been detected for the esfinal FIFO. | |
| */ | |
| kDifEntropySrcErrorFinalFifoRead = 1U << 7, | |
| /** | |
| * Triggered when a state error has been detected for the esfinal FIFO. | |
| */ | |
| kDifEntropySrcErrorFinalFifoState = 1U << 8, | |
| /** | |
| * Triggered when an error has been detected for the acknowledgment stage | |
| * state machine. | |
| */ | |
| kDifEntropySrcErrorAckStateMachine = 1U << 9, | |
| /** | |
| * Triggered when an error has been detected for the main state machine. | |
| */ | |
| kDifEntropySrcErrorMainStateMachine = 1U << 10, | |
| /** | |
| * Triggered when an error has been detected for a hardened counter. | |
| */ | |
| kDifEntropySrcErrorHardenedCounter = 1U << 11, | |
| } dif_entropy_src_error_t; | |
| /** | |
| * Stops the current mode of operation and disables the entropy_src module | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_stop(const dif_entropy_src_t *entropy_src); | |
| /** | |
| * Configures entropy source with runtime information. | |
| * | |
| * This function should only need to be called once for the lifetime of the | |
| * `entropy` handle. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param config Runtime configuration parameters. | |
| * @param enabled The enablement state of the entropy source. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_configure(const dif_entropy_src_t *entropy_src, | |
| dif_entropy_src_config_t config, | |
| dif_toggle_t enabled); | |
| /** | |
| * Configures entropy source firmware override feature with runtime information. | |
| * | |
| * This function should only need to be called once for the lifetime of the | |
| * `entropy` handle. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param config Runtime configuration parameters for firmware override. | |
| * @param enabled The enablement state of the firmware override option. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_fw_override_configure( | |
| const dif_entropy_src_t *entropy_src, | |
| dif_entropy_src_fw_override_config_t config, dif_toggle_t enabled); | |
| /** | |
| * Configures an entropy source health test feature with runtime information. | |
| * | |
| * This function should only need to be called once for each health test that | |
| * requires configuration for the lifetime of the `entropy` handle. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param config Runtime configuration parameters for the health test. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_health_test_configure( | |
| const dif_entropy_src_t *entropy_src, | |
| dif_entropy_src_health_test_config_t config); | |
| /** | |
| * Enables/Disables the entropy source. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param enabled The enablement state to configure the entropy source in. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_set_enabled(const dif_entropy_src_t *entropy_src, | |
| dif_toggle_t enabled); | |
| /** | |
| * Locks out entropy source functionality. | |
| * | |
| * This function is reentrant: calling it while functionality is locked will | |
| * have no effect and return `kDifEntropySrcOk`. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_lock(const dif_entropy_src_t *entropy_src); | |
| /** | |
| * Checks whether this entropy source is locked. | |
| * | |
| * @param entropy_src An entropy source 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_entropy_src_is_locked(const dif_entropy_src_t *entropy_src, | |
| bool *is_locked); | |
| /** | |
| * Queries the entropy_src source IP for its revision information. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] revision Out-param for revision data. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_get_revision(const dif_entropy_src_t *entropy_src, | |
| dif_entropy_src_revision_t *revision); | |
| /** | |
| * Queries the entropy source for health test statistics. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] stats Out-param for stats data. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_get_health_test_stats( | |
| const dif_entropy_src_t *entropy_src, | |
| dif_entropy_src_health_test_stats_t *stats); | |
| /** | |
| * Queries the entropy source for health test failure statistics. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] counts Out-param for test failure data that triggers alerts. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_get_alert_fail_counts( | |
| const dif_entropy_src_t *entropy_src, | |
| dif_entropy_src_alert_fail_counts_t *counts); | |
| /** | |
| * Checks to see if entropy is available for software consumption. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_is_entropy_available( | |
| const dif_entropy_src_t *entropy_src); | |
| /** | |
| * Reads a word of entropy from the entropy source. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] word Out-param for the entropy word. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_non_blocking_read( | |
| const dif_entropy_src_t *entropy_src, uint32_t *word); | |
| /** | |
| * Performs a blocking read from the entropy pipeline through the observe FIFO, | |
| * which contains post-test, unconditioned entropy. | |
| * | |
| * The entropy source must be configured with firmware override mode enabled, | |
| * and the `len` parameter must be less than or equal to the FIFO threshold set | |
| * in the firmware override parameters (that is, the threshold that triggers an | |
| * interrupt). Additionally, `buf` may be `NULL`; in this case, reads will be | |
| * discarded. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] buf A buffer to fill with words from the pipeline. | |
| * @param len The number of words to read into `buf`. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_observe_fifo_blocking_read( | |
| const dif_entropy_src_t *entropy_src, uint32_t *buf, size_t len); | |
| /** | |
| * Performs a write to the entropy pipeline through the observe FIFO. | |
| * | |
| * Entropy source must be configured with firmware override and insert mode | |
| * enabled, otherwise the function will return `kDifError`. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param buf A buffer to push words from into the pipeline. | |
| * @param len The number of words to write from `buf`. | |
| * @param[out] written The number of words successfully written. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_observe_fifo_write( | |
| const dif_entropy_src_t *entropy_src, const uint32_t *buf, size_t len, | |
| size_t *written); | |
| /** | |
| * Starts conditioner operation. | |
| * | |
| * Initializes the conditioner. Use the `dif_entropy_src_observe_fifo_write()` | |
| * function to send data to the conditioner, and | |
| * `dif_entropy_src_conditioner_stop()` once ready to stop the conditioner | |
| * operation. | |
| * | |
| * This function is only available when firmware override mode is enabled. See | |
| * `dif_entropy_src_fw_override_configure()` for more details. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_conditioner_start( | |
| const dif_entropy_src_t *entropy_src); | |
| /** | |
| * Stops conditioner operation. | |
| * | |
| * The conditioner stops processing input data and deposits the result digest | |
| * in the entropy source output buffer. This operation is only available in | |
| * firmware override mode. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_conditioner_stop( | |
| const dif_entropy_src_t *entropy_src); | |
| /** | |
| * Checks whether the firmware override write FIFO is full. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] is_full Whether the FIFO is full. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_is_fifo_full(const dif_entropy_src_t *entropy_src, | |
| bool *is_full); | |
| /** | |
| * Checks whether the firmware override read FIFO has overflowed. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] has_overflowed Whether the FIFO has overflowed, and data has been | |
| * lost. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_has_fifo_overflowed( | |
| const dif_entropy_src_t *entropy_src, bool *has_overflowed); | |
| /** | |
| * Clears the firmware override read FIFO overflow status. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_clear_fifo_overflow( | |
| const dif_entropy_src_t *entropy_src); | |
| /** | |
| * Read the firmware override FIFO depth. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] fifo_depth The FIFO depth. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_get_fifo_depth( | |
| const dif_entropy_src_t *entropy_src, uint32_t *fifo_depth); | |
| /** | |
| * Reads the debug status register. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] debug_state The current debug state of the IP. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_get_debug_state( | |
| const dif_entropy_src_t *entropy_src, | |
| dif_entropy_src_debug_state_t *debug_state); | |
| /** | |
| * Reads the recoverable alert status register. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] alerts The alerts that were triggered (one or more | |
| * `dif_entropy_src_alert_t`'s ORed together). | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_get_recoverable_alerts( | |
| const dif_entropy_src_t *entropy_src, uint32_t *alerts); | |
| /** | |
| * Clears the alerts that are recoverable. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param alerts The alerts to be cleared (one or more | |
| * `dif_entropy_src_alert_t`'s ORed together). | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_clear_recoverable_alerts( | |
| const dif_entropy_src_t *entropy_src, uint32_t alerts); | |
| /** | |
| * Reads the (nonrecoverable) error code status register. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] errors The errors that were triggered (one or more | |
| * `dif_entropy_src_error_t`'s ORed together). | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_get_errors(const dif_entropy_src_t *entropy_src, | |
| uint32_t *errors); | |
| /** | |
| * Forces the hardware to generate a error for testing purposes. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param error The error to force (for testing purposes). | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_error_force(const dif_entropy_src_t *entropy_src, | |
| dif_entropy_src_error_t error); | |
| /** | |
| * Reads the current main FSM state. | |
| * | |
| * @param entropy_src An entropy source handle. | |
| * @param[out] state The current FSM state. | |
| * @return The result of the operation. | |
| */ | |
| OT_WARN_UNUSED_RESULT | |
| dif_result_t dif_entropy_src_get_main_fsm_state( | |
| const dif_entropy_src_t *entropy_src, dif_entropy_src_main_fsm_t *state); | |
| #ifdef __cplusplus | |
| } // extern "C" | |
| #endif // __cplusplus | |
| #endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_ENTROPY_SRC_H_ |