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;
}

浙公网安备 33010602011771号