Merge pull request #591 from dgarske/STM32_CUBEMX
STM32 F2/F4 CubeMX and Std Peripheral Library hardware crypto support
This commit is contained in:
commit
6cfb8e30b2
@ -201,96 +201,171 @@ void wc_AesAsyncFree(Aes* aes)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define AES implementation includes and functions */
|
/* Define AES implementation includes and functions */
|
||||||
#if defined(STM32F2_CRYPTO)
|
#if defined(STM32F2_CRYPTO) || defined(STM32F4_CRYPTO)
|
||||||
/* STM32F2 hardware AES support for CBC, CTR modes through the STM32F2
|
/* STM32F2/F4 hardware AES support for CBC, CTR modes */
|
||||||
* Standard Peripheral Library. Documentation located in STM32F2xx
|
|
||||||
* Standard Peripheral Library document (See note in README). */
|
|
||||||
#include "stm32f2xx.h"
|
|
||||||
#include "stm32f2xx_cryp.h"
|
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AESGCM) || defined(HAVE_AESCCM)
|
||||||
static int wc_AesEncrypt(Aes* aes, const byte* inBlock, byte* outBlock)
|
static int wc_AesEncrypt(Aes* aes, const byte* inBlock, byte* outBlock)
|
||||||
{
|
{
|
||||||
word32 *enc_key;
|
int ret = 0;
|
||||||
CRYP_InitTypeDef AES_CRYP_InitStructure;
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
CRYP_KeyInitTypeDef AES_CRYP_KeyInitStructure;
|
CRYP_HandleTypeDef hcryp;
|
||||||
|
|
||||||
enc_key = aes->key;
|
/* load key into correct registers */
|
||||||
|
switch(aes->rounds) {
|
||||||
|
case 10: /* 128-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||||
|
break;
|
||||||
|
case 12: /* 192-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_192B;
|
||||||
|
break;
|
||||||
|
case 14: /* 256-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_256B;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* crypto structure initialization */
|
XMEMSET(&hcryp, 0, sizeof(CRYP_HandleTypeDef));
|
||||||
CRYP_KeyStructInit(&AES_CRYP_KeyInitStructure);
|
hcryp.Instance = CRYP;
|
||||||
CRYP_StructInit(&AES_CRYP_InitStructure);
|
hcryp.Init.DataType = CRYP_DATATYPE_8B;
|
||||||
|
hcryp.Init.pKey = (uint8_t*)aes->key;
|
||||||
|
|
||||||
/* reset registers to their default values */
|
HAL_CRYP_Init(&hcryp);
|
||||||
CRYP_DeInit();
|
|
||||||
|
|
||||||
/* load key into correct registers */
|
if (HAL_CRYP_AESECB_Encrypt(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE,
|
||||||
switch(aes->rounds)
|
outBlock, STM32_HAL_TIMEOUT) != HAL_OK) {
|
||||||
{
|
ret = WC_TIMEOUT_E;
|
||||||
case 10: /* 128-bit key */
|
}
|
||||||
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_128b;
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key2Left = enc_key[0];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key2Right = enc_key[1];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key3Left = enc_key[2];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key3Right = enc_key[3];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 12: /* 192-bit key */
|
HAL_CRYP_DeInit(&hcryp);
|
||||||
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_192b;
|
#else
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key1Left = enc_key[0];
|
word32 *enc_key;
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key1Right = enc_key[1];
|
CRYP_InitTypeDef AES_CRYP_InitStructure;
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key2Left = enc_key[2];
|
CRYP_KeyInitTypeDef AES_CRYP_KeyInitStructure;
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key2Right = enc_key[3];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key3Left = enc_key[4];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key3Right = enc_key[5];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 14: /* 256-bit key */
|
enc_key = aes->key;
|
||||||
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_256b;
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key0Left = enc_key[0];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key0Right = enc_key[1];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key1Left = enc_key[2];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key1Right = enc_key[3];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key2Left = enc_key[4];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key2Right = enc_key[5];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key3Left = enc_key[6];
|
|
||||||
AES_CRYP_KeyInitStructure.CRYP_Key3Right = enc_key[7];
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
/* crypto structure initialization */
|
||||||
break;
|
CRYP_KeyStructInit(&AES_CRYP_KeyInitStructure);
|
||||||
}
|
CRYP_StructInit(&AES_CRYP_InitStructure);
|
||||||
CRYP_KeyInit(&AES_CRYP_KeyInitStructure);
|
|
||||||
|
|
||||||
/* set direction, mode, and datatype */
|
/* reset registers to their default values */
|
||||||
AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
|
CRYP_DeInit();
|
||||||
AES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_AES_ECB;
|
|
||||||
AES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
|
|
||||||
CRYP_Init(&AES_CRYP_InitStructure);
|
|
||||||
|
|
||||||
/* enable crypto processor */
|
/* load key into correct registers */
|
||||||
CRYP_Cmd(ENABLE);
|
switch(aes->rounds)
|
||||||
|
{
|
||||||
|
case 10: /* 128-bit key */
|
||||||
|
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_128b;
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Left = enc_key[0];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Right = enc_key[1];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Left = enc_key[2];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Right = enc_key[3];
|
||||||
|
break;
|
||||||
|
|
||||||
/* flush IN/OUT FIFOs */
|
case 12: /* 192-bit key */
|
||||||
CRYP_FIFOFlush();
|
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_192b;
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key1Left = enc_key[0];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key1Right = enc_key[1];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Left = enc_key[2];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Right = enc_key[3];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Left = enc_key[4];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Right = enc_key[5];
|
||||||
|
break;
|
||||||
|
|
||||||
CRYP_DataIn(*(uint32_t*)&inBlock[0]);
|
case 14: /* 256-bit key */
|
||||||
CRYP_DataIn(*(uint32_t*)&inBlock[4]);
|
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_256b;
|
||||||
CRYP_DataIn(*(uint32_t*)&inBlock[8]);
|
AES_CRYP_KeyInitStructure.CRYP_Key0Left = enc_key[0];
|
||||||
CRYP_DataIn(*(uint32_t*)&inBlock[12]);
|
AES_CRYP_KeyInitStructure.CRYP_Key0Right = enc_key[1];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key1Left = enc_key[2];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key1Right = enc_key[3];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Left = enc_key[4];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Right = enc_key[5];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Left = enc_key[6];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Right = enc_key[7];
|
||||||
|
break;
|
||||||
|
|
||||||
/* wait until the complete message has been processed */
|
default:
|
||||||
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
|
break;
|
||||||
|
}
|
||||||
|
CRYP_KeyInit(&AES_CRYP_KeyInitStructure);
|
||||||
|
|
||||||
*(uint32_t*)&outBlock[0] = CRYP_DataOut();
|
/* set direction, mode, and datatype */
|
||||||
*(uint32_t*)&outBlock[4] = CRYP_DataOut();
|
AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
|
||||||
*(uint32_t*)&outBlock[8] = CRYP_DataOut();
|
AES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_AES_ECB;
|
||||||
*(uint32_t*)&outBlock[12] = CRYP_DataOut();
|
AES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
|
||||||
|
CRYP_Init(&AES_CRYP_InitStructure);
|
||||||
|
|
||||||
/* disable crypto processor */
|
/* enable crypto processor */
|
||||||
CRYP_Cmd(DISABLE);
|
CRYP_Cmd(ENABLE);
|
||||||
|
|
||||||
return 0;
|
/* flush IN/OUT FIFOs */
|
||||||
|
CRYP_FIFOFlush();
|
||||||
|
|
||||||
|
CRYP_DataIn(*(uint32_t*)&inBlock[0]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&inBlock[4]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&inBlock[8]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&inBlock[12]);
|
||||||
|
|
||||||
|
/* wait until the complete message has been processed */
|
||||||
|
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
|
||||||
|
|
||||||
|
*(uint32_t*)&outBlock[0] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&outBlock[4] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&outBlock[8] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&outBlock[12] = CRYP_DataOut();
|
||||||
|
|
||||||
|
/* disable crypto processor */
|
||||||
|
CRYP_Cmd(DISABLE);
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif /* WOLFSSL_AES_DIRECT || HAVE_AESGCM || HAVE_AESCCM */
|
||||||
|
|
||||||
|
#ifdef HAVE_AES_DECRYPT
|
||||||
|
#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AESGCM)
|
||||||
|
static int wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
|
CRYP_HandleTypeDef hcryp;
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
switch(aes->rounds) {
|
||||||
|
case 10: /* 128-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||||
|
break;
|
||||||
|
case 12: /* 192-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_192B;
|
||||||
|
break;
|
||||||
|
case 14: /* 256-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_256B;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMEMSET(&hcryp, 0, sizeof(CRYP_HandleTypeDef));
|
||||||
|
hcryp.Instance = CRYP;
|
||||||
|
hcryp.Init.DataType = CRYP_DATATYPE_8B;
|
||||||
|
hcryp.Init.pKey = (uint8_t*)aes->key;
|
||||||
|
|
||||||
|
HAL_CRYP_Init(&hcryp);
|
||||||
|
|
||||||
|
if (HAL_CRYP_AESECB_Decrypt(&hcryp, (uint8_t*)inBlock, AES_BLOCK_SIZE,
|
||||||
|
outBlock, STM32_HAL_TIMEOUT) != HAL_OK) {
|
||||||
|
ret = WC_TIMEOUT_E;
|
||||||
|
}
|
||||||
|
|
||||||
|
HAL_CRYP_DeInit(&hcryp);
|
||||||
|
#else
|
||||||
|
#error AES Decrypt not implemented for STM32 StdPeri lib
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_AES_DIRECT || HAVE_AESGCM */
|
||||||
|
#endif /* HAVE_AES_DECRYPT */
|
||||||
|
|
||||||
#elif defined(HAVE_COLDFIRE_SEC)
|
#elif defined(HAVE_COLDFIRE_SEC)
|
||||||
/* Freescale Coldfire SEC support for CBC mode.
|
/* Freescale Coldfire SEC support for CBC mode.
|
||||||
@ -1525,9 +1600,10 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
|
|||||||
|
|
||||||
|
|
||||||
/* wc_AesSetKey */
|
/* wc_AesSetKey */
|
||||||
#ifdef STM32F2_CRYPTO
|
#if defined(STM32F2_CRYPTO) || defined(STM32F4_CRYPTO)
|
||||||
int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, const byte* iv,
|
|
||||||
int dir)
|
int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen,
|
||||||
|
const byte* iv, int dir)
|
||||||
{
|
{
|
||||||
word32 *rk = aes->key;
|
word32 *rk = aes->key;
|
||||||
|
|
||||||
@ -1538,7 +1614,9 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
|
|||||||
|
|
||||||
aes->rounds = keylen/4 + 6;
|
aes->rounds = keylen/4 + 6;
|
||||||
XMEMCPY(rk, userKey, keylen);
|
XMEMCPY(rk, userKey, keylen);
|
||||||
|
#ifndef WOLFSSL_STM32_CUBEMX
|
||||||
ByteReverseWords(rk, rk, keylen);
|
ByteReverseWords(rk, rk, keylen);
|
||||||
|
#endif
|
||||||
|
|
||||||
return wc_AesSetIV(aes, iv);
|
return wc_AesSetIV(aes, iv);
|
||||||
}
|
}
|
||||||
@ -1549,6 +1627,7 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
|
|||||||
return wc_AesSetKey(aes, userKey, keylen, iv, dir);
|
return wc_AesSetKey(aes, userKey, keylen, iv, dir);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(HAVE_COLDFIRE_SEC)
|
#elif defined(HAVE_COLDFIRE_SEC)
|
||||||
#if defined (HAVE_THREADX)
|
#if defined (HAVE_THREADX)
|
||||||
#include "memory_pools.h"
|
#include "memory_pools.h"
|
||||||
@ -1574,7 +1653,7 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
|
|||||||
{
|
{
|
||||||
if (AESBuffIn == NULL) {
|
if (AESBuffIn == NULL) {
|
||||||
#if defined (HAVE_THREADX)
|
#if defined (HAVE_THREADX)
|
||||||
int s1, s2, s3, s4, s5 ;
|
int s1, s2, s3, s4, s5 ;
|
||||||
s5 = tx_byte_allocate(&mp_ncached,(void *)&secDesc,
|
s5 = tx_byte_allocate(&mp_ncached,(void *)&secDesc,
|
||||||
sizeof(SECdescriptorType), TX_NO_WAIT);
|
sizeof(SECdescriptorType), TX_NO_WAIT);
|
||||||
s1 = tx_byte_allocate(&mp_ncached, (void *)&AESBuffIn,
|
s1 = tx_byte_allocate(&mp_ncached, (void *)&AESBuffIn,
|
||||||
@ -1905,7 +1984,7 @@ static void wc_AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */
|
#endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */
|
||||||
#endif /* STM32F2_CRYPTO, wc_AesSetKey block */
|
#endif /* wc_AesSetKey block */
|
||||||
|
|
||||||
|
|
||||||
/* wc_AesSetIV is shared between software and hardware */
|
/* wc_AesSetIV is shared between software and hardware */
|
||||||
@ -1939,10 +2018,7 @@ int wc_InitAes_h(Aes* aes, void* h)
|
|||||||
|
|
||||||
/* AES-DIRECT */
|
/* AES-DIRECT */
|
||||||
#if defined(WOLFSSL_AES_DIRECT)
|
#if defined(WOLFSSL_AES_DIRECT)
|
||||||
#if defined(STM32F2_CRYPTO) && defined(HAVE_AES_DECRYPT)
|
#if defined(HAVE_COLDFIRE_SEC)
|
||||||
#error "STM32F2 crypto doesn't yet support AES direct decrypt"
|
|
||||||
|
|
||||||
#elif defined(HAVE_COLDFIRE_SEC)
|
|
||||||
#error "Coldfire SEC doesn't yet support AES direct"
|
#error "Coldfire SEC doesn't yet support AES direct"
|
||||||
|
|
||||||
#elif defined(WOLFSSL_PIC32MZ_CRYPT)
|
#elif defined(WOLFSSL_PIC32MZ_CRYPT)
|
||||||
@ -1994,7 +2070,105 @@ int wc_InitAes_h(Aes* aes, void* h)
|
|||||||
|
|
||||||
/* AES-CBC */
|
/* AES-CBC */
|
||||||
#ifdef HAVE_AES_CBC
|
#ifdef HAVE_AES_CBC
|
||||||
#ifdef STM32F2_CRYPTO
|
#if defined(STM32F2_CRYPTO) || defined(STM32F4_CRYPTO)
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
|
int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
CRYP_HandleTypeDef hcryp;
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
switch(aes->rounds) {
|
||||||
|
case 10: /* 128-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||||
|
break;
|
||||||
|
case 12: /* 192-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_192B;
|
||||||
|
break;
|
||||||
|
case 14: /* 256-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_256B;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMEMSET(&hcryp, 0, sizeof(CRYP_HandleTypeDef));
|
||||||
|
hcryp.Instance = CRYP;
|
||||||
|
hcryp.Init.DataType = CRYP_DATATYPE_8B;
|
||||||
|
hcryp.Init.pKey = (uint8_t*)aes->key;
|
||||||
|
hcryp.Init.pInitVect = (uint8_t*)aes->reg;
|
||||||
|
|
||||||
|
HAL_CRYP_Init(&hcryp);
|
||||||
|
|
||||||
|
while (sz > 0) {
|
||||||
|
if (HAL_CRYP_AESCBC_Encrypt(&hcryp, (uint8_t*)in, AES_BLOCK_SIZE,
|
||||||
|
out, STM32_HAL_TIMEOUT) != HAL_OK) {
|
||||||
|
ret = WC_TIMEOUT_E;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* store iv for next call */
|
||||||
|
XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
sz -= AES_BLOCK_SIZE;
|
||||||
|
in += AES_BLOCK_SIZE;
|
||||||
|
out += AES_BLOCK_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HAL_CRYP_DeInit(&hcryp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#ifdef HAVE_AES_DECRYPT
|
||||||
|
int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
CRYP_HandleTypeDef hcryp;
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
switch(aes->rounds) {
|
||||||
|
case 10: /* 128-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||||
|
break;
|
||||||
|
case 12: /* 192-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_192B;
|
||||||
|
break;
|
||||||
|
case 14: /* 256-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_256B;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMEMSET(&hcryp, 0, sizeof(CRYP_HandleTypeDef));
|
||||||
|
hcryp.Instance = CRYP;
|
||||||
|
hcryp.Init.DataType = CRYP_DATATYPE_8B;
|
||||||
|
hcryp.Init.pKey = (uint8_t*)aes->key;
|
||||||
|
hcryp.Init.pInitVect = (uint8_t*)aes->reg;
|
||||||
|
|
||||||
|
HAL_CRYP_Init(&hcryp);
|
||||||
|
|
||||||
|
while (sz > 0) {
|
||||||
|
if (HAL_CRYP_AESCBC_Decrypt(&hcryp, (uint8_t*)in, AES_BLOCK_SIZE,
|
||||||
|
out, STM32_HAL_TIMEOUT) != HAL_OK) {
|
||||||
|
ret = WC_TIMEOUT_E;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* store iv for next call */
|
||||||
|
XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
sz -= AES_BLOCK_SIZE;
|
||||||
|
in += AES_BLOCK_SIZE;
|
||||||
|
out += AES_BLOCK_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HAL_CRYP_DeInit(&hcryp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* HAVE_AES_DECRYPT */
|
||||||
|
#else
|
||||||
int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
{
|
{
|
||||||
word32 *enc_key, *iv;
|
word32 *enc_key, *iv;
|
||||||
@ -2222,13 +2396,15 @@ int wc_InitAes_h(Aes* aes, void* h)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_AES_DECRYPT */
|
#endif /* HAVE_AES_DECRYPT */
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
|
|
||||||
#elif defined(HAVE_COLDFIRE_SEC)
|
#elif defined(HAVE_COLDFIRE_SEC)
|
||||||
static int wc_AesCbcCrypt(Aes* aes, byte* po, const byte* pi, word32 sz,
|
static int wc_AesCbcCrypt(Aes* aes, byte* po, const byte* pi, word32 sz,
|
||||||
word32 descHeader)
|
word32 descHeader)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_WOLFSSL
|
#ifdef DEBUG_WOLFSSL
|
||||||
int i; int stat1, stat2; int ret;
|
int i; int stat1, stat2; int ret;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int size;
|
int size;
|
||||||
volatile int v;
|
volatile int v;
|
||||||
@ -2663,13 +2839,47 @@ int wc_InitAes_h(Aes* aes, void* h)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* STM32F2_CRYPTO, AES-CBC block */
|
#endif /* AES-CBC block */
|
||||||
#endif /* HAVE_AES_CBC */
|
#endif /* HAVE_AES_CBC */
|
||||||
|
|
||||||
/* AES-CTR */
|
/* AES-CTR */
|
||||||
#ifdef WOLFSSL_AES_COUNTER
|
#ifdef WOLFSSL_AES_COUNTER
|
||||||
|
|
||||||
#ifdef STM32F2_CRYPTO
|
#if defined(STM32F2_CRYPTO) || defined(STM32F4_CRYPTO)
|
||||||
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
|
void wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
CRYP_HandleTypeDef hcryp;
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
switch(aes->rounds) {
|
||||||
|
case 10: /* 128-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||||
|
break;
|
||||||
|
case 12: /* 192-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_192B;
|
||||||
|
break;
|
||||||
|
case 14: /* 256-bit key */
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_256B;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMEMSET(&hcryp, 0, sizeof(CRYP_HandleTypeDef));
|
||||||
|
hcryp.Instance = CRYP;
|
||||||
|
hcryp.Init.DataType = CRYP_DATATYPE_8B;
|
||||||
|
hcryp.Init.pKey = aes->key;
|
||||||
|
hcryp.Init.pInitVect = aes->reg;
|
||||||
|
|
||||||
|
HAL_CRYP_Init(&hcryp);
|
||||||
|
|
||||||
|
HAL_CRYP_AESCTR_Encrypt(&hcryp, in, AES_BLOCK_SIZE, out,
|
||||||
|
STM32_HAL_TIMEOUT);
|
||||||
|
|
||||||
|
HAL_CRYP_DeInit(&hcryp);
|
||||||
|
}
|
||||||
|
#else
|
||||||
void wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
void wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
{
|
{
|
||||||
word32 *enc_key, *iv;
|
word32 *enc_key, *iv;
|
||||||
@ -2772,6 +2982,7 @@ int wc_InitAes_h(Aes* aes, void* h)
|
|||||||
/* disable crypto processor */
|
/* disable crypto processor */
|
||||||
CRYP_Cmd(DISABLE);
|
CRYP_Cmd(DISABLE);
|
||||||
}
|
}
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
|
|
||||||
#elif defined(WOLFSSL_PIC32MZ_CRYPT)
|
#elif defined(WOLFSSL_PIC32MZ_CRYPT)
|
||||||
void wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
void wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
@ -2911,7 +3122,7 @@ int wc_InitAes_h(Aes* aes, void* h)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* STM32F2_CRYPTO, AES-CTR block */
|
#endif /* AES-CTR block */
|
||||||
|
|
||||||
#endif /* WOLFSSL_AES_COUNTER */
|
#endif /* WOLFSSL_AES_COUNTER */
|
||||||
|
|
||||||
@ -4505,7 +4716,7 @@ int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz,
|
|||||||
|
|
||||||
|
|
||||||
#ifdef WOLFSSL_ASYNC_CRYPT
|
#ifdef WOLFSSL_ASYNC_CRYPT
|
||||||
|
|
||||||
/* Initialize Aes for use with Nitrox device */
|
/* Initialize Aes for use with Nitrox device */
|
||||||
int wc_AesAsyncInit(Aes* aes, int devId)
|
int wc_AesAsyncInit(Aes* aes, int devId)
|
||||||
{
|
{
|
||||||
|
@ -126,23 +126,23 @@ void wc_Des3AsyncFree(Des3* des3)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef STM32F2_CRYPTO
|
#if defined(STM32F2_CRYPTO) || defined(STM32F4_CRYPTO)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* STM32F2 hardware DES/3DES support through the STM32F2 standard
|
* STM32F2/F4 hardware DES/3DES support through the standard
|
||||||
* peripheral library. Documentation located in STM32F2xx Standard
|
* peripheral library. (See note in README).
|
||||||
* Peripheral Library document (See note in README).
|
|
||||||
*/
|
*/
|
||||||
#include "stm32f2xx.h"
|
|
||||||
#include "stm32f2xx_cryp.h"
|
|
||||||
|
|
||||||
int wc_Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
|
int wc_Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
|
||||||
{
|
{
|
||||||
word32 *dkey = des->key;
|
word32 *dkey = des->key;
|
||||||
|
|
||||||
(void)dir;
|
(void)dir;
|
||||||
|
|
||||||
XMEMCPY(dkey, key, 8);
|
XMEMCPY(dkey, key, 8);
|
||||||
|
#ifndef WOLFSSL_STM32_CUBEMX
|
||||||
ByteReverseWords(dkey, dkey, 8);
|
ByteReverseWords(dkey, dkey, 8);
|
||||||
|
#endif
|
||||||
|
|
||||||
wc_Des_SetIV(des, iv);
|
wc_Des_SetIV(des, iv);
|
||||||
|
|
||||||
@ -151,10 +151,11 @@ void wc_Des3AsyncFree(Des3* des3)
|
|||||||
|
|
||||||
int wc_Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
|
int wc_Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
|
||||||
{
|
{
|
||||||
|
#ifndef WOLFSSL_STM32_CUBEMX
|
||||||
word32 *dkey1 = des->key[0];
|
word32 *dkey1 = des->key[0];
|
||||||
word32 *dkey2 = des->key[1];
|
word32 *dkey2 = des->key[1];
|
||||||
word32 *dkey3 = des->key[2];
|
word32 *dkey3 = des->key[2];
|
||||||
|
|
||||||
(void)dir;
|
(void)dir;
|
||||||
|
|
||||||
XMEMCPY(dkey1, key, 8); /* set key 1 */
|
XMEMCPY(dkey1, key, 8); /* set key 1 */
|
||||||
@ -164,6 +165,10 @@ void wc_Des3AsyncFree(Des3* des3)
|
|||||||
ByteReverseWords(dkey1, dkey1, 8);
|
ByteReverseWords(dkey1, dkey1, 8);
|
||||||
ByteReverseWords(dkey2, dkey2, 8);
|
ByteReverseWords(dkey2, dkey2, 8);
|
||||||
ByteReverseWords(dkey3, dkey3, 8);
|
ByteReverseWords(dkey3, dkey3, 8);
|
||||||
|
#else
|
||||||
|
(void)dir;
|
||||||
|
XMEMCPY(des->key[0], key, DES3_KEYLEN); /* CUBEMX wants keys in sequential memory */
|
||||||
|
#endif
|
||||||
|
|
||||||
return wc_Des3_SetIV(des, iv);
|
return wc_Des3_SetIV(des, iv);
|
||||||
}
|
}
|
||||||
@ -171,6 +176,54 @@ void wc_Des3AsyncFree(Des3* des3)
|
|||||||
static void DesCrypt(Des* des, byte* out, const byte* in, word32 sz,
|
static void DesCrypt(Des* des, byte* out, const byte* in, word32 sz,
|
||||||
int dir, int mode)
|
int dir, int mode)
|
||||||
{
|
{
|
||||||
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
|
CRYP_HandleTypeDef hcryp;
|
||||||
|
|
||||||
|
XMEMSET(&hcryp, 0, sizeof(CRYP_HandleTypeDef));
|
||||||
|
hcryp.Instance = CRYP;
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||||
|
hcryp.Init.DataType = CRYP_DATATYPE_8B;
|
||||||
|
hcryp.Init.pKey = (uint8_t*)des->key;
|
||||||
|
hcryp.Init.pInitVect = (uint8_t*)des->reg;
|
||||||
|
|
||||||
|
HAL_CRYP_Init(&hcryp);
|
||||||
|
|
||||||
|
while (sz > 0)
|
||||||
|
{
|
||||||
|
/* if input and output same will overwrite input iv */
|
||||||
|
XMEMCPY(des->tmp, in + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
if (mode == DES_CBC) {
|
||||||
|
if (dir == DES_ENCRYPTION) {
|
||||||
|
HAL_CRYP_DESCBC_Encrypt(&hcryp, (uint8_t*)in,
|
||||||
|
DES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
HAL_CRYP_DESCBC_Decrypt(&hcryp, (uint8_t*)in,
|
||||||
|
DES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (dir == DES_ENCRYPTION) {
|
||||||
|
HAL_CRYP_DESECB_Encrypt(&hcryp, (uint8_t*)in,
|
||||||
|
DES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
HAL_CRYP_DESECB_Decrypt(&hcryp, (uint8_t*)in,
|
||||||
|
DES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* store iv for next call */
|
||||||
|
XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
sz -= DES_BLOCK_SIZE;
|
||||||
|
in += DES_BLOCK_SIZE;
|
||||||
|
out += DES_BLOCK_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HAL_CRYP_DeInit(&hcryp);
|
||||||
|
#else
|
||||||
word32 *dkey, *iv;
|
word32 *dkey, *iv;
|
||||||
CRYP_InitTypeDef DES_CRYP_InitStructure;
|
CRYP_InitTypeDef DES_CRYP_InitStructure;
|
||||||
CRYP_KeyInitTypeDef DES_CRYP_KeyInitStructure;
|
CRYP_KeyInitTypeDef DES_CRYP_KeyInitStructure;
|
||||||
@ -244,6 +297,7 @@ void wc_Des3AsyncFree(Des3* des3)
|
|||||||
|
|
||||||
/* disable crypto processor */
|
/* disable crypto processor */
|
||||||
CRYP_Cmd(DISABLE);
|
CRYP_Cmd(DISABLE);
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
}
|
}
|
||||||
|
|
||||||
int wc_Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
|
int wc_Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
|
||||||
@ -267,6 +321,39 @@ void wc_Des3AsyncFree(Des3* des3)
|
|||||||
static void Des3Crypt(Des3* des, byte* out, const byte* in, word32 sz,
|
static void Des3Crypt(Des3* des, byte* out, const byte* in, word32 sz,
|
||||||
int dir)
|
int dir)
|
||||||
{
|
{
|
||||||
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
|
CRYP_HandleTypeDef hcryp;
|
||||||
|
|
||||||
|
XMEMSET(&hcryp, 0, sizeof(CRYP_HandleTypeDef));
|
||||||
|
hcryp.Instance = CRYP;
|
||||||
|
hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
|
||||||
|
hcryp.Init.DataType = CRYP_DATATYPE_8B;
|
||||||
|
hcryp.Init.pKey = (uint8_t*)des->key;
|
||||||
|
hcryp.Init.pInitVect = (uint8_t*)des->reg;
|
||||||
|
|
||||||
|
HAL_CRYP_Init(&hcryp);
|
||||||
|
|
||||||
|
while (sz > 0)
|
||||||
|
{
|
||||||
|
if (dir == DES_ENCRYPTION) {
|
||||||
|
HAL_CRYP_TDESCBC_Encrypt(&hcryp, (byte*)in,
|
||||||
|
DES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
HAL_CRYP_TDESCBC_Decrypt(&hcryp, (byte*)in,
|
||||||
|
DES_BLOCK_SIZE, out, STM32_HAL_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* store iv for next call */
|
||||||
|
XMEMCPY(des->reg, out + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
sz -= DES_BLOCK_SIZE;
|
||||||
|
in += DES_BLOCK_SIZE;
|
||||||
|
out += DES_BLOCK_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HAL_CRYP_DeInit(&hcryp);
|
||||||
|
#else
|
||||||
word32 *dkey1, *dkey2, *dkey3, *iv;
|
word32 *dkey1, *dkey2, *dkey3, *iv;
|
||||||
CRYP_InitTypeDef DES3_CRYP_InitStructure;
|
CRYP_InitTypeDef DES3_CRYP_InitStructure;
|
||||||
CRYP_KeyInitTypeDef DES3_CRYP_KeyInitStructure;
|
CRYP_KeyInitTypeDef DES3_CRYP_KeyInitStructure;
|
||||||
@ -338,7 +425,7 @@ void wc_Des3AsyncFree(Des3* des3)
|
|||||||
|
|
||||||
/* disable crypto processor */
|
/* disable crypto processor */
|
||||||
CRYP_Cmd(DISABLE);
|
CRYP_Cmd(DISABLE);
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
}
|
}
|
||||||
|
|
||||||
int wc_Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
int wc_Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
||||||
@ -369,8 +456,8 @@ extern TX_BYTE_POOL mp_ncached; /* Non Cached memory pool */
|
|||||||
#define DES_BUFFER_SIZE (DES_BLOCK_SIZE * 64)
|
#define DES_BUFFER_SIZE (DES_BLOCK_SIZE * 64)
|
||||||
static unsigned char *desBuffIn = NULL ;
|
static unsigned char *desBuffIn = NULL ;
|
||||||
static unsigned char *desBuffOut = NULL ;
|
static unsigned char *desBuffOut = NULL ;
|
||||||
static byte *secIV ;
|
static byte *secIV ;
|
||||||
static byte *secKey ;
|
static byte *secKey ;
|
||||||
static volatile SECdescriptorType *secDesc ;
|
static volatile SECdescriptorType *secDesc ;
|
||||||
|
|
||||||
static wolfSSL_Mutex Mutex_DesSEC ;
|
static wolfSSL_Mutex Mutex_DesSEC ;
|
||||||
@ -387,36 +474,36 @@ static wolfSSL_Mutex Mutex_DesSEC ;
|
|||||||
|
|
||||||
extern volatile unsigned char __MBAR[];
|
extern volatile unsigned char __MBAR[];
|
||||||
|
|
||||||
static void wc_Des_Cbc(byte* out, const byte* in, word32 sz,
|
static void wc_Des_Cbc(byte* out, const byte* in, word32 sz,
|
||||||
byte *key, byte *iv, word32 desc)
|
byte *key, byte *iv, word32 desc)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_WOLFSSL
|
#ifdef DEBUG_WOLFSSL
|
||||||
int ret ; int stat1,stat2 ;
|
int ret ; int stat1,stat2 ;
|
||||||
#endif
|
#endif
|
||||||
int size ;
|
int size ;
|
||||||
volatile int v ;
|
volatile int v ;
|
||||||
|
|
||||||
wc_LockMutex(&Mutex_DesSEC) ;
|
wc_LockMutex(&Mutex_DesSEC) ;
|
||||||
|
|
||||||
secDesc->length1 = 0x0;
|
secDesc->length1 = 0x0;
|
||||||
secDesc->pointer1 = NULL;
|
secDesc->pointer1 = NULL;
|
||||||
if((desc==SEC_DESC_DES_CBC_ENCRYPT)||(desc==SEC_DESC_DES_CBC_DECRYPT)){
|
if((desc==SEC_DESC_DES_CBC_ENCRYPT)||(desc==SEC_DESC_DES_CBC_DECRYPT)){
|
||||||
secDesc->length2 = DES_IVLEN ;
|
secDesc->length2 = DES_IVLEN ;
|
||||||
secDesc->length3 = DES_KEYLEN ;
|
secDesc->length3 = DES_KEYLEN ;
|
||||||
} else {
|
} else {
|
||||||
secDesc->length2 = DES3_IVLEN ;
|
secDesc->length2 = DES3_IVLEN ;
|
||||||
secDesc->length3 = DES3_KEYLEN ;
|
secDesc->length3 = DES3_KEYLEN ;
|
||||||
}
|
}
|
||||||
secDesc->pointer2 = secIV ;
|
secDesc->pointer2 = secIV ;
|
||||||
secDesc->pointer3 = secKey;
|
secDesc->pointer3 = secKey;
|
||||||
secDesc->pointer4 = desBuffIn ;
|
secDesc->pointer4 = desBuffIn ;
|
||||||
secDesc->pointer5 = desBuffOut ;
|
secDesc->pointer5 = desBuffOut ;
|
||||||
secDesc->length6 = 0;
|
secDesc->length6 = 0;
|
||||||
secDesc->pointer6 = NULL;
|
secDesc->pointer6 = NULL;
|
||||||
secDesc->length7 = 0x0;
|
secDesc->length7 = 0x0;
|
||||||
secDesc->pointer7 = NULL;
|
secDesc->pointer7 = NULL;
|
||||||
secDesc->nextDescriptorPtr = NULL ;
|
secDesc->nextDescriptorPtr = NULL ;
|
||||||
|
|
||||||
while(sz) {
|
while(sz) {
|
||||||
XMEMCPY(secIV, iv, secDesc->length2) ;
|
XMEMCPY(secIV, iv, secDesc->length2) ;
|
||||||
if((sz%DES_BUFFER_SIZE) == sz) {
|
if((sz%DES_BUFFER_SIZE) == sz) {
|
||||||
@ -426,10 +513,10 @@ static void wc_Des_Cbc(byte* out, const byte* in, word32 sz,
|
|||||||
size = DES_BUFFER_SIZE ;
|
size = DES_BUFFER_SIZE ;
|
||||||
sz -= DES_BUFFER_SIZE ;
|
sz -= DES_BUFFER_SIZE ;
|
||||||
}
|
}
|
||||||
|
|
||||||
XMEMCPY(desBuffIn, in, size) ;
|
XMEMCPY(desBuffIn, in, size) ;
|
||||||
XMEMCPY(secKey, key, secDesc->length3) ;
|
XMEMCPY(secKey, key, secDesc->length3) ;
|
||||||
|
|
||||||
secDesc->header = desc ;
|
secDesc->header = desc ;
|
||||||
secDesc->length4 = size;
|
secDesc->length4 = size;
|
||||||
secDesc->length5 = size;
|
secDesc->length5 = size;
|
||||||
@ -442,16 +529,16 @@ static void wc_Des_Cbc(byte* out, const byte* in, word32 sz,
|
|||||||
while((secDesc->header>> 24) != 0xff) {
|
while((secDesc->header>> 24) != 0xff) {
|
||||||
if(v++ > 1000)break ;
|
if(v++ > 1000)break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_WOLFSSL
|
#ifdef DEBUG_WOLFSSL
|
||||||
ret = MCF_SEC_SISRH;
|
ret = MCF_SEC_SISRH;
|
||||||
stat1 = MCF_SEC_DSR ;
|
stat1 = MCF_SEC_DSR ;
|
||||||
stat2 = MCF_SEC_DISR ;
|
stat2 = MCF_SEC_DISR ;
|
||||||
if(ret & 0xe0000000) {
|
if(ret & 0xe0000000) {
|
||||||
/* db_printf("Des_Cbc(%x):ISRH=%08x, DSR=%08x, DISR=%08x\n", desc, ret, stat1, stat2) ; */
|
/* db_printf("Des_Cbc(%x):ISRH=%08x, DSR=%08x, DISR=%08x\n", desc, ret, stat1, stat2) ; */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
XMEMCPY(out, desBuffOut, size) ;
|
XMEMCPY(out, desBuffOut, size) ;
|
||||||
|
|
||||||
if((desc==SEC_DESC_DES3_CBC_ENCRYPT)||(desc==SEC_DESC_DES_CBC_ENCRYPT)) {
|
if((desc==SEC_DESC_DES3_CBC_ENCRYPT)||(desc==SEC_DESC_DES_CBC_ENCRYPT)) {
|
||||||
@ -459,13 +546,13 @@ static void wc_Des_Cbc(byte* out, const byte* in, word32 sz,
|
|||||||
} else {
|
} else {
|
||||||
XMEMCPY((void*)iv, (void*)&(in[size-secDesc->length2]), secDesc->length2) ;
|
XMEMCPY((void*)iv, (void*)&(in[size-secDesc->length2]), secDesc->length2) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
in += size ;
|
in += size ;
|
||||||
out += size ;
|
out += size ;
|
||||||
|
|
||||||
}
|
}
|
||||||
wc_UnLockMutex(&Mutex_DesSEC) ;
|
wc_UnLockMutex(&Mutex_DesSEC) ;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -484,23 +571,23 @@ int wc_Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
|
|||||||
int wc_Des3_CbcEncrypt(Des3* des3, byte* out, const byte* in, word32 sz)
|
int wc_Des3_CbcEncrypt(Des3* des3, byte* out, const byte* in, word32 sz)
|
||||||
{
|
{
|
||||||
wc_Des_Cbc(out, in, sz, (byte *)des3->key, (byte *)des3->reg, SEC_DESC_DES3_CBC_ENCRYPT) ;
|
wc_Des_Cbc(out, in, sz, (byte *)des3->key, (byte *)des3->reg, SEC_DESC_DES3_CBC_ENCRYPT) ;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int wc_Des3_CbcDecrypt(Des3* des3, byte* out, const byte* in, word32 sz)
|
int wc_Des3_CbcDecrypt(Des3* des3, byte* out, const byte* in, word32 sz)
|
||||||
{
|
{
|
||||||
wc_Des_Cbc(out, in, sz, (byte *)des3->key, (byte *)des3->reg, SEC_DESC_DES3_CBC_DECRYPT) ;
|
wc_Des_Cbc(out, in, sz, (byte *)des3->key, (byte *)des3->reg, SEC_DESC_DES3_CBC_DECRYPT) ;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setParity(byte *buf, int len)
|
static void setParity(byte *buf, int len)
|
||||||
{
|
{
|
||||||
int i, j ;
|
int i, j ;
|
||||||
byte v ;
|
byte v ;
|
||||||
int bits ;
|
int bits ;
|
||||||
|
|
||||||
for(i=0; i<len; i++)
|
for(i=0; i<len; i++)
|
||||||
{
|
{
|
||||||
v = buf[i] >> 1 ;
|
v = buf[i] >> 1 ;
|
||||||
buf[i] = v << 1 ;
|
buf[i] = v << 1 ;
|
||||||
@ -512,7 +599,7 @@ static void setParity(byte *buf, int len)
|
|||||||
}
|
}
|
||||||
buf[i] |= (1 - (bits&0x1)) ;
|
buf[i] |= (1 - (bits&0x1)) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -520,54 +607,54 @@ int wc_Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
|
|||||||
{
|
{
|
||||||
if(desBuffIn == NULL) {
|
if(desBuffIn == NULL) {
|
||||||
#if defined (HAVE_THREADX)
|
#if defined (HAVE_THREADX)
|
||||||
int s1, s2, s3, s4, s5 ;
|
int s1, s2, s3, s4, s5 ;
|
||||||
s5 = tx_byte_allocate(&mp_ncached,(void *)&secDesc,
|
s5 = tx_byte_allocate(&mp_ncached,(void *)&secDesc,
|
||||||
sizeof(SECdescriptorType), TX_NO_WAIT);
|
sizeof(SECdescriptorType), TX_NO_WAIT);
|
||||||
s1 = tx_byte_allocate(&mp_ncached,(void *)&desBuffIn, DES_BUFFER_SIZE, TX_NO_WAIT);
|
s1 = tx_byte_allocate(&mp_ncached,(void *)&desBuffIn, DES_BUFFER_SIZE, TX_NO_WAIT);
|
||||||
s2 = tx_byte_allocate(&mp_ncached,(void *)&desBuffOut, DES_BUFFER_SIZE, TX_NO_WAIT);
|
s2 = tx_byte_allocate(&mp_ncached,(void *)&desBuffOut, DES_BUFFER_SIZE, TX_NO_WAIT);
|
||||||
/* Don't know des or des3 to be used. Allocate larger buffers */
|
/* Don't know des or des3 to be used. Allocate larger buffers */
|
||||||
s3 = tx_byte_allocate(&mp_ncached,(void *)&secKey, DES3_KEYLEN,TX_NO_WAIT);
|
s3 = tx_byte_allocate(&mp_ncached,(void *)&secKey, DES3_KEYLEN,TX_NO_WAIT);
|
||||||
s4 = tx_byte_allocate(&mp_ncached,(void *)&secIV, DES3_IVLEN, TX_NO_WAIT);
|
s4 = tx_byte_allocate(&mp_ncached,(void *)&secIV, DES3_IVLEN, TX_NO_WAIT);
|
||||||
#else
|
#else
|
||||||
#warning "Allocate non-Cache buffers"
|
#warning "Allocate non-Cache buffers"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wc_InitMutex(&Mutex_DesSEC) ;
|
wc_InitMutex(&Mutex_DesSEC) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
XMEMCPY(des->key, key, DES_KEYLEN);
|
XMEMCPY(des->key, key, DES_KEYLEN);
|
||||||
setParity((byte *)des->key, DES_KEYLEN) ;
|
setParity((byte *)des->key, DES_KEYLEN) ;
|
||||||
|
|
||||||
if (iv) {
|
if (iv) {
|
||||||
XMEMCPY(des->reg, iv, DES_IVLEN);
|
XMEMCPY(des->reg, iv, DES_IVLEN);
|
||||||
} else {
|
} else {
|
||||||
XMEMSET(des->reg, 0x0, DES_IVLEN) ;
|
XMEMSET(des->reg, 0x0, DES_IVLEN) ;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wc_Des3_SetKey(Des3* des3, const byte* key, const byte* iv, int dir)
|
int wc_Des3_SetKey(Des3* des3, const byte* key, const byte* iv, int dir)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(desBuffIn == NULL) {
|
if(desBuffIn == NULL) {
|
||||||
#if defined (HAVE_THREADX)
|
#if defined (HAVE_THREADX)
|
||||||
int s1, s2, s3, s4, s5 ;
|
int s1, s2, s3, s4, s5 ;
|
||||||
s5 = tx_byte_allocate(&mp_ncached,(void *)&secDesc,
|
s5 = tx_byte_allocate(&mp_ncached,(void *)&secDesc,
|
||||||
sizeof(SECdescriptorType), TX_NO_WAIT);
|
sizeof(SECdescriptorType), TX_NO_WAIT);
|
||||||
s1 = tx_byte_allocate(&mp_ncached,(void *)&desBuffIn, DES_BUFFER_SIZE, TX_NO_WAIT);
|
s1 = tx_byte_allocate(&mp_ncached,(void *)&desBuffIn, DES_BUFFER_SIZE, TX_NO_WAIT);
|
||||||
s2 = tx_byte_allocate(&mp_ncached,(void *)&desBuffOut, DES_BUFFER_SIZE, TX_NO_WAIT);
|
s2 = tx_byte_allocate(&mp_ncached,(void *)&desBuffOut, DES_BUFFER_SIZE, TX_NO_WAIT);
|
||||||
s3 = tx_byte_allocate(&mp_ncached,(void *)&secKey, DES3_KEYLEN,TX_NO_WAIT);
|
s3 = tx_byte_allocate(&mp_ncached,(void *)&secKey, DES3_KEYLEN,TX_NO_WAIT);
|
||||||
s4 = tx_byte_allocate(&mp_ncached,(void *)&secIV, DES3_IVLEN, TX_NO_WAIT);
|
s4 = tx_byte_allocate(&mp_ncached,(void *)&secIV, DES3_IVLEN, TX_NO_WAIT);
|
||||||
#else
|
#else
|
||||||
#warning "Allocate non-Cache buffers"
|
#warning "Allocate non-Cache buffers"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wc_InitMutex(&Mutex_DesSEC) ;
|
wc_InitMutex(&Mutex_DesSEC) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
XMEMCPY(des3->key[0], key, DES3_KEYLEN);
|
XMEMCPY(des3->key[0], key, DES3_KEYLEN);
|
||||||
setParity((byte *)des3->key[0], DES3_KEYLEN) ;
|
setParity((byte *)des3->key[0], DES3_KEYLEN) ;
|
||||||
|
|
||||||
if (iv) {
|
if (iv) {
|
||||||
XMEMCPY(des3->reg, iv, DES3_IVLEN);
|
XMEMCPY(des3->reg, iv, DES3_IVLEN);
|
||||||
} else {
|
} else {
|
||||||
@ -917,23 +1004,23 @@ int wc_Des3_SetIV(Des3* des, const byte* iv);
|
|||||||
volatile securityAssociation sa __attribute__((aligned (8)));
|
volatile securityAssociation sa __attribute__((aligned (8)));
|
||||||
volatile bufferDescriptor bd __attribute__((aligned (8)));
|
volatile bufferDescriptor bd __attribute__((aligned (8)));
|
||||||
volatile int k ;
|
volatile int k ;
|
||||||
|
|
||||||
/* get uncached address */
|
/* get uncached address */
|
||||||
|
|
||||||
in_l = in;
|
in_l = in;
|
||||||
out_l = out ;
|
out_l = out ;
|
||||||
sa_p = KVA0_TO_KVA1(&sa) ;
|
sa_p = KVA0_TO_KVA1(&sa) ;
|
||||||
bd_p = KVA0_TO_KVA1(&bd) ;
|
bd_p = KVA0_TO_KVA1(&bd) ;
|
||||||
in_p = KVA0_TO_KVA1(in_l) ;
|
in_p = KVA0_TO_KVA1(in_l) ;
|
||||||
out_p= KVA0_TO_KVA1(out_l);
|
out_p= KVA0_TO_KVA1(out_l);
|
||||||
|
|
||||||
if(PIC32MZ_IF_RAM(in_p))
|
if(PIC32MZ_IF_RAM(in_p))
|
||||||
XMEMCPY((void *)in_p, (void *)in, sz);
|
XMEMCPY((void *)in_p, (void *)in, sz);
|
||||||
XMEMSET((void *)out_p, 0, sz);
|
XMEMSET((void *)out_p, 0, sz);
|
||||||
|
|
||||||
/* Set up the Security Association */
|
/* Set up the Security Association */
|
||||||
XMEMSET((byte *)KVA0_TO_KVA1(&sa), 0, sizeof(sa));
|
XMEMSET((byte *)KVA0_TO_KVA1(&sa), 0, sizeof(sa));
|
||||||
sa_p->SA_CTRL.ALGO = algo ;
|
sa_p->SA_CTRL.ALGO = algo ;
|
||||||
sa_p->SA_CTRL.LNC = 1;
|
sa_p->SA_CTRL.LNC = 1;
|
||||||
sa_p->SA_CTRL.LOADIV = 1;
|
sa_p->SA_CTRL.LOADIV = 1;
|
||||||
sa_p->SA_CTRL.FB = 1;
|
sa_p->SA_CTRL.FB = 1;
|
||||||
@ -951,17 +1038,17 @@ int wc_Des3_SetIV(Des3* des, const byte* iv);
|
|||||||
bd_p->BD_CTRL.SA_FETCH_EN = 1;
|
bd_p->BD_CTRL.SA_FETCH_EN = 1;
|
||||||
bd_p->BD_CTRL.LAST_BD = 1;
|
bd_p->BD_CTRL.LAST_BD = 1;
|
||||||
bd_p->BD_CTRL.DESC_EN = 1;
|
bd_p->BD_CTRL.DESC_EN = 1;
|
||||||
|
|
||||||
bd_p->SA_ADDR = (unsigned int)KVA_TO_PA(&sa) ; /* (unsigned int)sa_p; */
|
bd_p->SA_ADDR = (unsigned int)KVA_TO_PA(&sa) ; /* (unsigned int)sa_p; */
|
||||||
bd_p->SRCADDR = (unsigned int)KVA_TO_PA(in) ; /* (unsigned int)in_p; */
|
bd_p->SRCADDR = (unsigned int)KVA_TO_PA(in) ; /* (unsigned int)in_p; */
|
||||||
bd_p->DSTADDR = (unsigned int)KVA_TO_PA(out); /* (unsigned int)out_p; */
|
bd_p->DSTADDR = (unsigned int)KVA_TO_PA(out); /* (unsigned int)out_p; */
|
||||||
bd_p->NXTPTR = (unsigned int)KVA_TO_PA(&bd);
|
bd_p->NXTPTR = (unsigned int)KVA_TO_PA(&bd);
|
||||||
bd_p->MSGLEN = sz ;
|
bd_p->MSGLEN = sz ;
|
||||||
|
|
||||||
/* Fire in the hole! */
|
/* Fire in the hole! */
|
||||||
CECON = 1 << 6;
|
CECON = 1 << 6;
|
||||||
while (CECON);
|
while (CECON);
|
||||||
|
|
||||||
/* Run the engine */
|
/* Run the engine */
|
||||||
CEBDPADDR = (unsigned int)KVA_TO_PA(&bd) ; /* (unsigned int)bd_p ; */
|
CEBDPADDR = (unsigned int)KVA_TO_PA(&bd) ; /* (unsigned int)bd_p ; */
|
||||||
CEINTEN = 0x07;
|
CEINTEN = 0x07;
|
||||||
@ -974,12 +1061,11 @@ int wc_Des3_SetIV(Des3* des, const byte* iv);
|
|||||||
(cryptoalgo == PIC32_CRYPTOALGO_RCBC)) {
|
(cryptoalgo == PIC32_CRYPTOALGO_RCBC)) {
|
||||||
/* set iv for the next call */
|
/* set iv for the next call */
|
||||||
if(dir == PIC32_ENCRYPTION) {
|
if(dir == PIC32_ENCRYPTION) {
|
||||||
XMEMCPY((void *)iv, (void*)&(out_p[sz-DES_IVLEN]), DES_IVLEN) ;
|
XMEMCPY((void *)iv, (void*)&(out_p[sz-DES_IVLEN]), DES_IVLEN) ;
|
||||||
} else {
|
} else {
|
||||||
ByteReverseWords((word32*)iv, (word32 *)&(in_p[sz-DES_IVLEN]),
|
ByteReverseWords((word32*)iv, (word32 *)&(in_p[sz-DES_IVLEN]),
|
||||||
DES_IVLEN);
|
DES_IVLEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteReverseWords((word32*)out, (word32 *)KVA0_TO_KVA1(out), sz);
|
ByteReverseWords((word32*)out, (word32 *)KVA0_TO_KVA1(out), sz);
|
||||||
@ -987,33 +1073,33 @@ int wc_Des3_SetIV(Des3* des, const byte* iv);
|
|||||||
|
|
||||||
int wc_Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
|
int wc_Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
|
||||||
{
|
{
|
||||||
DesCrypt(des->key, des->reg, out, in, sz,
|
DesCrypt(des->key, des->reg, out, in, sz,
|
||||||
PIC32_ENCRYPTION, PIC32_ALGO_DES, PIC32_CRYPTOALGO_CBC );
|
PIC32_ENCRYPTION, PIC32_ALGO_DES, PIC32_CRYPTOALGO_CBC );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wc_Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
|
int wc_Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
|
||||||
{
|
{
|
||||||
DesCrypt(des->key, des->reg, out, in, sz,
|
DesCrypt(des->key, des->reg, out, in, sz,
|
||||||
PIC32_DECRYPTION, PIC32_ALGO_DES, PIC32_CRYPTOALGO_CBC);
|
PIC32_DECRYPTION, PIC32_ALGO_DES, PIC32_CRYPTOALGO_CBC);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wc_Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
int wc_Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
||||||
{
|
{
|
||||||
DesCrypt(des->key[0], des->reg, out, in, sz,
|
DesCrypt(des->key[0], des->reg, out, in, sz,
|
||||||
PIC32_ENCRYPTION, PIC32_ALGO_TDES, PIC32_CRYPTOALGO_TCBC);
|
PIC32_ENCRYPTION, PIC32_ALGO_TDES, PIC32_CRYPTOALGO_TCBC);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wc_Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
int wc_Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
||||||
{
|
{
|
||||||
DesCrypt(des->key[0], des->reg, out, in, sz,
|
DesCrypt(des->key[0], des->reg, out, in, sz,
|
||||||
PIC32_DECRYPTION, PIC32_ALGO_TDES, PIC32_CRYPTOALGO_TCBC);
|
PIC32_DECRYPTION, PIC32_ALGO_TDES, PIC32_CRYPTOALGO_TCBC);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* CTaoCrypt software implementation */
|
#else /* Begin wolfCrypt software implementation */
|
||||||
|
|
||||||
/* permuted choice table (key) */
|
/* permuted choice table (key) */
|
||||||
static const byte pc1[] = {
|
static const byte pc1[] = {
|
||||||
@ -1306,7 +1392,7 @@ static int DesSetKey(const byte* key, int dir, word32* out)
|
|||||||
word32 swap = out[i];
|
word32 swap = out[i];
|
||||||
out[i] = out[DES_KS_SIZE - 2 - i];
|
out[i] = out[DES_KS_SIZE - 2 - i];
|
||||||
out[DES_KS_SIZE - 2 - i] = swap;
|
out[DES_KS_SIZE - 2 - i] = swap;
|
||||||
|
|
||||||
swap = out[i + 1];
|
swap = out[i + 1];
|
||||||
out[i + 1] = out[DES_KS_SIZE - 1 - i];
|
out[i + 1] = out[DES_KS_SIZE - 1 - i];
|
||||||
out[DES_KS_SIZE - 1 - i] = swap;
|
out[DES_KS_SIZE - 1 - i] = swap;
|
||||||
@ -1406,8 +1492,8 @@ static void DesProcessBlock(Des* des, const byte* in, byte* out)
|
|||||||
r = ByteReverseWord32(r);
|
r = ByteReverseWord32(r);
|
||||||
#endif
|
#endif
|
||||||
IPERM(&l,&r);
|
IPERM(&l,&r);
|
||||||
|
|
||||||
DesRawProcessBlock(&l, &r, des->key);
|
DesRawProcessBlock(&l, &r, des->key);
|
||||||
|
|
||||||
FPERM(&l,&r);
|
FPERM(&l,&r);
|
||||||
#ifdef LITTLE_ENDIAN_ORDER
|
#ifdef LITTLE_ENDIAN_ORDER
|
||||||
@ -1430,10 +1516,10 @@ static void Des3ProcessBlock(Des3* des, const byte* in, byte* out)
|
|||||||
r = ByteReverseWord32(r);
|
r = ByteReverseWord32(r);
|
||||||
#endif
|
#endif
|
||||||
IPERM(&l,&r);
|
IPERM(&l,&r);
|
||||||
|
|
||||||
DesRawProcessBlock(&l, &r, des->key[0]);
|
DesRawProcessBlock(&l, &r, des->key[0]);
|
||||||
DesRawProcessBlock(&r, &l, des->key[1]);
|
DesRawProcessBlock(&r, &l, des->key[1]);
|
||||||
DesRawProcessBlock(&l, &r, des->key[2]);
|
DesRawProcessBlock(&l, &r, des->key[2]);
|
||||||
|
|
||||||
FPERM(&l,&r);
|
FPERM(&l,&r);
|
||||||
#ifdef LITTLE_ENDIAN_ORDER
|
#ifdef LITTLE_ENDIAN_ORDER
|
||||||
@ -1519,7 +1605,7 @@ int wc_Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
|||||||
XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
|
XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE);
|
||||||
|
|
||||||
out += DES_BLOCK_SIZE;
|
out += DES_BLOCK_SIZE;
|
||||||
in += DES_BLOCK_SIZE;
|
in += DES_BLOCK_SIZE;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1535,14 +1621,15 @@ int wc_Des_EcbEncrypt(Des* des, byte* out, const byte* in, word32 sz)
|
|||||||
DesProcessBlock(des, in, out);
|
DesProcessBlock(des, in, out);
|
||||||
|
|
||||||
out += DES_BLOCK_SIZE;
|
out += DES_BLOCK_SIZE;
|
||||||
in += DES_BLOCK_SIZE;
|
in += DES_BLOCK_SIZE;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WOLFSSL_DES_ECB */
|
#endif /* WOLFSSL_DES_ECB */
|
||||||
|
|
||||||
#endif /* STM32F2_CRYPTO */
|
#endif /* End wolfCrypt software implementation */
|
||||||
|
|
||||||
|
|
||||||
void wc_Des_SetIV(Des* des, const byte* iv)
|
void wc_Des_SetIV(Des* des, const byte* iv)
|
||||||
{
|
{
|
||||||
|
@ -57,24 +57,21 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef STM32F2_HASH
|
#if defined(STM32F2_HASH) || defined(STM32F4_HASH)
|
||||||
/*
|
/*
|
||||||
* STM32F2 hardware MD5 support through the STM32F2 standard peripheral
|
* STM32F2/F4 hardware MD5 support through the standard peripheral
|
||||||
* library. Documentation located in STM32F2xx Standard Peripheral Library
|
* library. (See note in README).
|
||||||
* document (See note in README).
|
|
||||||
*/
|
*/
|
||||||
#include "stm32f2xx.h"
|
|
||||||
#include "stm32f2xx_hash.h"
|
|
||||||
|
|
||||||
void wc_InitMd5(Md5* md5)
|
void wc_InitMd5(Md5* md5)
|
||||||
{
|
{
|
||||||
/* STM32F2 struct notes:
|
/* STM32 struct notes:
|
||||||
* md5->buffer = first 4 bytes used to hold partial block if needed
|
* md5->buffer = first 4 bytes used to hold partial block if needed
|
||||||
* md5->buffLen = num bytes currently stored in md5->buffer
|
* md5->buffLen = num bytes currently stored in md5->buffer
|
||||||
* md5->loLen = num bytes that have been written to STM32 FIFO
|
* md5->loLen = num bytes that have been written to STM32 FIFO
|
||||||
*/
|
*/
|
||||||
XMEMSET(md5->buffer, 0, MD5_REG_SIZE);
|
XMEMSET(md5->buffer, 0, MD5_REG_SIZE);
|
||||||
|
|
||||||
md5->buffLen = 0;
|
md5->buffLen = 0;
|
||||||
md5->loLen = 0;
|
md5->loLen = 0;
|
||||||
|
|
||||||
@ -83,7 +80,7 @@
|
|||||||
|
|
||||||
/* configure algo used, algo mode, datatype */
|
/* configure algo used, algo mode, datatype */
|
||||||
HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE);
|
HASH->CR &= ~ (HASH_CR_ALGO | HASH_CR_DATATYPE | HASH_CR_MODE);
|
||||||
HASH->CR |= (HASH_AlgoSelection_MD5 | HASH_AlgoMode_HASH
|
HASH->CR |= (HASH_AlgoSelection_MD5 | HASH_AlgoMode_HASH
|
||||||
| HASH_DataType_8b);
|
| HASH_DataType_8b);
|
||||||
|
|
||||||
/* reset HASH processor */
|
/* reset HASH processor */
|
||||||
@ -157,7 +154,7 @@
|
|||||||
|
|
||||||
/* wait until Busy flag == RESET */
|
/* wait until Busy flag == RESET */
|
||||||
while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {}
|
while (HASH_GetFlagStatus(HASH_FLAG_BUSY) != RESET) {}
|
||||||
|
|
||||||
/* read message digest */
|
/* read message digest */
|
||||||
md5->digest[0] = HASH->HR[0];
|
md5->digest[0] = HASH->HR[0];
|
||||||
md5->digest[1] = HASH->HR[1];
|
md5->digest[1] = HASH->HR[1];
|
||||||
@ -171,7 +168,7 @@
|
|||||||
wc_InitMd5(md5); /* reset state */
|
wc_InitMd5(md5); /* reset state */
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* CTaoCrypt software implementation */
|
#else /* Begin wolfCrypt software implementation */
|
||||||
|
|
||||||
#ifndef WOLFSSL_HAVE_MIN
|
#ifndef WOLFSSL_HAVE_MIN
|
||||||
#define WOLFSSL_HAVE_MIN
|
#define WOLFSSL_HAVE_MIN
|
||||||
@ -292,7 +289,7 @@ static void Transform(Md5* md5)
|
|||||||
MD5STEP(F4, d, a, b, c, md5->buffer[11] + 0xbd3af235, 10);
|
MD5STEP(F4, d, a, b, c, md5->buffer[11] + 0xbd3af235, 10);
|
||||||
MD5STEP(F4, c, d, a, b, md5->buffer[2] + 0x2ad7d2bb, 15);
|
MD5STEP(F4, c, d, a, b, md5->buffer[2] + 0x2ad7d2bb, 15);
|
||||||
MD5STEP(F4, b, c, d, a, md5->buffer[9] + 0xeb86d391, 21);
|
MD5STEP(F4, b, c, d, a, md5->buffer[9] + 0xeb86d391, 21);
|
||||||
|
|
||||||
/* Add the working vars back into digest state[] */
|
/* Add the working vars back into digest state[] */
|
||||||
md5->digest[0] += a;
|
md5->digest[0] += a;
|
||||||
md5->digest[1] += b;
|
md5->digest[1] += b;
|
||||||
@ -300,7 +297,7 @@ static void Transform(Md5* md5)
|
|||||||
md5->digest[3] += d;
|
md5->digest[3] += d;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* FREESCALE_MMCAU */
|
#endif /* End Software implementation */
|
||||||
|
|
||||||
|
|
||||||
static INLINE void AddLength(Md5* md5, word32 len)
|
static INLINE void AddLength(Md5* md5, word32 len)
|
||||||
@ -356,9 +353,9 @@ void wc_Md5Final(Md5* md5, byte* hash)
|
|||||||
md5->buffLen = 0;
|
md5->buffLen = 0;
|
||||||
}
|
}
|
||||||
XMEMSET(&local[md5->buffLen], 0, MD5_PAD_SIZE - md5->buffLen);
|
XMEMSET(&local[md5->buffLen], 0, MD5_PAD_SIZE - md5->buffLen);
|
||||||
|
|
||||||
/* put lengths in bits */
|
/* put lengths in bits */
|
||||||
md5->hiLen = (md5->loLen >> (8*sizeof(md5->loLen) - 3)) +
|
md5->hiLen = (md5->loLen >> (8*sizeof(md5->loLen) - 3)) +
|
||||||
(md5->hiLen << 3);
|
(md5->hiLen << 3);
|
||||||
md5->loLen = md5->loLen << 3;
|
md5->loLen = md5->loLen << 3;
|
||||||
|
|
||||||
@ -379,7 +376,7 @@ void wc_Md5Final(Md5* md5, byte* hash)
|
|||||||
wc_InitMd5(md5); /* reset state */
|
wc_InitMd5(md5); /* reset state */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* STM32F2_HASH */
|
#endif /* End wolfCrypt software implementation */
|
||||||
|
|
||||||
|
|
||||||
int wc_Md5Hash(const byte* data, word32 len, byte* hash)
|
int wc_Md5Hash(const byte* data, word32 len, byte* hash)
|
||||||
|
@ -1436,18 +1436,37 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(STM32F2_RNG)
|
#elif defined(STM32F2_RNG) || defined(STM32F4_RNG)
|
||||||
#undef RNG
|
|
||||||
#include "stm32f2xx_rng.h"
|
|
||||||
#include "stm32f2xx_rcc.h"
|
|
||||||
/*
|
/*
|
||||||
* wc_Generate a RNG seed using the hardware random number generator
|
* wc_Generate a RNG seed using the hardware random number generator
|
||||||
* on the STM32F2. Documentation located in STM32F2xx Standard Peripheral
|
* on the STM32F2/F4. */
|
||||||
* Library document (See note in README).
|
|
||||||
*/
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
|
int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
||||||
|
{
|
||||||
|
RNG_HandleTypeDef hrng;
|
||||||
|
int i;
|
||||||
|
(void)os;
|
||||||
|
|
||||||
|
/* enable RNG clock source */
|
||||||
|
__HAL_RCC_RNG_CLK_ENABLE();
|
||||||
|
|
||||||
|
/* enable RNG peripheral */
|
||||||
|
hrng.Instance = RNG;
|
||||||
|
HAL_RNG_Init(&hrng);
|
||||||
|
|
||||||
|
for (i = 0; i < (int)sz; i++) {
|
||||||
|
/* get value */
|
||||||
|
output[i] = (byte)HAL_RNG_GetRandomNumber(&hrng);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
(void)os;
|
||||||
|
|
||||||
/* enable RNG clock source */
|
/* enable RNG clock source */
|
||||||
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
|
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
|
||||||
@ -1455,7 +1474,7 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
|||||||
/* enable RNG peripheral */
|
/* enable RNG peripheral */
|
||||||
RNG_Cmd(ENABLE);
|
RNG_Cmd(ENABLE);
|
||||||
|
|
||||||
for (i = 0; i < sz; i++) {
|
for (i = 0; i < (int)sz; i++) {
|
||||||
/* wait until RNG number is ready */
|
/* wait until RNG number is ready */
|
||||||
while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { }
|
while(RNG_GetFlagStatus(RNG_FLAG_DRDY)== RESET) { }
|
||||||
|
|
||||||
@ -1465,6 +1484,8 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
|
|
||||||
#elif defined(WOLFSSL_LPC43xx) || defined(WOLFSSL_STM32F2xx) || defined(MBED) \
|
#elif defined(WOLFSSL_LPC43xx) || defined(WOLFSSL_STM32F2xx) || defined(MBED) \
|
||||||
|| defined(WOLFSSL_EMBOS)
|
|| defined(WOLFSSL_EMBOS)
|
||||||
|
|
||||||
|
@ -73,18 +73,16 @@
|
|||||||
#define wc_ShaUpdate wc_ShaUpdate_sw
|
#define wc_ShaUpdate wc_ShaUpdate_sw
|
||||||
#define wc_ShaFinal wc_ShaFinal_sw
|
#define wc_ShaFinal wc_ShaFinal_sw
|
||||||
|
|
||||||
#elif defined(STM32F2_HASH)
|
#elif defined(STM32F2_HASH) || defined(STM32F4_HASH)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* STM32F2 hardware SHA1 support through the STM32F2 standard peripheral
|
* STM32F2/F4 hardware SHA1 support through the standard peripheral
|
||||||
* library. Documentation located in STM32F2xx Standard Peripheral Library
|
* library. (See note in README).
|
||||||
* document (See note in README).
|
|
||||||
*/
|
*/
|
||||||
#include "stm32f2xx.h"
|
|
||||||
#include "stm32f2xx_hash.h"
|
|
||||||
|
|
||||||
int wc_InitSha(Sha* sha)
|
int wc_InitSha(Sha* sha)
|
||||||
{
|
{
|
||||||
/* STM32F2 struct notes:
|
/* STM32 struct notes:
|
||||||
* sha->buffer = first 4 bytes used to hold partial block if needed
|
* sha->buffer = first 4 bytes used to hold partial block if needed
|
||||||
* sha->buffLen = num bytes currently stored in sha->buffer
|
* sha->buffLen = num bytes currently stored in sha->buffer
|
||||||
* sha->loLen = num bytes that have been written to STM32 FIFO
|
* sha->loLen = num bytes that have been written to STM32 FIFO
|
||||||
|
@ -58,7 +58,7 @@ enum {
|
|||||||
#define DES3_KEYLEN 24
|
#define DES3_KEYLEN 24
|
||||||
|
|
||||||
|
|
||||||
#ifdef STM32F2_CRYPTO
|
#if defined(STM32F2_CRYPTO) || defined(STM32F4_CRYPTO)
|
||||||
enum {
|
enum {
|
||||||
DES_CBC = 0,
|
DES_CBC = 0,
|
||||||
DES_ECB = 1
|
DES_ECB = 1
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
/* in bytes */
|
/* in bytes */
|
||||||
enum {
|
enum {
|
||||||
#ifdef STM32F2_HASH
|
#if defined(STM32F2_HASH) || defined(STM32F4_HASH)
|
||||||
MD5_REG_SIZE = 4, /* STM32 register size, bytes */
|
MD5_REG_SIZE = 4, /* STM32 register size, bytes */
|
||||||
#endif
|
#endif
|
||||||
MD5 = 0, /* hash type unique */
|
MD5 = 0, /* hash type unique */
|
||||||
|
@ -922,10 +922,48 @@ static char *fgets(char *buff, int sz, FILE *fp)
|
|||||||
#define SIZEOF_LONG_LONG 8
|
#define SIZEOF_LONG_LONG 8
|
||||||
#define NO_DEV_RANDOM
|
#define NO_DEV_RANDOM
|
||||||
#define NO_WOLFSSL_DIR
|
#define NO_WOLFSSL_DIR
|
||||||
|
#undef NO_RABBIT
|
||||||
#define NO_RABBIT
|
#define NO_RABBIT
|
||||||
#define STM32F2_RNG
|
#define STM32F2_RNG
|
||||||
#define STM32F2_CRYPTO
|
#define STM32F2_CRYPTO
|
||||||
#define KEIL_INTRINSICS
|
#ifndef __GNUC__
|
||||||
|
#define KEIL_INTRINSICS
|
||||||
|
#endif
|
||||||
|
#define NO_OLD_RNGNAME
|
||||||
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
|
#include "stm32f2xx_hal.h"
|
||||||
|
#ifndef STM32_HAL_TIMEOUT
|
||||||
|
#define STM32_HAL_TIMEOUT 0xFF
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include "stm32f2xx.h"
|
||||||
|
#include "stm32f2xx_cryp.h"
|
||||||
|
#include "stm32f2xx_hash.h"
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_STM32F4
|
||||||
|
#define SIZEOF_LONG_LONG 8
|
||||||
|
#define NO_DEV_RANDOM
|
||||||
|
#define NO_WOLFSSL_DIR
|
||||||
|
#undef NO_RABBIT
|
||||||
|
#define NO_RABBIT
|
||||||
|
#define STM32F4_RNG
|
||||||
|
#define STM32F4_CRYPTO
|
||||||
|
#define NO_OLD_RNGNAME
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#define KEIL_INTRINSICS
|
||||||
|
#endif
|
||||||
|
#ifdef WOLFSSL_STM32_CUBEMX
|
||||||
|
#include "stm32f4xx_hal.h"
|
||||||
|
#ifndef STM32_HAL_TIMEOUT
|
||||||
|
#define STM32_HAL_TIMEOUT 0xFF
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include "stm32f4xx.h"
|
||||||
|
#include "stm32f4xx_cryp.h"
|
||||||
|
#include "stm32f4xx_hash.h"
|
||||||
|
#endif /* WOLFSSL_STM32_CUBEMX */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MICRIUM
|
#ifdef MICRIUM
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
#ifndef HAVE_FIPS /* avoid redefining structs */
|
#ifndef HAVE_FIPS /* avoid redefining structs */
|
||||||
/* in bytes */
|
/* in bytes */
|
||||||
enum {
|
enum {
|
||||||
#ifdef STM32F2_HASH
|
#if defined(STM32F2_HASH) || defined(STM32F4_HASH)
|
||||||
SHA_REG_SIZE = 4, /* STM32 register size, bytes */
|
SHA_REG_SIZE = 4, /* STM32 register size, bytes */
|
||||||
#endif
|
#endif
|
||||||
SHA = 1, /* hash type unique */
|
SHA = 1, /* hash type unique */
|
||||||
|
Loading…
Reference in New Issue
Block a user