32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
35 #include "stm32l4xx.h"
36 #include "stm32l4xx_hal.h"
46 #if (STM32L4XX_CRYPTO_CIPHER_SUPPORT == ENABLED && AES_SUPPORT == ENABLED)
57 __HAL_RCC_AES_CLK_ENABLE();
75 temp = AES->CR & ~AES_CR_KEYSIZE;
118 uint8_t *output,
size_t length, uint32_t mode)
126 AES->CR = AES_CR_CCFC;
129 temp = AES->CR & ~(AES_CR_CHMOD | AES_CR_MODE);
130 AES->CR = temp | mode;
133 temp = AES->CR & ~AES_CR_DATATYPE;
157 AES->CR |= AES_CR_EN;
163 AES->DINR = __UNALIGNED_UINT32_READ(input);
164 AES->DINR = __UNALIGNED_UINT32_READ(input + 4);
165 AES->DINR = __UNALIGNED_UINT32_READ(input + 8);
166 AES->DINR = __UNALIGNED_UINT32_READ(input + 12);
169 while((AES->SR & AES_SR_CCF) == 0)
175 __UNALIGNED_UINT32_WRITE(output, temp);
177 __UNALIGNED_UINT32_WRITE(output + 4, temp);
179 __UNALIGNED_UINT32_WRITE(output + 8, temp);
181 __UNALIGNED_UINT32_WRITE(output + 12, temp);
184 AES->CR |= AES_CR_CCFC;
202 AES->DINR = buffer[0];
203 AES->DINR = buffer[1];
204 AES->DINR = buffer[2];
205 AES->DINR = buffer[3];
208 while((AES->SR & AES_SR_CCF) == 0)
213 buffer[0] = AES->DOUTR;
214 buffer[1] = AES->DOUTR;
215 buffer[2] = AES->DOUTR;
216 buffer[3] = AES->DOUTR;
219 AES->CR |= AES_CR_CCFC;
261 if(context == NULL || key == NULL)
270 else if(keyLen == 32)
285 for(i = 0; i < keyLen; i++)
291 AES->CR = AES_CR_CCFC;
294 temp = AES->CR & ~AES_CR_CHMOD;
301 AES->CR |= AES_CR_EN;
304 while((AES->SR & AES_SR_CCF) == 0)
309 AES->CR |= AES_CR_CCFC;
312 if(context->
nr == 10)
315 context->
dk[0] = AES->KEYR3;
316 context->
dk[1] = AES->KEYR2;
317 context->
dk[2] = AES->KEYR1;
318 context->
dk[3] = AES->KEYR0;
320 else if(context->
nr == 14)
323 context->
dk[0] = AES->KEYR7;
324 context->
dk[1] = AES->KEYR6;
325 context->
dk[2] = AES->KEYR5;
326 context->
dk[3] = AES->KEYR4;
327 context->
dk[4] = AES->KEYR3;
328 context->
dk[5] = AES->KEYR2;
329 context->
dk[6] = AES->KEYR1;
330 context->
dk[7] = AES->KEYR0;
373 #if (ECB_SUPPORT == ENABLED)
386 const uint8_t *
p, uint8_t *
c,
size_t length)
450 const uint8_t *
c, uint8_t *
p,
size_t length)
503 #if (CBC_SUPPORT == ENABLED)
517 uint8_t *
iv,
const uint8_t *
p, uint8_t *
c,
size_t length)
594 uint8_t *
iv,
const uint8_t *
c, uint8_t *
p,
size_t length)
662 #if (CTR_SUPPORT == ENABLED)
677 uint8_t *
t,
const uint8_t *
p, uint8_t *
c,
size_t length)
732 for(i = 0; i <
n; i++)
738 for(temp = 1, i = 1; i <=
m; i++)
764 #if (GCM_SUPPORT == ENABLED)
780 const uint8_t *
a,
size_t aLen,
const uint8_t *input, uint8_t *output,
781 size_t length, uint8_t *
t, uint32_t mode)
792 AES->CR = AES_CR_CCFC;
796 temp = AES->CR & ~AES_CR_CHMOD;
800 temp = AES->CR & ~AES_CR_DATATYPE;
805 temp = AES->CR & ~AES_CR_GCMPH;
809 temp = AES->CR & ~AES_CR_MODE;
810 AES->CR = temp | mode;
823 AES->CR |= AES_CR_EN;
827 while((AES->SR & AES_SR_CCF) == 0)
833 AES->CR |= AES_CR_CCFC;
836 temp = AES->CR & ~AES_CR_DATATYPE;
841 temp = AES->CR & ~AES_CR_GCMPH;
845 AES->CR |= AES_CR_EN;
851 AES->DINR = __UNALIGNED_UINT32_READ(
a);
852 AES->DINR = __UNALIGNED_UINT32_READ(
a + 4);
853 AES->DINR = __UNALIGNED_UINT32_READ(
a + 8);
854 AES->DINR = __UNALIGNED_UINT32_READ(
a + 12);
857 while((AES->SR & AES_SR_CCF) == 0)
862 AES->CR |= AES_CR_CCFC;
877 AES->DINR = buffer[0];
878 AES->DINR = buffer[1];
879 AES->DINR = buffer[2];
880 AES->DINR = buffer[3];
883 while((AES->SR & AES_SR_CCF) == 0)
888 AES->CR |= AES_CR_CCFC;
893 temp = AES->CR & ~AES_CR_GCMPH;
900 AES->DINR = __UNALIGNED_UINT32_READ(input);
901 AES->DINR = __UNALIGNED_UINT32_READ(input + 4);
902 AES->DINR = __UNALIGNED_UINT32_READ(input + 8);
903 AES->DINR = __UNALIGNED_UINT32_READ(input + 12);
906 while((AES->SR & AES_SR_CCF) == 0)
912 __UNALIGNED_UINT32_WRITE(output, temp);
914 __UNALIGNED_UINT32_WRITE(output + 4, temp);
916 __UNALIGNED_UINT32_WRITE(output + 8, temp);
918 __UNALIGNED_UINT32_WRITE(output + 12, temp);
921 AES->CR |= AES_CR_CCFC;
937 #if !defined(AES_CR_NPBLB)
943 temp = AES->CR & ~AES_CR_CHMOD;
948 temp = AES->CR & ~AES_CR_NPBLB;
953 AES->DINR = buffer[0];
954 AES->DINR = buffer[1];
955 AES->DINR = buffer[2];
956 AES->DINR = buffer[3];
959 while((AES->SR & AES_SR_CCF) == 0)
964 buffer[0] = AES->DOUTR;
965 buffer[1] = AES->DOUTR;
966 buffer[2] = AES->DOUTR;
967 buffer[3] = AES->DOUTR;
970 AES->CR |= AES_CR_CCFC;
976 #if !defined(AES_CR_NPBLB)
986 temp = AES->CR & ~AES_CR_CHMOD;
991 temp = AES->CR & ~AES_CR_GCMPH;
995 AES->DINR = buffer[0];
996 AES->DINR = buffer[1];
997 AES->DINR = buffer[2];
998 AES->DINR = buffer[3];
1001 while((AES->SR & AES_SR_CCF) == 0)
1009 buffer[0] = AES->DOUTR;
1010 buffer[1] = AES->DOUTR;
1011 buffer[2] = AES->DOUTR;
1012 buffer[3] = AES->DOUTR;
1015 AES->CR |= AES_CR_CCFC;
1022 temp = AES->CR & ~AES_CR_GCMPH;
1027 temp = AES->CR & ~AES_CR_MODE;
1030 #if !defined(AES_CR_NPBLB)
1053 while((AES->SR & AES_SR_CCF) == 0)
1060 __UNALIGNED_UINT32_WRITE(
t, temp);
1062 __UNALIGNED_UINT32_WRITE(
t + 4, temp);
1064 __UNALIGNED_UINT32_WRITE(
t + 8, temp);
1066 __UNALIGNED_UINT32_WRITE(
t + 12, temp);
1069 AES->CR |= AES_CR_CCFC;
1088 void *cipherContext)
1091 if(context == NULL || cipherContext == NULL)
1123 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
p,
1124 uint8_t *
c,
size_t length, uint8_t *
t,
size_t tLen)
1126 uint8_t authTag[16];
1137 if(tLen < 4 || tLen > 16)
1168 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c,
1169 uint8_t *
p,
size_t length,
const uint8_t *
t,
size_t tLen)
1173 uint8_t authTag[16];
1184 if(tLen < 4 || tLen > 16)
1192 for(
mask = 0, i = 0; i < tLen; i++)
1194 mask |= authTag[i] ^
t[i];
1202 #if (CCM_SUPPORT == ENABLED && defined(AES_CR_NPBLB))
1218 size_t aLen,
const uint8_t *input, uint8_t *output,
size_t length,
1219 uint8_t *
t, uint32_t mode)
1229 AES->CR = AES_CR_CCFC;
1233 temp = AES->CR & ~AES_CR_CHMOD;
1237 temp = AES->CR & ~AES_CR_DATATYPE;
1242 temp = AES->CR & ~AES_CR_GCMPH;
1248 temp = AES->CR & ~AES_CR_MODE;
1249 AES->CR = temp | mode;
1262 AES->CR |= AES_CR_EN;
1266 while((AES->SR & AES_SR_CCF) == 0)
1271 AES->CR |= AES_CR_CCFC;
1275 temp = AES->CR & ~AES_CR_GCMPH;
1279 AES->CR |= AES_CR_EN;
1295 n =
MIN(aLen, 16 - 2);
1309 n =
MIN(aLen, 16 - 6);
1321 while((AES->SR & AES_SR_CCF) == 0)
1326 AES->CR |= AES_CR_CCFC;
1337 AES->DINR = __UNALIGNED_UINT32_READ(
a);
1338 AES->DINR = __UNALIGNED_UINT32_READ(
a + 4);
1339 AES->DINR = __UNALIGNED_UINT32_READ(
a + 8);
1340 AES->DINR = __UNALIGNED_UINT32_READ(
a + 12);
1343 while((AES->SR & AES_SR_CCF) == 0)
1348 AES->CR |= AES_CR_CCFC;
1364 AES->DINR = __UNALIGNED_UINT32_READ(buffer);
1365 AES->DINR = __UNALIGNED_UINT32_READ(buffer + 4);
1366 AES->DINR = __UNALIGNED_UINT32_READ(buffer + 8);
1367 AES->DINR = __UNALIGNED_UINT32_READ(buffer + 12);
1370 while((AES->SR & AES_SR_CCF) == 0)
1375 AES->CR |= AES_CR_CCFC;
1380 temp = AES->CR & ~AES_CR_GCMPH;
1387 AES->DINR = __UNALIGNED_UINT32_READ(input);
1388 AES->DINR = __UNALIGNED_UINT32_READ(input + 4);
1389 AES->DINR = __UNALIGNED_UINT32_READ(input + 8);
1390 AES->DINR = __UNALIGNED_UINT32_READ(input + 12);
1393 while((AES->SR & AES_SR_CCF) == 0)
1399 __UNALIGNED_UINT32_WRITE(output, temp);
1401 __UNALIGNED_UINT32_WRITE(output + 4, temp);
1403 __UNALIGNED_UINT32_WRITE(output + 8, temp);
1405 __UNALIGNED_UINT32_WRITE(output + 12, temp);
1408 AES->CR |= AES_CR_CCFC;
1429 temp = AES->CR & ~AES_CR_NPBLB;
1434 AES->DINR = __UNALIGNED_UINT32_READ(buffer);
1435 AES->DINR = __UNALIGNED_UINT32_READ(buffer + 4);
1436 AES->DINR = __UNALIGNED_UINT32_READ(buffer + 8);
1437 AES->DINR = __UNALIGNED_UINT32_READ(buffer + 12);
1440 while((AES->SR & AES_SR_CCF) == 0)
1446 __UNALIGNED_UINT32_WRITE(buffer, temp);
1448 __UNALIGNED_UINT32_WRITE(buffer + 4, temp);
1450 __UNALIGNED_UINT32_WRITE(buffer + 8, temp);
1452 __UNALIGNED_UINT32_WRITE(buffer + 12, temp);
1455 AES->CR |= AES_CR_CCFC;
1464 temp = AES->CR & ~AES_CR_GCMPH;
1469 while((AES->SR & AES_SR_CCF) == 0)
1476 __UNALIGNED_UINT32_WRITE(
t, temp);
1478 __UNALIGNED_UINT32_WRITE(
t + 4, temp);
1480 __UNALIGNED_UINT32_WRITE(
t + 8, temp);
1482 __UNALIGNED_UINT32_WRITE(
t + 12, temp);
1485 AES->CR |= AES_CR_CCFC;
1512 size_t nLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
p, uint8_t *
c,
1513 size_t length, uint8_t *
t,
size_t tLen)
1517 uint8_t authTag[16];
1562 size_t nLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c, uint8_t *
p,
1563 size_t length,
const uint8_t *
t,
size_t tLen)
1569 uint8_t authTag[16];
1590 for(
mask = 0, i = 0; i < tLen; i++)
1592 mask |= authTag[i] ^
t[i];
error_t ccmFormatBlock0(size_t q, const uint8_t *n, size_t nLen, size_t aLen, size_t tLen, uint8_t *b)
Format first block B(0)
__weak_func error_t ccmDecrypt(const CipherAlgo *cipher, void *context, const uint8_t *n, size_t nLen, 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 CCM.
__weak_func error_t ccmEncrypt(const CipherAlgo *cipher, void *context, const uint8_t *n, size_t nLen, 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 CCM.
Collection of AEAD algorithms.
Block cipher modes of operation.
General definitions for cryptographic algorithms.
@ ERROR_INVALID_KEY_LENGTH
@ ERROR_FAILURE
Generic error code.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
#define osMemset(p, value, length)
#define osMemcpy(dest, src, length)
void osAcquireMutex(OsMutex *mutex)
Acquire ownership of the specified mutex object.
void osReleaseMutex(OsMutex *mutex)
Release ownership of the specified mutex object.
void ccmProcessData(AesContext *context, const uint8_t *b0, const uint8_t *a, size_t aLen, const uint8_t *input, uint8_t *output, size_t length, uint8_t *t, uint32_t mode)
Perform AES-CCM encryption or decryption.
#define AES_CR_MODE_ENCRYPTION
#define AES_CR_DATATYPE_8B
#define AES_CR_DATATYPE_32B
#define AES_CR_GCMPH_PAYLOAD
#define AES_CR_GCMPH_INIT
#define AES_CR_GCMPH_FINAL
#define AES_CR_GCMPH_HEADER
#define AES_CR_MODE_DECRYPTION
#define AES_CR_KEYSIZE_128B
#define AES_CR_MODE_KEY_DERIVATION
#define AES_CR_KEYSIZE_256B
#define AES_CR_CHMOD_GCM_GMAC
OsMutex stm32l4xxCryptoMutex
STM32L4 hardware cryptographic accelerator.
error_t aesInit(AesContext *context, const uint8_t *key, size_t keyLen)
Key expansion.
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.
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.
void aesProcessData(AesContext *context, uint8_t *iv, const uint8_t *input, uint8_t *output, size_t length, uint32_t mode)
Perform AES encryption or decryption.
void gcmProcessData(AesContext *context, const uint8_t *iv, const uint8_t *a, size_t aLen, const uint8_t *input, uint8_t *output, size_t length, uint8_t *t, uint32_t mode)
Perform AES-GCM encryption or decryption.
error_t cbcEncrypt(const CipherAlgo *cipher, void *context, uint8_t *iv, const uint8_t *p, uint8_t *c, size_t length)
CBC encryption.
void aesLoadKey(AesContext *context, const uint32_t *key)
Load AES key.
error_t crypInit(void)
CRYP module initialization.
error_t cbcDecrypt(const CipherAlgo *cipher, void *context, uint8_t *iv, const uint8_t *c, uint8_t *p, size_t length)
CBC decryption.
void aesDecryptBlock(AesContext *context, const uint8_t *input, uint8_t *output)
Decrypt a 16-byte block using AES algorithm.
void aesEncryptBlock(AesContext *context, const uint8_t *input, uint8_t *output)
Encrypt a 16-byte block using AES algorithm.
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.
error_t ecbEncrypt(const CipherAlgo *cipher, void *context, const uint8_t *p, uint8_t *c, size_t length)
ECB encryption.
error_t gcmInit(GcmContext *context, const CipherAlgo *cipherAlgo, void *cipherContext)
Initialize GCM context.
error_t ecbDecrypt(const CipherAlgo *cipher, void *context, const uint8_t *c, uint8_t *p, size_t length)
ECB decryption.
STM32L4 cipher hardware accelerator.
Common interface for encryption algorithms.
CipherAlgoEncryptBlock encryptBlock
CipherAlgoDecryptBlock decryptBlock
const CipherAlgo * cipherAlgo
Cipher algorithm.
void * cipherContext
Cipher algorithm context.