持久内存与安全机制 - 第396页
我们继续深入讲解 NVMe 2.0b 规范第 8.13.5.5 节 中 控制器对主机认证成功后的回复机制,也就是:
✅ DH-HMAC-CHAP_Success1 消息解析与响应机制
该消息由 控制器发送给主机,表示对主机的认证已通过,并可能包含 对主机提出挑战 C2 的响应值 R2,实现双向认证。
🔹1. 消息格式简要(Figure 450)
| 字节范围 | 字段名 | 说明 |
|---|---|---|
| 0 | AUTH_TYPE = 01h |
使用 DH-HMAC-CHAP 协议 |
| 1 | AUTH_ID = 03h |
代表这是 Success1 消息 |
| 2–3 | Reserved | |
| 4–5 | T_ID |
事务 ID,与之前一致 |
| 6 | HL |
哈希长度,需与选定的哈希函数一致(如 SHA-256 是 32) |
| 7 | Reserved | |
| 8 | RVALID |
响应值是否有效(是否包含 R2) |
| 9–15 | Reserved | |
| 16+ | RVAL |
若 RVALID = 01h,则是控制器对主机挑战 C2 的响应 R2 |
🔸2. 字段说明及作用
📌 RVALID – 响应是否有效
| 值 | 含义 |
|---|---|
00h |
控制器未进行认证(主机未请求) |
01h |
控制器进行了认证(主机请求了双向认证) |
📌 RVAL – 控制器计算出的回应值(对 C2)
若主机在 Reply 阶段发起了挑战(CVALID = 01h),控制器将用以下方式计算 R2:
▶️ 计算过程:
// Augmented Challenge
Ca2 = (DHgID == 00h) ? C2 : HMAC(H((gy mod p)^x mod p), C2)
// Response
R2 = HMAC(Kc, Ca2 || S2 || T_ID || SC_C || "Controller" || NQNc || 00h || NQNh)
gy mod p:主机发来的 DH 指数x:控制器生成的 DH 随机数Kc:控制器所持的共享密钥SC_C:是否启用安全信道的标志"Controller":ASCII 字符串用于身份标识NQNc / NQNh:控制器和主机的 NVMe Qualified Name
🔸3. 主机接收控制器的认证成功消息后,应该:
✅ 验证以下内容:
| 检查项 | 错误处理方式 |
|---|---|
HL 是否与协商一致 |
发 AUTH_Failure2, 解释为 Incorrect payload,断开连接 |
RVALID = 01h 时:R2 是否验证成功 |
发 AUTH_Failure2, 解释为 Authentication failed,断开连接 |
🔹4. 如果验证成功,主机发 Success2 完成双向认证
如果主机请求了双向认证且 R2 验证成功,则主机需要继续发送 DH-HMAC-CHAP_Success2 消息。
✅ 总结流程图(双向认证路径)
主机 控制器
┃ ┃
┃ --AUTH_Negotiate--> ┃ (协商认证协议)
┃ <-- Challenge ------┃ (发送 S1, C1, g^x mod p)
┃ -- Reply ---------->┃ (发送 S2, R1, C2, g^y mod p)
┃ <-- Success1 -------┃ (认证 R1 成功,附带 R2)
┃ -- Success2 ------->┃ (认证 R2 成功,完成双向认证)
✅ 认证完成后,后续可以:
- 正常收发 Fabrics、Admin、IO 命令
- 利用 DH 会话密钥
KS建立 安全信道(TLS) - 实现 端到端认证、加密与完整性保护
如果你需要,我可以继续为你解释下一节:Success2 消息格式(8.13.5.6),或为整个 DH-HMAC-CHAP 认证做一个中文总结版图解。你想继续看哪一部分?