[元带你学: eMMC协议详解 17] eMMC 安全方案 之 RPMB(Replay Protected Memory Block 重放保护内存块)

news2024/12/28 17:55:10

依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载

所在专栏 《元带你学: eMMC协议详解》

内容摘要

全文  6300 字, 主要内容有

目录

1 概念

2 容量大小

3 重放保护的原理

4 不同访问类型流程

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)

5. 命令需求

6. 用于RPMB访问的数据帧

7. RPMB的组成

8. RPMB 用途

参考


信息安全的三个基本目标是机密性、完整性可用性

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

免责声明

本文根据公开信息整理,旨在介绍更多的存储知识,所载文章仅为作者观点,不构成投资或商用建议。本文仅用于学习交流, 不允许商用。若有疑问或有侵权行为请联系作者处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

coder oss 真正私有化部署的云端开发环境,nas也可以装

先看效果: 主界面,显示了你有那些工作空间 某个工作空间,我这里集成了web版vscode,也可以使用本地的vscode和其他开发IDE 有独立的终端和集成webide 以后就可以一个ipad都可以写代码了; 下面是平台搭建过程&#xff0…

C语言入门基础知识(万字笔记)

一、前言部分 本篇文章,将会主要介绍c语言的基本数据类型、基本运算符、语句,三大结构、数组、指针、宏定义等内容 二、具体部分 1、基本数据类型 1、基本数据类型 在C语言中,承载一系列信息的数字或中字符都属于数据类型,计算…

产品设计.B端产品vsC端产品

一、用户群体 01、B端:一般是多角色群体、多维度,一般是3个维度,决策者(老板)、管理者(财务、业务部门负责人)和执行者(使用的用户)。 02、C端:群体相对单一…

K8s 中 port, targetPort, NodePort的区别

看1个例子: 我们用下面命令去创建1个pod2, 里面运行的是1个nginx kubectl create deployment pod2 --imagenginx当这个POD被创建后, 其实并不能被外部访问, 因为端口映射并没有完成. 我们用下面这个命令去创建1个svc &#xff…

msvcp140.dll是什么?怎么解决电脑提示msvcp140.dll丢失的问题?(分享解决方法)

msvcp140.dll是动态链接库文件,是一种不可执行的二进制程序文件,允许程序共享执行特殊任务所需要的代码和其他资源。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。 很多小伙伴在使用电脑软件的时候,有一些问题会搞不明白…

C语言之枚举联合

一、枚举 枚举顾名思义就是&#xff1a;列举 。 即把可能的取值一一列举出来 &#xff08;一&#xff09;枚举类型的定义 这里我们直接上代码&#xff1a; //枚举类型 #include <stdio.h>enum Sex//性别 {//枚举的可能取值-常量MALE 2,FEMALE 4,SECRET 8//以上为给…

LAMP架构及搭建LAMP+Discuz论坛

LAMP架构及搭建LAMPDiscuz论坛的流程 1、LAMP架构概述2、LAMP各组件的作用3、LAMP的安装顺序4、LAMP的数据流向5、编译安装Apache5.1 关闭防火墙和slinux&#xff0c;将安装Apache所需软件包传到/opt目录下并解压5.2 安装环境依赖包5.3 选择Apache软件模块5.4 编译和安装5.5 优…

使用 Sa-Token 实现 [记住我] 模式登录、七天免登录

一、需求分析 如图所示&#xff0c;一般网站的登录界面都会有一个 [记住我] 按钮&#xff0c;当你勾选它登录后&#xff0c;即使你关闭浏览器再次打开网站&#xff0c;也依然会处于登录状态&#xff0c;无须重复验证密码&#xff1a; 本文将详细介绍在 Sa-Token中&#xff0c;…

移动机器人底盘-四轮差速模型(四轮独立)

移动机器人底盘-四轮差速模型 文章目录 移动机器人底盘-四轮差速模型1. 四轮差速模型原理2. 工程实践2.1 Python实现2.2 C实现 1. 四轮差速模型原理 四轮差速模型底盘实例如下图所示。对于底盘的前轮和后轮来说&#xff0c;其速度是同步的&#xff0c;那么在理想条件下&#x…

PHY芯片的使用(一)之基本概念讲解(MII相关)2

