欢迎光临
我们一直在努力

UFS3.1协议中文学习讲解(12)

事先声明本文不用于任何商业行为,仅用于本人学习与记录。所有截图版权均属于《JESD220E-UFS3.1》

欢迎点赞、收藏、转发分享给朋友,禁止未经书面授权的复制、搬运、二次剪辑。

如有引用请注明出处。

标准规范仍然以《JESD220E-UFS3.1》为准

写在最前:往后个人见解部分均用实线框出来。

本章的RPMB区介绍的非常长,但是长度又十分的尴尬,我拆成两节又会显得不连续,索性在一节里全部进行学习讲解,让大家看得过瘾,自己在复习是也过瘾,所以本节会花长一点的时间写稿~

12 UFS Security UFS 安全

本章总结 UFS 设备安全特性及其实现细节。这些特性包括:安全模式操作、数据和寄存器保护、RPMB 和复位。

12.1 UFS Security Feature Support Requirements UFS 安全特性支持要求

本标准定义的安全特性对所有设备都是强制的。

定义了以下安全特性:

  • 重放保护内存块(RPMB)
  • 安全模式
  • 不同类型的逻辑单元写保护

12.2 Secure Mode安全模式

12.2.1 Description描述

UFS 设备将用于存储用户的个人和 / 或企业数据信息。UFS 设备提供一种方式,在被请求时从设备中永久删除数据,确保无法通过对存储器件进行反向工程来检索这些数据。

UFS 设备应支持安全和不安全两种操作模式。在安全模式下,所有导致设备上信息删除或退役的操作将以安全方式清除这些信息,如 12.2.2.1 节 "安全擦除" 所述。

安全模式应用于逻辑单元级别,因此不同的逻辑单元可以有不同的安全模式。

12.2.2 Requirements要求

12.2.2.1 Secure Removal安全擦除

