Go to the documentation of this file.
   32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL 
   35 #include "stm32mp2xx.h" 
   36 #include "stm32mp2xx_hal.h" 
   46 #if (STM32MP2XX_CRYPTO_CIPHER_SUPPORT == ENABLED) 
   57    __HAL_RCC_CRYP1_CLK_ENABLE();
 
   64 #if (DES_SUPPORT == ENABLED) 
   77    uint8_t *output, 
size_t length, uint32_t mode)
 
   90    CRYP1->K1LR = context->
ks[0];
 
   91    CRYP1->K1RR = context->
ks[1];
 
  102    CRYP1->CR |= CRYP_CR_FFLUSH;
 
  104    CRYP1->CR |= CRYP_CR_CRYPEN;
 
  110       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
  119       while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
  164    if(context == NULL || key == NULL)
 
  210 #if (DES3_SUPPORT == ENABLED) 
  223    uint8_t *output, 
size_t length, uint32_t mode)
 
  236    CRYP1->K1LR = context->
k1.
ks[0];
 
  237    CRYP1->K1RR = context->
k1.
ks[1];
 
  238    CRYP1->K2LR = context->
k2.
ks[0];
 
  239    CRYP1->K2RR = context->
k2.
ks[1];
 
  240    CRYP1->K3LR = context->
k3.
ks[0];
 
  241    CRYP1->K3RR = context->
k3.
ks[1];
 
  252    CRYP1->CR |= CRYP_CR_FFLUSH;
 
  254    CRYP1->CR |= CRYP_CR_CRYPEN;
 
  260       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
  269       while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
  314    if(context == NULL || key == NULL)
 
  329    else if(keyLen == 16)
 
  341    else if(keyLen == 24)
 
  393 #if (AES_SUPPORT == ENABLED) 
  405    temp = CRYP1->CR & ~CRYP_CR_KEYSIZE;
 
  408    if(context->
nr == 10)
 
  414       CRYP1->K2LR = context->
ek[0];
 
  415       CRYP1->K2RR = context->
ek[1];
 
  416       CRYP1->K3LR = context->
ek[2];
 
  417       CRYP1->K3RR = context->
ek[3];
 
  419    else if(context->
nr == 12)
 
  425       CRYP1->K1LR = context->
ek[0];
 
  426       CRYP1->K1RR = context->
ek[1];
 
  427       CRYP1->K2LR = context->
ek[2];
 
  428       CRYP1->K2RR = context->
ek[3];
 
  429       CRYP1->K3LR = context->
ek[4];
 
  430       CRYP1->K3RR = context->
ek[5];
 
  438       CRYP1->K0LR = context->
ek[0];
 
  439       CRYP1->K0RR = context->
ek[1];
 
  440       CRYP1->K1LR = context->
ek[2];
 
  441       CRYP1->K1RR = context->
ek[3];
 
  442       CRYP1->K2LR = context->
ek[4];
 
  443       CRYP1->K2RR = context->
ek[5];
 
  444       CRYP1->K3LR = context->
ek[6];
 
  445       CRYP1->K3RR = context->
ek[7];
 
  461    uint8_t *output, 
size_t length, uint32_t mode)
 
  472    if((mode & CRYP_CR_ALGODIR) != 0)
 
  479       CRYP1->CR |= CRYP_CR_CRYPEN;
 
  482       while((CRYP1->SR & CRYP_SR_BUSY) != 0)
 
  487       temp = CRYP1->CR & ~CRYP_CR_ALGOMODE;
 
  488       CRYP1->CR = temp | mode;
 
  509    CRYP1->CR |= CRYP_CR_FFLUSH;
 
  511    CRYP1->CR |= CRYP_CR_CRYPEN;
 
  517       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
  528       while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
  558       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
  563       CRYP1->DIN = buffer[0];
 
  564       CRYP1->DIN = buffer[1];
 
  565       CRYP1->DIN = buffer[2];
 
  566       CRYP1->DIN = buffer[3];
 
  569       while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
  574       buffer[0] = CRYP1->DOUT;
 
  575       buffer[1] = CRYP1->DOUT;
 
  576       buffer[2] = CRYP1->DOUT;
 
  577       buffer[3] = CRYP1->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) 
 1282    const uint8_t *
a, 
size_t aLen, 
const uint8_t *input, uint8_t *output,
 
 1283    size_t length, uint8_t *
