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 }