5.1.2. 功能描述

本章节描述 CE 模块内部的重要功能和组件。

5.1.2.1. 对称密钥算法

CE 内部包含对称密钥算法加速单元,支持的对称密钥算法包括 AES 算法和 DES/TDES 算法。

AES 算法支持下列模式:

  • ECB

  • CBC

  • CTR

  • XTS

  • CTS

备注

CTS 实现的版本为 CBC-CS3。 具体可参考《Addendum to NIST Special Publication 800-38A》。

DES/TDES 算法支持下列两种模式:

  • ECB

  • CBC

其中 TDES 算法具体实现为 TDES-EDE,支持三种密钥长度,分别对应使用 1、2、3 个 64bit 子密钥的场景:

  • 64bit

  • 128bit

  • 192bit

TDES 算法的基础是 DES 算法,DES 算法使用 56bit 长度的密钥,对于输入的 64bit 密钥数据,每个字节只取高7位。

../../../_images/des_key.png

图 5.5 DES 密钥

使用 TDES 算法时:

  • 当输入密钥长度为 64bit 密钥时,TDES 算法单元实际执行经典 DES 算法运算;

  • 当输入密钥长度为128bit 密钥时,TDES 运算单元将输入密钥分为两个子密钥 K1 和 K2,并且使用 K1-K2-K1 分别执行 Encrypt-Decrypt-Encrypt 三次 DES 运算;

  • 当输入密钥长度为 192bit 时,TDES 运算单元将输入密钥分为三个子密钥 K1、K2 和 K3,并且使用 K1-K2-K3 分别执行 Encrypt-Decrypt-Encrypt 三次 DES 运算。

5.1.2.2. 非对称密钥算法

CE 内部的非对称密钥算法实现,仅支持 RSA 算法。具体算法以算子形式实现,因此在使用非对称密钥算法时,需要指定具体算子,并且提供算子对应的操作数。操作数通过指定的位置输入到 CE 的算法处理单元。 RSA 算法使用模幂算子,共有三个操作数和一个输出:

../../../_images/op_mod_exp.png

其中P、e 和 N 对应三个操作数,C 对应输出。所有的操作数和输出结果的长度一致。操作数的长度支持:

  • 1024bit

  • 2048bit

RSA 算法密钥数值有下列几个:

  • N - Modulus

  • e - public Exponent

  • d - private Exponent

使用 P、C 表示明文和密文,公钥加密,私钥解密运算如下:

../../../_images/rsa_enc_dec.png

注意

需要注意,每个操作数的字节序应使用小端序,如果原始密钥数据使用大端序则需要转换。

5.1.2.3. 消息摘要算法

CE 内部的消息摘要算法加速单元,分别支持:

  • MD5 算法

  • SHA 算法

  • 以及使用 SHA1、SHA256 的 HMAC 算法

同时,随机数的生成过程中,硬件也使用到了 SHA256 算法对产生的随机数进行处理,使得比特分布的随机性更高。 因此 TRNG 也归类到消息摘要算法单元中。

上述消息摘要算法,支持使用算法规定的默认初始化向量值,也支持用户配置初始化向量值。

注意

  • MD5 算法的初始化向量,输入时使用小端序;

  • 其他算法的初始化向量,输入时使用大端序。

5.1.2.4. 任务和处理

CE 以任务的方式处理运算请求,支持以任务链的形式将一个运算请求分拆为多个链接在一起的子运算任务。

CE 内部的三个算法单元,可以并行处理各自的运算任务,但是一个算法单元每次仅接受一个任务链的处理请求,完成之后, 继续处理下一个任务链。因此软件在发起运算请求之前,需要检查对应的算法单元是否空闲。

../../../_images/task_process.png

图 5.6 CE 对任务的处理

如上图所示,当 CE 的算法单元没有空闲时,相对应的任务需要等待。相关的等待处理应由软件处理。

注意

一个任务链中的所有任务,要求算法类型必须相同。

5.1.2.5. 硬件安全密钥

CE 模块包含一块内部专用的安全 SRAM,用于存放密钥,这里称保存在安全 SRAM 中的密钥为硬件安全密钥(HSK)。 安全 SRAM 的大小为1KB,CE 模块使用该区域中的数据,不负责相关空间的分配和管理, 具体分配和管理由软件驱动完成。由于安全 SRAM 只能被 CE 模块访问,因此保存在其中的密钥安全性高,外界无法窥探。

安全 SRAM 的使用规则如下:

  1. 必须以64bit为单位分配

  2. 仅 CE 可以访问 可以作为 CE 的输入密钥,也可以作为 CE 的输出

  3. HSK 只能从其他密钥派生,由 CE 输出到安全 SRAM

  4. 不能以任何方式导出安全 SRAM 中的 HSK 即 HSK 不能作为 CE 的输入数据,只能作为 CE 的密钥

  5. 通过安全 SRAM 的地址索引使用 HSK

表 5.3 安全 SRAM 地址

模块名称

基地址

地址空间

Secure SRAM

0x1002_1000

1KB

其中安全 SRAM 的地址空间仅 CE 可访问,CPU 和其他模块无法访问该地址空间。 CE 访问安全 SRAM 时,只需在任务描述符中直接指定使用的安全 SRAM 地址即可。

