如何使用AES驱动
初始化
初始化AES HAL驱动的方法如下:
- 声明一个aes_handle_t句柄结构,例如:aes_handle_t aes_handle。
- 重写hal_aes_msp_init()以初始化AES底层资源。若要使用中断模式,则需通过调用相关的NVIC接口来配置:
- 调用hal_nvic_set_priority()配置AES中断优先级。
- 调用hal_nvic_enable_irq()使能AES中断。
- 配置aes_handle句柄的p_instance和init,包括AES外设实例、密钥长度、加解密块操作模式、密钥指针、CBC模式初始化向量、安全模式以及随机数种子。
- 调用hal_aes_init()初始化AES寄存器。
ECB加解密
ECB加解密支持轮询、中断两种计算模式。这两种模式的区别在于计算数据的加载方式和计算完成的判断方式:轮询模式需要循环检测完成状态,而中断模式则通过计算完成中断来实现。两种计算模式的具体使用方法如下:
轮询模式IO操作
- 使用hal_aes_ecb_encrypt()加密数据,hal_aes_ecb_decrypt()解密数据。
- 直至计算完成或超时返回。若返回错误,可调用hal_aes_get_error()查看错误代码;加解密数据较多时可重复步骤1。
中断模式IO操作
- 开发者可根据需要实现hal_aes_done_callback()、hal_aes_error_callback()和hal_aes_abort_cplt_callback()。
- 使用hal_aes_ecb_encrypt_it()加密数据,hal_aes_ecb_decrypt_it()解密数据。
- 计算完成时hal_aes_done_callback()会被调用,若计算出错,则hal_aes_error_callback()会被调用;加解密数据较多时可重复步骤2。
- 如需中止计算,则可调用hal_aes_abort()和hal_aes_abort_it()。hal_aes_abort()直接中止当前计算,hal_aes_abort_it()中止当前计算后会调用hal_aes_abort_cplt_callback()。
CBC加解密
CBC加解密支持轮询、中断两种计算模式,这两种模式的区别在于计算数据的加载方式和计算完成的判断方式:轮询模式需要循环检测完成状态,而中断模式则通过计算完成中断来实现。两种计算模式具体的使用方法如下:
轮询模式IO操作
- 重载初始化向量p_init_vector,并使用hal_aes_cbc_encrypt()加密数据,hal_aes_cbc_decrypt()解密数据。若数据流太长无法一次性加解密完成,则需将数据分段处理。对于非首段数据的处理,加密时p_init_vector为上一次的计算结果的最后16 bytes,解密时p_init_vector为上一次待解密数据的最后16 bytes。
- 直至计算完成或超时返回,若返回错误,可调用hal_aes_get_error()查看错误代码;加解密数据较多时可重复步骤1。
中断模式IO操作
- 开发者可根据需要实现hal_aes_done_callback()、hal_aes_error_callback()和hal_aes_abort_cplt_callback()。
- 重载初始化向量p_init_vector,并使用hal_aes_cbc_encrypt_it()加密数据,hal_aes_cbc_decrypt_it()解密数据。若数据流太长无法一次性加解密完成,则需将数据分段处理。对于非首段数据的处理,加密时p_init_vector为上一次的计算结果的最后16 bytes,解密时p_init_vector为上一次待解密数据的最后16 bytes。
- 计算完成时hal_aes_done_callback()会被调用,计算出错时hal_aes_error_callback()会被调用;加解密数据较多时可重复步骤2。
- 如需中止计算可调用hal_aes_abort()和hal_aes_abort_it()。hal_aes_abort()直接中止当前计算,hal_aes_abort_it()中止当前计算后会调用hal_aes_abort_cplt_callback()。