RPMB说明与使用(Replay Protected Memory Block)

2023-11-05

1. 什么是RPMB

首先RPMB是repaly protected memory block,从字面意思理解就是一个回放保护的存储区域。
这个区域是EMMC或者UFS上的一个区域,这个区域可以读,可以写,但是读和写是受到访问控制和回放保护的。
UFS上的RPMB空间大小一般是16M;
EMMC上的RPMB空间大小一般是4M,也有64K的;
所以RPMB的空间大小一般看选择的存储芯片的数据手册(遇到过EMMC上没有RPMB区域的)。
一般情况下数据需要具备几个要素:

  • 机密性
  • 完整性
  • 新鲜性
  • 可用性
    回放保护,可以保证数据的新鲜性。

2. 什么是回放保护

理解回放保护,我们先理解一下回放攻击。
int write_file()
{
char *data = “123456”;
int fd;
fd = open(“a.txt”, O_RDWR);
if (fd < 0) {
printf(“open a.txt failed, errno= %d\n”, errno);
return -1;
}

int wlen = write(fd, data, strlen(data));
if (wlen != strlen(data)) {
	printf("write failed");
	close(fd);
	return -2;
}
printf("write file success\n");
close(fd);

return 0;

}
上边方法,我们往a.txt中写入了一些数据,这个时候,如果我们将写完的文件备份出来,备份成b.txt,我们使用程序读a.txt,是可以正常读出来的,然后再将a.txt删除,最后再将b.txt拷贝成a.txt,
如果有回放保护,那么程序再读a.txt,应该会失败。如果成功,那么证明就没有回放保护机制。

3. RPMB的工作原理

RPMB功能

  • get counter: 获取RPMB中counter计数器;
  • program key:写入RPMB key,每个RPMB在生命周期内,都需要program仅仅一次密钥,这个动作可以在工厂完成,也可以每次开机在bootloader中自动完成;
  • read:读RPMB中的数据;
  • write:往RPMB中写数据;
  • get max wr size: 获取一次可以往RPMB中写入的最大数据量;

RPMB操作关键数据结构

struct rpmb_frame {
	u_int8_t  stuff[196];  //无用
	u_int8_t  key_mac[32]; //rpmb key,program rpmb key指令的时候会使用到
	u_int8_t  data[256];//对RPMB进行读写的数据
	u_int8_t  nonce[16];//一个随机数,可以不使用,如果使用,需要发起者生成随机数,RPMB硬件对随机数与其它数据一起做mac,发起者调用返回之后,需要验证mac与nonce,保证调用是新鲜的。相当于很多场景中challenge的意思。
	u_int32_t write_counter; //写操作的时候,counter标记,用户防止回放攻击
	u_int16_t addr; //读写RPMB的地址,块设备操作,每次操作256字节,因此这个地方可以是256的整数倍
	u_int16_t block_count;//每次读写几块RPMB数据,一块是256字节
	u_int16_t result; //操作之后的返回结果,对frameout的数据有效
	u_int16_t req_resp; //本次操作的CMD, 代表本次要做什么
};

RPMB program key

此动作可以在开机的时候自动完成,由bootloader来操作,也可以通过用户产线手动绑定。
注意

  • RPMB KEY大部分情况下与CPU进行绑定,也就是说,如果CPU损坏,那么在维修的时候,也需要更换EMMC或者UFS
  • 由于RPMB KEY与CPU进行绑定,所以大部分客户在使用RPMB的时候,都是使用工厂program key的方案。原因:降低成本。
  • 工厂需要进行CPU的老化测试,如果CPU与EMMC进行提前绑定,那么CPU坏的情况,会导致EMMC的浪费,因此大量生产的情况下,客户都会选择延迟绑定的方案来节省成本。

RPMB READ and WRITE原理

RPMB读写: 调用原理

4. RPMB实现参考

