blob: e2ad5f0837a6fdabd42d4a995e79447e4f02b56a [file] [log] [blame]
// 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_