不知道大家对于RPMB有所了解吗?最近在看这些存储介质的介绍的时候,在推荐里面看到了这个东西,又因为对安全本身就有所涉及学习。所以这里来看看这个东西。
学习的内容都是来自前辈们的blog,会在文末附注。
1、Flash是什么?
关于存储的种类有很多种,这里看一下前辈归纳的图片:(详细可以点击链接查看)
这里就不展开了,主要看一下flash,flash分为nor flash和nand falsh。
nor flash :NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的容量从而节约了成本。
nand falsh:NAND Flash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,采用这种技术的Flash比较廉价。用户不能直接运行NAND Flash上的代码,因此好多使用NAND Flash的开发板除了使用NAND Flah以外,还作上了一块小的NOR Flash来运行启动代码。
而我们这里的主要关注点在 nand flash
2、eMMC和nand flash的关系
1、NAND Flash 是一种存储介质,要在上面读写数据,外部要加主控和电路设计。
2、eMMC是NAND flash+主控IC ,对外的接口协议与SD、TF卡类似;对厂家而言简化了电路设计,降低了成本。
3、使用emmc的好处是,除了得到大容量的空间(这一点,只用NAND FLASH多堆叠也可以做到),还有就是emmc可以管理NAND (坏块处理,ECC)等。
eMMC=Nand Flash+控制器+标准封装
3、RPMB与eMMC的关系
这下来看看emmc的分区
1. BOOT Area Partition 1 & 2
此分区主要是为了支持从 eMMC 启动系统而设计的。
该分区的数据,在 eMMC 上电后,可以通过很简单的协议就可以读取出来。同时,大部分的 SOC 都可以通过 GPIO 或者 FUSE 的配置,让 ROM 代码在上电后,将 eMMC BOOT 分区的内容加载到 SOC 内部的 SRAM 中执行。
2 RPMB Partition(我们的关注点)
RPMB 是 Replay Protected Memory Block的简称,它通过 HMAC SHA-256 和 Write Counter 来保证保存在 RPMB 内部的数据不被非法篡改。
在实际应用中,RPMB 分区通常用来保存安全相关的数据,例如指纹数据、安全支付相关的密钥等。
3 General Purpose Partition 1~4
此区域则主要用于存储系统或者用户数据。 General Purpose Partition 在芯片出厂时,通常是不存在的,需要主动进行配置后,才会存在。
4 User Data Area
此区域则主要用于存储系统和用户数据。
User Data Area 通常会进行再分区,例如 Android 系统中,通常在此区域分出 boot、system、userdata 等分区。
如果对于这个eMMC感兴趣的可以看看这篇文章–>eMMC之分区管理、总线协议和工作模式
这是一个大致的分区,下面来重点看看我们的关注点RPMB分区。
4、RPMB是什么?
上面我们知道了RPMB(Replay Protected Memory Block)Partition 是 eMMC 中的一个具有安全特性的分区。
eMMC 在写入数据到 RPMB 时,会校验数据的合法性,只有指定的 Host 才能够写入,
同时在读数据时,也提供了签名机制,保证 Host 读取到的数据是 RPMB 内部数据,而不是攻击者伪造的数据。
RPMB 在实际应用中,通常用于存储一些有防止非法篡改需求的数据,例如手机上指纹支付相关的公钥、序列号等。
RPMB 可以对写入操作进行鉴权,但是读取并不需要鉴权,任何人都可以进行读取的操作,因此存储到 RPMB 的数据通常会进行加密后再存储。
下面来看看其工作流程:数据的读写
4.1 RPMB 数据读取
1、 Host 向 eMMC 发起读 RPMB 的请求,同时生成一个 16 bytes 的随机数,发送给 eMMC。
2、 eMMC 将请求的数据从 RPMB 中读出,并使用 Secure Key 通过 HMAC SHA-256 算法,计算读取到的数据和接收到的随机数拼接到一起后的签名。然后,eMMC 将读取到的数据、接收到的随机数、计算得到的签名一并发送给 Host。
3、 Host 接收到 RPMB 的数据、随机数以及签名后,首先比较随机数是否与自己发送的一致,如果一致,再用同样的 Secure Key 通过 HMAC SHA-256 算法对数据和随机数组合到一起进行签名,如果签名与 eMMC 发送的签名是一致的,那么就可以确定该数据是从 RPMB 中读取到的正确数据,而不是攻击者伪造的数据。
(因为伪造者就算得到了随机数,但是没有Secure Key,也无法伪造出对应的签名)
通过上述的读取流程,可以保证 Host 正确的读取到 RPMB 的数据。
4.2 RPMB 数据写入
Host 按照上面的读数据流程,读取 RPMB 的 Write Counter。
Host 将需要写入的数据和 Write Counter 拼接到一起并计算签名,然后将数据、Write Counter 以及签名一并发给 eMMC。
eMMC 接收到数据后,先对比 Write Counter 是否与当前的值相同,如果相同那么再对数据和 Write Counter 的组合进行签名,然后和 Host 发送过来的签名进行比较,如果签名相同则鉴权通过,将数据写入到 RPMB 中。
(这里如果发送的东西被截取到了,是不是就可以伪装host发生信息,nonono,首先这里有两个部分,一是secure key,二是 Write Counter。secure key这个肯定你知道,做签名用的。其次就是这个 Write Counter,下面来详细讲一下)
4.3 Write Counter–Replay Protect 原理
使用 eMMC 的产品,在产线生产时,会为每一个产品生产一个唯一的 256 bits 的 Secure Key,烧写到 eMMC 的 OTP 区域(只能烧写一次的区域),同时 Host 在安全区域中(例如:TEE)也会保留该 Secure Key。
在 eMMC 内部,还有一个RPMB Write Counter。RPMB 每进行一次合法的写入操作时,Write Counter 就会自动加一 。
通过 Secure Key 和 Write Counter 的应用,RMPB 可以实现数据读取和写入的 Replay Protect。
因为每次成功写入后Write Counter就加一了,那么就算你截取到了我的消息,你知道不能伪装我写入fake数据,你就想搞破快,不断的将截取道德数据发给RPMB,但是因为截取到的信息写入成功后,Write Counter加一了,因此这个时候你想搞重复写的破坏行为会在RPMB阶段给拒绝掉。
4.4 RPMB的大小
两个 RPMB Partition 的大小是由 Extended CSD register 的 BOOT_SIZE_MULT Field 决定,大小的计算公式如下:
Size = 128Kbytes x BOOT_SIZE_MULT
一般情况下,Boot Area Partition 的大小是128KB的倍数,EMMC中默认为 4 MB,即 RPMB_SIZE_MULT 为 32,部分芯片厂家会提供改写 RPMB_SIZE_MULT 的功能来改变 RPMB Partition 的容量大小。RPMB_SIZE_MULT 最大可以为 128,即 Boot Area Partition 的最大容量大小可以为 128 x 128 KB = 16384 KB = 16 MB。
小结:以上我们就大概知道了RPMB的相关知识。希望有所收获。感谢点赞关注啊!!!