Merge pull request #1006 from cconlon/mqx

Update MQX Classic, mmCAU Ports
This commit is contained in:
toddouska 2017-07-05 10:30:20 -07:00 committed by GitHub
commit e767d40656
11 changed files with 173 additions and 16 deletions

View File

@ -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 <stdlib.h> /* we're using malloc / free direct here */
#endif

View File

@ -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);

View File

@ -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 */

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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)],

View File

@ -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)

View File

@ -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);

View File

@ -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

View File

@ -24,6 +24,7 @@
#ifndef WOLF_CRYPT_PORT_H
#define WOLF_CRYPT_PORT_H
#include <wolfssl/wolfcrypt/settings.h>
#include <wolfssl/wolfcrypt/visibility.h>
#ifdef __cplusplus