// 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_DRIVERS_KMAC_H_
#define OPENTITAN_SW_DEVICE_LIB_CRYPTO_DRIVERS_KMAC_H_

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#include "sw/device/lib/base/macros.h"
#include "sw/device/lib/crypto/include/datatypes.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * The exposed costants to caller functions.
 */
enum {
  // The total size of prefix registers (in bytes), after removing len encodings
  kKmacPrefixMaxSize = 40,
};

/**
 * Error return types for KMAC.
 *
 * This is not the exhaustive list, so the fields of this enum are likely to be
 * revised later.
 */
typedef enum kmac_error {
  kKmacOk = 0,
  kKmacInternalError,
  kKmacNotIdle,
  kKmacCfgWriteDisabled,
  kKmacIntrErrPending,
  kKmacCfgDisabledError,
  kKmacFatalFaultError,
  kKmacRecovFaultError,
  kKmacArgsError,
  kKmacDigestLenTooLongError,
  kKmacUnsupportedKeySizeError,
  kKmacNotImplemented,
  kKmacCustomPaddingError,
  kKmacUnsupportedPaddingLength,
} kmac_error_t;

/**
 * Simplified key struct to pass blinded key internally.
 */
typedef struct kmac_blinded_key {
  const uint32_t *share0;
  const uint32_t *share1;
  // The length of single share (in bytes)
  size_t len;
} kmac_blinded_key_t;

/**
 * Check whether given key length is valid for KMAC.

 * @param key_len Key length as input.
 * @return Return true if given key length is valid.
 */
OT_WARN_UNUSED_RESULT
bool kmac_is_valid_key_len(size_t key_len);

/**
 * Set the "global" config of HWIP
 *
 * For the moment, we have a number of configuation options needs to be
 * configured at session level. This functions serves as a temporary
 * solution by setting default values to this configuration.
 * TODO: Define config struct and pass it as argument.
 * TODO: see #14832
 *
 * Warning: This function sets `entropy_ready`, which triggers kmac_entropy's
 * FSM to jump to next step. Therefore, the caller of this function should make
 * sure that entropy is configured properly beforehand.
 *
 * It enforces the following as the default configuration:
 * It touches the following fields of CSRs:
 *   CFG register:
 *     endianness, entropy_mode, fast_process, msg_mask, ent_ready,
 * err_processed, en_unsup_mode EDN refresh settings: hash threshold refresh
 * counter entropy seed -> ignore? INTR_ENABLE: all disabled
 *
 * @return Error code.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_hwip_default_configure(void);

/**
 * Compute SHA-3-224 in one-shot.
 *
 * Warning: The caller must ensure that `digest` buffer is large
 * enough to store the resulting digest (at least 224 / 8 = 28 bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param message The input message.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_sha3_224(crypto_const_uint8_buf_t message,
                           crypto_uint8_buf_t *digest);

/**
 * Compute SHA-3-256 in one-shot.
 *
 * Warning: The caller must ensure that `digest` buffer is large
 * enough to store the resulting digest (at least 256 / 8 = 32 bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param message The input message.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_sha3_256(crypto_const_uint8_buf_t message,
                           crypto_uint8_buf_t *digest);
/**
 * Compute SHA-3-384 in one-shot.
 *
 * Warning: The caller must ensure that `digest` buffer is large
 * enough to store the resulting digest (at least 384 / 8 = 48 bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param message The input message.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_sha3_384(crypto_const_uint8_buf_t message,
                           crypto_uint8_buf_t *digest);

/**
 * Compute SHA-3-512 in one-shot.
 *
 * Warning: The caller must ensure that `digest` buffer is large
 * enough to store the resulting digest (at least 512 / 8 = 64 bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param message The input message.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_sha3_512(crypto_const_uint8_buf_t message,
                           crypto_uint8_buf_t *digest);

/**
 * Compute SHAKE-128 in one-shot.
 *
 * Warning: The caller must ensure that `digest->len` contains the
 * requested digest length (in bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param message The input message.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_shake_128(crypto_const_uint8_buf_t message,
                            crypto_uint8_buf_t *digest);

/**
 * Compute SHAKE-256 in one-shot.
 *
 * Warning: The caller must ensure that `digest->len` contains the
 * requested digest length (in bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param message The input message.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_shake_256(crypto_const_uint8_buf_t message,
                            crypto_uint8_buf_t *digest);

/**
 * Compute CSHAKE-128 in one-shot.
 *
 * Warning: The caller must ensure that `digest->len` contains the
 * requested digest length (in bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param message The input message.
 * @param func_name The function name.
 * @param cust_str The customization string.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_cshake_128(crypto_const_uint8_buf_t message,
                             crypto_const_uint8_buf_t func_name,
                             crypto_const_uint8_buf_t cust_str,
                             crypto_uint8_buf_t *digest);

/**
 * Compute CSHAKE-256 in one-shot.
 *
 * Warning: The caller must ensure that `digest->len` contains the
 * requested digest length (in bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param message The input message.
 * @param func_name The function name.
 * @param cust_str The customization string.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_cshake_256(crypto_const_uint8_buf_t message,
                             crypto_const_uint8_buf_t func_name,
                             crypto_const_uint8_buf_t cust_str,
                             crypto_uint8_buf_t *digest);

/**
 * Compute KMAC-128 in one-shot.
 *
 * Warning: The caller must ensure that `digest->len` contains the
 * requested digest length (in bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param key The input key as a struct.
 * @param message The input message.
 * @param func_name The function name.
 * @param cust_str The customization string.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_kmac_128(kmac_blinded_key_t *key,
                           crypto_const_uint8_buf_t message,
                           crypto_const_uint8_buf_t cust_str,
                           crypto_uint8_buf_t *digest);

/**
 * Compute KMAC-256 in one-shot.
 *
 * Warning: The caller must ensure that `digest->len` contains the
 * requested digest length (in bytes).
 *
 * The caller must ensure that `message` and `digest` have properly
 * allocated `data` fields whose length matches their `len` fields.
 *
 * @param key The input key as a struct.
 * @param message The input message.
 * @param func_name The function name.
 * @param cust_str The customization string.
 * @param digest The digest buffer to return the result.
 * @return Error status.
 */
OT_WARN_UNUSED_RESULT
kmac_error_t kmac_kmac_256(kmac_blinded_key_t *key,
                           crypto_const_uint8_buf_t message,
                           crypto_const_uint8_buf_t cust_str,
                           crypto_uint8_buf_t *digest);

#ifdef __cplusplus
}
#endif

#endif  // OPENTITAN_SW_DEVICE_LIB_CRYPTO_DRIVERS_KMAC_H_
