@@ -500,72 +500,6 @@ block cipher mechanism that uses n-bit binary string parameter key with 128-bits
500500 }
501501 #endif
502502
503- #elif defined(FREESCALE_MMCAU)
504- /* Freescale mmCAU hardware AES support for Direct, CBC, CCM, GCM modes
505- * through the CAU/mmCAU library. Documentation located in
506- * ColdFire/ColdFire+ CAU and Kinetis mmCAU Software Library User
507- * Guide (See note in README). */
508- #ifdef FREESCALE_MMCAU_CLASSIC
509- /* MMCAU 1.4 library used with non-KSDK / classic MQX builds */
510- #include "cau_api.h"
511- #else
512- #include "fsl_mmcau.h"
513- #endif
514-
515- static WARN_UNUSED_RESULT int wc_AesEncrypt(
516- Aes* aes, const byte* inBlock, byte* outBlock)
517- {
518- #ifdef WC_DEBUG_CIPHER_LIFECYCLE
519- {
520- int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0);
521- if (ret < 0)
522- return ret;
523- }
524- #endif
525-
526- if (wolfSSL_CryptHwMutexLock() == 0) {
527- #ifdef FREESCALE_MMCAU_CLASSIC
528- if ((wc_ptr_t)outBlock % WOLFSSL_MMCAU_ALIGNMENT) {
529- WOLFSSL_MSG("Bad cau_aes_encrypt alignment");
530- return BAD_ALIGN_E;
531- }
532- cau_aes_encrypt(inBlock, (byte*)aes->key, aes->rounds, outBlock);
533- #else
534- MMCAU_AES_EncryptEcb(inBlock, (byte*)aes->key, aes->rounds,
535- outBlock);
536- #endif
537- wolfSSL_CryptHwMutexUnLock();
538- }
539- return 0;
540- }
541- #ifdef HAVE_AES_DECRYPT
542- static WARN_UNUSED_RESULT int wc_AesDecrypt(
543- Aes* aes, const byte* inBlock, byte* outBlock)
544- {
545- #ifdef WC_DEBUG_CIPHER_LIFECYCLE
546- {
547- int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0);
548- if (ret < 0)
549- return ret;
550- }
551- #endif
552- if (wolfSSL_CryptHwMutexLock() == 0) {
553- #ifdef FREESCALE_MMCAU_CLASSIC
554- if ((wc_ptr_t)outBlock % WOLFSSL_MMCAU_ALIGNMENT) {
555- WOLFSSL_MSG("Bad cau_aes_decrypt alignment");
556- return BAD_ALIGN_E;
557- }
558- cau_aes_decrypt(inBlock, (byte*)aes->key, aes->rounds, outBlock);
559- #else
560- MMCAU_AES_DecryptEcb(inBlock, (byte*)aes->key, aes->rounds,
561- outBlock);
562- #endif
563- wolfSSL_CryptHwMutexUnLock();
564- }
565- return 0;
566- }
567- #endif /* HAVE_AES_DECRYPT */
568-
569503#elif defined(WOLFSSL_PIC32MZ_CRYPT)
570504
571505 #include <wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h>
@@ -921,6 +855,72 @@ static WARN_UNUSED_RESULT int wc_AesDecrypt(Aes* aes, const byte* inBlock,
921855#endif
922856#endif
923857
858+ #elif defined(FREESCALE_MMCAU)
859+ /* Freescale mmCAU hardware AES support for Direct, CBC, CCM, GCM modes
860+ * through the CAU/mmCAU library. Documentation located in
861+ * ColdFire/ColdFire+ CAU and Kinetis mmCAU Software Library User
862+ * Guide (See note in README). */
863+ #ifdef FREESCALE_MMCAU_CLASSIC
864+ /* MMCAU 1.4 library used with non-KSDK / classic MQX builds */
865+ #include "cau_api.h"
866+ #else
867+ #include "fsl_mmcau.h"
868+ #endif
869+
870+ static WARN_UNUSED_RESULT int wc_AesEncrypt(
871+ Aes* aes, const byte* inBlock, byte* outBlock)
872+ {
873+ #ifdef WC_DEBUG_CIPHER_LIFECYCLE
874+ {
875+ int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0);
876+ if (ret < 0)
877+ return ret;
878+ }
879+ #endif
880+
881+ if (wolfSSL_CryptHwMutexLock() == 0) {
882+ #ifdef FREESCALE_MMCAU_CLASSIC
883+ if ((wc_ptr_t)outBlock % WOLFSSL_MMCAU_ALIGNMENT) {
884+ WOLFSSL_MSG("Bad cau_aes_encrypt alignment");
885+ return BAD_ALIGN_E;
886+ }
887+ cau_aes_encrypt(inBlock, (byte*)aes->key, aes->rounds, outBlock);
888+ #else
889+ MMCAU_AES_EncryptEcb(inBlock, (byte*)aes->key, aes->rounds,
890+ outBlock);
891+ #endif
892+ wolfSSL_CryptHwMutexUnLock();
893+ }
894+ return 0;
895+ }
896+ #ifdef HAVE_AES_DECRYPT
897+ static WARN_UNUSED_RESULT int wc_AesDecrypt(
898+ Aes* aes, const byte* inBlock, byte* outBlock)
899+ {
900+ #ifdef WC_DEBUG_CIPHER_LIFECYCLE
901+ {
902+ int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0);
903+ if (ret < 0)
904+ return ret;
905+ }
906+ #endif
907+ if (wolfSSL_CryptHwMutexLock() == 0) {
908+ #ifdef FREESCALE_MMCAU_CLASSIC
909+ if ((wc_ptr_t)outBlock % WOLFSSL_MMCAU_ALIGNMENT) {
910+ WOLFSSL_MSG("Bad cau_aes_decrypt alignment");
911+ return BAD_ALIGN_E;
912+ }
913+ cau_aes_decrypt(inBlock, (byte*)aes->key, aes->rounds, outBlock);
914+ #else
915+ MMCAU_AES_DecryptEcb(inBlock, (byte*)aes->key, aes->rounds,
916+ outBlock);
917+ #endif
918+ wolfSSL_CryptHwMutexUnLock();
919+ }
920+ return 0;
921+ }
922+ #endif /* HAVE_AES_DECRYPT */
923+
924924#elif (defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_AES) \
925925 && !defined(WOLFSSL_QNX_CAAM)) || \
926926 ((defined(WOLFSSL_AFALG) || defined(WOLFSSL_DEVCRYPTO_AES)) && \
@@ -4062,97 +4062,6 @@ static WARN_UNUSED_RESULT int wc_AesDecrypt(
40624062 {
40634063 return wc_AesSetKey(aes, userKey, keylen, iv, dir);
40644064 }
4065- #elif defined(FREESCALE_MMCAU)
4066- int wc_AesSetKeyLocal(Aes* aes, const byte* userKey, word32 keylen,
4067- const byte* iv, int dir, int checkKeyLen)
4068- {
4069- int ret;
4070- byte* rk;
4071- byte* tmpKey = (byte*)userKey;
4072- int tmpKeyDynamic = 0;
4073- word32 alignOffset = 0;
4074-
4075- (void)dir;
4076-
4077- if (aes == NULL)
4078- return BAD_FUNC_ARG;
4079-
4080- #ifdef WC_DEBUG_CIPHER_LIFECYCLE
4081- {
4082- int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0);
4083- if (ret < 0)
4084- return ret;
4085- }
4086- #endif
4087-
4088- if (checkKeyLen) {
4089- if (!((keylen == 16) || (keylen == 24) || (keylen == 32)))
4090- return BAD_FUNC_ARG;
4091- }
4092-
4093- rk = (byte*)aes->key;
4094- if (rk == NULL)
4095- return BAD_FUNC_ARG;
4096-
4097- #if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) || \
4098- defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_XTS) || \
4099- defined(WOLFSSL_AES_CTS)
4100- aes->left = 0;
4101- #endif
4102-
4103- aes->rounds = keylen/4 + 6;
4104-
4105- #ifdef FREESCALE_MMCAU_CLASSIC
4106- if ((wc_ptr_t)userKey % WOLFSSL_MMCAU_ALIGNMENT) {
4107- #ifndef NO_WOLFSSL_ALLOC_ALIGN
4108- byte* tmp = (byte*)XMALLOC(keylen + WOLFSSL_MMCAU_ALIGNMENT,
4109- aes->heap, DYNAMIC_TYPE_TMP_BUFFER);
4110- if (tmp == NULL) {
4111- return MEMORY_E;
4112- }
4113- alignOffset = WOLFSSL_MMCAU_ALIGNMENT -
4114- ((wc_ptr_t)tmp % WOLFSSL_MMCAU_ALIGNMENT);
4115- tmpKey = tmp + alignOffset;
4116- XMEMCPY(tmpKey, userKey, keylen);
4117- tmpKeyDynamic = 1;
4118- #else
4119- WOLFSSL_MSG("Bad cau_aes_set_key alignment");
4120- return BAD_ALIGN_E;
4121- #endif
4122- }
4123- #endif
4124-
4125- ret = wolfSSL_CryptHwMutexLock();
4126- if(ret == 0) {
4127- #ifdef FREESCALE_MMCAU_CLASSIC
4128- cau_aes_set_key(tmpKey, keylen*8, rk);
4129- #else
4130- MMCAU_AES_SetKey(tmpKey, keylen, rk);
4131- #endif
4132- wolfSSL_CryptHwMutexUnLock();
4133-
4134- ret = wc_AesSetIV(aes, iv);
4135- }
4136-
4137- if (tmpKeyDynamic == 1) {
4138- XFREE(tmpKey - alignOffset, aes->heap, DYNAMIC_TYPE_TMP_BUFFER);
4139- }
4140-
4141- return ret;
4142- }
4143-
4144- int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen,
4145- const byte* iv, int dir)
4146- {
4147- return wc_AesSetKeyLocal(aes, userKey, keylen, iv, dir, 1);
4148- }
4149-
4150- int wc_AesSetKeyDirect(Aes* aes, const byte* userKey, word32 keylen,
4151- const byte* iv, int dir)
4152- {
4153- return wc_AesSetKey(aes, userKey, keylen, iv, dir);
4154- }
4155-
41564065#elif defined(WOLFSSL_NRF51_AES)
41574066 int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen,
41584067 const byte* iv, int dir)
@@ -4428,6 +4337,96 @@ static WARN_UNUSED_RESULT int wc_AesDecrypt(
44284337 return AesSetKey(aes, userKey, keylen, iv, dir);
44294338 }
44304339 #endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */
4340+ #elif defined(FREESCALE_MMCAU)
4341+ int wc_AesSetKeyLocal(Aes* aes, const byte* userKey, word32 keylen,
4342+ const byte* iv, int dir, int checkKeyLen)
4343+ {
4344+ int ret;
4345+ byte* rk;
4346+ byte* tmpKey = (byte*)userKey;
4347+ int tmpKeyDynamic = 0;
4348+ word32 alignOffset = 0;
4349+
4350+ (void)dir;
4351+
4352+ if (aes == NULL)
4353+ return BAD_FUNC_ARG;
4354+
4355+ #ifdef WC_DEBUG_CIPHER_LIFECYCLE
4356+ {
4357+ int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0);
4358+ if (ret < 0)
4359+ return ret;
4360+ }
4361+ #endif
4362+
4363+ if (checkKeyLen) {
4364+ if (!((keylen == 16) || (keylen == 24) || (keylen == 32)))
4365+ return BAD_FUNC_ARG;
4366+ }
4367+
4368+ rk = (byte*)aes->key;
4369+ if (rk == NULL)
4370+ return BAD_FUNC_ARG;
4371+
4372+ #if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) || \
4373+ defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_XTS) || \
4374+ defined(WOLFSSL_AES_CTS)
4375+ aes->left = 0;
4376+ #endif
4377+
4378+ aes->rounds = keylen/4 + 6;
4379+
4380+ #ifdef FREESCALE_MMCAU_CLASSIC
4381+ if ((wc_ptr_t)userKey % WOLFSSL_MMCAU_ALIGNMENT) {
4382+ #ifndef NO_WOLFSSL_ALLOC_ALIGN
4383+ byte* tmp = (byte*)XMALLOC(keylen + WOLFSSL_MMCAU_ALIGNMENT,
4384+ aes->heap, DYNAMIC_TYPE_TMP_BUFFER);
4385+ if (tmp == NULL) {
4386+ return MEMORY_E;
4387+ }
4388+ alignOffset = WOLFSSL_MMCAU_ALIGNMENT -
4389+ ((wc_ptr_t)tmp % WOLFSSL_MMCAU_ALIGNMENT);
4390+ tmpKey = tmp + alignOffset;
4391+ XMEMCPY(tmpKey, userKey, keylen);
4392+ tmpKeyDynamic = 1;
4393+ #else
4394+ WOLFSSL_MSG("Bad cau_aes_set_key alignment");
4395+ return BAD_ALIGN_E;
4396+ #endif
4397+ }
4398+ #endif
4399+
4400+ ret = wolfSSL_CryptHwMutexLock();
4401+ if(ret == 0) {
4402+ #ifdef FREESCALE_MMCAU_CLASSIC
4403+ cau_aes_set_key(tmpKey, keylen*8, rk);
4404+ #else
4405+ MMCAU_AES_SetKey(tmpKey, keylen, rk);
4406+ #endif
4407+ wolfSSL_CryptHwMutexUnLock();
4408+
4409+ ret = wc_AesSetIV(aes, iv);
4410+ }
4411+
4412+ if (tmpKeyDynamic == 1) {
4413+ XFREE(tmpKey - alignOffset, aes->heap, DYNAMIC_TYPE_TMP_BUFFER);
4414+ }
4415+
4416+ return ret;
4417+ }
4418+
4419+ int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen,
4420+ const byte* iv, int dir)
4421+ {
4422+ return wc_AesSetKeyLocal(aes, userKey, keylen, iv, dir, 1);
4423+ }
4424+
4425+ int wc_AesSetKeyDirect(Aes* aes, const byte* userKey, word32 keylen,
4426+ const byte* iv, int dir)
4427+ {
4428+ return wc_AesSetKey(aes, userKey, keylen, iv, dir);
4429+ }
44314430
44324431#elif defined(WOLFSSL_PSOC6_CRYPTO)
44334432
@@ -7511,9 +7510,9 @@ void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c,
75117510 while (0)
75127511#endif /* WOLFSSL_AESGCM_STREAM */
75137512
7514- #ifdef WOLFSSL_ARMASM
7515- static void GCM_gmult_len(byte* x, const byte* h, const unsigned char* a,
7516- unsigned long len)
7513+ #if defined( WOLFSSL_ARMASM) && !defined(__aarch64__)
7514+ static void GCM_gmult_len_armasm_C(
7515+ byte* x, const byte* h, const unsigned char* a, unsigned long len)
75177516{
75187517 byte Z[AES_BLOCK_SIZE];
75197518 byte V[AES_BLOCK_SIZE];
@@ -7540,8 +7539,9 @@ static void GCM_gmult_len(byte* x, const byte* h, const unsigned char* a,
75407539 }
75417540}
75427541
7543- #define GCM_GMULT_LEN(gcm, x, a, len) GCM_gmult_len(x, (gcm)->H, a, len)
7544- #endif
7542+ #define GCM_GMULT_LEN(gcm, x, a, len) \
7543+ GCM_gmult_len_armasm_C(x, (gcm)->H, a, len)
7544+ #endif /* WOLFSSL_ARMASM && !__aarch64__ */
75457545
75467546#elif defined(GCM_TABLE)
75477547
0 commit comments