OP-TEE
本文档面向使用 MTT E300 BSP/SDK 的用户,介绍 OP-TEE 在 MTT E300 平台上的功能、架构和 TA 开发方法。读者应具备 Linux 开发环境、交叉编译和 BSP/SDK 使用基础。
1. 概述
OP-TEE(Open Portable Trusted Execution Environment)是运行在 ARM TrustZone Secure World 中的开源可信执行环境。MTT E300 平台基于 OP-TEE 为你提供以下安全能力:
- 可信应用运行环境:在 Secure World 中承载 Trusted Application(TA),与 Normal World 的 Linux/Android 隔离运行。
- 安全存储:提供基于 REE FS 和 RPMB 的安全存储后端,保护敏感数据不被 Normal World 直接读取。
- 密码学服务:基于 mbedTLS 提供 AES、RSA、ECC、Hash/HMAC 等标准算法,以及 SM2/SM3/SM4 国密算法,配合硬件 Trusted Engine 加速。
- 安全启动支持:作为 ATF BL32 加载,参与 ARM TrustZone 安全启动链。
- TA/CA 开发框架:提供完整的 TA Internal API 和 CA Client API,支持用户开发自定义可信应用。
1.1 术语
| 术语 | 说明 |
|---|---|
| OP-TEE OS | 运行在 Secure World 的 TEE OS,提供 TA 运行环境、安全存储和加密服务。 |
| REE | Rich Execution Environment,通常指 Linux/Android Normal World。 |
| TA | Trusted Application,运行在 OP-TEE 中的可信应用。 |
| CA | Client Application,运行在 REE 用户态,通过 TEE Client API 访问 TA。 |
| ATF | ARM Trusted Firmware,负责 EL3 固件和 Secure Monitor 相关功能。 |
| SMC | Secure Monitor Call,Normal World 与 Secure World 之间的切换接口。 |
| TE | Trusted Engine,MTT E300 平台硬件安全引擎,提供硬件加速密码学和真随机数。 |
| xtest | OP-TEE 测试程序,用于验证 TEE Client API、TA 加载和安全服务。 |
2. 软件架构
2.1 系统架构
MTT E300 平台 OP-TEE 的软件架构如下:
+---------------------------------------------------------------+
| Normal World (REE) |
| |
| +----------------+ +----------------+ +-------------------+ |
| | CA Application | | xtest | | tee-supplicant | |
| +-------+--------+ +-------+--------+ +---------+---------+ |
| | | | |
| +-------+-------------------+---------------------+---------+ |
| | TEE Client API (libteec) | |
| +-----------------------------+-----------------------------+ |
| | |
| +-----------------------------+-----------------------------+ |
| | Linux Kernel TEE Driver | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+
| SMC
+---------------------------------------------------------------+
| Secure World (TEE) |
| |
| +-----------------------------------------------------------+ |
| | OP-TEE OS | |
| | | |
| | +--------------+ +--------------+ +-------------------+ | |
| | | TEE Core | | TA Framework | | Crypto Service | | |
| | +--------------+ +--------------+ +---------+---------+ | |
| | +--------------+ +--------------+ | | |
| | | Secure Store | | TA Instance | +---------+---------+ | |
| | | REE/RPMB | | (TA Runtime) | | Trusted Engine | | |
| | +--------------+ +--------------+ | (TE) | | |
| | +--------------+ +--------------+ +-------------------+ | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+
| SMC
+---------------------------------------------------------------+
| ARM Trusted Firmware (ATF) |
| EL3 / Secure Monitor |
+---------------------------------------------------------------+
2.2 组件说明
| 组件 | 运行环境 | 作用 |
|---|---|---|
| OP-TEE OS | Secure World (EL1S) | 提供 TEE Core、TA 运行框架、安全存储和加密服务。 |
| ATF | EL3 / Secure Monitor | 负责启动阶段加载 OP-TEE,运行时通过 SMC 完成 Normal World 与 Secure World 切换。 |
| Linux Kernel TEE driver | Normal World kernel | 向 REE 提供 /dev/tee0、/dev/teepriv0 设备节点。 |
| tee-supplicant | Normal World user space | 配合 OP-TEE 完成 REE FS 读写、TA 加载等需要 REE 协助的操作。 |
| libteec | Normal World user space | 提供 TEE Client API 供 CA 调用。 |
| CA | Normal World user space | 用户开发的 REE 应用,通过 TEE Client API 访问 TA。 |
| TA | Secure World user space | 用户开发的可信应用,实现敏感业务逻辑。 |
| xtest | Normal World user space | 执行 OP-TEE 功能和回归测试。 |
2.3 启动链路
Boot ROM -> Bootloader -> ATF (BL31) -> OP-TEE OS (BL32) -> Linux Kernel (BL33)
- Boot ROM 加载并启动 Bootloader。
- Bootloader 加载 ATF(BL31)、OP-TEE OS(BL32)和 Linux Kernel(BL33)。
- ATF 在启动阶段将 OP-TEE OS 作为 BL32 secure payload 初始化。
- ATF 跳转到 Linux Kernel,Linux 进入 Normal World 启动流程。
- Linux 启动后,TEE driver 初始化并与 OP-TEE 交换 capability 信息。
tee-supplicant启动,完成 OP-TEE 用户态服务就绪。
2.4 内存布局
MTT E300 平台 OP-TEE 的安全内存布局:
0x80100000 +----------------------------------+
| TEE Core (TEE_RAM) |
| OP-TEE OS code and data |
+----------------------------------+
| TA RAM |
| TA instance runtime memory |
+----------------------------------+
0x80F00000 +----------------------------------+
| Shared Memory (SHM) |
| REE/TEE shared buffer |
0x81100000 +----------------------------------+
3. TA 开发
3.1 TA 与 CA 的关系
TA(Trusted Application)运行在 OP-TEE Secure World 中,CA(Client Application)运行在 Normal World 中。CA 通过 TEE Client API 向 TA 发起请求,TA 通过 TEE Internal Core API 处理请求并返回结果,整个过程由 OP-TEE OS 和 ATF 保证安全隔离。
+----------------------+ +-------------------+
| CA (Normal World) | | TA (Secure World)|
| | TEEC_OpenSession | |
| TEEC_InitializeCtx |--------------------->| TA_OpenSession |
| TEEC_OpenSession | TEEC_InvokeCommand | |
| TEEC_InvokeCommand |--------------------->| TA_InvokeCommand |
| TEEC_CloseSession | TEEC_CloseSession | |
| TEEC_FinalizeCtx |--------------------->| TA_CloseSession |
+----------------------+ +-------------------+
3.2 TA 开发概述
3.2.1 TA 入口函数
每个 TA 通常需要实现以下 5 个入口函数(OP-TEE 提供弱默认实现,实际项目按需覆盖):
| 入口函数 | 说明 |
|---|---|
TA_CreateEntryPoint | TA 首次加载时调用,用于全局初始化。 |
TA_DestroyEntryPoint | TA 卸载时调用,用于释放全局资源。 |
TA_OpenSessionEntryPoint | CA 打开 Session 时调用。 |
TA_CloseSessionEntryPoint | CA 关闭 Session 时调用。 |
TA_InvokeCommandEntryPoint | CA 调用 TA 命令时调用,根据 cmd_id 分发到具体处理函数。 |
3.2.2 TA 参数类型
CA 与 TA 之间通过 4 个参数(params[0] ~ params[3])传递数据,每个参数的类型由 param_types 指定:
| TA 侧类型 | CA 侧类型 | 说明 |
|---|---|---|
TEE_PARAM_TYPE_VALUE_INPUT | TEEC_VALUE_INPUT | 传入两个 32-bit 整数值(value.a、value.b)。 |
TEE_PARAM_TYPE_VALUE_OUTPUT | TEEC_VALUE_OUTPUT | 返回两个 32-bit 整数值。 |
TEE_PARAM_TYPE_VALUE_INOUT | TEEC_VALUE_INOUT | 传入并返回两个 32-bit 整数值。 |
TEE_PARAM_TYPE_MEMREF_INPUT | TEEC_MEMREF_TEMP_INPUT | 传入内存缓冲区。 |
TEE_PARAM_TYPE_MEMREF_OUTPUT | TEEC_MEMREF_TEMP_OUTPUT | 返回内存缓冲区。 |
TEE_PARAM_TYPE_MEMREF_INOUT | TEEC_MEMREF_TEMP_INOUT | 传入并返回内存缓冲区。 |
3.2.3 TA UUID
每个 TA 通过 UUID 唯一标识。CA 使用同一 UUID 打开 TA Session。编译时 UUID 同时作为 .ta 文件名。
3.3 TA Dev Kit
TA 不能直接使用普通用户态的 libc 或系统调用,需要使用 OP-TEE 提供的 TA Dev Kit 完成编译、链接和签名。MTT E300 SDK 随包提供 export-ta_arm64 目录,用户开发 TA 时主要依赖其中的头文件、库文件和构建脚本。
TA Dev Kit 目录通常包含:
export-ta_arm64/
├── include/ # TA API 头文件
├── lib/ # 预编译库 (libutee.a, libutils.a, libmbedtls.a, libdl.a)
├── keys/ # TA 签名密钥
├── mk/ # 构建系统 Makefile (ta_dev_kit.mk 等)
├── scripts/ # 签名脚本 (sign_encrypt.py)
└── src/ # TA 头文件模板 (user_ta_header.c, ta.ld.S)
具体路径以 SDK 发布包目录结构为准。TA 工程的 Makefile 只需要设置 TA UUID、交叉编译器和 TA_DEV_KIT_DIR,再包含 $(TA_DEV_KIT_DIR)/mk/ta_dev_kit.mk,即可复用 SDK 提供的构建流程。
TA 编译完成后会生成已签名的 .ta 文件。SDK 提供默认签名密钥,用户也可在 TA Makefile 中指定自定义签名密钥:
TA_SIGN_KEY = /path/to/custom_key.pem
量产环境中应使用自定义签名密钥,并妥善保管私钥。所有使用同一密钥签名的 TA 可以互相访问对方的安全存储数据。
3.4 Hello World 示例
以下以 optee-examples/hello_world 为例,展示一个 TA/CA 程序的核心结构和关键源码。