STM32H533RE 硬件AES加密和解密(ECB模式)

bool halAESEncrypt(const uint8_t *key, const uint8_t *in, uint8_t *out)
{
uint32_t cr_value = 0;
uint8_t wait_timer = 0;

if (0 == LL_AHB2_GRP1_IsEnableClock(LL_AHB2_GRP1_PERIPH_AES))  
{  
    return false;  
}  

SET_BIT(AES->CR, AES_CR_IPRST);  // 重置AES  
CLEAR_BIT(AES->CR, AES_CR_IPRST);  

/* 设置秘钥长度,数据类型,加密算法和模式 */  
cr_value = (uint32_t)(CRYP_NO_SWAP | CRYP_KEYSIZE_128B | CRYP_AES_ECB | CRYP_KEYMODE_NORMAL);  
MODIFY_REG(AES->CR, AES_CR_KMOD | AES_CR_DATATYPE | AES_CR_KEYSIZE | AES_CR_CHMOD, cr_value);  
MODIFY_REG(AES->CR, AES_CR_MODE, CRYP_OPERATINGMODE_ENCRYPT);  

/* 设置秘钥 */  
for (uint32_t i = 0; i < (128 / 32); i++)  
{  
    *(uint32_t *)&AES->KEYR0 + i = *(uint32_t *)&key[i * 4];  
}  

/* 等待秘钥有效 */  
wait_timer = 100;  
while (READ_BIT(AES->SR, AES_SR_KEYVALID) == 0)  
{  
    halWdgReset();  
    if (--wait_timer == 0)  
    {  
        return false; // 密钥加载超时  
    }  
    halMcuWaitUs(1000);  
}  

/* 使能AES */  
SET_BIT(AES->CR, AES_CR_EN);  

/* 加密数据 */  
AES->DINR = *(uint32_t *)&in[0];  
AES->DINR = *(uint32_t *)&in[4];  
AES->DINR = *(uint32_t *)&in[8];  
AES->DINR = *(uint32_t *)&in[12];  

/* 等待加密完成 */  
wait_timer = 100;  
while (READ_BIT(AES->ISR, AES_ISR_CCF) == 0)  
{  
    halWdgReset();  
    if (--wait_timer == 0)  
    {  
        CLEAR_BIT(AES->CR, AES_CR_EN);  
        return false; // 加密超时  
    }  
    halMcuWaitUs(1000);  
}  

/* 清除CCF标志 */  
SET_BIT(AES->ICR, AES_ICR_CCF);  

/* 读出密文 */  
for (uint8_t i = 0; i < 4; i++)  
{  
    *(uint32_t *)&out[i * 4] = AES->DOUTR;  
}  

CLEAR_BIT(AES->CR, AES_CR_EN);  
return true;  

}

posted @ 2024-08-02 16:42  钢炮1  阅读(110)  评论(0)    收藏  举报