add STM32F2 AES, DES, 3DES support
This commit is contained in:
parent
a7e0f4e483
commit
ea3dc3d834
@ -41,6 +41,367 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef STM32F2_CRYPTO
|
||||||
|
/*
|
||||||
|
* STM32F2 hardware AES support through the STM32F2 standard peripheral
|
||||||
|
* library. Documentation located in STM32F2xx Standard Peripheral Library
|
||||||
|
* document (See note in README).
|
||||||
|
*/
|
||||||
|
#include "stm32f2xx.h"
|
||||||
|
|
||||||
|
int AesSetKey(Aes* aes, const byte* userKey, word32 keylen, const byte* iv,
|
||||||
|
int dir)
|
||||||
|
{
|
||||||
|
word32 *rk = aes->key;
|
||||||
|
|
||||||
|
if (!((keylen == 16) || (keylen == 24) || (keylen == 32)))
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
aes->rounds = keylen/4 + 6;
|
||||||
|
XMEMCPY(rk, userKey, keylen);
|
||||||
|
ByteReverseWords(rk, rk, keylen);
|
||||||
|
|
||||||
|
return AesSetIV(aes, iv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
word32 *enc_key, *iv;
|
||||||
|
CRYP_InitTypeDef AES_CRYP_InitStructure;
|
||||||
|
CRYP_KeyInitTypeDef AES_CRYP_KeyInitStructure;
|
||||||
|
CRYP_IVInitTypeDef AES_CRYP_IVInitStructure;
|
||||||
|
|
||||||
|
enc_key = aes->key;
|
||||||
|
iv = aes->reg;
|
||||||
|
|
||||||
|
/* crypto structure initialization */
|
||||||
|
CRYP_KeyStructInit(&AES_CRYP_KeyInitStructure);
|
||||||
|
CRYP_StructInit(&AES_CRYP_InitStructure);
|
||||||
|
CRYP_IVStructInit(&AES_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* reset registers to their default values */
|
||||||
|
CRYP_DeInit();
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
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;
|
||||||
|
|
||||||
|
case 12: /* 192-bit key */
|
||||||
|
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;
|
||||||
|
|
||||||
|
case 14: /* 256-bit 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:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
CRYP_KeyInit(&AES_CRYP_KeyInitStructure);
|
||||||
|
|
||||||
|
/* set iv */
|
||||||
|
ByteReverseWords(iv, iv, AES_BLOCK_SIZE);
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV1Left = iv[2];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV1Right = iv[3];
|
||||||
|
CRYP_IVInit(&AES_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* set direction, mode, and datatype */
|
||||||
|
AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
|
||||||
|
AES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_AES_CBC;
|
||||||
|
AES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
|
||||||
|
CRYP_Init(&AES_CRYP_InitStructure);
|
||||||
|
|
||||||
|
/* enable crypto processor */
|
||||||
|
CRYP_Cmd(ENABLE);
|
||||||
|
|
||||||
|
while (sz > 0)
|
||||||
|
{
|
||||||
|
/* flush IN/OUT FIFOs */
|
||||||
|
CRYP_FIFOFlush();
|
||||||
|
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[0]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[4]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[8]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[12]);
|
||||||
|
|
||||||
|
/* wait until the complete message has been processed */
|
||||||
|
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
|
||||||
|
|
||||||
|
*(uint32_t*)&out[0] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[4] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[8] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[12] = CRYP_DataOut();
|
||||||
|
|
||||||
|
/* store iv for next call */
|
||||||
|
XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
sz -= 16;
|
||||||
|
in += 16;
|
||||||
|
out += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable crypto processor */
|
||||||
|
CRYP_Cmd(DISABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
word32 *dec_key, *iv;
|
||||||
|
CRYP_InitTypeDef AES_CRYP_InitStructure;
|
||||||
|
CRYP_KeyInitTypeDef AES_CRYP_KeyInitStructure;
|
||||||
|
CRYP_IVInitTypeDef AES_CRYP_IVInitStructure;
|
||||||
|
|
||||||
|
dec_key = aes->key;
|
||||||
|
iv = aes->reg;
|
||||||
|
|
||||||
|
/* crypto structure initialization */
|
||||||
|
CRYP_KeyStructInit(&AES_CRYP_KeyInitStructure);
|
||||||
|
CRYP_StructInit(&AES_CRYP_InitStructure);
|
||||||
|
CRYP_IVStructInit(&AES_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* if input and output same will overwrite input iv */
|
||||||
|
XMEMCPY(aes->tmp, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
/* reset registers to their default values */
|
||||||
|
CRYP_DeInit();
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
switch(aes->rounds)
|
||||||
|
{
|
||||||
|
case 10: /* 128-bit key */
|
||||||
|
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_128b;
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Left = dec_key[0];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Right = dec_key[1];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Left = dec_key[2];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Right = dec_key[3];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 12: /* 192-bit key */
|
||||||
|
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_192b;
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key1Left = dec_key[0];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key1Right = dec_key[1];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Left = dec_key[2];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Right = dec_key[3];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Left = dec_key[4];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Right = dec_key[5];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 14: /* 256-bit key */
|
||||||
|
AES_CRYP_InitStructure.CRYP_KeySize = CRYP_KeySize_256b;
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key0Left = dec_key[0];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key0Right = dec_key[1];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key1Left = dec_key[2];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key1Right = dec_key[3];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Left = dec_key[4];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key2Right = dec_key[5];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Left = dec_key[6];
|
||||||
|
AES_CRYP_KeyInitStructure.CRYP_Key3Right = dec_key[7];
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set direction, mode, and datatype for key preparation */
|
||||||
|
AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
|
||||||
|
AES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_AES_Key;
|
||||||
|
AES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_32b;
|
||||||
|
CRYP_Init(&AES_CRYP_InitStructure);
|
||||||
|
CRYP_KeyInit(&AES_CRYP_KeyInitStructure);
|
||||||
|
|
||||||
|
/* enable crypto processor */
|
||||||
|
CRYP_Cmd(ENABLE);
|
||||||
|
|
||||||
|
/* wait until key has been prepared */
|
||||||
|
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
|
||||||
|
|
||||||
|
/* set direction, mode, and datatype for decryption */
|
||||||
|
AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
|
||||||
|
AES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_AES_CBC;
|
||||||
|
AES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
|
||||||
|
CRYP_Init(&AES_CRYP_InitStructure);
|
||||||
|
|
||||||
|
/* set iv */
|
||||||
|
ByteReverseWords(iv, iv, AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV1Left = iv[2];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV1Right = iv[3];
|
||||||
|
CRYP_IVInit(&AES_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* enable crypto processor */
|
||||||
|
CRYP_Cmd(ENABLE);
|
||||||
|
|
||||||
|
while (sz > 0)
|
||||||
|
{
|
||||||
|
/* flush IN/OUT FIFOs */
|
||||||
|
CRYP_FIFOFlush();
|
||||||
|
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[0]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[4]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[8]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[12]);
|
||||||
|
|
||||||
|
/* wait until the complete message has been processed */
|
||||||
|
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
|
||||||
|
|
||||||
|
*(uint32_t*)&out[0] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[4] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[8] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[12] = CRYP_DataOut();
|
||||||
|
|
||||||
|
/* store iv for next call */
|
||||||
|
XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
sz -= 16;
|
||||||
|
in += 16;
|
||||||
|
out += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable crypto processor */
|
||||||
|
CRYP_Cmd(DISABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CYASSL_AES_COUNTER
|
||||||
|
|
||||||
|
/* AES-CTR calls this for key setup */
|
||||||
|
int AesSetKeyDirect(Aes* aes, const byte* userKey, word32 keylen,
|
||||||
|
const byte* iv, int dir)
|
||||||
|
{
|
||||||
|
return AesSetKey(aes, userKey, keylen, iv, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
word32 *enc_key, *iv;
|
||||||
|
CRYP_InitTypeDef AES_CRYP_InitStructure;
|
||||||
|
CRYP_KeyInitTypeDef AES_CRYP_KeyInitStructure;
|
||||||
|
CRYP_IVInitTypeDef AES_CRYP_IVInitStructure;
|
||||||
|
|
||||||
|
enc_key = aes->key;
|
||||||
|
iv = aes->reg;
|
||||||
|
|
||||||
|
/* crypto structure initialization */
|
||||||
|
CRYP_KeyStructInit(&AES_CRYP_KeyInitStructure);
|
||||||
|
CRYP_StructInit(&AES_CRYP_InitStructure);
|
||||||
|
CRYP_IVStructInit(&AES_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* reset registers to their default values */
|
||||||
|
CRYP_DeInit();
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
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;
|
||||||
|
|
||||||
|
case 12: /* 192-bit key */
|
||||||
|
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;
|
||||||
|
|
||||||
|
case 14: /* 256-bit 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:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
CRYP_KeyInit(&AES_CRYP_KeyInitStructure);
|
||||||
|
|
||||||
|
/* set iv */
|
||||||
|
ByteReverseWords(iv, iv, AES_BLOCK_SIZE);
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV1Left = iv[2];
|
||||||
|
AES_CRYP_IVInitStructure.CRYP_IV1Right = iv[3];
|
||||||
|
CRYP_IVInit(&AES_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* set direction, mode, and datatype */
|
||||||
|
AES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
|
||||||
|
AES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_AES_CTR;
|
||||||
|
AES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
|
||||||
|
CRYP_Init(&AES_CRYP_InitStructure);
|
||||||
|
|
||||||
|
/* enable crypto processor */
|
||||||
|
CRYP_Cmd(ENABLE);
|
||||||
|
|
||||||
|
while (sz > 0)
|
||||||
|
{
|
||||||
|
/* flush IN/OUT FIFOs */
|
||||||
|
CRYP_FIFOFlush();
|
||||||
|
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[0]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[4]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[8]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[12]);
|
||||||
|
|
||||||
|
/* wait until the complete message has been processed */
|
||||||
|
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
|
||||||
|
|
||||||
|
*(uint32_t*)&out[0] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[4] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[8] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[12] = CRYP_DataOut();
|
||||||
|
|
||||||
|
/* store iv for next call */
|
||||||
|
XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
sz -= 16;
|
||||||
|
in += 16;
|
||||||
|
out += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable crypto processor */
|
||||||
|
CRYP_Cmd(DISABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CYASSL_AES_COUNTER */
|
||||||
|
|
||||||
|
#else /* CTaoCrypt software implementation */
|
||||||
|
|
||||||
static const word32 rcon[] = {
|
static const word32 rcon[] = {
|
||||||
0x01000000, 0x02000000, 0x04000000, 0x08000000,
|
0x01000000, 0x02000000, 0x04000000, 0x08000000,
|
||||||
0x10000000, 0x20000000, 0x40000000, 0x80000000,
|
0x10000000, 0x20000000, 0x40000000, 0x80000000,
|
||||||
@ -847,18 +1208,6 @@ static int AES_set_decrypt_key(const unsigned char* userKey, const int bits,
|
|||||||
#endif /* CYASSL_AESNI */
|
#endif /* CYASSL_AESNI */
|
||||||
|
|
||||||
|
|
||||||
int AesSetIV(Aes* aes, const byte* iv)
|
|
||||||
{
|
|
||||||
if (aes == NULL)
|
|
||||||
return BAD_FUNC_ARG;
|
|
||||||
|
|
||||||
if (iv)
|
|
||||||
XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int AesSetKeyLocal(Aes* aes, const byte* userKey, word32 keylen,
|
static int AesSetKeyLocal(Aes* aes, const byte* userKey, word32 keylen,
|
||||||
const byte* iv, int dir)
|
const byte* iv, int dir)
|
||||||
{
|
{
|
||||||
@ -2192,6 +2541,19 @@ int AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz,
|
|||||||
|
|
||||||
#endif /* HAVE_AESGCM */
|
#endif /* HAVE_AESGCM */
|
||||||
|
|
||||||
|
#endif /* STM32F2_CRYPTO */
|
||||||
|
|
||||||
|
int AesSetIV(Aes* aes, const byte* iv)
|
||||||
|
{
|
||||||
|
if (aes == NULL)
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
if (iv)
|
||||||
|
XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* NO_AES */
|
#endif /* NO_AES */
|
||||||
|
|
||||||
|
@ -34,6 +34,223 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef STM32F2_CRYPTO
|
||||||
|
/*
|
||||||
|
* STM32F2 hardware DES/3DES support through the STM32F2 standard
|
||||||
|
* peripheral library. Documentation located in STM32F2xx Standard
|
||||||
|
* Peripheral Library document (See note in README).
|
||||||
|
*/
|
||||||
|
#include "stm32f2xx.h"
|
||||||
|
|
||||||
|
void Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
|
||||||
|
{
|
||||||
|
word32 *dkey = des->key;
|
||||||
|
|
||||||
|
XMEMCPY(dkey, key, 8);
|
||||||
|
ByteReverseWords(dkey, dkey, 8);
|
||||||
|
|
||||||
|
Des_SetIV(des, iv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir)
|
||||||
|
{
|
||||||
|
word32 *dkey1 = des->key[0];
|
||||||
|
word32 *dkey2 = des->key[1];
|
||||||
|
word32 *dkey3 = des->key[2];
|
||||||
|
|
||||||
|
XMEMCPY(dkey1, key, 8); /* set key 1 */
|
||||||
|
XMEMCPY(dkey2, key + 8, 8); /* set key 2 */
|
||||||
|
XMEMCPY(dkey3, key + 16, 8); /* set key 3 */
|
||||||
|
|
||||||
|
ByteReverseWords(dkey1, dkey1, 8);
|
||||||
|
ByteReverseWords(dkey2, dkey2, 8);
|
||||||
|
ByteReverseWords(dkey3, dkey3, 8);
|
||||||
|
|
||||||
|
Des3_SetIV(des, iv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DesCrypt(Des* des, byte* out, const byte* in, word32 sz,
|
||||||
|
int dir, int mode)
|
||||||
|
{
|
||||||
|
word32 *dkey, *iv;
|
||||||
|
CRYP_InitTypeDef DES_CRYP_InitStructure;
|
||||||
|
CRYP_KeyInitTypeDef DES_CRYP_KeyInitStructure;
|
||||||
|
CRYP_IVInitTypeDef DES_CRYP_IVInitStructure;
|
||||||
|
|
||||||
|
dkey = des->key;
|
||||||
|
iv = des->reg;
|
||||||
|
|
||||||
|
/* crypto structure initialization */
|
||||||
|
CRYP_KeyStructInit(&DES_CRYP_KeyInitStructure);
|
||||||
|
CRYP_StructInit(&DES_CRYP_InitStructure);
|
||||||
|
CRYP_IVStructInit(&DES_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* reset registers to their default values */
|
||||||
|
CRYP_DeInit();
|
||||||
|
|
||||||
|
/* set direction, mode, and datatype */
|
||||||
|
if (dir == DES_ENCRYPTION) {
|
||||||
|
DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
|
||||||
|
} else { /* DES_DECRYPTION */
|
||||||
|
DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode == DES_CBC) {
|
||||||
|
DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_CBC;
|
||||||
|
} else { /* DES_ECB */
|
||||||
|
DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_ECB;
|
||||||
|
}
|
||||||
|
|
||||||
|
DES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
|
||||||
|
CRYP_Init(&DES_CRYP_InitStructure);
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
DES_CRYP_KeyInitStructure.CRYP_Key1Left = dkey[0];
|
||||||
|
DES_CRYP_KeyInitStructure.CRYP_Key1Right = dkey[1];
|
||||||
|
CRYP_KeyInit(&DES_CRYP_KeyInitStructure);
|
||||||
|
|
||||||
|
/* set iv */
|
||||||
|
ByteReverseWords(iv, iv, DES_BLOCK_SIZE);
|
||||||
|
DES_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
|
||||||
|
DES_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
|
||||||
|
CRYP_IVInit(&DES_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* enable crypto processor */
|
||||||
|
CRYP_Cmd(ENABLE);
|
||||||
|
|
||||||
|
while (sz > 0)
|
||||||
|
{
|
||||||
|
/* flush IN/OUT FIFOs */
|
||||||
|
CRYP_FIFOFlush();
|
||||||
|
|
||||||
|
/* if input and output same will overwrite input iv */
|
||||||
|
XMEMCPY(des->tmp, in + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[0]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[4]);
|
||||||
|
|
||||||
|
/* wait until the complete message has been processed */
|
||||||
|
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
|
||||||
|
|
||||||
|
*(uint32_t*)&out[0] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[4] = CRYP_DataOut();
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable crypto processor */
|
||||||
|
CRYP_Cmd(DISABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
DesCrypt(des, out, in, sz, DES_ENCRYPTION, DES_CBC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
DesCrypt(des, out, in, sz, DES_DECRYPTION, DES_CBC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Des_EcbEncrypt(Des* des, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
DesCrypt(des, out, in, sz, DES_ENCRYPTION, DES_ECB);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Des3Crypt(Des3* des, byte* out, const byte* in, word32 sz,
|
||||||
|
int dir)
|
||||||
|
{
|
||||||
|
word32 *dkey1, *dkey2, *dkey3, *iv;
|
||||||
|
CRYP_InitTypeDef DES3_CRYP_InitStructure;
|
||||||
|
CRYP_KeyInitTypeDef DES3_CRYP_KeyInitStructure;
|
||||||
|
CRYP_IVInitTypeDef DES3_CRYP_IVInitStructure;
|
||||||
|
|
||||||
|
dkey1 = des->key[0];
|
||||||
|
dkey2 = des->key[1];
|
||||||
|
dkey3 = des->key[2];
|
||||||
|
iv = des->reg;
|
||||||
|
|
||||||
|
/* crypto structure initialization */
|
||||||
|
CRYP_KeyStructInit(&DES3_CRYP_KeyInitStructure);
|
||||||
|
CRYP_StructInit(&DES3_CRYP_InitStructure);
|
||||||
|
CRYP_IVStructInit(&DES3_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* reset registers to their default values */
|
||||||
|
CRYP_DeInit();
|
||||||
|
|
||||||
|
/* set direction, mode, and datatype */
|
||||||
|
if (dir == DES_ENCRYPTION) {
|
||||||
|
DES3_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt;
|
||||||
|
} else {
|
||||||
|
DES3_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt;
|
||||||
|
}
|
||||||
|
|
||||||
|
DES3_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_TDES_CBC;
|
||||||
|
DES3_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b;
|
||||||
|
CRYP_Init(&DES3_CRYP_InitStructure);
|
||||||
|
|
||||||
|
/* load key into correct registers */
|
||||||
|
DES3_CRYP_KeyInitStructure.CRYP_Key1Left = dkey1[0];
|
||||||
|
DES3_CRYP_KeyInitStructure.CRYP_Key1Right = dkey1[1];
|
||||||
|
DES3_CRYP_KeyInitStructure.CRYP_Key2Left = dkey2[0];
|
||||||
|
DES3_CRYP_KeyInitStructure.CRYP_Key2Right = dkey2[1];
|
||||||
|
DES3_CRYP_KeyInitStructure.CRYP_Key3Left = dkey3[0];
|
||||||
|
DES3_CRYP_KeyInitStructure.CRYP_Key3Right = dkey3[1];
|
||||||
|
CRYP_KeyInit(&DES3_CRYP_KeyInitStructure);
|
||||||
|
|
||||||
|
/* set iv */
|
||||||
|
ByteReverseWords(iv, iv, DES_BLOCK_SIZE);
|
||||||
|
DES3_CRYP_IVInitStructure.CRYP_IV0Left = iv[0];
|
||||||
|
DES3_CRYP_IVInitStructure.CRYP_IV0Right = iv[1];
|
||||||
|
CRYP_IVInit(&DES3_CRYP_IVInitStructure);
|
||||||
|
|
||||||
|
/* enable crypto processor */
|
||||||
|
CRYP_Cmd(ENABLE);
|
||||||
|
|
||||||
|
while (sz > 0)
|
||||||
|
{
|
||||||
|
/* flush IN/OUT FIFOs */
|
||||||
|
CRYP_FIFOFlush();
|
||||||
|
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[0]);
|
||||||
|
CRYP_DataIn(*(uint32_t*)&in[4]);
|
||||||
|
|
||||||
|
/* wait until the complete message has been processed */
|
||||||
|
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {}
|
||||||
|
|
||||||
|
*(uint32_t*)&out[0] = CRYP_DataOut();
|
||||||
|
*(uint32_t*)&out[4] = CRYP_DataOut();
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable crypto processor */
|
||||||
|
CRYP_Cmd(DISABLE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
Des3Crypt(des, out, in, sz, DES_ENCRYPTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz)
|
||||||
|
{
|
||||||
|
Des3Crypt(des, out, in, sz, DES_DECRYPTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* CTaoCrypt software implementation */
|
||||||
|
|
||||||
/* permuted choice table (key) */
|
/* permuted choice table (key) */
|
||||||
static const byte pc1[] = {
|
static const byte pc1[] = {
|
||||||
57, 49, 41, 33, 25, 17, 9,
|
57, 49, 41, 33, 25, 17, 9,
|
||||||
@ -327,20 +544,6 @@ static INLINE int Reverse(int dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Des_SetIV(Des* des, const byte* iv)
|
|
||||||
{
|
|
||||||
if (des && iv)
|
|
||||||
XMEMCPY(des->reg, iv, DES_BLOCK_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Des3_SetIV(Des3* des, const byte* iv)
|
|
||||||
{
|
|
||||||
if (des && iv)
|
|
||||||
XMEMCPY(des->reg, iv, DES_BLOCK_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
|
void Des_SetKey(Des* des, const byte* key, const byte* iv, int dir)
|
||||||
{
|
{
|
||||||
DesSetKey(key, dir, des->key);
|
DesSetKey(key, dir, des->key);
|
||||||
@ -524,5 +727,20 @@ void Des_EcbEncrypt(Des* des, byte* out, const byte* in, word32 sz)
|
|||||||
|
|
||||||
#endif /* CYASSL_DES_ECB */
|
#endif /* CYASSL_DES_ECB */
|
||||||
|
|
||||||
|
#endif /* STM32F2_CRYPTO */
|
||||||
|
|
||||||
|
void Des_SetIV(Des* des, const byte* iv)
|
||||||
|
{
|
||||||
|
if (des && iv)
|
||||||
|
XMEMCPY(des->reg, iv, DES_BLOCK_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Des3_SetIV(Des3* des, const byte* iv)
|
||||||
|
{
|
||||||
|
if (des && iv)
|
||||||
|
XMEMCPY(des->reg, iv, DES_BLOCK_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* NO_DES3 */
|
#endif /* NO_DES3 */
|
||||||
|
@ -43,6 +43,13 @@ enum {
|
|||||||
DES_DECRYPTION = 1
|
DES_DECRYPTION = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef STM32F2_CRYPTO
|
||||||
|
enum {
|
||||||
|
DES_CBC = 0,
|
||||||
|
DES_ECB = 1
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* DES encryption and decryption */
|
/* DES encryption and decryption */
|
||||||
typedef struct Des {
|
typedef struct Des {
|
||||||
|
Loading…
Reference in New Issue
Block a user