为 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 生成密钥。

  1. 要生成 PKC 私钥 rsa3k-0.pemrsa3k-1.pemrsa3k-2.pem,请运行以下代码。

    1openssl genrsa -out rsa3k-0.pem 3072
    2openssl genrsa -out rsa3k-1.pem 3072
    3openssl genrsa -out rsa3k-2.pem 3072
    
  2. 要从 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 密钥分别命名为 PublicKeyHashPkcPubkeyHash1PkcPubkeyHash2,并且名称区分大小写。熔丝 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

  1. IGX 下载中心下载 public_sources.tbz2

    1wget https://developer.nvidia.com/downloads/igx/v1.0.0/public_sources.tbz2
    
  2. 解压 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
    
  3. 更改到文件夹 optee/samples/hwkey-agent/host/tool/gen_ekb/。

    1cd ./optee/samples/hwkey-agent/host/tool/gen_ekb/
    
  4. 使用文本编辑器打开文件 example.sh 并对文件进行以下更改。

    1. 转到 [T194 example] 部分并注释掉 python gen_ekb.py。不应运行此部分。

    2. 转到 [T234 example] 部分并取消注释 #echo "0000000000000000000000000000000000000000000000000000000000000000" > oem_k1.key

    3. 0000000000000000000000000000000000000000000000000000000000000000 替换为您熔断的 Oem K1 密钥

    4. 取消注释以下行。

      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
      
  5. 保存您对 example.sh 的更改并退出文件。

  6. 运行 ./example.sh。文件 eks_t234.img 已生成。

  7. eks_t234.img 复制到文件夹 <Linux_for_Tegra>/bootloader

B. 刷写 QSPI#

我们建议您同时启用 UEFI 安全启动和 QSPI 安全启动。有关详细信息,请参阅在刷写时启用 UEFI 安全启动

如果您只想启用 QSPI 安全启动,请使用以下步骤。

  1. 导航到您安装 Jetson BSP 的目录。

  2. 将 IGX 设备置于恢复模式。有关详细信息,请参阅将系统置于恢复模式

  3. 要使用 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 安全启动