5.1.2.5.1. HSK 的派生

HSK 只能从其他密钥派生。这里称派生 HSK 的密钥为父密钥,用于派生 HSK 的数据称为 HSKM(HSK Material)。 父密钥可以为:

  • eFuse 安全密钥

  • 用户指定的其他密钥

HSKM 可以是用户指定的任意数据,但输出的 HSK 最大只能为 2048 bit。

下图演示了使用 eFuse 密钥和 HSKM 派生 HSK 的过程。

../../../_images/hsk_gen_with_efuse.png

HSK 的使用

下图演示了 HSK 的使用限制:

  1. 只能作为 CE 的密钥进行使用

  2. 不能作为 CE 的数据输入

../../../_images/hsk_limit1.png
../../../_images/hsk_limit2.png
../../../_images/hsk_limit3.png

5.1.2.5.2. HSK 解决的问题

硬件安全密钥功能是为了解决密钥的本地存储安全问题。 实际使用会面临这样的需求:有一些关键密钥,需要保存在设备之中。以明文保存,密钥不安全,很容易被窃取;烧录到 eFuse,则需要使用较多的安全 eFuse 空间;有一些场景中,密钥是动态生成的,安全 eFuse 无法满足这样的需求。 通过硬件安全密钥功能,可以解决上述密钥的本地存储安全问题。

  1. 对于固定密钥

    可以使用 eFuse 安全密钥,先对 HSK 进行加密,然后将加密后的数据(HSKM)保存在设备本地。需要使用时,将 HSKM 解密输出到安全 SRAM,得到 HSK。

  2. 对于动态密钥

    可以使用 eFuse 安全密钥中的 HUK 派生 HSK。在需要动态生成 HSK 加密本地数据时,可以使用 TRNG 生成 HSKM,然后使用 HUK 对 HSKM 进行解密输出到安全 SRAM,从而得到 HSK。HSKM 可以和数据一起保存在本地设备。

由于 eFuse 安全密钥仅 CE 可访问,软件以及其他硬件模块无法读写,因此本地设备保存 HSKM 不会导致 HSK 的泄露。

使用硬件安全密钥,可以实现下列功能:

  1. RSA 私钥的安全存储

    RSA 私钥可以用来做芯片/设备的身份认证,需要实现本地的保密存储。

  2. 数据的存储安全

    eFuse 安全密钥中的 HUK 是每颗芯片都不相同的硬件唯一密钥,通过 HUK 派生 HSK,可以实现 HSK 与当前平台的绑定。使用这样的 HSK 加密后的数据,仅当前平台可以解密。同时对应的 HSKM 可以与加密数据一起保存在本地设备,不影响数据的保密和安全。

5.1.2.5.3. eFuse 安全密钥

eFuse 安全密钥是指 eFuse 中仅 CE 模块可访问,其他软硬件模块无法读写的 eFuse 密钥区域。

CE 模块需要支持下列 eFuse 安全密钥。

名字

大小/BIT

描述

PNK

64

Part Number Key,芯片型号密钥

SSK

128

对称密钥,用于固件加密

HUK

128

硬件唯一密钥,用于派生 HSK

PSK0

64

Partner Secret Key0,DES 密钥

PSK1

64

Partner Secret Key1,DES 密钥

PSK2

64

Partner Secret Key2,DES 密钥

PSK3

64

Partner Secret Key3,DES 密钥

5.1.2.5.4. 数据填充

CE 模块所支持的算法,多数是按照固定数据块的方式进行处理的,但实际待处理数据的长度可能并不满足对齐要求,因此需要进行数据填充。 不同算法的填充处理是不一样的,CE 仅支持部分算法进行硬件填充处理。

AES 算法

  • 数据块大小 128 bit

  • 要求16字节对齐

  • 不支持 CE 硬件填充,需要用户进行数据填充

DES/TDES 算法

  • 数据块大小 64 bit

  • 要求8字节对齐

  • 不支持 CE 硬件填充,需要用户进行数据填充

RSA 算法

  • 数据块大小和密钥长度与填充方法相关

  • 不支持 CE 硬件填充,需要用户进行数据填充

SHA/MD5算法

  • 支持 CE 硬件填充

  • 非最后一笔数据,应512bit/1024bit 对齐,具体看算法要求

5.1.2.5.5. 使用限制

5.1.2.5.5.1. 使用 SSK 的输出限制

SSK (Symmetric Secret Key) 是 eFuse 中用于对称加密算法的密钥,有两个用途:

  • 对固件进行解密

  • 派生 HSK

其中第一个用途仅在 BROM 阶段可用,BROM 退出后,SSK 被设置为仅能用于派生其他硬件安全密钥,并且仅能输出到安全 SRAM。

5.1.2.5.5.2. 其他 eFuse 安全密钥的限制

对开发者而言,eFuse 安全密钥仅能用于派生 HSK,即当 CE 选择 eFuse 安全密钥作为密钥时, CE 的结果只能输出到安全 SRAM。该限制的目的是防止 HSK 被解密到外部存储空间,从而导致密钥泄露。