fix(ssh): correct signature to sign Exchange Hash instead of shared_secret
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled

SSH签名修复完成(RFC 4253 Section 7.2):

问题:
- 之前直接签名shared_secret(错误)
- SSH协议要求签名Exchange Hash H

修复内容:
1. kex_exchange.rs:添加compute_exchange_hash函数
   - 计算H = SHA256(V_C || V_S || I_C || I_S || K_S || K_C || K_S || K)
   - 签名H而不是shared_secret

2. kex_exchange.rs:修改handle_kexdh_init函数
   - 添加client_version, server_version, kexinit_payloads参数
   - 传递所有Exchange Hash所需参数

3. server.rs:修改调用点
   - 传递KexState中的版本和KEXINIT payloads

测试结果:
-  SSH版本交换成功(SSH-2.0-MarkBaseSSH_1.0)
-  SSH_MSG_KEXINIT交换成功(curve25519-sha256)
-  签名验证通过(无incorrect signature错误)
-  SSH_MSG_NEWKEYS交换成功(加密通道建立)
-  加密packet MAC验证失败(cipher.rs AES-CTR待实现)

技术亮点:
-  符合RFC 4253标准
-  参考OpenSSH kex.c实现
-  完整Exchange Hash计算(SSH string + mpint格式)

下一步:
- 实现cipher.rs的AES-256-CTR加密功能
- 完成加密packet的MAC计算
- 测试完整SSH连接流程
This commit is contained in:
Warren
2026-06-13 18:25:50 +08:00
parent a9098a3c48
commit 66f38698f5
2 changed files with 101 additions and 33 deletions

View File

@@ -148,7 +148,13 @@ fn perform_complete_kex_exchange(
info!("Received SSH_MSG_KEX_ECDH_INIT");
// 4. 处理KEXDH_INIT并生成KEXDH_REPLY
let kexdh_reply = kex_state.exchange_handler.handle_kexdh_init(&kexdh_init)?;
let kexdh_reply = kex_state.exchange_handler.handle_kexdh_init(
&kexdh_init,
&kex_state.client_version,
&kex_state.server_version,
&kex_state.client_kexinit_payload,
&kex_state.server_kexinit_payload,
)?;
kexdh_reply.write(stream)?;
info!("Sent SSH_MSG_KEX_ECDH_REPLY");