00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SESSION_H_
00022 #define SESSION_H_
00023 #include "libssh/priv.h"
00024 #include "libssh/kex.h"
00025 #include "libssh/packet.h"
00026 #include "libssh/pcap.h"
00027 #include "libssh/auth.h"
00028 #include "libssh/channels.h"
00029 #include "libssh/poll.h"
00030
00031
00032 enum ssh_session_state_e {
00033 SSH_SESSION_STATE_NONE=0,
00034 SSH_SESSION_STATE_CONNECTING,
00035 SSH_SESSION_STATE_SOCKET_CONNECTED,
00036 SSH_SESSION_STATE_BANNER_RECEIVED,
00037 SSH_SESSION_STATE_INITIAL_KEX,
00038 SSH_SESSION_STATE_KEXINIT_RECEIVED,
00039 SSH_SESSION_STATE_DH,
00040 SSH_SESSION_STATE_AUTHENTICATING,
00041 SSH_SESSION_STATE_AUTHENTICATED,
00042 SSH_SESSION_STATE_ERROR,
00043 SSH_SESSION_STATE_DISCONNECTED
00044 };
00045
00046 enum ssh_dh_state_e {
00047 DH_STATE_INIT=0,
00048 DH_STATE_INIT_SENT,
00049 DH_STATE_NEWKEYS_SENT,
00050 DH_STATE_FINISHED
00051 };
00052
00053 enum ssh_pending_call_e {
00054 SSH_PENDING_CALL_NONE = 0,
00055 SSH_PENDING_CALL_CONNECT,
00056 SSH_PENDING_CALL_AUTH_NONE,
00057 SSH_PENDING_CALL_AUTH_PASSWORD,
00058 SSH_PENDING_CALL_AUTH_OFFER_PUBKEY,
00059 SSH_PENDING_CALL_AUTH_PUBKEY,
00060 SSH_PENDING_CALL_AUTH_AGENT,
00061 SSH_PENDING_CALL_AUTH_KBDINT_INIT,
00062 SSH_PENDING_CALL_AUTH_KBDINT_SEND,
00063 SSH_PENDING_CALL_AUTH_GSSAPI_MIC
00064 };
00065
00066
00067 #define SSH_SESSION_FLAG_BLOCKING 1
00068
00069
00070 #define SSH_SESSION_FLAG_AUTHENTICATED 2
00071
00072
00073
00074 #define SSH_TIMEOUT_INFINITE -1
00075
00076 #define SSH_TIMEOUT_USER -2
00077
00078 #define SSH_TIMEOUT_DEFAULT -3
00079
00080 #define SSH_TIMEOUT_NONBLOCKING 0
00081
00082
00083 struct ssh_common_struct {
00084 struct error_struct error;
00085 ssh_callbacks callbacks;
00086 int log_verbosity;
00087 };
00088
00089 struct ssh_session_struct {
00090 struct ssh_common_struct common;
00091 struct ssh_socket_struct *socket;
00092 char *serverbanner;
00093 char *clientbanner;
00094 int protoversion;
00095 int server;
00096 int client;
00097 int openssh;
00098 uint32_t send_seq;
00099 uint32_t recv_seq;
00100
00101 int connected;
00102
00103 int alive;
00104
00105
00106
00107
00108 int flags;
00109
00110 ssh_string banner;
00111
00112 char *discon_msg;
00113
00114 ssh_buffer in_buffer;
00115 PACKET in_packet;
00116 ssh_buffer out_buffer;
00117
00118
00119
00120 enum ssh_pending_call_e pending_call_state;
00121 enum ssh_session_state_e session_state;
00122 int packet_state;
00123 enum ssh_dh_state_e dh_handshake_state;
00124 enum ssh_auth_service_state_e auth_service_state;
00125 enum ssh_auth_state_e auth_state;
00126 enum ssh_channel_request_state_e global_req_state;
00127 struct ssh_agent_state_struct *agent_state;
00128 struct ssh_auth_auto_state_struct *auth_auto_state;
00129
00130
00131
00132
00133
00134
00135
00136
00137 int first_kex_follows_guess_wrong;
00138
00139 ssh_buffer in_hashbuf;
00140 ssh_buffer out_hashbuf;
00141 struct ssh_crypto_struct *current_crypto;
00142 struct ssh_crypto_struct *next_crypto;
00143
00144 struct ssh_list *channels;
00145 int maxchannel;
00146 int exec_channel_opened;
00147
00148 ssh_agent agent;
00149
00150
00151 struct ssh_kbdint_struct *kbdint;
00152 struct ssh_gssapi_struct *gssapi;
00153 int version;
00154
00155 struct {
00156 ssh_key rsa_key;
00157 ssh_key dsa_key;
00158 ssh_key ecdsa_key;
00159 ssh_key ed25519_key;
00160
00161 enum ssh_keytypes_e hostkey;
00162 } srv;
00163
00164 int auth_methods;
00165 struct ssh_list *ssh_message_list;
00166 int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata);
00167 void *ssh_message_callback_data;
00168 ssh_server_callbacks server_callbacks;
00169 void (*ssh_connection_callback)( struct ssh_session_struct *session);
00170 struct ssh_packet_callbacks_struct default_packet_callbacks;
00171 struct ssh_list *packet_callbacks;
00172 struct ssh_socket_callbacks_struct socket_callbacks;
00173 ssh_poll_ctx default_poll_ctx;
00174
00175 #ifdef WITH_PCAP
00176 ssh_pcap_context pcap_ctx;
00177 #endif
00178 struct {
00179 struct ssh_list *identity;
00180 char *username;
00181 char *host;
00182 char *bindaddr;
00183 char *sshdir;
00184 char *knownhosts;
00185 char *wanted_methods[10];
00186 char *ProxyCommand;
00187 char *custombanner;
00188 unsigned long timeout;
00189 unsigned long timeout_usec;
00190 unsigned int port;
00191 socket_t fd;
00192 int StrictHostKeyChecking;
00193 int ssh2;
00194 int ssh1;
00195 char compressionlevel;
00196 char *gss_server_identity;
00197 char *gss_client_identity;
00198 int gss_delegate_creds;
00199 } opts;
00200
00201 ssh_counter socket_counter;
00202 ssh_counter raw_counter;
00203 };
00204
00210 typedef int (*ssh_termination_function)(void *user);
00211 int ssh_handle_packets(ssh_session session, int timeout);
00212 int ssh_handle_packets_termination(ssh_session session, int timeout,
00213 ssh_termination_function fct, void *user);
00214 void ssh_socket_exception_callback(int code, int errno_code, void *user);
00215
00216 #endif