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