创建 /tmp/yyssh互通/发送TERM信号 后,探针在 exec 成功后发送不要求应答的 signal TERM,并要求远端返回 exit-signal TERM。无 PTY 的 sleep 30 和 PTY 的 /bin/cat 已分别与豫言服务端完成此流程。
创建 /tmp/yyssh互通/发送INT信号 后改发 signal INT,并验证 exit-signal INT。无 PTY 与 PTY 路径均已通过;若两个标记同时存在,优先测试 INT。
创建 /tmp/yyssh互通/会话控制模式 后,探针在 exec 应答之后、通道数据或信号之前连续发送加密的 IGNORE、UNIMPLEMENTED、DEBUG,用于验证服务端在会话期间继续处理传输控制报文。
创建 /tmp/yyssh互通/会话全局请求模式 后,探针在 exec 应答后发送要求应答的未知全局请求,验证服务端返回 REQUEST_FAILURE,然后继续后续通道会话。
创建 /tmp/yyssh互通/会话全局无应答模式 后,探针发送 want_reply=false 的未知全局请求并直接继续通道会话;若两个全局请求标记都存在,以无应答模式为准。
客户端单步会话收包库还与豫言服务端的反向控制测试互通:服务端发送三类合法控制报文和不要求应答的未知全局请求后,客户端继续命令会话;服务端再发送要求应答的未知全局请求时,客户端回 REQUEST_FAILURE,双方仍正常退出。
创建 /tmp/yyssh互通/重换钥模式 后,客户端在 Ed25519 认证成功、开启 session 前主动发送加密 KEXINIT,与真实 OpenSSH 或豫言服务端完成第二轮 Curve25519/Ed25519 交换。客户端验证新主机签名,沿用首次 session_id 派钥,以旧钥发送和接收 NEWKEYS,再逐方向切换并完成后续会话。本机 OpenSSH sshd、豫言服务端的此路径,以及未启用此模式的默认路径均已通过。
创建 /tmp/yyssh互通/等待服务端重换钥 后,客户端在认证后等待服务端先发 KEXINIT,再回应自己的 KEXINIT 和曲线初报。豫言服务端主动重协商后的会话已通过;此模式优先于客户端主动模式。
创建 /tmp/yyssh互通/通道客户先发重换钥模式 后,客户端在 session 通道打开后、发送 env 和 exec 前先发 KEXINIT。新握手沿用首次 session_id,验证服务端主机签名并切换双向密钥;本模式要求等待期间没有提前到达的通道消息。临时 OpenSSH sshd 的先发模式与默认模式均已通过命令会话。
命令运行期间的收包循环会先处理重换钥前已认证并暂存的通道报文,再读取新密钥下的网络报文。创建 /tmp/yyssh互通/运行客户先发重换钥模式 后,探针在收到首段标准输出时由客户端先发一次 KEXINIT;另建 /tmp/yyssh互通/须有暂存报模式 可要求此次握手确实收到在途通道报文。此严格模式已与临时 OpenSSH sshd 完成 seq 1 1000:暂存非空,3,893 字节输出逐字一致。
客户端收包循环也按本轮任一方向的报文数自动发起重换钥,默认阈值 4096 包。创建 /tmp/yyssh互通/自动重换钥模式 后阈值降至 4 包,供互通测试。OpenSSH 服务端日志在一次 seq 1 1000 会话中记录首次握手及 15 次运行中重换钥,输出逐字一致;撤去低阈值标记后的短会话仅记录首次握手。
客户端收包循环还检查单调时钟,自本轮换钥起默认经过 3600 秒后发起下一轮;创建 /tmp/yyssh互通/计时重换钥模式 后改为 1 秒,并执行 sleep 2; seq 1 1000。单步收报返回未收齐状态后,它以最长 1 秒的就绪等待周期复查计时器,半包也不会阻塞至整帧到齐。再创建 /tmp/yyssh互通/须空闲换钥模式 可要求换钥发生在首段输出到达之前;与临时 OpenSSH sshd 的严格测试记录首次握手和两次空闲期间重换钥,3,893 字节输出逐字一致。小窗口收包在重换钥后收到有效输出时会恢复等待预算,避免活跃会话被误判为超时;撤去标记后的短会话仅有首次握手。
通道运行期间若收到服务端 KEXINIT,客户端会再次验证主机签名并按 NEWKEYS 切换双向密钥。豫言服务端在 exec 应答后主动发起的测试已覆盖无 PTY 的小窗口 seq 1 1000 输出,以及 PTY /bin/cat 的在途 DATA、EOF 和换钥后的原样回传。
若有 /tmp/yyssh互通/用户私钥,探针优先解析无口令 OpenSSH Ed25519 私钥;缺少时才读取 用户私种 原始 32 字节种子。加密或损坏的标准私钥会被拒绝。
创建 /tmp/yyssh互通/不求会话应答 后,探针会把 PTY(若使用)及 exec 请求的 want_reply 置为假,并直接进入会话接收循环,不等待 CHANNEL_SUCCESS。此模式已与豫言服务端分别完成无 PTY exec 和 PTY 加 exec 互通。
若存在 /tmp/yyssh互通/已知主机,探针优先按 [127.0.0.1]:22222 在 known_hosts 中核对握手公钥;匹配密钥的 @revoked 条目会否决连接。缺少此文件时继续采用下述 .pub 或二进制主钥文件。
本可执行包连接 127.0.0.1:22222 上的临时 OpenSSH 服务端,用豫言 TCP 接口完成版本行、KEXINIT 和 Curve25519 初报与回报,并验证服务端 Ed25519 签名。若存在 /tmp/yyssh互通/可信主钥.pub,探针严格解析单行 OpenSSH 公钥文本;否则读取 /tmp/yyssh互通/可信主钥 中预先生成的二进制 SSH key blob。只有服务端回报与预置值完全相符才验签通过。随后它交换 NEWKEYS,以派生的 AES-256-GCM 密钥发送加密 ssh-userauth 服务请求,探询 none 认证,并用所加载的 32 字节 Ed25519 种子签署公钥认证请求。用户名由 /tmp/yyssh互通/用户名 提供;测试服务端须将对应公钥写入其授权公钥文件。构建时依赖 OpenSSL 头文件与 libcrypto。
探针在服务请求前发送加密 IGNORE 与 DEBUG,认证后打开 session,发送要求应答的未授权 env 请求并验证 CHANNEL_FAILURE,然后执行固定 true。它能跳过服务端 DEBUG、IGNORE、UNIMPLEMENTED、未知全局请求与合法窗口调整;未知全局请求若要求应答,则回 REQUEST_FAILURE。会话循环按共用窗口收集普通数据和 stderr 扩展数据,允许退出状态、EOF 与输出交错,收到 CLOSE 后回送 CLOSE。通道寿命状态拒绝重复 EOF 和 EOF 后的数据。输出原字节分别写入 /tmp/yyssh互通/远程标准输出 和 /tmp/yyssh互通/远程标准错误。此路径已分别与真实 OpenSSH sshd 和豫言一次性服务端探针完成互通。
加密接收现在调用会话库的非阻塞单步接口:若缓冲已有完整报文就先解密,否则尝试读取一次,再按就绪事件继续等待;接收 IV 仅在成功认证完整报文后递进。
为验证通道窗口,探针还提供仅由本机临时文件启用的固定测试模式:存在 /tmp/yyssh互通/小窗口模式 时,以 64 字节初始接收窗口向 OpenSSH 执行 seq 1 1000;存在 /tmp/yyssh互通/服务端小窗口模式 时,以同样窗口向豫言服务端申请 PTY、执行 /bin/cat 并发送 /tmp/yyssh互通/本地输入;存在 /tmp/yyssh互通/服务端一字窗口模式 时,后者窗口改为 1 字节。这些模式均把标准输出逐字对照 /tmp/yyssh互通/预期标准输出。真实 OpenSSH sshd 的 3,893 字节输出和豫言服务端的 1,000 字节及 5 字节输出已通过;常规模式仍执行 true。
可在独立终端生成临时 Ed25519 主机密钥,使用 ssh-keygen -y 导出公钥并将其 Base64 字段解码为 /tmp/yyssh互通/可信主钥;再生成临时 Ed25519 用户私种及对应授权公钥,配置 OpenSSH 仅监听本机回环地址的 22222 端口,启用公钥用户认证并关闭口令认证。用 yy豫构 构建本包并运行产物。验证完成后停止服务端并删除所有临时密钥。构建编译器参数应带 --do-not-load-cache,以免复用旧测试产物。