【有空画图】
SSH客户端核服务端Daemon
SSH客户端:先参数的配置,然后ssh_login进入登录过程。ssh_login中会通过ssh_kex2来完成key exchange。ssh_kex2包括kex_setup来初步设置(包括向服务端发送SSH2_MSG_KEXINIT标志,已经接收服务端传来的相关消息),此外还会注册诸如kexgex_client(这个函数是配套openssl使用的)的函数用于之后进行具体密钥交换的过程(用于采用前期注册,后面传参指定某个注册函数的方式,控制流和数据流不好捕获)。ssh_login中ssh_userauth2会进行用户认证。登录过程结束后,ssh_session2会启动正式的会话,包含了client_loop来真正的循环发送、接收消息。
SSHD服务端守护进程:参数设置,调用server_accept_loop监听请求,然后会fork出子进程来完成与SSH客户端的交互,从父进程相同代码行往下执行(IP寄存器值不变)。之后的任务都是子进程来做,父进程持续处于server_accept_loop中的循环。do_ssh2_kex是服务端这边与客户端进行key exchange,包括kex_setup初步设置,注册kexgex_server(这个函数是配套openssl使用的)等函数进行密钥交换。do_authentication2是协同客户端完成用户验证。之后进入do_authenticated函数并进入server_loop2,同SSH客户端具体交互。
其他
网络通信应该都是基于Socket的(会用到Socket通信的那些函数)。channel_init_channels会初始化channel,包括channel_handler_init注册pre、post两大类函数。
sshpkt_前缀的函数通过sshbuf_前缀的函数来传递消息,但似乎是将数据传到buf后,通过某种方式将数据通过channel发送出去或者接收进来(没看到明显的函数调用?可能通过注册了函数来执行,但也没看到使用注册过的函数?)。
密钥交换中openssl相关的函数是在WITH_OPENSSL宏下被选择开启。
cipher_crypt会进行消息的加密,通过WITH_OPENSSL选择具体使用的函数。