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

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

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调用

相关文章
|
Docker 容器
解决Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
解决Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
1251 0
|
测试技术
pg_rewind实例--could not find previous WAL record at %X/%X
pg_rewind实例--could not find previous WAL record at %X/%X
120 0
|
存储 内存技术
Long Story of Block - segment
## segment segment 的概念实际来自 DMA controller,DMA controller 可以实现一段内存物理地址区间与一段设备物理地址区间之间的数据拷贝,segment 就描述 DMA 数据传输过程中的一段连续的内存空间,也就是说 DMA controller 可以将内存中一个 segment 中的数据拷贝到设备,或将设备中的数据拷贝到 segment 中 s
891 1
Long Story of Block - segment
|
存储 编译器 iOS开发
Block 详解
原文链接:www.imlifengfeng.com 一、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Block 是 Objective-C 对于闭包的实现。
975 0
|
关系型数据库 数据库管理 Oracle