1 module libssh.types; 2 3 alias int32_t = int; 4 alias uint32_t = uint; 5 alias uint16_t = ushort; 6 alias uint8_t = ubyte; 7 alias uint64_t = ulong; 8 9 // unusable struct 10 //struct ssh_counter_struct { 11 // uint64_t in_bytes; 12 // uint64_t out_bytes; 13 // uint64_t in_packets; 14 // uint64_t out_packets; 15 //} 16 17 alias ssh_counter = void*; // ssh_counter_struct*; 18 19 alias ssh_agent = void*; // ssh_agent_struct*; 20 alias ssh_buffer = void*; // ssh_buffer_struct*; 21 alias ssh_channel = void*; // ssh_channel_struct*; 22 alias ssh_message = void*; // ssh_message_struct*; 23 alias ssh_pcap_file = void*; // ssh_pcap_file_struct*; 24 alias ssh_key = void*; // ssh_key_struct*; 25 alias ssh_scp = void*; // ssh_scp_struct*; 26 alias ssh_session = void*; // ssh_session_struct*; 27 alias ssh_string = void*; // ssh_string_struct*; 28 alias ssh_event = void*; // ssh_event_struct*; 29 alias ssh_connector = void*; // ssh_connector_struct*; 30 alias ssh_gssapi_creds = void*; 31 32 version (Windows) 33 { 34 public import core.sys.windows.winsock2 : timeval, fd_set, SOCKET; 35 36 enum socket_t : SOCKET { INVALID_SOCKET } 37 alias mode_t = ushort; 38 } 39 version (Posix) 40 { 41 public import core.sys.posix.sys.types : mode_t; 42 public import core.sys.posix.sys.time : timeval; 43 public import core.sys.posix.sys.select : fd_set; 44 45 enum socket_t : int32_t { init = -1 } 46 } 47 48 enum ssh_kex_types_e { 49 SSH_KEX=0, 50 SSH_HOSTKEYS, 51 SSH_CRYPT_C_S, 52 SSH_CRYPT_S_C, 53 SSH_MAC_C_S, 54 SSH_MAC_S_C, 55 SSH_COMP_C_S, 56 SSH_COMP_S_C, 57 SSH_LANG_C_S, 58 SSH_LANG_S_C 59 } 60 61 enum SSH_CRYPT = 2; 62 enum SSH_MAC = 3; 63 enum SSH_COMP = 4; 64 enum SSH_LANG = 5; 65 66 enum ssh_auth_e { 67 SSH_AUTH_SUCCESS=0, 68 SSH_AUTH_DENIED, 69 SSH_AUTH_PARTIAL, 70 SSH_AUTH_INFO, 71 SSH_AUTH_AGAIN, 72 SSH_AUTH_ERROR=-1 73 } 74 75 enum SSH_AUTH_METHOD_UNKNOWN = 0; 76 enum SSH_AUTH_METHOD_NONE = 0x0001; 77 enum SSH_AUTH_METHOD_PASSWORD = 0x0002; 78 enum SSH_AUTH_METHOD_PUBLICKEY = 0x0004; 79 enum SSH_AUTH_METHOD_HOSTBASED = 0x0008; 80 enum SSH_AUTH_METHOD_INTERACTIVE = 0x0010; 81 enum SSH_AUTH_METHOD_GSSAPI_MIC = 0x0020; 82 83 /* messages */ 84 enum ssh_requests_e { 85 SSH_REQUEST_AUTH=1, 86 SSH_REQUEST_CHANNEL_OPEN, 87 SSH_REQUEST_CHANNEL, 88 SSH_REQUEST_SERVICE, 89 SSH_REQUEST_GLOBAL 90 } 91 92 enum ssh_channel_type_e { 93 SSH_CHANNEL_UNKNOWN=0, 94 SSH_CHANNEL_SESSION, 95 SSH_CHANNEL_DIRECT_TCPIP, 96 SSH_CHANNEL_FORWARDED_TCPIP, 97 SSH_CHANNEL_X11, 98 SSH_CHANNEL_AUTH_AGENT 99 } 100 101 enum ssh_channel_requests_e { 102 SSH_CHANNEL_REQUEST_UNKNOWN=0, 103 SSH_CHANNEL_REQUEST_PTY, 104 SSH_CHANNEL_REQUEST_EXEC, 105 SSH_CHANNEL_REQUEST_SHELL, 106 SSH_CHANNEL_REQUEST_ENV, 107 SSH_CHANNEL_REQUEST_SUBSYSTEM, 108 SSH_CHANNEL_REQUEST_WINDOW_CHANGE, 109 SSH_CHANNEL_REQUEST_X11 110 } 111 112 enum ssh_global_requests_e { 113 SSH_GLOBAL_REQUEST_UNKNOWN=0, 114 SSH_GLOBAL_REQUEST_TCPIP_FORWARD, 115 SSH_GLOBAL_REQUEST_CANCEL_TCPIP_FORWARD, 116 SSH_GLOBAL_REQUEST_KEEPALIVE 117 } 118 119 enum ssh_publickey_state_e { 120 SSH_PUBLICKEY_STATE_ERROR=-1, 121 SSH_PUBLICKEY_STATE_NONE=0, 122 SSH_PUBLICKEY_STATE_VALID=1, 123 SSH_PUBLICKEY_STATE_WRONG=2 124 } 125 126 /* Status flags */ 127 /** Socket is closed */ 128 enum SSH_CLOSED = 0x01; 129 /** Reading to socket won't block */ 130 enum SSH_READ_PENDING = 0x02; 131 /** Session was closed due to an error */ 132 enum SSH_CLOSED_ERROR = 0x04; 133 /** Output buffer not empty */ 134 enum SSH_WRITE_PENDING = 0x08; 135 136 enum ssh_server_known_e { 137 SSH_SERVER_ERROR=-1, 138 SSH_SERVER_NOT_KNOWN=0, 139 SSH_SERVER_KNOWN_OK, 140 SSH_SERVER_KNOWN_CHANGED, 141 SSH_SERVER_FOUND_OTHER, 142 SSH_SERVER_FILE_NOT_FOUND 143 } 144 145 enum ssh_known_hosts_e { 146 /** 147 * There had been an error checking the host. 148 */ 149 SSH_KNOWN_HOSTS_ERROR = -2, 150 151 /** 152 * The known host file does not exist. The host is thus unknown. File will 153 * be created if host key is accepted. 154 */ 155 SSH_KNOWN_HOSTS_NOT_FOUND = -1, 156 157 /** 158 * The server is unknown. User should confirm the public key hash is 159 * correct. 160 */ 161 SSH_KNOWN_HOSTS_UNKNOWN = 0, 162 163 /** 164 * The server is known and has not changed. 165 */ 166 SSH_KNOWN_HOSTS_OK, 167 168 /** 169 * The server key has changed. Either you are under attack or the 170 * administrator changed the key. You HAVE to warn the user about a 171 * possible attack. 172 */ 173 SSH_KNOWN_HOSTS_CHANGED, 174 175 /** 176 * The server gave use a key of a type while we had an other type recorded. 177 * It is a possible attack. 178 */ 179 SSH_KNOWN_HOSTS_OTHER, 180 } 181 182 /* errors */ 183 184 enum ssh_error_types_e { 185 SSH_NO_ERROR=0, 186 SSH_REQUEST_DENIED, 187 SSH_FATAL, 188 SSH_EINTR 189 } 190 191 /* some types for keys */ 192 enum ssh_keytypes_e { 193 SSH_KEYTYPE_UNKNOWN=0, 194 SSH_KEYTYPE_DSS=1, 195 SSH_KEYTYPE_RSA, 196 SSH_KEYTYPE_RSA1, 197 SSH_KEYTYPE_ECDSA, 198 SSH_KEYTYPE_ED25519, 199 SSH_KEYTYPE_DSS_CERT01, 200 SSH_KEYTYPE_RSA_CERT01 201 } 202 203 enum ssh_keycmp_e { 204 SSH_KEY_CMP_PUBLIC = 0, 205 SSH_KEY_CMP_PRIVATE 206 } 207 208 enum SSH_ADDRSTRLEN = 46; 209 210 struct ssh_knownhosts_entry { 211 char *hostname; 212 char *unparsed; 213 ssh_key publickey; 214 char *comment; 215 } 216 217 /* Error return codes */ 218 enum SSH_OK = 0; /* No error */ 219 enum SSH_ERROR = -1; /* Error of some kind */ 220 enum SSH_AGAIN = -2; /* The nonblocking call must be repeated */ 221 enum SSH_EOF = -127; /* We have already a eof */ 222 223 enum { 224 /** No logging at all 225 */ 226 SSH_LOG_NOLOG=0, 227 /** Only warnings 228 */ 229 SSH_LOG_WARNING, 230 /** High level protocol information 231 */ 232 SSH_LOG_PROTOCOL, 233 /** Lower level protocol infomations, packet level 234 */ 235 SSH_LOG_PACKET, 236 /** Every function path 237 */ 238 SSH_LOG_FUNCTIONS 239 } 240 241 enum SSH_LOG_NONE = 0; /** No logging at all */ 242 enum SSH_LOG_WARN = 1; /** Show only warnings */ 243 enum SSH_LOG_INFO = 2; /** Get some information what's going on */ 244 enum SSH_LOG_DEBUG = 3; /** Get detailed debuging information **/ 245 enum SSH_LOG_TRACE = 4; /** Get trace output, packet information, ... */ 246 247 enum ssh_options_e { 248 SSH_OPTIONS_HOST, 249 SSH_OPTIONS_PORT, 250 SSH_OPTIONS_PORT_STR, 251 SSH_OPTIONS_FD, 252 SSH_OPTIONS_USER, 253 SSH_OPTIONS_SSH_DIR, 254 SSH_OPTIONS_IDENTITY, 255 SSH_OPTIONS_ADD_IDENTITY, 256 SSH_OPTIONS_KNOWNHOSTS, 257 SSH_OPTIONS_TIMEOUT, 258 SSH_OPTIONS_TIMEOUT_USEC, 259 SSH_OPTIONS_SSH1, 260 SSH_OPTIONS_SSH2, 261 SSH_OPTIONS_LOG_VERBOSITY, 262 SSH_OPTIONS_LOG_VERBOSITY_STR, 263 SSH_OPTIONS_CIPHERS_C_S, 264 SSH_OPTIONS_CIPHERS_S_C, 265 SSH_OPTIONS_COMPRESSION_C_S, 266 SSH_OPTIONS_COMPRESSION_S_C, 267 SSH_OPTIONS_PROXYCOMMAND, 268 SSH_OPTIONS_BINDADDR, 269 SSH_OPTIONS_STRICTHOSTKEYCHECK, 270 SSH_OPTIONS_COMPRESSION, 271 SSH_OPTIONS_COMPRESSION_LEVEL, 272 SSH_OPTIONS_KEY_EXCHANGE, 273 SSH_OPTIONS_HOSTKEYS, 274 SSH_OPTIONS_GSSAPI_SERVER_IDENTITY, 275 SSH_OPTIONS_GSSAPI_CLIENT_IDENTITY, 276 SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS, 277 SSH_OPTIONS_HMAC_C_S, 278 SSH_OPTIONS_HMAC_S_C, 279 SSH_OPTIONS_PASSWORD_AUTH, 280 SSH_OPTIONS_PUBKEY_AUTH, 281 SSH_OPTIONS_KBDINT_AUTH, 282 SSH_OPTIONS_GSSAPI_AUTH, 283 SSH_OPTIONS_GLOBAL_KNOWNHOSTS, 284 SSH_OPTIONS_NODELAY, 285 SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, 286 } 287 288 enum { 289 /** Code is going to write/create remote files */ 290 SSH_SCP_WRITE, 291 /** Code is going to read remote files */ 292 SSH_SCP_READ, 293 SSH_SCP_RECURSIVE=0x10 294 } 295 296 enum ssh_scp_request_types { 297 /** A new directory is going to be pulled */ 298 SSH_SCP_REQUEST_NEWDIR=1, 299 /** A new file is going to be pulled */ 300 SSH_SCP_REQUEST_NEWFILE, 301 /** End of requests */ 302 SSH_SCP_REQUEST_EOF, 303 /** End of directory */ 304 SSH_SCP_REQUEST_ENDDIR, 305 /** Warning received */ 306 SSH_SCP_REQUEST_WARNING 307 } 308 309 enum ssh_connector_flags_e { 310 /** Only the standard stream of the channel */ 311 SSH_CONNECTOR_STDOUT = 1, 312 /** Only the exception stream of the channel */ 313 SSH_CONNECTOR_STDERR = 2, 314 /** Merge both standard and exception streams */ 315 SSH_CONNECTOR_BOTH = 3 316 } 317 318 enum ssh_publickey_hash_type { 319 SSH_PUBLICKEY_HASH_SHA1, 320 SSH_PUBLICKEY_HASH_MD5, 321 SSH_PUBLICKEY_HASH_SHA256 322 } 323 324 extern (C) 325 { 326 /** 327 * @brief SSH authentication callback. 328 * 329 * @param prompt Prompt to be displayed. 330 * @param buf Buffer to save the password. You should null-terminate it. 331 * @param len Length of the buffer. 332 * @param echo Enable or disable the echo of what you type. 333 * @param verify Should the password be verified? 334 * @param userdata Userdata to be passed to the callback function. Useful 335 * for GUI applications. 336 * 337 * @return 0 on success, < 0 on error. 338 */ 339 alias ssh_auth_callback = int function(const char* prompt, char* buf, size_t len, 340 int echo, int verify, void* userdata); 341 342 alias ssh_event_callback = int function(socket_t fd, int revents, void* userdata); 343 }