| // 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); |
| } |