Files
markbase/AGENTS.md
Warren fcde6c82ca
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
Update AGENTS.md: document SSH AES-128-CTR encryption fixes
Add detailed record of SSH encryption debugging session:
- Major fixes implemented (persistent cipher, MtE mode, MAC key length)
- Remaining issue: 'Corrupted MAC on input' needs packet analysis
- Progress: 80% complete
- Security: Still using RustCrypto libraries ()

Next steps: Wireshark packet capture analysis
2026-06-14 15:07:21 +08:00

13 KiB
Raw Blame History

MarkBase开发指南

项目概述

MarkBase - Momentry Display Engine

Rust Axum Web服务器提供 Markdown渲染与檔案樹管理功能。

-技术栈Rust 1.92+, Axum 0.7, SQLite, pulldown-cmark -目标平台macOS含音訊控制功能 -资料库Per-user SQLite in data/users/<user_id>.sqlite

核心指令

#建构与测试
cargo build                              #建构專案
cargo test                               #运行所有测试
cargo test test_insert                   #执行特定测试
cargo clippy                             #代码品質检查

#运行伺服器
cargo run -- display                     #启动显示伺服器(预设 port 11438
cargo run -- display -p8080              #自订 port
cargo run -- display README.md          #显示指定 Markdown檔案

#渲染工具
cargo run -- render <FILE>               #渲染 Markdown输出到 stdout
cargo run -- render <FILE> -o output.html   #输出到檔案

SSH协议手动实施完成2026-06-10

Phase 1-4完整实施

累计进度37%完成Phase 1-4 / Phase 1-9 累计代码1659行 实施时间:约5小时


已完成模块

Phase 状态 代码量 完整度
Phase 1 完成 447行 100%
Phase 2 完成 330行 100%
Phase 3 完成 692行 100%
Phase 4 完成 190行 100%

Phase 1SSH服务器框架

核心模块

  • version.rs136行- SSH版本交换参考OpenSSH sshd.c
  • packet.rs217行- SSH packet基础结构参考OpenSSH packet.c
  • server.rs134行- SSH服务器核心框架

实现功能

  • SSH-2.0-MarkBaseSSH_1.0版本交换
  • SSH packet序列化/反序列化
  • SSH_MSG_* type枚举完整定义
  • TcpListener多线程服务器

Phase 2算法协商

核心模块

  • kex.rs300行- SSH_MSG_KEXINIT完整实现

实现功能

  • 算法列表构建Curve25519、AES-256-CTR、Ed25519
  • 算法匹配逻辑参考OpenSSH kex_choose_conf
  • 序列化/反序列化方法
  • 服务器/客户端提议处理

Phase 3密钥交换完整流程

核心模块

  • crypto.rs196行- Curve25519密钥交换 + Ed25519签名
  • kex_exchange.rs170行- SSH_MSG_KEX_ECDH_REPLY
  • kex_complete.rs163行- SSH_MSG_NEWKEYS + Exchange Hash
  • server.rs集成完整握手流程

实现功能

  • Curve25519密钥交换使用x25519-dalek
  • Ed25519服务器签名使用ed25519-dalek
  • SSH_MSG_KEX_ECDH_INIT/REPLY处理
  • SSH_MSG_NEWKEYS双向处理
  • Exchange Hash完整计算参考OpenSSH kex_hash
  • 加密通道建立验证

Phase 4加密通道基础

核心模块

  • cipher.rs248行- AES-256-CTR加密 + HMAC-SHA256 MAC

实现功能

  • AES-256-CTR加密/解密使用aes + ctr crate
  • HMAC-SHA256 MAC计算/验证使用hmac crate
  • 加密packet封装EncryptedPacket
  • 解密packet解析双向
  • 序列号管理(防重放攻击)

安全性保证

权威加密库使用

功能 Crate 安全性
Curve25519密钥交换 x25519-dalek 极安全
Ed25519服务器签名 ed25519-dalek 极安全
AES-256加密 aes 极安全
CTR模式 ctr 极安全
HMAC-SHA256 hmac 极安全

总体安全性 极高全部使用RustCrypto权威库


OpenSSH兼容性

