diff --git a/wolfcrypt/src/port/xilinx/xil-aesgcm.c b/wolfcrypt/src/port/xilinx/xil-aesgcm.c index aabcbd379..4fd427b26 100644 --- a/wolfcrypt/src/port/xilinx/xil-aesgcm.c +++ b/wolfcrypt/src/port/xilinx/xil-aesgcm.c @@ -135,7 +135,9 @@ int wc_AesGcmSetKey_ex(Aes* aes, const byte* key, word32 len, word32 kup) aes->xKeySize = len == AES_128_KEY_SIZE ? XSECURE_AES_KEY_SIZE_128 : XSECURE_AES_KEY_SIZE_256; - XMEMCPY(aes->keyInit, key, len); + if (key != NULL) { + XMEMCPY(aes->keyInit, key, len); + } return 0; } @@ -478,7 +480,12 @@ int wc_AesGcmSetKey_ex(Aes* aes, const byte* key, word32 len, word32 kup) { XCsuDma_Config* con; - if (aes == NULL || key == NULL) { + if (aes == NULL) { + return BAD_FUNC_ARG; + } + + if (kup == XSECURE_CSU_AES_KEY_SRC_KUP && key == NULL) { + WOLFSSL_MSG("Expecting key buffer passed in if using KUP"); return BAD_FUNC_ARG; } @@ -501,7 +508,9 @@ int wc_AesGcmSetKey_ex(Aes* aes, const byte* key, word32 len, word32 kup) aes->keylen = len; aes->kup = kup; - XMEMCPY((byte*)(aes->keyInit), key, len); + if (key != NULL) { + XMEMCPY((byte*)(aes->keyInit), key, len); + } return 0; } @@ -538,18 +547,26 @@ int wc_AesGcmEncrypt(Aes* aes, byte* out, return BAD_FUNC_ARG; } + #ifndef NO_WOLFSSL_XILINX_TAG_MALLOC tmp = (byte*)XMALLOC(sz + AES_GCM_AUTH_SZ, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); if (tmp == NULL) { return MEMORY_E; } + #else + /* if NO_WOLFSSL_XILINX_TAG_MALLOC is defined than it is assumed that + * out buffer is large enough to hold both the cipher out and tag */ + tmp = out; + #endif XSecure_AesInitialize(&(aes->xilAes), &(aes->dma), aes->kup, (word32*)iv, aes->keyInit); XSecure_AesEncryptData(&(aes->xilAes), tmp, in, sz); - XMEMCPY(out, tmp, sz); XMEMCPY(authTag, tmp + sz, authTagSz); + #ifndef NO_WOLFSSL_XILINX_TAG_MALLOC + XMEMCPY(out, tmp, sz); XFREE(tmp, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif } /* handle completing tag with any additional data */ diff --git a/wolfssl/wolfcrypt/aes.h b/wolfssl/wolfcrypt/aes.h index 75653bad3..dcd3320de 100644 --- a/wolfssl/wolfcrypt/aes.h +++ b/wolfssl/wolfcrypt/aes.h @@ -85,10 +85,14 @@ WOLFSSL_LOCAL void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, #ifdef WOLFSSL_XILINX_CRYPT_VERSAL #include #include -#define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_AES_USER_KEY_0 +#if !defined(WOLFSSL_XILINX_AES_KEY_SRC) + #define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_AES_USER_KEY_0 +#endif #else /* versal */ #include -#define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_CSU_AES_KEY_SRC_KUP +#if !defined(WOLFSSL_XILINX_AES_KEY_SRC) + #define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_CSU_AES_KEY_SRC_KUP +#endif #endif /* !versal */ #endif /* WOLFSSL_XILINX_CRYPT */ diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index df7509bb9..573a80929 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -1844,7 +1844,10 @@ extern void uITRON4_free(void *p) ; #if !defined(WOLFSSL_XILINX_CRYPT_VERSAL) #define NO_DEV_RANDOM #endif + #undef NO_WOLFSSL_DIR #define NO_WOLFSSL_DIR + + #undef HAVE_AESGCM #define HAVE_AESGCM #endif