// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "sw/device/lib/testing/kmac_testutils.h"

#include "sw/device/lib/dif/dif_kmac.h"
#include "sw/device/lib/testing/test_framework/check.h"

void kmac_testutils_config(dif_kmac_t *kmac, bool sideload) {
  dif_kmac_config_t config = {
      // Use software-provided "entropy" to avoid waiting for EDN.
      .entropy_mode = kDifKmacEntropyModeSoftware,
      // This option minimizes masking to improve speed.
      .entropy_fast_process = true,
      // No need to have real entropy for tests.
      .entropy_seed = {0},
      .entropy_hash_threshold = 0,
      // Ignored because the entropy source is software.
      .entropy_wait_timer = 0,
      // Leave message as the little-endian default.
      .entropy_prescaler = 0,
      .message_big_endian = false,
      // Leave output as the little-endian default.
      .output_big_endian = false,
      // Use a sideloaded key if the caller requested to.
      .sideload = sideload,
      // Avoid masking the message to improve speed.
      .msg_mask = false,
  };

  CHECK_DIF_OK(dif_kmac_configure(kmac, config));
}

void kmac_testutils_kmac(const dif_kmac_t *kmac,
                         const dif_kmac_mode_kmac_t mode,
                         const dif_kmac_key_t *key, const char *custom_string,
                         const size_t custom_string_len, const char *message,
                         const size_t message_len, const size_t output_len,
                         uint32_t *output) {
  // Initialize customization string.
  dif_kmac_customization_string_t kmac_custom_string;
  CHECK_DIF_OK(dif_kmac_customization_string_init(
      custom_string, custom_string_len, &kmac_custom_string));

  // Start the KMAC operation.
  dif_kmac_operation_state_t operation_state;
  CHECK_DIF_OK(dif_kmac_mode_kmac_start(kmac, &operation_state, mode,
                                        output_len, key, &kmac_custom_string));

  // Pass the entire message to KMAC ("absorb" stage).
  CHECK_DIF_OK(
      dif_kmac_absorb(kmac, &operation_state, message, message_len, NULL));

  // Get the output ("squeeze" stage).
  CHECK_DIF_OK(
      dif_kmac_squeeze(kmac, &operation_state, output, output_len, NULL));

  // End the operation.
  CHECK_DIF_OK(dif_kmac_end(kmac, &operation_state));

  // Double-check that there were no errors.
  dif_kmac_error_t err;
  CHECK_DIF_OK(dif_kmac_get_error(kmac, &err));
  CHECK(err == kDifErrorNone);
}
