diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index c30b6779a..8ef7d74af 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -32,7 +32,8 @@ /* Macro to disable benchmark */ #ifndef NO_CRYPT_BENCHMARK -#ifdef XMALLOC_USER +#if defined(XMALLOC_USER) || defined(FREESCALE_MQX) + /* MQX classic needs for EXIT_FAILURE */ #include /* we're using malloc / free direct here */ #endif diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index a8cba6d70..13802e976 100755 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -470,13 +470,32 @@ * through the CAU/mmCAU library. Documentation located in * ColdFire/ColdFire+ CAU and Kinetis mmCAU Software Library User * Guide (See note in README). */ - #include "fsl_mmcau.h" + #ifdef FREESCALE_MMCAU_CLASSIC + /* MMCAU 1.4 library used with non-KSDK / classic MQX builds */ + #include "cau_api.h" + #else + #include "fsl_mmcau.h" + #endif static int wc_AesEncrypt(Aes* aes, const byte* inBlock, byte* outBlock) { - int ret = wolfSSL_CryptHwMutexLock(); + int ret; + + #ifdef FREESCALE_MMCAU_CLASSIC + if ((wolfssl_word)outBlock % WOLFSSL_MMCAU_ALIGNMENT) { + WOLFSSL_MSG("Bad cau_aes_encrypt alignment"); + return BAD_ALIGN_E; + } + #endif + + ret = wolfSSL_CryptHwMutexLock(); if(ret == 0) { - MMCAU_AES_EncryptEcb(inBlock, (byte*)aes->key, aes->rounds, outBlock); + #ifdef FREESCALE_MMCAU_CLASSIC + cau_aes_encrypt(inBlock, (byte*)aes->key, aes->rounds, outBlock); + #else + MMCAU_AES_EncryptEcb(inBlock, (byte*)aes->key, aes->rounds, + outBlock); + #endif wolfSSL_CryptHwMutexUnLock(); } return ret; @@ -484,9 +503,23 @@ #ifdef HAVE_AES_DECRYPT static int wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock) { - int ret = wolfSSL_CryptHwMutexLock(); + int ret; + + #ifdef FREESCALE_MMCAU_CLASSIC + if ((wolfssl_word)outBlock % WOLFSSL_MMCAU_ALIGNMENT) { + WOLFSSL_MSG("Bad cau_aes_decrypt alignment"); + return BAD_ALIGN_E; + } + #endif + + ret = wolfSSL_CryptHwMutexLock(); if(ret == 0) { - MMCAU_AES_DecryptEcb(inBlock, (byte*)aes->key, aes->rounds, outBlock); + #ifdef FREESCALE_MMCAU_CLASSIC + cau_aes_decrypt(inBlock, (byte*)aes->key, aes->rounds, outBlock); + #else + MMCAU_AES_DecryptEcb(inBlock, (byte*)aes->key, aes->rounds, + outBlock); + #endif wolfSSL_CryptHwMutexUnLock(); } return ret; @@ -1824,7 +1857,11 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock) ret = wolfSSL_CryptHwMutexLock(); if(ret == 0) { + #ifdef FREESCALE_MMCAU_CLASSIC + cau_aes_set_key(userKey, keylen*8, rk); + #else MMCAU_AES_SetKey(userKey, keylen, rk); + #endif wolfSSL_CryptHwMutexUnLock(); ret = wc_AesSetIV(aes, iv); diff --git a/wolfcrypt/src/des3.c b/wolfcrypt/src/des3.c index 534f59d9a..2a474f718 100755 --- a/wolfcrypt/src/des3.c +++ b/wolfcrypt/src/des3.c @@ -750,7 +750,11 @@ * Documentation located in ColdFire/ColdFire+ CAU and Kinetis mmCAU * Software Library User Guide (See note in README). */ - #include "fsl_mmcau.h" + #ifdef FREESCALE_MMCAU_CLASSIC + #include "cau_api.h" + #else + #include "fsl_mmcau.h" + #endif const unsigned char parityLookup[128] = { 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, @@ -815,6 +819,13 @@ iv = (byte*)des->reg; + #ifdef FREESCALE_MMCAU_CLASSIC + if ((wolfssl_word)out % WOLFSSL_MMCAU_ALIGNMENT) { + WOLFSSL_MSG("Bad cau_des_encrypt alignment"); + return BAD_ALIGN_E; + } + #endif + while (len > 0) { XMEMCPY(temp_block, in + offset, DES_BLOCK_SIZE); @@ -827,7 +838,11 @@ if(ret != 0) { return ret; } + #ifdef FREESCALE_MMCAU_CLASSIC + cau_des_encrypt(temp_block, (byte*)des->key, out + offset); + #else MMCAU_DES_EncryptEcb(temp_block, (byte*)des->key, out + offset); + #endif wolfSSL_CryptHwMutexUnLock(); len -= DES_BLOCK_SIZE; @@ -851,6 +866,13 @@ iv = (byte*)des->reg; + #ifdef FREESCALE_MMCAU_CLASSIC + if ((wolfssl_word)out % WOLFSSL_MMCAU_ALIGNMENT) { + WOLFSSL_MSG("Bad cau_des_decrypt alignment"); + return BAD_ALIGN_E; + } + #endif + while (len > 0) { XMEMCPY(temp_block, in + offset, DES_BLOCK_SIZE); @@ -859,7 +881,12 @@ if(ret != 0) { return ret; } + + #ifdef FREESCALE_MMCAU_CLASSIC + cau_des_decrypt(in + offset, (byte*)des->key, out + offset); + #else MMCAU_DES_DecryptEcb(in + offset, (byte*)des->key, out + offset); + #endif wolfSSL_CryptHwMutexUnLock(); /* XOR block with IV for CBC */ @@ -888,6 +915,13 @@ iv = (byte*)des->reg; + #ifdef FREESCALE_MMCAU_CLASSIC + if ((wolfssl_word)out % WOLFSSL_MMCAU_ALIGNMENT) { + WOLFSSL_MSG("Bad 3ede cau_des_encrypt alignment"); + return BAD_ALIGN_E; + } + #endif + while (len > 0) { XMEMCPY(temp_block, in + offset, DES_BLOCK_SIZE); @@ -900,9 +934,15 @@ if(ret != 0) { return ret; } + #ifdef FREESCALE_MMCAU_CLASSIC + cau_des_encrypt(temp_block, (byte*)des->key[0], out + offset); + cau_des_decrypt(out + offset, (byte*)des->key[1], out + offset); + cau_des_encrypt(out + offset, (byte*)des->key[2], out + offset); + #else MMCAU_DES_EncryptEcb(temp_block , (byte*)des->key[0], out + offset); MMCAU_DES_DecryptEcb(out + offset, (byte*)des->key[1], out + offset); MMCAU_DES_EncryptEcb(out + offset, (byte*)des->key[2], out + offset); + #endif wolfSSL_CryptHwMutexUnLock(); len -= DES_BLOCK_SIZE; @@ -927,6 +967,13 @@ iv = (byte*)des->reg; + #ifdef FREESCALE_MMCAU_CLASSIC + if ((wolfssl_word)out % WOLFSSL_MMCAU_ALIGNMENT) { + WOLFSSL_MSG("Bad 3ede cau_des_decrypt alignment"); + return BAD_ALIGN_E; + } + #endif + while (len > 0) { XMEMCPY(temp_block, in + offset, DES_BLOCK_SIZE); @@ -935,9 +982,15 @@ if(ret != 0) { return ret; } + #ifdef FREESCALE_MMCAU_CLASSIC + cau_des_decrypt(in + offset, (byte*)des->key[2], out + offset); + cau_des_encrypt(out + offset, (byte*)des->key[1], out + offset); + cau_des_decrypt(out + offset, (byte*)des->key[0], out + offset); + #else MMCAU_DES_DecryptEcb(in + offset , (byte*)des->key[2], out + offset); MMCAU_DES_EncryptEcb(out + offset, (byte*)des->key[1], out + offset); MMCAU_DES_DecryptEcb(out + offset, (byte*)des->key[0], out + offset); + #endif wolfSSL_CryptHwMutexUnLock(); /* XOR block with IV for CBC */ diff --git a/wolfcrypt/src/logging.c b/wolfcrypt/src/logging.c index 15ce6fa2d..e498bc300 100644 --- a/wolfcrypt/src/logging.c +++ b/wolfcrypt/src/logging.c @@ -149,6 +149,8 @@ static void wolfssl_log(const int logLevel, const char *const logMessage) #elif defined(WOLFSSL_UTASKER) fnDebugMsg((char*)logMessage); fnDebugMsg("\r\n"); +#elif defined(MQX_USE_IO_OLD) + fprintf(_mqxio_stderr, "%s\n", logMessage); #else fprintf(stderr, "%s\n", logMessage); #endif diff --git a/wolfcrypt/src/md5.c b/wolfcrypt/src/md5.c index aab311797..1323689da 100755 --- a/wolfcrypt/src/md5.c +++ b/wolfcrypt/src/md5.c @@ -174,7 +174,11 @@ { int ret = wolfSSL_CryptHwMutexLock(); if(ret == 0) { + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_md5_hash_n(data, 1, (unsigned char*)md5->digest); + #else MMCAU_MD5_HashN(data, 1, (uint32_t*)md5->digest); + #endif wolfSSL_CryptHwMutexUnLock(); } return ret; diff --git a/wolfcrypt/src/pkcs12.c b/wolfcrypt/src/pkcs12.c index c233645bb..b7f56e3ac 100644 --- a/wolfcrypt/src/pkcs12.c +++ b/wolfcrypt/src/pkcs12.c @@ -886,6 +886,9 @@ int wc_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw, case WC_PKCS12_ShroudedKeyBag: /* 668 */ { byte* k; + #ifdef FREESCALE_MQX + byte* tmp; + #endif WOLFSSL_MSG("PKCS12 Shrouded Key Bag found"); if (data[idx++] != (ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC)) { @@ -911,11 +914,24 @@ int wc_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw, if (ret < size) { /* shrink key buffer */ + #ifdef FREESCALE_MQX + /* MQX classic has no realloc */ + tmp = (byte*)XMALLOC(ret, pkcs12->heap, + DYNAMIC_TYPE_PUBLIC_KEY); + if (tmp == NULL) { + XFREE(k, pkcs12->heap, DYNAMIC_TYPE_PUBLIC_KEY); + ERROR_OUT(MEMORY_E, exit_pk12par); + } + XMEMCPY(tmp, k, ret); + XFREE(k, pkcs12->heap, DYNAMIC_TYPE_PUBLIC_KEY); + k = tmp; + #else k = (byte*)XREALLOC(k, ret, pkcs12->heap, DYNAMIC_TYPE_PUBLIC_KEY); if (k == NULL) { ERROR_OUT(MEMORY_E, exit_pk12par); } + #endif } size = ret; diff --git a/wolfcrypt/src/sha.c b/wolfcrypt/src/sha.c index 1affcce6e..67adb7ff8 100755 --- a/wolfcrypt/src/sha.c +++ b/wolfcrypt/src/sha.c @@ -237,7 +237,12 @@ #elif defined(FREESCALE_MMCAU_SHA) - #include "fsl_mmcau.h" + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + #include "cau_api.h" + #else + #include "fsl_mmcau.h" + #endif + #define USE_SHA_SOFTWARE_IMPL /* Only for API's, actual transform is here */ #define XSHATRANSFORM ShaTransform @@ -248,7 +253,11 @@ if(ret != 0) { return ret; } + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha1_initialize_output(sha->digest); + #else MMCAU_SHA1_InitializeOutput((uint32_t*)sha->digest); + #endif wolfSSL_CryptHwMutexUnLock(); sha->buffLen = 0; @@ -262,7 +271,11 @@ { int ret = wolfSSL_CryptHwMutexLock(); if(ret == 0) { + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha1_hash_n(data, 1, sha->digest); + #else MMCAU_SHA1_HashN(data, 1, (uint32_t*)sha->digest); + #endif wolfSSL_CryptHwMutexUnLock(); } return ret; @@ -522,7 +535,7 @@ int wc_ShaFinal(Sha* sha, byte* hash) XMEMCPY(&local[SHA_PAD_SIZE], &sha->hiLen, sizeof(word32)); XMEMCPY(&local[SHA_PAD_SIZE + sizeof(word32)], &sha->loLen, sizeof(word32)); -#ifdef FREESCALE_MMCAU_SHA +#if defined(FREESCALE_MMCAU_SHA) /* Kinetis requires only these bytes reversed */ ByteReverseWords(&sha->buffer[SHA_PAD_SIZE/sizeof(word32)], &sha->buffer[SHA_PAD_SIZE/sizeof(word32)], diff --git a/wolfcrypt/src/sha256.c b/wolfcrypt/src/sha256.c index 9783c7cab..5ed2a51b1 100755 --- a/wolfcrypt/src/sha256.c +++ b/wolfcrypt/src/sha256.c @@ -323,7 +323,13 @@ static int InitSha256(Sha256* sha256) } #elif defined(FREESCALE_MMCAU_SHA) - #include "fsl_mmcau.h" + + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + #include "cau_api.h" + #else + #include "fsl_mmcau.h" + #endif + #define XTRANSFORM(sha256, B) Transform(sha256, B) int wc_InitSha256_ex(Sha256* sha256, void* heap, int devId) @@ -337,7 +343,11 @@ static int InitSha256(Sha256* sha256) if (ret != 0) { return ret; } + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha256_initialize_output(sha256->digest); + #else MMCAU_SHA256_InitializeOutput((uint32_t*)sha256->digest); + #endif wolfSSL_CryptHwMutexUnLock(); sha256->buffLen = 0; @@ -351,7 +361,11 @@ static int InitSha256(Sha256* sha256) { int ret = wolfSSL_CryptHwMutexLock(); if (ret == 0) { + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha256_hash_n(buf, 1, sha256->digest); + #else MMCAU_SHA256_HashN(buf, 1, sha256->digest); + #endif wolfSSL_CryptHwMutexUnLock(); } return ret; @@ -623,7 +637,7 @@ static int InitSha256(Sha256* sha256) sizeof(word32)); #if defined(FREESCALE_MMCAU_SHA) || defined(HAVE_INTEL_AVX1) || \ - defined(HAVE_INTEL_AVX2) + defined(HAVE_INTEL_AVX2) /* Kinetis requires only these bytes reversed */ #if defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2) if (IS_INTEL_AVX1 || IS_INTEL_AVX2) diff --git a/wolfssl/openssl/bn.h b/wolfssl/openssl/bn.h index ba5648a88..1b03e21db 100644 --- a/wolfssl/openssl/bn.h +++ b/wolfssl/openssl/bn.h @@ -78,7 +78,7 @@ WOLFSSL_API int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM*, int, WOLFSSL_BN_CTX*, WOLFSSL_BN_GENCB*); WOLFSSL_API WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG); -#ifndef NO_FILESYSTEM +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) WOLFSSL_API int wolfSSL_BN_print_fp(FILE*, const WOLFSSL_BIGNUM*); #endif WOLFSSL_API int wolfSSL_BN_rshift(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, int); diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 8829fbdcc..8e6777d0e 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -686,6 +686,7 @@ extern void uITRON4_free(void *p) ; #include "mfs.h" #if MQX_USE_IO_OLD #include "fio.h" + #define NO_STDIO_FILESYSTEM #else #include "nio.h" #endif @@ -694,6 +695,7 @@ extern void uITRON4_free(void *p) ; #include "mutex.h" #endif + #define XMALLOC_OVERRIDE #define XMALLOC(s, h, t) (void *)_mem_alloc_system((s)) #define XFREE(p, h, t) {void* xp = (p); if ((xp)) _mem_free((xp));} /* Note: MQX has no realloc, using fastmath above */ @@ -804,7 +806,8 @@ extern void uITRON4_free(void *p) ; #ifdef FREESCALE_KSDK_1_3 #include "fsl_device_registers.h" - #else + #elif !defined(FREESCALE_MQX) + /* Classic MQX does not have fsl_common.h */ #include "fsl_common.h" #endif @@ -849,6 +852,14 @@ extern void uITRON4_free(void *p) ; #endif #endif /* FREESCALE_COMMON */ +/* Classic pre-KSDK mmCAU library */ +#ifdef FREESCALE_USE_MMCAU_CLASSIC + #define FREESCALE_USE_MMCAU + #define FREESCALE_MMCAU_CLASSIC + #define FREESCALE_MMCAU_CLASSIC_SHA +#endif + +/* KSDK mmCAU library */ #ifdef FREESCALE_USE_MMCAU /* AES and DES */ #define FREESCALE_MMCAU @@ -1276,9 +1287,14 @@ extern void uITRON4_free(void *p) ; #endif /* WOLFSSL_SGX */ /* FreeScale MMCAU hardware crypto has 4 byte alignment. - However, fsl_mmcau.h gives API with no alignment requirements (4 byte alignment is managed internally by fsl_mmcau.c) */ + However, KSDK fsl_mmcau.h gives API with no alignment + requirements (4 byte alignment is managed internally by fsl_mmcau.c) */ #ifdef FREESCALE_MMCAU - #define WOLFSSL_MMCAU_ALIGNMENT 0 + #ifdef FREESCALE_MMCAU_CLASSIC + #define WOLFSSL_MMCAU_ALIGNMENT 4 + #else + #define WOLFSSL_MMCAU_ALIGNMENT 0 + #endif #endif /* if using hardware crypto and have alignment requirements, specify the @@ -1289,7 +1305,7 @@ extern void uITRON4_free(void *p) ; #define WOLFSSL_GENERAL_ALIGNMENT 16 #elif defined(XSTREAM_ALIGN) #define WOLFSSL_GENERAL_ALIGNMENT 4 - #elif defined(FREESCALE_MMCAU) + #elif defined(FREESCALE_MMCAU) || defined(FREESCALE_MMCAU_CLASSIC) #define WOLFSSL_GENERAL_ALIGNMENT WOLFSSL_MMCAU_ALIGNMENT #else #define WOLFSSL_GENERAL_ALIGNMENT 0 diff --git a/wolfssl/wolfcrypt/wc_port.h b/wolfssl/wolfcrypt/wc_port.h index 574700b69..0c42240f0 100644 --- a/wolfssl/wolfcrypt/wc_port.h +++ b/wolfssl/wolfcrypt/wc_port.h @@ -24,6 +24,7 @@ #ifndef WOLF_CRYPT_PORT_H #define WOLF_CRYPT_PORT_H +#include #include #ifdef __cplusplus