AES 引擎
AES 引擎根据由 NIST 定义的高级加密标准(AES)对数据进行加密或解密,支持消息自动填充。可以使用软件寄存器密钥和硬件 OTP 密钥。它包含针对侧信道攻击(SCA)的保护。 支持 DMA 模式和从设备模式。硬件加解密不仅减少软件开销,还可以降低 CPU 和内存资源消耗,并且比软件更快更安全。 引擎算法已通过 NIST CAVP 认证。
AES 算法支持
支持的密钥大小:AES-128,AES-192,AES-256 支持的加解密模式:
ECB (Electronic Codebook)
CBC (Cipher Block Chaining)
OFB (Output Feedback)
CFB (Cipher Feedback)
CTR (Counter)
GCM (Galois/Counter)
GMAC (Galois Message Authentication Code)
CMAC (Cipher Block Chaining-Message Authentication Code)
XTS (XEX-based Tweaked CodeBook mode with CipherText Stealing)
支持的消息认证码:
GMAC (Galois Message Authentication Code)
CMAC (Cipher Block Chaining-Message Authentication Code)
AES 密钥
AES 引擎配备独立的密钥管理单元。密钥管理单元支持软件密钥和 OTP 硬件密钥。
6 个 Secure OTP 密钥:OTP 密钥烧录后可以使能读写保护。保护使能后,软件无法读写只能硬件使用。默认情况下只能 Secure 状态下使用这些 OTP key。若需 Non-Secure 状态使用某一把 Secure OTP key,则要先在 secure 下调用 crypto_aes_share_secure_key API,修改 key 的使用权限。
2 个 Secure Software 密钥:寄存器密钥可通过软件自由配置。这两把 Secure Software Key 只可以由 secure 状态读写,Non-Secure 状态无法访问密钥寄存器。Secure Software 密钥在默认状态下只能由 Secure 状态使用。若用户需要在 Secure CPU 配置 key,Non-Secure 状态使用 key,则要先在 secure 状态配置对应的 key share 寄存器比特。AES-XTS 模式需要一次性使用两把密钥。
2 个 Non-Secure Software 密钥:在 Secure 状态或 Non-Secure 状态下,都可以读写和使用。
AES密钥ID |
密钥类型 |
长度(比特) |
OTP地址 |
密钥使用权限 |
共享IP |
---|---|---|---|---|---|
0 |
OTP |
256 |
0x200 |
安全(默认)/非安全 |
与HMAC共享 |
1 |
OTP |
256 |
0x220 |
安全(默认)/非安全 |
与HMAC共享 |
2 |
OTP |
256 |
0x240 |
安全(默认)/非安全 |
与HMAC共享 |
3 |
OTP |
256 |
0x260 |
安全(默认)/非安全 |
与HMAC共享 |
4 |
OTP |
256 |
0x2C0 |
安全(默认)/非安全 |
与RSIP共享 |
5 |
OTP |
256 |
0x2E0 |
安全(默认)/非安全 |
与RSIP共享 |
33 |
寄存器 |
256 |
不适用 |
安全(默认)/非安全 |
仅AES |
34 |
寄存器 |
256 |
不适用 |
安全(默认)/非安全 |
仅AES |
35 |
寄存器 |
256 |
不适用 |
非安全 |
仅AES |
36 |
寄存器 |
256 |
不适用 |
非安全 |
仅AES |
AES 引擎安全
AES 引擎支持 TrustZone 技术,能够识别当前 CPU 的访问是 Secure 还是 Non-secure 状态。AES 引擎配备了硬件的互斥锁,在每次运算前 CPU 需要先拿硬件的互斥锁,否则无法访问硬件寄存器。
互斥锁有两个有效比特:若读互斥锁返回零,那么成功拿锁。拿锁时硬件会记录当前访问是 Secure 还是 Non-secure 访问: 2'b01
为 Secure 锁, 2'b10
为 Non-secure 锁,写 0 放锁。
引擎 Secure 上锁时会挡住所有的 Non-secure 访问。只有 Secure CPU 放锁后 Non-secure 才能重新拿锁。
但当引擎 Non-secure 上锁时,Secure CPU 可以通过配置 Secure only 的抢占寄存器(AES_MUTEX_OVERWRITE),强行解除引擎的 Non-secure 上锁状态并复位引擎,抢占引擎的使用权。
在引擎每次放锁时会清除所有的硬件和寄存器状态,保证信息不会泄漏。
AES 引擎在运算过程中,会使用掩码、冗余操作和随机操作来防止侧信道攻击:
掩码:通过对中间计算值进行随机化处理来保护加密过程,使得侧信道攻击难以直接获得有用的信息,如功耗或电磁辐射产生的信号。掩码在每次 AES 初始化时由 TRNG 随机产生。
冗余操作:在加密或解密过程中插入一些额外或不相关的操作,以迷惑攻击者,使其难以分析 AES 的执行流。这些操作不改变结果,但会增加侧信道信号中的噪声。
随机化:通过打乱操作或数据处理序列,使得执行过程难以预测。确保不会随着时间产生可被攻击者开发有效攻击策略的固定模式。
AES 引擎使用模式
AES 引擎支持两种操作方式:DMA 模式和 Slave 模式。两种模式都可以使用 Software 密钥或者 OTP 密钥。
DMA 模式
AES 引擎使用引擎内部的 DMA 控制器的通道 0。使用 DMA 在内存之间移动数据,并在传输过程中使用 AES 加密/解密数据。 DMA 模式对于大量的加解密数据有很高的加解密效率。但 DMA 模式需要数据的地址和长度是 cache line 长度(32 字节)对齐,否则会有 cache line 数据不匹配问题。 如果地址和长度不对齐,串口日志会打印警告信息。 在驱动中已经做好了源地址的 cache clean 和目的地址的 cache invalidate 操作,用户不需要在 API 外重复清理 cache。
Slave 模式
CPU 通过 APB 总线将数据写入 AES 引擎,以加密或解密数据。这种模式适用于 16 字节 AES 运算的情况,没有地址、消息长度对齐限制。 可以和其他模式组合使用以支持更多的加密或者消息认证码算法。
AES API
Realtek 提供了 ROM API,用户不需要关系具体的寄存器操作方法和流程。为了更好的适用性,已经将 AES 硬件加速引擎集成到 MbedTLS。 由于软硬件限制,Realtek 没有对 MbedTLS 的 CMAC / AES-GCM 两个算法做硬件加速。 用户在执行 CMAC / AES-GCM 运算时,可以直接调用 ROM API 来获得更好的性能。 MbedTLS API 只支持 Software 密钥,使用 OTP 密钥时需要用 ROM API。
HMAC 引擎
HMAC 引擎是一款用于计算 HMAC、SHA2 的硬件加速器,支持消息自动填充。HMAC 算法支持软件寄存器密钥和硬件 OTP 密钥。支持 DMA 模式和从设备模式。 引擎算法已通过 NIST CAVP 认证。
HMAC 算法支持
通用哈希函数:
SHA2-224
SHA2-256
SHA2-384
SHA2-512
HMAC(基于哈希的消息认证码):
HMAC_SHA2-224
HMAC_SHA2-256
HMAC_SHA2-384
HMAC_SHA2-512
HMAC 密钥
HMAC 引擎配备独立的密钥管理单元。密钥管理单元支持软件密钥和 OTP 硬件密钥。
4 个 Secure OTP 密钥:OTP 密钥烧录后可以使能读写保护。保护使能后,软件无法读写只能硬件使用。默认情况下只能 Secure 状态下使用这些 OTP key。若需 Non-Secure 状态使用某一把 Secure OTP key,则要先在 secure 下调用 crypto_hmac_sha2_share_secure_key API,修改 key 的使用权限。
1 个 Secure Software 密钥:寄存器密钥可通过软件自由配置。这把 Secure Software Key 只可以由 secure 状态读写,Non-Secure 状态无法访问密钥寄存器。Secure Software 密钥在默认状态下只能由 Secure 状态使用。若用户需要在 Secure CPU 配置 key,Non-Secure 状态使用 key,则要先在 secure 状态配置对应的 key share 寄存器比特。
1 个 Non-Secure Software 密钥:在 Secure 状态或 Non-Secure 状态下,都可以读写和使用。
HMAC密钥ID |
密钥类型 |
长度(比特) |
OTP地址 |
密钥使用权限 |
共享IP |
---|---|---|---|---|---|
0 |
OTP |
256 |
0x200 |
安全(默认)/非安全 |
与AES共享 |
1 |
OTP |
256 |
0x220 |
安全(默认)/非安全 |
与AES共享 |
2 |
OTP |
256 |
0x240 |
安全(默认)/非安全 |
与AES共享 |
3 |
OTP |
256 |
0x260 |
安全(默认)/非安全 |
与AES共享 |
33 |
寄存器 |
256 |
不适用 |
安全(默认)/非安全 |
仅HMAC |
34 |
寄存器 |
256 |
不适用 |
非安全 |
仅HMAC |
HMAC 引擎安全
HMAC 引擎支持 TrustZone 技术,能够识别当前 CPU 的访问是 Secure 还是 Non-secure 状态。
HMAC 引擎配备了硬件的互斥锁,在每次运算前 CPU 需要先拿硬件的互斥锁,否则无法访问硬件寄存器。互斥锁有两个有效比特:若读互斥锁返回零,那么成功拿锁。
拿锁时硬件会记录当前访问是 Secure 还是 Non-secure 访问: 2'b01
为 Secure 锁, 2'b10
为 Non-secure 锁,写 0 放锁。
引擎 Secure 上锁时会挡住所有的 Non-secure 访问。只有 Secure CPU 放锁后 Non-secure 才能重新拿锁。但当引擎 Non-secure 上锁时,Secure CPU 可以通过配置 Secure only 的抢占寄存器(SHA_MUTEX_OVERWRITE), 强行解除引擎的 Non-secure 上锁状态并复位引擎,抢占引擎的使用权。在引擎每次放锁时会清除所有的硬件和寄存器状态,保证信息不会泄漏。
HMAC 引擎使用模式
HMAC 引擎支持两种操作方式:DMA 模式和 Slave 模式。两种模式都可以使用 Software 密钥或者 OTP 密钥。
DMA 模式
HMAC 引擎和 AES 共用一个 DMA 控制器。HMAC 引擎只能使用 DMA 的通道 1。
DMA 模式下,引擎支持只读模式和拷贝模式:
只读模式:启动时,只需要指定源数据地址,引擎只会从数据地址读取数据,并计算哈希。
拷贝模式:在启动时,需要同时指定源数据地址和目的地址。引擎在计算哈希的同时,会将数据完整地搬运到目的地址。适用于拷贝校验的工况。
Slave 模式
CPU 通过 APB 总线将消息写入引擎内部的 FIFO,然后读出哈希值。客户不需要关心此模式。
HMAC API
REALTEK 提供了 HMAC 底层 API,用户不需要关系具体的寄存器操作方法和流程。 为了更好的适用性,已经将 SHA2 硬件加速引擎集成到 MbedTLS SHA2-Hash/HMAC API 中。SHA1/MD5 等其他哈希算法并未进行硬件加速。 MbedTLS API 只支持 Software 密钥。使用 OTP 密钥时需要用底层 API。MbedTLS API 也不支持 DMA 拷贝模式。