> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 安全功能

Qualcomm<sup>®</sup> Linux<sup>®</sup> 集成了多项旨在保护设备和应用程序的安全功能。这些功能对于防御漏洞、确保数据的完整性和机密性、保持符合行业标准以及支持整体系统稳定性至关重要。

Qualcomm<sup>®</sup> 可信执行环境（Qualcomm TEE）进一步增强了这些安全能力。它提供的接口可以通过可信应用程序扩展安全功能集。硬件支持的 TrustZone 架构集成了某些功能，提供系统级安全配置。这些功能还可以进一步定制以满足特定需求。

请在本节中探索以下安全功能和视频。

[加密技术](./security-features#cryptography)

[密钥管理](./security-features#key-management)

[安全启动](./security-features#secure-boot)

[存储安全](./security-features#storage-security)

[存储加密](./security-features#storage-encryption)

[QCOMTEE 驱动](./security-features#qcomtee-driver)

[访问控制](./security-features#access-control)

[安全外设镜像加载](./security-features#secure-peripheral-image-loading)

[SELinux](./security-features#selinux)

[Qualcomm TEE](./security-features#qualcomm-tee)

[Qualcomm Hypervisor](./security-features#qualcomm-hypervisor)

[安全加固](./security-features#security-hardening)

[Qualcomm WES](./security-features#qualcomm-wireless-edge-services)

[分立式可信平台模块](./security-features#discrete-trusted-platform-module)

[观看安全启动技术视频](./security-features#watch-a-video-on-secure-boot-technology)

[观看 Qualcomm Type-1 Hypervisor 和可信执行环境视频](./security-features#watch-a-video-on-qualcomm-type-1-hypervisor-and-trusted-execution-environment)

## **加密技术**

加密技术是通过算法和秘密密钥将可读数据转换为不可读格式来保护信息的过程。Qualcomm Linux 支持全面的加密能力，利用硬件加速和基于软件的实现来增强系统安全性。

关键能力包括：

* 具有基于直接内存访问的寄存器和总线访问管理器。
* 与加密硬件的接口。
* Linux 内核加密驱动（qcrypto）提供独立于可信应用程序的硬件加密访问。
* Qualcomm TEE 为可信应用程序提供硬件和软件加密应用程序编程接口（API）。

Qualcomm TEE 支持以下加密算法：

**表：加密算法**

| **算法** |                                       **硬件**                                       |                                                              **软件**                                                              |
| :----: | :--------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: |
|   哈希   |                                    SHA-1/SHA-256                                   |                                <ul><li>SHA-1/SHA-224/SHA-256/SHA-384/SHA-512</li><li>SM3</li></ul>                               |
|  对称密码  | <ul><li>AES-128/AES-256 CBC、ECB、CTR、CCM、GCM，</li><li>Triple-TDES CBC/ECB</li></ul> | <ul><li>AES-128/AES-192/AES-256 CBC、ECB、CTR、CCM、XTS、CFB、OFB、CTS</li><li>Triple-TDES CBC/ECB</li><li>PBKDF2</li><li>SM4</li></ul> |
|   MAC  |                                      AES-CMAC                                      |                                                          基于哈希的消息认证（HMAC）                                                         |
|   RNG  |                                        HRNG                                        |                                                                 –                                                                |
|  HMAC  |                                 HMAC-SHA-1/SHA-256                                 |                                            HMAC-SHA-1/SHA-224/SHA-256/SHA-384/SHA-512                                            |
|  非对称密码 |                                          –                                         |              <ul><li>模数为 1024/2048/3072 的 RSA</li><li>P224、P256、P384、P521 的 ECDSA</li><li>ECDH</li><li>SM2</li></ul>             |

### **内联加密引擎**

<Warning>
  ICE 现在在 ufs 和 emmc 存储变体上支持标准密钥和包裹密钥。

  iq-9075（emmc）、iq-x7181（ufs）目前不支持 ice。
</Warning>

内联加密引擎（ICE）对存储数据执行高吞吐量的加密操作。

ICE 支持：

* AES 128/AES 256 ECB/XTS
* 多个加密流以满足高吞吐量需求
* 每个加密流可有多个 AES 核心
* 提供 32 个软件可配置密钥
* 支持启用对称和非对称操作
* 支持 emmc 和 ufs 存储变体。
* 默认配置下使用标准密钥。
* 包裹密钥支持可通过 module\_param(use\_wrapped\_keys) 配置。

## **密钥管理**

密钥管理是指安全地创建、存储、使用和删除加密密钥的方式。这些密钥有助于保护敏感数据。Qualcomm Linux 安全解决方案通过实现 PKCS#11 API 支持公钥加密标准。这使应用程序能够以平台无关且标准化的方式管理和使用加密密钥和证书。

Qualcomm 在 `libckqteec` 库中实现了 PKCS#11 接口，该实现构建于 `libminkteec` 库提供的 GlobalPlatform 标准接口之上，用于与 Qualcomm TEE 中的可信应用程序通信。

### **使用 PKCS#11 开发用于密钥管理的 Linux 用户空间应用程序**

要执行密钥生成、存储、检索和删除等密钥管理操作，请在 Qualcomm Linux 上的用户空间客户端应用程序中使用 PKCS#11 服务 API。你的应用程序应与 Cryptoki 客户端库 `libckqteec` 交互以访问 PKCS#11 接口。

下表列出了支持密钥管理功能的通用 API。

| `C_GenerateKey`     | 生成秘密密钥     | AES - CBC、CTS、CTR、CMAC                |
| :------------------ | :--------- | :------------------------------------ |
| `C_GenerateKeyPair` | 生成公钥/私钥对   | RSA、ECDSA                             |
| `C_WrapKey`         | 包裹（加密）密钥   | RSA、AES                               |
| `C_UnwrapKey`       | 解包（解密）密钥   | RSA、AES                               |
| `C_DeriveKey`       | 从基础密钥派生密钥  | AES-ECB、AES-CBC                       |
| `C_DigestKey`       | 将密钥摘要为消息摘要 | SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 |

下图展示了从客户端应用程序到 PKCS 可信应用程序在密钥相关用例中的调用流程。

**图：客户端与 PKCS 可信应用程序调用流程**

<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/key-management-function.png?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=d46c324dd7598c1d26bd41ee50872b23" alt="客户端与 PKCS 可信应用程序调用流程" width="768" height="604" data-path="System/Security/media-security/k2c-qli-security/key-management-function.png" />

有关更多信息，请参阅以下文档：

* [PKCS #11 Cryptographic Token Interface Base Specification](http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/os/pkcs11-base-v2.40-os.html)
* [PKCS #11 Cryptographic Token Interface Usage Guide](https://docs.oasis-open.org/pkcs11/pkcs11-ug/v2.40/cnd01/pkcs11-ug-v2.40-cnd01.html)

### **限制**

不支持以下功能：

* 随机数生成器功能
* CKM\_ECDSA 中的 P-192
* CKM\_RSA\_PKCS 模式下的 RSA PKCS 密钥生成和签名
* EDDSA 密钥生成和签名
* RSA 互操作性有限；不支持多种旧格式、专用 RSA 模式以及基于 SHA3 的 RSA 组合。
* 椭圆曲线支持对于较新的 PKCS#11 v3.0 功能（如 Edwards/Montgomery 曲线、EdDSA、XEdDSA 以及高级 EC 派生/KDF 变体）不完整。
* 不支持基于 SHA3 的机制，如摘要、HMAC、密钥派生及相关签名组合。
* 不支持高级 AES 模式，如 AES-OFB、AES-CFB、AES-XTS、AES-CCM、AES-GMAC 以及某些 AES MAC 变体。
* 多种对称 MAC 和带密钥哈希变体不完整，尤其是基于 SHA3 的机制和某些通用长度机制。
* 不支持协议特定和专用机制，如 SSL/TLS/WTLS、PBE、HKDF、ChaCha20/Poly1305、Salsa20/Poly1305 及类似的高级机制。
* 某些机制仅部分支持或因后端/QTEE GP 限制而被阻止，包括 ECDSA 和某些 EC 相关测试流程

## **观看安全启动技术视频**

**Qualcomm 处理器安全：基础**

*在这个全面的教程中，充分释放 Qualcomm 设备上安全启动技术的全部潜力。从生成加密密钥到编程硬件熔丝和管理安全启动状态，本视频详细介绍了每个步骤。非常适合希望通过认证启动过程增强设备安全性的用户。学习如何有效使用 Qualcomm 工具，确保你的设备每次都安全启动。*

[<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/video1-features-qualcomm-security-processor-foundations-pdf.svg?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=0777317199fecdb7f5402c6e62988686" alt="Qualcomm 处理器安全：基础视频缩略图" width="432" height="281" data-path="System/Security/media-security/k2c-qli-security/video1-features-qualcomm-security-processor-foundations-pdf.svg" />](https://players.brightcove.net/1414329538001/BJv5wEFt_default/index.html?videoId=6358216194112)

[观看视频：Qualcomm 处理器安全：基础](https://players.brightcove.net/1414329538001/BJv5wEFt_default/index.html?videoId=6358216194112)

## **安全启动**

安全启动是为整个软件栈建立可信平台的启动序列。

请参阅工作流程以了解安全启动和 UEFI 安全启动过程。

**图：安全启动与 UEFI 安全启动对比**

<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/secure-boot-uefi-workflow-updated.png?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=aeb7cc1bc7618b9445bbe3e9b65e3e99" alt="安全启动与 UEFI 安全启动对比" width="913" height="578" data-path="System/Security/media-security/k2c-qli-security/secure-boot-uefi-workflow-updated.png" />

此过程使用加密认证来启动一个不可变的序列，该序列验证代码的来源，确保执行经过授权的软件。此过程：

* 确认由 Qualcomm 和用户签名的所有软件镜像（非 Linux 镜像）的真实性。此过程由设备执行。
* 防止任何未经授权或被恶意修改的软件在设备上运行。

安全启动功能认证非 Linux 镜像，而 UEFI 安全启动认证 Linux 镜像。

### **UEFI 安全启动**

UEFI 安全启动是统一可扩展固件接口（UEFI）规范的一项功能，该规范定义了操作系统与平台固件之间的接口。

有关更多信息，请参阅 [UEFI 规范](https://uefi.org/specs/UEFI/2.10/)。

UEFI 安全启动的功能包括：

* 确保设备 UEFI 固件运行的代码在操作系统开始启动之前是安全且受信任的。
* 定义 UEFI 如何认证镜像，如 Linux 镜像、操作系统加载器（uki.efi）、systemd boot（bootaa64.efi）和设备树 blob（DTB）镜像文件。
* 确保镜像仅在由有效授权用户签名时才被加载。此过程还确保了在基于 UEFI 固件的系统上运行的 Qualcomm Linux 的安全性和完整性。

UEFI 安全启动允许 Qualcomm Linux 用户：

* 验证 UEFI 加载镜像的完整性和安全性，确保其以经批准的方式加载。
* 管理由 UEFI 安全启动认证变量定义的 Qualcomm Linux 安全策略，其中包括：
  * 平台密钥（PK）
  * 密钥交换密钥（KEK）
  * 允许数据库（dB）
  * 禁止数据库（DBX）（本版本不支持。）

## **存储安全**

存储安全功能通过两个关键组件存储和保护敏感数据：安全文件系统（SFS）和重放保护内存块（RPMB）。

### **SFS**

SFS 是一种受保护的存储功能，可安全存储加密密钥和生物识别信息等敏感数据。它在 Qualcomm TEE 中运行，使用加密和隔离来防止未经授权的访问。

它为可信应用程序提供机密性、完整性和防回滚支持，并安全存储敏感数据。防回滚保护涵盖在 SFS 下创建或存储的文件。

SFS 功能使用：

* 为每个可信应用程序提供加密密钥，以确保文件的机密性。
* 为每个可信应用程序提供 HMAC 密钥，以验证文件的完整性。

加密密钥和 HMAC 密钥均使用设备唯一密钥派生，该密钥取决于设备的安全启动状态。SFS 防回滚保护默认启用。

当设备启用安全启动后，SFS 使用唯一的硬件密钥进行文件数据的加密和解密，以确保它们彼此隔离且安全。

### **RPMB**

RPMB 是 UFS/eMMC 闪存等存储设备中的一个安全物理分区。该分区存储必须防止篡改和回滚的关键数据，且只能从 Qualcomm TEE 访问。

要读写 RPMB 分区，需要进行 [RPMB 密钥配置](./customize-security-services)。这是一次性过程，完成后无法覆盖或擦除。

对 RPMB 的每次访问都经过认证，允许主机以经过认证且防重放的方式存储数据。

## **存储加密**

<Warning>
  iq-9075（emmc）、iq-x7181（ufs）目前不支持存储加密。
</Warning>

存储加密通过支持对文件和目录的透明加密来增强安全性。

Qualcomm Linux 通过 [ICE](./security-features#inline-crypto-engine) 和硬件包裹密钥支持存储加密。它提供更高的效率和增强的密钥保护。

存储加密功能允许：

* 提供 32 字节到 64 字节的标准密钥用于内容加密
* 提供用于内容加密的包裹密钥
* 使用不同的密钥加密文件名和文件内容
* 生成 32 字节的密钥标识符

Qualcomm 通用闪存存储（UFS）驱动和 eMMC（sdhc）可以支持 `fscrypt` API。

有关 `fscrypt` API 的更多信息，请参阅 [Filesystem-level encryption (fscrypt) Linux 内核文档](https://www.kernel.org/doc/Documentation/filesystems/fscrypt.rst)。

有关相关内核文档，请参阅以下文件：

* [Inline encryption](https://www.kernel.org/doc/Documentation/block/inline-encryption.rst)
* [用于存储加密的 I/O 控制（IOCTL）支持](https://www.kernel.org/doc/Documentation/userspace-api/ioctl/ioctl-number.rst)

你可以使用开源 [fscryptctl](https://github.com/google/fscryptctl) 工具调用存储加密功能。

## **QCOMTEE 驱动**

QCOMTEE 驱动是 Qualcomm Linux 上安全通信的基石。通过将基于对象 IPC 的 Mink 通信协议集成到标准 Linux TEE 子系统中，它提供了一种安全、可扩展且对上游友好的方式来访问硬件支持的可信服务。它成功地弥合了 Qualcomm 面向对象安全架构与 Linux 内核标准化安全框架之间的差距。

QCOMTEE 驱动是 Linux 内核中专为 Qualcomm 平台设计的专用后端驱动。它使用 Mink-IPC 协议促进高级操作系统（HLOS）与 Qualcomm TEE 之间的通信。

QCOMTEE 驱动是旧版下游 si-core（SMCInvoke）驱动的现代化、符合上游标准的替代品。其主要作用是为 Mink-IPC 提供安全传输层，Mink-IPC 是一种基于对象能力的 IPC 协议。与使用简单命令式接口的传统 TEE 驱动不同，QCOMTEE 实现了基于对象的 IPC 模型。这使用户空间应用程序和内核客户端能够像操作本地对象一样与 Qualcomm TEE 服务交互，从而支持嵌套对象传递和回调等丰富功能。

QCOMTEE 具有以下主要接口组件：

* Mink TEEC 库：公开 GlobalPlatform TEE 客户端 API 接口，允许客户端使用 Mink Adaptor 与 Qualcomm TEE 通信。
* Mink Adaptor 库：实现 Mink-IPC 接口，进而允许客户端使用 Mink-IDL 编程接口，通过 QCOMTEE 跨安全域边界与 Qualcomm TEE 通信。
* QCOM-TEE 库：使用在 Linux TEE 子系统中注册的 QCOM-TEE 驱动，提供与 Qualcomm TEE 通信的接口。它支持用户空间客户端使用 Linux TEE 子系统的 `TEE_IOC_OBJECT_INVOKE` IOCTL 与 Qualcomm TEE 进行通用的基于对象的 IPC。

下图展示了 QCOMTEE 驱动架构：

**图：QCOMTEE 驱动架构**

<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/qli-2x-qcomtee-driver.svg?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=1abc8b83f35b2a35b9da0c692f11533f" alt="QCOMTEE 驱动架构" width="443" height="370" data-path="System/Security/media-security/k2c-qli-security/qli-2x-qcomtee-driver.svg" />

## **访问控制**

访问控制使用策略、技术和信任模型，确保只有经过授权的实体才能在规定条件下访问特定资源。

访问控制信任模型通过管理各种资产、接口、片上系统（SoC）组件和镜像之间的访问控制配置来确保持续的安全性。该模型有助于支持敏感信息的完整性和机密性。

* Qualcomm 访问控制使用外部保护单元（xPU）控制从次级侧对寄存器、固定地址和动态内存区域的访问。
* 系统内存管理单元（SMMU）控制从主侧的访问，用于内容保护和子系统内存共享用例。

### **访问控制域**

两个控制级别是：

1. TrustZone 管理 TrustZone 域，并使用 xPU 控制从次级侧的访问。
   * xPU 是由多个称为保护单元的安全模块组成的组合。它基于一组可编程访问控制寄存器允许有条件的访问。
   * 如果系统拒绝访问，xPU 会生成错误输出信号，并在必要时生成中断请求信号。
2. Hypervisor（EL2）管理非安全域，包括旨在防止访问付费视频的内容保护区（CPZ）。
   * 它通过 SMMU 经由第二阶段页表配置主侧的访问控制。
   * 它管理 stage-2 映射，以保护所有主域（Linux、显示、GPU 和视频）中的资产。Linux 内核管理 stage-1 映射，以保护以用户权限级别运行的应用程序中的资产。

下图展示了访问控制域。

**图：访问控制域**

<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/access-control-trust-hierarchy-security-domain-updated.png?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=fee87ee80de6fe5acbf1046c85c6b468" alt="访问控制域" width="833" height="342" data-path="System/Security/media-security/k2c-qli-security/access-control-trust-hierarchy-security-domain-updated.png" />

## **安全外设镜像加载**

TrustZone 的安全外设镜像加载（PIL）对不同的镜像进行认证，并为音频、摄像头和视频等所有子系统配置 xPU。

有关 xPU 的更多信息，请参阅[访问控制](./security-features#access-control)。

## **SELinux**

SELinux 是 Linux 的安全增强功能，可对系统访问提供更强的控制。它使用 Linux 安全模块（LSM）框架在 Linux 内核中实现强制访问控制（MAC）。

有关更多信息，请参阅[什么是 SELinux？](https://www.redhat.com/en/topics/linux/what-is-selinux)

LSM 框架包括以下控制：

* 自主访问控制（DAC）
  * 这是 Linux 访问控制的标准形式。数据所有者对资源（如数据和文件）拥有完全控制权，可以更新或修改数据。
  * 某些应用程序（具有 root 权限）可以覆盖此控制。某些资源（如套接字）不受检查。
  * 访问控制基于用户和组身份，粒度有限。例如，文件模式 `–rwxr-xr-x-`。
* MAC
  * 系统级安全策略决定所有进程、对象和操作的 Linux 访问控制。
  * 该策略可以约束有缺陷和恶意的应用程序或不谨慎的用户。它甚至可以防止用户提升权限，如 root 或 UID 0。
  * MAC 为访问控制提供更细的粒度，允许通过更具体的控制访问除文件之外的更多资源。例如，取消链接、仅追加或移动文件。

下图展示了 DAC 和 MAC 决策链中的步骤：

**图：Linux 安全模块：DAC 和 MAC**

<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/selinux-mac-dac-updated.png?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=8f060effdac780b19298e3ab3369350a" alt="Linux 安全模块：DAC 和 MAC" width="913" height="608" data-path="System/Security/media-security/k2c-qli-security/selinux-mac-dac-updated.png" />

SELinux 支持三种模式：

* Enforcing 模式（默认）：在此模式下，SEPolicy 在系统上强制执行。如果运行软件时不满足 SEPolicy 规则，访问将被阻止。内核会将尝试的访问违规作为访问向量缓存（AVC）拒绝消息记录到 `dmesg`、`journalctl` 和 `/var/log/audit/audit.log`。
* Permissive 模式：在此模式下，SEPolicy 不在系统上强制执行。所有拒绝都会记录到 `dmesg`、`journalctl` 和 `/var/log/audit/audit.log` 日志中，但不会禁止进程或软件的访问。
* Disable 模式：在此模式下，SEPolicy 既不强制执行也不记录。

有关启用 SELinux 的信息，请参阅[启用 SELinux](./enable-se-linux.mdx)。要配置 SELinux 模式，请参阅 [SELinux 配置](./enable-se-linux.mdx)。

### **SELinux 层**

SELinux 动态层包含必要的 SELinux 专用代码修改，当以模块化设计启用 SELinux 时激活并初始化设备。

**图：SELinux 层**

<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/selinux-process-updated.png?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=56999203ff626d72437d68b8ddec0132" alt="SELinux 层" width="1170" height="306" data-path="System/Security/media-security/k2c-qli-security/selinux-process-updated.png" />

该层构建在 meta-SELinux 层之上，后者是 Yocto 上游的一部分。它包括：

* recipe-kernel，其中包含用于启用 SELinux 所需内核配置标志的配方。
* recipe-security 包括：
  * 用于将设备启动到 shell 的策略
  * Qualcomm 服务和测试应用程序的策略
  * 以补丁形式提供的上游服务策略
  * 用于管理 Qualcomm 策略编译的配方

### **Refpolicy**

[refpolicy](https://github.com/SELinuxProject/refpolicy) 是一个包含核心 SELinux 策略配置的 github 仓库。

上游 SEPolicy 在 `refpolicy` 中定义，在构建期间下载，并在以下位置使用 Qualcomm SEPolicy 进行修订：`meta-qcom-distro/recipes-security/refpolicy/refpolicy-targeted/`。

下图展示了合并和编译以生成 `policy.35` 的高级目录结构，`policy.35` 是启动期间使用或加载的 SEPolicy 二进制文件。

**图：SEPolicy 高级目录**

<img src="https://mintcdn.com/qualcomm-prod/dPo3rgzUAldwEaFG/System/Security/media-security/k2c-qli-security/sepolicy-figure-updated.png?fit=max&auto=format&n=dPo3rgzUAldwEaFG&q=85&s=10064d382631a606aeb96f4a3d98eaff" alt="SEPolicy 高级目录" width="1144" height="531" data-path="System/Security/media-security/k2c-qli-security/sepolicy-figure-updated.png" />

有关更多信息，请参阅[定制内存和 SEPolicy](./customize-security-services.mdx)。

## **观看 Qualcomm Type-1 Hypervisor 和可信执行环境视频**

**Qualcomm 处理器安全：TEE 和芯片组服务**

*在这个全面的教程中，学习如何使用 Qualcomm:sup*`® `*Type-1 Hypervisor 和可信执行环境。深入了解平台虚拟化、安全通信以及 Qualcomm 提供的丰富安全功能。学习如何使用 Qualcomm 工具和 API 开发安全应用程序，并了解 Qualcomm 支持的关键安全用例和合规标准。非常适合希望增强设备安全性和功能性的用户。*

[<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/video2-features-tee-and-chipset-services-pdf.svg?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=7d47522dbd05fc5afb9cb64d9193d430" alt="Qualcomm 处理器安全：TEE 和芯片组服务视频缩略图" width="432" height="279" data-path="System/Security/media-security/k2c-qli-security/video2-features-tee-and-chipset-services-pdf.svg" />](https://players.brightcove.net/1414329538001/BJv5wEFt_default/index.html?videoId=6358216309112)

[观看视频：Qualcomm 处理器安全：TEE 和芯片组服务](https://players.brightcove.net/1414329538001/BJv5wEFt_default/index.html?videoId=6358216309112)

## **Qualcomm TEE**

Qualcomm TEE 是在 Qualcomm 设备上的 Arm TrustZone 环境中运行的软件。

TrustZone 是通过 Arm 处理器的安全模式启用的基于硬件的安全架构。它建立了两个执行环境，具有系统级的硬件强制隔离。有关更多信息，请参阅[什么是 TrustZone？](https://developer.arm.com/documentation/102418/0101/What-is-TrustZone-)

Qualcomm 提供带有硬件虚拟化的 64 位 Arm 8.x 处理器系统来运行 TrustZone。

在 TrustZone 架构中，有两种安全状态：

* 安全
* 非安全

在 EL0、EL1 和 EL2 [异常级别](https://developer.arm.com/documentation/102412/0103/Privilege-and-Exception-levels/Exception-levels)，处理器可以处于安全状态或非安全状态，而 EL3 始终处于安全状态。

操作系统运行在非安全 EL1。从非安全模式到安全模式的转换通过安全监视器模式实现。

Qualcomm TEE 提供以下功能：

* 从硬件保护的内存中运行
* 支持安全模块（如加密引擎、PRNG、内联加密引擎和外部保护单元（xPU））的功耗折叠
* 支持安全外设镜像加载器（PIL）
* 支持子系统重启
* 提供内容保护
* 支持运行可信应用程序
* 支持熔丝管理

### **可信应用程序**

可信应用程序（TA）在安全环境中为非安全的 Linux 客户端提供服务。Qualcomm TEE 为可信应用程序扩展了以下服务：

* 支持可信应用程序在安全世界的 EL0 中运行
* 为可信应用程序提供沙箱环境
* 可信应用程序的位置无关加载
* 不同可信应用程序之间的消息传递

可信应用程序从受硬件保护的内存中运行。但是，需要更多内存的应用程序可以使用双倍数据速率（DDR）内存进行加载和运行。默认情况下，应用程序设置为从硬件保护的内存中运行。

## **安全加固**

安全加固是一个通过增加攻击者利用系统漏洞的难度来最小化系统攻击风险的过程。

内核安全加固与上游内核准则保持一致。关键内核标志（如 KASLR、加固用户复制、栈保护器和权限（RWX））已启用。

### **用户空间加固**

[security\_flags.inc](https://github.com/yoctoproject/poky/blob/scarthgap/meta/conf/distro/include/security_flags.inc) 文件是 [Yocto 项目](https://www.thegoodpenguin.co.uk/blog/yocto-security-hardening-security-flags/)的一部分，用于为构建启用安全编译器和链接器标志。

要将此功能扩展到 Qualcomm 模块，请将以下命令添加到 `qcom-security_flags.inc`（文件路径：[qcom-security\_flags.inc](https://github.com/quic-yocto/meta-qcom-distro/blob/kirkstone/conf/distro/include/qcom-security_flags.inc)）：

```text theme={null}
require conf/distro/include/security_flags.inc
```

添加这些标志可能会导致警告或错误，从而中断构建。不过，Yocto 提供了为有问题的软件包禁用某些编译器标志的方法。GCC 和 Clang 等现代编译器提供了广泛的编译器标志，可以增加攻击者利用某些类型漏洞的难度。

以下是 GCC 的示例标志：

* `Wformat` 标志添加编译时检查，以检测 `printf`、`scanf` 和 `strftime` 等常见库函数中字符串参数格式相关的问题。
* `D_FORTIFY_SOURCE` 标志添加编译时和运行时检查，以检测内存和字符串函数中的缓冲区溢出。
* `Fstack-protector` 标志添加运行时检查，以检测缓冲区溢出和栈破坏。
* `Fpie` 标志启用位置无关代码，允许在随机化位置加载二进制文件，从而使某些类型的攻击（如面向返回的编程）更加困难。
* `Wl,-z,relro,-z,now` 标志使滥用二进制全局偏移表变得更加困难。

如果出现警告和错误，为某些模块定制这些标志可能会破坏构建。可以使用 Checksec 工具验证文件系统中的二进制文件是否应用了编译器漏洞缓解功能。

有关使镜像更安全的信息，请参阅 [The Yocto Project Documentation](https://docs.yoctoproject.org/scarthgap/dev-manual/securing-images.html)。

## **Qualcomm Wireless Edge Services**

Qualcomm<sup>®</sup> 无线边缘服务（Qualcomm WES）是一套以硬件为根基的可信服务，可安全地连接和管理设备。

它提供以下服务：

* 功能许可支持由功能 ID 和别名功能名称标识的设备功能。通过安装相应的功能许可证或证书来启用这些功能。
* 设备认证提供描述设备及其软件安全状态的经加密签名和加密的数据项。这些数据项对风险引擎和其他类似应用程序非常有用。
* 安全配置支持生成和使用由设备唯一密钥保护的加密密钥。这些密钥用于：
  * 在售后通过空中下载（OTA）方式安全地向设备配置数据。
  * 在设备上签名数据。

要安装或升级 QCS5430 SoftSKU 功能包，请参阅[安装或升级 SoftSKU 功能包](./install-or-upgrade-the-soft-sku-feature-packs)。

要开发提供基于硬件的认证、零接触设备配置和芯片组功能管理的应用程序，请参阅 [Qualcomm Linux Wireless Edge Services Guide](https://docs.qualcomm.com/bundle/resource/topics/80-80021-11B/overview.html)。此功能仅面向具有授权访问权限的许可用户。

<Warning>
  Qualcomm Dragonwing™ IQ-615 版本不支持 Qualcomm WES。
</Warning>

## **分立式可信平台模块**

分立式可信平台模块（dTPM）是一种专用硬件模块，提供安全密钥存储、加密操作、度量启动和平台认证等强大的安全功能。Qualcomm Linux 支持 dTPM 集成，特别适用于需要增强的基于硬件保护的工业和安全导向应用。

dTPM 的主要功能包括：

* TPM 2.0 合规性：全面支持 TPM 2.0 标准。
* 安全存储：为加密密钥和敏感资产提供硬件支持的保护。
* 开源软件栈：与 TPM2 软件栈（TSS、tpm2-tools、tpm2-abrmd、tpm2-tss-engine、tpm2-pkcs11）集成。
* Linux 内核支持：TPM 2.0 的上游驱动（SPI 接口）。

支持以下用例：

* 安全启动和度量启动
* 用于加密操作的密钥管理
* 工业 IoT 的平台认证
* 使用 TPM2 引擎与 OpenSSL 和 PKCS#11 集成

### **支持 dTPM 的 Qualcomm Linux 芯片组**

dTPM 支持已在以下 Qualcomm Linux 定制软件发行版上启用并验证：QCS6490（Industrial Mez Kit）、Qualcomm Dragonwing™ IQ-9075 和 Qualcomm Dragonwing™ IQ-8275

它包括以下集成和功能：

> **注意**
>
> 在 **QCS6490 Industrial Mez Kit** 平台上，如果启动后不存在 `/dev/tpm0` 和 `/dev/tpmrm0` 设备节点，请执行以下命令并重启系统：
>
> ```bash theme={null}
> echo "tpm_tis_spi" > /etc/modules-load.d/tpm.conf
> ```
>
> 这可确保 `tpm_tis_spi` 模块在启动期间自动加载，从而启用 TPM 设备节点。

* 硬件接口：dTPM 通过 SPI 连接，复位由 GPIO 控制。
* 设备树支持：硬件检测仅需要设备树更改；无需修改内核驱动。
* 软件栈：基于 Yocto 的 Linux 发行版包含完整的 TPM2 软件栈（例如 tpm2-tss 和 tpm2-tools）。
* 虚拟化支持：支持多虚拟机（KVM）配置，可为客户机虚拟机提供 dTPM 资源管理器直通。
* 平台特定性：并非所有 Qualcomm SoC 都默认启用 dTPM；它面向需要工业级安全和度量启动的平台。
* 可用性：TPM2 软件栈已包含在受支持平台的 QC Linux Yocto 层中。

#### **软件栈**

* Yocto 层：TPM 用户空间栈（例如 tpm2-tss、tpm2-tools）通过专用配方启用。
* 内核驱动：使用上游 TPM 驱动；硬件启动仅需最小的更改。请参阅 [Bootlin Source Drivers](https://elixir.bootlin.com/linux/v6.10.4/source/drivers/char/tpm)。
* 用户空间交互：应用程序通过 libtss 栈与 TPM 交互。请参阅 [Linux TPM2 & TSS2 Software](https://github.com/tpm2-software)。

#### **硬件集成**

* SPI 接口：TPM 通过 SPI 线路（例如 SPI11）连接，复位由专用 GPIO 控制。
* 设备树配置：通过向设备树添加 TPM 节点来启用 TPM 支持，允许开源 TPM 驱动探测硬件。
* GPIO 控制：更新 PMIC 节点以管理 TPM 复位功能。

#### **外部依赖**

* TPM2 软件栈：包括 tpm2-tss、tpm2-tools 和用于用户空间交互的加密引擎等组件。请参阅 [tpm2-tools git.X](https://layers.openembedded.org/layerindex/recipe/87697/) 和 [tpm2-software/tpm2-tools](https://github.com/tpm2-software/tpm2-tools)。
* UEFI 固件支持：需要实现 EFI\_TCG2\_PROTOCOL 的固件，以支持度量启动和平台认证。
* Linux 内核集成：依赖位于 `build-qcom-wayland/workspace/<linux_kernel_recipe>/drivers/char/tpm` 的上游 TPM 驱动。

#### **软件启用**

要为 QCS5430/QCS6490 和 IQ-9075/IQ-9100 设置 Qualcomm Linux 定制软件发行版，请参阅 [Qualcomm Linux 发行说明](https://docs.qualcomm.com/doc/80-80021-300)。

#### **内核**

* TPM 驱动支持：使用上游 Linux 内核 TPM 驱动；标准 dTPM 硬件启动无需更多更改。
* 设备树配置：设备树更新足以启用硬件检测。

#### **Yocto/用户空间**

通过 Yocto 配方启用 TPM2 软件栈，包括：

* `tpm2-tss` – TPM2 软件栈（TSS）库
* `tpm2-tools` – TPM2 命令行工具
* `tpm2-abrmd` – TPM2 访问代理和资源管理器守护进程
* `tpm2-tss-engine` – 用于 TPM2 的 OpenSSL 引擎
* `tpm2-pkcs11` – 用于 TPM2 的 PKCS#11 接口

#### **安装示例**

下图展示了一个安装示例。

<img src="https://mintcdn.com/qualcomm-prod/y8h-WRUMxdbs_SSD/System/Security/media-security/k2c-qli-security/dtpm-installation-example.jpg?fit=max&auto=format&n=y8h-WRUMxdbs_SSD&q=85&s=8eb2a0a70ab7da2354878d1edb512c1e" alt="dTPM 安装示例" width="851" height="229" data-path="System/Security/media-security/k2c-qli-security/dtpm-installation-example.jpg" />

#### **验证**

* 使用 tpm2-tools 进行功能验证，包括随机数生成（RNG）、密钥管理和度量启动的测试。
* tpm2-tss 和 tpm2-tools 软件包中提供单元测试，用于验证 TPM2 功能。

#### **验证 TPM2 功能 - 测试示例**

**前提条件**

* 在开始设置之前，从官方上游源下载 TPM2 工具包。
  * 请参阅 [tpm2-tools git.X](https://layers.openembedded.org/layerindex/recipe/87697/)。
  * 请参阅 [tpm2-software/tpm2-tools](https://github.com/tpm2-software/tpm2-tools)。
* 以 permissive 模式启用安全外壳（SSH），以安全访问你的主机设备。
  * 请参阅[使用 SSH 登录](https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-254/how_to.html#use-ssh)。

1. 使用 SSH 连接到设备控制台。
2. 启用写访问。
   ```text theme={null}
   mount -o rw,remount /usr
   ```
3. 从主机上的另一个终端复制 TPM2 工具包。
   ```text theme={null}
   scp /path/to/tpm2-tools_5.4-r0_armv8-2a.ipk root@<device-ip-address>:/data/
   ```
4. 安装 TPM2 工具。
   ```text theme={null}
   opkg install --force-reinstall --force-depends /data/tpm2-tools_5.4-r0_armv8-2a.ipk
   ```
5. 验证 TPM2 功能。
   1. 生成随机数据。
      ```text theme={null}
      tpm2_getrandom --hex -T device:/dev/tpmrm0 16
      ```
   2. 创建主密钥。
      ```text theme={null}
      tpm2_createprimary -C o -c primary.ctx
      ```
   3. 创建 RSA 密钥对。
      ```text theme={null}
      tpm2_create -G rsa -u key.pub -r key.pri -C primary.ctx
      ```
   4. 加载密钥。
      ```text theme={null}
      tpm2_load -C primary.ctx -u key.pub -r key.pri -n key.name -c key.ctx
      ```
   5. 加密文件。
      ```text theme={null}
      echo "wangdg love eating fruit" > secre.data
      tpm2_rsaencrypt -c key.ctx -o jiami_file.enc secre.data
      cat jiami_file.enc
      ```
      查看加密后的数据。
   6. 解密文件
      ```text theme={null}
      tpm2_rsadecrypt -c key.ctx -o jiemi.dec jiami_file.enc
      cat jiemi.dec
      ```
      查看原始消息。
   7. 对文件进行哈希
      ```text theme={null}
      tpm2_hash -C e -g sha1 -o hash.bin -t ticket.bin secre.data --hex
      cat hash.bin
      ```

## **后续步骤**

* 要了解 TrustZone 和安全框架，请参阅[安全架构](./security-architecture)。
* 要了解安全工具以及如何将其集成到你的工作流程中，请参阅[安全工具](./security-tools)。
