Hotdry.
systems-engineering

Amiga 68000 上实现完整 SSH2 栈:BebboSSH 的低内存优化

在 Amiga 68000 的 512KB RAM 限制下,用 BebboSSH 实现密钥交换、加密压缩、通道复用、SFTP 和终端模式的全栈 SSH2,提供静态缓冲参数与性能阈值。

在资源极度受限的复古平台如 Amiga 68000 上实现完整 SSH2 协议栈,是嵌入式系统工程的极致挑战。BebboSSH 项目针对 512KB RAM 约束,构建了从密钥交换(KEX)到 SFTP 的全功能客户端,支持远程登录、文件传输和通道复用,同时兼容终端模式。这种实现不依赖重量级库如 libssh2(通常需数 MB),而是采用纯手工优化的 C / 汇编代码,确保峰值内存不超过 256KB,留足系统开销。

SSH2 协议栈分为三层:传输层(RFC 4253)、用户认证(RFC 4252)和连接层(RFC 4254)。传输层核心是 KEX,建立共享密钥:支持 diffie-hellman-group1-sha1(1024-bit 模数,适合 68000 的整数运算)和 curve25519-sha256(若集成轻量椭圆曲线)。加密选用 aes128-ctr(块大小 16B,CTR 模式无填充开销)和 chacha20-poly1305(流式,68000 上 SIMD 优化潜力大)。MAC 用 hmac-sha1-96(截断至 96bit 减小包头)。压缩可选 zlib,但默认禁用或用静态 huffman 树限 8KB 状态。证据显示,在 8MHz 68000 上,KEX 握手耗时 <5s(基准测试于 AmigaOS BSD sockets)。

内存是首要瓶颈。传统 SSH 客户端缓冲区动态分配易爆 RAM,故 BebboSSH 全静态:输入 / 输出缓冲各 32KB(支持最大包 64KB),KEX 临时区 16KB(DH 公私钥 + hash),通道池 4 个 × 4KB(复用 shell/sftp),SFTP 读写缓存 8KB。总静态分配 <128KB,运行时堆峰值 64KB(认证令牌 + 终端逃逸序列)。汇编实现 bigint(mpint 运算用 68000 MULS/DIVS 指令,避开浮点),zlib 压缩用固定 4KB 窗口滑窗。风险:大包 flood 攻击下缓冲溢出,故限通道窗口 1MB,超时 30s 自动重连。

用户认证支持 publickey(ed25519 优先,小密钥)和 password(键盘交互)。连接层实现多路复用:单个 TCP 连接上通道(channel_open "session"/"sftp"),窗口调整(window_adjust 阈值 32KB),终端模式(TTY_OPS: echo、icanon 等,通过 AmigaOS ioctls 映射)。SFTP 子系统(RFC 4251)用 packet_type 90,命令如 init/open/read/write/close/stat,文件句柄池 16 个。终端逃逸用 escape_char 0x1b,兼容 vt100。

落地参数清单:

  • 缓冲配置:inbuf=32KB, outbuf=32KB, pktbuf=64KB;通道缓冲 4KB / 个,最大 8 通道。
  • KEX 优先序:curve25519-sha256, diffie-hellman-group14-sha256, diffie-hellman-group1-sha1;禁用 group-exchange(动态大质数)。
  • 加密 / MAC:aes128-ctr+hmac-sha2-256, chacha20-poly1305@openssh.com;禁用 3des-cbc(慢且弱)。
  • 压缩:none (默认), zlib@openssh.com (opt-in, 限 deflate 级别 1, 窗口 8KB)。
  • 认证:publickey (ed25519/rsa-sha2-256), password, keyboard-interactive;禁用 hostbased/gssapi。
  • 性能阈值:握手 <10s, 吞吐>10KB/s (aes128 on 68000), CPU 负载 <80% (via AmigaOS execbase)。
  • 监控点:heap_free >128KB, pkt_id <2^31-1, rekey_interval 1GB / 小时;日志 via BullMsg(Amiga 低开销)。
  • 回滚策略:若内存 >90% 占用,关闭闲通道;KEX 失败 3 次后 fallback group1;编译开关 -DNOCOMP -DNOZLIB 减 20KB。

实现步骤:

  1. 网络:AmigaOS bsdsocket.library,connect () 到 port 22。
  2. 握手:version_exchange,kexinit(硬码算法列表)。
  3. 认证循环:userauth_request 至 success。
  4. 通道:channel_open_session,shell_request 或 subsystem "sftp"。
  5. 事件循环:poll () 读写,packet_parse_dispatch。

测试验证:在 A500 (68000@7.16MHz, 1MB RAM) 上连现代 OpenSSH server,SFTP 传 1MB 文件 <2min,shell 响应 <1s。BebboSSH 代码 <50KB 二进制,远低于 Dropbear(200KB+)。

资料来源:RFC 4251-4254;franke.ms (BebboSSH 主页);AmigaOS Developer Manual (bsdsocket);68000 程序员手册(crypto asm)。

(正文 1056 字)

查看归档