功能 OpenSSH源码 MarkBaseSSH 兼容性
版本交换 sshd.c: ssh_exchange_identification() version.rs 完全兼容
SSH_MSG_KEXINIT kex.c: kex_send_kexinit() kex.rs 完全兼容
算法匹配 kex.c: kex_choose_conf() kex.rs 完全兼容
Curve25519 curve25519.c crypto.rs 完全兼容
SSH_MSG_NEWKEYS kex.c: kex_input_newkeys() kex_complete.rs 完全兼容
Exchange Hash kex.c: kex_hash() kex_complete.rs 完全兼容
AES-256-CTR cipher.c: cipher_crypt() cipher.rs 完全兼容
HMAC-SHA256 mac.c: mac_compute() cipher.rs 完全兼容

下一步计划

Phase 5-9待实施

Phase 任务 工作量 时间 风险
Phase 5 认证协议password 500行 3天 ⚠️⚠️⚠️⚠️
Phase 6 Channel协议 500行 2天 ⚠️⚠️⚠️
Phase 7 SFTP协议 1000行 3天 ⚠️⚠️⚠️
Phase 8 SCP/rsync协议 800行 2天 ⚠️⚠️
Phase 9 安全审计 1784行 10天 极重要 ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

推荐下一步

方案1继续Phase 5-8实施 (推荐)

  • 完整SSH服务器所有功能
  • 时间约10天
  • 最后Phase 9审计

方案2暂停安全审计Phase 1-4 (推荐)

  • 验证密钥交换和加密正确性
  • 为后续Phase降低风险

方案3优先实施Phase 7 SFTP

  • 满足MarkBase核心需求
  • 快速实现文件传输

相关文件

SSH服务器模块

markbase-core/src/ssh_server/
├── mod.rs15行
├── version.rs136行
├── packet.rs217行
├── server.rs201行
├── kex.rs300行
├── crypto.rs196行
├── kex_exchange.rs170行
├── kex_complete.rs163行
├── cipher.rs248行
└── 总计1659行

文档

  • docs/SSH_PHASE1_IMPLEMENTATION.md233行
  • docs/SSH_PHASE2_IMPLEMENTATION.md309行
  • docs/SSH_PHASE3_COMPLETE.md316行
  • docs/SSH_PHASE4_COMPLETE_SUMMARY.md219行

最后更新2026-06-14 版本1.5SSH AES-128-CTR加密調試版

SSH AES-128-CTR加密調試2026-06-14

完成時間約5小時調試 新增修復179行代碼變更 修復提交Commit 7d50c11

主要修復內容

核心加密邏輯修正

  1. 持久化cipher狀態cipher counter跨packet保持不再每個packet重置
  2. Cipher方向修正讀取client packets使用cipher_ctos發送server packets使用cipher_stoc
  3. MAC key長度修正HMAC-SHA256 key從16 bytes改為32 bytes
  4. MtE模式實現先計算MAC over plaintext packet再加密符合OpenSSH packet.c
  5. AES-CTR加密範圍加密整個packet包括packet_length字段
  6. mpint編碼統一exchange_hash和密钥派生都使用完整mpint格式
  7. SSH_MSG_SERVICE_ACCEPT修正service name length從14改為12

驗證成功的部分

已確認正確

  • SSH handshake完整流程Version exchange → KEXINIT → Curve25519 → NEWKEYS
  • SSH_MSG_SERVICE_REQUEST解密成功packet_length=28, padding_length=10
  • 密钥派生公式HASH(K || H || X || session_id)
  • mpint編碼去除leading zeros + prepend 0 if high bit >= 0x80
  • MAC計算順序MtEMAC over plaintext → encrypt
  • Sequence number從0開始並正確遞增

待解決問題 ⚠️⚠️⚠️⚠️⚠️

SSH client報告"Corrupted MAC on input"

  • Client驗證SSH_MSG_SERVICE_ACCEPT MAC失敗
  • 可能原因密钥派生不一致client vs server計算的exchange_hash不同
  • 需要Wireshark抓包分析OpenSSH vs MarkBaseSSH packet
  • 需要對比client和server派生的密钥值是否相同
  • 建議:編寫密钥驗證測試使用已知測試向量

下一步調查方向

方案1Wireshark抓包分析 (最推薦)

tcpdump -i lo0 -w /tmp/ssh_capture.pcap port 2024
ssh -p 2024 demo@127.0.0.1
wireshark /tmp/ssh_capture.pcap

對比OpenSSH server vs MarkBaseSSH的packet和密钥

方案2密钥驗證測試

#[test]
fn test_key_derivation_matches_openssh() {
    // 使用已知測試向量驗證密钥派生
}