EMMC RPMB: 应用调用实现参考
UFS RPMB: 应用调用实现参考/dev/0:0:0:49476
trusty REE RPMB: REE端RPMB调用
trusty TEE RPMB: TEE端RPMB调用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RPMB说明与使用(Replay Protected Memory Block) 的相关文章

  • Android - 保存动态更改布局的状态

    我有一个布局 用户可以在其中添加按钮并将其放置在他们想要的位置 我想允许用户保存他们的布局 以便下次打开应用程序时加载它 有谁知道我是否可以将文件保存到 SD 卡上 或者 我可以使用某种layout getXml 方法并将其放入我的应用程序
  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • 从 Throwable 获取错误代码 - Android

    我怎样才能从错误代码可投掷 https developer android com reference java lang Throwable html public void onFailure Throwable exception 我
  • Android第一次动画不流畅

    我正在尝试一个动画将 imageView 从屏幕底部滑动到屏幕中心 但是当我第一次执行此动画时 它不平滑 但当第二次执行动画时 它是正常且平滑的 我几乎尝试了所有方法 但无法解决我的问题 这是我的动画文件
  • Android 应用程序在后台运行时保存数据

    目前我正在开发 xmmp 客户端 当应用程序位于前台时 该客户端工作得很好 但由于事实上 当应用程序处于后台时 我在 Application 类中保存了大量数据 复杂的 ArrayList 字符串和布尔值作为公共静态 每个字段都被垃圾收集
  • Android SoundPool 堆限制

    我正在使用 SoundPool 加载多个声音剪辑并播放它们 据我所知 它的功能 100 正确 但在 load 调用期间 我的日志中充斥着以下内容 06 09 11 30 26 110 ERROR AudioCache 23363 Heap
  • Android libgdx 首选项丢失

    我在 Libgdx 引擎中创建了 Android 游戏 一段时间后 我注意到在某些应用程序杀手中杀死该应用程序后 或者如果我在 Android 设置中执行 强制关闭 操作 我保存到首选项中的游戏选项就会丢失 有办法防止这种情况吗 我从来没有
  • KitKat(及更低版本)设备上的 Android Material Design

    我将在我们学校开发一个 Android 应用程序作为一个项目 我想使用 Google 的新 Material Design 但我知道它仅适用于 Android L 设备 Jack Underwood 最近发布了名为 Today Calend
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • minHeight 有什么作用吗?

    在附图中 我希望按钮列与图像的高度相匹配 但我也希望按钮列有一个最小高度 它正确匹配图像的高度 但不遵守 minHeight 并且会使按钮向下滑动 我正在为按钮列设置这些属性
  • CookieManager.getInstance().removeAllCookie();不删除所有cookie

    我在应用程序的 onCreate 中调用 CookieManager getInstance removeAllCookie 我遇到了一个奇怪的问题 我看到 GET 请求中传递了意外的 cookie 值 事实上 cookie 值是一个非常非
  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • 带有自定义阵列适配器的微调器不允许选择项目

    我使用自定义阵列适配器作为微调器 但是 当在下拉列表中选择一个项目时 下拉列表保留在那里 并且微调器不会更新 这是错误行为 与使用带有字符串的通用数组适配器相比 这是自定义类 我错过了什么吗 谢谢 public class Calendar
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface
  • Android Studio:无法启动守护进程

    当我尝试在 Android Studio 中导入 gradle 项目时 遇到以下错误 Unable to start the daemon process This problem might be caused by incorrect
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ

随机推荐

  • C语言输出100以内的全部素数。

    include
  • matlab练习程序(灰度、二值图像腐蚀膨胀)

    cl img gray imread fupeng jpg img erzhi imread erzhi fupeng jpg imshow img gray figure imshow img erzhi m n size img gra
  • 文件目录大小

    题目描述 一个文件目录的数据格式为 目录id 本目录中文件大小 子目录id列表 其中目录id全局唯一 取值范围 1 200 本目录中文件大小范围 1 1000 子目录id列表个数 0 10 例如 1 20 2 3 表示目录1中文件总大小是2
  • 解决 vba 报错:要在64位系统上使用,请检查并更新Declare 语句

    将错误处的 Declare 替换成 Declare PtrSafe 即可
  • java正则

    一 Pattern类和Matcher类 java util regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包 它包括两个类 Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表
  • docker 安装向量数据库 Milvus

    Miluvs 官网为 www milvus io Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据 图片 视频 语音 文本 检索 单节点 Milvus 可以在秒内完成十亿级的向量搜索 请参考 在线教程 分布式架构亦能满足用户的水
  • LSTM模型预测新冠

    LSTM是RNN的改进型 传统RNN模型会随着时间区间的增长 对早期的因素的权重越来越低 有可能会损失重要数据 而LSTM模型通过遗忘门 输入门 输出门三个逻辑 来筛选和保留数据 原理详解可以参考如何从RNN起步 一步一步通俗理解LSTM这
  • (二叉)树的遍历

    树 包括图 在遍历时都存在两种方式 深度优先遍历和广度优先遍历 树 一定有一个根节点 而图 没有根节点 但图中的任意节点都可以作为根节点使用 当然该节点一定要有边 否则没有意义 深度优先遍历 访问当前节点 将当前节点的children作为子
  • spacemacs删除行尾无意义的空格符号

    SPC SPC delete trailing whitespace 或者 SPC x d w
  • 2019年全球安全态度调查:越来越多的受害者向勒索软件支付赎金

    根据网络安全公司CrowdStrike 发布的 2019年全球安全态度调查 的数据 在供应链攻击后 危害黑客以支付赎金的组织总数从14 增长到39 与去年同期相比翻了一番 其中最典型的是英国 2019年 遭受勒索软件攻击并支付勒索赎金的组织
  • fastadmin public js 内 selectpage 联动下拉

    js 页面 define jquery bootstrap backend table form selectpage function undefined Backend Table Form var Controller index f
  • 如何使用Git工具克隆GitHub仓库到本地

    首先 确保你已经在本地安装了Git 如果没有安装 可以前往Git官方网站 https git scm com 下载并安装适合你操作系统的版本 在本地文件夹打开Git Bash 如果你使用Windows系统 在GitHub上找到你想要克隆的仓
  • UE Cook遇到的一些问题

    UE Cook是什么 简单来说 把UE资源 比如uasset umap等转换成平台能识别的资源类型 Cook中遇到的报错 找不到文件 说明你有些plugin没有加入到当前 Project uproject中去 UATHelper Cooki
  • 35岁,一个团队leader,从工作满8年的公司离职,选择重新尝试新机会,或许35岁才是起点。

    目录 面试 1 年龄大找工作一定要有目标 不能太随便 2 代码能力是整个IT行业的核心技能 也是对整个行业从业者的要求 3 沟通表达很重要 把自己做过的事情做到极致 然后能讲出来 4 心态要好 5 机会总是留给有准备的人 勿浮躁 先沉淀 厚
  • 多态语法c++(自学笔记一)

    多态中的纯虚函数 使用多态时 当子类继承父类之后 一般来说对于父类只是作为提供相应的成员变量和成员函数的一个集合 在实际项目中 如果想要修改某一部分的功能 按照以往普通的类的写法 就需要修改类中的代码 也可以说是源码 这样会显得很不方便和不
  • Spring Boot 日志处理

    Spring Boot 日志处理 Spring Boot 是一个非常流行的 Java 开发框架 它提供了简洁的配置和强大的开发工具 日志是应用程序中必不可少的一部分 因为它可以帮助开发人员进行调试和故障排除 Spring Boot 提供了多
  • 非常详细图文JDK和Tomcat安装和配置的图文教程

    想用Tomcat作为服务器 必须分以下两步 首先要配置好JDK的环境变量 再去下载Tomcat的压缩包 一 下载 安装JDK 并且配置好环境变量 1 下载地址 http www oracle com technetwork java jav
  • springboot连接不上redis的三种解决方案

    第一种 查看防火墙是否打开6379端口 查看防火墙状态 systemctl status firewalld 如果防火墙没有启动的话 可以选择直接看后面两种方法 或者就是打开防火墙 然后继续下面的步骤 开启端口 firewall cmd z
  • 基于java网上图书销售系统的设计与实现(含源文件)

    欢迎添加微信互相交流学习哦 项目源码 https gitee com oklongmm biye 1引言 随着Internet国际互联网的发展 越来越多的企业开始建造自己的网站 基于Internet的信息服务 商务服务已经成为现代企业一项不
  • RPMB说明与使用(Replay Protected Memory Block)

    1 什么是RPMB 首先RPMB是repaly protected memory block 从字面意思理解就是一个回放保护的存储区域 这个区域是EMMC或者UFS上的一个区域 这个区域可以读 可以写 但是读和写是受到访问控制和回放保护的