Skip to main content

前提条件

检查 metabuild

通过检查 metabuild 中的以下文件来识别用于签名的正确镜像。
  • <Metabuild>/<chipset>.LE.X.x/contents.xml
    此文件包含以下详细信息:
    • 每个镜像的源路径。
    • 每个镜像的格式(例如,pil-split 或 mbn)。
  • <Metabuild>/<chipset>.LE.X.x/common/sectoolsv2/<chipset>_security_profile.xml
    此文件提供与签名相关的元数据,包括:
    • --image-id 值。
    • 必须由用户签名的镜像列表,以确保设备安全。

更改 Windows 的 SecTools 命令

要在 Windows 平台上使用 SecTools 命令,请将 <Metabuild>/<chipset>.LE.X.x/common/sectoolsv2/ext/Linux/sectools 替换为 <Metabuild>/<chipset>.LE.X.x/common/sectoolsv2/ext/Windows/sectools.exe。

签名镜像

镜像签名是一种安全过程,涉及向数字镜像添加加密签名。此签名作为唯一标识符,验证镜像的真实性、完整性和来源。没有镜像签名,就无法保证镜像的完整性或可信来源,可能导致安全漏洞和数据丢失。 请按照以下步骤签名镜像。
  1. 您可以使用 SecTools V2 签名镜像。有不同的签名方法和安全镜像功能可用。有关更多信息,请参阅 SecTools V2:安全镜像用户指南。
  2. 您可以使用本地签名器生成密钥和证书。有关更多信息,请参阅 生成本地(不安全)根密钥和证书。
  3. 要签名单个镜像,请运行以下命令,其中 tz.mbn 用作示例。
    注意 您可以根据要求替换 OEM ID “0x1” 和 OEM 产品 ID “0xabcd” 的值。
    以下是 IQ-9075/IQ-9100 的示例命令。
    注意 根据 contents.xml 文件中指定的路径更新镜像路径。
  4. 检查 contents.xml 文件中带有 pil_split 标志的所有镜像。
    示例:pil_split = "adsp" 对于应该拆分的镜像,请使用 --pil-split 选项。
  5. 要签名完整的 metabuild,请使用以下命令。
    有关更多信息,请参阅 SecTools V2:Metabuild 安全镜像用户指南。
    注意 SecTools 指南对具有授权访问权限的许可用户开放。

生成已签名的 sec.elf 镜像

生成已签名的 sec.elf 镜像涉及创建带有加密签名的安全可执行和可链接格式 (ELF) 文件。签名此镜像可确保其真实性、完整性和来源。 熔丝熔断器二进制文件用于出于安全原因永久禁用设备的某些功能或组件。生成带有熔丝熔断器二进制文件的已签名 sec.elf 镜像涉及一系列步骤,以确保固件的完整性和设备的安全性。要生成熔丝熔断器二进制文件,请参阅 SecTools V2:熔丝熔断器用户指南。

使用 SecTools 集成示例命令

本节仅提供示例命令。以下是 Linux 上 SecTools 的示例命令。 注意
  • 确保命令中的值(如 PK 哈希、OEM ID 和产品 ID)采用十六进制格式。
  • 您可以根据要求替换 OEM ID “0x1” 和 OEM 产品 ID “0xabcd” 的值。
  • 您可以将 --fuse-pk-hash-0 的值替换为 OEM-KEYS/qpsa_rootca.cer 的 SHA384。
    要计算正确的 PK 哈希值,请使用以下命令:
    有关更多信息,请参阅 为 RSA 和 ECDSA 生成 SHA-384 哈希。
  • 从下面 sec.elf 生成命令的用户根证书中生成的摘要中替换。
  • 阶段 1:基本安全启动(镜像身份验证 + OEM ID + MODEL ID) 运行以下命令:
  • 阶段 2:完整安全启动(基本安全启动 + 调试禁用 + 防回滚 + 写入权限禁用): 运行以下命令。
注意 SecTools 指南对具有授权访问权限的许可用户开放。
重要 OEM_enable_bootup_from_a_b_partition 配置是可选的,位于 trustzone_images/ssg/securemsm/trustzone/qsee/mink/oem/config/<chipset>/oem_config.xml 中。其默认值为 0。当设置为 1 并且重新编译 devcfg 时,它会启用回滚安全性。在通过 UEFI 或客户端应用程序的 SMC 确认启动后,它允许 TrustZone 更新镜像回滚版本。

使用统一镜像加密

