错误处理 - ✅ 什么是 Authenticated Data Write(认证写入)? (第417页)
我们继续深入分析 NVMe 2.0b 规范第 8.18.2.3 节:Authenticated Data Write(认证写入)操作流程,这是一项非常关键的安全机制,在 Replay Protected Memory Block(RPMB) 中保障数据写入的 防重放、防篡改与写计数完整性验证。
✅ 什么是 Authenticated Data Write(认证写入)?
这是指主机发起一笔 带 MAC 验证 + 写计数器保护 的写请求,目标是写入 RPMB 中的安全数据区域。写入前控制器会严格校验:
- 写计数器(Write Counter)是否过期/匹配
- 地址是否合法
- MAC 签名是否正确
只有全部验证通过,才会将数据写入,并将写计数器加一。
📌 写入操作完整流程
🔹Step 1:主机通过 Security Send 发送数据帧(Request Type = 0003h)
| 字段 | 说明 |
|---|---|
Write Counter |
当前有效写计数器值(通过上一步读取获得) |
Address |
要写入的扇区起始地址 |
Sector Count |
要写入的扇区数(1 扇区 = 512 字节) |
Data |
真实要写入的数据内容(M 字节) |
MAC |
使用认证密钥 + 数据帧关键字段计算出的 HMAC(HMAC-SHA256) |
Request/Response |
0003h,表示请求执行“认证写入” |
🔹Step 2:控制器验证请求合法性(控制器内部执行的逻辑)
控制器执行以下校验:
| 校验项 | 条件 | 失败返回码 |
|---|---|---|
🔑 写计数器是否已达到 FFFFFFFFh |
若已满,则写失败 | 0005h |
| 📍 地址是否合法(范围、对齐) | 若越界或未对齐 | 0004h |
| 🧾 MAC 签名是否正确 | 比较请求中 MAC 与计算结果是否一致 | 0002h |
| 🔁 写计数器是否匹配 | 若请求中 Write Counter ≠ 当前值 |
0003h |
✅ 全部通过后:
- 写入 Data 到指定地址
- 自动将写计数器 +1
- 返回成功(
Result = 0000h)
🔹Step 3:主机请求结果(Result Read)
主机随后发出一个:
Security Send(Request Type =0005h) 请求读取结果- 然后发出
Security Receive得到结果帧(Response Type =0300h)
该结果帧中含有:
| 字段 | 含义 |
|---|---|
Result |
操作状态码,如 00h 成功,03h 计数器失败 |
Write Counter |
写入后的最新值(如果写入成功) |
MAC |
返回帧签名,用于主机验证响应真实性 |
💡 MAC 是如何计算的?
控制器与主机都使用:
MAC = HMAC_SHA256(AuthKey, concat([223:255] + Data))
其中 [223:255] 包含重要控制字段:
- RPMB Target
- Nonce
- Write Counter
- Address
- Sector Count
- Result
- Request/Response
这确保了即使数据或地址有一处被篡改,MAC 都会不匹配,从而防止攻击者伪造或重放。
🧠 总结:认证写入全过程核心逻辑
sequenceDiagram
participant Host
participant Controller
Host->>Controller: Security Send (Request `0003h` + Data + Write Counter + MAC)
Controller->>Controller: 检查 Write Counter 是否溢出
Controller->>Controller: 检查地址合法性
Controller->>Controller: 校验 MAC
Controller->>Controller: 校验写计数器匹配
alt 所有验证通过
Controller->>Controller: 写入 Data
Controller->>Controller: Write Counter++
Controller->>Host: 结果 = 0000h(成功)
else 任何一步失败
Controller->>Host: 返回对应失败码(如 `0002h`, `0003h`, `0004h`, `0005h`)
end
🧩 可选扩展:
- 提供 Python 示例:如何构造认证写入请求帧(含 MAC)
- 制作
认证写入验证逻辑图与错误码速查表 - 帮你梳理 认证读操作(8.18.2.4) 与整个 RPMB 防篡改信任链机制
你想我继续接着分析下一节:8.18.2.4 Authenticated Data Read(认证读取) 吗?还是将整个 RPMB 总结为一页结构图与安全流程笔记?