t, uint32_t mode)
 
 1297    temp = CRYP1->CR & ~CRYP_CR_ALGOMODE;
 
 1301    temp = CRYP1->CR & ~CRYP_CR_GCM_CCMPH;
 
 1314    CRYP1->CR |= CRYP_CR_CRYPEN;
 
 1318    while((CRYP1->CR & CRYP_CR_CRYPEN) != 0)
 
 1323    temp = CRYP1->CR & ~CRYP_CR_GCM_CCMPH;
 
 1327    CRYP1->CR |= CRYP_CR_FFLUSH;
 
 1329    CRYP1->CR |= CRYP_CR_CRYPEN;
 
 1335       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1357       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1362       CRYP1->DIN = buffer[0];
 
 1363       CRYP1->DIN = buffer[1];
 
 1364       CRYP1->DIN = buffer[2];
 
 1365       CRYP1->DIN = buffer[3];
 
 1370    while((CRYP1->SR & CRYP_SR_BUSY) != 0)
 
 1375    CRYP1->CR &= ~CRYP_CR_CRYPEN;
 
 1378    temp = CRYP1->CR & ~CRYP_CR_GCM_CCMPH;
 
 1382    temp = CRYP1->CR & ~CRYP_CR_ALGODIR;
 
 1386    CRYP1->CR |= CRYP_CR_CRYPEN;
 
 1392       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1403       while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
 1430       temp = CRYP1->CR & ~CRYP_CR_NPBLB;
 
 1434       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1439       CRYP1->DIN = buffer[0];
 
 1440       CRYP1->DIN = buffer[1];
 
 1441       CRYP1->DIN = buffer[2];
 
 1442       CRYP1->DIN = buffer[3];
 
 1445       while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
 1450       buffer[0] = CRYP1->DOUT;
 
 1451       buffer[1] = CRYP1->DOUT;
 
 1452       buffer[2] = CRYP1->DOUT;
 
 1453       buffer[3] = CRYP1->DOUT;
 
 1461    while((CRYP1->SR & CRYP_SR_BUSY) != 0)
 
 1466    temp = CRYP1->CR & ~CRYP_CR_GCM_CCMPH;
 
 1480    while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
 1512    void *cipherContext)
 
 1515    if(context == NULL || cipherContext == NULL)
 
 1547    size_t ivLen, 
const uint8_t *
a, 
size_t aLen, 
const uint8_t *
p,
 
 1548    uint8_t *
c, 
size_t length, uint8_t *
t, 
size_t tLen)
 
 1550    uint8_t authTag[16];
 
 1561    if(tLen < 4 || tLen > 16)
 
 1592    size_t ivLen, 
const uint8_t *
a, 
size_t aLen, 
const uint8_t *
c,
 
 1593    uint8_t *
p, 
size_t length, 
const uint8_t *
t, 
size_t tLen)
 
 1597    uint8_t authTag[16];
 
 1608    if(tLen < 4 || tLen > 16)
 
 1613       authTag, CRYP_CR_ALGODIR);
 
 1616    for(
mask = 0, i = 0; i < tLen; i++)
 
 1618       mask |= authTag[i] ^ 
t[i];
 
 1626 #if (CCM_SUPPORT == ENABLED && AES_SUPPORT == ENABLED) 
 1642    size_t aLen, 
const uint8_t *input, uint8_t *output, 
size_t length,
 
 1643    uint8_t *
t, uint32_t mode)
 
 1657    temp = CRYP1->CR & ~CRYP_CR_ALGOMODE;
 
 1661    temp = CRYP1->CR & ~CRYP_CR_GCM_CCMPH;
 
 1668    qLen = (b0[0] & 0x07) + 1;
 
 1672    osMemset(buffer + 16 - qLen, 0, qLen);
 
 1675    buffer[0] = (uint8_t) (qLen - 1);
 
 1681    CRYP1->IV0RR = 
LOAD32BE(buffer + 4);
 
 1682    CRYP1->IV1LR = 
LOAD32BE(buffer + 8);
 
 1683    CRYP1->IV1RR = 
LOAD32BE(buffer + 12);
 
 1686    CRYP1->CR |= CRYP_CR_CRYPEN;
 
 1696    while((CRYP1->CR & CRYP_CR_CRYPEN) != 0)
 
 1701    temp = CRYP1->CR & ~CRYP_CR_GCM_CCMPH;
 
 1705    CRYP1->CR |= CRYP_CR_FFLUSH;
 
 1707    CRYP1->CR |= CRYP_CR_CRYPEN;
 
 1723          n = 
MIN(aLen, 16 - 2);
 
 1737          n = 
MIN(aLen, 16 - 6);
 
 1743       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1751       CRYP1->DIN = 
LOAD32LE(buffer + 12);
 
 1762       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1786       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1794       CRYP1->DIN = 
LOAD32LE(buffer + 12);
 
 1799    while((CRYP1->SR & CRYP_SR_BUSY) != 0)
 
 1804    CRYP1->CR &= ~CRYP_CR_CRYPEN;
 
 1807    temp = CRYP1->CR & ~CRYP_CR_GCM_CCMPH;
 
 1811    temp = CRYP1->CR & ~CRYP_CR_ALGODIR;
 
 1815    CRYP1->CR |= CRYP_CR_CRYPEN;
 
 1821       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1832       while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
 1862       temp = CRYP1->CR & ~CRYP_CR_NPBLB;
 
 1866       while((CRYP1->SR & CRYP_SR_IFNF) == 0)
 
 1874       CRYP1->DIN = 
LOAD32LE(buffer + 12);
 
 1877       while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
 1898    while((CRYP1->SR & CRYP_SR_BUSY) != 0)
 
 1904    temp = CRYP1->CR & ~(CRYP_CR_GCM_CCMPH | CRYP_CR_ALGODIR);
 
 1909    osMemset(buffer + 16 - qLen, 0, qLen);
 
 1912    buffer[0] = (uint8_t) (qLen - 1);
 
 1918    CRYP1->DIN = 
