基础 SSH/SSHD 入口、传文与服务者后续事,见 后续工作.文言.md。
包名「豫言/安全外壳协议」,版「0.1.0」。依标准库与安全外壳密码包,其试另用单元测试;SSH 字节编解码(旧在拓展库)今并入此包。
「报文。豫」兼作初握无密无签之 SSH 报文,及 RFC 5647 之 AES-256-GCM 报文。初握报文并四字节长须八字节齐;GCM 以四字节长为附加文验之,明文次为填长一字节、载物、随机填充,末附十六字节全签。GCM 编解皆还后续 IV;前四字节不变,后八字节作大端数递增,满则拒续。单报限一兆字节,毋逾底层密码术之界。
「分帧。豫」自 TCP 字节缓冲取首个完整明文或 GCM 报文,分未足、头非法、已得三途;多报同至,余字保留。分帧惟定边界,GCM 签仍须报文解码术验之。
「版本。豫」渐析彼之识别行,受 SSH 2.0 及兼容号 1.99,保同行后之余字,前置提示限八千一百九十二字节。「协商。豫」编解初始 KEXINIT,核十名称列,按全名寻算法;原协商载荷当留供后续交换哈希。
「密钥交换。豫」编析曲线初报与服务者回报,求 SHA-256 交换哈希,供服务者造 Ed25519 主钥载物及交换之签。客户验签须受预先可信之主钥全载物,先比主钥而后验签。共密以原大端无符号字节书为 SSH 正 mpint;零为空,首位高则冠零。
「公钥文本。豫」严析单行 OpenSSH ssh-ed25519 公钥:Base64 无填号,恰六十八字;解后核五十一字 SSH 钥载物,可返全载物或三十二字节公钥。容单行注及末尾 LF/CRLF,拒前置选项、第二行、控制字与坏编码。不析 authorized_keys 选项。
「私钥文本。豫」读 OpenSSH openssh-key-v1 未加密单把 Ed25519 私钥文,返三十二字私种。严核 PEM 甲胄、规范 Base64、算法与字段界、双 checkint、公钥与私种相应、八字节齐之尾填;加密或他算法钥皆返无。客户及服务者探针先读常式私钥文;若无,仍循原种文件。
「已知主机。豫」读 known_hosts 中 Ed25519 条目,逐字比调用者所给主机名,容逗号别名、[主机]:端口 及 OpenSSH |1|盐|摘要 隐名;所载钥与握手所呈者全同,乃信。若同钥有 @revoked,虽别行许之,亦拒;@revoked * 可遍撤此钥。注行、空行及他算法可并存。常通配、否名、证书权威条目今未备;此等行不授信。
「授权公钥。豫」于多行 authorized_keys 文逐一寻 Ed25519 钥,空行、注行与他算法行不妨。权限零为不授,一为许 PTY,二为禁 PTY;今惟纳无选项、no-pty、restrict、restrict,no-pty,余选项不授。同钥多行取严者,未扫尽则拒。服务者行禁 PTY 之限。「用户认证。豫」可自指定用户及服务之公钥报取候选钥;取钥非授权亦非验签,调用者须继查授权簿并验全报。
二种主机与用户钥文,皆限全篇二百五十六 KiB、逐行四千九十六字节,至多检四千九十六行;未核毕而逾限则不授权。
「派钥。豫」依 RFC 4253 派 A 至 F 六向之 SHA-256 钥材,过三十二字节则续展;并得 AES-256-GCM 二向钥及十二字节 IV、NEWKEYS 载物。「服务。豫」编解服务请求及接受载物。
「会话。豫」可编解 RFC 4254 之 signal 通道请,严核 want_reply=false、非空独名及尾界。析报不径发进程信号;会话层惟施 RFC 所列常名,未知扩展名暂略。
「会话。豫」亦编解 exit-signal:含信号名、转储爻、错误文及语言,拒坏布尔、断报与余字。豫言客户可别之于常退之 exit-status。
「传输控制。豫」依 RFC 4253 编解 DISCONNECT、IGNORE、UNIMPLEMENTED、DEBUG,严核报号、长度、尾界及 DEBUG 布尔,拒断开原因码零。调试文惟返原字,若欲示人,调用者须先验 UTF-8 且滤终端控制字。发 DISCONNECT 后不得复收发 SSH 报。
「全局请求。豫」编解 RFC 4254 之 GLOBAL_REQUEST 与应答,核非空 US-ASCII 名及严布尔,保专用余文;未知请求若待答,当回 REQUEST_FAILURE。全局请求与通道报可交错而至,调用者须别存二向 IV 及会话态。
「用户认证。豫」编 none 探问及 Ed25519 公钥认证请求,析败与成之报;又供服务者验定用户、服务、会话号及获准公钥之签。公钥签盖 SSH string 会话号与完整请求前文。
「通道。豫」编解 session 通道开请、确认、增窗、常数据、扩展数据及 EOF/CLOSE,核共用收窗与最大包。「通道寿命。豫」记二向 EOF/CLOSE,拒重终、彼终后之彼文及闭后己发;己先闭,彼在途之文犹可收。「会话。豫」编解 PTY、终端窗变、shell、exec、env 及请求应答;env 惟析名与值,允否施于进程由服务者别决。PTY 已知模式依 RFC 4254 以零码终,遇未知扩展码则止析。原生主从 PTY、尺寸与非阻塞读写由「安全外壳终端」包供之。
客户端已与 OpenSSH 服务者互通版本、KEXINIT、Curve25519、可信主钥签、NEWKEYS、加密服务请求,及 Ed25519 公钥用户认证。一次性豫言服务者探针亦与 OpenSSH 客互通主钥验真、曲线换钥、公钥认证及 session 开通;非获准钥获 USERAUTH_FAILURE,继用获准钥乃登成。连败十二次,OpenSSH 客得加密 DISCONNECT,原因码十四。无 PTY 时获准用户之 exec 命令由真标准流子进程行之,返实退码;有 PTY 时,/usr/bin/tty 真子进程之出由 CHANNEL_DATA 回,/bin/cat 亦能收 CHANNEL_DATA、回增窗与回测试文,客户皆以零退出。会话报、原生 PTY、当前用户权下控制终端子进程,及 channel 与 PTY 二向字节桥接皆已本地验;桥接见独立「安全外壳会话」包。服务者多连久行与完备授权策尚待接入;客户互通探针及服务者皆已依报数自发通道行中再议,并各与 OpenSSH 对端通。来往二向之钥与 IV 当分别存之。