// 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_TESTING_CSRNG_TESTUTILS_H_
#define OPENTITAN_SW_DEVICE_LIB_TESTING_CSRNG_TESTUTILS_H_

#include "sw/device/lib/dif/dif_csrng.h"

/**
 * Wait for the `csrng` instance command interface to be ready to accept
 * commands. Aborts test execution if an error is found.
 */
void csrng_testutils_cmd_ready_wait(const dif_csrng_t *csrng);

/**
 * Runs CSRNG generate command.
 *
 * @param csrng A CSRNG handle.
 * @param output Output buffer.
 * @param output_len Number of words of entropy to write to output buffer.
 */
void csrng_testutils_cmd_generate_run(const dif_csrng_t *csrng,
                                      uint32_t *output, size_t output_len);

/**
 * Checks the CSRNG internal state against `expected` values.
 *
 * @param csrng A CSRNG handle.
 * @param expected Expected CSRNG internal state.
 */
void csrng_testutils_check_internal_state(
    const dif_csrng_t *csrng, const dif_csrng_internal_state_t *expected);

/**
 * CTR_DRBG Known-Answer-Test (KAT) for INSTANTIATE command.
 *
 * @param csrng A CSRNG handle.
 * @param fail_expected Expected fail.
 * @param seed_material Seed material to use for the command.
 * @param expected_state Expected CSRNG internal state after the command.
 */
void csrng_testutils_kat_instantiate(
    const dif_csrng_t *csrng, bool fail_expected,
    const dif_csrng_seed_material_t *seed_material,
    const dif_csrng_internal_state_t *expected_state);

/**
 * CTR_DRBG Known-Answer-Test (KAT) for GENERATE command.
 *
 * @param csrng A CSRNG handle.
 * @param num_generates Number of GENERATE commands to run.
 * @param output_len Number of output words to read from CSRNG after the last
 * command.
 * @param expected_output Expected CSRNG output after the last command.
 * @param expected_state Expected CSRNG internal state after the last command.
 */
void csrng_testutils_kat_generate(
    const dif_csrng_t *csrng, uint32_t num_generates, uint32_t output_len,
    const uint32_t *expected_output,
    const dif_csrng_internal_state_t *expected_state);

/**
 * CTR_DRBG Known-Answer-Test (KAT) for RESEED command.
 *
 * @param csrng A CSRNG handle.
 * @param seed_material Seed material to use for the command.
 * @param expected_state Expected CSRNG internal state after the command.
 */
void csrng_testutils_kat_reseed(
    const dif_csrng_t *csrng, const dif_csrng_seed_material_t *seed_material,
    const dif_csrng_internal_state_t *expected_state);

/**
 * CTR DRBG Known-Answer-Test (KAT) for INSTANTIATE command.
 *
 * @param csrng Handle.
 * @param fail_expected Expected fail.
 */
void csrng_testutils_fips_instantiate_kat(const dif_csrng_t *csrng,
                                          bool fail_expected);

/**
 * CTR DRBG Known-Answer-Test (KAT) for GENERATE command.
 *
 * @param csrng Handle.
 */
void csrng_testutils_fips_generate_kat(const dif_csrng_t *csrng);

/**
 * Checks CSRNG command status.
 *
 * Asserts error if the command or internal FIFO status contains any errors.
 *
 * @param csrng Handle.
 */
void csrng_testutils_cmd_status_check(const dif_csrng_t *csrng);

/**
 * Checks CSRNG recoverable alerts.
 *
 * Asserts error if there are any CSRNG recoverable alerts set.
 *
 * @param csrng Handle.
 */
void csrng_testutils_recoverable_alerts_check(const dif_csrng_t *csrng);

#endif  // OPENTITAN_SW_DEVICE_LIB_TESTING_CSRNG_TESTUTILS_H_
