可信执行环境(TEE)和安全存储机制在现代嵌入式系统和 ARM 平台中日益重要。尤其是在 RK3588 等 SoC 上,eMMC 的 RPMB 区域和 OP-TEE 的结合,成为构建安全可信机制的核心基础。本篇文章将系统性地介绍相关原理、工具链、开发结构与实际使用案例。
🧩 什么是 RPMB?为什么重要?
RPMB(Replay Protected Memory Block)是 eMMC 或 UFS 存储中的一个专用硬件分区,特点如下:
- ✅ 不可直接访问:只能通过 MMC ioctl 接口进行读写
- 🔐 写入带计数器保护:防止重放攻击(每次写入必须带计数器 + HMAC 验证)
- 💾 用于安全数据保存:存储密钥、令牌、认证凭证等敏感信息
📦 应用场景包括:
- 设备密钥存储
- Secure Boot 状态标记
- TEE 私有文件系统后端
- TPM 替代机制(在某些嵌入式场合)
🛡️ OP-TEE 是什么?如何支持 RPMB?
OP-TEE 是运行在 ARM TrustZone 下的开源 TEE 实现。它具备以下模块:
模块 | 作用 |
---|---|
optee_os |
安全世界的核心逻辑 |
tee-supplicant |
普通世界的 RPC 代理,访问 RPMB |
libutee |
TA 使用的系统接口库 |
libteec |
CA 使用的用户态接口库 |
启用 RPMB 只需在编译配置中设置:
bash
CFG_RPMB_FS=y
CFG_RPMB_WRITE_KEY=y
此时 OP-TEE 会自动将 RPMB 区域视为一种安全存储设备,用 FAT 表模拟文件系统,进行加密读写。
🧪 实际开发结构:Client App ↔ Trusted App
OP-TEE 的应用开发分为两端:
🖥️ CA:Client Application(Normal World)
典型结构如下:
c
TEEC_InitializeContext(NULL, &ctx);
TEEC_OpenSession(&ctx, &sess, &UUID, ...);
TEEC_InvokeCommand(&sess, CMD_ID, &op, ...);
使用 libteec
进行标准化调用,参数通过 TEEC_Operation
传入最多 4 个。
🔒 TA:Trusted Application(Secure World)
核心接口如下:
c
TEE_Result TA_InvokeCommandEntryPoint(
void* sess_ctx, uint32_t cmd_id,
uint32_t param_types, TEE_Param params[4])
{
switch(cmd_id) {
case CMD_ID:
// 处理逻辑
}
}
通过 libutee
访问加密、存储、密钥生成等 TEE OS API,执行机密操作。
🧠 Hello Secure World 示例拆解
📁 目录结构
hello_world/
├── host/ → CA 代码
├── ta/ → TA 代码
✒️ TA 示例:
c
TEE_Result TA_InvokeCommandEntryPoint(...) {
DMSG("Hello from Secure World");
return TEE_SUCCESS;
}
✒️ CA 示例:
c
TEEC_InvokeCommand(&sess, 0, &op, &origin);
两者通过 UUID + Command ID 紧密绑定,构成跨世界交互桥接。
📚 RPMB 文件系统结构与加密机制(OP-TEE 内部)
- 📂 使用 FAT 表模拟文件系统布局
- 🔐 数据块使用 AES-CBC + ESSIV 加密
- ✅ 每次写入需验证计数器 + HMAC
- 🔑 密钥分层结构:
- SSK(设备密钥)
- TSK(会话密钥)
- FEK(文件加密密钥)
文档参考:OP-TEE Secure Storage RPMB Spec
⚙️ Linux 与 OP-TEE 的适配
OP-TEE 并不限于 Android,它适用于:
平台 | 是否支持 OP-TEE |
---|---|
Android AOSP | ✅ 官方支持 |
Debian / Ubuntu | ✅ 可集成 |
Yocto / Buildroot | ✅ 常用方案 |
需要注意:
- Linux kernel 需开启
MMC_IOC_*
ioctl 接口 - 编译
tee-supplicant
配合 OP-TEE 内部逻辑完成 RPMB RPC