| // 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_CRYPTO_INCLUDE_HASH_H_ | |
| #define OPENTITAN_SW_DEVICE_LIB_CRYPTO_INCLUDE_HASH_H_ | |
| #include "sw/device/lib/crypto/include/datatypes.h" | |
| /** | |
| * @file | |
| * @brief Hash functions for the OpenTitan cryptography library. | |
| * | |
| * Supports both SHA2 and SHA3 hash functions, plus the additional Keccak-based | |
| * hash functions SHAKE and cSHAKE. | |
| */ | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif // __cplusplus | |
| /** | |
| * Enum to define supported hashing modes. | |
| * | |
| * Values are hardened. | |
| */ | |
| typedef enum hash_mode { | |
| // SHA2-256 mode. | |
| kHashModeSha256 = 0x6dc2, | |
| // SHA2-384 mode. | |
| kHashModeSha384 = 0xdafb, | |
| // SHA2-512 mode. | |
| kHashModeSha512 = 0xb626, | |
| // SHA3-224 mode. | |
| kHashModeSha3_224 = 0xf51d, | |
| // SHA3-256 mode. | |
| kHashModeSha3_256 = 0x196e, | |
| // SHA3-384 mode. | |
| kHashModeSha3_384 = 0x14f5, | |
| // SHA3-512 mode. | |
| kHashModeSha3_512 = 0x62cd, | |
| } hash_mode_t; | |
| /** | |
| * Enum to define the supported extendable-output functions. | |
| * | |
| * Values are hardened. | |
| */ | |
| typedef enum xof_mode { | |
| // Shake128 mode. | |
| kXofModeSha3Shake128 = 0x2bb4, | |
| // Shake256 mode. | |
| kXofModeSha3Shake256 = 0x4778, | |
| // cShake128 mode. | |
| kXofModeSha3Cshake128 = 0x8f45, | |
| // cShake256 mode. | |
| kXofModeSha3Cshake256 = 0x8c9e, | |
| } xof_mode_t; | |
| /** | |
| * Generic hash context. | |
| * | |
| * Representation is internal to the hash implementation; initialize | |
| * with #otcrypto_hash_init. | |
| */ | |
| typedef struct hash_context hash_context_t; | |
| /** | |
| * Performs the required hash function on the input data. | |
| * | |
| * The caller should allocate space for the `digest` buffer, (expected | |
| * length depends on `hash_mode`, refer table-1), and set the length | |
| * of expected output in the `len` field of `digest`. If the user-set | |
| * length and the output length does not match, an error message will | |
| * be returned. | |
| * | |
| * This function hashes the `input_message` using the `hash_mode_t` | |
| * hash function and returns a `digest`. | |
| * | |
| * @param input_message Input message to be hashed. | |
| * @param hash_mode Required hash mode for the digest. | |
| * @param[out] digest Output digest after hashing the input message. | |
| * @return Result of the hash operation. | |
| */ | |
| crypto_status_t otcrypto_hash(crypto_const_uint8_buf_t input_message, | |
| hash_mode_t hash_mode, | |
| crypto_uint8_buf_t *digest); | |
| /** | |
| * Performs the required extendable output function on the input data. | |
| * | |
| * The `function_name_string` is used by NIST to define functions | |
| * based on cSHAKE. When no function other than cSHAKE is desired; it | |
| * can be empty. The `customization_string` is used to define a | |
| * variant of the cSHAKE function. If no customization is desired it | |
| * can be empty. The `function_name_string` and `customization_string` | |
| * are ignored when the `xof_mode` is set to kHashModeSha3Shake128 or | |
| * kHashModeSha3Shake256. | |
| * | |
| * The caller should allocate space for the `digest` buffer, | |
| * (expected length same as `required_output_len`), and set the length | |
| * of expected output in the `len` field of `digest`. If the user-set | |
| * length and the output length does not match, an error message will | |
| * be returned. | |
| * | |
| * @param input_message Input message for extendable output function. | |
| * @param hash_mode Required extendable output function. | |
| * @param function_name_string NIST Function name string. | |
| * @param customization_string Customization string for cSHAKE. | |
| * @param required_output_len Required output length, in bytes. | |
| * @param[out] digest Output from the extendable output function. | |
| * @return Result of the xof operation. | |
| */ | |
| crypto_status_t otcrypto_xof(crypto_const_uint8_buf_t input_message, | |
| xof_mode_t xof_mode, | |
| crypto_const_uint8_buf_t function_name_string, | |
| crypto_const_uint8_buf_t customization_string, | |
| size_t required_output_len, | |
| crypto_uint8_buf_t *digest); | |
| /** | |
| * Performs the INIT operation for a cryptographic hash function. | |
| * | |
| * Initializes the generic hash context. The required hash mode is | |
| * selected through the `hash_mode` parameter. Only `kHashModeSha256`, | |
| * `kHashModeSha384` and `kHashModeSha512` are supported. Other modes | |
| * are not supported and an error would be returned. | |
| * | |
| * Populates the hash context with the selected hash mode and its | |
| * digest and block sizes. The structure of hash context and how it | |
| * populates the required fields are internal to the specific hash | |
| * implementation. | |
| * | |
| * @param ctx Pointer to the generic hash context struct. | |
| * @param hash_mode Required hash mode. | |
| * @return Result of the hash init operation. | |
| */ | |
| crypto_status_t otcrypto_hash_init(hash_context_t *const ctx, | |
| hash_mode_t hash_mode); | |
| /** | |
| * Performs the UPDATE operation for a cryptographic hash function. | |
| * | |
| * The update operation processes the `input_message` using the selected | |
| * hash compression function. The intermediate digest is stored in the | |
| * context `ctx`. Any partial data is stored back in the context and | |
| * combined with the subsequent bytes. | |
| * | |
| * #otcrypto_hash_init should be called before this function. | |
| * | |
| * @param ctx Pointer to the generic hash context struct. | |
| * @param input_message Input message to be hashed. | |
| * @return Result of the hash update operation. | |
| */ | |
| crypto_status_t otcrypto_hash_update(hash_context_t *const ctx, | |
| crypto_const_uint8_buf_t input_message); | |
| /** | |
| * Performs the FINAL operation for a cryptographic hash function. | |
| * | |
| * The final operation processes the remaining partial blocks, | |
| * computes the final hash and copies it to the `digest` parameter. | |
| * | |
| * #otcrypto_hash_update should be called before this function. | |
| * | |
| * The caller should allocate space for the `digest` buffer, (expected | |
| * length depends on `hash_mode`, refer table-1), and set the length | |
| * of expected output in the `len` field of `digest`. If the user-set | |
| * length and the output length does not match, an error message will | |
| * be returned. | |
| * | |
| * @param ctx Pointer to the generic hash context struct. | |
| * @param[out] digest Output digest after hashing the input blocks. | |
| * @return Result of the hash final operation. | |
| */ | |
| crypto_status_t otcrypto_hash_final(hash_context_t *const ctx, | |
| crypto_uint8_buf_t *digest); | |
| #ifdef __cplusplus | |
| } // extern "C" | |
| #endif // __cplusplus | |
| #endif // OPENTITAN_SW_DEVICE_LIB_CRYPTO_INCLUDE_HASH_H_ |