错误处理 - ✅ 一、Authenticated Data Read(认证读取)概述 (第419页)
NVME2.0协议解读 1 min read

错误处理 - ✅ 一、Authenticated Data Read(认证读取)概述 (第419页)

Blog Author

我们现在来深入讲解 NVMe 2.0b 规范第 8.18.2.4 节的 Authenticated Data Read(认证数据读取)机制,这是 Replay Protected Memory Block(RPMB) 访问机制中用于安全读取数据的重要流程。

✅ 一、Authenticated Data Read(认证读取)概述

认证读取是指:主机通过验证机制,从控制器的 RPMB 区域中读取受保护的数据块

这类读取的安全性由以下机制保障:

  • 使用随机 Nonce(随机数) 防止重放
  • 控制器对读取返回数据进行 MAC 签名
  • 主机 验证 MAC 是否匹配,确保数据未被篡改

🔄 二、认证读取流程详解(3 步)

📌 步骤 1:主机发送 Security Send 请求读取

字段 含义
Request Type 0004h(表示发起读取)
Nonce 主机生成的随机数,用于后续响应验证
Address RPMB 中要读取的地址
Sector Count 需要读取的扇区数量(每扇区 512 字节)

控制器检查地址是否合法,如果地址错误,设置 Result = 0004h,不进行读取。


📌 步骤 2:主机接收完成确认

控制器收到请求后,即使读取失败,也会返回 Security Send 成功完成(表示请求“接收”成功,而非读取成功)。


📌 步骤 3:主机发送 Security Receive 获取数据 + MAC

控制器返回的 RPMB Data Frame 格式如下:

字段 描述
Response Type 0400h
Address 所请求读取的位置
Sector Count 实际返回的数据扇区数
Data 被读取的数据
Nonce 与步骤 1 中请求一致,用于关联
MAC 控制器使用 Authentication Key 签名的数据
Result 返回码(见下表)

🧾 三、常见认证读取返回码(来自 Figure 462)

描述
0000h 成功 ✅
0001h 一般错误
0004h 地址非法(超范围、未对齐)
0006h 数据读取失败

📌 四、主机的验证逻辑(务必执行)

主机完成读取后不能直接信任数据,必须完成如下验证:

  1. 验证 Nonce:
  2. 返回帧中的 Nonce 必须与请求帧中的一致
  3. 若不同 → 被篡改或非预期响应

  4. 验证 MAC:

  5. 主机根据已知 Authentication Key + 请求信息 + 返回数据 重新计算 MAC
  6. 和控制器返回的 MAC 进行对比
  7. 若不同 → 数据可能遭受中间人攻击或篡改

✅ 五、典型读取示意图(Figure 468)

Step 1: Security Send (Request)
  - Request Type: 0004h
  - Address = 0x0000
  - Sector Count = 0x0001
  - Nonce = HostGeneratedNonce


Step 2: Security Receive (Response)
  - Response Type: 0400h
  - Address = 0x0000
  - Sector Count = 0x0001
  - Data = [512 Bytes]
  - Nonce = HostGeneratedNonce
  - MAC = HMAC_SHA256(...)
  - Result = 0000h

🧠 六、小结

关键点 内容
是否“认证”读取 是,必须验证返回的 MAC
是否加密 ❌ 否,仅使用 MAC 做完整性和身份校验
主要防护目标 中间人攻击、数据篡改、伪造响应、数据重放
是否可并行读取 ✅ 支持多目标(RPMB Target)并发操作,每个 Target 独立

如你需要,我可以进一步总结:

  • 🔐 MAC 的具体计算流程
  • 🔄 完整的 RPMB 认证读写流程图
  • 📦 如何封装 Security Send / Receive 命令(含帧结构与填充规则)

你想继续往哪个方向深入?我可以结合你的开发或分析目标定制解读。