| // Copyright lowRISC contributors. | 
 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 |  | 
 | #include "hmac.h" | 
 | #include "hmac_wrap.h" | 
 | #include "sha.h" | 
 | #include "sha256.h" | 
 | #include "svdpi.h" | 
 |  | 
 | typedef unsigned long long ull_t; | 
 |  | 
 | extern void c_dpi_SHA_hash(const svOpenArrayHandle msg, ull_t len, | 
 |                            uint8_t hash[8]) { | 
 |   unsigned char *arr; | 
 |   unsigned int *arr_ptr; | 
 |   ull_t i; | 
 |  | 
 |   arr = (unsigned char *)malloc(len * sizeof(unsigned char)); | 
 |   arr_ptr = (unsigned int *)svGetArrayPtr(msg); | 
 |  | 
 |   for (i = 0; i < len; i++) { | 
 |     arr[i] = arr_ptr[i]; | 
 |   } | 
 |  | 
 |   // compute SHA hash | 
 |   SHA_hash(arr, len, hash); | 
 |  | 
 |   free(arr); | 
 | } | 
 |  | 
 | extern void c_dpi_SHA256_hash(const svOpenArrayHandle msg, ull_t len, | 
 |                               uint8_t hash[8]) { | 
 |   unsigned char *arr; | 
 |   unsigned int *arr_ptr; | 
 |   ull_t i; | 
 |  | 
 |   if (len > 0) { | 
 |     arr = (unsigned char *)malloc(len * sizeof(unsigned char)); | 
 |     arr_ptr = (unsigned int *)svGetArrayPtr(msg); | 
 |  | 
 |     for (i = 0; i < len; i++) { | 
 |       arr[i] = arr_ptr[i]; | 
 |     } | 
 |  | 
 |     // compute SHA256 hash | 
 |     SHA256_hash(arr, len, hash); | 
 |  | 
 |     free(arr); | 
 |   } else { | 
 |     // compute SHA256 hash when msg is empty | 
 |     SHA256_hash(NULL, len, hash); | 
 |   } | 
 | } | 
 |  | 
 | extern void c_dpi_HMAC_SHA(const svOpenArrayHandle key, ull_t key_len, | 
 |                            const svOpenArrayHandle msg, ull_t msg_len, | 
 |                            uint8_t hmac[8]) { | 
 |   unsigned char *msg_arr; | 
 |   unsigned int *msg_arr_ptr; | 
 |   unsigned char *key_arr; | 
 |   unsigned int *key_arr_ptr; | 
 |   ull_t i; | 
 |  | 
 |   msg_arr = (unsigned char *)malloc(msg_len * sizeof(unsigned char)); | 
 |   msg_arr_ptr = (unsigned int *)svGetArrayPtr(msg); | 
 |  | 
 |   key_arr = (unsigned char *)malloc(key_len * sizeof(unsigned char)); | 
 |   key_arr_ptr = (unsigned int *)svGetArrayPtr(key); | 
 |  | 
 |   for (i = 0; i < msg_len; i++) { | 
 |     msg_arr[i] = msg_arr_ptr[i]; | 
 |   } | 
 |  | 
 |   for (i = 0; i < key_len; i++) { | 
 |     key_arr[i] = key_arr_ptr[i]; | 
 |   } | 
 |  | 
 |   // compute SHA hash | 
 |   HMAC_SHA(key_arr, key_len, msg_arr, msg_len, hmac); | 
 |  | 
 |   free(msg_arr); | 
 |   free(key_arr); | 
 | } | 
 |  | 
 | extern void c_dpi_HMAC_SHA256(const svOpenArrayHandle key, ull_t key_len, | 
 |                               const svOpenArrayHandle msg, ull_t msg_len, | 
 |                               uint8_t hmac[8]) { | 
 |   unsigned char *msg_arr; | 
 |   unsigned int *msg_arr_ptr; | 
 |   unsigned char *key_arr; | 
 |   unsigned int *key_arr_ptr; | 
 |   ull_t i; | 
 |  | 
 |   if (msg_len > 0) { | 
 |     msg_arr = (unsigned char *)malloc(msg_len * sizeof(unsigned char)); | 
 |     msg_arr_ptr = (unsigned int *)svGetArrayPtr(msg); | 
 |  | 
 |     for (i = 0; i < msg_len; i++) { | 
 |       msg_arr[i] = msg_arr_ptr[i]; | 
 |     } | 
 |   } | 
 |  | 
 |   key_arr = (unsigned char *)malloc(key_len * sizeof(unsigned char)); | 
 |   key_arr_ptr = (unsigned int *)svGetArrayPtr(key); | 
 |  | 
 |   for (i = 0; i < key_len; i++) { | 
 |     key_arr[i] = key_arr_ptr[i]; | 
 |   } | 
 |  | 
 |   if (msg_len > 0) { | 
 |     // compute SHA256 hash | 
 |     HMAC_SHA256(key_arr, key_len, msg_arr, msg_len, hmac); | 
 |  | 
 |     free(msg_arr); | 
 |   } else { | 
 |     // compute SHA256 hash when msg is empty | 
 |     HMAC_SHA256(key_arr, key_len, NULL, msg_len, hmac); | 
 |   } | 
 |  | 
 |   free(key_arr); | 
 | } |