2. OP-TEE 项目简介
OP-TEE (Open Portable Trusted Execution Environment) 是 Linaro 社区维护的开源 TEE 项目,基于 ARM TrustZone 技术实现。它提供了完整的 TEE 软件栈,包括安全内核、用户空间组件和客户端 API,是嵌入式安全领域最广泛使用的开源 TEE 解决方案之一。
2.1 开源项目背景
OP-TEE 最初由 ST-Ericsson 和 STMicroelectronics 开发,2014 年由 Linaro 接手并开源。项目托管于 GitHub,采用 BSD 2-Clause 许可证,社区活跃度极高。截至 2025 年,OP-TEE 已支持超过 30 种硬件平台,包括 NXP i.MX、Rockchip RK3399、Xilinx Zynq 等主流 SoC。
关键里程碑:
- 2014 — Linaro 正式接管并开源 OP-TEE
- 2016 — 加入 GlobalPlatform TEE 标准认证
- 2018 — 支持多平台设备树 (Device Tree)
- 2021 — 引入 FF-A (Firmware Framework for Arm A-profile) 支持
- 2024 — 发布 v4.0,支持 Rust 语言开发 TA
2.2 核心组件架构
OP-TEE 由三个核心组件构成,分别运行在安全世界 (Secure World) 和普通世界 (Normal World):
架构概览: 安全世界运行 TEE 内核和可信应用 (TA),普通世界运行 Client API 和 TEE Supplicant,两者通过 SMC (Secure Monitor Call) 指令进行通信。
2.3 组件功能详解
| 组件 | 运行环境 | 主要功能 | 代码位置 |
|---|---|---|---|
| TEE Kernel (OP-TEE OS) | 安全世界 (S-EL1) | 管理 TA 生命周期、内存隔离、中断处理、加密服务 | core/ |
| TEE Supplicant (teed) | 普通世界 (用户空间) | 处理 RPC 请求、文件系统访问、网络通信 | supplicant/ |
| Client API (libteec) | 普通世界 (用户空间) | 提供标准 API 接口,封装 SMC 调用细节 | libteec/ |
| Trusted Application (TA) | 安全世界 (S-EL0) | 实现具体安全业务逻辑,如密钥管理、身份认证 | ta/ |
2.4 OP-TEE 与 GlobalPlatform 标准的关系
GlobalPlatform (GP) 是 TEE 领域的国际标准组织,定义了 TEE 的系统架构、API 接口和安全要求。OP-TEE 是 完全兼容 GlobalPlatform TEE 标准 的开源实现,具体体现在以下方面:
- API 兼容性: 实现了 GP TEE Client API (GPD_TEE_Client_API.h) 和 TEE Internal Core API (tee_internal_api.h)
- 架构一致性: 遵循 GP 定义的 TEE 系统架构,包括安全世界/普通世界隔离、TA 管理、安全存储等
- 安全模型: 支持 GP 定义的认证、加密、签名等安全服务接口
- 测试套件: 提供 GP TEE 测试套件 (xtest),用于验证标准兼容性
重要提示: 虽然 OP-TEE 兼容 GP 标准,但不同厂商的 TEE 实现(如 Trustonic、Qualcomm QSEE)在底层实现上存在差异。开发跨平台 TA 时,应严格使用 GP 标准 API,避免依赖 OP-TEE 特有的扩展接口。
2.5 标准兼容性对照表
| GlobalPlatform 标准 | OP-TEE 对应实现 | 兼容状态 |
|---|---|---|
| GPD_TEE_Client_API.h | libteec/include/tee_client_api.h |
完全兼容 |
| TEE Internal Core API | libutee/include/tee_internal_api.h |
完全兼容 |
| TEE Secure Storage | core/tee/tee_svc_storage.c |
完全兼容 |
| TEE Cryptographic API | libutee/crypto/ |
完全兼容 |
| TEE Socket API | libutee/socket/ |
部分兼容(仅支持 TCP/UDP) |
| TEE Time API | libutee/time/ |
完全兼容 |
开发建议: 在编写 TA 时,优先使用
#include <tee_internal_api.h> 中的标准接口,避免直接调用 OP-TEE 内部函数。这样可确保 TA 在不同 TEE 实现间的可移植性。