统一镜像加密 (UIE) 是一种标准化的镜像加密方案。它使用分层的 L1-L2-L3 AES 密钥梯,L1 是根密钥,熔断在硬件中。L2 是使用 L1 密钥包装的下一级密钥,L3 是用于加密镜像的密钥。它使用 L2 密钥包装。 有关与 UIE 加密相关的命令行使用,请参阅 SecTools V2:安全镜像用户指南。 IQ-9075/IQ-9100 和 IQ-8275/IQ-8300 不支持 UIE 加密。
注意 SecTools 指南对具有授权访问权限的许可用户开放。

生成用于加密的自己的密钥

  1. 用户 UIE 密钥是标准 AES 128 密钥,可以使用 OpenSSL 工具生成。
    使用命令:
    其中:
    • openssl enc:调用 OpenSSL 加密工具。
    • -aes-128-cbc:指定加密算法——在密码块链接 (CBC) 模式下的 128 位密钥 AES。
    • -k secret:提供密码(secret),从中派生密钥和初始化向量 (IV)。
    • -P:打印派生的密钥和 IV,而不是执行加密或解密。
    • -md sha1:指定在密钥派生函数 (KDF) 中使用的消息摘要算法 (sha1)。
    例如:
    • salt=E2A1F3C4D5B6A798
    • key=5F4DCC3B5AA765D61D8327DEB882CF99
    • iv =AABBCCDDEEFF00112233445566778899
  2. 将密钥复制到文件以制作您的密钥。
    echo -n "5F4DCC3B5AA765D61D8327DEB882CF99" | xxd -r -p > l1_key.key

生成 UIE sec.elf 文件

  1. 使用命令生成 UIE sec.elf 文件。
  2. 更新适合芯片组的安全配置文件 XML。
  3. 根据要求使用 LOCAL 或 PLUGIN 作为签名模式。
  4. 根据您的密钥更新加密密钥。
生成 UIE sec.elf 文件后,您可以将其刷写到非安全设备上。刷写 UIE sec.elf 后,您应该刷写安全启动启用 sec.elf 以及其他熔丝。

加密二进制文件

要使用测试密钥加密二进制文件,请在签名命令中使用以下参数。
要使用本地密钥加密二进制文件,请在签名命令中使用以下参数。

刷写镜像

刷写镜像涉及将整个镜像(包括分区、文件系统和数据)写入存储设备。此过程有助于保持设备的功能、安全性和性能。 请按照以下步骤刷写镜像:
  1. 请参阅 设置 QFPROM 熔丝 了解要配置的熔丝列表。
  2. 将所有二进制文件替换为 签名镜像 中生成的已签名非 Linux 二进制文件,包括 prog_firehose_ddr.elf。 要替换 PIL 镜像,请用之前生成的相应已签名版本替换现有的 PIL 镜像。
    • 提取 <chipset_name.LE.x.x>/common/build/ufs/bin/<chipset_name>_fw.zip 文件。
    • 将 PIL 拆分二进制文件和签名输出中生成的 .mdt 文件替换到提取的目录 <chipset_name.LE.x.x>/common/build/ufs/bin/<chipset_name>_fw/lib/firmware/qcom/<chipset_name> 中。
    • 将 <chipset_name.LE.x.x>/common/build/ufs/bin/<chipset_name>_fw 目录以 <chipset_name>_fw.zip 名称压缩。
    • 重新编译 Yocto 构建。
  3. 要将所有已签名的二进制文件刷写到设备,请参阅 Qualcomm Linux 构建指南。
  4. 生成已签名的镜像和 sec.elf 后,启用安全启动:
    1. 先刷写没有 sec.elf 的已签名镜像,并确保设备成功启动。
    2. 通过更新正确的 rawprogramX.xml 文件刷写 sec.elf。
      通过更新正确的 rawprogramX.xml 文件刷写 sec.elf。查找带有 label=“secdata” 条目的 rawprogramX.xml 文件,并使用 sec.elf 更新该条目中的文件名。例如,在 QCM6490 中: <program start_sector="315239" size_in_KB="28.0" physical_partition_number="4" partofsingleimage="false" file_sector_offset="0" num_partition_sectors="7" readbackverify="false" filename="sec.elf" sparse="false" start_byte_hex="0x4cf67000" SECTOR_SIZE_IN_BYTES="4096" label="secdata"/>
    3. 使用 Qualcomm Linux 构建指南 中的刷写流程刷写已签名的镜像和 sec.elf。
    4. 使用 PCAT 刷写镜像。
    5. 使用 启动 → 验证安全启动 验证安全启动是否已启用。 重要 启用安全启动后,设备期望使用称为已验证镜像编程 (VIP) 的安全编程方法刷写镜像。要继续,请参阅 执行 VIP 刷写

后续步骤

  • 要通过仅允许对数字签名的镜像进行编程来确保设备安全,请参阅 执行 VIP 刷写。
  • 要强制执行严格的访问控制,请参阅 启用 SELinux。