LOAD32BE(buffer + 12);
 
 1921    while((CRYP1->SR & CRYP_SR_OFNE) == 0)
 
 1961    size_t nLen, 
const uint8_t *
a, 
size_t aLen, 
const uint8_t *
p, uint8_t *
c,
 
 1962    size_t length, uint8_t *
t, 
size_t tLen)
 
 1966    uint8_t authTag[16];
 
 2010    size_t nLen, 
const uint8_t *
a, 
size_t aLen, 
const uint8_t *
c, uint8_t *
p,
 
 2011    size_t length, 
const uint8_t *
t, 
size_t tLen)
 
 2017    uint8_t authTag[16];
 
 2037    for(
mask = 0, i = 0; i < tLen; i++)
 
 2039       mask |= authTag[i] ^ 
t[i];
 
  
error_t desInit(DesContext *context, const uint8_t *key, size_t keyLen)
Initialize a DES context using the supplied key.
void des3EncryptBlock(Des3Context *context, const uint8_t *input, uint8_t *output)
Encrypt a 8-byte block using Triple DES algorithm.
CipherAlgoDecryptBlock decryptBlock
Collection of AEAD algorithms.
#define CRYP_CR_ALGOMODE_DES_ECB
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.
#define CRYP_CR_GCM_CCMPH_INIT
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.
#define CRYP_CR_GCM_CCMPH_PAYLOAD
#define CRYP_CR_KEYSIZE_128B
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.
#define CRYP_CR_DATATYPE_8B
#define CRYP_CR_ALGOMODE_AES_ECB
CipherAlgoEncryptBlock encryptBlock
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.
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.
STM32MP2 cipher hardware accelerator.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
#define osMemcpy(dest, src, length)
#define CRYP_CR_GCM_CCMPH_FINAL
void desProcessData(DesContext *context, uint8_t *iv, const uint8_t *input, uint8_t *output, size_t length, uint32_t mode)
Perform DES encryption or decryption.
void des3DecryptBlock(Des3Context *context, const uint8_t *input, uint8_t *output)
Decrypt a 8-byte block using Triple DES algorithm.
@ ERROR_FAILURE
Generic error code.
#define CRYP_CR_ALGOMODE_AES_CCM
#define CRYP_CR_ALGOMODE_AES_CBC
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 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)
error_t gcmInit(GcmContext *context, const CipherAlgo *cipherAlgo, void *cipherContext)
Initialize GCM context.
error_t aesInit(AesContext *context, const uint8_t *key, size_t keyLen)
Key expansion.
#define CRYP_CR_GCM_CCMPH_HEADER
void aesEncryptBlock(AesContext *context, const uint8_t *input, uint8_t *output)
Encrypt a 16-byte block using AES algorithm.
@ ERROR_INVALID_KEY_LENGTH
General definitions for cryptographic algorithms.
#define CRYP_CR_ALGOMODE_TDES_ECB
Block cipher modes of operation.
STM32MP2 hardware cryptographic accelerator.
const CipherAlgo * cipherAlgo
Cipher algorithm.
void aesDecryptBlock(AesContext *context, const uint8_t *input, uint8_t *output)
Decrypt a 16-byte block using AES algorithm.
error_t des3Init(Des3Context *context, const uint8_t *key, size_t keyLen)
Initialize a Triple DES context using the supplied key.
void desDecryptBlock(DesContext *context, const uint8_t *input, uint8_t *output)
Decrypt a 8-byte block using DES algorithm.
#define CRYP_CR_ALGOMODE_AES_CTR
Triple DES algorithm context.
#define CRYP_CR_ALGOMODE_DES_CBC
#define CRYP_CR_KEYSIZE_256B
error_t crypInit(void)
CRYP module initialization.
void osAcquireMutex(OsMutex *mutex)
Acquire ownership of the specified mutex object.
OsMutex stm32mp2xxCryptoMutex
void osReleaseMutex(OsMutex *mutex)
Release 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.
#define CRYP_CR_ALGOMODE_AES_GCM
Common interface for encryption algorithms.
error_t cbcEncrypt(const CipherAlgo *cipher, void *context, uint8_t *iv, const uint8_t *p, uint8_t *c, size_t length)
CBC encryption.
#define CRYP_CR_ALGOMODE_TDES_CBC
void aesLoadKey(AesContext *context)
Load AES key.
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.
#define osMemset(p, value, length)
void * cipherContext
Cipher algorithm context.
#define CRYP_CR_ALGOMODE_AES_KEY
void ctrIncBlock(uint8_t *ctr, uint32_t inc, size_t blockSize, size_t m)
Increment counter block.
void des3ProcessData(Des3Context *context, uint8_t *iv, const uint8_t *input, uint8_t *output, size_t length, uint32_t mode)
Perform Triple DES encryption or decryption.
void desEncryptBlock(DesContext *context, const uint8_t *input, uint8_t *output)
Encrypt a 8-byte block using DES algorithm.
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.
#define CRYP_CR_KEYSIZE_192B
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.