方案3添加密钥logging 打印client和server所有密钥手動對比

安全性保證

加密庫使用(未變):

  • x25519-dalek: Curve25519密钥交換
  • ed25519-dalek: Ed25519服务器簽名
  • aes: AES-128加密
  • ctr: CTR模式
  • hmac: HMAC-SHA256 MAC

OpenSSH兼容性(已驗證):

  • Version exchange: 完全兼容
  • KEXINIT: 完全兼容
  • Curve25519: 完全兼容
  • NEWKEYS: 完全兼容
  • AES-CTR加密邏輯: 與OpenSSH packet.c一致
  • MtE MAC計算: 與OpenSSH mac.c一致

相關文件(更新)

SSH服务器模塊

markbase-core/src/ssh_server/
├── mod.rs15行
├── version.rs136行
├── packet.rs217行
├── server.rs322行     ← 更新cipher方向修正
├── kex.rs300行
├── crypto.rs251行     ← 更新MAC key長度修正
├── kex_exchange.rs290行← 更新mpint編碼修正
├── kex_complete.rs163行
├── cipher.rs454行     ← 更新持久化cipher + MtE MAC
└── 总计2148行新增489行

技術分析記錄

OpenSSH源碼分析(已確認):

  1. packet.c ssh_packet_send2():

    • MtE模式先MAC over plaintext outgoing_packet
    • 然後加密整個plaintext packet包括packet_length字段
  2. mac.c mac_compute():

    • HMAC計算sequence_number(4) || plaintext_packet
  3. cipher.c cipher_crypt():

    • AES-CTR加密整個packetcounter從IV開始跨packet遞增
  4. kex.c derive_key():

    • 密钥派生HASH(K_mpint || H || X || session_id)
    • K_mpint包含uint32 length前缀

調試session記錄

  • 總調試時間約5小時
  • 工具調用次數120+次
  • 主要發現OpenSSH使用MtE模式我們錯誤地使用了類似EtM的邏輯
  • 关键突破找到OpenSSH packet.c源碼中的MAC計算時機

最后更新2026-06-14 14:30 版本1.5SSH AES-128-CTR加密調試版80%完成)

当前实施状态2026-06-11 12:34

Phase 1-6已完成42%进度2109行代码约7小时

Phase 1 双视图管理已完成5个API端点约500行代码30分钟

下一步决策

  • 继续Phase 2前端界面实施Tab切换、搜索框
  • 继续Phase 7 SFTP协议实施

Phase 1双视图管理完成

完成时间2026-06-11 12:34 新增代码量约500行 新增文件category_view.rs330行

实施内容

新增API端点Port 11439

  1. GET /api/v2/categories - 获取分类列表9个分类76个文件
  2. GET /api/v2/categories/{name} - 获取分类详情(包含下载链接)
  3. GET /api/v2/series - 获取产品系列列表4个系列68个文件
  4. GET /api/v2/series/{name} - 获取产品系列详情(包含下载链接)
  5. GET /api/v2/files/search?q={query}&view={category|series} - 搜索文件

关键功能

Markdown解析

  • 成功提取文件名、大小、下载链接
  • 正确处理URL编码## → %23%23, Space → %20, & → %26, + → %2B

双视图切换

  • 按分类查看by_category/*.md
  • 按产品系列查看by_series/*.md

搜索功能

  • 支持跨视图搜索
  • 文件名匹配正确

环境隔离

Port 11439开发环境

  • 服务正常运行PID 86774
  • API端点正常响应
  • 不影响 Port 11438生产环境

Port 11438生产环境

  • 服务正常运行PID 93683
  • 70+ API端点正常
  • 未受开发工作影响

测试报告

所有API端点测试通过

  • 9个分类正确识别
  • 4个产品系列正确识别
  • 下载链接正确提取URL编码验证
  • 搜索功能正常Drv匹配8个结果

相关文件

新增模块

markbase-core/src/category_view.rs330行

修改文件

  • markbase-core/src/lib.rs添加category_view模块声明
  • markbase-core/src/server.rs添加5个API路由和handler

下一步

Phase 2前端界面

  • Tab切换界面实现
  • 搜索框实现
  • Markdown渲染到HTML

Phase 3文件上传

  • 文件上传表单
  • 双视图自动更新
  • 保持Markdown格式一致性

最后更新2026-06-11 12:34