Skip to content

Commit a02b61a

Browse files
authored
Merge pull request #9475 from douzzer/20251125-aes-arm-fixes
20251125-aes-arm-fixes
2 parents 0aaa31c + be1f916 commit a02b61a

1 file changed

Lines changed: 162 additions & 162 deletions

File tree

wolfcrypt/src/aes.c

Lines changed: 162 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)