[元带你学: eMMC协议详解 16] eMMC 安全方案 之 设备锁定(Lock) / 解锁(Unlock) 详解

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

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

内容摘要

全文 4100 字, 内容摘要

1. 锁定与解锁的概念?

2. 设置密码的方法和注意点?

3. 重置密码的方法和注意点?

4. 锁定设备和解锁设备的方法?

5. 强制擦除是怎么做到的?


前言


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

机密性意味着应该保密的信息只能被授权的实体阅读和理解。其他未经访问授权不能阅读或理解机密信息。
完整性是指能够确保信息不受未经授权的更改、修改或删除的能力。信息的完整性包括信息的来源、完整性和正确性(使用标识和身份验证等方法)。
可用性意味着信息始终可供授权用户使用

eMMC安全方案有哪些呢? eMMC设备包含多种数据保护和安全功能,包括:写保护、密码锁定/解锁和RPMB。

 本讲将专注于讨论设备锁定(Lock) / 解锁(Unlock) 。

1. 概念


密码锁定功能旨在保护用户区域只有User Area才有密码锁定功能)内容的任何类型访问(读、写或擦除),主机仍然可以访问引导分区、RPMB和常规分区区域。密码锁定/解锁功能是使用CMD42设置的,启用密码锁定后,主机可以执行某些操作(包括重置、初始化、选择、查询状态等)但不能读、写、擦设备用户区域的任何数据。这种保护对于防止数据被盗很有用,但是它也限制了任何人(包括数据所有者)可以使用设备,因为不允许(任何类型)访问受保护的数据。

密码保护功能使主机能够通过提供密码来锁定设备,稍后将使用该密码解锁设备。密码及其大小分别保存在128位PWD和8位PWD_LEN寄存器中。这些寄存器是非易失性的,因此电源周期不会擦除它们。

通过在扩展CSD中设置永久密码禁用位(EXT_CSD字节[171]中的PERM_PSWD_DIS位),可以永久禁用密码保护功能。如果主机试图在设置了密码的e-MMC上,想永久禁用CMD42功能,操作将失败,并且ERROR (bit 19)错误位将由设备状态寄存器中的内存设备设置。如果不需要,建议在设备上禁用密码保护功能,以防止无意或恶意设置密码保护功能。在永久禁用密码的设备上尝试使用密码保护功能(CMD42)将失败,并且将在状态寄存器中设置LOCK_UNLOCK_FAILED (bit 24)错误位。

被锁定的设备响应(并执行)“基本”命令类(0类)和“锁定设备”命令类中的所有命令。因此,允许主机进行重置、初始化、选择、查询状态等操作,但不能访问设备上的数据。如果之前设置过密码(PWD_LEN的值不是0),设备上电后会自动锁定。

在v4.3及更高版本的设备上,Lock命令只能应用于用户数据区。因此,在向设备发出Lock命令后,主机仍然可以访问引导分区、RPMB和General分区区域。与现有的CSD和CID寄存器写命令类似,lock/unlock命令仅在“传输状态”下可用。这意味着它不包括地址参数,并且在使用它之前必须选择Device。设备锁/解锁命令(CMD42)具有普通单块写命令的结构和总线事务类型。传输的数据块包括命令所需的所有信息(密码设置模式、PWD本身、设备锁定/解锁等)。下表描述了命令数据块的结构。CMD42命令只能在设备工作在单数据速率模式下使用。在双数据速率模式下,CMD42是一个非法命令。

[元带你学: eMMC协议详解 16] eMMC 安全方案 之 设备锁定(Lock) / 解锁(Unlock) 详解_第1张图片

  • ERASE: '1'定义强制擦除操作(所有其他位都为'O'),只发送cmd字节。
  • LOCK/UNLOCK: '1'=锁定设备。'0'=解锁设备(请注意,将此位与SET_PWD一起设置是有效的,但不允许与CLR_PWD一起设置)。
  • CLR_PWD: 'I'=清除PWD。
  • SET_PWD: '1'=设置新密码为PWD
  • PWD_LEN:定义以下密码长度(以字节为单位)。密码的有效长度为1 ~ 16个字节。
  • Password dara:密码(新的或当前使用的,具体取决于命令)。

数据块大小由主机在发送设备锁/解锁命令之前定义。这将允许不同的密码大小。以下段落定义了各种锁/解锁命令序列。

2. 设置密码

(1) 选择设备(CMD7),如果之前没有选择的话。

(2) 定义块长度(CMD16),由8位设备锁定/解锁模式给出,8位密码大小(以字节为单位),以及新密码的字节数。

  • 如果进行了密码替换,则块大小应考虑新旧密码都随命令发送。

(3) 发送设备锁定/解锁命令(CMD42),在数据线上带合适的数据块大小,包括16位CRC。数据块应该显示模式(SET_PWD)、长度(PWD_LEN)和密码本身。

