blob: 74704b1a9260e6dbeb0e3a0e1ddffd1717d1cf67 [file] [log] [blame]
// 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);
}