[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[]
   );