为 UEFI 前阶段启用安全启动#
您可以为您的生产 NVIDIA IGX 设备启用端到端安全启动。有关概述,请参阅 IGX 安全启动。
UEFI 前阶段的安全启动使用 NVIDIA SoC 熔丝存储的信任根,以验证从 Orin 上电到 UEFI 之前的代码结束之间的启动代码。
要为 UEFI 前阶段启用安全启动,请执行以下步骤
1. 向 NVIDIA 请求 FSKP 扩展密钥#
要请求工厂安全密钥配置 (FSKP) 扩展密钥,请联系您的 NVIDIA 代表。您的代表还将为您提供 FSKP 扩展密钥配置和熔丝熔断工具包部署指南。
2. 生成加密和签名 Blob#
要生成加密和签名 blob,请执行以下步骤
A. 生成 3 个 PKC 非对称密钥对#
IGX Orin 的熔丝支持三种类型的公钥密码学 (PKC) 密钥:RSA 3K、ECDSA P-256 和 ECDSA P-521。熔丝只能存储三个哈希密钥。这三个密钥中的每一个都必须使用相同类型的密码学。
以下示例使用 RSA 3K 生成密钥。
要生成 PKC 私钥
rsa3k-0.pem
、rsa3k-1.pem
和rsa3k-2.pem
,请运行以下代码。1openssl genrsa -out rsa3k-0.pem 3072 2openssl genrsa -out rsa3k-1.pem 3072 3openssl genrsa -out rsa3k-2.pem 3072
要从 PKC 私钥生成公钥哈希值,请运行以下代码。
1./tegrasign_v3.py --pubkeyhash rsa3k-0.pubkey rsa3k-0.hash --key rsa3k-0.pem 2./tegrasign_v3.py --pubkeyhash rsa3k-1.pubkey rsa3k-1.hash --key rsa3k-1.pem 3./tegrasign_v3.py --pubkeyhash rsa3k-2.pubkey rsa3k-2.hash --key rsa3k-2.pem
稍后,您将哈希值添加到熔丝配置文件中。
注意
保护您的私钥。您的 IGX 设备的安全性取决于您的私钥的安全性。
B. (可选)生成 SBK 对称密钥#
为了进一步增强安全启动,您可以选择加密引导加载程序组件。
注意
如果未启用安全启动,则无法加密引导加载程序组件。
要加密引导加载程序组件,您可以使用熔断到 IGX 的 SoC 的对称 SBK 密钥。SBK 密钥在生成引导加载程序组件时用作加密密钥。SBK 密钥在 IGX Orin 启动时用作解密密钥。
IGX Orin SoC 需要一个长度为八个 32 位字(32 字节)的 SBK 密钥。要生成 32 字节的 SBK 密钥,请运行以下代码。
1openssl rand -rand /dev/urandom -hex 32 2>&1 |tee sbk.key
稍后,您将密钥添加到熔丝配置文件中。
我们建议您使用硬件安全模块 (HSM) 为 SBK 密钥生成真正的随机数。
注意
保护您的私钥。您的 IGX 设备的安全性取决于您的私钥的安全性。
C. 准备 K1 和 K2 密钥#
K1 (OemK1) 和 K2 (OemK2) 密钥是预熔断的 256 位对称密钥,您可以将其用于其他安全应用程序,例如加密密钥 Blob 生成或设备配置。K1 密钥保留用于生成新的 EKB。您必须准备这两个密钥以及其他 ODM 熔丝位,如其他安全应用程序的文档中所述。
对于 IGX Orin,熔丝密钥名称为 OemK1 和 OemK2,密钥长度必须为 32 字节。要生成 32 字节的 OemK1 密钥文件,请运行以下代码。
1openssl rand -rand /dev/urandom -hex 32 2>&1 |tee OemK1
稍后,您将密钥添加到熔丝配置文件中。
我们建议您使用硬件安全模块 (HSM) 为 K1/K2 密钥生成真正的随机数。
注意
保护您的私钥文件。您的 IGX 设备的安全性取决于您的私钥文件的安全性。
D. 准备熔丝配置文件#
熔丝配置文件包含熔丝数据、熔丝列表以及要熔断到每个熔丝中的值。FSKP 工具使用配置文件来编程熔丝。
注意
启用安全启动模式后,熔丝将被锁定且无法更改。
熔丝配置文件包含一个 <genericfuse>
元素,以及每个要熔断的熔丝一个 <fuse>
元素。三个 PKC 密钥分别命名为 PublicKeyHash
、PkcPubkeyHash1
和 PkcPubkeyHash2
,并且名称区分大小写。熔丝 SecurityMode
必须是文件中的最后一个元素。
熔丝 BootSecurityInfo
包含一个 4 字节的值,您必须使用以下信息设置该值
Bit[0:2]: - 对于 RSA 3K,设置为
001b
- 对于 ECDSA P-256,设置为010b
- 对于 ECDSA P-521,设置为011b
Bit[3]:如果您使用可选的 SBK 密钥,则设置为 1
Bit[9]:对于 OEM K1 和 K2 密钥,设置为 1
Bit[11]:设置为 1
Bit[13]:设置为 1
将所有其他位设置为 0
以下是 IGX Orin 熔丝配置文件的示例。该文件包含三个 RSA 3K 密钥、一个 SBK 密钥以及 OemK1 和 OemK2 密钥。
1<genericfuse MagicId="0x45535546" version="1.0.0">
2 <fuse name="PscOdmStatic" size="4" value="0x00000060"/>
3 <fuse name="Kdk0" size="32" value="0x6208e3cd81ed0cd77b214db0c875ade40c26bca09382ad82cd0e24046cc8c64e"/>
4 <fuse name="PublicKeyHash" size="64" value="0xad2474627c14e3f7f4944a832bd15d0640938a3dc162f558692458f3d12f9453e11bea2ec75df3f83e8b29c47fc3d2483d528d3e94a5469c4ba1ec61f1584b23"/>
5 <fuse name="PkcPubkeyHash1" size="64" value="0xd87796fb510d79738f8509c98511be0bb79dcc17d204a2f0f0bea9680b91bd1273ee2ae7a8a6bdb8b95deb0f421e72404939ae20d12c82649712283027201f39"/>
6 <fuse name="PkcPubkeyHash2" size="64" value="0x99a5b6eac64dfb29698cb684165529e5d8650c1aab0e18b677c5d5f0998af53f8a8a1f09ad1d79368bc500e57eb199e9108fc7b1499995d869b028fec3f367db"/>
7 <fuse name="SecureBootKey" size="32" value="0x123456789abcdef0fedcba9876543210 00112233445566778899aabbccddeeff"/>
8 <fuse name="OemK1" size="32" value="0xf3bedbff9cea44c05b08124e8242a71ec1871d55ef4841eb4e59a56b5f88fb2b"/>
9 <fuse name="OemK2" size="32" value="0x76d723099bc81a39cfc8bd109deb7ef39aa1d0f5ab4658180ad33e1d983a2e84"/>
10 <fuse name="OptInEnable" size="4" value="0x1"/>
11 <fuse name="BootSecurityInfo" size="4" value="0x2a09"/>
12 <fuse name="ArmJtagDisable" size="4" value="0x1"/>
13 <fuse name="SecurityMode" size="4" value="0x1"/>
14</genericfuse>
注意
尽管熔丝配置文件包含 XML,但它不需要 XML 标准定义的 <?xml ?>
序言。如果您想在配置文件上运行通用 XML 实用程序,则可以添加序言。
E. 生成加密和签名 Blob#
要使用工厂安全密钥配置 (FSKP) 扩展密钥生成加密和签名 blob,请运行以下代码。将 fuseblob.xml
替换为您的熔丝配置文件的名称。
1sudo ./fskp_fuseburn.py --board-spec igx-board-spec.txt -f fuseblob.xml -i 62 -b \
2 --key-exp fskp_ak.bin fskp_ek.bin --fskpcfg fskp_conf.txt -g out/ -c 0x23 -B <top>/igx-orin-devkit.conf
3. 熔断熔丝#
要熔断熔丝,请运行以下代码。
1sudo ./fskp_fuseburn.py --board-spec igx-board-spec.txt -P ./out -c 0x23 -B <top> /igx-orin-devkit.conf
要通过 Linux 内核读取熔丝值,请使用脚本 /usr/sbin/nv_fuse_read.sh
。
要列出支持的熔丝,请运行以下代码。
1sudo nv_fuse_read.sh -l
要读取熔丝的值,请运行以下代码。
1sudo nv_fuse_read.sh <fuse name>
例如,使用以下代码获取 IGX 板的独有芯片标识 (ECID)。
1sudo nv_fuse_read.sh ecid
要读取所有熔丝值,请运行以下代码。
1sudo nv_fuse_read.sh
4. 签名并刷写 QSPI 启动固件映像#
要生成加密和签名 blob,请执行以下步骤
A. 生成新的 EKB 文件#
在您编程 IGX 熔丝之后,并在刷写 QSPI 映像之前,生成 EKB 文件。EKB 文件中包含四个密钥。OemK1 密钥熔断到 IGX 熔丝。其他三个密钥由 NVIDIA 提供的脚本 example.sh
生成。每次您签名并刷写 QSPI 映像时,将 eks_t234.img
文件复制到 <Linux_fo_Tegra>/bootloader
目录。
您需要以下先决条件
Python 3.9 或更高版本
pip3 install cryptography
pip3 install pycryptodome
从 IGX 下载中心下载
public_sources.tbz2
。1wget https://developer.nvidia.com/downloads/igx/v1.0.0/public_sources.tbz2
解压
public_source.tbz2
,更改到文件夹Linux_for_Tegra/source
,解压 nvidia-jetson-optee-source.tbz2。1tar -xvf public_source.tbz2 2cd Linux_for_Tegra/source 3tar -xvf nvidia-jetson-optee-source.tbz2
更改到文件夹 optee/samples/hwkey-agent/host/tool/gen_ekb/。
1cd ./optee/samples/hwkey-agent/host/tool/gen_ekb/
使用文本编辑器打开文件
example.sh
并对文件进行以下更改。转到 [T194 example] 部分并注释掉 python gen_ekb.py。不应运行此部分。
转到 [T234 example] 部分并取消注释
#echo "0000000000000000000000000000000000000000000000000000000000000000" > oem_k1.key
。将
0000000000000000000000000000000000000000000000000000000000000000
替换为您熔断的 Oem K1 密钥。取消注释以下行。
1# openssl rand -rand /dev/urandom -hex 32 > sym_t234.key 2# openssl rand -rand /dev/urandom -hex 16 > sym2_t234.key 3# openssl rand -rand /dev/urandom -hex 16 > auth_t234.key
保存您对
example.sh
的更改并退出文件。运行 ./example.sh。文件
eks_t234.img
已生成。将
eks_t234.img
复制到文件夹<Linux_for_Tegra>/bootloader
。
B. 刷写 QSPI#
我们建议您同时启用 UEFI 安全启动和 QSPI 安全启动。有关详细信息,请参阅在刷写时启用 UEFI 安全启动。
如果您只想启用 QSPI 安全启动,请使用以下步骤。
导航到您安装 Jetson BSP 的目录。
将 IGX 设备置于恢复模式。有关详细信息,请参阅将系统置于恢复模式。
要使用
rsak3k-0.pem
密钥签名 QSPI,请运行以下代码。要选择性地使用 SBK 密钥加密有效负载,请包含-v
选项和sbk.key
文件参数。1sudo ./flash.sh p3740-0002-p3701-0008-qspi external -u rsa3k-0.pem 2 3— Or — 4 5sudo ./flash.sh p3740-0002-p3701-0008-qspi external -u rsa3k-0.pem -v sbk.key
下一步#
完成本文档中的步骤后,请参阅启用 UEFI 安全启动。