| // 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_KMAC_H_ |
| #define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_KMAC_H_ |
| |
| /** |
| * @file |
| * @brief <a href="/hw/ip/kmac/doc/">KMAC</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_kmac_autogen.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| |
| /** |
| * This API implements an interface for the KMAC hardware. |
| * |
| * The KMAC hardware implements the following cryptographic hash and message |
| * authentication code (MAC) functions: |
| * |
| * - SHA-3 [1] |
| * - SHAKE [1] |
| * - cSHAKE [2] |
| * - KMAC [2] |
| * |
| * The following sequence of operations is required to initialize the KMAC |
| * hardware: |
| * |
| * - `dif_kmac_init()` |
| * - `dif_kmac_configure()` |
| * |
| * If configuration changes are required then `dif_kmac_configure` can be called |
| * again so long as there are no operations in progress. |
| * |
| * The following sequence of operations is required to execute an operation: |
| * |
| * - `dif_kmac_{sha3,shake,cshake,kmac}_start()` |
| * - `dif_kmac_absorb()` |
| * - `dif_kmac_squeeze()` |
| * - `dif_kmac_end()` |
| * |
| * This is a streaming API and the `dif_kmac_absorb` and `dif_kmac_squeeze` |
| * functions may be called multiple times during a single operation. Once |
| * `dif_kmac_squeeze` has been called however no further `dif_kmac_absorb` calls |
| * may be made. See NIST FIPS 202 [1] for more information about the sponge |
| * construction and the 'absorbing' and 'squeezing' states. |
| * |
| * Please see the following documentation for more information about the KMAC |
| * hardware: |
| * https://docs.opentitan.org/hw/ip/kmac/doc/ |
| * |
| * References: |
| * [1] - NIST FIPS 202 |
| * SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions |
| * http://dx.doi.org/10.6028/NIST.FIPS.202 |
| * [2] - NIST Special Publication 800-185 |
| * SHA-3 Derived Functions: cSHAKE, KMAC, TupleHash and ParallelHash |
| * https://doi.org/10.6028/NIST.SP.800-185 |
| */ |
| |
| /** |
| * Supported entropy modes. |
| * |
| * Entropy may be provided by the entropy distribution network (EDN) or using a |
| * seed provided by software. |
| */ |
| typedef enum dif_kmac_entropy_mode { |
| kDifKmacEntropyModeIdle = 0, |
| kDifKmacEntropyModeEdn, |
| kDifKmacEntropyModeSoftware, |
| } dif_kmac_entropy_mode_t; |
| |
| /** |
| * Maximum lengths supported by the KMAC unit. |
| */ |
| enum { |
| |
| /** |
| * The maximum length in bytes of a customization string (S) before it has |
| * been encoded. |
| */ |
| kDifKmacMaxCustomizationStringLen = 32, |
| |
| /** |
| * The maximum number of bytes required to encode the length of the |
| * customization string. |
| * |
| * Assumes maximum customization string length of 32 bytes (256 bits). |
| */ |
| kDifKmacMaxCustomizationStringOverhead = 3, |
| |
| /** |
| * The maximum length in bytes of a function name (N) before it has been |
| * encoded. |
| */ |
| kDifKmacMaxFunctionNameLen = 4, |
| |
| /** |
| * The maximum number of bytes required to encode the length of the function |
| * name. |
| * |
| * Assumes maximum function name length of 4 bytes (32 bits). |
| */ |
| kDifKmacMaxFunctionNameOverhead = 2, |
| |
| /** |
| * The maximum output length (L) that can be set when starting a KMAC |
| * operation. |
| * |
| * The length is in 32-bit words and is designed to be low enough that the |
| * length in bits can still be represented by an unsigned 32-bit integer. |
| */ |
| kDifKmacMaxOutputLenWords = (UINT32_MAX - 32) / 32, |
| |
| /** |
| * The maximum key length supported by the KMAC operation. |
| * |
| * The length is in 32-bit words. |
| */ |
| kDifKmacMaxKeyLenWords = 512 / 32, |
| |
| /** |
| * The length of the software entropy seed. |
| * |
| * The length is in 32-bit words. |
| */ |
| kDifKmacEntropySeedWords = 5, |
| /** |
| * The offset of the second share within the output state register. |
| */ |
| kDifKmacStateShareOffset = 0x100, |
| }; |
| |
| /** |
| * Runtime configuration for KMAC. |
| * |
| * This struct describes runtime information for configuration of the hardware. |
| */ |
| typedef struct dif_kmac_config { |
| /** |
| * Entropy mode specifying the source of entropy (EDN or software). |
| */ |
| dif_kmac_entropy_mode_t entropy_mode; |
| |
| /** |
| * Entropy fast process mode when enabled prevents the KMAC unit consuming |
| * entropy unless it is processing a secret key. This process should not be |
| * used when resistance against side-channel attacks is required, because |
| * it may lead to leakage of the secret key in the power trace. |
| */ |
| bool entropy_fast_process; |
| |
| /** |
| * Entropy seed. Only used when the source of entropy is software. |
| */ |
| uint32_t entropy_seed[kDifKmacEntropySeedWords]; |
| |
| /** |
| * The number of KMAC invocations that triggers an automatic seed request from |
| * EDN. |
| */ |
| uint16_t entropy_hash_threshold; |
| |
| /** |
| * Number of clock cycles to wait for the EDN to reseed the entropy generator |
| * before an error is raised (see `dif_kmac_get_error`). If 0 the unit will |
| * wait forever. |
| */ |
| uint16_t entropy_wait_timer; |
| |
| /** |
| * Prescaler value that determines how many clock pulse triggers an increment |
| * in the timer counter. |
| */ |
| uint16_t entropy_prescaler; |
| |
| /** |
| * Convert the message to big-endian byte order. |
| * Note: this option currently had no effect since the message is sent a byte |
| * at a time but will in the future. |
| */ |
| bool message_big_endian; |
| |
| /** |
| * Convert the output state (digest) to big-endian byte order on a word |
| * granularity. |
| */ |
| bool output_big_endian; |
| |
| /** |
| * Place kmac inside key sideload mode |
| */ |
| bool sideload; |
| |
| /** |
| * Message Masking with PRNG. |
| * If true, KMAC applies PRNG to the input messages to the Keccak module when |
| * KMAC mode is on. |
| */ |
| bool msg_mask; |
| |
| } dif_kmac_config_t; |
| |
| /** |
| * A KMAC operation state context. |
| */ |
| typedef struct dif_kmac_operation_state { |
| /** |
| * Whether the 'squeezing' phase has been started. |
| */ |
| bool squeezing; |
| |
| /** |
| * Flag indicating whether the output length (d) should be right encoded in |
| * software and appended to the end of the message. The output length is |
| * required to be appended to the message as part of a KMAC operation. |
| */ |
| bool append_d; |
| |
| /** |
| * Offset into the output state. |
| */ |
| size_t offset; |
| |
| /** |
| * The rate (r) in 32-bit words. |
| */ |
| size_t r; |
| |
| /** |
| * The output length (d) in 32-bit words. |
| * |
| * If the output length is not fixed then this field will be set to 0. |
| * |
| * Note: if the output length is fixed length will be modified to ensure that |
| * `d - offset` always accurately reflects the number of words remaining. |
| */ |
| size_t d; |
| } dif_kmac_operation_state_t; |
| |
| /** |
| * Supported SHA-3 modes of operation. |
| */ |
| typedef enum dif_kmac_mode_sha3 { |
| /** SHA-3 with 224 bit strength. */ |
| kDifKmacModeSha3Len224, |
| /** SHA-3 with 256 bit strength. */ |
| kDifKmacModeSha3Len256, |
| /** SHA-3 with 384 bit strength. */ |
| kDifKmacModeSha3Len384, |
| /** SHA-3 with 512 bit strength. */ |
| kDifKmacModeSha3Len512, |
| } dif_kmac_mode_sha3_t; |
| |
| /** |
| * Supported SHAKE modes of operation. |
| */ |
| typedef enum dif_kmac_mode_shake { |
| /** SHAKE with 128 bit strength. */ |
| kDifKmacModeShakeLen128, |
| /** SHAKE with 256 bit strength. */ |
| kDifKmacModeShakeLen256, |
| } dif_kmac_mode_shake_t; |
| |
| /** |
| * Supported cSHAKE modes of operation. |
| */ |
| typedef enum dif_kmac_mode_cshake { |
| /** cSHAKE with 128 bit strength. */ |
| kDifKmacModeCshakeLen128, |
| /** cSHAKE with 256 bit strength. */ |
| kDifKmacModeCshakeLen256, |
| } dif_kmac_mode_cshake_t; |
| |
| /** |
| * Supported KMAC modes of operation. |
| */ |
| typedef enum dif_kmac_mode_kmac { |
| /** KMAC with 128 bit strength. */ |
| kDifKmacModeKmacLen128, |
| /** KMAC with 256 bit strength. */ |
| kDifKmacModeKmacLen256, |
| } dif_kmac_mode_kmac_t; |
| |
| /** |
| * Key length. |
| * |
| * The key length is specified in bits. |
| */ |
| typedef enum dif_kmac_key_length { |
| /** Software provided 128 bit key. */ |
| kDifKmacKeyLen128 = 0, |
| /** Software provided 192 bit key. */ |
| kDifKmacKeyLen192 = 1, |
| /** Software provided 256 bit key. */ |
| kDifKmacKeyLen256 = 2, |
| /** Software provided 384 bit key. */ |
| kDifKmacKeyLen384 = 3, |
| /** Software provided 512 bit key. */ |
| kDifKmacKeyLen512 = 4, |
| } dif_kmac_key_length_t; |
| |
| /** |
| * A key for KMAC operations. |
| * |
| * The key is provided in two parts, `share0` and `share1`. These are |
| * combined using a bitwise XOR operation in the KMAC unit to produce the real |
| * key. |
| * |
| * The key shares are encoded in little endian byte order. This is fixed and |
| * cannot be changed (unlike the byte order used for the message and state). |
| * |
| * Unused words in the key shares must be set to 0. |
| */ |
| typedef struct dif_kmac_key { |
| uint32_t share0[kDifKmacMaxKeyLenWords]; |
| uint32_t share1[kDifKmacMaxKeyLenWords]; |
| dif_kmac_key_length_t length; |
| } dif_kmac_key_t; |
| |
| /** |
| * An encoded bit string used for customization string (S). |
| * |
| * Use `dif_kmac_customization_string_init` to initialize. |
| */ |
| typedef struct dif_kmac_customization_string { |
| /** Encoded S: left_encode(len(S)) || S */ |
| char buffer[kDifKmacMaxCustomizationStringLen + |
| kDifKmacMaxCustomizationStringOverhead]; |
| /** Length of data in buffer in bytes. */ |
| uint32_t length; |
| } dif_kmac_customization_string_t; |
| |
| /** |
| * An encoded bit string used for function name (N). |
| * |
| * Use `dif_kmac_function_name_init` to initialize. |
| */ |
| typedef struct dif_kmac_function_name { |
| /** Encoded N: left_encode(len(N)) || N */ |
| char buffer[kDifKmacMaxFunctionNameLen + kDifKmacMaxFunctionNameOverhead]; |
| /** Length of data in buffer in bytes. */ |
| uint32_t length; |
| } dif_kmac_function_name_t; |
| |
| /** |
| * Error reported by KMAC unit. |
| * |
| * Codes taken from hw/ip/kmac/rtl/kmac_pkg.sv:err_code_e |
| */ |
| typedef enum dif_kmac_error { |
| /** |
| * No error has occured. |
| */ |
| kDifErrorNone, |
| |
| /** |
| * The Key Manager has raised an error because the secret key is not valid. |
| */ |
| kDifErrorKeyNotValid, |
| |
| /** |
| * An attempt was made to write data into the message FIFO but the KMAC unit |
| * was not in the correct state to receive the data. |
| */ |
| kDifErrorSoftwarePushedMessageFifo, |
| |
| /** |
| * An invalid state transition was attempted (e.g. idle -> run without |
| * intermediate process state). |
| */ |
| kDifErrorSoftwarePushedWrongCommand, |
| |
| /** |
| * The entropy wait timer has expired. |
| */ |
| kDifErrorEntropyWaitTimerExpired = 0x04000000, |
| |
| /** |
| * Incorrect entropy mode when entropy is ready. |
| */ |
| kDifErrorEntropyModeIncorrect, |
| |
| /** |
| * An error was encountered but the cause is unknown. |
| */ |
| kDifErrorUnknownError, |
| } dif_kmac_error_t; |
| |
| /** |
| * The state of the message FIFO used to buffer absorbed data. |
| * |
| * The hardware defined these status in different bit fields, however they work |
| * better in the same field. i.e the fifo can't be empty and full at the same |
| * time. That said, the values chosen for this enum allow the conversion from |
| * the register bits to this enum without branches. |
| */ |
| typedef enum dif_kmac_fifo_state { |
| /** The message FIFO is not empty or full. */ |
| kDifKmacFifoStatePartial = 0, |
| /** The message FIFO is empty. */ |
| kDifKmacFifoStateEmpty = 1 << 0, |
| /** The message FIFO is full. Further writes will block. */ |
| kDifKmacFifoStateFull = 1 << 1, |
| } dif_kmac_fifo_state_t; |
| |
| typedef enum dif_kmac_sha3_state { |
| /** |
| * SHA3 hashing engine is in idle state. |
| */ |
| kDifKmacSha3StateIdle = 1 << 0, |
| |
| /** |
| * SHA3 is receiving message stream and processing it. |
| */ |
| kDifKmacSha3StateAbsorbing = 1 << 1, |
| |
| /** |
| * SHA3 completes sponge absorbing stage. In this stage, SW can manually run |
| * the hashing engine. |
| */ |
| kDifKmacSha3StateSqueezing = 1 << 2, |
| } dif_kmac_sha3_state_t; |
| |
| /** |
| * The kmac error faults. |
| * |
| * The hardware defined these status in different bit fields, however they work |
| * better in the same field. Then the values chosen for this enum allow the |
| * conversion from the register bits to this enum without branches. |
| */ |
| typedef enum dif_kmac_alert_faults { |
| /** |
| * Neither errors nor fault has occurred. |
| */ |
| kDifKmacAlertNone = 0, |
| /** |
| * A fatal fault has occurred and the KMAC unit needs to be reset (1), |
| * Examples for such faults include i) TL-UL bus integrity fault ii) |
| * storage errors in the shadow registers iii) errors in the message, |
| * round, or key counter iv) any internal FSM entering an invalid state v) |
| * an error in the redundant lfsr. |
| */ |
| kDifKmacAlertFatalFault = 1 << 0, |
| /** |
| * An update error has occurred in the shadowed Control Register. KMAC |
| * operation needs to be restarted by re-writing the Control Register. |
| */ |
| kDifKmacAlertRecovCtrlUpdate = 1 << 1, |
| } dif_kmac_alert_faults_t; |
| |
| typedef struct dif_kmac_status { |
| /** |
| * Sha3 state. |
| */ |
| dif_kmac_sha3_state_t sha3_state; |
| |
| /** |
| * Message FIFO entry count. |
| */ |
| uint32_t fifo_depth; |
| |
| /** |
| * Kmac fifo state. |
| */ |
| dif_kmac_fifo_state_t fifo_state; |
| |
| /** |
| * Kmac faults and errors state. |
| */ |
| dif_kmac_alert_faults_t faults; |
| } dif_kmac_status_t; |
| |
| /** |
| * Configures KMAC with runtime information. |
| * |
| * @param kmac A KMAC handle. |
| * @param config Runtime configuration parameters. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_configure(dif_kmac_t *kmac, dif_kmac_config_t config); |
| |
| /** |
| * Encode a customization string (S). |
| * |
| * The length of the string must not exceed `kDifKmacMaxCustomizationStringLen`. |
| * |
| * Note that this function will encode `len` bytes from `data` regardless of |
| * whether `data` is null-terminated or not. |
| * |
| * See NIST Special Publication 800-185 [2] for more information about the |
| * customization string (S) parameter. |
| * |
| * @param data String to encode. |
| * @param len Length of string to encode. |
| * @param[out] out Encoded customization string. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_customization_string_init( |
| const char *data, size_t len, dif_kmac_customization_string_t *out); |
| |
| /** |
| * Encode a function name (N). |
| * |
| * The length of the string must not exceed `kDifKmacMaxFunctionNameLen`. |
| * |
| * Note that this function will encode `len` bytes from `data` regardless of |
| * whether `data` is null-terminated or not. |
| * |
| * See NIST Special Publication 800-185 [2] for more information about the |
| * function name (N) parameter. |
| * |
| * @param data String to encode. |
| * @param len Length of string to encode. |
| * @param[out] out Encoded function name. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_function_name_init(const char *data, size_t len, |
| dif_kmac_function_name_t *out); |
| |
| /** |
| * Start a SHA-3 operation. |
| * |
| * SHA-3 operations have a fixed output length. |
| * |
| * See NIST FIPS 202 [1] for more information about SHA-3. |
| * |
| * @param kmac A KMAC handle. |
| * @param operation_state A KMAC operation state context. |
| * @param mode The SHA-3 mode of operation. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_mode_sha3_start( |
| const dif_kmac_t *kmac, dif_kmac_operation_state_t *operation_state, |
| dif_kmac_mode_sha3_t mode); |
| |
| /** |
| * Start a SHAKE operation. |
| * |
| * SHAKE operations have a variable (XOF) output length. |
| * |
| * See NIST FIPS 202 [1] for more information about SHAKE. |
| * |
| * @param kmac A KMAC handle. |
| * @param operation_state A KMAC operation state context. |
| * @param mode The mode of operation. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_mode_shake_start( |
| const dif_kmac_t *kmac, dif_kmac_operation_state_t *operation_state, |
| dif_kmac_mode_shake_t mode); |
| |
| /** |
| * Start a cSHAKE operation. |
| * |
| * cSHAKE operations have a variable (XOF) output length. |
| * |
| * See NIST Special Publication 800-185 [2] for more information about cSHAKE. |
| * |
| * @param kmac A KMAC handle. |
| * @param operation_state A KMAC operation state context. |
| * @param mode The mode of operation. |
| * @param n Function name (optional). |
| * @param s Customization string (optional). |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_mode_cshake_start( |
| const dif_kmac_t *kmac, dif_kmac_operation_state_t *operation_state, |
| dif_kmac_mode_cshake_t mode, const dif_kmac_function_name_t *n, |
| const dif_kmac_customization_string_t *s); |
| |
| /** |
| * Start a KMAC operation. |
| * |
| * To use KMAC in eXtendable-Output Function (XOF) mode set the output length |
| * (`l`) to 0. The output length must not be greater than |
| * `kDifKmacMaxOutputLenWords`. |
| * |
| * The key provided must have at least as many bits as the security strength |
| * of the `mode`. |
| * |
| * See NIST Special Publication 800-185 [2] for more information about KMAC. |
| * |
| * @param kmac A KMAC handle. |
| * @param operation_state A KMAC operation state context. |
| * @param mode The mode of operation. |
| * @param l Output length (number of 32-bit words that will be 'squeezed'). |
| * @param k Pointer to secret key. |
| * @param s Customization string (optional). |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_mode_kmac_start( |
| const dif_kmac_t *kmac, dif_kmac_operation_state_t *operation_state, |
| dif_kmac_mode_kmac_t mode, size_t l, const dif_kmac_key_t *k, |
| const dif_kmac_customization_string_t *s); |
| |
| /** |
| * Absorb bytes from the message provided. |
| * |
| * If `processed` is non-NULL, then this function will write the remaining |
| * space in the FIFO and update `processed` with the number of bytes written. |
| * The caller should adjust the `msg` pointer and `len` parameters and call |
| * again as needed until all input has been written. |
| * |
| * If `processed` is NULL, then this function will block until the entire |
| * message has been processed or an error occurs. |
| * |
| * If big-endian mode is enabled for messages (`message_big_endian`) only the |
| * part of the message aligned to 32-bit word boundaries will be byte swapped. |
| * Unaligned leading and trailing bytes will be written into the message as-is. |
| * |
| * @param kmac A KMAC handle. |
| * @param operation_state A KMAC operation state context. |
| * @param msg Pointer to data to absorb. |
| * @param len Number of bytes of data to absorb. |
| * @param[out] processed Number of bytes processed (optional). |
| * @preturn The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_absorb(const dif_kmac_t *kmac, |
| dif_kmac_operation_state_t *operation_state, |
| const void *msg, size_t len, size_t *processed); |
| |
| /** |
| * Squeeze bytes into the output buffer provided. |
| * |
| * Requesting a squeeze operation will prevent any further absorption operations |
| * from taking place. |
| * |
| * If `kDifKmacIncomplete` is returned then the hardware is currently |
| * recomputing the state and the output was only partially written. The output |
| * pointer and length should be updated according to the number of bytes |
| * processed and the squeeze operation continued at a later time. |
| * |
| * If `processed` is not provided then this function will block until `len` |
| * bytes have been written to `out` or an error occurs. |
| * |
| * @param kmac A KMAC handle. |
| * @param operation_state A KMAC operation state context. |
| * @param[out] out Pointer to output buffer. |
| * @param[out] len Number of 32-bit words to write to output buffer. |
| * @param[out] processed Number of 32-bit words written to output buffer |
| * (optional). |
| * @preturn The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_squeeze(const dif_kmac_t *kmac, |
| dif_kmac_operation_state_t *operation_state, |
| uint32_t *out, size_t len, size_t *processed); |
| |
| /** |
| * Ends a squeeze operation and resets the hardware so it is ready for a new |
| * operation. |
| * |
| * @param kmac A KMAC handle. |
| * @param operation_state A KMAC operation state context. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_end(const dif_kmac_t *kmac, |
| dif_kmac_operation_state_t *operation_state); |
| |
| /** |
| * Read the kmac error register to get the error code indicated the interrupt |
| * state. |
| * |
| * This function should be called in case of any of the `start` functions |
| * returns `kDifError`. |
| * |
| * @param kmac A KMAC handle. |
| * @param[out] error The current error code. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_get_error(const dif_kmac_t *kmac, |
| dif_kmac_error_t *error); |
| |
| /** |
| * Clear the current error code and reset the state machine to the idle state |
| * ready to accept new operations. |
| * |
| * The state of any in-progress operation will be lost and the operation will |
| * need to be restarted. |
| * |
| * @param kmac A KMAC handle. |
| * @param operation_state A KMAC operation state context. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_reset(const dif_kmac_t *kmac, |
| dif_kmac_operation_state_t *operation_state); |
| |
| /** |
| * Fetch the current status of the message FIFO used to buffer absorbed data. |
| * |
| * @param kmac A KMAC handle. |
| * @param[out] kmac_status The kmac status struct. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_get_status(const dif_kmac_t *kmac, |
| dif_kmac_status_t *kmac_status); |
| |
| /** |
| * Returns the current value of the refresh hash counter. |
| * |
| * @param kmac A KMAC handle. |
| * @param hash_ctr The hash counter value that is returned. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_get_hash_counter(const dif_kmac_t *kmac, |
| uint32_t *hash_ctr); |
| |
| /** |
| * Reports whether or not the KMAC configuration register is locked. |
| * |
| * If writes to the KMAC configuration register are disabled (locked) then it is |
| * not possible to change any configuration parameters or start a new operation. |
| * The configuration register is locked when an operation has been started and |
| * is unlocked again when it completes. |
| * |
| * @param kmac A KMAC handle. |
| * @param[out] is_locked Out-param reporting the lock state. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_config_is_locked(const dif_kmac_t *kmac, bool *is_locked); |
| |
| /** |
| * Poll until a given flag in the status register is set. |
| * |
| * @param kmac A KMAC handle. |
| * @param flag the |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_kmac_poll_status(const dif_kmac_t *kmac, uint32_t flag); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif // __cplusplus |
| |
| #endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_KMAC_H_ |