Go to the documentation of this file.
32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
35 #include "nuc472_442.h"
45 #if (NUC472_CRYPTO_CIPHER_SUPPORT == ENABLED)
59 CRPT->TDES_CTL |= CRPT_TDES_CTL_DMALAST_Msk | CRPT_TDES_CTL_START_Msk;
62 while((CRPT->TDES_STS & CRPT_TDES_STS_INBUFFULL_Msk) != 0)
67 CRPT->TDES_DATIN = __UNALIGNED_UINT32_READ(input);
68 CRPT->TDES_DATIN = __UNALIGNED_UINT32_READ(input + 4);
71 while((CRPT->TDES_STS & CRPT_TDES_STS_OUTBUFEMPTY_Msk) != 0)
76 temp = CRPT->TDES_DATOUT;
77 __UNALIGNED_UINT32_WRITE(output, temp);
78 temp = CRPT->TDES_DATOUT;
79 __UNALIGNED_UINT32_WRITE(output + 4, temp);
82 CRPT->TDES0_IVH = CRPT->TDES_FDBCKH;
83 CRPT->TDES0_IVL = CRPT->TDES_FDBCKL;
87 #if (DES_SUPPORT == ENABLED)
100 uint8_t *output,
size_t length, uint32_t opmode)
108 SYS->IPRST0 |= SYS_IPRST0_CRPTRST_Msk;
109 SYS->IPRST0 &= ~SYS_IPRST0_CRPTRST_Msk;
112 CRPT->TDES_CTL = CRPT_TDES_CTL_KEYPRT_Msk | CRPT_TDES_CTL_INSWAP_Msk |
113 CRPT_TDES_CTL_OUTSWAP_Msk | CRPT_TDES_CTL_BLKSWAP_Msk | opmode;
116 CRPT->TDES0_KEY1H = context->
ks[0];
117 CRPT->TDES0_KEY1L = context->
ks[1];
159 temp = CRPT->TDES_FDBCKH;
161 temp = CRPT->TDES_FDBCKL;
166 CRPT->TDES_CTL |= CRPT_TDES_CTL_STOP_Msk;
184 if(context == NULL || key == NULL)
230 #if (DES3_SUPPORT == ENABLED)
243 uint8_t *output,
size_t length, uint32_t opmode)
251 SYS->IPRST0 |= SYS_IPRST0_CRPTRST_Msk;
252 SYS->IPRST0 &= ~SYS_IPRST0_CRPTRST_Msk;
255 CRPT->TDES_CTL = CRPT_TDES_CTL_KEYPRT_Msk | CRPT_TDES_CTL_INSWAP_Msk |
256 CRPT_TDES_CTL_OUTSWAP_Msk | CRPT_TDES_CTL_BLKSWAP_Msk |
257 CRPT_TDES_CTL_3KEYS_Msk | CRPT_TDES_CTL_TMODE_Msk | opmode;
260 CRPT->TDES0_KEY1H = context->
k1.
ks[0];
261 CRPT->TDES0_KEY1L = context->
k1.
ks[1];
262 CRPT->TDES0_KEY2H = context->
k2.
ks[0];
263 CRPT->TDES0_KEY2L = context->
k2.
ks[1];
264 CRPT->TDES0_KEY3H = context->
k3.
ks[0];
265 CRPT->TDES0_KEY3L = context->
k3.
ks[1];
307 temp = CRPT->TDES_FDBCKH;
309 temp = CRPT->TDES_FDBCKL;
314 CRPT->TDES_CTL |= CRPT_TDES_CTL_STOP_Msk;
332 if(context == NULL || key == NULL)
347 else if(keyLen == 16)
359 else if(keyLen == 24)
411 #if (AES_SUPPORT == ENABLED)
423 temp = CRPT->AES_CTL & ~CRPT_AES_CTL_KEYSZ_Pos;
426 if(context->
nr == 10)
432 CRPT->AES0_KEY0 = context->
ek[0];
433 CRPT->AES0_KEY1 = context->
ek[1];
434 CRPT->AES0_KEY2 = context->
ek[2];
435 CRPT->AES0_KEY3 = context->
ek[3];
437 else if(context->
nr == 12)
443 CRPT->AES0_KEY0 = context->
ek[0];
444 CRPT->AES0_KEY1 = context->
ek[1];
445 CRPT->AES0_KEY2 = context->
ek[2];
446 CRPT->AES0_KEY3 = context->
ek[3];
447 CRPT->AES0_KEY4 = context->
ek[4];
448 CRPT->AES0_KEY5 = context->
ek[5];
456 CRPT->AES0_KEY0 = context->
ek[0];
457 CRPT->AES0_KEY1 = context->
ek[1];
458 CRPT->AES0_KEY2 = context->
ek[2];
459 CRPT->AES0_KEY3 = context->
ek[3];
460 CRPT->AES0_KEY4 = context->
ek[4];
461 CRPT->AES0_KEY5 = context->
ek[5];
462 CRPT->AES0_KEY6 = context->
ek[6];
463 CRPT->AES0_KEY7 = context->
ek[7];
479 CRPT->AES_CTL |= CRPT_AES_CTL_DMALAST_Msk | CRPT_AES_CTL_START_Msk;
482 while((CRPT->AES_STS & CRPT_AES_STS_INBUFFULL_Msk) != 0)
487 CRPT->AES_DATIN = __UNALIGNED_UINT32_READ(input);
488 CRPT->AES_DATIN = __UNALIGNED_UINT32_READ(input + 4);
489 CRPT->AES_DATIN = __UNALIGNED_UINT32_READ(input + 8);
490 CRPT->AES_DATIN = __UNALIGNED_UINT32_READ(input + 12);
493 while((CRPT->AES_STS & CRPT_AES_STS_OUTBUFEMPTY_Msk) != 0)
498 temp = CRPT->AES_DATOUT;
499 __UNALIGNED_UINT32_WRITE(output, temp);
500 temp = CRPT->AES_DATOUT;
501 __UNALIGNED_UINT32_WRITE(output + 4, temp);
502 temp = CRPT->AES_DATOUT;
503 __UNALIGNED_UINT32_WRITE(output + 8, temp);
504 temp = CRPT->AES_DATOUT;
505 __UNALIGNED_UINT32_WRITE(output + 12, temp);
508 CRPT->AES0_IV0 = CRPT->AES_FDBCK0;
509 CRPT->AES0_IV1 = CRPT->AES_FDBCK1;
510 CRPT->AES0_IV2 = CRPT->AES_FDBCK2;
511 CRPT->AES0_IV3 = CRPT->AES_FDBCK3;
526 uint8_t *output,
size_t length, uint32_t opmode)
534 SYS->IPRST0 |= SYS_IPRST0_CRPTRST_Msk;
535 SYS->IPRST0 &= ~SYS_IPRST0_CRPTRST_Msk;
538 CRPT->AES_CTL = CRPT_AES_CTL_KEYPRT_Msk | CRPT_AES_CTL_INSWAP_Msk |
539 CRPT_AES_CTL_OUTSWAP_Msk | opmode;
586 temp = CRPT->AES_FDBCK0;
588 temp = CRPT->AES_FDBCK1;
590 temp = CRPT->AES_FDBCK2;
592 temp = CRPT->AES_FDBCK3;
597 CRPT->AES_CTL |= CRPT_AES_CTL_STOP_Msk;
617 if(context == NULL || key == NULL)
626 else if(keyLen == 24)
631 else if(keyLen == 32)
646 for(i = 0; i < keyLen; i++)
686 #if (ECB_SUPPORT == ENABLED)
699 const uint8_t *
p, uint8_t *
c,
size_t length)
706 #if (DES_SUPPORT == ENABLED)
729 #if (DES3_SUPPORT == ENABLED)
752 #if (AES_SUPPORT == ENABLED)
812 const uint8_t *
c, uint8_t *
p,
size_t length)
819 #if (DES_SUPPORT == ENABLED)
842 #if (DES3_SUPPORT == ENABLED)
865 #if (AES_SUPPORT == ENABLED)
914 #if (CBC_SUPPORT == ENABLED)
928 uint8_t *
iv,
const uint8_t *
p, uint8_t *
c,
size_t length)
935 #if (DES_SUPPORT == ENABLED)
958 #if (DES3_SUPPORT == ENABLED)
981 #if (AES_SUPPORT == ENABLED)
1014 c[i] =
p[i] ^
iv[i];
1054 uint8_t *
iv,
const uint8_t *
c, uint8_t *
p,
size_t length)
1061 #if (DES_SUPPORT == ENABLED)
1084 #if (DES3_SUPPORT == ENABLED)
1107 #if (AES_SUPPORT == ENABLED)
1171 #if (CFB_SUPPORT == ENABLED)
1186 uint8_t *
iv,
const uint8_t *
p, uint8_t *
c,
size_t length)
1193 #if (DES_SUPPORT == ENABLED)
1220 #if (DES3_SUPPORT == ENABLED)
1247 #if (AES_SUPPORT == ENABLED)
1277 if((
s % 8) == 0 &&
s >= 1 &&
s <= (cipher->
blockSize * 8))
1296 for(i = 0; i <
n; i++)
1336 uint8_t *
iv,
const uint8_t *
c, uint8_t *
p,
size_t length)
1343 #if (DES_SUPPORT == ENABLED)
1370 #if (DES3_SUPPORT == ENABLED)
1397 #if (AES_SUPPORT == ENABLED)
1427 if((
s % 8) == 0 &&
s >= 1 &&
s <= (cipher->
blockSize * 8))
1450 for(i = 0; i <
n; i++)
1473 #if (OFB_SUPPORT == ENABLED)
1488 uint8_t *
iv,
const uint8_t *
p, uint8_t *
c,
size_t length)
1495 #if (DES_SUPPORT == ENABLED)
1522 #if (DES3_SUPPORT == ENABLED)
1549 #if (AES_SUPPORT == ENABLED)
1579 if((
s % 8) == 0 &&
s >= 1 &&
s <= (cipher->
blockSize * 8))
1598 for(i = 0; i <
n; i++)
1625 #if (CTR_SUPPORT == ENABLED)
1640 uint8_t *
t,
const uint8_t *
p, uint8_t *
c,
size_t length)
1654 #if (DES_SUPPORT == ENABLED)
1688 #if (DES3_SUPPORT == ENABLED)
1722 #if (AES_SUPPORT == ENABLED)
1772 for(i = 0; i <
n; i++)
1798 #if (GCM_SUPPORT == ENABLED)
1813 for(temp = inc, i = 0; i <= 3; i++)
1816 temp += ctr[15 - i];
1817 ctr[15 - i] = temp & 0xFF;
1839 const uint8_t *
a,
size_t aLen,
const uint8_t *
p, uint8_t *
c,
size_t length,
1840 uint8_t *
t,
size_t tLen)
1857 if(tLen < 4 || tLen > 16)
1874 for(i = 0; i < ivLen; i +=
n)
1877 n =
MIN(ivLen - i, 16);
1903 for(i = 0; i < aLen; i +=
n)
1906 n =
MIN(aLen - i, 16);
1920 for(i = 0; i <
length; i +=
n)
1944 for(i = 0; i <
length; i +=
n)
1959 for(i = 0; i <
length; i +=
n)
2003 const uint8_t *
a,
size_t aLen,
const uint8_t *
c, uint8_t *
p,
size_t length,
2004 const uint8_t *
t,
size_t tLen)
2023 if(tLen < 4 || tLen > 16)
2040 for(i = 0; i < ivLen; i +=
n)
2043 n =
MIN(ivLen - i, 16);
2069 for(i = 0; i < aLen; i +=
n)
2072 n =
MIN(aLen - i, 16);
2080 for(i = 0; i <
length; i +=
n)
2097 for(i = 0; i <
length; i +=
n)
2121 for(i = 0; i <
length; i +=
n)
2150 for(
mask = 0,
n = 0;
n < tLen;
n++)
void aesProcessData(AesContext *context, uint8_t *iv, const uint8_t *input, uint8_t *output, size_t length, uint32_t opmode)
Perform AES encryption or decryption.
void aesEncryptBlock(AesContext *context, const uint8_t *input, uint8_t *output)
Encrypt a 16-byte block using AES algorithm.
void des3ProcessData(Des3Context *context, uint8_t *iv, const uint8_t *input, uint8_t *output, size_t length, uint32_t opmode)
Perform Triple DES encryption or decryption.
CipherAlgoDecryptBlock decryptBlock
#define CRPT_TDES_CTL_OPMODE_CFB
#define CRPT_AES_CTL_OPMODE_OFB
Collection of AEAD algorithms.
void gcmIncCounter(uint8_t *ctr)
Increment counter block.
void desEncryptBlock(DesContext *context, const uint8_t *input, uint8_t *output)
Encrypt a 8-byte block using DES algorithm.
error_t ctrEncrypt(const CipherAlgo *cipher, void *context, uint_t m, uint8_t *t, const uint8_t *p, uint8_t *c, size_t length)
CTR encryption.
error_t cbcEncrypt(const CipherAlgo *cipher, void *context, uint8_t *iv, const uint8_t *p, uint8_t *c, size_t length)
CBC encryption.
#define CRPT_TDES_CTL_OPMODE_OFB
#define CRPT_AES_CTL_OPMODE_CFB
CipherAlgoEncryptBlock encryptBlock
void aesLoadKey(AesContext *context)
Load AES key.
OsMutex nuc472CryptoMutex
@ ERROR_INVALID_PARAMETER
Invalid parameter.
void desProcessDataBlock(const uint8_t *input, uint8_t *output)
Encrypt/decrypt a 16-byte block using DES algorithm.
#define osMemcpy(dest, src, length)
__weak_func void gcmMul(GcmContext *context, uint8_t *x)
Multiplication operation in GF(2^128)
#define CRPT_AES_CTL_OPMODE_ECB
error_t des3Init(Des3Context *context, const uint8_t *key, size_t keyLen)
Initialize a Triple DES context using the supplied key.
@ ERROR_FAILURE
Generic error code.
#define CRPT_AES_CTL_KEYSZ_192B
@ ERROR_INVALID_KEY_LENGTH
General definitions for cryptographic algorithms.
void aesDecryptBlock(AesContext *context, const uint8_t *input, uint8_t *output)
Decrypt a 16-byte block using AES algorithm.
NUC472 cipher hardware accelerator.
void des3EncryptBlock(Des3Context *context, const uint8_t *input, uint8_t *output)
Encrypt a 8-byte block using Triple DES algorithm.
Block cipher modes of operation.
void desProcessData(DesContext *context, uint8_t *iv, const uint8_t *input, uint8_t *output, size_t length, uint32_t opmode)
Perform DES encryption or decryption.
void gcmIncBlock(uint8_t *ctr, uint32_t inc)
Increment counter block.
#define CRPT_TDES_CTL_OPMODE_CBC
void desDecryptBlock(DesContext *context, const uint8_t *input, uint8_t *output)
Decrypt a 8-byte block using DES algorithm.
const CipherAlgo * cipherAlgo
Cipher algorithm.
#define CRPT_AES_CTL_KEYSZ_256B
void aesProcessDataBlock(const uint8_t *input, uint8_t *output)
Encrypt/decrypt a 16-byte block using AES algorithm.
#define CRPT_TDES_CTL_OPMODE_CTR
#define CRPT_TDES_CTL_OPMODE_ECB
error_t desInit(DesContext *context, const uint8_t *key, size_t keyLen)
Initialize a DES context using the supplied key.
#define CRPT_AES_CTL_OPMODE_CTR
error_t gcmDecrypt(GcmContext *context, const uint8_t *iv, size_t ivLen, const uint8_t *a, size_t aLen, const uint8_t *c, uint8_t *p, size_t length, const uint8_t *t, size_t tLen)
Authenticated decryption using GCM.
Triple DES algorithm context.
error_t gcmEncrypt(GcmContext *context, const uint8_t *iv, size_t ivLen, const uint8_t *a, size_t aLen, const uint8_t *p, uint8_t *c, size_t length, uint8_t *t, size_t tLen)
Authenticated encryption using GCM.
void des3DecryptBlock(Des3Context *context, const uint8_t *input, uint8_t *output)
Decrypt a 8-byte block using Triple DES algorithm.
error_t aesInit(AesContext *context, const uint8_t *key, size_t keyLen)
Key expansion.
void osAcquireMutex(OsMutex *mutex)
Acquire ownership of the specified mutex object.
error_t ecbEncrypt(const CipherAlgo *cipher, void *context, const uint8_t *p, uint8_t *c, size_t length)
ECB encryption.
void osReleaseMutex(OsMutex *mutex)
Release ownership of the specified mutex object.
void gcmXorBlock(uint8_t *x, const uint8_t *a, const uint8_t *b, size_t n)
XOR operation.
error_t cfbEncrypt(const CipherAlgo *cipher, void *context, uint_t s, uint8_t *iv, const uint8_t *p, uint8_t *c, size_t length)
CFB encryption.
#define CRPT_AES_CTL_KEYSZ_128B
Common interface for encryption algorithms.
error_t cbcDecrypt(const CipherAlgo *cipher, void *context, uint8_t *iv, const uint8_t *c, uint8_t *p, size_t length)
CBC decryption.
error_t ecbDecrypt(const CipherAlgo *cipher, void *context, const uint8_t *c, uint8_t *p, size_t length)
ECB decryption.
error_t cfbDecrypt(const CipherAlgo *cipher, void *context, uint_t s, uint8_t *iv, const uint8_t *c, uint8_t *p, size_t length)
CFB decryption.
#define CRPT_AES_CTL_OPMODE_CBC
#define osMemset(p, value, length)
void * cipherContext
Cipher algorithm context.
void ctrIncBlock(uint8_t *ctr, uint32_t inc, size_t blockSize, size_t m)
Increment counter block.
NUC472 hardware cryptographic accelerator.
#define osMemmove(dest, src, length)
error_t ofbEncrypt(const CipherAlgo *cipher, void *context, uint_t s, uint8_t *iv, const uint8_t *p, uint8_t *c, size_t length)
OFB encryption.