与本机 SSH 服务端验证换钥、加密、认证和会话通道。
源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。
# 安全外壳互通验证 创建 `/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`,以免复用旧测试产物。
# 安全外壳互通验证 置 `/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互通/会话全局无应答模式`,探针发不待答之未知全局请,径续通道会话;二旗俱在,则从无应答式。 客户单步会话收报术亦与豫言服务者反向控制试互通:服务者发三类合法控制报及不待答未知全局请后,客户续成命令会话;服务者复发待答未知全局请,客户回 `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`:暂存非空,三千八百九十三字逐字同。 客户收报环亦依本轮任一向报数自发再议,常限四千零九十六报。置 `/tmp/yyssh互通/自动重换钥模式` 则降为四报,以供互通试。真 OpenSSH 服务者日志于一回 `seq 1 1000` 会话见首握及十五回运行中再议,输出逐字同;去低限旗之短会惟见首握。 客户收报环亦察单调钟,自本轮换钥起常满三千六百秒再议。置 `/tmp/yyssh互通/计时重换钥模式` 则改一秒,并行 `sleep 2; seq 1 1000`。单步收报未足,则候就绪至多一秒而复察钟,半报不阻至整帧齐;并置 `/tmp/yyssh互通/须空闲换钥模式`,必核换钥先于首段输出。与暂设真 OpenSSH `sshd` 之严试见首握及久闲再议二回,三千八百九十三字逐字同。微窗之报于换钥后仍实收,则复满候报余数,毋误判活会为超时;去旗之短会惟见首握。 通道行中若得服务者 KEXINIT,客户复验主钥签,依 NEWKEYS 各易钥。豫言服务者于 exec 应答后主动再议之验,含无 PTY 微窗 `seq 1 1000` 输出,及 PTY `/bin/cat` 先至 DATA、EOF、换钥后原字回传。 若有 `/tmp/yyssh互通/用户私钥`,探针先析无口令 OpenSSH Ed25519 私钥;无之乃读 `用户私种` 原三十二字。加密及坏常式钥皆拒。 置 `/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 主钥二进制载物。彼之回报须与预置值全同,始得验签。继而交换 NEWKEYS,以所派 AES-256-GCM 钥发送加密 `ssh-userauth` 请求,探 `none` 认证,再以所载三十二字节 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互通/小窗口模式`,则初收窗六十四字节,向 OpenSSH 行 `seq 1 1000`;有 `/tmp/yyssh互通/服务端小窗口模式`,则同窗向豫言服务者请 PTY、行 `/bin/cat`,送 `/tmp/yyssh互通/本地输入`;有 `/tmp/yyssh互通/服务端一字窗口模式`,后者窗改一字节。诸式皆以 `/tmp/yyssh互通/预期标准输出` 逐字验回文。真 OpenSSH `sshd` 三千八百九十三字节,豫言服务者一千字节及五字节之出皆已通过;常式仍行 `true`。 可另启终端,造暂用 Ed25519 主机钥,以 `ssh-keygen -y` 导公钥,取其 Base64 字段解码为 `/tmp/yyssh互通/可信主钥`;复造暂用 Ed25519 用户私种及获准公钥。令 OpenSSH 惟听回环地址二二二二二埠,启公钥认证而禁口令认证,既编此包而行之。验毕止服务,删诸暂钥。编译器参数宜授 `--do-not-load-cache`,免袭旧产物。