小贴士

  • 如果进行了密码替换,则长度值(PWD_LEN)应包括旧密码和新密码,并且PWD字段应包括旧密码(当前使用的)和新密码。新密码和旧密码的长度不能超过16字节。

  • 如果新密码长度超过16字节,则在状态寄存器中设置LOCK_UNLOCK_FAILED错误位,不修改旧密码。

  • 如果尝试将PWD_LEN设置为仅旧密码的长度来替换密码,则在状态寄存器中设置LOCK_UNLOCK_FAILED错误位,并且不更改旧密码。

  • 如果发送的旧密码不正确(大小和内容不相等),则在状态寄存器中设置LOCK_UNLOCK_FAILED错误位,旧密码不改变。

  • 如果PWD与发送的旧密码匹配,则给定的新密码及其大小将分别保存在PWD和PWD_LEN字段中。

  • 密码长度寄存器(PWD_LEN)表示当前是否设置了密码。当它等于'0'时,没有设置密码。如果PWD_LEN的值不等于零,设备上电后将自动锁定。通过设置lock /UNLOCK位(同时设置密码)或发送Device lock.d的附加命令,可以在当前上电周期内立即锁定设备.

3. 重置密码

(1) 选择设备(CMD7),如果之前没有选择的话

(2) 定义块长度(CMD16),由8位设备锁定/解锁模式给出,8位密码大小(以字节为单位),以及当前使用的密码的字节数。

(3) 发送设备锁定/解锁命令(CMD42),并在数据线上发送适当的数据块大小,包括16位CRC。数据块应该指示模式CLR_PWD,长度(PWD_LEN)和密码(PWD)本身(LOCK/UNLOCK位不关心)。

  • 如果PWD和PWD_LEN内容与发送的密码及其大小匹配,则清除PWD寄存器的内容并将PWD_LEN设置为0。
  • 如果密码不正确,则在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

4. 锁定设备

(1) 选择设备(CMD7),如果之前没有选择的话

(2) 定义块长度(CMD16),由8位设备锁定/解锁模式给出,8位密码大小(以字节为单位),以及当前使用的密码的字节数。

(3) 发送设备锁定/解锁命令(CMD42),并在数据线上发送适当的数据块大小,包括16位CRC。数据块应该显示模式LOCK,长度(PWD_LEN)和密码(PWD)本身。
 

(4) 如果PWD内容等于发送的密码,说明密码正确,则设备将被锁定,并且在状态寄存器中设置Device-locked状态位。如果密码不正确,则在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

注意: 设置密码和锁定设备的顺序可以相同。在这种情况下,主机应执行设置密码所需的所有步骤(如上所述),包括在发送新密码命令时设置位锁。如果之前设置过密码(PWD_LEN不是“0”),那么设备上电复位后会自动锁定。

如果试图锁定一个被锁定的设备,或者锁定一个没有密码的设备,将会失败,并且会在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

5. 解锁设备

步骤如下:

(1) 选择设备(CMD7),如果之前没有选择的话。

(2) 定义块长度(CMD16),由8位设备锁定/解锁模式给出,8位密码大小(以字节为单位),以及当前使用的密码的字节数。

(3) 发送设备锁定/解锁命令(CMD42),并在数据线上发送适当的数据块大小,包括16位CRC。数据块应该显示模式UNLOCK,长度(PWD_LEN)和密码(PWD)本身。

  • 如果PWD内容等于发送的密码,则设备将被解锁,并且状态寄存器中的设备锁定状态位将被清除。
  • 如果密码不正确,则在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

说明解锁只针对当前的上电周期内有效。只要PWD未清除,设备将在下次上电时自动锁定。永久解锁设备的唯一方法是清除密码。

对未锁定的设备进行解锁将回报失败,并且会在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

6. 强制删除

如果用户忘记了密码(PWD内容) ,怎么办???

则可以擦除所有设备数据内容以及PWD内容。此操作称为强制擦除。

具体步骤为

(1) 选择设备(CMD7),如果之前没有选择的话。

(2)定义块长度(CMD16)为1字节(8位设备锁定/解锁命令)。

(3)发送设备锁定/解锁命令(CMD42),并在数据线上发送相应的1字节数据块,包括16位CRC。数据块应该指示模式ERASE (ERASE位应该是唯一设置的位, 其他位千万别设置)。

如果ERASE位不是data字段中唯一的位,则在状态寄存器中设置LOCK_UNLOCK_FAILED错误位,并拒绝擦除请求。

如果该命令被接受,那么所有的设备内容将被擦除,包括PWD和PWD_LEN寄存器内容,锁定的设备将被解锁。此外,如果设备是临时写保护,它将不受保护(写使能),CSD中的临时写保护位和所有临时写保护组将被清除。

对于上电保护或永久写保护的写保护组,强制擦除命令将失败(Device保持锁定状态),并且在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

在未锁定的设备上强制擦除将失败,并且在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。

如果在永久写保护介质上发出强制擦除命令,该命令将失败(设备保持锁定),并且在状态寄存器中设置LOCK_UNLOCK_FAILED错误位。强制擦除会需要较多的时间。在v4.3及更高版本的设备上,当主机发出强制擦除时,只擦除存储在用户数据区(包括增强属性区)中的数据。强制擦除不适用于Boot, RPMB和General分区区域。


参考

[1] eMMC安全方案—RPMB(Replay Protected Memory Block)专门介绍写保护

免责声明

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

你可能感兴趣的:(安全,eMMC,嵌入式硬件,单片机,驱动开发)