[kmac/dv] update kmac DPI package This commit updates the KMAC DPI package to add function name and customization string inputs to the CSHAKE and KMAC functions. Signed-off-by: Udi Jonnalagadda <udij@google.com>
diff --git a/hw/ip/kmac/dv/dpi/digestpp_dpi.cc b/hw/ip/kmac/dv/dpi/digestpp_dpi.cc index 4379793..c4fc2e6 100644 --- a/hw/ip/kmac/dv/dpi/digestpp_dpi.cc +++ b/hw/ip/kmac/dv/dpi/digestpp_dpi.cc
@@ -5,6 +5,8 @@ #include <cstdint> #include <cstdio> #include <cstdlib> +#include <cstring> +#include <list> #include "svdpi.h" #include "vendor/kerukuro_digestpp/algorithm/kmac.hpp" @@ -24,12 +26,17 @@ */ static void load_arr_from_simulator(const svOpenArrayHandle arr, uint8_t *array_out, uint64_t array_len) { + svBitVecVal val; + if (array_len == 0) { return; } uint8_t *arr_ptr = (uint8_t *)svGetArrayPtr(arr); - memcpy(array_out, arr_ptr, array_len); + for (int i = 0; i < array_len; i++) { + svGetBitArrElem1VecVal(&val, arr, i); + array_out[i] = (uint8_t)val; + } } /** @@ -160,6 +167,7 @@ // CSHAKE128 // /////////////// extern void c_dpi_cshake128(const svOpenArrayHandle msg, + const char *function_name, const char *customization_str, uint64_t msg_len, uint64_t output_len, svOpenArrayHandle digest) { // Load message from SV memory @@ -170,7 +178,8 @@ // Compute the digest digestpp::cshake128 shake; - shake.set_customization(customization_str); + shake.set_function_name(function_name, strlen(function_name)); + shake.set_customization(customization_str, strlen(customization_str)); shake.absorb(msg_arr, msg_len); shake.squeeze(digest_arr, output_len); @@ -186,6 +195,7 @@ // CSHAKE256 // /////////////// extern void c_dpi_cshake256(const svOpenArrayHandle msg, + const char *function_name, const char *customization_str, uint64_t msg_len, uint64_t output_len, svOpenArrayHandle digest) { // Load message from SV memory @@ -196,7 +206,8 @@ // Compute the digest digestpp::cshake256 shake; - shake.set_customization(customization_str); + shake.set_function_name(function_name, strlen(function_name)); + shake.set_customization(customization_str, strlen(customization_str)); shake.absorb(msg_arr, msg_len); shake.squeeze(digest_arr, output_len); @@ -213,7 +224,8 @@ ///////////// extern void c_dpi_kmac128(const svOpenArrayHandle msg, uint64_t msg_len, const svOpenArrayHandle key, uint64_t key_len, - uint64_t output_len, svBitVecVal *digest) { + const char *customization_str, uint64_t output_len, + svBitVecVal *digest) { uint64_t output_len_bits = output_len * 8; // Load message from SV memory @@ -228,9 +240,10 @@ // Compute the digest digestpp::kmac128 kmac(output_len_bits); + kmac.set_customization(customization_str, strlen(customization_str)); kmac.set_key(key_arr, key_len); kmac.absorb(msg_arr, msg_len); - kmac.digest(digest_arr, output_len); + kmac.digest(digest_arr, sizeof(digest_arr)); if (msg_arr != nullptr) { free(msg_arr); @@ -249,6 +262,7 @@ ///////////////// extern void c_dpi_kmac128_xof(const svOpenArrayHandle msg, uint64_t msg_len, const svOpenArrayHandle key, uint64_t key_len, + const char *customization_str, uint64_t output_len, svBitVecVal *digest) { // Load message from SV memory uint8_t *msg_arr = (uint8_t *)malloc(msg_len * sizeof(uint8_t)); @@ -262,9 +276,10 @@ // Compute the digest digestpp::kmac128_xof kmac; + kmac.set_customization(customization_str, strlen(customization_str)); kmac.set_key(key_arr, key_len); kmac.absorb(msg_arr, msg_len); - kmac.squeeze(digest_arr, output_len); + kmac.squeeze(digest_arr, sizeof(digest_arr)); if (msg_arr != nullptr) { free(msg_arr); @@ -283,7 +298,8 @@ ///////////// extern void c_dpi_kmac256(const svOpenArrayHandle msg, uint64_t msg_len, const svOpenArrayHandle key, uint64_t key_len, - uint64_t output_len, svBitVecVal *digest) { + const char *customization_str, uint64_t output_len, + svBitVecVal *digest) { uint64_t output_len_bits = output_len * 8; // Load message from SV memory @@ -298,9 +314,10 @@ // Compute the digest digestpp::kmac256 kmac(output_len_bits); + kmac.set_customization(customization_str, strlen(customization_str)); kmac.set_key(key_arr, key_len); kmac.absorb(msg_arr, msg_len); - kmac.digest(digest_arr, output_len); + kmac.digest(digest_arr, sizeof(digest_arr)); if (msg_arr != nullptr) { free(msg_arr); @@ -319,6 +336,7 @@ ///////////////// extern void c_dpi_kmac256_xof(const svOpenArrayHandle msg, uint64_t msg_len, const svOpenArrayHandle key, uint64_t key_len, + const char *customization_str, uint64_t output_len, svBitVecVal *digest) { // Load message from SV memory uint8_t *msg_arr = (uint8_t *)malloc(msg_len * sizeof(uint8_t)); @@ -332,9 +350,10 @@ // Compute the digest digestpp::kmac256_xof kmac; + kmac.set_customization(customization_str, strlen(customization_str)); kmac.set_key(key_arr, key_len); kmac.absorb(msg_arr, msg_len); - kmac.squeeze(digest_arr, output_len); + kmac.squeeze(digest_arr, sizeof(digest_arr)); if (msg_arr != nullptr) { free(msg_arr);
diff --git a/hw/ip/kmac/dv/dpi/digestpp_dpi_pkg.sv b/hw/ip/kmac/dv/dpi/digestpp_dpi_pkg.sv index 8260998..92bda88 100644 --- a/hw/ip/kmac/dv/dpi/digestpp_dpi_pkg.sv +++ b/hw/ip/kmac/dv/dpi/digestpp_dpi_pkg.sv
@@ -51,6 +51,7 @@ import "DPI-C" context function void c_dpi_cshake128( input bit[7:0] msg[], + input string function_name, input string customization_str, input longint unsigned msg_len, input longint unsigned output_len, @@ -59,6 +60,7 @@ import "DPI-C" context function void c_dpi_cshake256( input bit[7:0] msg[], + input string function_name, input string customization_str, input longint unsigned msg_len, input longint unsigned output_len, @@ -70,6 +72,7 @@ input longint unsigned msg_len, input bit[7:0] key[], input longint unsigned key_len, + input string customization_str, input longint unsigned output_len, output bit[7:0] digest[] ); @@ -79,6 +82,7 @@ input longint unsigned msg_len, input bit[7:0] key[], input longint unsigned key_len, + input string customization_str, input longint unsigned output_len, output bit[7:0] digest[] ); @@ -88,6 +92,7 @@ input longint unsigned msg_len, input bit[7:0] key[], input longint unsigned key_len, + input string customization_str, input longint unsigned output_len, output bit[7:0] digest[] ); @@ -97,6 +102,7 @@ input longint unsigned msg_len, input bit[7:0] key[], input longint unsigned key_len, + input string customization_str, input longint unsigned output_len, output bit[7:0] digest[] );