错误处理 - ✅ 什么是 Authenticated Data Write(认证写入)? (第417页)
NVME2.0协议解读 1 min read

错误处理 - ✅ 什么是 Authenticated Data Write(认证写入)? (第417页)

Blog Author

我们继续深入分析 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 总结为一页结构图与安全流程笔记?