> ## 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 TEE 和安全设备

<Warning>
  当前版本未启用 TEE 日志。
</Warning>

调试提供了一套常见的日志记录和调试技术，用于排查 Qualcomm TEE、可信应用程序与客户端应用程序以及安全设备中的问题。

**重要提示**

请在 SELinux Permissive 模式下运行所有 SSH 命令。Enforcing 模式将在未来支持。有关如何连接设备的说明，请参阅 [Qualcomm Linux 构建指南](https://docs.qualcomm.com/bundle/publicresource/topics/80-80021-254/how_to.html#use-ssh)。

## **调试 Qualcomm TEE**

Qualcomm TEE 内核日志（也称为 TrustZone diag 日志）可用于调试 Qualcomm TEE 中发生的错误。

TrustZone diag 日志可在 Linux 内核驱动中获得，该驱动会重定向这些日志。

1. 使用 SSH 以 root 身份连接到设备。
2. 使用以下命令捕获 TrustZone 日志：
   ```text theme={null}
   cat /proc/tzdbg/log > tzbsp_log.txt
   ```

`tzbsp_log.txt` 中的错误代码以十六进制编码。你可以运行以下工具将 `tzbsp_log.txt` 从十六进制解码为字符串。

1. 前往 `<TZ.XF.X.X path>/trustzone_images/ssg/bsp/tz/build/tz/A53_64/<BuildFlavor>`
2. 使用 python 3 运行以下命令。
   ```text theme={null}
   python3 print_tz_log.py -l tzbsp_log.txt -e errorCodesDict.txt -t <TZ.XF.X.X path> -o tzbsp_log_decode.txt
   ```
   例如：
   ```text theme={null}
   Python3 print_tz_log.py -l tzbsp_log.txt -e errorCodesDict.txt -t //crmhyd/nsid-hyd-05/TZ.XF.5.0-07927-KODIAKAAAAANAAZT-1 -o tzbsp_log_decode.txt
   ```

对于设备日志收集，TrustZone diag 日志缓冲区是 RAM 转储的一部分，可以在崩溃转储解析工具中使用来自 TZ.XF 软件的 `qsee.elf` 进行解析。对于离线或设备外日志收集，TrustZone diag 日志缓冲区是 RAM 转储的一部分，可以在崩溃转储解析工具中使用来自 TZ.XF 软件的 `qsee.elf` `(trustzone\_images/ssg/bsp/qsee/build/\${tz\_bid:EACAANAA})` 进行解析。

### **使用安全崩溃转储进行调试**

你可以使用 RAM 转储来调试 Qualcomm TEE。Qualcomm TEE 的执行区域转储通过安全崩溃转储收集。

使用 stage 2 sec.elf 触发熔丝的设备称为已启用安全启动的设备。要在这些设备上进行调试，请参阅 [SecTools v2: Secure Debug User Guide](https://docs.qualcomm.com/bundle/80-NM248-23/resource/80-NM248-23_REV_AA_SecTools_v2__Secure_Debug_User_Guide.pdf)。

**注意**

*SecTools* 指南仅面向具有授权访问权限的许可开发者。

## **调试可信应用程序和客户端应用程序**

可信应用程序日志（也称为 Qualcomm TEE 日志）用于调试可信应用程序中的错误。要调试客户端应用程序中的错误，则使用内核日志和 journalctl 日志。

对于在线或设备端日志收集，Linux 会在运行时收集 Qualcomm TEE/内核日志。你可以使用 SSH 连接到设备并使用以下命令：

* 从 Linux 收集 Qualcomm TEE 日志：
  ```text theme={null}
  cat /proc/tzdbg/qsee_log > qsee_log.txt
  ```
* 对于客户端应用程序，收集内核日志和 logcat 日志：
  ```text theme={null}
  cat /dev/kmsg > kernel_log.txt
  journalctl > journalctl.txt
  ```
* 对于离线或设备外日志收集，Qualcomm TEE 日志与内核日志和 journalctl 日志一起包含在 RAM 转储中。

## **在安全设备上进行调试**

作为安全启动流程的一部分，熔断调试禁用熔丝会禁用设备上的调试功能。这包括各子系统上的 RAM 转储、INV 和 NINV 调试。

调试策略功能允许对已启用安全启动的设备的调试能力进行控制。

调试策略镜像允许在商用安全设备上启用诸如 JTAG 重新启用（INV 调试）、RAM 转储和 TrustZone 日志记录（NINV 调试）等调试功能。

出于安全原因，设备的序列号控制着用于安全 RAM 转储、Qualcomm TEE 日志和 JTAG 的调试策略。

在 Qualcomm TEE 子系统上启用 JTAG 会使设备在硬件密钥生成方面的安全性失效。因此，现有的安全存储（如用户数据、SFS 和 RPMB）将变得不可访问。有时，设备可能会提示进行恢复出厂设置。使用以下命令在安全设备上进行调试：

```text theme={null}
<meta>/common/sectoolsv2/ext/linux/sectools secure-debug --security-profile <meta>/common/sectoolsv2/<chipset>_security_profile.xml --generate --outfile apdp_out.mbn --all-flags --sign --signing-mode LOCAL --oem-id=0x1 --root-certificate=./RSA-OEM-KEYS/qpsa_rootca.cer  --ca-certificate=./RSA-OEM-KEYS/qpsa_attestca.cer --ca-key=./RSA-OEM-KEYS/qpsa_attestca.key --oem-product-id=0xabcd --serial-number=0xabcdabcd
```

确保正确配置 OEM\_ID、PRODUCT\_ID、序列号与密钥以及证书路径。

有关更多信息，请参阅 [SecTools v2: Secure Debug User Guide](https://docs.qualcomm.com/bundle/80-NM248-23/resource/80-NM248-23_REV_AA_SecTools_v2__Secure_Debug_User_Guide.pdf)。

**注意**

*SecTools* 指南仅面向具有授权访问权限的许可开发者。

## **在设备上烧写 APDP**

要在设备上烧写 APDP，请运行以下命令：

```text theme={null}
Fastboot flash apdp_a <path to apdp.mbn>
```

**表：用于转储收集的调试策略标志**

|   **阶段**   |               **完整转储**              |           **迷你转储**          |                                                                                                                                              |        |
| :--------: | :---------------------------------: | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
|     阶段     | 应用程序（DCC 和扫描转储）aDSP/Video/RPM/ SLPI |   Modem/Qualcomm TEE/安全转储   | TZDiag                                                                                                                                       | –      |
|     非安全    |                无需调试策略               |            无需调试策略           | 无需调试策略                                                                                                                                       | 无需调试策略 |
| Stage 1 安全 |              无需 APDP 镜像             |          无需 APDP 镜像         |                                                                                                                                              |        |
| Stage 2 安全 |      `--nonsecure-crash-dumps`      | –offline-crash dumps 加设备序列号 | QCS6490/QCS5430："–logs" 加设备序列号 QCS9075："–tz-diag-logs" 加设备序列号 或使用 `--nonsecure-crash-dumps` 的加密 TZDiag + devcfg 中的 TZDiag 加密公钥/指数可在以下位置进行配置： |        |

> `/trustzone_images/ssg/securemsm/trustzone /qsee/mink/oem/config<chipset>/oem_config.xml`

| <ul><li>Apps 迷你转储：`--apps-encrypted-mini-dumps`</li><li>Modem 和 WLAN：\* `--mpss-encrypted-mini-dumps` \* `--wlan-encrypted-mini-dumps`</li><li>aDSP 迷你转储：`--adsp-encrypted-mini-dumps`</li><li>cDSP 迷你转储：`--cdsp-encrypted-mini-dumps`</li></ul> |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

请参阅 KBA-191202045020-1（ZIP）。有关更多信息，请参阅 [MiniDump Software User Guide](https://docs.qualcomm.com/bundle/80-P8754-71/resource/80-P8754-71_REV_H_MiniDump_Software_User_Guide.pdf)。

**注意**

*SecTools* 和 *MiniDump* 指南仅面向具有授权访问权限的许可用户。

## **在安全设备上收集 Qualcomm TEE/TrustZone diag 日志**

在安全设备上，从 Linux 收集的 Qualcomm TEE/TrustZone 日志默认处于禁用状态。Qualcomm 提供了加密日志功能用于日志记录。按照以下步骤启用此功能：

1. 使用以下命令生成用于加密的 RSA 密钥：
   ```text theme={null}
   openssl genrsa -out rsa_key 2048
   ```
2. 使用以下命令显示 RSA 密钥信息和模数：
   ```text theme={null}
   openssl rsa -in rsa_key -text
   openssl rsa -in rsa_key -modulus
   Private-key: (2048 bit)
   modulus: 00:a0:48:99:99:83:26:65:57:fc:75:52:25:45:53:
   92:fc:27:29:cb:14:35:94:7c:89:bc:d4:0a:c6:3d:
   0d:6d:8a:7d:72:1d:e3:4f:f0:32:66:41:a9:f6:c1:
   2f:79:aa:58:ea:57:3b:29:6d:cf:40:33:4e:ad:ec:
   bf:78:44:4b:28:52:c8:e3:6e:77:01:e5:a3:c6:25:
   65:8c:8b:cc:32:20:2d:29:58:03:f0:d5:b7:f4:c0:
   d6:09:b2:8e:59:c1:3c:ac:e5:61:04:36:78:e3:da:
   95:b3:e3:b7:71:90:50:ee:a9:70:5a:15:1a:af:d9:
   a5:4f:c2:70:f1:f8:f1:67:d1:78:0e:b8:95:6e:93:
   73:6a:23:f1:31:e1:e2:49:ff:18:54:a3:73:d0:70:
   91:de:7a:92:53:11:aa:cb:b0:f9:d0:e1:83:9f:74:
   67:bc:1a:89:6d:b1:d2:de:4f:ab:3c:1c:63:c9:bc:
   75:f0:c0:80:fc:db:73:d1:8a:e3:f4:60:57:dd:66:
   f1:3a:fa:18:ed:7f:47:72:3e:49:50:94:8e:19:ae:
   6b:69:62:3d:74:ca:44:fb:d4:1c:1d:59:43:30:31:
   0d:fb:ab:70:44:9d:d9:d0:ce:cb:43:f3:2a:98:a4:
   83:e7:76:ae:a8:b8:ea:63:64:e1:11:1b:99:92:b3: 9b:3f
   publicExponent: 65537 (0x10001)
   ```
   **注意**
   模数用于 `oem_config.xml` 文件中的 `pub_mod`。`pub_exp` 指数通常为 65537。0x10001 称为 `publicExponent`。
3. 在 `trustzone_images/ssg/securemsm/trustzone/qsee/mink/oem/config/<chipset>/ oem_config.xml` 文件中设置 RSA 公钥（指数和模数）。
   通过在 `oem_config.xml` 文件中添加以下内容来启用此功能：
   ```text theme={null}
   <driver name="NULL">
   <global_def>
   <var_seq name="pub_mod" type=DALPROP_DATA_TYPE_STRING>
   a048999983266557fc755225455392fc2729cb1435947c89bcd40ac63d0d6d
   8a7d721de34ff0326641a9f6c12f79aa58ea573b296dcf40334eadecbf7844
   4b2852c8e36e7701e5a3c625658c8bcc32202d295803f0d5b7f4c0d609b28e
   59c13cace561043678e3da95b3e3b7719050eea9705a151aafd9a54fc270f1
   f8f167d1780eb8956e93736a23f131e1e249ff1854a373d07091de7a925311
   aacbb0f9d0e1839f7467bc1a896db1d2de4fab3c1c63c9bc75f0c080fcdb73
   d18ae3f46057dd66f13afa18ed7f47723e4950948e19ae6b69623d74ca44fb
   d41c1d594330310dfbab70449dd9d0cecb43f32a98a483e776aea8b8ea6364e1111b9992b39b3f
   </var_seq>
   <var_seq name="pub_exp" type=DALPROP_DATA_TYPE_STRING>
   000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000000
   000000000000000000000000000000000000000000000000000000000000010001
   </var_seq>
   </global_def>
   ```
   **注意**
   更新 `oem_config.xml` 文件中的公钥时，请确保没有因 Notepad 或 Wordpad 编辑器而在其中插入换行符、制表符或空格。
4. 从 `trustzone_images/ssg/securemsm/trustzone/qsee/mink/oem/config/<chipset>/oem_config.xml` 文件启用加密功能配置标志，使用：
   ```text theme={null}
   < props name="OEM_log_encr_enable" type=DALPROP_ATTR_TYPE_UINT32>
   1
   </props>
   ```
5. 要构建 TrustZone devcfg 镜像，请输入 OEM\_ID 字段值并对 `devcfg.mbn` 镜像进行签名。
6. 使用以下命令烧写已签名的 `devcfg.mbn` 镜像：
   ```text theme={null}
   fastboot flash devcfg_a devcfg.mbn
   ```

**注意**

QCS6490 使用 `devcfg.mbn`，QCS9100 使用 `devcfg_iot.mbn`。

7. 使用以下命令收集 Qualcomm TEE/TrustZone 日志：
   ```text theme={null}
   cat /proc/tzdbg/qsee_log > qsee_log.txt
   cat /proc/tzdbg/log > tz_log.txt
   ```

## **Qualcomm TEE/TrustZone diag 日志解密步骤**

1. 从 KBA-200917004544-1（ZIP）下载 Python 解密工具 `decrypt_tzdiag_qsee_log_tools.py`。
2. 要安装，请运行以下命令：
   ```text theme={null}
   Python Version 3.x
   pip install pycryptodome
   pip install cryptography
   ```
3. 要解密，请运行以下命令：
   ```text theme={null}
   python decrypt_tzdiag_qsee_log_tools.py -pk <RSA private key file> -a RSA -I <input encrypted qsee/tz diag log collected from device> -o <decrypted qsee/tzdiag log filename>
   ```
4. 成功解密后：
   1. 将 Qualcomm TEE 日志的明文转换为可读的字符串格式。
   2. 将十六进制编码的错误代码转换为字符串，使用：
      ```text theme={null}
      print_tz_log.py
      ```

## **后续步骤**

* 要了解如何开发和运行可信应用程序与客户端应用程序，请参阅[开发可信应用程序和客户端应用程序](./develop-trusted-and-client-applications)。
* 要配置 Qualcomm TEE 以保护处理敏感数据并运行可信应用程序的设备，请参阅[配置安全服务](./configure)。
* 要定制内存和 SEPolicy，请参阅[定制安全服务](./customize-security-services)。
