#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <wolfssl/wolfcrypt/settings.h>
#if defined(WOLFSSL_SHA3) && defined(WOLFSSL_XILINX_CRYPT)
#include <wolfssl/wolfcrypt/sha3.h>
#include <wolfssl/wolfcrypt/error-crypt.h>
#include <wolfssl/wolfcrypt/logging.h>
#if defined(WOLFSSL_XILINX_CRYPT_VERSAL)
#include <xsecure_shaclient.h>
int wc_InitSha3_384(wc_Sha3* sha, void* heap, int devId)
{
(void) heap;
(void) devId;
if (sha == NULL) {
return BAD_FUNC_ARG;
}
if (wc_InitXsecure(&(sha->xSec))) {
WOLFSSL_MSG("Can't initialize Xsecure");
return BAD_STATE_E;
}
XSecure_Sha3Initialize();
return 0;
}
int wc_Sha3_384_Update(wc_Sha3* sha, const byte* data, word32 len)
{
if (sha == NULL || (data == NULL && len > 0)) {
return BAD_FUNC_ARG;
}
WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)data, len);
XSecure_Sha3Update(&(sha->xSec.cinst), XIL_CAST_U64(data), len);
return 0;
}
int wc_Sha3_384_Final(wc_Sha3* sha, byte* out)
{
if (sha == NULL || out == NULL) {
return BAD_FUNC_ARG;
}
WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)out, WC_SHA3_384_DIGEST_SIZE);
XSecure_Sha3Finish(&(sha->xSec.cinst), XIL_CAST_U64(out));
return wc_InitSha3_384(sha, NULL, INVALID_DEVID);
}
void wc_Sha3_384_Free(wc_Sha3* sha)
{
(void)sha;
}
#else
#if !defined(WOLFSSL_NOSHA3_224) || !defined(WOLFSSL_NOSHA3_256) \
|| !defined(WOLFSSL_NOSHA3_512)
#error sizes of SHA3 other than 384 are not supported
#endif
int wc_InitSha3_384(wc_Sha3* sha, void* heap, int devId)
{
XCsuDma_Config* con;
(void)heap;
(void)devId;
if (sha == NULL) {
return BAD_FUNC_ARG;
}
if ((con = XCsuDma_LookupConfig(0)) == NULL) {
WOLFSSL_MSG("Unable to look up configure for SHA3");
return BAD_STATE_E;
}
if (XCsuDma_CfgInitialize(&(sha->dma), con, con->BaseAddress) !=
XST_SUCCESS) {
WOLFSSL_MSG("Unable to initialize CsuDma");
return BAD_STATE_E;
}
XSecure_Sha3Initialize(&(sha->hw), &(sha->dma));
XSecure_Sha3Start(&(sha->hw));
return 0;
}
int wc_Sha3_384_Update(wc_Sha3* sha, const byte* data, word32 len)
{
if (sha == NULL || (data == NULL && len > 0)) {
return BAD_FUNC_ARG;
}
XSecure_Sha3Update(&(sha->hw), (byte*)data, len);
return 0;
}
int wc_Sha3_384_Final(wc_Sha3* sha, byte* out)
{
if (sha == NULL || out == NULL) {
return BAD_FUNC_ARG;
}
XSecure_Sha3Finish(&(sha->hw), out);
return wc_InitSha3_384(sha, NULL, INVALID_DEVID);
}
void wc_Sha3_384_Free(wc_Sha3* sha)
{
(void)sha;
}
int wc_Sha3_384_GetHash(wc_Sha3* sha, byte* out)
{
#ifdef WOLFSSL_XILINX_CRYPTO_OLD
wc_Sha3 s;
#endif
if (sha == NULL || out == NULL) {
return BAD_FUNC_ARG;
}
#ifdef WOLFSSL_XILINX_CRYPTO_OLD
if (wc_Sha3_384_Copy(sha, &s) != 0) {
WOLFSSL_MSG("Unable to copy SHA3 structure");
return MEMORY_E;
}
return wc_Sha3_384_Final(&s, out);
#else
XSecure_Sha3_ReadHash(&(sha->hw), out);
return 0;
#endif
}
int wc_Sha3_384_Copy(wc_Sha3* src, wc_Sha3* dst)
{
if (src == NULL || dst== NULL) {
return BAD_FUNC_ARG;
}
#ifdef WOLFSSL_XILINX_CRYPTO_OLD
XMEMCPY((byte*)dst, (byte*)src, sizeof(wc_Sha3));
return 0;
#else
WOLFSSL_MSG("Copy of SHA3 struct not supported with this build");
return NOT_COMPILED_IN;
#endif
}
#endif
#endif