数据从设备中安全删除的方式取决于用于实现 UFS 设备的内存技术。三种常见方法适用于本规范发布时大多数存储类型:

  • 设备控制器应对寻址位置执行擦除操作。
  • 设备控制器应用单个字符覆写寻址位置并擦除设备。
  • 设备控制器用一个字符、其补码、然后随机字符覆写寻址位置。
  • UFS 设备应至少支持一种安全擦除方法。

    12.2.2.2 Erase Operation擦除操作

    擦除是一种将数据从已映射地址空间移动到未映射地址空间的操作。应用了擦除的逻辑块将被设为擦除值零。此操作不要求设备对未映射地址空间中的数据做任何处理。擦除执行后,主机上的软件无法检索到已擦除的逻辑块数据。

    擦除操作作用于逻辑块的最小数据范围。

    12.2.2.3 Discard Operation丢弃操作

    丢弃是擦除功能的非安全变体。丢弃和擦除的区别在于:丢弃不要求保证当对被标记为丢弃的 LBA 执行读操作时,主机无法从一个或多个 LBA 中检索到原始数据。

    12.2.2.4 Purge Operation清除操作

    清除操作应对未用于存储逻辑块数据的物理块执行(例如,之前用于存储逻辑块数据的物理块)。执行此操作时,它会导致所有此类物理块中的所有数据被清除。注意,已丢弃的 LBA 的数据(bProvisioningType=02h)可能不会被清除。这是根据 Device Descriptor 中 bSecureRemovalType 参数的值完成的。此模式允许主机系统防范物理层攻击。


    Erase / Discard / Purge 三种擦除的区别

    对比项Discard(丢弃)Erase(擦除)Purge(清除)
    实现方式 UNMAP 命令 UNMAP 命令 QUERY REQUEST(bPurgeEnable 标志)
    bProvisioningType 02h 03h
    TPRZ 位 0 1
    本质 标记 "这些块不要了" 标记 "这些块不要了" + 读返回全零 物理擦除所有空闲 NAND 块
    读 unmap LBA 返回任何数据(可能是原始数据) 返回全零
    数据是否真的没了 数据可能还在 NAND 里 软件层面看不到了,但NAND上还在 物理擦除,NAND里真正没了
    安全性 低(性能优化用) 中(软件恢复不了) 高(拆芯片也恢复不了)
    执行时间 慢(要擦很多块)
    状态机 有(Idle ↔ In Progress)
    典型用途 TRIM/GC 优化空间 安全删除用户数据 手机报废前彻底清数据

    我们一般常用Erase和Purge,erase是删除映射关系,下次都返回全零,只擦L2P映射不擦NAND,因此数据仍然在NAND Flash中,通过Flash读仍然能破解出来(类似我扫整个NAND FLASH);然后Purge是将空闲的NAND块都擦掉,那么你扫盘就扫不出来了,因为空闲的块全部擦干净了。

    相对于eMMC,erase就是erase和TRIM;Purge就是Sanitize;Discard不常用,虽然很快,但是十分不安全,我个人认为会有点鸡肋。

    那么还有人问了,erase是不是也不安全啊,如果你会扫盘的话,确实是的,因为有的人如果知道存的顺序就可以反向推出来,所以最安全的一种方式就是覆盖写,在原有数据的基础上再覆盖写一遍,这样原来的数据就完全花了,这在后面就会介绍,这是一种最安全但是最耗时间的方式。


    12.2.3 Implementation实现

    12.2.3.1 Erase擦除

    擦除功能通过 UNMAP 命令实现,当 Unit Descriptor 中的 bProvisioningType 参数设为 03h(TPRZ = 1)时使能。

    当 READ CAPACITY (16) 参数(26h)中的 TPRZ 位设为一时,设备应符合 [SBC] 中的 UNMAP 定义。

    如 [SBC] 中所定义:

    • UNMAP 命令导致已映射 LBA 在 unmap 操作成功完成后转换为已取消分配状态。
    • 由于 TPRZ 位设为一表示擦除功能使能,指定已取消分配 LBA 的 READ 命令应返回零。
    • 设备服务器可以将已取消分配的 LBA 保持在取消分配状态,直到写入操作指定该 LBA 完成无错误。
    • 设备服务器也可以随时将已取消分配的 LBA 从取消分配状态转换为映射状态(自主状态转换)。对于 UFS,如果 TPRZ 位设为一且发生自主转换,LBA 应映射到包含所有位设为零的物理块。

    要擦除的 LBA 应与 dEraseBlockSize 参数值对齐,以最小化性能影响。dEraseBlockSize 是 Unit Descriptor 中包含的参数。

    12.2.3.2 Discard丢弃

    丢弃功能通过 UNMAP 命令实现,当 Unit Descriptor 中的 bProvisioningType 参数设为 02h(TPRZ = 0)时使能。

    当 READ CAPACITY (16) 参数中的 TPRZ 位设为零时,设备应符合 [SBC] 中的 UNMAP 定义。

    如 [SBC] 中所定义:

    • UNMAP 命令导致已映射 LBA 在 unmap 操作成功完成后转换为已取消分配状态。
    • 由于 TPRZ 位设为零表示丢弃功能使能,指定已取消分配 LBA 的 READ 命令可能返回任何数据。
    • 设备服务器可以将已取消分配的 LBA 保持在取消分配状态,直到写入操作指定该 LBA 完成无错误。
    • 设备服务器也可以随时将已取消分配的 LBA 从取消分配状态转换为映射状态(自主状态转换)。对于 UFS,如果 TPRZ 位设为零且发生自主转换,LBA 应映射到包含 UNMAP 操作之前原始数据的物理块。

    要丢弃的 LBA 应尽可能与 dEraseBlockSize 参数值对齐,以最小化性能影响。dEraseBlockSize 是 Unit Descriptor 中包含的参数。

    12.2.3.3 Purge operation清除操作

    清除操作通过 Attributes 和 Flags 的 Query Functions 实现。特别是 bPurgeEnable 标志允许使能或禁用清除操作的执行,而 bPurgeStatus 属性提供操作状态信息。

    bPurgeEnable 标志:

    • 只写 volatile 标志,上电或复位时设为零。
    • 当此标志等于一时使能清除操作,否则禁用。
    • 此标志只能在所有逻辑单元命令队列为空时设置。
    • 当操作完成或发生错误条件时,UFS 设备自动清除此标志。
    • 主机可以通过将此标志清零来中断正在进行的清除操作。

    bPurgeStatus 属性:

    • 只读属性。
    • 此属性可以设为以下值之一:
      • 00h:空闲(清除操作禁用)
      • 01h:清除操作进行中
      • 02h:清除操作被主机提前停止
      • 03h:清除操作成功完成
      • 04h:清除操作失败,原因是逻辑单元队列不为空
      • 05h:清除操作一般失败
    • 其他值保留,不应设置。
    • 上电或复位后,bPurgeStatus 设为 00h(空闲)。
    • 当主机使能清除操作设置 bPurgeEnable 标志为一,且所有逻辑单元命令队列为空时,bPurgeStatus 将设为 01h 表示清除操作进行中。bPurgeStatus 完成成功后设为 03h,失败后设为 05h。
    • 主机应只在命令队列为空时将 bPurgeEnable 标志设为一。在设备命令队列非空时处理的设置 bPurgeEnable 标志的查询请求可能失败。如果此请求失败,QUERY RESPONSE UPIU 中的响应字段应清零("一般故障"),清除操作不会开始,bPurgeStatus 应设为 04h。
    • 当主机通过将 bPurgeEnable 标志设为零来中断正在进行的清除操作时,bPurgeStatus 应设为 02h。
    • 当 bPurgeStatus 等于值 02h、03h、04h 或 05h 时,bPurgeStatus 应在第一次读取时自动清除为 00h(空闲)。结果,bPurgeStatus 值 00h 和 01h 不应被修改。
    • 如果清除操作正在进行(bPurgeStatus = 01h),向任何逻辑单元或 RPMB 发出 SCSI 命令将失败。设备应返回感知键 "NOT READY",原因是清除操作正在进行。特别是,在清除操作进行期间,描述符、属性和标志只能进行写操作,其中只允许 bPurgeEnable 标志进行写操作。主机请求写描述符、属性或标志(bPurgeEnable 除外)的查询请求应以查询响应字段设为 "一般故障" 终止。
    • 如果主机需要在清除操作进行期间发出命令,它必须中断清除操作。在发出任何其他命令之前,主机将 bPurgeEnable 标志设为零。此事件中断操作,然后将 bPurgeStatus 属性设为 02h(清除操作被主机提前停止)。
    • 如果发生掉电,bPurgeEnable 标志和 bPurgeStatus 属性应复位为零。在这种情况下,设备不指示操作失败。

    图 12.1 显示了清除操作状态机。有两个状态:"空闲(Idle)" 和 "清除操作进行中(Purge Op. in progress)"。

    上电后,清除操作状态为 "空闲",清除操作被禁用。

    要执行清除操作,主机在发送 QUERY REQUEST UPIU 之前设置 bPurgeEnable 标志。如果设置 bPurgeEnable 的执行成功,状态将转换为 "清除操作进行中",清除操作将开始(bPurgeStatus = 01h)。如果存在至少一个逻辑单元命令队列非空,bPurgeEnable 标志清零,清除操作将不会开始,状态保持为" 空闲 ",bPurgeStatus = 04h。

    清除操作完成时,状态将自动转换为 "空闲",bPurgeStatus 设为 03h(操作成功完成时)或 05h(失败时)。

    主机可以通过清除 bPurgeEnable 标志中断正在进行的清除操作,操作被中断时状态将转换为 "空闲",bPurgeStatus 设为 02h。

    12.2.3.4 Wipe Device擦除设备

    擦除设备操作通过向所有使能的逻辑单元发出 FORMAT UNIT 命令来实现。

    如果逻辑单元使用 12.3 节 "设备数据保护" 中描述的方法之一进行写保护,或者如果控制模式页中的 SWP 位为一,则 FORMAT UNIT 命令应失败,且介质内容不得被修改。

    发送到 Device 知名逻辑单元 的 FORMAT UNIT 命令请求设备格式化除 RPMB 知名逻辑单元 之外的所有使能逻辑单元。当 FORMAT UNIT 命令发送到 Device 知名逻辑单元时,如果任何逻辑单元是写保护的,FORMAT UNIT 命令应失败,且介质内容不得被修改。

    FORMAT UNIT 命令的字段应按以下描述设置:

    • Format data(FMTDATA) 字段应设为零,指定不提供参数列表。
    • DEFLIST FORMAT 字段应设为 000b。
    • Format protection information(FMTINFO) 字段应设为 00b。
    • 厂商特定字节应设为 00h。

    由于 FMTDATA 设为零,UFS 设备应忽略 CMPLST 和 LONGLIST 位。

    12.2.3.5 bProvisioningType Parameter bProvisioningType 参数

    逻辑单元可以使用 Unit Descriptor 中的 bProvisioningType 参数配置为安全模式。此参数允许使能薄供应,并定义 READ CAPACITY 参数数据中的 TPRZ 位值。

    如果使能了薄供应且 TPRZ 位等于一,则使能安全模式。在此模式下,所有擦除操作应使用 Device Descriptor 中 bSecureRemovalType 参数定义的方法执行。整个设备只能定义一种擦除类型。

    bProvisioningType 参数可以设为以下值:

    • 00h:禁用薄供应
    • 02h:使能薄供应,TPRZ 设为零
    • 03h:使能薄供应,TPRZ 设为一

    TPRZ 位值为零表示设备处于普通模式。

    与所有其他 Unit Descriptor 可配置参数一样,bProvisioningType 值通过写 Configuration Descriptor 设置。详见 14.1.4.3 节 "Configuration Descriptor"。

    12.2.3.6 bSecureRemovalType Parameter bSecureRemovalType 参数

    Device Descriptor 中的 bSecureRemovalType 参数定义 Purge 操作期间信息从物理存储中擦除的方式。此参数可以在系统集成期间通过写 Configuration Descriptors 设置。bSecureRemovalType 值定义如下:

    • 值 03h:信息通过厂商定义的机制擦除。
    • 值 02h:所有信息通过用字符、其补码、然后随机字符覆写寻址位置来擦除。
    • 值 01h:所有信息通过用单个字符覆写寻址位置,然后擦除来擦除。
    • 值 00h(默认):所有信息通过物理内存擦除来擦除。

    其他值保留供将来使用,不应设置。

    设备制造商只需要支持其存储阵列技术所需的机制。

    更多信息请参考 DoD 5220.22-M Sanitizing method 或以下文档:

    • DoD 5220.22-M(http://www.dtic.mil/whs/directives/corres/pdf/522022m.pdf)
    • NIST SP 800-88(http://csrc.nist.gov/publications/nistpubs/800-88/NISTSP800-88_rev1.pdf)

    12.3 Device Data Protection设备数据保护


    写保护(Write Protect)是干嘛的?

    写保护就是让存储设备变成 "只读"—— 能读,但不能写 / 改 / 删。

    为什么需要写保护?

    场景没有写保护会怎样有写保护
    系统分区 应用误删系统文件,手机变砖 系统分区只读,改不了
    出厂数据 用户 / 病毒误改出厂配置 永久写保护,改不了
    加密分区 密钥被篡改 安全写保护,只能特定方式改
    报废前 数据被恢复 写保护后格式化更安全

    UFS 里的三种写保护

    写保护类型怎么开启怎么解除特点
    软件写保护(SWP) MODE SELECT 写控制模式页 再用 MODE SELECT 关掉 软件控制,随时开关
    上电写保护 配置 bLUWriteProtect=01h + fPowerOnWPEn=1 复位后自动解除 每次上电时生效
    永久写保护 配置 bLUWriteProtect=02h + fPermanentWPEn=1 永远不能解除 一旦开启,终身只读

    基本每个存储设备,存储协议都会有写保护功能,并且大家都大差不差的,eMMC有,UFS有,我相信SATA,PCIE更有。


    12.3.1 Description and Requirements描述和要求

    UFS 设备数据可以在逻辑单元级别进行保护。以下保护模式可用:

    • 永久写保护(permanent):一旦使能,无法撤销。
    • 上电写保护(power on write protected):可以通过电源循环或硬件复位事件清除。
    • 安全写保护(secure write protect):只能使用安全认证方法配置和使能 / 禁用。

    这些写保护模式不在 RPMB 知名逻辑单元上实现。

    还应有一种方法读取逻辑单元当前使能的保护模式。

    12.3.2 Implementation实现

    保护模式可以在逻辑单元级别配置 Unit Descriptor 中的 bLUWriteProtect 参数。写保护模式编码如下:

    • 00h:逻辑单元不写保护(或如果一个或多个安全写保护条目存在,则为安全写保护)。
    • 01h:逻辑单元上电写保护。
    • 02h:逻辑单元永久写保护。

    上电写保护的逻辑单元(bLUWriteProtect = 01h)只有在 fPowerOnWPEn 标志等于 0b 时才能被写入。fPowerOnWPEn 标志在电源循环或硬件复位事件后设为零。一旦设为零,主机不能将其置位或清零。

    fPermanentWPEn 标志应设为一以使能所有永久写保护逻辑单元(bLUWriteProtect = 02h)的写保护。如果 fPermanentWPEn 标志等于 0b,则逻辑单元可以被写入。fPermanentWPEn 标志在制造后应设为零。

    当逻辑单元不写保护时,可以使用安全写保护模式写保护 LBA 区域。

    安全写保护区域通过设置安全写保护配置块配置。安全写保护区域只能在配置为 "不写保护" 的逻辑单元(bLUWriteProtect = 00h)中创建。一个逻辑单元最多可以有四个安全写保护区域。然而,一个设备中安全写保护区域的总数不得超过 bNumSecureWPArea。

    安全写保护区域只有在相关安全写保护条目(WPF 标志 = 0b)中的写保护禁用时,才能被写入。详见 12.4.3.1 节。

    建议在所有命令队列为空且设备等待响应完成后,等待设备响应,然后再写命令,再写 fPowerOnWPEn 标志、fPermanentWPEn 标志或 WPF 标志。

    如果 LBA 被写保护,则其他请求该 LBA 数据上的介质更改的写命令(如 unmap、format 等)应以 CHECK CONDITION 状态拒绝,感知键设为 DATA PROTECT。

    12.4 RPMB重放保护内存块


    重放攻击(Replay Attack)是什么?

    攻击者截获了一段合法的通信消息,然后把这段消息再发一遍,来欺骗系统。

    举个例子,你的车子是远程钥匙按键控制,攻击者截取了按键时发出的信息,然后重新发一遍给你的车,你的车解锁了。你以为是你解锁的就没在意,但是攻击者已经获取了密码。攻击者可以用该密码进行攻击。

    那么何为防重放攻击,请大家自行去查找搜索,简单来说如下:

    重放攻击防的不是 "第一次能不能成功",而是 "旧消息能不能在不该用的时候再用一遍"。防重放让每条消息都是一次性的,用过就废。

    举例RPMB的使用:

    假设 RPMB 里存了一个播放许可:

    正常流程: 1. 用户买了一部电影,服务器给手机一个"播放许可" 2. 手机把许可写入 RPMB(带MAC签名) 3. 用户可以看这部电影

    没有防重放的情况:

    1. 用户看完了电影,把许可"删除"了(或者许可过期了) 2. 攻击者截获了当时写入许可的消息 3. 攻击者把这条消息再发一遍 → RPMB 里又出现了许可  4. 用户又能看电影了——盗版!

    有防重放的情况:

    1. 用户看完了电影,许可过期了 2. 攻击者重放旧的写许可消息 3. 设备一看:写计数器对不上,Nonce 也用过了 → 拒绝  4. 旧的许可消息再也用不了了


    12.4.1 Introduction介绍

    提供了一种对重放保护内存块(RPMB)的安全访问。此功能提供系统以认证和重放保护的方式安全存储数据的方法。这是通过将认证密钥信息编程到 UFS 设备内存(共享密钥)中来提供的。

    由于系统必须首先在此阶段进行认证,认证密钥编程发生在安全环境中,如 OEM 生产。此外,认证密钥用于对写入的认证密钥数据进行签名,重放保护内存区域中的写入访问使用消息认证码(MAC)。

    使用随机数生成和计数器寄存器提供额外的保护,防止攻击者记录消息并稍后重放。

    12.4.2 RPMB Well Known Logical Unit Description RPMB 知名逻辑单元描述

    RPMB 包含在一个唯一的知名逻辑单元中,其大小在 RPMB 单元描述符中定义。RPMB 知名逻辑单元大小应为 128 Kbytes 的倍数,因此其最小大小为 128 Kbytes。RPMB 知名逻辑单元的内容只能通过成功认证的读和写访问来读或写。数据可以被覆盖,但永远不能被擦除。

    所有对 RPMB 的访问将引用特定的 RPMB 知名逻辑单元号(W-LUN)。

    RPMB 知名逻辑单元可以配置为多个 RPMB 区域,每个 RPMB 区域都有自己专用的认证密钥、写计数器、结果寄存器和以零开始的逻辑地址。参见 13.2.3 节,了解如何将 RPMB 知名逻辑单元配置为多个 RPMB 区域。

    每个 RPMB 区域在任何给定时间只能处理单个 RPMB 认证操作,其中单个认证 RPMB 操作对应于图 12.2"认证密钥编程流"、图 12.3"读计数器值流"、图 12.6"认证安全写保护配置块读流",以及表 12.5"请求消息类型" 中列出的流。例如,发起设备 3 可以在 RPMB 区域 0 中启动认证操作,发起设备 4 在 RPMB 区域 1 中启动认证操作。在完成发起设备 3 启动的认证操作后,RPMB 区域 0 可以被新的认证操作请求访问,在完成发起设备 4 的请求后,RPMB 区域 1 可以被发起设备 4 访问。

    12.4.3 Requirements要求

    12.4.3.1 RPMB Resources RPMB 资源

    认证密钥(Authentication Key):

    • 类型:写一次,不可擦除或读
    • 大小:32 字节
    • 描述:认证密钥寄存器,用于计算 MAC 时认证访问。每个 RPMB 区域有专用的认证密钥。

    写计数器(Write Counter):

    • 类型:只读
    • 大小:4 字节
    • 描述:主机成功认证数据写请求总数的计数器值。生产后此寄存器的初始值为 0000 0000h。每次成功编程访问时,UFS 设备应自动将该值加一。计数器达到最大值 FFFF FFFFh 后不再递增(溢出保护)。每个 RPMB 区域有专用的写计数器。

    结果寄存器(Result Register):

    • 类型:只读
    • 大小:2 字节
    • 描述:此寄存器提供认证操作的结果。结果寄存器值在 12.4.3.6 节中描述。每个 RPMB 区域有专用的结果寄存器。

    RPMB 数据区(RPMB Data Area):

    • 类型:可读可写
    • 大小:RPMB 单元描述符中定义的 128 Kbytes 的倍数
      • 最小 128 Kbytes,最大 16 Mbytes
      • 每个 RPMB 区域大小定义在 RPMB 单元描述符中的 bRPMBRegion0Size ~ bRPMBRegion3Size
    • 描述:只能通过成功认证的读写访问读取和写入的数据。此数据可以被主机覆盖,但永远不能被擦除。

    安全写保护配置块(Secure Write Protect Configuration Block):

    • 类型:可读可写
    • 大小:256 字节
    • 描述:安全写保护配置块仅由 RPMB 区域 0 支持。此块用于配置逻辑单元中的安全写保护区域。每个逻辑单元有一个安全写保护配置块。每个安全写保护配置块最多有四个安全写保护条目。每个条目代表一个安全写保护区域。如果某个条目未使用,相关字段应包含零值。安全写保护配置块结构如表 12.1 所示。

    a) LUN

    LUN 字段指示安全写保护应应用于哪个逻辑单元。有效值从 0 到 bMaxNumberLU 指定的 LU 数量。

    b) DATA LENGTH(数据长度)

    DATA LENGTH 字段指定安全写保护条目的长度(字节):

    • 0 = 无条目
    • 16 = 1 个条目
    • 32 = 2 个条目
    • 48 = 3 个条目
    • 64 = 4 个条目

    在写请求中,设备应忽略 DATA LENGTH + 16 到 255 之间的字节,并将安全写保护配置块的这些字节设为零。

    c) 安全写保护条目 0 到条目 3(Secure Write Protect Entry 0 to Entry 3)

    安全写保护配置块可以只包含条目 0、条目 0 和 1、条目 0、1 和 2、或全部四个条目。如果安全写保护配置块不包含任何条目(DATA LENGTH = 00h),指定逻辑单元中的所有条目将被移除。

    表 12.2 定义了安全写保护条目的结构。

    d) WPT(写保护类型,Write Protect Type)

    写保护类型字段(WPT)指定 WPF 位可以如何修改。

    e) WPF(写保护标志,Write Protect Flag)

    • 0b:安全写保护禁用。
    • 1b:安全写保护使能。

    WPF 设为一时,逻辑单元应禁止修改由 LBA 字段和 NUMBER OF LOGICAL BLOCKS 字段指示的范围内 LBA 的介质。需要写介质的命令应以 CHECK CONDITION 状态终止,感知键设为 DATA PROTECT,额外感知码设为 WRITE PROTECTED。

    包含缓存的逻辑单元在使能写保护之前,应将所有缓存逻辑块写入介质(例如,它们会响应 SYNCHRONIZE CACHE 命令,将 LBA 字段和 NUMBER OF LOGICAL BLOCKS 字段设为安全写保护条目中指示的值)。

    WPF 设为零表示该逻辑单元可以允许写介质,取决于逻辑单元实现的其他写禁止机制。

    WPF 在设备制造后应设为零。

    f) 逻辑块地址(LOGICAL BLOCK ADDRESS)

    此字段指定安全写保护区域的第一个逻辑块的 LBA。

    g) 逻辑块数量(NUMBER OF LOGICAL BLOCKS)

    此字段指定属于安全写保护区域的连续逻辑块数量。

    如果 NUMBER OF LOGICAL BLOCKS 字段设为零,则安全写保护应用于整个逻辑单元。在这种情况下,只需要配置 Entry-0 即可使能整个逻辑单元的安全写保护。

    12.4.3.2 Algorithm and Key for MAC Calculation MAC 计算的算法和密钥

    消息认证码(MAC)使用 HMAC SHA-256 计算,如 [HMAC-SHA] 中定义。HMAC SHA-256 计算以密钥和消息作为输入。生成的 MAC 为 256 位(32 字节),嵌入在数据帧中作为请求或响应的一部分。

    用于 MAC 计算的密钥始终是存储在目标 RPMB 区域中的 256 位认证密钥。用于 MAC 计算的消息是 RPMB 包中各字段的拼接。

    12.4.3.3 RPMB Message Components RPMB 消息组件

    每个 RPMB 消息包含特定组件。这些组件显示在表 12.4 中。

    12.4.3.4 Request Message Types请求消息类型

    以下定义的请求消息类型用于支持 RPMB。这些消息从主机发送到设备:

    • 认证密钥编程请求(Authentication Key programming request)
    • 写计数器读请求(Write Counter read request)
    • 认证数据写请求(Authenticated data write request)
    • 认证数据读请求(Authenticated data read request)
    • 结果读请求(Result read request)
    • 安全写保护配置块写请求(Secure Write Protect Configuration Block write request)
    • 安全写保护配置块读请求(Secure Write Protect Configuration Block read request)

    表 12.5 定义了各种消息的请求消息类型代码。

    12.4.3.5 Response Message Types响应消息类型

    以下定义的响应消息类型用于支持 RPMB。这些消息从设备发送到主机:

    • 认证密钥编程响应(Authentication Key programming response)
    • 写计数器读响应(Write Counter read response)
    • 认证数据写响应(Authenticated data write response)
    • 认证数据读响应(Authenticated data read response)
    • 安全写保护配置块写响应(Secure Write Protect Configuration Block write response)
    • 安全写保护配置块读响应(Secure Write Protect Configuration Block read response)

    表 12.6 定义了各种消息的响应消息类型代码。

    12.4.3.6 RPMB Operation Result RPMB 操作结果
    • RPMB 消息的结果组件由两个字节组成。最高有效字节保留并应设为零。
    • 结果字段的 Bit 7 应指示写计数器是否已过期(即达到最大值):
      • 值为一表示写计数器已过期
      • 值为零表示写计数器有效
    • 其他位应指示操作状态:
      • 操作成功(00h)
        • 一般失败(01h)
      • 认证失败(02h)
        • MAC 比较不匹配,MAC 计算失败
      • 计数器失败(03h)
        • 比较时计数器不匹配,计数器递增失败
      • 地址失败(04h)
        • 地址越界,地址对齐错误
      • 写失败(05h)
        • 数据、计数器或结果写失败
      • 读失败(06h)
        • 数据、计数器或结果读失败
      • 认证密钥尚未编程(07h)
        • 在目标 RPMB 区域中编程认证密钥之前,此值是唯一有效的结果,之后不会再出现
      • 安全写保护配置块访问失败(08h)
        • 安全写保护配置块读或写失败
      • 无效安全写保护块配置参数(09h)
        • 无效的 LUN(或逻辑单元未使能)、DATA LENGTH、LOGICAL BLOCK ADDRESS、NUMBER OF LOGICAL BLOCKS 或区域重叠
      • 安全写保护不适用(0Ah)
        • 逻辑单元配置了其他写保护模式(永久或上电)

    12.4.4 Implementation实现

    12.4.4.1 RPMB Message RPMB 消息

    一个 RPMB 消息可以由一个或多个 RPMB 消息数据帧组成。

    RPMB 消息数据帧大小为 512 字节,其组织方式如表 12.9 所示。

    12.4.4.2 MAC Calculation MAC 计算

    用于 MAC 计算的密钥始终是存储在设备中的 256 位认证密钥。

    MAC 计算的输入是 RPMB 消息数据帧中从字节 228 到字节 511 的字段拼接(填充字节和 MAC 本身被排除)。

    如果 RPMB 消息由多个 RPMB 消息数据帧组成,则 MAC 的输入消息是每个数据帧中字节 [228:511] 按数据帧发送顺序拼接。

    MAC 仅在最后一个数据帧中有效。

    12.4.4.3 RPMB Message Data Frame Delivery RPMB 消息数据帧交付

    RPMB 消息使用 SCSI 安全协议命令交付:

    • SECURITY PROTOCOL OUT 用于向设备发送请求消息。
    • SECURITY PROTOCOL IN 用于向设备请求发送响应消息。

    12.4.5 SECURITY PROTOCOL IN/OUT Commands SECURITY PROTOCOL IN/OUT 命令

    [SPC] 中定义的 SECURITY PROTOCOL IN 命令和 SECURITY PROTOCOL OUT 命令用于封装和交付主机与设备之间任何安全协议的数据分组,无需解释、拆卸或重新组装数据分组即可交付。

    SECURITY PROTOCOL IN 命令和 SECURITY PROTOCOL OUT 命令包含一个 SECURITY PROTOCOL 字段。T10 为 JEDEC UFS 分配了唯一的安全协议 ID:

    • SECURITY PROTOCOL = ECh(JEDEC Universal Flash Storage)
    12.4.5.1 CDB format of SECURITY PROTOCOL IN/OUT commands SECURITY PROTOCOL IN/OUT 命令的 CDB 格式

    RPMB 知名逻辑单元应支持以下 SECURITY PROTOCOL 字段值:

    • 00h:安全协议信息
    • ECh:JEDEC Universal Flash Storage(为 JEDEC UFS 应用分配的安全协议 ID)

    其他值无效。

    SECURITY PROTOCOL IN/OUT 命令应将为 JEDEC UFS 应用分配的唯一安全协议 ID 视为唯一有效的安全协议 ID。

    当 SECURITY PROTOCOL 字段设为 ECh(即 JEDEC Universal Flash Storage)时:

    • INC_512 位应设为零,指定 ALLOCATION LENGTH 或 TRANSFER LENGTH 字段表示要传输的字节数。
    • 如果 SECURITY PROTOCOL IN 命令中的 ALLOCATION LENGTH 字段不是 512 的整数倍,则命令应以 CHECK CONDITION 状态终止。
    • 如果 SECURITY PROTOCOL OUT 命令中的 TRANSFER LENGTH 字段不是 512 的整数倍,则命令应以 CHECK CONDITION 状态终止。
    • SECURITY PROTOCOL SPECIFIC 字段指定 RPMB 协议 ID。

    RPMB 协议 ID 指示 RPMB 区域,如表 12.11 所定义

    如果 SECURITY PROTOCOL SPECIFIC 字段设为无效值或对应的 RPMB 区域未使能,则 SECURITY PROTOCOL IN/OUT 命令应以 CHECK CONDITION 状态终止,感知键设为 ILLEGAL REQUEST,额外感知码设为 "CDB 中的无效字段"。

    安全写保护配置块写和安全写保护配置块读请求仅由 RPMB 区域 0 支持。

    如 [SPC] 所要求,如果设备支持 SECURITY PROTOCOL IN 命令,则应支持 SECURITY PROTOCOL 值 00h(安全协议信息)。安全协议信息安全协议(即 SECURITY PROTOCOL 字段设为 00h 的 SECURITY PROTOCOL IN 命令)用于从逻辑单元传输安全协议相关信息。

    当 SECURITY PROTOCOL IN 命令中的 SECURITY PROTOCOL 字段设为 00h 时,两个字节的 SECURITY PROTOCOL SPECIFIC 字段应包含表 12.11 中定义的数值。

    12.4.5.2 Supported security pro tocols list description支持的安全协议列表描述

    根据 [SPC],如果 SECURITY PROTOCOL IN 命令中 SECURITY PROTOCOL 字段设为 00h,且 SECURITY PROTOCOL SPECIFIC 字段设为 0000h,则参数数据格式如表 12.13 所示。

    安全协议信息(00h)和 JEDEC Universal Flash Storage(ECh)是 RPMB 知名逻辑单元支持的唯一有效安全协议 ID,因此表 12.13 应按表 12.14 实现。

    12.4.5.3 Certificate data description证书数据描述

    如果 SECURITY PROTOCOL IN 命令中 SECURITY PROTOCOL 字段设为 00h,且 SECURITY PROTOCOL SPECIFIC 字段设为 0001h,则参数数据格式如表 12.15 所示。

    设备服务器没有证书要传输,CERTIFICATE LENGTH 字段应设为 0000h。因此表 12.15 应按表 12.16 实现。

    12.4.6 RPMB Operations RPMB 操作

    12.4.6.1 Request Type Message Delivery请求类型消息交付
    • 任何时候只能执行一个 RPMB 操作。
    • 发起设备向 RPMB 知名逻辑单元发送请求类型消息,以请求执行操作。
    • 要交付请求类型消息,发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh(即 JEDEC Universal Flash Storage),并在 SECURITY PROTOCOL SPECIFIC 字段中指示目标 RPMB 区域。
    • 对于认证数据写请求,要写入 RPMB 数据区的数据包含在请求消息中。单个认证数据写请求中的最大数据大小等于 bRPMB_ReadWriteSize × 256 字节;如果所需数据大小超过此值,应执行多个认证数据写操作。
    • 对于 SECURITY PROTOCOL OUT 命令,由于数据从主机传输到设备,COMMAND UPIU 中的 Flags.W 设为一。
    • 表 12.17 定义了各种情况的 COMMAND UPIU 中 Expected Data Transfer Length 字段值。

    • 设备通过发送 READY TO TRANSFER UPIU 向主机指示已准备好接收请求类型消息。如果 Expected Data Transfer Length 为 512 字节,则 Data Buffer Offset 字段应设为零值,Data Transfer Count 字段应设为 512。
    • 单个 READY TO TRANSFER UPIU 中请求的字节数不得超过 bMaxDataOutSize 属性指示的值。单个 READY TO TRANSFER UPIU 可以请求传输一个或多个 RPMB 消息。
    • 响应每个 READY TO TRANSFER UPIU,主机发送 DATA OUT UPIU 交付请求的消息部分。关于数据传输的详情见 10.7.13。
    • 为完成 SECURITY PROTOCOL OUT 命令,设备返回带状态的 RESPONSE UPIU。
    • 图 12.2 描述了请求类型消息交付。应用客户端在 Data Out 缓冲区中加载 RPMB 消息,并在 SECURITY PROTOCOL SPECIFIC 字段中指示目标 RPMB 区域。

    12.4.6.2 Response Type Message Delivery响应类型消息交付
    • 发起设备请求 RPMB 知名逻辑单元发送响应类型消息,以:
      • 检索前一个操作的结果
      • 检索写计数器
      • 从 RPMB 数据区检索数据
      • 检索安全写保护配置块的内容
    • 要请求交付响应类型消息,主机发送 SECURITY PROTOCOL IN 命令,SECURITY PROTOCOL 字段设为 ECh(即 JEDEC Universal Flash Storage),并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。
    • 对于认证数据读,从 RPMB 数据区读取的数据包含在响应消息中。
    • 对于 SECURITY PROTOCOL IN 命令,由于数据从设备传输到主机,COMMAND UPIU 中的 Flags.R 设为一。
    • 表 12.18 定义了各种情况的 COMMAND UPIU 中 Expected Data Transfer Length 字段值。

    • 设备返回 RPMB 消息中请求的结果或数据。RPMB 消息通过在数据阶段发送一个或多个 DATA IN UPIU 来交付。单个 DATA IN UPIU 可以交付一个或多个 RPMB 消息。
    • DATA IN UPIU 中的数据大小不得超过 bMaxDataInSize 属性指示的值。
    • 为完成 SECURITY PROTOCOL IN 命令,设备发送带状态的 RESPONSE UPIU。
    • 图 12.3 描述了响应类型消息交付。应用客户端请求 RPMB 区域,在 Data In 缓冲区中传输 RPMB 消息,在 CDB 的 SECURITY PROTOCOL SPECIFIC 字段中指定 RPMB 区域 ID。

    12.4.6.3 Authentication Key Programming认证密钥编程

    认证密钥编程通过 SECURITY PROTOCOL OUT 命令发起:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。RPMB 数据帧包含请求消息类型 = 0001h 和认证密钥。
    • 设备在认证密钥编程完成时返回 GOOD 状态响应。

    认证密钥编程验证过程通过发出 SECURITY PROTOCOL OUT 命令开始:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。RPMB 数据帧包含请求消息类型 = 0005h(结果读请求)。注意,任何发起设备的结果读请求都会覆盖 RPMB 区域的结果寄存器。
    • 设备在操作结果准备好时返回 GOOD 状态响应。

    发起设备通过发出 SECURITY PROTOCOL IN 命令检索操作结果:

    • SECURITY PROTOCOL 字段设为 ECh,SECURITY PROTOCOL SPECIFIC 字段指示 RPMB 区域。
    • 设备返回包含响应消息类型 = 0100h 和结果代码的 RPMB 数据帧。
    • 如果认证密钥编程失败,则返回结果为 "写失败"(0005h)。如果认证密钥编程期间发生其他错误,则返回结果为 "一般失败"(0001h)。

    在认证密钥编程到相应 RPMB 区域之前,无法访问 RPMB 数据区。可以通过尝试读写 RPMB 数据区来检查设备状态:如果认证密钥未编程,则响应消息中的结果字段将设为 "认证密钥尚未编程"(0007h)。

    12.4.6.4 Read Counter Value 读计数器值

    读计数器值序列通过 SECURITY PROTOCOL OUT 命令发起:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。RPMB 数据帧包含请求消息类型 = 0002h 和 Nonce(随机数)。

    当状态响应收到 GOOD 状态时,通过发送 SECURITY PROTOCOL IN 命令检索写计数器值:

    • 发起设备发送 SECURITY PROTOCOL IN 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。
    • 设备返回 RPMB 数据帧,包含响应消息类型 = 0200h、请求中收到的 Nonce 的副本、写计数器值、MAC 和 Result。

    如果读计数器值失败,则返回结果为 "读失败"(0006h/0086h)。如果发生其他错误,则返回结果为 "一般失败"(0001h/0081h)。

    如果计数器已过期,则返回结果中 Bit 7 也设为一。

    12.4.6.5 Authenticated Data Write认证数据写

    认证数据写序列通过 SECURITY PROTOCOL OUT 命令发起:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。RPMB 消息由一个或多个 RPMB 消息数据帧组成,每个帧包含:请求消息类型 = 0003h、块计数、地址、写计数器、数据和 MAC。

    设备收到 RPMB 消息后执行以下检查:

  • 检查写计数器是否过期。 如果写计数器已过期,则设备将结果设为 "写失败,写计数器过期"(0085h)。不向 RPMB 数据区写入数据。
  • 检查地址。 如果 Address 值大于或等于目标 RPMB 区域大小(由 RPMB 单元描述符中的 bRPMBRegion0Size ~ bRPMBRegion3Size 参数值定义),则结果设为 "地址失败"(0004h)。不向 RPMB 数据区写入数据。
  • 检查块计数 + 地址。 如果 Address 值 + Block Count 值大于目标 RPMB 区域大小,则结果设为 "地址失败"(0004h)。不向 RPMB 数据区写入数据。
  • 检查块计数是否超限。 如果 Block 指示的值大于 bRPMB_ReadWriteSize,则认证数据写操作失败,结果设为 "一般失败"(0001h)。
  • 验证 MAC。 如果写计数器未过期,则设备计算请求类型、块计数、写计数器、地址和数据的 MAC,并与请求中的 MAC 比较。如果两个 MAC 不同,则设备将结果设为 "认证失败"(0002h)。不向 RPMB 数据区写入数据。
  • 验证写计数器。 如果请求中的 MAC 和设备计算的 MAC 相等,则设备比较请求中的写计数器和设备中存储的写计数器。如果两个计数器不同,则设备将结果设为 "计数器失败"(0003h)。不向 RPMB 数据区写入数据。
  • 写入数据。 如果 MAC 和写计数器比较都成功,则写请求被认为已认证。数据写入请求中指示的地址。
  • 计数器加一。 如果写操作成功执行,写计数器加一。
    • 如果写失败,则返回结果为 "写失败"(0005h)。
    • 如果写过程中发生其他错误,则返回结果为 "一般失败"(0001h)。
    • 在 Block Count 大于一的认证数据写请求中:
      • MAC 只包含在最后一个 RPMB 消息数据帧中。 所有前一个数据帧中的 MAC 字段为零。如果任何非最后一个 RPMB 消息数据帧中的 MAC 字段非零,设备行为未定义。
      • 在每个数据帧中,写计数器指示当前计数器值,地址是完整访问的起始地址(不是单个逻辑块的地址),块计数是总块数(不是块编号)。
    • 认证数据写操作完成后,设备应响应 SECURITY PROTOCOL OUT 命令返回 GOOD 状态,无论认证数据写是否成功。

    认证数据写验证过程通过发出 SECURITY PROTOCOL OUT 命令开始:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。RPMB 数据帧包含请求消息类型 = 0005h(结果读请求)。注意,任何发起设备的任何请求(结果读请求除外)都会覆盖 RPMB 区域的结果寄存器。
    • 设备在操作结果准备好检索时返回 GOOD 状态。

    发起设备通过发出 SECURITY PROTOCOL IN 命令检索操作结果:

    • SECURITY PROTOCOL 字段设为 ECh,SECURITY PROTOCOL SPECIFIC 字段指示 RPMB 区域。
    • 设备返回 RPMB 数据帧,包含响应消息类型 = 0300h、计数器值(如果写操作成功执行则已递增)、认证数据写请求中收到的地址、MAC 和认证数据写操作的结果。

    12.4.6.6 Authenticated Data Read认证数据读

    认证数据读序列通过 SECURITY PROTOCOL OUT 命令发起:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。RPMB 数据帧包含请求消息类型 = 0004h、Nonce(随机数)、数据地址和块计数。

    设备收到请求后首先检查地址:

    • 如果 Address 值等于或大于目标 RPMB 区域大小(由 RPMB 单元描述符中 bRPMBRegion0Size ~ bRPMBRegion3Size 参数值定义),则结果设为 "地址失败"(0004h/0084h)。读数据无效。
    • 如果 Address 值 + Block Count 值大于目标 RPMB 区域大小,则结果设为 "地址失败"(0004h/0084h)。不从 RPMB 数据区读数据。

    地址检查通过后,设备从响应类型、Nonce、地址、数据和结果计算 MAC。如果 MAC 计算失败,则返回结果为 "认证失败"(0002h/0082h)。

    如果 SECURITY PROTOCOL OUT 命令以 GOOD 状态完成,数据可以通过发送 SECURITY PROTOCOL IN 命令检索:

    • 发起设备发送 SECURITY PROTOCOL IN 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域。
    • 设备返回 RPMB 消息,包含响应消息类型 = 0400h、块计数、请求中收到的 Nonce 的副本、认证数据读请求中收到的地址、数据、MAC 和 Result。

    在 Block Count 大于一的认证数据读响应中:

    • MAC 只包含在最后一个 RPMB 消息数据帧中。 所有前一个数据帧中的 MAC 字段为零。
    • 在每个数据帧中,Nonce 包含收到的 Nonce 的副本,地址是完整访问的起始地址(不是单个逻辑块的地址),块计数是总块数(不是序列编号)。

    认证数据读操作完成后,设备应响应 SECURITY PROTOCOL IN 命令返回 GOOD 状态,无论认证数据读是否成功。

    如果从设备内寻址位置取数据失败,则返回结果为 "读失败"(0006h/0086h)。如果读过程中发生其他错误,则返回结果为 "一般失败"(0001h/0081h)。

    12.4.6.7 Authenticated Secure Write Protect Configuration Block Write认证安全写保护配置块写
    • 认证安全写保护配置块写操作仅由 RPMB 区域 0 支持。 如果认证安全写保护配置块写操作发送到 RPMB 区域 0 以外的 RPMB 区域,则返回结果为 "一般失败"(0001h/0081h)。

    认证安全写保护配置块写序列通过 SECURITY PROTOCOL OUT 命令发起:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域 0。
    • 如果 INC_512 位和 TRANSFER LENGTH 字段未分别设为零和 512,则命令应以 CHECK CONDITION 状态终止,感知键设为 ILLEGAL REQUEST,额外感知码设为 "CDB 中的无效字段"。
    • SECURITY PROTOCOL OUT 命令交付单个 RPMB 消息数据帧,其中数据字段包含安全写保护配置块。安全写保护配置块特定于数据帧中 LUN 字段指示的逻辑单元(228 字节)。
    • RPMB 数据帧的其他字段按以下设置:请求消息类型 = 0006h、Result = 0000h、块计数 = 0001h、地址 = 0000h、写计数器 = 当前计数器值、Nonce = 00…0h、MAC 见 12.4.4.2。
    • 设备收到 RPMB 消息数据帧后:检查写计数器是否过期。 如果写计数器已过期,则设备将结果设为 "写失败,写计数器过期"(0085h)。安全写保护配置块不更新。
    • 验证 MAC。 如果写计数器未过期,则设备计算请求类型、块计数、写计数器、地址和数据的 MAC,并与请求中的 MAC 比较。如果两个 MAC 不同,则设备将结果设为 "认证失败"(0002h)。安全写保护配置块不更新。
    • 验证写计数器。 如果请求中的 MAC 和设备计算的 MAC 相等,则设备比较请求中的写计数器和设备中存储的写计数器。如果两个计数器不同,则设备将结果设为 "计数器失败"(0003h)。安全写保护配置块不更新。
    • 认证通过。 如果 MAC 和写计数器比较都成功,则写请求被认为已认证。
    • 检查 LUN 的写保护模式。 如果 LUN 字段指示的逻辑单元 bLUWriteProtect 设为非零值,则设备将结果设为 "安全写保护不适用"(000Ah)。安全写保护配置块不更新。
    • 如果以下一个或多个条件发生,设备将结果设为 "无效安全写保护块配置参数"(0009h),且不更新安全写保护配置块:
      • LUN 无效:大于 bMaxNumberLU 指定的值,或逻辑单元未使能(bLUEnable=00h)。
      • DATA LENGTH 设为非以下值之一:0, 16, 32, 48, 64。
      • 安全写保护条目中的逻辑块地址超出逻辑单元容量。
      • 安全写保护条目中的逻辑块地址 + 逻辑块数量超出逻辑单元容量。
      • 两个或更多安全写保护条目指定重叠区域。
      • 本次请求后,整个设备的安全写保护区域数量增加到超过 bNumSecureWPArea 指示的值。
    • 如果写过程中发生其他错误,则返回结果为 "安全写保护配置块访问失败"(0008h)。安全写保护配置块不更新。
    • 如果未发生错误,则安全写保护配置块更新,覆盖先前的配置,写计数器加一。
    • 设备可以响应 SECURITY PROTOCOL OUT 命令返回 GOOD 状态,无论认证安全写保护配置块写是否成功。
    • 数据编程成功与否可以通过检索 RPMB 的结果寄存器来检查。

    验证过程通过发出 SECURITY PROTOCOL OUT 命令开始:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域 0。RPMB 数据帧包含请求消息类型 = 0005h(结果读请求)。注意,任何发起设备的任何请求(结果读请求除外)都会覆盖 RPMB 区域的结果寄存器。
    • 设备在操作结果准备好检索时返回 "GOOD" 状态。

    发起设备通过发出 SECURITY PROTOCOL IN 命令检索操作结果:

    • SECURITY PROTOCOL 字段设为 ECh,SECURITY PROTOCOL SPECIFIC 字段指示 RPMB 区域

    设备返回 RPMB 数据帧,包含响应消息类型 = 0600h、递增的计数器值、MAC 和认证安全写保护配置块写操作的结果。

    12.4.6.8 Authenticated Secure Write Protect Configuration Block Read认证安全写保护配置块读

    认证安全写保护配置块读操作仅由 RPMB 区域 0 支持。 如果认证安全写保护配置块读操作发送到 RPMB 区域 0 以外的 RPMB 区域,则返回结果为 "一般失败"(0001h/0081h)。

    认证安全写保护配置块读序列通过 SECURITY PROTOCOL OUT 命令发起:

    • 发起设备发送 SECURITY PROTOCOL OUT 命令,SECURITY PROTOCOL 字段设为 ECh,并在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域 0。
    • 如果 INC_512 位和 TRANSFER LENGTH 字段未分别设为零和 512,则命令应以 CHECK CONDITION 状态终止,感知键设为 ILLEGAL REQUEST,额外感知码设为 "CDB 中的无效字段"。
    • SECURITY PROTOCOL OUT 命令交付单个 RPMB 消息数据帧,其中数据字段包含 LUN 值(数据帧字节 228)。将返回的安全写保护配置块特定于 LUN 字段指示的逻辑单元。
    • 主机交付给设备的 RPMB 数据帧包含:请求消息类型 = 0007h、块计数 = 0001h、地址 = 0000h、Data 和 Nonce。在此请求中,LUN 是数据字段中唯一相关的字节,所有其他字节应被视为保留,应被忽略。
    • 如果 LUN 字段无效,则设备将结果设为 "无效安全写保护块配置参数"(0009h/0089h)。LUN 无效是指大于 bMaxNumberLU 指定的值,或逻辑单元未使能(bLUEnable=00h)。
    • 如果 LUN 字段指示的逻辑单元 bLUWriteProtect 设为非零值,则设备将结果设为 "安全写保护不适用"(000Ah/008Ah)。
    • 成功获取安全写保护配置块后,设备从响应类型、Nonce、地址、数据和结果计算 MAC。如果 MAC 计算失败,则返回结果为 "认证失败"(0002h/0082h)。

    如果 SECURITY PROTOCOL OUT 命令以 GOOD 状态完成,则可以通过发送 SECURITY PROTOCOL IN 命令检索安全写保护配置块:

    • 发起设备发送 SECURITY PROTOCOL IN 命令,SECURITY PROTOCOL 字段设为 ECh,在 SECURITY PROTOCOL SPECIFIC 字段中指示 RPMB 区域 0,INC_512 位和 ALLOCATION LENGTH 字段指示 512 字节。

    设备返回 RPMB 数据帧,包含响应消息类型 = 0700h、块计数、请求中收到的 Nonce 的副本、数据字段中安全写保护配置块的内容、MAC 和 Result。

    如果从设备内寻址位置取数据失败或读过程中发生其他错误,则返回结果为 "安全写保护配置块访问失败"(0008h/0088h)。

    12.5 Malware Protection恶意软件保护

    UFS 设备还可以选择保护启动、总线配置设置和其他重要设备配置设置,一旦设置后就无法修改。这些参数保护的实现定义在参数定义所在的规范中。

    赞(0)
    未经允许不得转载:171主机测评 » UFS3.1协议中文学习讲解(12)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址