今天想和大家交流一下MAC和PHY之间的接口MII。 MII(Media Independent Interface )是介质无关接口。MII接口定义了在MAC层和物理层之间传送数据和控制状态等信息的接口&#xff0c;它是10M和100M兼容的接口&#xff0c;经过扩展后还可以用于1000M的MAC层与物理层的接口&#x…

【libdatachannel】Transport的设计实现

作为ice传输实现的基类 具有实际的作用。 D:\XTRANS\thunderbolt\ayame\ZHB_LIB_DATACHANNEL\src\impl\transport.cpp 最重要的是封装了对impl的调用 Transport 比较牛,抽象了传输的基础能力 发送(调用ice接口发送) send(message_ptr message);接收(通过ice收到后使用回调方…

msvcp140.dll下载,无法启动此程序,因为计算机中丢失msvcp140.dll的解决方法

msvcp140.dll是动态链接库文件&#xff0c;是一种不可执行的二进制程序文件&#xff0c;允许程序共享执行特殊任务所需要的代码和其他资源。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。 很多小伙伴在使用电脑软件的时候&#xff0c;有一些问题会搞不明白…

layui框架学习(27:弹出层模块_其它用法)

除了前几篇文章介绍的弹出框类型外&#xff0c;layui的layer弹出层模块还支持相册框和tab框&#xff0c;所谓相册框即点击图片或按钮后会出现一个类似相册的页面单独浏览、切换图片&#xff0c;而tab框是指弹出框的显示形式类似于Winform中的TabControl控件&#xff0c;能以选项…

如何把一个 Git 仓库的分支加入另一个无关的 Git 仓库

文章目录 笔者需要将两个无关的 Git 仓库合并&#xff0c;也就是把一个 Git 仓库的分支加入另一个无关的 Git 仓库。笔者琢磨了一下之后就实现了。方法如下。 笔者的运行环境&#xff1a; git version 2.37.0.windows.1 TortoiseGit 2.11.0.0 IntelliJ IDEA 2023.1.1 (Ultima…

vue2_markdown的内容目录生成

文章目录 ⭐前言⭐引入vue-markdown&#x1f496; 全局配置&#x1f496; 渲染选项&#x1f496; 取出markdown的标题层级 ⭐结束 ⭐前言 大家好&#xff01;我是yma16&#xff0c;本文分享在vue2的markdown文本内容渲染和目录生成 背景&#xff1a; 优化个人博客功能&#xf…

Spring MVC简介附入门案例

目录 一、SpringMVC简介 1.1 MVC模型 1.2 SpringMVC 二、SpringMVC入门案例 2.1 创建项目 2.2 引入依赖和tomcat插件 2.3 修改web.xml文件 2.4 新建springmvc.xml文件 2.5 编写控制器 2.6 配置运行方式 2.7 运行测试 三、SpringMVC执行流程 3.1 SpringMVC的组件…

【FreeRTOS】FreeRTOS动态创建任务与删除

0. 实验准备 正点原子 STM32407ZG 探索者开发板 FreeRTOS 例程模板&#xff08;可以在这一篇文章找到&#xff1a;STM32F407 移植 FreeRTOS&#xff09; 1. 动态创建任务函数 API 1.1 函数简介 动态创建任务需要使用到BaseType_t xTaskCreate函数&#xff0c;我们可以在 Fr…

unittest教程__TestSuite测试套件(2)

在前面一章中演示了unittest如何执行一个简单的测试&#xff0c;但有两个问题&#xff1a; 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的&#xff0c;在不改变用例名称的情况下&#xff0c;我们怎么来控制用例执行的顺序呢&#xff1f;一个测试文件&#xff0c;我…

事务底层与高可用原理

一、redo日志 在事务的实现机制上&#xff0c;MySQL采用的是WAL&#xff08;Write-ahead logging&#xff0c;预写式日志&#xff09;机制来实现的。 就是所有的修改都先被写入到日志中&#xff0c;然后再被应用到系统中。通常包含redo和undo两部分信息。 redo log称为重做日…

Spring执行流程和Bean的生命周期

1、Spring执行流程2、Bean的生命周期&#xff08;重点&#xff09;2.1、实例化和初始化的区别2.2、为什么先设置属性再进行初始化呢&#xff1f; 1、Spring执行流程 Spring执行流程&#xff08;Bean执行流程&#xff09;&#xff1a;1、在启动类中遇到了ApplicationContext的时…