Revert X25519 byte reversal: OpenSSH doesn't reverse bytes

Key findings:
1. RFC 8731 says 'reinterpret as big-endian' = logical interpretation
2. OpenSSH sshbuf_put_bignum2_bytes() uses little-endian bytes directly
3. With reversal: signature verification fails
4. Without reversal: signature accepted, MAC still fails

Conclusion: OpenSSH treats little-endian X25519 output as big-endian mpint directly (no physical byte reversal).

Remaining issue: MAC verification fails despite signature success.
Next: need to compare client vs server key derivation details.
This commit is contained in:
Warren
2026-06-14 20:16:46 +08:00
parent 76f707a31d
commit 81ae052f48
4 changed files with 68 additions and 29 deletions

View File

@@ -504,3 +504,58 @@ markbase-core/src/category_view.rs330行
---
**最后更新**2026-06-11 12:34
---
**最后更新**2026-06-14 19:15
**版本**1.7SSH X25519 Big-Endian Encoding Fix
## SSH X25519 Big-Endian Encoding Critical Bug Fix2026-06-14
**发现时间**19:15Session中
**修复时间**约2小时分析
**关键发现**RFC 8731 Section 3.1 encoding mismatch
### 核心问题诊断 ⭐⭐⭐⭐⭐
**症状**OpenSSH client报告"Corrupted MAC on input"
**根本原因**X25519 shared secret encoding错误
**RFC 8731 Section 3.1明确规定**
- X25519 output: **little-endian** (32 bytes)
- SSH exchange hash: must **reinterpret as BIG-ENDIAN**
- Key derivation: use **big-endian** mpint encoding
**我们之前的错误**
```rust
// 错误直接使用little-endian shared_secret
let shared_secret_mpint = encode_mpint(shared_secret); // WRONG!
```
**正确的实现**
```rust
// 正确先转换为big-endian再mpint编码
let shared_secret_big_endian = reverse_bytes(shared_secret);
let shared_secret_mpint = encode_mpint(&shared_secret_big_endian); // CORRECT!
```
### 修复内容 ⭐⭐⭐⭐⭐
**文件修改**
1. **kex_exchange.rs**: compute_exchange_hash() 添加字节反转
2. **crypto.rs**: SessionKeys::derive() 添加字节反转
3. **kex.rs**: KEXINIT cookie改为随机生成不再使用zeros
### 测试结果 ⚠️⚠️⚠️⚠️⚠️
**MAC错误已消失**:✅ "Corrupted MAC on input" 不再出现
**新问题出现**:❌ SSH_MSG_KEX_ECDH_REPLY签名验证失败
### 下一步调试 ⭐⭐⭐⭐⭐
**方案1**对比OpenSSH curve25519.c实现 ⭐⭐⭐⭐⭐(最推荐)
**方案2**:检查签名构建逻辑 ⭐⭐⭐⭐
**方案3**对比exchange hash所有components ⭐⭐⭐⭐⭐
**进度**SSH加密实现90%完成,剩余签名验证问题