功能描述
19 Nov 2024
Read time: 2 minute(s)
CE 模块内部含有多个重要功能和组件,包括:
- 对称密钥算法加速单元:支持多种类型的对称密钥算法。
- 非对称密钥算法加速单元:仅支持 RSA 算法,以算子形式实现。
- 消息摘要算法加速单元:支持使用算法规定的默认初始化向量值,也支持用户配置初始化向量值。
- 专用的安全 SRAM,用于存放密钥。
- 支持以任务链的形式将一个运算请求分拆为多个链接在一起的子运算任务。一个任务链中的所有任务,算法类型必须相同。
对称密钥算法
CE 内部包含对称密钥算法加速单元,支持以下类型的对称密钥算法:
- AES 算法,支持下列模式:
- ECB
- CBC
- CTR
- XTS
- CTS
- DES/ TDES 算法,支持下列模式:
- ECB
- CBC
TDES 算法具体实现为 TDES-EDE,支持三种密钥长度,分别对应使用 1、2、3 个 64-bit 子密钥的场景:- 64 bits
- 128 bits
- 192 bits
TDES 算法的基础是 DES 算法,DES 算法使用 56-bit 长度的密钥,对于输入的 64-bit 密钥数据,每个字节只取高 7 位。
使用 TDES 算法时:- 当输入 64-bit 长度的密钥时,TDES 算法单元实际执行经典 DES 算法运算。
- 当输入 128-bit 长度的密钥时,TDES 算法单元将输入密钥分为两个子密钥 K1 和 K2,并且使用 K1-K2-K1 分别执行 Encrypt-Decrypt-Encrypt 三次 DES 运算。
- 当输入 192-bit 长度的密钥时,TDES 算法单元将输入密钥分为三个子密钥 K1、K2 和 K3,并且使用 K1-K2-K3 分别执行 Encrypt-Decrypt-Encrypt 三次 DES 运算。
非对称密钥算法
CE 内部的非对称密钥算法以算子形式实现。因此在使用非对称密钥算法时,需要指定具体算子,并且提供算子对应的操作数。操作数通过指定的位置输入到 CE 的算法处理单元。
- RSA 算法使用模幂算子,共有三个操作数和一个输出:
- P、e 和 N 对应三个操作数。警告: 每个操作数的字节序应使用小端序,如果原始密钥数据使用大端序则需要转换。
- C 对应输出。
所有的操作数和输出结果的长度一致。操作数的长度支持:-
1024 bits
-
2048 bits
- P、e 和 N 对应三个操作数。
-
RSA 算法有下列几个密钥数值:
-
N - Modulus
-
e - public Exponent
-
d - private Exponent
公钥加密,私钥解密运算公式如下,P、C 分别表示明文和密文:
-
消息摘要算法
CE 内部的消息摘要算法加速单元包括:
-
MD5 算法
-
SHA 算法
-
使用 SHA1、SHA256 的 HMAC 算法
- TRNG 算法
消息摘要算法支持使用算法规定的默认初始化向量值,也支持用户配置初始化向量值。
警告:
-
MD5 算法的初始化向量,输入时使用小端序;
-
其他算法的初始化向量,输入时使用大端序。
任务和处理
CE 以任务的方式处理运算请求,支持以任务链的形式将一个运算请求分拆为多个链接在一起的子运算任务。
CE 内部的三个算法单元,可以并行处理各自的运算任务,但是一个算法单元每次仅接受一个任务链的处理请求,完成之后, 继续处理下一个任务链。因此软件在发起运算请求之前,需要检查对应的算法单元是否空闲。
在 CE 对任务的处理中,当 CE
的算法单元没有空闲时,对应的任务需要等待,由软件处理等待。
警告: 一个任务链中的所有任务,算法类型必须相同。
硬件安全密钥
CE 模块包含一块内部专用的安全 SRAM,用于存放密钥。保存在安全 SRAM 中的密钥称为硬件安全密钥 (HSK)。
安全 SRAM 的大小为 1 KB,由软件驱动完成具体空间的分配和管理,CE 模块仅使用该区域中的数据。安全 SRAM 只能被 CE 模块访问,因此保存在其中的密钥安全性高,外界无法窥探。
安全 SRAM 的使用规则如下:
- 必须以 64 bits 为单位分配。
- 仅 CE 可以访问,可以作为 CE 的输入密钥,也可以作为 CE 的输出。
- HSK 只能从其他密钥派生,由 CE 输出到安全 SRAM。
- 不能以任何方式导出安全 SRAM 中的 HSK。即 HSK 不能作为 CE 的输入数据,只能作为 CE 的密钥。
- 通过安全 SRAM 的地址索引使用 HSK。
模块名称 | 基地址 | 地址空间 |
---|---|---|
Secure SRAM | 0x1002_1000 | 1 KB |
仅 CE 可以访问安全 SRAM 的地址空间,CPU 和其他模块无法访问。 CE 访问安全 SRAM 时,只需在任务描述符中直接指定使用的安全 SRAM 地址。