当前位置: 首页 > news >正文

深入理解 eMMC RPMB 与 OP-TEE 在 Linux 系统中的应用开发

可信执行环境(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
libuteeTA 使用的系统接口库
libteecCA 使用的用户态接口库

启用 RPMB 只需在编译配置中设置:

CFG_RPMB_FS=y
CFG_RPMB_WRITE_KEY=y

此时 OP-TEE 会自动将 RPMB 区域视为一种安全存储设备,用 FAT 表模拟文件系统,进行加密读写。


🧪 实际开发结构:Client App ↔ Trusted App

OP-TEE 的应用开发分为两端:

🖥️ CA:Client Application(Normal World)

典型结构如下:

TEEC_InitializeContext(NULL, &ctx);
TEEC_OpenSession(&ctx, &sess, &UUID, ...);
TEEC_InvokeCommand(&sess, CMD_ID, &op, ...);

使用 libteec 进行标准化调用,参数通过 TEEC_Operation 传入最多 4 个。


🔒 TA:Trusted Application(Secure World)

核心接口如下:

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 示例:

TEE_Result TA_InvokeCommandEntryPoint(...) {DMSG("Hello from Secure World");return TEE_SUCCESS;
}

✒️ CA 示例:

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
http://www.lryc.cn/news/598397.html

相关文章:

  • 使用宝塔面板搭建 PHP 环境开发一个简单的 PHP 例子
  • 解决VSCode无法加载Json架构问题
  • 《计算机网络》实验报告八 加密、数字签名与证书
  • 力扣844. 比较含退格的字符串
  • 借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
  • 【bug解决】 esp32 在WSL-ubuntu20.04环境下找不到设备
  • MIT线性代数01_方程组的几何解释
  • 造成服务器内存不足的原因有什么
  • 飞腾D2000/E2000/D3000如何从头制作UBOOT引导系统镜像
  • Pycharm、Python安装及配置小白教程
  • 【docker | 部署 】Jetson Orin与AMD平台容器化部署概述
  • 用LangChain重构客服系统:腾讯云向量数据库+GPT-4o实战
  • 使用爬虫获取游戏的iframe地址
  • DRF - 博客列表API
  • Django Models详解:数据库模型的核心
  • Unity3D + VR头显 × RTSP|RTMP播放器:构建沉浸式远程诊疗系统的技术实践
  • Ascendc msOpST测试报错问题
  • 【Unity开发】数据存储——XML
  • MySQL的命令行客户端
  • Code Composer Studio:CCS 设置代码折叠
  • MySQL零基础教程增删改查实战
  • [语言模型训练]基于 PyTorch 的双向 LSTM 文本分类器实现:基于旅店的评论分类语言模型
  • 与deepseek的问答:dot net与Borland VCL的关系
  • OSPF多区域介绍
  • 【Spring Cloud Gateway 实战系列】高级篇:服务网格集成、安全增强与全链路压测
  • 开源链动2+1模式AI智能名片S2B2C商城小程序的场景体验分析
  • 从零用java实现 小红书 springboot vue uniapp(15) 集成minio存储 支持本地和minio切换
  • 开源中国:以国产开源生态筑基,赋能智能研发全栈升级
  • 谈谈ArrayList与Vector的理解?
  • DiffServ服务模型与DS码点详解