依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。
所在专栏 《元带你学: eMMC协议详解》
全文 6300 字, 主要内容有
目录
4.1. 写认证密钥(write Authentication Key)
4.2. 读计数器值(Reading of the Counter Value)
4.3. 写认证数据(Authenticated Data Write)
4.4 读认证数据(Authenticated Data Read)、
4.5 写认证设备配置(Authenticated Device Configuration Write)
信息安全的三个基本目标是机密性、完整性和可用性:
eMMC安全方案有哪些呢? eMMC设备包含多种数据保护和安全功能,包括:写保护、密码锁定/解锁和RPMB。
本讲专注于讨论eMMC RPMB 安全机制。
1 概念
RPMB(Replay Protected Memory Block重放保护内存块)Partition 是 eMMC 中的一个具有安全特性的分区。eMMC 在写入数据到 RPMB 时,会校验数据的合法性,只有指定的 Host 才能够写入,同时在读数据时,也提供了签名机制,保证 Host 读取到的数据是 RPMB 内部数据,而不是攻击者伪造的数据。
2 容量大小
两个 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。
3 重放保护的原理
使用 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。
使用随机数生成和计数器寄存器是防止重放攻击的关键:
在写入RPMB的情况下,MAC的值受RPMB写入计数器的影响,RPMB写入计数器在每次成功写入RPMB时都会增加(主机和设备)
在从RPMB读取的情况下,MAC的值受主机发送的随机数的影响。
4 不同访问类型流程
4.1. 写认证密钥(write Authentication Key)
认证密钥在存储产品(如手机)生产阶段的时候写入。
认证密钥使用写多块命令CMD25进行编程。在命令CMD25之前,CMD23将块计数设置为1,参数位[31]设置为1,以表示编程的可靠的写类型。如果块计数未设置为1和/或参数位[31]未设置为1,则随后的写多块命令必须失败,并且应指示一般失败( General Failure)。
应该通过读取重播保护内存块的结果寄存器来检查键的编程是否成功。结果读取序列由写多块命令CMD25启动。在CMD25之前,CMD23将块计数设置为1。
所以CMD25 并不一定是写操作额。 如果在RPMB 区, CMD23 + CMD25 可能是读操作前的铺垫。
4.2. 读计数器值(Reading of the Counter Value)
计数器读取序列由写多块命令CMD25启动。在CMD25之前,CMD23将块计数设置为1。
如果读取计数器值成功,则返回的结果为0x00(读取失败)。
4.3. 写认证数据(Authenticated Data Write)
当eMMC设备接收到写入命令消息到RPMB时,它通过检查计数器已增加和主机发送的MAC是否与设备使用其保存的密钥生成的MAC相同来验证命令的有效性。
RPMB 数据写入的流程如下:
1)Host 按照上面的读数据流程,读取 RPMB 的 Write Counter。
2)Host 将需要写入的数据和 Write Counter 拼接到一起并计算签名,然后将数据、Write Counter 以及签名一并发给 eMMC。eMMC 接收到数据后,先对比 Write Counter 是否与当前的值相同,如果相同那么再对数据和 Write Counter 的组合进行签名,然后和 Host 发送过来的签名进行比较,如果签名相同则鉴权通过,将数据写入到 RPMB 中。
详细细节:
重放保护内存块的数据用多块写命令CMD25 program。在命令CMD25之前,块计数由CMD23设置,参数位[31]设置为1,表示编程访问的可靠写类型。块计数是要编程的半扇区的数目(256B)。
RPMB写访问支持的数据大小由EN_RPMB_REL_WR(EXT_CSD[166]位)决定。一次RPMB写访问中的整个数据是原子的,应包含旧数据或新数据。每个RPMB写访问的 起始地址应与相应的RPMB写访问的传输大小对齐。、
EN_RPMB_REL_WR=0:RPMB分区支持两种不同的大小:256B(单个512B帧)和512B(两个512B帧)。
EN_RPMB_REL_WR=1:RPMB分区支持三种不同的大小:256B(单个512B帧)、512B(2个512B帧)和8KB(32个512B帧)。
当eMMC收到此消息时,它首先检查写计数器是否已经过期。如果写计数器已过期,则eMMC将结果设置为0x85(写失败,写计数器已过期)。没有任何数据被写入到eMMC中。
接下来,将检查该地址。如果在地址中出现错误(超出范围),则该结果将设置为0x04(地址失败)。
如果写计数器未过期,则通过字节[283:0]计算MAC,并将其与请求中的MAC进行比较。
如果请求中的MAC和计算出的MAC相等,那么eMMC将请求中的写计数器与存储在eMMC中的写计数器进行比较。
如果MAC和写计数器比较成功,则认为写请求进行身份验证。来自请求的数据被写入请求中指示的地址,并且写计数器增加1。
主机应该通过读取重放保护内存块的结果寄存器来检查数据的编程是否成功。结果读取序列由写多块命令CMD 25启动。在CMD25之前,CMD23将块计数设置为1。
4.4 读认证数据(Authenticated Data Read)、
eMMC设备将读取的数据连同MAC签名一起发送到主机。主机接收消息并使用共享密钥生成MAC。只有当两个mac相同时,主机才会信任从RPMB读取的数据。
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 中读取到的正确数据,而不是攻击者伪造的数据。
通过上述的读取流程,可以保证 Host 正确的读取到 RPMB 的数据。
数据读取序列由写多块命令CMD25启动。在CMD25之前,CMD23将块计数设置为1。
当eMMC收到此请求时,它首先检查该地址。如果地址有错误(超出范围),数据读取操作无效。通过“多读取块”命令CMD18读出数据本身。在读取命令之前,块计数由CMD23设置。块计数是要读取的半扇区的数量(256B)。
4.5 写认证设备配置(Authenticated Device Configuration Write)
设备配置区域通过RPMB过程使用多块写命令CMD25编程。在命令CMD25之前,块计数由CMD23设置,参数位[31]设置为1 ,表示编程访问的可靠写类型。块计数是要编程的半扇区数(256B),且块计数应为0x1。因此,只使用一个256B (单512B帧)。
当eMMC收到此消息时,它首先检查写计数器是否已经过期。如果写计数器已过期,则eMMC将结果设置为0x85(写失败,写计数器已过期)。没有任何数据被写入到eMMC中。
如果写计数器未过期,则通过字节[283:0](请求类型、结果= 0x00、块计数、写计数器、地址、nonce= 0x00和数据)计算MAC,并将其与请求中的MAC进行比较。如果两个MAC不同,则eMMC将结果设置为0x02(身份验证失败)。没有任何数据被写入eMMC。
如果请求中的MAC和计算出的MAC相等,那么eMMC将请求中的写计数器与存储在eMMC中的写计数器进行比 较。如果两个计数器不同,则eMMC将结果设置为0x03(计数器失败)。没有任何数据被写入eMMC。
如果MAC和写计数器比较成功,则认为写请求进行身份验证。来自请求的数据被写入由请求中的地址指示的设备配置区域,并且写入计数器被增加1。
如果写入失败,则返回的结果为0x05(写入失败)。如果在写入过程中发生了其他错误,则返回的结果为0x01(一般失败)。主机应该通过读取重放保护内存块的结果寄存器来检查数据的编程是否成功。结果读取序列由写多块命令CMD 25启动。在CMD25之前,CMD23将块计数设置为1。
6.5. 读认证设备配置(Authenticated Device Configuration Read)
经过验证的设备配置读序列由写多块命令CMD25启动。在CMD25之前,CMD23将块计数设置为1。
在读取命令之前,块计数由CMD23设置,块计数应设置为0x1。
5. 命令需求
CMD18
缩写词:READ_MULTIPLE_BLOCK
参数:[31:0] data address
描述:连续将数据块从设备传输到主机,直到被停止命令中断,或传输请求的数据块数如果作为打包读命令的一部分发送,参数应包含包中的第一个读数据地址(包内的第一个单独读命令的地址)。
CMD23(default)
缩写词:SET_BLOCK_COUNT
参数:
[31] Reliable Write Request
[30] ‘0’ non- packed
[29] tag request
[28:25] context ID
[24]: forced programming
[23:16] set to 0
[15:0] number of blocks
描述:定义块读或写命令的块数(读/写)和可靠的写入器参数(写入)。
CMD25
缩写词:WRITE_MULTIPLE_BLOCK
参数:[31:0] data address
描述:连续写入数据块,直到出现STOP_TRANSMISSION或收到请求的块数。如果作为打包命令(打包写入或打包读取的标题)发送,则参数应包含包中的第一个读/写数据地址(包中第一个单独命令的地址)。
6. 用于RPMB访问的数据帧
Request/Response Type:定义内存的请求和响应类型。表18列出了已定义的请求和响应。响应类型对应于以前的RPMB读/写请求。
Authentication Key / Message Authentication Code (MAC) :根据请求/响应类型,认证密钥或消息认证码(MAC)。MAC将在最后一个(或唯一的)数据块中交付。
Operation Result:包括有关写计数器的状态(有效、过期)和对重播保护内存块的访问成功的信息。表19为RPMB操作结果数据结构。表20列出了已定义的结果和可能的故障原因。
Write Counter:主机写认证数据成功次数和写认证设备配置次数之和的计数器值。
Data Address:要编程或从重播保护内存块读取的数据的地址。地址是被访问的半扇区的序列号(256B),第一个地址是0x0000 。CMD 18和CMD 25中的地址参数将被忽略。
Nonce:由主机为请求生成的随机数,并由RPMB引擎复制到响应中。
Data:要通过签名访问权限写入或读取的数据。
Block Count:要求读取/编程的块数(半扇区,256B)。此值等于CMD23参数中的计数值。
7. RPMB的组成
认证密钥(Authentication Key)
大小:32Byte
类型:一次写入(与主机交互,只能写一次)
描述:一次性可编程认证密钥寄存器。此寄存器不能被主机覆盖、擦除或读取。在设备生产过程中写入,当计算MAC时,eMMC重放保护内存块引擎用来验证访问。
写入计数器(Write Counter)
大小:4Byte
类型:只读(与主机交互,是只读的)
描述:主机写认证数据成功次数和写认证设备配置次数之和的计数器值。eMMC生产后的初始值为0x000000000。值将由eMMC重播保护内存块引擎与成功的编程访问。无法重置该值。当计数器达到其最大值0x FFFF FFFF后,它将不再增加(防止溢出),数组帧中操作结果(result)的位[7]值将被永久设置为1,表示计数器过期。
数据(data)
大小: 最小128kB (RPMB_SIZE_MULT x 128kB)
类型:可读可写(与主机交互,是可读可写的)
描述:只能通过成功验证的读写访问来读写的数据。此数据可能会被主机覆盖,但永远无法被擦除。
mac
协议规定算法选sha256.
mac = HMAC(Authentication Key, data + Nonce + Write + Counter + Address + Block + Count + Result + Req/ Resp )
8. RPMB 用途
不同的供应商出于不同的目的使用RPMB,但是某些用例是RPMB的良好候选。一些著名的用例包括软件版本认证、指纹验证、安全密钥存储、网络供应商信息、数字权限管理(DRM)和安全支付。
RPMB 在实际应用中,通常用于存储一些有防止非法篡改需求的数据,例如手机上指纹支付相关的公钥、序列号等。RPMB 可以对写入操作进行鉴权,但是读取并不需要鉴权,任何人都可以进行读取操作,因此存储到 RPMB 的数据通常会进行加密后再存储。
参考
[1] https://blog.csdn.net/Thanksgining/article/details/111315721
[2] https://blog.csdn.net/xiezhi123456/article/details/81479793
[3] https://blog.csdn.net/shenjin_s/article/details/79868375
[4] https://blog.csdn.net/qq_46017662/article/details/130647444
免责声明:
本文根据公开信息整理,旨在介绍更多的存储知识,所载文章仅为作者观点,不构成投资或商用建议。本文仅用于学习交流, 不允许商用。若有疑问或有侵权行为请联系作者处理。