32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
35 #include "stm32f4xx.h"
36 #include "stm32f4xx_hal.h"
46 #if (STM32F4XX_CRYPTO_CIPHER_SUPPORT == ENABLED)
57 __HAL_RCC_CRYP_CLK_ENABLE();
64 #if (DES_SUPPORT == ENABLED)
77 uint8_t *output,
size_t length, uint32_t mode)
90 CRYP->K1LR = context->
ks[0];
91 CRYP->K1RR = context->
ks[1];
102 CRYP->CR |= CRYP_CR_FFLUSH;
104 CRYP->CR |= CRYP_CR_CRYPEN;
110 while((CRYP->SR & CRYP_SR_IFNF) == 0)
115 CRYP->DIN = __UNALIGNED_UINT32_READ(input);
116 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 4);
119 while((CRYP->SR & CRYP_SR_OFNE) == 0)
125 __UNALIGNED_UINT32_WRITE(output, temp);
127 __UNALIGNED_UINT32_WRITE(output + 4, temp);
164 if(context == NULL || key == NULL)
210 #if (DES3_SUPPORT == ENABLED)
223 uint8_t *output,
size_t length, uint32_t mode)
236 CRYP->K1LR = context->
k1.
ks[0];
237 CRYP->K1RR = context->
k1.
ks[1];
238 CRYP->K2LR = context->
k2.
ks[0];
239 CRYP->K2RR = context->
k2.
ks[1];
240 CRYP->K3LR = context->
k3.
ks[0];
241 CRYP->K3RR = context->
k3.
ks[1];
252 CRYP->CR |= CRYP_CR_FFLUSH;
254 CRYP->CR |= CRYP_CR_CRYPEN;
260 while((CRYP->SR & CRYP_SR_IFNF) == 0)
265 CRYP->DIN = __UNALIGNED_UINT32_READ(input);
266 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 4);
269 while((CRYP->SR & CRYP_SR_OFNE) == 0)
275 __UNALIGNED_UINT32_WRITE(output, temp);
277 __UNALIGNED_UINT32_WRITE(output + 4, temp);
314 if(context == NULL || key == NULL)
329 else if(keyLen == 16)
341 else if(keyLen == 24)
393 #if (AES_SUPPORT == ENABLED)
405 temp = CRYP->CR & ~CRYP_CR_KEYSIZE;
408 if(context->
nr == 10)
414 CRYP->K2LR = context->
ek[0];
415 CRYP->K2RR = context->
ek[1];
416 CRYP->K3LR = context->
ek[2];
417 CRYP->K3RR = context->
ek[3];
419 else if(context->
nr == 12)
425 CRYP->K1LR = context->
ek[0];
426 CRYP->K1RR = context->
ek[1];
427 CRYP->K2LR = context->
ek[2];
428 CRYP->K2RR = context->
ek[3];
429 CRYP->K3LR = context->
ek[4];
430 CRYP->K3RR = context->
ek[5];
438 CRYP->K0LR = context->
ek[0];
439 CRYP->K0RR = context->
ek[1];
440 CRYP->K1LR = context->
ek[2];
441 CRYP->K1RR = context->
ek[3];
442 CRYP->K2LR = context->
ek[4];
443 CRYP->K2RR = context->
ek[5];
444 CRYP->K3LR = context->
ek[6];
445 CRYP->K3RR = context->
ek[7];
461 uint8_t *output,
size_t length, uint32_t mode)
472 if((mode & CRYP_CR_ALGODIR) != 0)
479 CRYP->CR |= CRYP_CR_CRYPEN;
482 while((CRYP->SR & CRYP_SR_BUSY) != 0)
487 temp = CRYP->CR & ~CRYP_CR_ALGOMODE;
488 CRYP->CR = temp | mode;
509 CRYP->CR |= CRYP_CR_FFLUSH;
511 CRYP->CR |= CRYP_CR_CRYPEN;
517 while((CRYP->SR & CRYP_SR_IFNF) == 0)
522 CRYP->DIN = __UNALIGNED_UINT32_READ(input);
523 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 4);
524 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 8);
525 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 12);
528 while((CRYP->SR & CRYP_SR_OFNE) == 0)
534 __UNALIGNED_UINT32_WRITE(output, temp);
536 __UNALIGNED_UINT32_WRITE(output + 4, temp);
538 __UNALIGNED_UINT32_WRITE(output + 8, temp);
540 __UNALIGNED_UINT32_WRITE(output + 12, temp);
558 while((CRYP->SR & CRYP_SR_IFNF) == 0)
563 CRYP->DIN = buffer[0];
564 CRYP->DIN = buffer[1];
565 CRYP->DIN = buffer[2];
566 CRYP->DIN = buffer[3];
569 while((CRYP->SR & CRYP_SR_OFNE) == 0)
574 buffer[0] = CRYP->DOUT;
575 buffer[1] = CRYP->DOUT;
576 buffer[2] = CRYP->DOUT;
577 buffer[3] = CRYP->DOUT;
618 if(context == NULL || key == NULL)
627 else if(keyLen == 24)
632 else if(keyLen == 32)
647 for(i = 0; i < keyLen; i++)
687 #if (ECB_SUPPORT == ENABLED)
700 const uint8_t *
p, uint8_t *
c,
size_t length)
707 #if (DES_SUPPORT == ENABLED)
729 #if (DES3_SUPPORT == ENABLED)
751 #if (AES_SUPPORT == ENABLED)
810 const uint8_t *
c, uint8_t *
p,
size_t length)
817 #if (DES_SUPPORT == ENABLED)
840 #if (DES3_SUPPORT == ENABLED)
863 #if (AES_SUPPORT == ENABLED)
912 #if (CBC_SUPPORT == ENABLED)
926 uint8_t *
iv,
const uint8_t *
p, uint8_t *
c,
size_t length)
933 #if (DES_SUPPORT == ENABLED)
955 #if (DES3_SUPPORT == ENABLED)
977 #if (AES_SUPPORT == ENABLED)
1009 c[i] =
p[i] ^
iv[i];
1049 uint8_t *
iv,
const uint8_t *
c, uint8_t *
p,
size_t length)
1056 #if (DES_SUPPORT == ENABLED)
1079 #if (DES3_SUPPORT == ENABLED)
1102 #if (AES_SUPPORT == ENABLED)
1166 #if (CTR_SUPPORT == ENABLED && AES_SUPPORT == ENABLED)
1181 uint8_t *
t,
const uint8_t *
p, uint8_t *
c,
size_t length)
1240 for(i = 0; i <
n; i++)
1266 #if (GCM_SUPPORT == ENABLED && AES_SUPPORT == ENABLED && \
1267 defined(CRYP_CR_ALGOMODE_AES_GCM))
1283 const uint8_t *
a,
size_t aLen,
const uint8_t *input, uint8_t *output,
1284 size_t length, uint8_t *
t, uint32_t mode)
1299 temp = CRYP->CR & ~CRYP_CR_ALGOMODE;
1303 temp = CRYP->CR & ~CRYP_CR_GCM_CCMPH;
1316 CRYP->CR |= CRYP_CR_CRYPEN;
1320 while((CRYP->CR & CRYP_CR_CRYPEN) != 0)
1325 temp = CRYP->CR & ~CRYP_CR_GCM_CCMPH;
1329 CRYP->CR |= CRYP_CR_FFLUSH;
1331 CRYP->CR |= CRYP_CR_CRYPEN;
1337 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1342 CRYP->DIN = __UNALIGNED_UINT32_READ(
a);
1343 CRYP->DIN = __UNALIGNED_UINT32_READ(
a + 4);
1344 CRYP->DIN = __UNALIGNED_UINT32_READ(
a + 8);
1345 CRYP->DIN = __UNALIGNED_UINT32_READ(
a + 12);
1359 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1364 CRYP->DIN = buffer[0];
1365 CRYP->DIN = buffer[1];
1366 CRYP->DIN = buffer[2];
1367 CRYP->DIN = buffer[3];
1372 while((CRYP->SR & CRYP_SR_BUSY) != 0)
1377 CRYP->CR &= ~CRYP_CR_CRYPEN;
1380 temp = CRYP->CR & ~CRYP_CR_GCM_CCMPH;
1384 temp = CRYP->CR & ~CRYP_CR_ALGODIR;
1388 CRYP->CR |= CRYP_CR_CRYPEN;
1394 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1399 CRYP->DIN = __UNALIGNED_UINT32_READ(input);
1400 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 4);
1401 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 8);
1402 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 12);
1405 while((CRYP->SR & CRYP_SR_OFNE) == 0)
1411 __UNALIGNED_UINT32_WRITE(output, temp);
1413 __UNALIGNED_UINT32_WRITE(output + 4, temp);
1415 __UNALIGNED_UINT32_WRITE(output + 8, temp);
1417 __UNALIGNED_UINT32_WRITE(output + 12, temp);
1432 if((mode & CRYP_CR_ALGODIR) == 0)
1435 while((CRYP->SR & CRYP_SR_BUSY) != 0)
1440 h[0] = CRYP->CSGCM0R;
1441 h[1] = CRYP->CSGCM1R;
1442 h[2] = CRYP->CSGCM2R;
1443 h[3] = CRYP->CSGCM3R;
1447 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1452 CRYP->DIN = buffer[0];
1453 CRYP->DIN = buffer[1];
1454 CRYP->DIN = buffer[2];
1455 CRYP->DIN = buffer[3];
1458 while((CRYP->SR & CRYP_SR_OFNE) == 0)
1463 buffer[0] = CRYP->DOUT;
1464 buffer[1] = CRYP->DOUT;
1465 buffer[2] = CRYP->DOUT;
1466 buffer[3] = CRYP->DOUT;
1472 if((mode & CRYP_CR_ALGODIR) == 0)
1478 while((CRYP->SR & CRYP_SR_BUSY) != 0)
1483 CRYP->CR |= CRYP_CR_ALGODIR;
1486 CRYP->CSGCM0R =
h[0];
1487 CRYP->CSGCM1R =
h[1];
1488 CRYP->CSGCM2R =
h[2];
1489 CRYP->CSGCM3R =
h[3];
1492 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1497 CRYP->DIN = buffer[0];
1498 CRYP->DIN = buffer[1];
1499 CRYP->DIN = buffer[2];
1500 CRYP->DIN = buffer[3];
1503 while((CRYP->SR & CRYP_SR_OFNE) == 0)
1508 buffer[0] = CRYP->DOUT;
1509 buffer[1] = CRYP->DOUT;
1510 buffer[2] = CRYP->DOUT;
1511 buffer[3] = CRYP->DOUT;
1517 while((CRYP->SR & CRYP_SR_BUSY) != 0)
1522 temp = CRYP->CR & ~CRYP_CR_GCM_CCMPH;
1536 while((CRYP->SR & CRYP_SR_OFNE) == 0)
1543 __UNALIGNED_UINT32_WRITE(
t, temp);
1545 __UNALIGNED_UINT32_WRITE(
t + 4, temp);
1547 __UNALIGNED_UINT32_WRITE(
t + 8, temp);
1549 __UNALIGNED_UINT32_WRITE(
t + 12, temp);
1568 void *cipherContext)
1571 if(context == NULL || cipherContext == NULL)
1603 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
p,
1604 uint8_t *
c,
size_t length, uint8_t *
t,
size_t tLen)
1606 uint8_t authTag[16];
1617 if(tLen < 4 || tLen > 16)
1648 size_t ivLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c,
1649 uint8_t *
p,
size_t length,
const uint8_t *
t,
size_t tLen)
1653 uint8_t authTag[16];
1664 if(tLen < 4 || tLen > 16)
1669 authTag, CRYP_CR_ALGODIR);
1672 for(
mask = 0, i = 0; i < tLen; i++)
1674 mask |= authTag[i] ^
t[i];
1682 #if (CCM_SUPPORT == ENABLED && AES_SUPPORT == ENABLED && \
1683 defined(CRYP_CR_ALGOMODE_AES_CCM))
1699 size_t aLen,
const uint8_t *input, uint8_t *output,
size_t length,
1700 uint8_t *
t, uint32_t mode)
1715 temp = CRYP->CR & ~CRYP_CR_ALGOMODE;
1719 temp = CRYP->CR & ~CRYP_CR_GCM_CCMPH;
1726 qLen = (b0[0] & 0x07) + 1;
1730 osMemset(buffer + 16 - qLen, 0, qLen);
1733 buffer[0] = (uint8_t) (qLen - 1);
1739 CRYP->IV0RR =
LOAD32BE(buffer + 4);
1740 CRYP->IV1LR =
LOAD32BE(buffer + 8);
1741 CRYP->IV1RR =
LOAD32BE(buffer + 12);
1744 CRYP->CR |= CRYP_CR_CRYPEN;
1747 CRYP->DIN = __UNALIGNED_UINT32_READ(b0);
1748 CRYP->DIN = __UNALIGNED_UINT32_READ(b0 + 4);
1749 CRYP->DIN = __UNALIGNED_UINT32_READ(b0 + 8);
1750 CRYP->DIN = __UNALIGNED_UINT32_READ(b0 + 12);
1754 while((CRYP->CR & CRYP_CR_CRYPEN) != 0)
1759 temp = CRYP->CR & ~CRYP_CR_GCM_CCMPH;
1763 CRYP->CR |= CRYP_CR_FFLUSH;
1765 CRYP->CR |= CRYP_CR_CRYPEN;
1781 n =
MIN(aLen, 16 - 2);
1795 n =
MIN(aLen, 16 - 6);
1801 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1806 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer);
1807 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 4);
1808 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 8);
1809 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 12);
1820 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1825 CRYP->DIN = __UNALIGNED_UINT32_READ(
a);
1826 CRYP->DIN = __UNALIGNED_UINT32_READ(
a + 4);
1827 CRYP->DIN = __UNALIGNED_UINT32_READ(
a + 8);
1828 CRYP->DIN = __UNALIGNED_UINT32_READ(
a + 12);
1844 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1849 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer);
1850 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 4);
1851 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 8);
1852 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 12);
1857 while((CRYP->SR & CRYP_SR_BUSY) != 0)
1862 CRYP->CR &= ~CRYP_CR_CRYPEN;
1865 temp = CRYP->CR & ~CRYP_CR_GCM_CCMPH;
1869 temp = CRYP->CR & ~CRYP_CR_ALGODIR;
1873 CRYP->CR |= CRYP_CR_CRYPEN;
1879 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1884 CRYP->DIN = __UNALIGNED_UINT32_READ(input);
1885 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 4);
1886 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 8);
1887 CRYP->DIN = __UNALIGNED_UINT32_READ(input + 12);
1890 while((CRYP->SR & CRYP_SR_OFNE) == 0)
1896 __UNALIGNED_UINT32_WRITE(output, temp);
1898 __UNALIGNED_UINT32_WRITE(output + 4, temp);
1900 __UNALIGNED_UINT32_WRITE(output + 8, temp);
1902 __UNALIGNED_UINT32_WRITE(output + 12, temp);
1920 if((mode & CRYP_CR_ALGODIR) != 0)
1923 while((CRYP->SR & CRYP_SR_BUSY) != 0)
1928 y[0] = CRYP->CSGCMCCM0R;
1929 y[1] = CRYP->CSGCMCCM1R;
1930 y[2] = CRYP->CSGCMCCM2R;
1931 y[3] = CRYP->CSGCMCCM3R;
1935 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1940 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer);
1941 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 4);
1942 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 8);
1943 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 12);
1946 while((CRYP->SR & CRYP_SR_OFNE) == 0)
1952 __UNALIGNED_UINT32_WRITE(buffer, temp);
1954 __UNALIGNED_UINT32_WRITE(buffer + 4, temp);
1956 __UNALIGNED_UINT32_WRITE(buffer + 8, temp);
1958 __UNALIGNED_UINT32_WRITE(buffer + 12, temp);
1965 if((mode & CRYP_CR_ALGODIR) != 0)
1971 while((CRYP->SR & CRYP_SR_BUSY) != 0)
1976 CRYP->CR &= ~CRYP_CR_ALGODIR;
1979 CRYP->CSGCMCCM0R = y[0];
1980 CRYP->CSGCMCCM1R = y[1];
1981 CRYP->CSGCMCCM2R = y[2];
1982 CRYP->CSGCMCCM3R = y[3];
1985 while((CRYP->SR & CRYP_SR_IFNF) == 0)
1990 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer);
1991 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 4);
1992 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 8);
1993 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 12);
1996 while((CRYP->SR & CRYP_SR_OFNE) == 0)
2010 while((CRYP->SR & CRYP_SR_BUSY) != 0)
2016 temp = CRYP->CR & ~(CRYP_CR_GCM_CCMPH | CRYP_CR_ALGODIR);
2021 osMemset(buffer + 16 - qLen, 0, qLen);
2024 buffer[0] = (uint8_t) (qLen - 1);
2027 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer);
2028 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 4);
2029 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 8);
2030 CRYP->DIN = __UNALIGNED_UINT32_READ(buffer + 12);
2033 while((CRYP->SR & CRYP_SR_OFNE) == 0)
2040 __UNALIGNED_UINT32_WRITE(
t, temp);
2042 __UNALIGNED_UINT32_WRITE(
t + 4, temp);
2044 __UNALIGNED_UINT32_WRITE(
t + 8, temp);
2046 __UNALIGNED_UINT32_WRITE(
t + 12, temp);
2073 size_t nLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
p, uint8_t *
c,
2074 size_t length, uint8_t *
t,
size_t tLen)
2078 uint8_t authTag[16];
2122 size_t nLen,
const uint8_t *
a,
size_t aLen,
const uint8_t *
c, uint8_t *
p,
2123 size_t length,
const uint8_t *
t,
size_t tLen)
2129 uint8_t authTag[16];
2149 for(
mask = 0, i = 0; i < tLen; i++)
2151 mask |= authTag[i] ^
t[i];