Better handling of outstanding CHANNEL_REQUESTS on channel destruction.
[u/mdw/putty] / ssh.c
1 /*
2 * SSH backend.
3 */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <stdarg.h>
8 #include <assert.h>
9 #include <limits.h>
10 #include <signal.h>
11
12 #include "putty.h"
13 #include "tree234.h"
14 #include "ssh.h"
15 #ifndef NO_GSSAPI
16 #include "sshgssc.h"
17 #include "sshgss.h"
18 #endif
19
20 #ifndef FALSE
21 #define FALSE 0
22 #endif
23 #ifndef TRUE
24 #define TRUE 1
25 #endif
26
27 #define SSH1_MSG_DISCONNECT 1 /* 0x1 */
28 #define SSH1_SMSG_PUBLIC_KEY 2 /* 0x2 */
29 #define SSH1_CMSG_SESSION_KEY 3 /* 0x3 */
30 #define SSH1_CMSG_USER 4 /* 0x4 */
31 #define SSH1_CMSG_AUTH_RSA 6 /* 0x6 */
32 #define SSH1_SMSG_AUTH_RSA_CHALLENGE 7 /* 0x7 */
33 #define SSH1_CMSG_AUTH_RSA_RESPONSE 8 /* 0x8 */
34 #define SSH1_CMSG_AUTH_PASSWORD 9 /* 0x9 */
35 #define SSH1_CMSG_REQUEST_PTY 10 /* 0xa */
36 #define SSH1_CMSG_WINDOW_SIZE 11 /* 0xb */
37 #define SSH1_CMSG_EXEC_SHELL 12 /* 0xc */
38 #define SSH1_CMSG_EXEC_CMD 13 /* 0xd */
39 #define SSH1_SMSG_SUCCESS 14 /* 0xe */
40 #define SSH1_SMSG_FAILURE 15 /* 0xf */
41 #define SSH1_CMSG_STDIN_DATA 16 /* 0x10 */
42 #define SSH1_SMSG_STDOUT_DATA 17 /* 0x11 */
43 #define SSH1_SMSG_STDERR_DATA 18 /* 0x12 */
44 #define SSH1_CMSG_EOF 19 /* 0x13 */
45 #define SSH1_SMSG_EXIT_STATUS 20 /* 0x14 */
46 #define SSH1_MSG_CHANNEL_OPEN_CONFIRMATION 21 /* 0x15 */
47 #define SSH1_MSG_CHANNEL_OPEN_FAILURE 22 /* 0x16 */
48 #define SSH1_MSG_CHANNEL_DATA 23 /* 0x17 */
49 #define SSH1_MSG_CHANNEL_CLOSE 24 /* 0x18 */
50 #define SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION 25 /* 0x19 */
51 #define SSH1_SMSG_X11_OPEN 27 /* 0x1b */
52 #define SSH1_CMSG_PORT_FORWARD_REQUEST 28 /* 0x1c */
53 #define SSH1_MSG_PORT_OPEN 29 /* 0x1d */
54 #define SSH1_CMSG_AGENT_REQUEST_FORWARDING 30 /* 0x1e */
55 #define SSH1_SMSG_AGENT_OPEN 31 /* 0x1f */
56 #define SSH1_MSG_IGNORE 32 /* 0x20 */
57 #define SSH1_CMSG_EXIT_CONFIRMATION 33 /* 0x21 */
58 #define SSH1_CMSG_X11_REQUEST_FORWARDING 34 /* 0x22 */
59 #define SSH1_CMSG_AUTH_RHOSTS_RSA 35 /* 0x23 */
60 #define SSH1_MSG_DEBUG 36 /* 0x24 */
61 #define SSH1_CMSG_REQUEST_COMPRESSION 37 /* 0x25 */
62 #define SSH1_CMSG_AUTH_TIS 39 /* 0x27 */
63 #define SSH1_SMSG_AUTH_TIS_CHALLENGE 40 /* 0x28 */
64 #define SSH1_CMSG_AUTH_TIS_RESPONSE 41 /* 0x29 */
65 #define SSH1_CMSG_AUTH_CCARD 70 /* 0x46 */
66 #define SSH1_SMSG_AUTH_CCARD_CHALLENGE 71 /* 0x47 */
67 #define SSH1_CMSG_AUTH_CCARD_RESPONSE 72 /* 0x48 */
68
69 #define SSH1_AUTH_RHOSTS 1 /* 0x1 */
70 #define SSH1_AUTH_RSA 2 /* 0x2 */
71 #define SSH1_AUTH_PASSWORD 3 /* 0x3 */
72 #define SSH1_AUTH_RHOSTS_RSA 4 /* 0x4 */
73 #define SSH1_AUTH_TIS 5 /* 0x5 */
74 #define SSH1_AUTH_CCARD 16 /* 0x10 */
75
76 #define SSH1_PROTOFLAG_SCREEN_NUMBER 1 /* 0x1 */
77 /* Mask for protoflags we will echo back to server if seen */
78 #define SSH1_PROTOFLAGS_SUPPORTED 0 /* 0x1 */
79
80 #define SSH2_MSG_DISCONNECT 1 /* 0x1 */
81 #define SSH2_MSG_IGNORE 2 /* 0x2 */
82 #define SSH2_MSG_UNIMPLEMENTED 3 /* 0x3 */
83 #define SSH2_MSG_DEBUG 4 /* 0x4 */
84 #define SSH2_MSG_SERVICE_REQUEST 5 /* 0x5 */
85 #define SSH2_MSG_SERVICE_ACCEPT 6 /* 0x6 */
86 #define SSH2_MSG_KEXINIT 20 /* 0x14 */
87 #define SSH2_MSG_NEWKEYS 21 /* 0x15 */
88 #define SSH2_MSG_KEXDH_INIT 30 /* 0x1e */
89 #define SSH2_MSG_KEXDH_REPLY 31 /* 0x1f */
90 #define SSH2_MSG_KEX_DH_GEX_REQUEST 30 /* 0x1e */
91 #define SSH2_MSG_KEX_DH_GEX_GROUP 31 /* 0x1f */
92 #define SSH2_MSG_KEX_DH_GEX_INIT 32 /* 0x20 */
93 #define SSH2_MSG_KEX_DH_GEX_REPLY 33 /* 0x21 */
94 #define SSH2_MSG_KEXRSA_PUBKEY 30 /* 0x1e */
95 #define SSH2_MSG_KEXRSA_SECRET 31 /* 0x1f */
96 #define SSH2_MSG_KEXRSA_DONE 32 /* 0x20 */
97 #define SSH2_MSG_USERAUTH_REQUEST 50 /* 0x32 */
98 #define SSH2_MSG_USERAUTH_FAILURE 51 /* 0x33 */
99 #define SSH2_MSG_USERAUTH_SUCCESS 52 /* 0x34 */
100 #define SSH2_MSG_USERAUTH_BANNER 53 /* 0x35 */
101 #define SSH2_MSG_USERAUTH_PK_OK 60 /* 0x3c */
102 #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60 /* 0x3c */
103 #define SSH2_MSG_USERAUTH_INFO_REQUEST 60 /* 0x3c */
104 #define SSH2_MSG_USERAUTH_INFO_RESPONSE 61 /* 0x3d */
105 #define SSH2_MSG_GLOBAL_REQUEST 80 /* 0x50 */
106 #define SSH2_MSG_REQUEST_SUCCESS 81 /* 0x51 */
107 #define SSH2_MSG_REQUEST_FAILURE 82 /* 0x52 */
108 #define SSH2_MSG_CHANNEL_OPEN 90 /* 0x5a */
109 #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91 /* 0x5b */
110 #define SSH2_MSG_CHANNEL_OPEN_FAILURE 92 /* 0x5c */
111 #define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93 /* 0x5d */
112 #define SSH2_MSG_CHANNEL_DATA 94 /* 0x5e */
113 #define SSH2_MSG_CHANNEL_EXTENDED_DATA 95 /* 0x5f */
114 #define SSH2_MSG_CHANNEL_EOF 96 /* 0x60 */
115 #define SSH2_MSG_CHANNEL_CLOSE 97 /* 0x61 */
116 #define SSH2_MSG_CHANNEL_REQUEST 98 /* 0x62 */
117 #define SSH2_MSG_CHANNEL_SUCCESS 99 /* 0x63 */
118 #define SSH2_MSG_CHANNEL_FAILURE 100 /* 0x64 */
119 #define SSH2_MSG_USERAUTH_GSSAPI_RESPONSE 60
120 #define SSH2_MSG_USERAUTH_GSSAPI_TOKEN 61
121 #define SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE 63
122 #define SSH2_MSG_USERAUTH_GSSAPI_ERROR 64
123 #define SSH2_MSG_USERAUTH_GSSAPI_ERRTOK 65
124 #define SSH2_MSG_USERAUTH_GSSAPI_MIC 66
125
126 /*
127 * Packet type contexts, so that ssh2_pkt_type can correctly decode
128 * the ambiguous type numbers back into the correct type strings.
129 */
130 typedef enum {
131 SSH2_PKTCTX_NOKEX,
132 SSH2_PKTCTX_DHGROUP,
133 SSH2_PKTCTX_DHGEX,
134 SSH2_PKTCTX_RSAKEX
135 } Pkt_KCtx;
136 typedef enum {
137 SSH2_PKTCTX_NOAUTH,
138 SSH2_PKTCTX_PUBLICKEY,
139 SSH2_PKTCTX_PASSWORD,
140 SSH2_PKTCTX_GSSAPI,
141 SSH2_PKTCTX_KBDINTER
142 } Pkt_ACtx;
143
144 #define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1 /* 0x1 */
145 #define SSH2_DISCONNECT_PROTOCOL_ERROR 2 /* 0x2 */
146 #define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED 3 /* 0x3 */
147 #define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4 /* 0x4 */
148 #define SSH2_DISCONNECT_MAC_ERROR 5 /* 0x5 */
149 #define SSH2_DISCONNECT_COMPRESSION_ERROR 6 /* 0x6 */
150 #define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE 7 /* 0x7 */
151 #define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8 /* 0x8 */
152 #define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9 /* 0x9 */
153 #define SSH2_DISCONNECT_CONNECTION_LOST 10 /* 0xa */
154 #define SSH2_DISCONNECT_BY_APPLICATION 11 /* 0xb */
155 #define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS 12 /* 0xc */
156 #define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER 13 /* 0xd */
157 #define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14 /* 0xe */
158 #define SSH2_DISCONNECT_ILLEGAL_USER_NAME 15 /* 0xf */
159
160 static const char *const ssh2_disconnect_reasons[] = {
161 NULL,
162 "host not allowed to connect",
163 "protocol error",
164 "key exchange failed",
165 "host authentication failed",
166 "MAC error",
167 "compression error",
168 "service not available",
169 "protocol version not supported",
170 "host key not verifiable",
171 "connection lost",
172 "by application",
173 "too many connections",
174 "auth cancelled by user",
175 "no more auth methods available",
176 "illegal user name",
177 };
178
179 #define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED 1 /* 0x1 */
180 #define SSH2_OPEN_CONNECT_FAILED 2 /* 0x2 */
181 #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE 3 /* 0x3 */
182 #define SSH2_OPEN_RESOURCE_SHORTAGE 4 /* 0x4 */
183
184 #define SSH2_EXTENDED_DATA_STDERR 1 /* 0x1 */
185
186 /*
187 * Various remote-bug flags.
188 */
189 #define BUG_CHOKES_ON_SSH1_IGNORE 1
190 #define BUG_SSH2_HMAC 2
191 #define BUG_NEEDS_SSH1_PLAIN_PASSWORD 4
192 #define BUG_CHOKES_ON_RSA 8
193 #define BUG_SSH2_RSA_PADDING 16
194 #define BUG_SSH2_DERIVEKEY 32
195 #define BUG_SSH2_REKEY 64
196 #define BUG_SSH2_PK_SESSIONID 128
197 #define BUG_SSH2_MAXPKT 256
198 #define BUG_CHOKES_ON_SSH2_IGNORE 512
199 #define BUG_CHOKES_ON_WINADJ 1024
200
201 /*
202 * Codes for terminal modes.
203 * Most of these are the same in SSH-1 and SSH-2.
204 * This list is derived from RFC 4254 and
205 * SSH-1 RFC-1.2.31.
206 */
207 static const struct {
208 const char* const mode;
209 int opcode;
210 enum { TTY_OP_CHAR, TTY_OP_BOOL } type;
211 } ssh_ttymodes[] = {
212 /* "V" prefix discarded for special characters relative to SSH specs */
213 { "INTR", 1, TTY_OP_CHAR },
214 { "QUIT", 2, TTY_OP_CHAR },
215 { "ERASE", 3, TTY_OP_CHAR },
216 { "KILL", 4, TTY_OP_CHAR },
217 { "EOF", 5, TTY_OP_CHAR },
218 { "EOL", 6, TTY_OP_CHAR },
219 { "EOL2", 7, TTY_OP_CHAR },
220 { "START", 8, TTY_OP_CHAR },
221 { "STOP", 9, TTY_OP_CHAR },
222 { "SUSP", 10, TTY_OP_CHAR },
223 { "DSUSP", 11, TTY_OP_CHAR },
224 { "REPRINT", 12, TTY_OP_CHAR },
225 { "WERASE", 13, TTY_OP_CHAR },
226 { "LNEXT", 14, TTY_OP_CHAR },
227 { "FLUSH", 15, TTY_OP_CHAR },
228 { "SWTCH", 16, TTY_OP_CHAR },
229 { "STATUS", 17, TTY_OP_CHAR },
230 { "DISCARD", 18, TTY_OP_CHAR },
231 { "IGNPAR", 30, TTY_OP_BOOL },
232 { "PARMRK", 31, TTY_OP_BOOL },
233 { "INPCK", 32, TTY_OP_BOOL },
234 { "ISTRIP", 33, TTY_OP_BOOL },
235 { "INLCR", 34, TTY_OP_BOOL },
236 { "IGNCR", 35, TTY_OP_BOOL },
237 { "ICRNL", 36, TTY_OP_BOOL },
238 { "IUCLC", 37, TTY_OP_BOOL },
239 { "IXON", 38, TTY_OP_BOOL },
240 { "IXANY", 39, TTY_OP_BOOL },
241 { "IXOFF", 40, TTY_OP_BOOL },
242 { "IMAXBEL", 41, TTY_OP_BOOL },
243 { "ISIG", 50, TTY_OP_BOOL },
244 { "ICANON", 51, TTY_OP_BOOL },
245 { "XCASE", 52, TTY_OP_BOOL },
246 { "ECHO", 53, TTY_OP_BOOL },
247 { "ECHOE", 54, TTY_OP_BOOL },
248 { "ECHOK", 55, TTY_OP_BOOL },
249 { "ECHONL", 56, TTY_OP_BOOL },
250 { "NOFLSH", 57, TTY_OP_BOOL },
251 { "TOSTOP", 58, TTY_OP_BOOL },
252 { "IEXTEN", 59, TTY_OP_BOOL },
253 { "ECHOCTL", 60, TTY_OP_BOOL },
254 { "ECHOKE", 61, TTY_OP_BOOL },
255 { "PENDIN", 62, TTY_OP_BOOL }, /* XXX is this a real mode? */
256 { "OPOST", 70, TTY_OP_BOOL },
257 { "OLCUC", 71, TTY_OP_BOOL },
258 { "ONLCR", 72, TTY_OP_BOOL },
259 { "OCRNL", 73, TTY_OP_BOOL },
260 { "ONOCR", 74, TTY_OP_BOOL },
261 { "ONLRET", 75, TTY_OP_BOOL },
262 { "CS7", 90, TTY_OP_BOOL },
263 { "CS8", 91, TTY_OP_BOOL },
264 { "PARENB", 92, TTY_OP_BOOL },
265 { "PARODD", 93, TTY_OP_BOOL }
266 };
267
268 /* Miscellaneous other tty-related constants. */
269 #define SSH_TTY_OP_END 0
270 /* The opcodes for ISPEED/OSPEED differ between SSH-1 and SSH-2. */
271 #define SSH1_TTY_OP_ISPEED 192
272 #define SSH1_TTY_OP_OSPEED 193
273 #define SSH2_TTY_OP_ISPEED 128
274 #define SSH2_TTY_OP_OSPEED 129
275
276 /* Helper functions for parsing tty-related config. */
277 static unsigned int ssh_tty_parse_specchar(char *s)
278 {
279 unsigned int ret;
280 if (*s) {
281 char *next = NULL;
282 ret = ctrlparse(s, &next);
283 if (!next) ret = s[0];
284 } else {
285 ret = 255; /* special value meaning "don't set" */
286 }
287 return ret;
288 }
289 static unsigned int ssh_tty_parse_boolean(char *s)
290 {
291 if (stricmp(s, "yes") == 0 ||
292 stricmp(s, "on") == 0 ||
293 stricmp(s, "true") == 0 ||
294 stricmp(s, "+") == 0)
295 return 1; /* true */
296 else if (stricmp(s, "no") == 0 ||
297 stricmp(s, "off") == 0 ||
298 stricmp(s, "false") == 0 ||
299 stricmp(s, "-") == 0)
300 return 0; /* false */
301 else
302 return (atoi(s) != 0);
303 }
304
305 #define translate(x) if (type == x) return #x
306 #define translatek(x,ctx) if (type == x && (pkt_kctx == ctx)) return #x
307 #define translatea(x,ctx) if (type == x && (pkt_actx == ctx)) return #x
308 static char *ssh1_pkt_type(int type)
309 {
310 translate(SSH1_MSG_DISCONNECT);
311 translate(SSH1_SMSG_PUBLIC_KEY);
312 translate(SSH1_CMSG_SESSION_KEY);
313 translate(SSH1_CMSG_USER);
314 translate(SSH1_CMSG_AUTH_RSA);
315 translate(SSH1_SMSG_AUTH_RSA_CHALLENGE);
316 translate(SSH1_CMSG_AUTH_RSA_RESPONSE);
317 translate(SSH1_CMSG_AUTH_PASSWORD);
318 translate(SSH1_CMSG_REQUEST_PTY);
319 translate(SSH1_CMSG_WINDOW_SIZE);
320 translate(SSH1_CMSG_EXEC_SHELL);
321 translate(SSH1_CMSG_EXEC_CMD);
322 translate(SSH1_SMSG_SUCCESS);
323 translate(SSH1_SMSG_FAILURE);
324 translate(SSH1_CMSG_STDIN_DATA);
325 translate(SSH1_SMSG_STDOUT_DATA);
326 translate(SSH1_SMSG_STDERR_DATA);
327 translate(SSH1_CMSG_EOF);
328 translate(SSH1_SMSG_EXIT_STATUS);
329 translate(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION);
330 translate(SSH1_MSG_CHANNEL_OPEN_FAILURE);
331 translate(SSH1_MSG_CHANNEL_DATA);
332 translate(SSH1_MSG_CHANNEL_CLOSE);
333 translate(SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION);
334 translate(SSH1_SMSG_X11_OPEN);
335 translate(SSH1_CMSG_PORT_FORWARD_REQUEST);
336 translate(SSH1_MSG_PORT_OPEN);
337 translate(SSH1_CMSG_AGENT_REQUEST_FORWARDING);
338 translate(SSH1_SMSG_AGENT_OPEN);
339 translate(SSH1_MSG_IGNORE);
340 translate(SSH1_CMSG_EXIT_CONFIRMATION);
341 translate(SSH1_CMSG_X11_REQUEST_FORWARDING);
342 translate(SSH1_CMSG_AUTH_RHOSTS_RSA);
343 translate(SSH1_MSG_DEBUG);
344 translate(SSH1_CMSG_REQUEST_COMPRESSION);
345 translate(SSH1_CMSG_AUTH_TIS);
346 translate(SSH1_SMSG_AUTH_TIS_CHALLENGE);
347 translate(SSH1_CMSG_AUTH_TIS_RESPONSE);
348 translate(SSH1_CMSG_AUTH_CCARD);
349 translate(SSH1_SMSG_AUTH_CCARD_CHALLENGE);
350 translate(SSH1_CMSG_AUTH_CCARD_RESPONSE);
351 return "unknown";
352 }
353 static char *ssh2_pkt_type(Pkt_KCtx pkt_kctx, Pkt_ACtx pkt_actx, int type)
354 {
355 translatea(SSH2_MSG_USERAUTH_GSSAPI_RESPONSE,SSH2_PKTCTX_GSSAPI);
356 translatea(SSH2_MSG_USERAUTH_GSSAPI_TOKEN,SSH2_PKTCTX_GSSAPI);
357 translatea(SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE,SSH2_PKTCTX_GSSAPI);
358 translatea(SSH2_MSG_USERAUTH_GSSAPI_ERROR,SSH2_PKTCTX_GSSAPI);
359 translatea(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK,SSH2_PKTCTX_GSSAPI);
360 translatea(SSH2_MSG_USERAUTH_GSSAPI_MIC, SSH2_PKTCTX_GSSAPI);
361 translate(SSH2_MSG_DISCONNECT);
362 translate(SSH2_MSG_IGNORE);
363 translate(SSH2_MSG_UNIMPLEMENTED);
364 translate(SSH2_MSG_DEBUG);
365 translate(SSH2_MSG_SERVICE_REQUEST);
366 translate(SSH2_MSG_SERVICE_ACCEPT);
367 translate(SSH2_MSG_KEXINIT);
368 translate(SSH2_MSG_NEWKEYS);
369 translatek(SSH2_MSG_KEXDH_INIT, SSH2_PKTCTX_DHGROUP);
370 translatek(SSH2_MSG_KEXDH_REPLY, SSH2_PKTCTX_DHGROUP);
371 translatek(SSH2_MSG_KEX_DH_GEX_REQUEST, SSH2_PKTCTX_DHGEX);
372 translatek(SSH2_MSG_KEX_DH_GEX_GROUP, SSH2_PKTCTX_DHGEX);
373 translatek(SSH2_MSG_KEX_DH_GEX_INIT, SSH2_PKTCTX_DHGEX);
374 translatek(SSH2_MSG_KEX_DH_GEX_REPLY, SSH2_PKTCTX_DHGEX);
375 translatek(SSH2_MSG_KEXRSA_PUBKEY, SSH2_PKTCTX_RSAKEX);
376 translatek(SSH2_MSG_KEXRSA_SECRET, SSH2_PKTCTX_RSAKEX);
377 translatek(SSH2_MSG_KEXRSA_DONE, SSH2_PKTCTX_RSAKEX);
378 translate(SSH2_MSG_USERAUTH_REQUEST);
379 translate(SSH2_MSG_USERAUTH_FAILURE);
380 translate(SSH2_MSG_USERAUTH_SUCCESS);
381 translate(SSH2_MSG_USERAUTH_BANNER);
382 translatea(SSH2_MSG_USERAUTH_PK_OK, SSH2_PKTCTX_PUBLICKEY);
383 translatea(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, SSH2_PKTCTX_PASSWORD);
384 translatea(SSH2_MSG_USERAUTH_INFO_REQUEST, SSH2_PKTCTX_KBDINTER);
385 translatea(SSH2_MSG_USERAUTH_INFO_RESPONSE, SSH2_PKTCTX_KBDINTER);
386 translate(SSH2_MSG_GLOBAL_REQUEST);
387 translate(SSH2_MSG_REQUEST_SUCCESS);
388 translate(SSH2_MSG_REQUEST_FAILURE);
389 translate(SSH2_MSG_CHANNEL_OPEN);
390 translate(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
391 translate(SSH2_MSG_CHANNEL_OPEN_FAILURE);
392 translate(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
393 translate(SSH2_MSG_CHANNEL_DATA);
394 translate(SSH2_MSG_CHANNEL_EXTENDED_DATA);
395 translate(SSH2_MSG_CHANNEL_EOF);
396 translate(SSH2_MSG_CHANNEL_CLOSE);
397 translate(SSH2_MSG_CHANNEL_REQUEST);
398 translate(SSH2_MSG_CHANNEL_SUCCESS);
399 translate(SSH2_MSG_CHANNEL_FAILURE);
400 return "unknown";
401 }
402 #undef translate
403 #undef translatec
404
405 /* Enumeration values for fields in SSH-1 packets */
406 enum {
407 PKT_END, PKT_INT, PKT_CHAR, PKT_DATA, PKT_STR, PKT_BIGNUM,
408 /* These values are for communicating relevant semantics of
409 * fields to the packet logging code. */
410 PKTT_OTHER, PKTT_PASSWORD, PKTT_DATA
411 };
412
413 /*
414 * Coroutine mechanics for the sillier bits of the code. If these
415 * macros look impenetrable to you, you might find it helpful to
416 * read
417 *
418 * http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
419 *
420 * which explains the theory behind these macros.
421 *
422 * In particular, if you are getting `case expression not constant'
423 * errors when building with MS Visual Studio, this is because MS's
424 * Edit and Continue debugging feature causes their compiler to
425 * violate ANSI C. To disable Edit and Continue debugging:
426 *
427 * - right-click ssh.c in the FileView
428 * - click Settings
429 * - select the C/C++ tab and the General category
430 * - under `Debug info:', select anything _other_ than `Program
431 * Database for Edit and Continue'.
432 */
433 #define crBegin(v) { int *crLine = &v; switch(v) { case 0:;
434 #define crBeginState crBegin(s->crLine)
435 #define crStateP(t, v) \
436 struct t *s; \
437 if (!(v)) { s = (v) = snew(struct t); s->crLine = 0; } \
438 s = (v);
439 #define crState(t) crStateP(t, ssh->t)
440 #define crFinish(z) } *crLine = 0; return (z); }
441 #define crFinishV } *crLine = 0; return; }
442 #define crReturn(z) \
443 do {\
444 *crLine =__LINE__; return (z); case __LINE__:;\
445 } while (0)
446 #define crReturnV \
447 do {\
448 *crLine=__LINE__; return; case __LINE__:;\
449 } while (0)
450 #define crStop(z) do{ *crLine = 0; return (z); }while(0)
451 #define crStopV do{ *crLine = 0; return; }while(0)
452 #define crWaitUntil(c) do { crReturn(0); } while (!(c))
453 #define crWaitUntilV(c) do { crReturnV; } while (!(c))
454
455 typedef struct ssh_tag *Ssh;
456 struct Packet;
457
458 static struct Packet *ssh1_pkt_init(int pkt_type);
459 static struct Packet *ssh2_pkt_init(int pkt_type);
460 static void ssh_pkt_ensure(struct Packet *, int length);
461 static void ssh_pkt_adddata(struct Packet *, void *data, int len);
462 static void ssh_pkt_addbyte(struct Packet *, unsigned char value);
463 static void ssh2_pkt_addbool(struct Packet *, unsigned char value);
464 static void ssh_pkt_adduint32(struct Packet *, unsigned long value);
465 static void ssh_pkt_addstring_start(struct Packet *);
466 static void ssh_pkt_addstring_str(struct Packet *, char *data);
467 static void ssh_pkt_addstring_data(struct Packet *, char *data, int len);
468 static void ssh_pkt_addstring(struct Packet *, char *data);
469 static unsigned char *ssh2_mpint_fmt(Bignum b, int *len);
470 static void ssh1_pkt_addmp(struct Packet *, Bignum b);
471 static void ssh2_pkt_addmp(struct Packet *, Bignum b);
472 static int ssh2_pkt_construct(Ssh, struct Packet *);
473 static void ssh2_pkt_send(Ssh, struct Packet *);
474 static void ssh2_pkt_send_noqueue(Ssh, struct Packet *);
475 static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
476 struct Packet *pktin);
477 static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
478 struct Packet *pktin);
479 static void ssh2_channel_check_close(struct ssh_channel *c);
480 static void ssh_channel_destroy(struct ssh_channel *c);
481
482 /*
483 * Buffer management constants. There are several of these for
484 * various different purposes:
485 *
486 * - SSH1_BUFFER_LIMIT is the amount of backlog that must build up
487 * on a local data stream before we throttle the whole SSH
488 * connection (in SSH-1 only). Throttling the whole connection is
489 * pretty drastic so we set this high in the hope it won't
490 * happen very often.
491 *
492 * - SSH_MAX_BACKLOG is the amount of backlog that must build up
493 * on the SSH connection itself before we defensively throttle
494 * _all_ local data streams. This is pretty drastic too (though
495 * thankfully unlikely in SSH-2 since the window mechanism should
496 * ensure that the server never has any need to throttle its end
497 * of the connection), so we set this high as well.
498 *
499 * - OUR_V2_WINSIZE is the maximum window size we present on SSH-2
500 * channels.
501 *
502 * - OUR_V2_BIGWIN is the window size we advertise for the only
503 * channel in a simple connection. It must be <= INT_MAX.
504 *
505 * - OUR_V2_MAXPKT is the official "maximum packet size" we send
506 * to the remote side. This actually has nothing to do with the
507 * size of the _packet_, but is instead a limit on the amount
508 * of data we're willing to receive in a single SSH2 channel
509 * data message.
510 *
511 * - OUR_V2_PACKETLIMIT is actually the maximum size of SSH
512 * _packet_ we're prepared to cope with. It must be a multiple
513 * of the cipher block size, and must be at least 35000.
514 */
515
516 #define SSH1_BUFFER_LIMIT 32768
517 #define SSH_MAX_BACKLOG 32768
518 #define OUR_V2_WINSIZE 16384
519 #define OUR_V2_BIGWIN 0x7fffffff
520 #define OUR_V2_MAXPKT 0x4000UL
521 #define OUR_V2_PACKETLIMIT 0x9000UL
522
523 const static struct ssh_signkey *hostkey_algs[] = { &ssh_rsa, &ssh_dss };
524
525 const static struct ssh_mac *macs[] = {
526 &ssh_hmac_sha1, &ssh_hmac_sha1_96, &ssh_hmac_md5
527 };
528 const static struct ssh_mac *buggymacs[] = {
529 &ssh_hmac_sha1_buggy, &ssh_hmac_sha1_96_buggy, &ssh_hmac_md5
530 };
531
532 static void *ssh_comp_none_init(void)
533 {
534 return NULL;
535 }
536 static void ssh_comp_none_cleanup(void *handle)
537 {
538 }
539 static int ssh_comp_none_block(void *handle, unsigned char *block, int len,
540 unsigned char **outblock, int *outlen)
541 {
542 return 0;
543 }
544 static int ssh_comp_none_disable(void *handle)
545 {
546 return 0;
547 }
548 const static struct ssh_compress ssh_comp_none = {
549 "none", NULL,
550 ssh_comp_none_init, ssh_comp_none_cleanup, ssh_comp_none_block,
551 ssh_comp_none_init, ssh_comp_none_cleanup, ssh_comp_none_block,
552 ssh_comp_none_disable, NULL
553 };
554 extern const struct ssh_compress ssh_zlib;
555 const static struct ssh_compress *compressions[] = {
556 &ssh_zlib, &ssh_comp_none
557 };
558
559 enum { /* channel types */
560 CHAN_MAINSESSION,
561 CHAN_X11,
562 CHAN_AGENT,
563 CHAN_SOCKDATA,
564 CHAN_SOCKDATA_DORMANT, /* one the remote hasn't confirmed */
565 /*
566 * CHAN_ZOMBIE is used to indicate a channel for which we've
567 * already destroyed the local data source: for instance, if a
568 * forwarded port experiences a socket error on the local side, we
569 * immediately destroy its local socket and turn the SSH channel
570 * into CHAN_ZOMBIE.
571 */
572 CHAN_ZOMBIE
573 };
574
575 typedef void (*handler_fn_t)(Ssh ssh, struct Packet *pktin);
576 typedef void (*chandler_fn_t)(Ssh ssh, struct Packet *pktin, void *ctx);
577 typedef void (*cchandler_fn_t)(struct ssh_channel *, struct Packet *, void *);
578
579 /*
580 * Each channel has a queue of outstanding CHANNEL_REQUESTS and their
581 * handlers.
582 */
583 struct outstanding_channel_request {
584 cchandler_fn_t handler;
585 void *ctx;
586 struct outstanding_channel_request *next;
587 };
588
589 /*
590 * little structure to keep track of outstanding WINDOW_ADJUSTs
591 */
592 struct winadj {
593 struct winadj *next;
594 unsigned size;
595 };
596
597 /*
598 * 2-3-4 tree storing channels.
599 */
600 struct ssh_channel {
601 Ssh ssh; /* pointer back to main context */
602 unsigned remoteid, localid;
603 int type;
604 /* True if we opened this channel but server hasn't confirmed. */
605 int halfopen;
606 /*
607 * In SSH-1, this value contains four bits:
608 *
609 * 1 We have sent SSH1_MSG_CHANNEL_CLOSE.
610 * 2 We have sent SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION.
611 * 4 We have received SSH1_MSG_CHANNEL_CLOSE.
612 * 8 We have received SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION.
613 *
614 * A channel is completely finished with when all four bits are set.
615 *
616 * In SSH-2, the four bits mean:
617 *
618 * 1 We have sent SSH2_MSG_CHANNEL_EOF.
619 * 2 We have sent SSH2_MSG_CHANNEL_CLOSE.
620 * 4 We have received SSH2_MSG_CHANNEL_EOF.
621 * 8 We have received SSH2_MSG_CHANNEL_CLOSE.
622 *
623 * A channel is completely finished with when we have both sent
624 * and received CLOSE.
625 *
626 * The symbolic constants below use the SSH-2 terminology, which
627 * is a bit confusing in SSH-1, but we have to use _something_.
628 */
629 #define CLOSES_SENT_EOF 1
630 #define CLOSES_SENT_CLOSE 2
631 #define CLOSES_RCVD_EOF 4
632 #define CLOSES_RCVD_CLOSE 8
633 int closes;
634
635 /*
636 * This flag indicates that an EOF is pending on the outgoing side
637 * of the channel: that is, wherever we're getting the data for
638 * this channel has sent us some data followed by EOF. We can't
639 * actually send the EOF until we've finished sending the data, so
640 * we set this flag instead to remind us to do so once our buffer
641 * is clear.
642 */
643 int pending_eof;
644
645 /*
646 * True if this channel is causing the underlying connection to be
647 * throttled.
648 */
649 int throttling_conn;
650 union {
651 struct ssh2_data_channel {
652 bufchain outbuffer;
653 unsigned remwindow, remmaxpkt;
654 /* locwindow is signed so we can cope with excess data. */
655 int locwindow, locmaxwin;
656 /*
657 * remlocwin is the amount of local window that we think
658 * the remote end had available to it after it sent the
659 * last data packet or window adjust ack.
660 */
661 int remlocwin;
662 /*
663 * These store the list of channel requests that haven't
664 * been acked.
665 */
666 struct outstanding_channel_request *chanreq_head, *chanreq_tail;
667 enum { THROTTLED, UNTHROTTLING, UNTHROTTLED } throttle_state;
668 } v2;
669 } v;
670 union {
671 struct ssh_agent_channel {
672 unsigned char *message;
673 unsigned char msglen[4];
674 unsigned lensofar, totallen;
675 } a;
676 struct ssh_x11_channel {
677 Socket s;
678 } x11;
679 struct ssh_pfd_channel {
680 Socket s;
681 } pfd;
682 } u;
683 };
684
685 /*
686 * 2-3-4 tree storing remote->local port forwardings. SSH-1 and SSH-2
687 * use this structure in different ways, reflecting SSH-2's
688 * altogether saner approach to port forwarding.
689 *
690 * In SSH-1, you arrange a remote forwarding by sending the server
691 * the remote port number, and the local destination host:port.
692 * When a connection comes in, the server sends you back that
693 * host:port pair, and you connect to it. This is a ready-made
694 * security hole if you're not on the ball: a malicious server
695 * could send you back _any_ host:port pair, so if you trustingly
696 * connect to the address it gives you then you've just opened the
697 * entire inside of your corporate network just by connecting
698 * through it to a dodgy SSH server. Hence, we must store a list of
699 * host:port pairs we _are_ trying to forward to, and reject a
700 * connection request from the server if it's not in the list.
701 *
702 * In SSH-2, each side of the connection minds its own business and
703 * doesn't send unnecessary information to the other. You arrange a
704 * remote forwarding by sending the server just the remote port
705 * number. When a connection comes in, the server tells you which
706 * of its ports was connected to; and _you_ have to remember what
707 * local host:port pair went with that port number.
708 *
709 * Hence, in SSH-1 this structure is indexed by destination
710 * host:port pair, whereas in SSH-2 it is indexed by source port.
711 */
712 struct ssh_portfwd; /* forward declaration */
713
714 struct ssh_rportfwd {
715 unsigned sport, dport;
716 char dhost[256];
717 char *sportdesc;
718 struct ssh_portfwd *pfrec;
719 };
720 #define free_rportfwd(pf) ( \
721 ((pf) ? (sfree((pf)->sportdesc)) : (void)0 ), sfree(pf) )
722
723 /*
724 * Separately to the rportfwd tree (which is for looking up port
725 * open requests from the server), a tree of _these_ structures is
726 * used to keep track of all the currently open port forwardings,
727 * so that we can reconfigure in mid-session if the user requests
728 * it.
729 */
730 struct ssh_portfwd {
731 enum { DESTROY, KEEP, CREATE } status;
732 int type;
733 unsigned sport, dport;
734 char *saddr, *daddr;
735 char *sserv, *dserv;
736 struct ssh_rportfwd *remote;
737 int addressfamily;
738 void *local;
739 };
740 #define free_portfwd(pf) ( \
741 ((pf) ? (sfree((pf)->saddr), sfree((pf)->daddr), \
742 sfree((pf)->sserv), sfree((pf)->dserv)) : (void)0 ), sfree(pf) )
743
744 struct Packet {
745 long length; /* length of `data' actually used */
746 long forcepad; /* SSH-2: force padding to at least this length */
747 int type; /* only used for incoming packets */
748 unsigned long sequence; /* SSH-2 incoming sequence number */
749 unsigned char *data; /* allocated storage */
750 unsigned char *body; /* offset of payload within `data' */
751 long savedpos; /* temporary index into `data' (for strings) */
752 long maxlen; /* amount of storage allocated for `data' */
753 long encrypted_len; /* for SSH-2 total-size counting */
754
755 /*
756 * State associated with packet logging
757 */
758 int logmode;
759 int nblanks;
760 struct logblank_t *blanks;
761 };
762
763 static void ssh1_protocol(Ssh ssh, void *vin, int inlen,
764 struct Packet *pktin);
765 static void ssh2_protocol(Ssh ssh, void *vin, int inlen,
766 struct Packet *pktin);
767 static void ssh1_protocol_setup(Ssh ssh);
768 static void ssh2_protocol_setup(Ssh ssh);
769 static void ssh_size(void *handle, int width, int height);
770 static void ssh_special(void *handle, Telnet_Special);
771 static int ssh2_try_send(struct ssh_channel *c);
772 static void ssh2_add_channel_data(struct ssh_channel *c, char *buf, int len);
773 static void ssh_throttle_all(Ssh ssh, int enable, int bufsize);
774 static void ssh2_set_window(struct ssh_channel *c, int newwin);
775 static int ssh_sendbuffer(void *handle);
776 static int ssh_do_close(Ssh ssh, int notify_exit);
777 static unsigned long ssh_pkt_getuint32(struct Packet *pkt);
778 static int ssh2_pkt_getbool(struct Packet *pkt);
779 static void ssh_pkt_getstring(struct Packet *pkt, char **p, int *length);
780 static void ssh2_timer(void *ctx, long now);
781 static int do_ssh2_transport(Ssh ssh, void *vin, int inlen,
782 struct Packet *pktin);
783 static void ssh2_msg_unexpected(Ssh ssh, struct Packet *pktin);
784
785 struct rdpkt1_state_tag {
786 long len, pad, biglen, to_read;
787 unsigned long realcrc, gotcrc;
788 unsigned char *p;
789 int i;
790 int chunk;
791 struct Packet *pktin;
792 };
793
794 struct rdpkt2_state_tag {
795 long len, pad, payload, packetlen, maclen;
796 int i;
797 int cipherblk;
798 unsigned long incoming_sequence;
799 struct Packet *pktin;
800 };
801
802 struct queued_handler;
803 struct queued_handler {
804 int msg1, msg2;
805 chandler_fn_t handler;
806 void *ctx;
807 struct queued_handler *next;
808 };
809
810 struct ssh_tag {
811 const struct plug_function_table *fn;
812 /* the above field _must_ be first in the structure */
813
814 char *v_c, *v_s;
815 void *exhash;
816
817 Socket s;
818
819 void *ldisc;
820 void *logctx;
821
822 unsigned char session_key[32];
823 int v1_compressing;
824 int v1_remote_protoflags;
825 int v1_local_protoflags;
826 int agentfwd_enabled;
827 int X11_fwd_enabled;
828 int remote_bugs;
829 const struct ssh_cipher *cipher;
830 void *v1_cipher_ctx;
831 void *crcda_ctx;
832 const struct ssh2_cipher *cscipher, *sccipher;
833 void *cs_cipher_ctx, *sc_cipher_ctx;
834 const struct ssh_mac *csmac, *scmac;
835 void *cs_mac_ctx, *sc_mac_ctx;
836 const struct ssh_compress *cscomp, *sccomp;
837 void *cs_comp_ctx, *sc_comp_ctx;
838 const struct ssh_kex *kex;
839 const struct ssh_signkey *hostkey;
840 unsigned char v2_session_id[SSH2_KEX_MAX_HASH_LEN];
841 int v2_session_id_len;
842 void *kex_ctx;
843
844 char *savedhost;
845 int savedport;
846 int send_ok;
847 int echoing, editing;
848
849 void *frontend;
850
851 int ospeed, ispeed; /* temporaries */
852 int term_width, term_height;
853
854 tree234 *channels; /* indexed by local id */
855 struct ssh_channel *mainchan; /* primary session channel */
856 int ncmode; /* is primary channel direct-tcpip? */
857 int exitcode;
858 int close_expected;
859 int clean_exit;
860
861 tree234 *rportfwds, *portfwds;
862
863 enum {
864 SSH_STATE_PREPACKET,
865 SSH_STATE_BEFORE_SIZE,
866 SSH_STATE_INTERMED,
867 SSH_STATE_SESSION,
868 SSH_STATE_CLOSED
869 } state;
870
871 int size_needed, eof_needed;
872 int sent_console_eof;
873 int got_pty; /* affects EOF behaviour on main channel */
874
875 struct Packet **queue;
876 int queuelen, queuesize;
877 int queueing;
878 unsigned char *deferred_send_data;
879 int deferred_len, deferred_size;
880
881 /*
882 * Gross hack: pscp will try to start SFTP but fall back to
883 * scp1 if that fails. This variable is the means by which
884 * scp.c can reach into the SSH code and find out which one it
885 * got.
886 */
887 int fallback_cmd;
888
889 bufchain banner; /* accumulates banners during do_ssh2_authconn */
890
891 Pkt_KCtx pkt_kctx;
892 Pkt_ACtx pkt_actx;
893
894 struct X11Display *x11disp;
895
896 int version;
897 int conn_throttle_count;
898 int overall_bufsize;
899 int throttled_all;
900 int v1_stdout_throttling;
901 unsigned long v2_outgoing_sequence;
902
903 int ssh1_rdpkt_crstate;
904 int ssh2_rdpkt_crstate;
905 int ssh_gotdata_crstate;
906 int do_ssh1_connection_crstate;
907
908 void *do_ssh_init_state;
909 void *do_ssh1_login_state;
910 void *do_ssh2_transport_state;
911 void *do_ssh2_authconn_state;
912
913 struct rdpkt1_state_tag rdpkt1_state;
914 struct rdpkt2_state_tag rdpkt2_state;
915
916 /* SSH-1 and SSH-2 use this for different things, but both use it */
917 int protocol_initial_phase_done;
918
919 void (*protocol) (Ssh ssh, void *vin, int inlen,
920 struct Packet *pkt);
921 struct Packet *(*s_rdpkt) (Ssh ssh, unsigned char **data, int *datalen);
922
923 /*
924 * We maintain our own copy of a Conf structure here. That way,
925 * when we're passed a new one for reconfiguration, we can check
926 * the differences and potentially reconfigure port forwardings
927 * etc in mid-session.
928 */
929 Conf *conf;
930
931 /*
932 * Values cached out of conf so as to avoid the tree234 lookup
933 * cost every time they're used.
934 */
935 int logomitdata;
936
937 /*
938 * Dynamically allocated username string created during SSH
939 * login. Stored in here rather than in the coroutine state so
940 * that it'll be reliably freed if we shut down the SSH session
941 * at some unexpected moment.
942 */
943 char *username;
944
945 /*
946 * Used to transfer data back from async callbacks.
947 */
948 void *agent_response;
949 int agent_response_len;
950 int user_response;
951
952 /*
953 * The SSH connection can be set as `frozen', meaning we are
954 * not currently accepting incoming data from the network. This
955 * is slightly more serious than setting the _socket_ as
956 * frozen, because we may already have had data passed to us
957 * from the network which we need to delay processing until
958 * after the freeze is lifted, so we also need a bufchain to
959 * store that data.
960 */
961 int frozen;
962 bufchain queued_incoming_data;
963
964 /*
965 * Dispatch table for packet types that we may have to deal
966 * with at any time.
967 */
968 handler_fn_t packet_dispatch[256];
969
970 /*
971 * Queues of one-off handler functions for success/failure
972 * indications from a request.
973 */
974 struct queued_handler *qhead, *qtail;
975 handler_fn_t q_saved_handler1, q_saved_handler2;
976
977 /*
978 * This module deals with sending keepalives.
979 */
980 Pinger pinger;
981
982 /*
983 * Track incoming and outgoing data sizes and time, for
984 * size-based rekeys.
985 */
986 unsigned long incoming_data_size, outgoing_data_size, deferred_data_size;
987 unsigned long max_data_size;
988 int kex_in_progress;
989 long next_rekey, last_rekey;
990 char *deferred_rekey_reason; /* points to STATIC string; don't free */
991
992 /*
993 * Fully qualified host name, which we need if doing GSSAPI.
994 */
995 char *fullhostname;
996
997 #ifndef NO_GSSAPI
998 /*
999 * GSSAPI libraries for this session.
1000 */
1001 struct ssh_gss_liblist *gsslibs;
1002 #endif
1003 };
1004
1005 #define logevent(s) logevent(ssh->frontend, s)
1006
1007 /* logevent, only printf-formatted. */
1008 static void logeventf(Ssh ssh, const char *fmt, ...)
1009 {
1010 va_list ap;
1011 char *buf;
1012
1013 va_start(ap, fmt);
1014 buf = dupvprintf(fmt, ap);
1015 va_end(ap);
1016 logevent(buf);
1017 sfree(buf);
1018 }
1019
1020 #define bombout(msg) \
1021 do { \
1022 char *text = dupprintf msg; \
1023 ssh_do_close(ssh, FALSE); \
1024 logevent(text); \
1025 connection_fatal(ssh->frontend, "%s", text); \
1026 sfree(text); \
1027 } while (0)
1028
1029 /* Functions to leave bits out of the SSH packet log file. */
1030
1031 static void dont_log_password(Ssh ssh, struct Packet *pkt, int blanktype)
1032 {
1033 if (conf_get_int(ssh->conf, CONF_logomitpass))
1034 pkt->logmode = blanktype;
1035 }
1036
1037 static void dont_log_data(Ssh ssh, struct Packet *pkt, int blanktype)
1038 {
1039 if (ssh->logomitdata)
1040 pkt->logmode = blanktype;
1041 }
1042
1043 static void end_log_omission(Ssh ssh, struct Packet *pkt)
1044 {
1045 pkt->logmode = PKTLOG_EMIT;
1046 }
1047
1048 /* Helper function for common bits of parsing ttymodes. */
1049 static void parse_ttymodes(Ssh ssh,
1050 void (*do_mode)(void *data, char *mode, char *val),
1051 void *data)
1052 {
1053 char *key, *val;
1054
1055 for (val = conf_get_str_strs(ssh->conf, CONF_ttymodes, NULL, &key);
1056 val != NULL;
1057 val = conf_get_str_strs(ssh->conf, CONF_ttymodes, key, &key)) {
1058 /*
1059 * val[0] is either 'V', indicating that an explicit value
1060 * follows it, or 'A' indicating that we should pass the
1061 * value through from the local environment via get_ttymode.
1062 */
1063 if (val[0] == 'A')
1064 val = get_ttymode(ssh->frontend, key);
1065 else
1066 val++; /* skip the 'V' */
1067 if (val)
1068 do_mode(data, key, val);
1069 }
1070 }
1071
1072 static int ssh_channelcmp(void *av, void *bv)
1073 {
1074 struct ssh_channel *a = (struct ssh_channel *) av;
1075 struct ssh_channel *b = (struct ssh_channel *) bv;
1076 if (a->localid < b->localid)
1077 return -1;
1078 if (a->localid > b->localid)
1079 return +1;
1080 return 0;
1081 }
1082 static int ssh_channelfind(void *av, void *bv)
1083 {
1084 unsigned *a = (unsigned *) av;
1085 struct ssh_channel *b = (struct ssh_channel *) bv;
1086 if (*a < b->localid)
1087 return -1;
1088 if (*a > b->localid)
1089 return +1;
1090 return 0;
1091 }
1092
1093 static int ssh_rportcmp_ssh1(void *av, void *bv)
1094 {
1095 struct ssh_rportfwd *a = (struct ssh_rportfwd *) av;
1096 struct ssh_rportfwd *b = (struct ssh_rportfwd *) bv;
1097 int i;
1098 if ( (i = strcmp(a->dhost, b->dhost)) != 0)
1099 return i < 0 ? -1 : +1;
1100 if (a->dport > b->dport)
1101 return +1;
1102 if (a->dport < b->dport)
1103 return -1;
1104 return 0;
1105 }
1106
1107 static int ssh_rportcmp_ssh2(void *av, void *bv)
1108 {
1109 struct ssh_rportfwd *a = (struct ssh_rportfwd *) av;
1110 struct ssh_rportfwd *b = (struct ssh_rportfwd *) bv;
1111
1112 if (a->sport > b->sport)
1113 return +1;
1114 if (a->sport < b->sport)
1115 return -1;
1116 return 0;
1117 }
1118
1119 /*
1120 * Special form of strcmp which can cope with NULL inputs. NULL is
1121 * defined to sort before even the empty string.
1122 */
1123 static int nullstrcmp(const char *a, const char *b)
1124 {
1125 if (a == NULL && b == NULL)
1126 return 0;
1127 if (a == NULL)
1128 return -1;
1129 if (b == NULL)
1130 return +1;
1131 return strcmp(a, b);
1132 }
1133
1134 static int ssh_portcmp(void *av, void *bv)
1135 {
1136 struct ssh_portfwd *a = (struct ssh_portfwd *) av;
1137 struct ssh_portfwd *b = (struct ssh_portfwd *) bv;
1138 int i;
1139 if (a->type > b->type)
1140 return +1;
1141 if (a->type < b->type)
1142 return -1;
1143 if (a->addressfamily > b->addressfamily)
1144 return +1;
1145 if (a->addressfamily < b->addressfamily)
1146 return -1;
1147 if ( (i = nullstrcmp(a->saddr, b->saddr)) != 0)
1148 return i < 0 ? -1 : +1;
1149 if (a->sport > b->sport)
1150 return +1;
1151 if (a->sport < b->sport)
1152 return -1;
1153 if (a->type != 'D') {
1154 if ( (i = nullstrcmp(a->daddr, b->daddr)) != 0)
1155 return i < 0 ? -1 : +1;
1156 if (a->dport > b->dport)
1157 return +1;
1158 if (a->dport < b->dport)
1159 return -1;
1160 }
1161 return 0;
1162 }
1163
1164 static int alloc_channel_id(Ssh ssh)
1165 {
1166 const unsigned CHANNEL_NUMBER_OFFSET = 256;
1167 unsigned low, high, mid;
1168 int tsize;
1169 struct ssh_channel *c;
1170
1171 /*
1172 * First-fit allocation of channel numbers: always pick the
1173 * lowest unused one. To do this, binary-search using the
1174 * counted B-tree to find the largest channel ID which is in a
1175 * contiguous sequence from the beginning. (Precisely
1176 * everything in that sequence must have ID equal to its tree
1177 * index plus CHANNEL_NUMBER_OFFSET.)
1178 */
1179 tsize = count234(ssh->channels);
1180
1181 low = -1;
1182 high = tsize;
1183 while (high - low > 1) {
1184 mid = (high + low) / 2;
1185 c = index234(ssh->channels, mid);
1186 if (c->localid == mid + CHANNEL_NUMBER_OFFSET)
1187 low = mid; /* this one is fine */
1188 else
1189 high = mid; /* this one is past it */
1190 }
1191 /*
1192 * Now low points to either -1, or the tree index of the
1193 * largest ID in the initial sequence.
1194 */
1195 {
1196 unsigned i = low + 1 + CHANNEL_NUMBER_OFFSET;
1197 assert(NULL == find234(ssh->channels, &i, ssh_channelfind));
1198 }
1199 return low + 1 + CHANNEL_NUMBER_OFFSET;
1200 }
1201
1202 static void c_write_stderr(int trusted, const char *buf, int len)
1203 {
1204 int i;
1205 for (i = 0; i < len; i++)
1206 if (buf[i] != '\r' && (trusted || buf[i] == '\n' || (buf[i] & 0x60)))
1207 fputc(buf[i], stderr);
1208 }
1209
1210 static void c_write(Ssh ssh, const char *buf, int len)
1211 {
1212 if (flags & FLAG_STDERR)
1213 c_write_stderr(1, buf, len);
1214 else
1215 from_backend(ssh->frontend, 1, buf, len);
1216 }
1217
1218 static void c_write_untrusted(Ssh ssh, const char *buf, int len)
1219 {
1220 if (flags & FLAG_STDERR)
1221 c_write_stderr(0, buf, len);
1222 else
1223 from_backend_untrusted(ssh->frontend, buf, len);
1224 }
1225
1226 static void c_write_str(Ssh ssh, const char *buf)
1227 {
1228 c_write(ssh, buf, strlen(buf));
1229 }
1230
1231 static void ssh_free_packet(struct Packet *pkt)
1232 {
1233 sfree(pkt->data);
1234 sfree(pkt);
1235 }
1236 static struct Packet *ssh_new_packet(void)
1237 {
1238 struct Packet *pkt = snew(struct Packet);
1239
1240 pkt->body = pkt->data = NULL;
1241 pkt->maxlen = 0;
1242 pkt->logmode = PKTLOG_EMIT;
1243 pkt->nblanks = 0;
1244 pkt->blanks = NULL;
1245
1246 return pkt;
1247 }
1248
1249 /*
1250 * Collect incoming data in the incoming packet buffer.
1251 * Decipher and verify the packet when it is completely read.
1252 * Drop SSH1_MSG_DEBUG and SSH1_MSG_IGNORE packets.
1253 * Update the *data and *datalen variables.
1254 * Return a Packet structure when a packet is completed.
1255 */
1256 static struct Packet *ssh1_rdpkt(Ssh ssh, unsigned char **data, int *datalen)
1257 {
1258 struct rdpkt1_state_tag *st = &ssh->rdpkt1_state;
1259
1260 crBegin(ssh->ssh1_rdpkt_crstate);
1261
1262 st->pktin = ssh_new_packet();
1263
1264 st->pktin->type = 0;
1265 st->pktin->length = 0;
1266
1267 for (st->i = st->len = 0; st->i < 4; st->i++) {
1268 while ((*datalen) == 0)
1269 crReturn(NULL);
1270 st->len = (st->len << 8) + **data;
1271 (*data)++, (*datalen)--;
1272 }
1273
1274 st->pad = 8 - (st->len % 8);
1275 st->biglen = st->len + st->pad;
1276 st->pktin->length = st->len - 5;
1277
1278 if (st->biglen < 0) {
1279 bombout(("Extremely large packet length from server suggests"
1280 " data stream corruption"));
1281 ssh_free_packet(st->pktin);
1282 crStop(NULL);
1283 }
1284
1285 st->pktin->maxlen = st->biglen;
1286 st->pktin->data = snewn(st->biglen + APIEXTRA, unsigned char);
1287
1288 st->to_read = st->biglen;
1289 st->p = st->pktin->data;
1290 while (st->to_read > 0) {
1291 st->chunk = st->to_read;
1292 while ((*datalen) == 0)
1293 crReturn(NULL);
1294 if (st->chunk > (*datalen))
1295 st->chunk = (*datalen);
1296 memcpy(st->p, *data, st->chunk);
1297 *data += st->chunk;
1298 *datalen -= st->chunk;
1299 st->p += st->chunk;
1300 st->to_read -= st->chunk;
1301 }
1302
1303 if (ssh->cipher && detect_attack(ssh->crcda_ctx, st->pktin->data,
1304 st->biglen, NULL)) {
1305 bombout(("Network attack (CRC compensation) detected!"));
1306 ssh_free_packet(st->pktin);
1307 crStop(NULL);
1308 }
1309
1310 if (ssh->cipher)
1311 ssh->cipher->decrypt(ssh->v1_cipher_ctx, st->pktin->data, st->biglen);
1312
1313 st->realcrc = crc32_compute(st->pktin->data, st->biglen - 4);
1314 st->gotcrc = GET_32BIT(st->pktin->data + st->biglen - 4);
1315 if (st->gotcrc != st->realcrc) {
1316 bombout(("Incorrect CRC received on packet"));
1317 ssh_free_packet(st->pktin);
1318 crStop(NULL);
1319 }
1320
1321 st->pktin->body = st->pktin->data + st->pad + 1;
1322 st->pktin->savedpos = 0;
1323
1324 if (ssh->v1_compressing) {
1325 unsigned char *decompblk;
1326 int decomplen;
1327 if (!zlib_decompress_block(ssh->sc_comp_ctx,
1328 st->pktin->body - 1, st->pktin->length + 1,
1329 &decompblk, &decomplen)) {
1330 bombout(("Zlib decompression encountered invalid data"));
1331 ssh_free_packet(st->pktin);
1332 crStop(NULL);
1333 }
1334
1335 if (st->pktin->maxlen < st->pad + decomplen) {
1336 st->pktin->maxlen = st->pad + decomplen;
1337 st->pktin->data = sresize(st->pktin->data,
1338 st->pktin->maxlen + APIEXTRA,
1339 unsigned char);
1340 st->pktin->body = st->pktin->data + st->pad + 1;
1341 }
1342
1343 memcpy(st->pktin->body - 1, decompblk, decomplen);
1344 sfree(decompblk);
1345 st->pktin->length = decomplen - 1;
1346 }
1347
1348 st->pktin->type = st->pktin->body[-1];
1349
1350 /*
1351 * Log incoming packet, possibly omitting sensitive fields.
1352 */
1353 if (ssh->logctx) {
1354 int nblanks = 0;
1355 struct logblank_t blank;
1356 if (ssh->logomitdata) {
1357 int do_blank = FALSE, blank_prefix = 0;
1358 /* "Session data" packets - omit the data field */
1359 if ((st->pktin->type == SSH1_SMSG_STDOUT_DATA) ||
1360 (st->pktin->type == SSH1_SMSG_STDERR_DATA)) {
1361 do_blank = TRUE; blank_prefix = 4;
1362 } else if (st->pktin->type == SSH1_MSG_CHANNEL_DATA) {
1363 do_blank = TRUE; blank_prefix = 8;
1364 }
1365 if (do_blank) {
1366 blank.offset = blank_prefix;
1367 blank.len = st->pktin->length;
1368 blank.type = PKTLOG_OMIT;
1369 nblanks = 1;
1370 }
1371 }
1372 log_packet(ssh->logctx,
1373 PKT_INCOMING, st->pktin->type,
1374 ssh1_pkt_type(st->pktin->type),
1375 st->pktin->body, st->pktin->length,
1376 nblanks, &blank, NULL);
1377 }
1378
1379 crFinish(st->pktin);
1380 }
1381
1382 static struct Packet *ssh2_rdpkt(Ssh ssh, unsigned char **data, int *datalen)
1383 {
1384 struct rdpkt2_state_tag *st = &ssh->rdpkt2_state;
1385
1386 crBegin(ssh->ssh2_rdpkt_crstate);
1387
1388 st->pktin = ssh_new_packet();
1389
1390 st->pktin->type = 0;
1391 st->pktin->length = 0;
1392 if (ssh->sccipher)
1393 st->cipherblk = ssh->sccipher->blksize;
1394 else
1395 st->cipherblk = 8;
1396 if (st->cipherblk < 8)
1397 st->cipherblk = 8;
1398 st->maclen = ssh->scmac ? ssh->scmac->len : 0;
1399
1400 if (ssh->sccipher && (ssh->sccipher->flags & SSH_CIPHER_IS_CBC) &&
1401 ssh->scmac) {
1402 /*
1403 * When dealing with a CBC-mode cipher, we want to avoid the
1404 * possibility of an attacker's tweaking the ciphertext stream
1405 * so as to cause us to feed the same block to the block
1406 * cipher more than once and thus leak information
1407 * (VU#958563). The way we do this is not to take any
1408 * decisions on the basis of anything we've decrypted until
1409 * we've verified it with a MAC. That includes the packet
1410 * length, so we just read data and check the MAC repeatedly,
1411 * and when the MAC passes, see if the length we've got is
1412 * plausible.
1413 */
1414
1415 /* May as well allocate the whole lot now. */
1416 st->pktin->data = snewn(OUR_V2_PACKETLIMIT + st->maclen + APIEXTRA,
1417 unsigned char);
1418
1419 /* Read an amount corresponding to the MAC. */
1420 for (st->i = 0; st->i < st->maclen; st->i++) {
1421 while ((*datalen) == 0)
1422 crReturn(NULL);
1423 st->pktin->data[st->i] = *(*data)++;
1424 (*datalen)--;
1425 }
1426
1427 st->packetlen = 0;
1428 {
1429 unsigned char seq[4];
1430 ssh->scmac->start(ssh->sc_mac_ctx);
1431 PUT_32BIT(seq, st->incoming_sequence);
1432 ssh->scmac->bytes(ssh->sc_mac_ctx, seq, 4);
1433 }
1434
1435 for (;;) { /* Once around this loop per cipher block. */
1436 /* Read another cipher-block's worth, and tack it onto the end. */
1437 for (st->i = 0; st->i < st->cipherblk; st->i++) {
1438 while ((*datalen) == 0)
1439 crReturn(NULL);
1440 st->pktin->data[st->packetlen+st->maclen+st->i] = *(*data)++;
1441 (*datalen)--;
1442 }
1443 /* Decrypt one more block (a little further back in the stream). */
1444 ssh->sccipher->decrypt(ssh->sc_cipher_ctx,
1445 st->pktin->data + st->packetlen,
1446 st->cipherblk);
1447 /* Feed that block to the MAC. */
1448 ssh->scmac->bytes(ssh->sc_mac_ctx,
1449 st->pktin->data + st->packetlen, st->cipherblk);
1450 st->packetlen += st->cipherblk;
1451 /* See if that gives us a valid packet. */
1452 if (ssh->scmac->verresult(ssh->sc_mac_ctx,
1453 st->pktin->data + st->packetlen) &&
1454 (st->len = GET_32BIT(st->pktin->data)) + 4 == st->packetlen)
1455 break;
1456 if (st->packetlen >= OUR_V2_PACKETLIMIT) {
1457 bombout(("No valid incoming packet found"));
1458 ssh_free_packet(st->pktin);
1459 crStop(NULL);
1460 }
1461 }
1462 st->pktin->maxlen = st->packetlen + st->maclen;
1463 st->pktin->data = sresize(st->pktin->data,
1464 st->pktin->maxlen + APIEXTRA,
1465 unsigned char);
1466 } else {
1467 st->pktin->data = snewn(st->cipherblk + APIEXTRA, unsigned char);
1468
1469 /*
1470 * Acquire and decrypt the first block of the packet. This will
1471 * contain the length and padding details.
1472 */
1473 for (st->i = st->len = 0; st->i < st->cipherblk; st->i++) {
1474 while ((*datalen) == 0)
1475 crReturn(NULL);
1476 st->pktin->data[st->i] = *(*data)++;
1477 (*datalen)--;
1478 }
1479
1480 if (ssh->sccipher)
1481 ssh->sccipher->decrypt(ssh->sc_cipher_ctx,
1482 st->pktin->data, st->cipherblk);
1483
1484 /*
1485 * Now get the length figure.
1486 */
1487 st->len = GET_32BIT(st->pktin->data);
1488
1489 /*
1490 * _Completely_ silly lengths should be stomped on before they
1491 * do us any more damage.
1492 */
1493 if (st->len < 0 || st->len > OUR_V2_PACKETLIMIT ||
1494 (st->len + 4) % st->cipherblk != 0) {
1495 bombout(("Incoming packet was garbled on decryption"));
1496 ssh_free_packet(st->pktin);
1497 crStop(NULL);
1498 }
1499
1500 /*
1501 * So now we can work out the total packet length.
1502 */
1503 st->packetlen = st->len + 4;
1504
1505 /*
1506 * Allocate memory for the rest of the packet.
1507 */
1508 st->pktin->maxlen = st->packetlen + st->maclen;
1509 st->pktin->data = sresize(st->pktin->data,
1510 st->pktin->maxlen + APIEXTRA,
1511 unsigned char);
1512
1513 /*
1514 * Read and decrypt the remainder of the packet.
1515 */
1516 for (st->i = st->cipherblk; st->i < st->packetlen + st->maclen;
1517 st->i++) {
1518 while ((*datalen) == 0)
1519 crReturn(NULL);
1520 st->pktin->data[st->i] = *(*data)++;
1521 (*datalen)--;
1522 }
1523 /* Decrypt everything _except_ the MAC. */
1524 if (ssh->sccipher)
1525 ssh->sccipher->decrypt(ssh->sc_cipher_ctx,
1526 st->pktin->data + st->cipherblk,
1527 st->packetlen - st->cipherblk);
1528
1529 /*
1530 * Check the MAC.
1531 */
1532 if (ssh->scmac
1533 && !ssh->scmac->verify(ssh->sc_mac_ctx, st->pktin->data,
1534 st->len + 4, st->incoming_sequence)) {
1535 bombout(("Incorrect MAC received on packet"));
1536 ssh_free_packet(st->pktin);
1537 crStop(NULL);
1538 }
1539 }
1540 /* Get and sanity-check the amount of random padding. */
1541 st->pad = st->pktin->data[4];
1542 if (st->pad < 4 || st->len - st->pad < 1) {
1543 bombout(("Invalid padding length on received packet"));
1544 ssh_free_packet(st->pktin);
1545 crStop(NULL);
1546 }
1547 /*
1548 * This enables us to deduce the payload length.
1549 */
1550 st->payload = st->len - st->pad - 1;
1551
1552 st->pktin->length = st->payload + 5;
1553 st->pktin->encrypted_len = st->packetlen;
1554
1555 st->pktin->sequence = st->incoming_sequence++;
1556
1557 /*
1558 * Decompress packet payload.
1559 */
1560 {
1561 unsigned char *newpayload;
1562 int newlen;
1563 if (ssh->sccomp &&
1564 ssh->sccomp->decompress(ssh->sc_comp_ctx,
1565 st->pktin->data + 5, st->pktin->length - 5,
1566 &newpayload, &newlen)) {
1567 if (st->pktin->maxlen < newlen + 5) {
1568 st->pktin->maxlen = newlen + 5;
1569 st->pktin->data = sresize(st->pktin->data,
1570 st->pktin->maxlen + APIEXTRA,
1571 unsigned char);
1572 }
1573 st->pktin->length = 5 + newlen;
1574 memcpy(st->pktin->data + 5, newpayload, newlen);
1575 sfree(newpayload);
1576 }
1577 }
1578
1579 st->pktin->savedpos = 6;
1580 st->pktin->body = st->pktin->data;
1581 st->pktin->type = st->pktin->data[5];
1582
1583 /*
1584 * Log incoming packet, possibly omitting sensitive fields.
1585 */
1586 if (ssh->logctx) {
1587 int nblanks = 0;
1588 struct logblank_t blank;
1589 if (ssh->logomitdata) {
1590 int do_blank = FALSE, blank_prefix = 0;
1591 /* "Session data" packets - omit the data field */
1592 if (st->pktin->type == SSH2_MSG_CHANNEL_DATA) {
1593 do_blank = TRUE; blank_prefix = 8;
1594 } else if (st->pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA) {
1595 do_blank = TRUE; blank_prefix = 12;
1596 }
1597 if (do_blank) {
1598 blank.offset = blank_prefix;
1599 blank.len = (st->pktin->length-6) - blank_prefix;
1600 blank.type = PKTLOG_OMIT;
1601 nblanks = 1;
1602 }
1603 }
1604 log_packet(ssh->logctx, PKT_INCOMING, st->pktin->type,
1605 ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx,
1606 st->pktin->type),
1607 st->pktin->data+6, st->pktin->length-6,
1608 nblanks, &blank, &st->pktin->sequence);
1609 }
1610
1611 crFinish(st->pktin);
1612 }
1613
1614 static int s_wrpkt_prepare(Ssh ssh, struct Packet *pkt, int *offset_p)
1615 {
1616 int pad, biglen, i, pktoffs;
1617 unsigned long crc;
1618 #ifdef __SC__
1619 /*
1620 * XXX various versions of SC (including 8.8.4) screw up the
1621 * register allocation in this function and use the same register
1622 * (D6) for len and as a temporary, with predictable results. The
1623 * following sledgehammer prevents this.
1624 */
1625 volatile
1626 #endif
1627 int len;
1628
1629 if (ssh->logctx)
1630 log_packet(ssh->logctx, PKT_OUTGOING, pkt->data[12],
1631 ssh1_pkt_type(pkt->data[12]),
1632 pkt->body, pkt->length - (pkt->body - pkt->data),
1633 pkt->nblanks, pkt->blanks, NULL);
1634 sfree(pkt->blanks); pkt->blanks = NULL;
1635 pkt->nblanks = 0;
1636
1637 if (ssh->v1_compressing) {
1638 unsigned char *compblk;
1639 int complen;
1640 zlib_compress_block(ssh->cs_comp_ctx,
1641 pkt->data + 12, pkt->length - 12,
1642 &compblk, &complen);
1643 ssh_pkt_ensure(pkt, complen + 2); /* just in case it's got bigger */
1644 memcpy(pkt->data + 12, compblk, complen);
1645 sfree(compblk);
1646 pkt->length = complen + 12;
1647 }
1648
1649 ssh_pkt_ensure(pkt, pkt->length + 4); /* space for CRC */
1650 pkt->length += 4;
1651 len = pkt->length - 4 - 8; /* len(type+data+CRC) */
1652 pad = 8 - (len % 8);
1653 pktoffs = 8 - pad;
1654 biglen = len + pad; /* len(padding+type+data+CRC) */
1655
1656 for (i = pktoffs; i < 4+8; i++)
1657 pkt->data[i] = random_byte();
1658 crc = crc32_compute(pkt->data + pktoffs + 4, biglen - 4); /* all ex len */
1659 PUT_32BIT(pkt->data + pktoffs + 4 + biglen - 4, crc);
1660 PUT_32BIT(pkt->data + pktoffs, len);
1661
1662 if (ssh->cipher)
1663 ssh->cipher->encrypt(ssh->v1_cipher_ctx,
1664 pkt->data + pktoffs + 4, biglen);
1665
1666 if (offset_p) *offset_p = pktoffs;
1667 return biglen + 4; /* len(length+padding+type+data+CRC) */
1668 }
1669
1670 static int s_write(Ssh ssh, void *data, int len)
1671 {
1672 if (ssh->logctx)
1673 log_packet(ssh->logctx, PKT_OUTGOING, -1, NULL, data, len,
1674 0, NULL, NULL);
1675 return sk_write(ssh->s, (char *)data, len);
1676 }
1677
1678 static void s_wrpkt(Ssh ssh, struct Packet *pkt)
1679 {
1680 int len, backlog, offset;
1681 len = s_wrpkt_prepare(ssh, pkt, &offset);
1682 backlog = s_write(ssh, pkt->data + offset, len);
1683 if (backlog > SSH_MAX_BACKLOG)
1684 ssh_throttle_all(ssh, 1, backlog);
1685 ssh_free_packet(pkt);
1686 }
1687
1688 static void s_wrpkt_defer(Ssh ssh, struct Packet *pkt)
1689 {
1690 int len, offset;
1691 len = s_wrpkt_prepare(ssh, pkt, &offset);
1692 if (ssh->deferred_len + len > ssh->deferred_size) {
1693 ssh->deferred_size = ssh->deferred_len + len + 128;
1694 ssh->deferred_send_data = sresize(ssh->deferred_send_data,
1695 ssh->deferred_size,
1696 unsigned char);
1697 }
1698 memcpy(ssh->deferred_send_data + ssh->deferred_len,
1699 pkt->data + offset, len);
1700 ssh->deferred_len += len;
1701 ssh_free_packet(pkt);
1702 }
1703
1704 /*
1705 * Construct a SSH-1 packet with the specified contents.
1706 * (This all-at-once interface used to be the only one, but now SSH-1
1707 * packets can also be constructed incrementally.)
1708 */
1709 static struct Packet *construct_packet(Ssh ssh, int pkttype, va_list ap)
1710 {
1711 int argtype;
1712 Bignum bn;
1713 struct Packet *pkt;
1714
1715 pkt = ssh1_pkt_init(pkttype);
1716
1717 while ((argtype = va_arg(ap, int)) != PKT_END) {
1718 unsigned char *argp, argchar;
1719 char *sargp;
1720 unsigned long argint;
1721 int arglen;
1722 switch (argtype) {
1723 /* Actual fields in the packet */
1724 case PKT_INT:
1725 argint = va_arg(ap, int);
1726 ssh_pkt_adduint32(pkt, argint);
1727 break;
1728 case PKT_CHAR:
1729 argchar = (unsigned char) va_arg(ap, int);
1730 ssh_pkt_addbyte(pkt, argchar);
1731 break;
1732 case PKT_DATA:
1733 argp = va_arg(ap, unsigned char *);
1734 arglen = va_arg(ap, int);
1735 ssh_pkt_adddata(pkt, argp, arglen);
1736 break;
1737 case PKT_STR:
1738 sargp = va_arg(ap, char *);
1739 ssh_pkt_addstring(pkt, sargp);
1740 break;
1741 case PKT_BIGNUM:
1742 bn = va_arg(ap, Bignum);
1743 ssh1_pkt_addmp(pkt, bn);
1744 break;
1745 /* Tokens for modifications to packet logging */
1746 case PKTT_PASSWORD:
1747 dont_log_password(ssh, pkt, PKTLOG_BLANK);
1748 break;
1749 case PKTT_DATA:
1750 dont_log_data(ssh, pkt, PKTLOG_OMIT);
1751 break;
1752 case PKTT_OTHER:
1753 end_log_omission(ssh, pkt);
1754 break;
1755 }
1756 }
1757
1758 return pkt;
1759 }
1760
1761 static void send_packet(Ssh ssh, int pkttype, ...)
1762 {
1763 struct Packet *pkt;
1764 va_list ap;
1765 va_start(ap, pkttype);
1766 pkt = construct_packet(ssh, pkttype, ap);
1767 va_end(ap);
1768 s_wrpkt(ssh, pkt);
1769 }
1770
1771 static void defer_packet(Ssh ssh, int pkttype, ...)
1772 {
1773 struct Packet *pkt;
1774 va_list ap;
1775 va_start(ap, pkttype);
1776 pkt = construct_packet(ssh, pkttype, ap);
1777 va_end(ap);
1778 s_wrpkt_defer(ssh, pkt);
1779 }
1780
1781 static int ssh_versioncmp(char *a, char *b)
1782 {
1783 char *ae, *be;
1784 unsigned long av, bv;
1785
1786 av = strtoul(a, &ae, 10);
1787 bv = strtoul(b, &be, 10);
1788 if (av != bv)
1789 return (av < bv ? -1 : +1);
1790 if (*ae == '.')
1791 ae++;
1792 if (*be == '.')
1793 be++;
1794 av = strtoul(ae, &ae, 10);
1795 bv = strtoul(be, &be, 10);
1796 if (av != bv)
1797 return (av < bv ? -1 : +1);
1798 return 0;
1799 }
1800
1801 /*
1802 * Utility routines for putting an SSH-protocol `string' and
1803 * `uint32' into a hash state.
1804 */
1805 static void hash_string(const struct ssh_hash *h, void *s, void *str, int len)
1806 {
1807 unsigned char lenblk[4];
1808 PUT_32BIT(lenblk, len);
1809 h->bytes(s, lenblk, 4);
1810 h->bytes(s, str, len);
1811 }
1812
1813 static void hash_uint32(const struct ssh_hash *h, void *s, unsigned i)
1814 {
1815 unsigned char intblk[4];
1816 PUT_32BIT(intblk, i);
1817 h->bytes(s, intblk, 4);
1818 }
1819
1820 /*
1821 * Packet construction functions. Mostly shared between SSH-1 and SSH-2.
1822 */
1823 static void ssh_pkt_ensure(struct Packet *pkt, int length)
1824 {
1825 if (pkt->maxlen < length) {
1826 unsigned char *body = pkt->body;
1827 int offset = body ? body - pkt->data : 0;
1828 pkt->maxlen = length + 256;
1829 pkt->data = sresize(pkt->data, pkt->maxlen + APIEXTRA, unsigned char);
1830 if (body) pkt->body = pkt->data + offset;
1831 }
1832 }
1833 static void ssh_pkt_adddata(struct Packet *pkt, void *data, int len)
1834 {
1835 if (pkt->logmode != PKTLOG_EMIT) {
1836 pkt->nblanks++;
1837 pkt->blanks = sresize(pkt->blanks, pkt->nblanks, struct logblank_t);
1838 assert(pkt->body);
1839 pkt->blanks[pkt->nblanks-1].offset = pkt->length -
1840 (pkt->body - pkt->data);
1841 pkt->blanks[pkt->nblanks-1].len = len;
1842 pkt->blanks[pkt->nblanks-1].type = pkt->logmode;
1843 }
1844 pkt->length += len;
1845 ssh_pkt_ensure(pkt, pkt->length);
1846 memcpy(pkt->data + pkt->length - len, data, len);
1847 }
1848 static void ssh_pkt_addbyte(struct Packet *pkt, unsigned char byte)
1849 {
1850 ssh_pkt_adddata(pkt, &byte, 1);
1851 }
1852 static void ssh2_pkt_addbool(struct Packet *pkt, unsigned char value)
1853 {
1854 ssh_pkt_adddata(pkt, &value, 1);
1855 }
1856 static void ssh_pkt_adduint32(struct Packet *pkt, unsigned long value)
1857 {
1858 unsigned char x[4];
1859 PUT_32BIT(x, value);
1860 ssh_pkt_adddata(pkt, x, 4);
1861 }
1862 static void ssh_pkt_addstring_start(struct Packet *pkt)
1863 {
1864 ssh_pkt_adduint32(pkt, 0);
1865 pkt->savedpos = pkt->length;
1866 }
1867 static void ssh_pkt_addstring_str(struct Packet *pkt, char *data)
1868 {
1869 ssh_pkt_adddata(pkt, data, strlen(data));
1870 PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos);
1871 }
1872 static void ssh_pkt_addstring_data(struct Packet *pkt, char *data, int len)
1873 {
1874 ssh_pkt_adddata(pkt, data, len);
1875 PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos);
1876 }
1877 static void ssh_pkt_addstring(struct Packet *pkt, char *data)
1878 {
1879 ssh_pkt_addstring_start(pkt);
1880 ssh_pkt_addstring_str(pkt, data);
1881 }
1882 static void ssh1_pkt_addmp(struct Packet *pkt, Bignum b)
1883 {
1884 int len = ssh1_bignum_length(b);
1885 unsigned char *data = snewn(len, unsigned char);
1886 (void) ssh1_write_bignum(data, b);
1887 ssh_pkt_adddata(pkt, data, len);
1888 sfree(data);
1889 }
1890 static unsigned char *ssh2_mpint_fmt(Bignum b, int *len)
1891 {
1892 unsigned char *p;
1893 int i, n = (bignum_bitcount(b) + 7) / 8;
1894 p = snewn(n + 1, unsigned char);
1895 p[0] = 0;
1896 for (i = 1; i <= n; i++)
1897 p[i] = bignum_byte(b, n - i);
1898 i = 0;
1899 while (i <= n && p[i] == 0 && (p[i + 1] & 0x80) == 0)
1900 i++;
1901 memmove(p, p + i, n + 1 - i);
1902 *len = n + 1 - i;
1903 return p;
1904 }
1905 static void ssh2_pkt_addmp(struct Packet *pkt, Bignum b)
1906 {
1907 unsigned char *p;
1908 int len;
1909 p = ssh2_mpint_fmt(b, &len);
1910 ssh_pkt_addstring_start(pkt);
1911 ssh_pkt_addstring_data(pkt, (char *)p, len);
1912 sfree(p);
1913 }
1914
1915 static struct Packet *ssh1_pkt_init(int pkt_type)
1916 {
1917 struct Packet *pkt = ssh_new_packet();
1918 pkt->length = 4 + 8; /* space for length + max padding */
1919 ssh_pkt_addbyte(pkt, pkt_type);
1920 pkt->body = pkt->data + pkt->length;
1921 return pkt;
1922 }
1923
1924 /* For legacy code (SSH-1 and -2 packet construction used to be separate) */
1925 #define ssh2_pkt_ensure(pkt, length) ssh_pkt_ensure(pkt, length)
1926 #define ssh2_pkt_adddata(pkt, data, len) ssh_pkt_adddata(pkt, data, len)
1927 #define ssh2_pkt_addbyte(pkt, byte) ssh_pkt_addbyte(pkt, byte)
1928 #define ssh2_pkt_adduint32(pkt, value) ssh_pkt_adduint32(pkt, value)
1929 #define ssh2_pkt_addstring_start(pkt) ssh_pkt_addstring_start(pkt)
1930 #define ssh2_pkt_addstring_str(pkt, data) ssh_pkt_addstring_str(pkt, data)
1931 #define ssh2_pkt_addstring_data(pkt, data, len) ssh_pkt_addstring_data(pkt, data, len)
1932 #define ssh2_pkt_addstring(pkt, data) ssh_pkt_addstring(pkt, data)
1933
1934 static struct Packet *ssh2_pkt_init(int pkt_type)
1935 {
1936 struct Packet *pkt = ssh_new_packet();
1937 pkt->length = 5; /* space for packet length + padding length */
1938 pkt->forcepad = 0;
1939 ssh_pkt_addbyte(pkt, (unsigned char) pkt_type);
1940 pkt->body = pkt->data + pkt->length; /* after packet type */
1941 return pkt;
1942 }
1943
1944 /*
1945 * Construct an SSH-2 final-form packet: compress it, encrypt it,
1946 * put the MAC on it. Final packet, ready to be sent, is stored in
1947 * pkt->data. Total length is returned.
1948 */
1949 static int ssh2_pkt_construct(Ssh ssh, struct Packet *pkt)
1950 {
1951 int cipherblk, maclen, padding, i;
1952
1953 if (ssh->logctx)
1954 log_packet(ssh->logctx, PKT_OUTGOING, pkt->data[5],
1955 ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx, pkt->data[5]),
1956 pkt->body, pkt->length - (pkt->body - pkt->data),
1957 pkt->nblanks, pkt->blanks, &ssh->v2_outgoing_sequence);
1958 sfree(pkt->blanks); pkt->blanks = NULL;
1959 pkt->nblanks = 0;
1960
1961 /*
1962 * Compress packet payload.
1963 */
1964 {
1965 unsigned char *newpayload;
1966 int newlen;
1967 if (ssh->cscomp &&
1968 ssh->cscomp->compress(ssh->cs_comp_ctx, pkt->data + 5,
1969 pkt->length - 5,
1970 &newpayload, &newlen)) {
1971 pkt->length = 5;
1972 ssh2_pkt_adddata(pkt, newpayload, newlen);
1973 sfree(newpayload);
1974 }
1975 }
1976
1977 /*
1978 * Add padding. At least four bytes, and must also bring total
1979 * length (minus MAC) up to a multiple of the block size.
1980 * If pkt->forcepad is set, make sure the packet is at least that size
1981 * after padding.
1982 */
1983 cipherblk = ssh->cscipher ? ssh->cscipher->blksize : 8; /* block size */
1984 cipherblk = cipherblk < 8 ? 8 : cipherblk; /* or 8 if blksize < 8 */
1985 padding = 4;
1986 if (pkt->length + padding < pkt->forcepad)
1987 padding = pkt->forcepad - pkt->length;
1988 padding +=
1989 (cipherblk - (pkt->length + padding) % cipherblk) % cipherblk;
1990 assert(padding <= 255);
1991 maclen = ssh->csmac ? ssh->csmac->len : 0;
1992 ssh2_pkt_ensure(pkt, pkt->length + padding + maclen);
1993 pkt->data[4] = padding;
1994 for (i = 0; i < padding; i++)
1995 pkt->data[pkt->length + i] = random_byte();
1996 PUT_32BIT(pkt->data, pkt->length + padding - 4);
1997 if (ssh->csmac)
1998 ssh->csmac->generate(ssh->cs_mac_ctx, pkt->data,
1999 pkt->length + padding,
2000 ssh->v2_outgoing_sequence);
2001 ssh->v2_outgoing_sequence++; /* whether or not we MACed */
2002
2003 if (ssh->cscipher)
2004 ssh->cscipher->encrypt(ssh->cs_cipher_ctx,
2005 pkt->data, pkt->length + padding);
2006
2007 pkt->encrypted_len = pkt->length + padding;
2008
2009 /* Ready-to-send packet starts at pkt->data. We return length. */
2010 return pkt->length + padding + maclen;
2011 }
2012
2013 /*
2014 * Routines called from the main SSH code to send packets. There
2015 * are quite a few of these, because we have two separate
2016 * mechanisms for delaying the sending of packets:
2017 *
2018 * - In order to send an IGNORE message and a password message in
2019 * a single fixed-length blob, we require the ability to
2020 * concatenate the encrypted forms of those two packets _into_ a
2021 * single blob and then pass it to our <network.h> transport
2022 * layer in one go. Hence, there's a deferment mechanism which
2023 * works after packet encryption.
2024 *
2025 * - In order to avoid sending any connection-layer messages
2026 * during repeat key exchange, we have to queue up any such
2027 * outgoing messages _before_ they are encrypted (and in
2028 * particular before they're allocated sequence numbers), and
2029 * then send them once we've finished.
2030 *
2031 * I call these mechanisms `defer' and `queue' respectively, so as
2032 * to distinguish them reasonably easily.
2033 *
2034 * The functions send_noqueue() and defer_noqueue() free the packet
2035 * structure they are passed. Every outgoing packet goes through
2036 * precisely one of these functions in its life; packets passed to
2037 * ssh2_pkt_send() or ssh2_pkt_defer() either go straight to one of
2038 * these or get queued, and then when the queue is later emptied
2039 * the packets are all passed to defer_noqueue().
2040 *
2041 * When using a CBC-mode cipher, it's necessary to ensure that an
2042 * attacker can't provide data to be encrypted using an IV that they
2043 * know. We ensure this by prefixing each packet that might contain
2044 * user data with an SSH_MSG_IGNORE. This is done using the deferral
2045 * mechanism, so in this case send_noqueue() ends up redirecting to
2046 * defer_noqueue(). If you don't like this inefficiency, don't use
2047 * CBC.
2048 */
2049
2050 static void ssh2_pkt_defer_noqueue(Ssh, struct Packet *, int);
2051 static void ssh_pkt_defersend(Ssh);
2052
2053 /*
2054 * Send an SSH-2 packet immediately, without queuing or deferring.
2055 */
2056 static void ssh2_pkt_send_noqueue(Ssh ssh, struct Packet *pkt)
2057 {
2058 int len;
2059 int backlog;
2060 if (ssh->cscipher != NULL && (ssh->cscipher->flags & SSH_CIPHER_IS_CBC)) {
2061 /* We need to send two packets, so use the deferral mechanism. */
2062 ssh2_pkt_defer_noqueue(ssh, pkt, FALSE);
2063 ssh_pkt_defersend(ssh);
2064 return;
2065 }
2066 len = ssh2_pkt_construct(ssh, pkt);
2067 backlog = s_write(ssh, pkt->data, len);
2068 if (backlog > SSH_MAX_BACKLOG)
2069 ssh_throttle_all(ssh, 1, backlog);
2070
2071 ssh->outgoing_data_size += pkt->encrypted_len;
2072 if (!ssh->kex_in_progress &&
2073 ssh->max_data_size != 0 &&
2074 ssh->outgoing_data_size > ssh->max_data_size)
2075 do_ssh2_transport(ssh, "too much data sent", -1, NULL);
2076
2077 ssh_free_packet(pkt);
2078 }
2079
2080 /*
2081 * Defer an SSH-2 packet.
2082 */
2083 static void ssh2_pkt_defer_noqueue(Ssh ssh, struct Packet *pkt, int noignore)
2084 {
2085 int len;
2086 if (ssh->cscipher != NULL && (ssh->cscipher->flags & SSH_CIPHER_IS_CBC) &&
2087 ssh->deferred_len == 0 && !noignore &&
2088 !(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE)) {
2089 /*
2090 * Interpose an SSH_MSG_IGNORE to ensure that user data don't
2091 * get encrypted with a known IV.
2092 */
2093 struct Packet *ipkt = ssh2_pkt_init(SSH2_MSG_IGNORE);
2094 ssh2_pkt_addstring_start(ipkt);
2095 ssh2_pkt_defer_noqueue(ssh, ipkt, TRUE);
2096 }
2097 len = ssh2_pkt_construct(ssh, pkt);
2098 if (ssh->deferred_len + len > ssh->deferred_size) {
2099 ssh->deferred_size = ssh->deferred_len + len + 128;
2100 ssh->deferred_send_data = sresize(ssh->deferred_send_data,
2101 ssh->deferred_size,
2102 unsigned char);
2103 }
2104 memcpy(ssh->deferred_send_data + ssh->deferred_len, pkt->data, len);
2105 ssh->deferred_len += len;
2106 ssh->deferred_data_size += pkt->encrypted_len;
2107 ssh_free_packet(pkt);
2108 }
2109
2110 /*
2111 * Queue an SSH-2 packet.
2112 */
2113 static void ssh2_pkt_queue(Ssh ssh, struct Packet *pkt)
2114 {
2115 assert(ssh->queueing);
2116
2117 if (ssh->queuelen >= ssh->queuesize) {
2118 ssh->queuesize = ssh->queuelen + 32;
2119 ssh->queue = sresize(ssh->queue, ssh->queuesize, struct Packet *);
2120 }
2121
2122 ssh->queue[ssh->queuelen++] = pkt;
2123 }
2124
2125 /*
2126 * Either queue or send a packet, depending on whether queueing is
2127 * set.
2128 */
2129 static void ssh2_pkt_send(Ssh ssh, struct Packet *pkt)
2130 {
2131 if (ssh->queueing)
2132 ssh2_pkt_queue(ssh, pkt);
2133 else
2134 ssh2_pkt_send_noqueue(ssh, pkt);
2135 }
2136
2137 /*
2138 * Either queue or defer a packet, depending on whether queueing is
2139 * set.
2140 */
2141 static void ssh2_pkt_defer(Ssh ssh, struct Packet *pkt)
2142 {
2143 if (ssh->queueing)
2144 ssh2_pkt_queue(ssh, pkt);
2145 else
2146 ssh2_pkt_defer_noqueue(ssh, pkt, FALSE);
2147 }
2148
2149 /*
2150 * Send the whole deferred data block constructed by
2151 * ssh2_pkt_defer() or SSH-1's defer_packet().
2152 *
2153 * The expected use of the defer mechanism is that you call
2154 * ssh2_pkt_defer() a few times, then call ssh_pkt_defersend(). If
2155 * not currently queueing, this simply sets up deferred_send_data
2156 * and then sends it. If we _are_ currently queueing, the calls to
2157 * ssh2_pkt_defer() put the deferred packets on to the queue
2158 * instead, and therefore ssh_pkt_defersend() has no deferred data
2159 * to send. Hence, there's no need to make it conditional on
2160 * ssh->queueing.
2161 */
2162 static void ssh_pkt_defersend(Ssh ssh)
2163 {
2164 int backlog;
2165 backlog = s_write(ssh, ssh->deferred_send_data, ssh->deferred_len);
2166 ssh->deferred_len = ssh->deferred_size = 0;
2167 sfree(ssh->deferred_send_data);
2168 ssh->deferred_send_data = NULL;
2169 if (backlog > SSH_MAX_BACKLOG)
2170 ssh_throttle_all(ssh, 1, backlog);
2171
2172 ssh->outgoing_data_size += ssh->deferred_data_size;
2173 if (!ssh->kex_in_progress &&
2174 ssh->max_data_size != 0 &&
2175 ssh->outgoing_data_size > ssh->max_data_size)
2176 do_ssh2_transport(ssh, "too much data sent", -1, NULL);
2177 ssh->deferred_data_size = 0;
2178 }
2179
2180 /*
2181 * Send a packet whose length needs to be disguised (typically
2182 * passwords or keyboard-interactive responses).
2183 */
2184 static void ssh2_pkt_send_with_padding(Ssh ssh, struct Packet *pkt,
2185 int padsize)
2186 {
2187 #if 0
2188 if (0) {
2189 /*
2190 * The simplest way to do this is to adjust the
2191 * variable-length padding field in the outgoing packet.
2192 *
2193 * Currently compiled out, because some Cisco SSH servers
2194 * don't like excessively padded packets (bah, why's it
2195 * always Cisco?)
2196 */
2197 pkt->forcepad = padsize;
2198 ssh2_pkt_send(ssh, pkt);
2199 } else
2200 #endif
2201 {
2202 /*
2203 * If we can't do that, however, an alternative approach is
2204 * to use the pkt_defer mechanism to bundle the packet
2205 * tightly together with an SSH_MSG_IGNORE such that their
2206 * combined length is a constant. So first we construct the
2207 * final form of this packet and defer its sending.
2208 */
2209 ssh2_pkt_defer(ssh, pkt);
2210
2211 /*
2212 * Now construct an SSH_MSG_IGNORE which includes a string
2213 * that's an exact multiple of the cipher block size. (If
2214 * the cipher is NULL so that the block size is
2215 * unavailable, we don't do this trick at all, because we
2216 * gain nothing by it.)
2217 */
2218 if (ssh->cscipher &&
2219 !(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE)) {
2220 int stringlen, i;
2221
2222 stringlen = (256 - ssh->deferred_len);
2223 stringlen += ssh->cscipher->blksize - 1;
2224 stringlen -= (stringlen % ssh->cscipher->blksize);
2225 if (ssh->cscomp) {
2226 /*
2227 * Temporarily disable actual compression, so we
2228 * can guarantee to get this string exactly the
2229 * length we want it. The compression-disabling
2230 * routine should return an integer indicating how
2231 * many bytes we should adjust our string length
2232 * by.
2233 */
2234 stringlen -=
2235 ssh->cscomp->disable_compression(ssh->cs_comp_ctx);
2236 }
2237 pkt = ssh2_pkt_init(SSH2_MSG_IGNORE);
2238 ssh2_pkt_addstring_start(pkt);
2239 for (i = 0; i < stringlen; i++) {
2240 char c = (char) random_byte();
2241 ssh2_pkt_addstring_data(pkt, &c, 1);
2242 }
2243 ssh2_pkt_defer(ssh, pkt);
2244 }
2245 ssh_pkt_defersend(ssh);
2246 }
2247 }
2248
2249 /*
2250 * Send all queued SSH-2 packets. We send them by means of
2251 * ssh2_pkt_defer_noqueue(), in case they included a pair of
2252 * packets that needed to be lumped together.
2253 */
2254 static void ssh2_pkt_queuesend(Ssh ssh)
2255 {
2256 int i;
2257
2258 assert(!ssh->queueing);
2259
2260 for (i = 0; i < ssh->queuelen; i++)
2261 ssh2_pkt_defer_noqueue(ssh, ssh->queue[i], FALSE);
2262 ssh->queuelen = 0;
2263
2264 ssh_pkt_defersend(ssh);
2265 }
2266
2267 #if 0
2268 void bndebug(char *string, Bignum b)
2269 {
2270 unsigned char *p;
2271 int i, len;
2272 p = ssh2_mpint_fmt(b, &len);
2273 debug(("%s", string));
2274 for (i = 0; i < len; i++)
2275 debug((" %02x", p[i]));
2276 debug(("\n"));
2277 sfree(p);
2278 }
2279 #endif
2280
2281 static void hash_mpint(const struct ssh_hash *h, void *s, Bignum b)
2282 {
2283 unsigned char *p;
2284 int len;
2285 p = ssh2_mpint_fmt(b, &len);
2286 hash_string(h, s, p, len);
2287 sfree(p);
2288 }
2289
2290 /*
2291 * Packet decode functions for both SSH-1 and SSH-2.
2292 */
2293 static unsigned long ssh_pkt_getuint32(struct Packet *pkt)
2294 {
2295 unsigned long value;
2296 if (pkt->length - pkt->savedpos < 4)
2297 return 0; /* arrgh, no way to decline (FIXME?) */
2298 value = GET_32BIT(pkt->body + pkt->savedpos);
2299 pkt->savedpos += 4;
2300 return value;
2301 }
2302 static int ssh2_pkt_getbool(struct Packet *pkt)
2303 {
2304 unsigned long value;
2305 if (pkt->length - pkt->savedpos < 1)
2306 return 0; /* arrgh, no way to decline (FIXME?) */
2307 value = pkt->body[pkt->savedpos] != 0;
2308 pkt->savedpos++;
2309 return value;
2310 }
2311 static void ssh_pkt_getstring(struct Packet *pkt, char **p, int *length)
2312 {
2313 int len;
2314 *p = NULL;
2315 *length = 0;
2316 if (pkt->length - pkt->savedpos < 4)
2317 return;
2318 len = GET_32BIT(pkt->body + pkt->savedpos);
2319 if (len < 0)
2320 return;
2321 *length = len;
2322 pkt->savedpos += 4;
2323 if (pkt->length - pkt->savedpos < *length)
2324 return;
2325 *p = (char *)(pkt->body + pkt->savedpos);
2326 pkt->savedpos += *length;
2327 }
2328 static void *ssh_pkt_getdata(struct Packet *pkt, int length)
2329 {
2330 if (pkt->length - pkt->savedpos < length)
2331 return NULL;
2332 pkt->savedpos += length;
2333 return pkt->body + (pkt->savedpos - length);
2334 }
2335 static int ssh1_pkt_getrsakey(struct Packet *pkt, struct RSAKey *key,
2336 unsigned char **keystr)
2337 {
2338 int j;
2339
2340 j = makekey(pkt->body + pkt->savedpos,
2341 pkt->length - pkt->savedpos,
2342 key, keystr, 0);
2343
2344 if (j < 0)
2345 return FALSE;
2346
2347 pkt->savedpos += j;
2348 assert(pkt->savedpos < pkt->length);
2349
2350 return TRUE;
2351 }
2352 static Bignum ssh1_pkt_getmp(struct Packet *pkt)
2353 {
2354 int j;
2355 Bignum b;
2356
2357 j = ssh1_read_bignum(pkt->body + pkt->savedpos,
2358 pkt->length - pkt->savedpos, &b);
2359
2360 if (j < 0)
2361 return NULL;
2362
2363 pkt->savedpos += j;
2364 return b;
2365 }
2366 static Bignum ssh2_pkt_getmp(struct Packet *pkt)
2367 {
2368 char *p;
2369 int length;
2370 Bignum b;
2371
2372 ssh_pkt_getstring(pkt, &p, &length);
2373 if (!p)
2374 return NULL;
2375 if (p[0] & 0x80)
2376 return NULL;
2377 b = bignum_from_bytes((unsigned char *)p, length);
2378 return b;
2379 }
2380
2381 /*
2382 * Helper function to add an SSH-2 signature blob to a packet.
2383 * Expects to be shown the public key blob as well as the signature
2384 * blob. Normally works just like ssh2_pkt_addstring, but will
2385 * fiddle with the signature packet if necessary for
2386 * BUG_SSH2_RSA_PADDING.
2387 */
2388 static void ssh2_add_sigblob(Ssh ssh, struct Packet *pkt,
2389 void *pkblob_v, int pkblob_len,
2390 void *sigblob_v, int sigblob_len)
2391 {
2392 unsigned char *pkblob = (unsigned char *)pkblob_v;
2393 unsigned char *sigblob = (unsigned char *)sigblob_v;
2394
2395 /* dmemdump(pkblob, pkblob_len); */
2396 /* dmemdump(sigblob, sigblob_len); */
2397
2398 /*
2399 * See if this is in fact an ssh-rsa signature and a buggy
2400 * server; otherwise we can just do this the easy way.
2401 */
2402 if ((ssh->remote_bugs & BUG_SSH2_RSA_PADDING) &&
2403 (GET_32BIT(pkblob) == 7 && !memcmp(pkblob+4, "ssh-rsa", 7))) {
2404 int pos, len, siglen;
2405
2406 /*
2407 * Find the byte length of the modulus.
2408 */
2409
2410 pos = 4+7; /* skip over "ssh-rsa" */
2411 pos += 4 + GET_32BIT(pkblob+pos); /* skip over exponent */
2412 len = GET_32BIT(pkblob+pos); /* find length of modulus */
2413 pos += 4; /* find modulus itself */
2414 while (len > 0 && pkblob[pos] == 0)
2415 len--, pos++;
2416 /* debug(("modulus length is %d\n", len)); */
2417
2418 /*
2419 * Now find the signature integer.
2420 */
2421 pos = 4+7; /* skip over "ssh-rsa" */
2422 siglen = GET_32BIT(sigblob+pos);
2423 /* debug(("signature length is %d\n", siglen)); */
2424
2425 if (len != siglen) {
2426 unsigned char newlen[4];
2427 ssh2_pkt_addstring_start(pkt);
2428 ssh2_pkt_addstring_data(pkt, (char *)sigblob, pos);
2429 /* dmemdump(sigblob, pos); */
2430 pos += 4; /* point to start of actual sig */
2431 PUT_32BIT(newlen, len);
2432 ssh2_pkt_addstring_data(pkt, (char *)newlen, 4);
2433 /* dmemdump(newlen, 4); */
2434 newlen[0] = 0;
2435 while (len-- > siglen) {
2436 ssh2_pkt_addstring_data(pkt, (char *)newlen, 1);
2437 /* dmemdump(newlen, 1); */
2438 }
2439 ssh2_pkt_addstring_data(pkt, (char *)(sigblob+pos), siglen);
2440 /* dmemdump(sigblob+pos, siglen); */
2441 return;
2442 }
2443
2444 /* Otherwise fall through and do it the easy way. */
2445 }
2446
2447 ssh2_pkt_addstring_start(pkt);
2448 ssh2_pkt_addstring_data(pkt, (char *)sigblob, sigblob_len);
2449 }
2450
2451 /*
2452 * Examine the remote side's version string and compare it against
2453 * a list of known buggy implementations.
2454 */
2455 static void ssh_detect_bugs(Ssh ssh, char *vstring)
2456 {
2457 char *imp; /* pointer to implementation part */
2458 imp = vstring;
2459 imp += strcspn(imp, "-");
2460 if (*imp) imp++;
2461 imp += strcspn(imp, "-");
2462 if (*imp) imp++;
2463
2464 ssh->remote_bugs = 0;
2465
2466 /*
2467 * General notes on server version strings:
2468 * - Not all servers reporting "Cisco-1.25" have all the bugs listed
2469 * here -- in particular, we've heard of one that's perfectly happy
2470 * with SSH1_MSG_IGNOREs -- but this string never seems to change,
2471 * so we can't distinguish them.
2472 */
2473 if (conf_get_int(ssh->conf, CONF_sshbug_ignore1) == FORCE_ON ||
2474 (conf_get_int(ssh->conf, CONF_sshbug_ignore1) == AUTO &&
2475 (!strcmp(imp, "1.2.18") || !strcmp(imp, "1.2.19") ||
2476 !strcmp(imp, "1.2.20") || !strcmp(imp, "1.2.21") ||
2477 !strcmp(imp, "1.2.22") || !strcmp(imp, "Cisco-1.25") ||
2478 !strcmp(imp, "OSU_1.4alpha3") || !strcmp(imp, "OSU_1.5alpha4")))) {
2479 /*
2480 * These versions don't support SSH1_MSG_IGNORE, so we have
2481 * to use a different defence against password length
2482 * sniffing.
2483 */
2484 ssh->remote_bugs |= BUG_CHOKES_ON_SSH1_IGNORE;
2485 logevent("We believe remote version has SSH-1 ignore bug");
2486 }
2487
2488 if (conf_get_int(ssh->conf, CONF_sshbug_plainpw1) == FORCE_ON ||
2489 (conf_get_int(ssh->conf, CONF_sshbug_plainpw1) == AUTO &&
2490 (!strcmp(imp, "Cisco-1.25") || !strcmp(imp, "OSU_1.4alpha3")))) {
2491 /*
2492 * These versions need a plain password sent; they can't
2493 * handle having a null and a random length of data after
2494 * the password.
2495 */
2496 ssh->remote_bugs |= BUG_NEEDS_SSH1_PLAIN_PASSWORD;
2497 logevent("We believe remote version needs a plain SSH-1 password");
2498 }
2499
2500 if (conf_get_int(ssh->conf, CONF_sshbug_rsa1) == FORCE_ON ||
2501 (conf_get_int(ssh->conf, CONF_sshbug_rsa1) == AUTO &&
2502 (!strcmp(imp, "Cisco-1.25")))) {
2503 /*
2504 * These versions apparently have no clue whatever about
2505 * RSA authentication and will panic and die if they see
2506 * an AUTH_RSA message.
2507 */
2508 ssh->remote_bugs |= BUG_CHOKES_ON_RSA;
2509 logevent("We believe remote version can't handle SSH-1 RSA authentication");
2510 }
2511
2512 if (conf_get_int(ssh->conf, CONF_sshbug_hmac2) == FORCE_ON ||
2513 (conf_get_int(ssh->conf, CONF_sshbug_hmac2) == AUTO &&
2514 !wc_match("* VShell", imp) &&
2515 (wc_match("2.1.0*", imp) || wc_match("2.0.*", imp) ||
2516 wc_match("2.2.0*", imp) || wc_match("2.3.0*", imp) ||
2517 wc_match("2.1 *", imp)))) {
2518 /*
2519 * These versions have the HMAC bug.
2520 */
2521 ssh->remote_bugs |= BUG_SSH2_HMAC;
2522 logevent("We believe remote version has SSH-2 HMAC bug");
2523 }
2524
2525 if (conf_get_int(ssh->conf, CONF_sshbug_derivekey2) == FORCE_ON ||
2526 (conf_get_int(ssh->conf, CONF_sshbug_derivekey2) == AUTO &&
2527 !wc_match("* VShell", imp) &&
2528 (wc_match("2.0.0*", imp) || wc_match("2.0.10*", imp) ))) {
2529 /*
2530 * These versions have the key-derivation bug (failing to
2531 * include the literal shared secret in the hashes that
2532 * generate the keys).
2533 */
2534 ssh->remote_bugs |= BUG_SSH2_DERIVEKEY;
2535 logevent("We believe remote version has SSH-2 key-derivation bug");
2536 }
2537
2538 if (conf_get_int(ssh->conf, CONF_sshbug_rsapad2) == FORCE_ON ||
2539 (conf_get_int(ssh->conf, CONF_sshbug_rsapad2) == AUTO &&
2540 (wc_match("OpenSSH_2.[5-9]*", imp) ||
2541 wc_match("OpenSSH_3.[0-2]*", imp)))) {
2542 /*
2543 * These versions have the SSH-2 RSA padding bug.
2544 */
2545 ssh->remote_bugs |= BUG_SSH2_RSA_PADDING;
2546 logevent("We believe remote version has SSH-2 RSA padding bug");
2547 }
2548
2549 if (conf_get_int(ssh->conf, CONF_sshbug_pksessid2) == FORCE_ON ||
2550 (conf_get_int(ssh->conf, CONF_sshbug_pksessid2) == AUTO &&
2551 wc_match("OpenSSH_2.[0-2]*", imp))) {
2552 /*
2553 * These versions have the SSH-2 session-ID bug in
2554 * public-key authentication.
2555 */
2556 ssh->remote_bugs |= BUG_SSH2_PK_SESSIONID;
2557 logevent("We believe remote version has SSH-2 public-key-session-ID bug");
2558 }
2559
2560 if (conf_get_int(ssh->conf, CONF_sshbug_rekey2) == FORCE_ON ||
2561 (conf_get_int(ssh->conf, CONF_sshbug_rekey2) == AUTO &&
2562 (wc_match("DigiSSH_2.0", imp) ||
2563 wc_match("OpenSSH_2.[0-4]*", imp) ||
2564 wc_match("OpenSSH_2.5.[0-3]*", imp) ||
2565 wc_match("Sun_SSH_1.0", imp) ||
2566 wc_match("Sun_SSH_1.0.1", imp) ||
2567 /* All versions <= 1.2.6 (they changed their format in 1.2.7) */
2568 wc_match("WeOnlyDo-*", imp)))) {
2569 /*
2570 * These versions have the SSH-2 rekey bug.
2571 */
2572 ssh->remote_bugs |= BUG_SSH2_REKEY;
2573 logevent("We believe remote version has SSH-2 rekey bug");
2574 }
2575
2576 if (conf_get_int(ssh->conf, CONF_sshbug_maxpkt2) == FORCE_ON ||
2577 (conf_get_int(ssh->conf, CONF_sshbug_maxpkt2) == AUTO &&
2578 (wc_match("1.36_sshlib GlobalSCAPE", imp) ||
2579 wc_match("1.36 sshlib: GlobalScape", imp)))) {
2580 /*
2581 * This version ignores our makpkt and needs to be throttled.
2582 */
2583 ssh->remote_bugs |= BUG_SSH2_MAXPKT;
2584 logevent("We believe remote version ignores SSH-2 maximum packet size");
2585 }
2586
2587 if (conf_get_int(ssh->conf, CONF_sshbug_ignore2) == FORCE_ON) {
2588 /*
2589 * Servers that don't support SSH2_MSG_IGNORE. Currently,
2590 * none detected automatically.
2591 */
2592 ssh->remote_bugs |= BUG_CHOKES_ON_SSH2_IGNORE;
2593 logevent("We believe remote version has SSH-2 ignore bug");
2594 }
2595
2596 if (conf_get_int(ssh->conf, CONF_sshbug_winadj) == FORCE_ON) {
2597 /*
2598 * Servers that don't support our winadj request for one
2599 * reason or another. Currently, none detected automatically.
2600 */
2601 ssh->remote_bugs |= BUG_CHOKES_ON_WINADJ;
2602 logevent("We believe remote version has winadj bug");
2603 }
2604 }
2605
2606 /*
2607 * The `software version' part of an SSH version string is required
2608 * to contain no spaces or minus signs.
2609 */
2610 static void ssh_fix_verstring(char *str)
2611 {
2612 /* Eat "SSH-<protoversion>-". */
2613 assert(*str == 'S'); str++;
2614 assert(*str == 'S'); str++;
2615 assert(*str == 'H'); str++;
2616 assert(*str == '-'); str++;
2617 while (*str && *str != '-') str++;
2618 assert(*str == '-'); str++;
2619
2620 /* Convert minus signs and spaces in the remaining string into
2621 * underscores. */
2622 while (*str) {
2623 if (*str == '-' || *str == ' ')
2624 *str = '_';
2625 str++;
2626 }
2627 }
2628
2629 /*
2630 * Send an appropriate SSH version string.
2631 */
2632 static void ssh_send_verstring(Ssh ssh, char *svers)
2633 {
2634 char *verstring;
2635
2636 if (ssh->version == 2) {
2637 /*
2638 * Construct a v2 version string.
2639 */
2640 verstring = dupprintf("SSH-2.0-%s\015\012", sshver);
2641 } else {
2642 /*
2643 * Construct a v1 version string.
2644 */
2645 verstring = dupprintf("SSH-%s-%s\012",
2646 (ssh_versioncmp(svers, "1.5") <= 0 ?
2647 svers : "1.5"),
2648 sshver);
2649 }
2650
2651 ssh_fix_verstring(verstring);
2652
2653 if (ssh->version == 2) {
2654 size_t len;
2655 /*
2656 * Record our version string.
2657 */
2658 len = strcspn(verstring, "\015\012");
2659 ssh->v_c = snewn(len + 1, char);
2660 memcpy(ssh->v_c, verstring, len);
2661 ssh->v_c[len] = 0;
2662 }
2663
2664 logeventf(ssh, "We claim version: %.*s",
2665 strcspn(verstring, "\015\012"), verstring);
2666 s_write(ssh, verstring, strlen(verstring));
2667 sfree(verstring);
2668 }
2669
2670 static int do_ssh_init(Ssh ssh, unsigned char c)
2671 {
2672 struct do_ssh_init_state {
2673 int crLine;
2674 int vslen;
2675 char version[10];
2676 char *vstring;
2677 int vstrsize;
2678 int i;
2679 int proto1, proto2;
2680 };
2681 crState(do_ssh_init_state);
2682
2683 crBeginState;
2684
2685 /* Search for a line beginning with the string "SSH-" in the input. */
2686 for (;;) {
2687 if (c != 'S') goto no;
2688 crReturn(1);
2689 if (c != 'S') goto no;
2690 crReturn(1);
2691 if (c != 'H') goto no;
2692 crReturn(1);
2693 if (c != '-') goto no;
2694 break;
2695 no:
2696 while (c != '\012')
2697 crReturn(1);
2698 crReturn(1);
2699 }
2700
2701 s->vstrsize = 16;
2702 s->vstring = snewn(s->vstrsize, char);
2703 strcpy(s->vstring, "SSH-");
2704 s->vslen = 4;
2705 s->i = 0;
2706 while (1) {
2707 crReturn(1); /* get another char */
2708 if (s->vslen >= s->vstrsize - 1) {
2709 s->vstrsize += 16;
2710 s->vstring = sresize(s->vstring, s->vstrsize, char);
2711 }
2712 s->vstring[s->vslen++] = c;
2713 if (s->i >= 0) {
2714 if (c == '-') {
2715 s->version[s->i] = '\0';
2716 s->i = -1;
2717 } else if (s->i < sizeof(s->version) - 1)
2718 s->version[s->i++] = c;
2719 } else if (c == '\012')
2720 break;
2721 }
2722
2723 ssh->agentfwd_enabled = FALSE;
2724 ssh->rdpkt2_state.incoming_sequence = 0;
2725
2726 s->vstring[s->vslen] = 0;
2727 s->vstring[strcspn(s->vstring, "\015\012")] = '\0';/* remove EOL chars */
2728 logeventf(ssh, "Server version: %s", s->vstring);
2729 ssh_detect_bugs(ssh, s->vstring);
2730
2731 /*
2732 * Decide which SSH protocol version to support.
2733 */
2734
2735 /* Anything strictly below "2.0" means protocol 1 is supported. */
2736 s->proto1 = ssh_versioncmp(s->version, "2.0") < 0;
2737 /* Anything greater or equal to "1.99" means protocol 2 is supported. */
2738 s->proto2 = ssh_versioncmp(s->version, "1.99") >= 0;
2739
2740 if (conf_get_int(ssh->conf, CONF_sshprot) == 0 && !s->proto1) {
2741 bombout(("SSH protocol version 1 required by user but not provided by server"));
2742 crStop(0);
2743 }
2744 if (conf_get_int(ssh->conf, CONF_sshprot) == 3 && !s->proto2) {
2745 bombout(("SSH protocol version 2 required by user but not provided by server"));
2746 crStop(0);
2747 }
2748
2749 if (s->proto2 && (conf_get_int(ssh->conf, CONF_sshprot) >= 2 || !s->proto1))
2750 ssh->version = 2;
2751 else
2752 ssh->version = 1;
2753
2754 logeventf(ssh, "Using SSH protocol version %d", ssh->version);
2755
2756 /* Send the version string, if we haven't already */
2757 if (conf_get_int(ssh->conf, CONF_sshprot) != 3)
2758 ssh_send_verstring(ssh, s->version);
2759
2760 if (ssh->version == 2) {
2761 size_t len;
2762 /*
2763 * Record their version string.
2764 */
2765 len = strcspn(s->vstring, "\015\012");
2766 ssh->v_s = snewn(len + 1, char);
2767 memcpy(ssh->v_s, s->vstring, len);
2768 ssh->v_s[len] = 0;
2769
2770 /*
2771 * Initialise SSH-2 protocol.
2772 */
2773 ssh->protocol = ssh2_protocol;
2774 ssh2_protocol_setup(ssh);
2775 ssh->s_rdpkt = ssh2_rdpkt;
2776 } else {
2777 /*
2778 * Initialise SSH-1 protocol.
2779 */
2780 ssh->protocol = ssh1_protocol;
2781 ssh1_protocol_setup(ssh);
2782 ssh->s_rdpkt = ssh1_rdpkt;
2783 }
2784 if (ssh->version == 2)
2785 do_ssh2_transport(ssh, NULL, -1, NULL);
2786
2787 update_specials_menu(ssh->frontend);
2788 ssh->state = SSH_STATE_BEFORE_SIZE;
2789 ssh->pinger = pinger_new(ssh->conf, &ssh_backend, ssh);
2790
2791 sfree(s->vstring);
2792
2793 crFinish(0);
2794 }
2795
2796 static void ssh_process_incoming_data(Ssh ssh,
2797 unsigned char **data, int *datalen)
2798 {
2799 struct Packet *pktin;
2800
2801 pktin = ssh->s_rdpkt(ssh, data, datalen);
2802 if (pktin) {
2803 ssh->protocol(ssh, NULL, 0, pktin);
2804 ssh_free_packet(pktin);
2805 }
2806 }
2807
2808 static void ssh_queue_incoming_data(Ssh ssh,
2809 unsigned char **data, int *datalen)
2810 {
2811 bufchain_add(&ssh->queued_incoming_data, *data, *datalen);
2812 *data += *datalen;
2813 *datalen = 0;
2814 }
2815
2816 static void ssh_process_queued_incoming_data(Ssh ssh)
2817 {
2818 void *vdata;
2819 unsigned char *data;
2820 int len, origlen;
2821
2822 while (!ssh->frozen && bufchain_size(&ssh->queued_incoming_data)) {
2823 bufchain_prefix(&ssh->queued_incoming_data, &vdata, &len);
2824 data = vdata;
2825 origlen = len;
2826
2827 while (!ssh->frozen && len > 0)
2828 ssh_process_incoming_data(ssh, &data, &len);
2829
2830 if (origlen > len)
2831 bufchain_consume(&ssh->queued_incoming_data, origlen - len);
2832 }
2833 }
2834
2835 static void ssh_set_frozen(Ssh ssh, int frozen)
2836 {
2837 if (ssh->s)
2838 sk_set_frozen(ssh->s, frozen);
2839 ssh->frozen = frozen;
2840 }
2841
2842 static void ssh_gotdata(Ssh ssh, unsigned char *data, int datalen)
2843 {
2844 /* Log raw data, if we're in that mode. */
2845 if (ssh->logctx)
2846 log_packet(ssh->logctx, PKT_INCOMING, -1, NULL, data, datalen,
2847 0, NULL, NULL);
2848
2849 crBegin(ssh->ssh_gotdata_crstate);
2850
2851 /*
2852 * To begin with, feed the characters one by one to the
2853 * protocol initialisation / selection function do_ssh_init().
2854 * When that returns 0, we're done with the initial greeting
2855 * exchange and can move on to packet discipline.
2856 */
2857 while (1) {
2858 int ret; /* need not be kept across crReturn */
2859 if (datalen == 0)
2860 crReturnV; /* more data please */
2861 ret = do_ssh_init(ssh, *data);
2862 data++;
2863 datalen--;
2864 if (ret == 0)
2865 break;
2866 }
2867
2868 /*
2869 * We emerge from that loop when the initial negotiation is
2870 * over and we have selected an s_rdpkt function. Now pass
2871 * everything to s_rdpkt, and then pass the resulting packets
2872 * to the proper protocol handler.
2873 */
2874
2875 while (1) {
2876 while (bufchain_size(&ssh->queued_incoming_data) > 0 || datalen > 0) {
2877 if (ssh->frozen) {
2878 ssh_queue_incoming_data(ssh, &data, &datalen);
2879 /* This uses up all data and cannot cause anything interesting
2880 * to happen; indeed, for anything to happen at all, we must
2881 * return, so break out. */
2882 break;
2883 } else if (bufchain_size(&ssh->queued_incoming_data) > 0) {
2884 /* This uses up some or all data, and may freeze the
2885 * session. */
2886 ssh_process_queued_incoming_data(ssh);
2887 } else {
2888 /* This uses up some or all data, and may freeze the
2889 * session. */
2890 ssh_process_incoming_data(ssh, &data, &datalen);
2891 }
2892 /* FIXME this is probably EBW. */
2893 if (ssh->state == SSH_STATE_CLOSED)
2894 return;
2895 }
2896 /* We're out of data. Go and get some more. */
2897 crReturnV;
2898 }
2899 crFinishV;
2900 }
2901
2902 static int ssh_do_close(Ssh ssh, int notify_exit)
2903 {
2904 int ret = 0;
2905 struct ssh_channel *c;
2906
2907 ssh->state = SSH_STATE_CLOSED;
2908 expire_timer_context(ssh);
2909 if (ssh->s) {
2910 sk_close(ssh->s);
2911 ssh->s = NULL;
2912 if (notify_exit)
2913 notify_remote_exit(ssh->frontend);
2914 else
2915 ret = 1;
2916 }
2917 /*
2918 * Now we must shut down any port- and X-forwarded channels going
2919 * through this connection.
2920 */
2921 if (ssh->channels) {
2922 while (NULL != (c = index234(ssh->channels, 0))) {
2923 switch (c->type) {
2924 case CHAN_X11:
2925 x11_close(c->u.x11.s);
2926 break;
2927 case CHAN_SOCKDATA:
2928 case CHAN_SOCKDATA_DORMANT:
2929 pfd_close(c->u.pfd.s);
2930 break;
2931 }
2932 del234(ssh->channels, c); /* moving next one to index 0 */
2933 if (ssh->version == 2)
2934 bufchain_clear(&c->v.v2.outbuffer);
2935 sfree(c);
2936 }
2937 }
2938 /*
2939 * Go through port-forwardings, and close any associated
2940 * listening sockets.
2941 */
2942 if (ssh->portfwds) {
2943 struct ssh_portfwd *pf;
2944 while (NULL != (pf = index234(ssh->portfwds, 0))) {
2945 /* Dispose of any listening socket. */
2946 if (pf->local)
2947 pfd_terminate(pf->local);
2948 del234(ssh->portfwds, pf); /* moving next one to index 0 */
2949 free_portfwd(pf);
2950 }
2951 freetree234(ssh->portfwds);
2952 ssh->portfwds = NULL;
2953 }
2954
2955 return ret;
2956 }
2957
2958 static void ssh_log(Plug plug, int type, SockAddr addr, int port,
2959 const char *error_msg, int error_code)
2960 {
2961 Ssh ssh = (Ssh) plug;
2962 char addrbuf[256], *msg;
2963
2964 sk_getaddr(addr, addrbuf, lenof(addrbuf));
2965
2966 if (type == 0)
2967 msg = dupprintf("Connecting to %s port %d", addrbuf, port);
2968 else
2969 msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg);
2970
2971 logevent(msg);
2972 sfree(msg);
2973 }
2974
2975 static int ssh_closing(Plug plug, const char *error_msg, int error_code,
2976 int calling_back)
2977 {
2978 Ssh ssh = (Ssh) plug;
2979 int need_notify = ssh_do_close(ssh, FALSE);
2980
2981 if (!error_msg) {
2982 if (!ssh->close_expected)
2983 error_msg = "Server unexpectedly closed network connection";
2984 else
2985 error_msg = "Server closed network connection";
2986 }
2987
2988 if (ssh->close_expected && ssh->clean_exit && ssh->exitcode < 0)
2989 ssh->exitcode = 0;
2990
2991 if (need_notify)
2992 notify_remote_exit(ssh->frontend);
2993
2994 if (error_msg)
2995 logevent(error_msg);
2996 if (!ssh->close_expected || !ssh->clean_exit)
2997 connection_fatal(ssh->frontend, "%s", error_msg);
2998 return 0;
2999 }
3000
3001 static int ssh_receive(Plug plug, int urgent, char *data, int len)
3002 {
3003 Ssh ssh = (Ssh) plug;
3004 ssh_gotdata(ssh, (unsigned char *)data, len);
3005 if (ssh->state == SSH_STATE_CLOSED) {
3006 ssh_do_close(ssh, TRUE);
3007 return 0;
3008 }
3009 return 1;
3010 }
3011
3012 static void ssh_sent(Plug plug, int bufsize)
3013 {
3014 Ssh ssh = (Ssh) plug;
3015 /*
3016 * If the send backlog on the SSH socket itself clears, we
3017 * should unthrottle the whole world if it was throttled.
3018 */
3019 if (bufsize < SSH_MAX_BACKLOG)
3020 ssh_throttle_all(ssh, 0, bufsize);
3021 }
3022
3023 /*
3024 * Connect to specified host and port.
3025 * Returns an error message, or NULL on success.
3026 * Also places the canonical host name into `realhost'. It must be
3027 * freed by the caller.
3028 */
3029 static const char *connect_to_host(Ssh ssh, char *host, int port,
3030 char **realhost, int nodelay, int keepalive)
3031 {
3032 static const struct plug_function_table fn_table = {
3033 ssh_log,
3034 ssh_closing,
3035 ssh_receive,
3036 ssh_sent,
3037 NULL
3038 };
3039
3040 SockAddr addr;
3041 const char *err;
3042 char *loghost;
3043 int addressfamily, sshprot;
3044
3045 loghost = conf_get_str(ssh->conf, CONF_loghost);
3046 if (*loghost) {
3047 char *colon;
3048
3049 ssh->savedhost = dupstr(loghost);
3050 ssh->savedport = 22; /* default ssh port */
3051
3052 /*
3053 * A colon suffix on savedhost also lets us affect
3054 * savedport.
3055 *
3056 * (FIXME: do something about IPv6 address literals here.)
3057 */
3058 colon = strrchr(ssh->savedhost, ':');
3059 if (colon) {
3060 *colon++ = '\0';
3061 if (*colon)
3062 ssh->savedport = atoi(colon);
3063 }
3064 } else {
3065 ssh->savedhost = dupstr(host);
3066 if (port < 0)
3067 port = 22; /* default ssh port */
3068 ssh->savedport = port;
3069 }
3070
3071 /*
3072 * Try to find host.
3073 */
3074 addressfamily = conf_get_int(ssh->conf, CONF_addressfamily);
3075 logeventf(ssh, "Looking up host \"%s\"%s", host,
3076 (addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" :
3077 (addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" : "")));
3078 addr = name_lookup(host, port, realhost, ssh->conf, addressfamily);
3079 if ((err = sk_addr_error(addr)) != NULL) {
3080 sk_addr_free(addr);
3081 return err;
3082 }
3083 ssh->fullhostname = dupstr(*realhost); /* save in case of GSSAPI */
3084
3085 /*
3086 * Open socket.
3087 */
3088 ssh->fn = &fn_table;
3089 ssh->s = new_connection(addr, *realhost, port,
3090 0, 1, nodelay, keepalive, (Plug) ssh, ssh->conf);
3091 if ((err = sk_socket_error(ssh->s)) != NULL) {
3092 ssh->s = NULL;
3093 notify_remote_exit(ssh->frontend);
3094 return err;
3095 }
3096
3097 /*
3098 * If the SSH version number's fixed, set it now, and if it's SSH-2,
3099 * send the version string too.
3100 */
3101 sshprot = conf_get_int(ssh->conf, CONF_sshprot);
3102 if (sshprot == 0)
3103 ssh->version = 1;
3104 if (sshprot == 3) {
3105 ssh->version = 2;
3106 ssh_send_verstring(ssh, NULL);
3107 }
3108
3109 /*
3110 * loghost, if configured, overrides realhost.
3111 */
3112 if (*loghost) {
3113 sfree(*realhost);
3114 *realhost = dupstr(loghost);
3115 }
3116
3117 return NULL;
3118 }
3119
3120 /*
3121 * Throttle or unthrottle the SSH connection.
3122 */
3123 static void ssh_throttle_conn(Ssh ssh, int adjust)
3124 {
3125 int old_count = ssh->conn_throttle_count;
3126 ssh->conn_throttle_count += adjust;
3127 assert(ssh->conn_throttle_count >= 0);
3128 if (ssh->conn_throttle_count && !old_count) {
3129 ssh_set_frozen(ssh, 1);
3130 } else if (!ssh->conn_throttle_count && old_count) {
3131 ssh_set_frozen(ssh, 0);
3132 }
3133 }
3134
3135 /*
3136 * Throttle or unthrottle _all_ local data streams (for when sends
3137 * on the SSH connection itself back up).
3138 */
3139 static void ssh_throttle_all(Ssh ssh, int enable, int bufsize)
3140 {
3141 int i;
3142 struct ssh_channel *c;
3143
3144 if (enable == ssh->throttled_all)
3145 return;
3146 ssh->throttled_all = enable;
3147 ssh->overall_bufsize = bufsize;
3148 if (!ssh->channels)
3149 return;
3150 for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) {
3151 switch (c->type) {
3152 case CHAN_MAINSESSION:
3153 /*
3154 * This is treated separately, outside the switch.
3155 */
3156 break;
3157 case CHAN_X11:
3158 x11_override_throttle(c->u.x11.s, enable);
3159 break;
3160 case CHAN_AGENT:
3161 /* Agent channels require no buffer management. */
3162 break;
3163 case CHAN_SOCKDATA:
3164 pfd_override_throttle(c->u.pfd.s, enable);
3165 break;
3166 }
3167 }
3168 }
3169
3170 static void ssh_agent_callback(void *sshv, void *reply, int replylen)
3171 {
3172 Ssh ssh = (Ssh) sshv;
3173
3174 ssh->agent_response = reply;
3175 ssh->agent_response_len = replylen;
3176
3177 if (ssh->version == 1)
3178 do_ssh1_login(ssh, NULL, -1, NULL);
3179 else
3180 do_ssh2_authconn(ssh, NULL, -1, NULL);
3181 }
3182
3183 static void ssh_dialog_callback(void *sshv, int ret)
3184 {
3185 Ssh ssh = (Ssh) sshv;
3186
3187 ssh->user_response = ret;
3188
3189 if (ssh->version == 1)
3190 do_ssh1_login(ssh, NULL, -1, NULL);
3191 else
3192 do_ssh2_transport(ssh, NULL, -1, NULL);
3193
3194 /*
3195 * This may have unfrozen the SSH connection, so do a
3196 * queued-data run.
3197 */
3198 ssh_process_queued_incoming_data(ssh);
3199 }
3200
3201 static void ssh_agentf_callback(void *cv, void *reply, int replylen)
3202 {
3203 struct ssh_channel *c = (struct ssh_channel *)cv;
3204 Ssh ssh = c->ssh;
3205 void *sentreply = reply;
3206
3207 if (!sentreply) {
3208 /* Fake SSH_AGENT_FAILURE. */
3209 sentreply = "\0\0\0\1\5";
3210 replylen = 5;
3211 }
3212 if (ssh->version == 2) {
3213 ssh2_add_channel_data(c, sentreply, replylen);
3214 ssh2_try_send(c);
3215 } else {
3216 send_packet(ssh, SSH1_MSG_CHANNEL_DATA,
3217 PKT_INT, c->remoteid,
3218 PKT_INT, replylen,
3219 PKTT_DATA,
3220 PKT_DATA, sentreply, replylen,
3221 PKTT_OTHER,
3222 PKT_END);
3223 }
3224 if (reply)
3225 sfree(reply);
3226 }
3227
3228 /*
3229 * Client-initiated disconnection. Send a DISCONNECT if `wire_reason'
3230 * non-NULL, otherwise just close the connection. `client_reason' == NULL
3231 * => log `wire_reason'.
3232 */
3233 static void ssh_disconnect(Ssh ssh, char *client_reason, char *wire_reason,
3234 int code, int clean_exit)
3235 {
3236 char *error;
3237 if (!client_reason)
3238 client_reason = wire_reason;
3239 if (client_reason)
3240 error = dupprintf("Disconnected: %s", client_reason);
3241 else
3242 error = dupstr("Disconnected");
3243 if (wire_reason) {
3244 if (ssh->version == 1) {
3245 send_packet(ssh, SSH1_MSG_DISCONNECT, PKT_STR, wire_reason,
3246 PKT_END);
3247 } else if (ssh->version == 2) {
3248 struct Packet *pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT);
3249 ssh2_pkt_adduint32(pktout, code);
3250 ssh2_pkt_addstring(pktout, wire_reason);
3251 ssh2_pkt_addstring(pktout, "en"); /* language tag */
3252 ssh2_pkt_send_noqueue(ssh, pktout);
3253 }
3254 }
3255 ssh->close_expected = TRUE;
3256 ssh->clean_exit = clean_exit;
3257 ssh_closing((Plug)ssh, error, 0, 0);
3258 sfree(error);
3259 }
3260
3261 /*
3262 * Handle the key exchange and user authentication phases.
3263 */
3264 static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
3265 struct Packet *pktin)
3266 {
3267 int i, j, ret;
3268 unsigned char cookie[8], *ptr;
3269 struct RSAKey servkey, hostkey;
3270 struct MD5Context md5c;
3271 struct do_ssh1_login_state {
3272 int crLine;
3273 int len;
3274 unsigned char *rsabuf, *keystr1, *keystr2;
3275 unsigned long supported_ciphers_mask, supported_auths_mask;
3276 int tried_publickey, tried_agent;
3277 int tis_auth_refused, ccard_auth_refused;
3278 unsigned char session_id[16];
3279 int cipher_type;
3280 void *publickey_blob;
3281 int publickey_bloblen;
3282 char *publickey_comment;
3283 int publickey_encrypted;
3284 prompts_t *cur_prompt;
3285 char c;
3286 int pwpkt_type;
3287 unsigned char request[5], *response, *p;
3288 int responselen;
3289 int keyi, nkeys;
3290 int authed;
3291 struct RSAKey key;
3292 Bignum challenge;
3293 char *commentp;
3294 int commentlen;
3295 int dlgret;
3296 Filename *keyfile;
3297 };
3298 crState(do_ssh1_login_state);
3299
3300 crBeginState;
3301
3302 if (!pktin)
3303 crWaitUntil(pktin);
3304
3305 if (pktin->type != SSH1_SMSG_PUBLIC_KEY) {
3306 bombout(("Public key packet not received"));
3307 crStop(0);
3308 }
3309
3310 logevent("Received public keys");
3311
3312 ptr = ssh_pkt_getdata(pktin, 8);
3313 if (!ptr) {
3314 bombout(("SSH-1 public key packet stopped before random cookie"));
3315 crStop(0);
3316 }
3317 memcpy(cookie, ptr, 8);
3318
3319 if (!ssh1_pkt_getrsakey(pktin, &servkey, &s->keystr1) ||
3320 !ssh1_pkt_getrsakey(pktin, &hostkey, &s->keystr2)) {
3321 bombout(("Failed to read SSH-1 public keys from public key packet"));
3322 crStop(0);
3323 }
3324
3325 /*
3326 * Log the host key fingerprint.
3327 */
3328 {
3329 char logmsg[80];
3330 logevent("Host key fingerprint is:");
3331 strcpy(logmsg, " ");
3332 hostkey.comment = NULL;
3333 rsa_fingerprint(logmsg + strlen(logmsg),
3334 sizeof(logmsg) - strlen(logmsg), &hostkey);
3335 logevent(logmsg);
3336 }
3337
3338 ssh->v1_remote_protoflags = ssh_pkt_getuint32(pktin);
3339 s->supported_ciphers_mask = ssh_pkt_getuint32(pktin);
3340 s->supported_auths_mask = ssh_pkt_getuint32(pktin);
3341 if ((ssh->remote_bugs & BUG_CHOKES_ON_RSA))
3342 s->supported_auths_mask &= ~(1 << SSH1_AUTH_RSA);
3343
3344 ssh->v1_local_protoflags =
3345 ssh->v1_remote_protoflags & SSH1_PROTOFLAGS_SUPPORTED;
3346 ssh->v1_local_protoflags |= SSH1_PROTOFLAG_SCREEN_NUMBER;
3347
3348 MD5Init(&md5c);
3349 MD5Update(&md5c, s->keystr2, hostkey.bytes);
3350 MD5Update(&md5c, s->keystr1, servkey.bytes);
3351 MD5Update(&md5c, cookie, 8);
3352 MD5Final(s->session_id, &md5c);
3353
3354 for (i = 0; i < 32; i++)
3355 ssh->session_key[i] = random_byte();
3356
3357 /*
3358 * Verify that the `bits' and `bytes' parameters match.
3359 */
3360 if (hostkey.bits > hostkey.bytes * 8 ||
3361 servkey.bits > servkey.bytes * 8) {
3362 bombout(("SSH-1 public keys were badly formatted"));
3363 crStop(0);
3364 }
3365
3366 s->len = (hostkey.bytes > servkey.bytes ? hostkey.bytes : servkey.bytes);
3367
3368 s->rsabuf = snewn(s->len, unsigned char);
3369
3370 /*
3371 * Verify the host key.
3372 */
3373 {
3374 /*
3375 * First format the key into a string.
3376 */
3377 int len = rsastr_len(&hostkey);
3378 char fingerprint[100];
3379 char *keystr = snewn(len, char);
3380 rsastr_fmt(keystr, &hostkey);
3381 rsa_fingerprint(fingerprint, sizeof(fingerprint), &hostkey);
3382
3383 ssh_set_frozen(ssh, 1);
3384 s->dlgret = verify_ssh_host_key(ssh->frontend,
3385 ssh->savedhost, ssh->savedport,
3386 "rsa", keystr, fingerprint,
3387 ssh_dialog_callback, ssh);
3388 sfree(keystr);
3389 if (s->dlgret < 0) {
3390 do {
3391 crReturn(0);
3392 if (pktin) {
3393 bombout(("Unexpected data from server while waiting"
3394 " for user host key response"));
3395 crStop(0);
3396 }
3397 } while (pktin || inlen > 0);
3398 s->dlgret = ssh->user_response;
3399 }
3400 ssh_set_frozen(ssh, 0);
3401
3402 if (s->dlgret == 0) {
3403 ssh_disconnect(ssh, "User aborted at host key verification",
3404 NULL, 0, TRUE);
3405 crStop(0);
3406 }
3407 }
3408
3409 for (i = 0; i < 32; i++) {
3410 s->rsabuf[i] = ssh->session_key[i];
3411 if (i < 16)
3412 s->rsabuf[i] ^= s->session_id[i];
3413 }
3414
3415 if (hostkey.bytes > servkey.bytes) {
3416 ret = rsaencrypt(s->rsabuf, 32, &servkey);
3417 if (ret)
3418 ret = rsaencrypt(s->rsabuf, servkey.bytes, &hostkey);
3419 } else {
3420 ret = rsaencrypt(s->rsabuf, 32, &hostkey);
3421 if (ret)
3422 ret = rsaencrypt(s->rsabuf, hostkey.bytes, &servkey);
3423 }
3424 if (!ret) {
3425 bombout(("SSH-1 public key encryptions failed due to bad formatting"));
3426 crStop(0);
3427 }
3428
3429 logevent("Encrypted session key");
3430
3431 {
3432 int cipher_chosen = 0, warn = 0;
3433 char *cipher_string = NULL;
3434 int i;
3435 for (i = 0; !cipher_chosen && i < CIPHER_MAX; i++) {
3436 int next_cipher = conf_get_int_int(ssh->conf,
3437 CONF_ssh_cipherlist, i);
3438 if (next_cipher == CIPHER_WARN) {
3439 /* If/when we choose a cipher, warn about it */
3440 warn = 1;
3441 } else if (next_cipher == CIPHER_AES) {
3442 /* XXX Probably don't need to mention this. */
3443 logevent("AES not supported in SSH-1, skipping");
3444 } else {
3445 switch (next_cipher) {
3446 case CIPHER_3DES: s->cipher_type = SSH_CIPHER_3DES;
3447 cipher_string = "3DES"; break;
3448 case CIPHER_BLOWFISH: s->cipher_type = SSH_CIPHER_BLOWFISH;
3449 cipher_string = "Blowfish"; break;
3450 case CIPHER_DES: s->cipher_type = SSH_CIPHER_DES;
3451 cipher_string = "single-DES"; break;
3452 }
3453 if (s->supported_ciphers_mask & (1 << s->cipher_type))
3454 cipher_chosen = 1;
3455 }
3456 }
3457 if (!cipher_chosen) {
3458 if ((s->supported_ciphers_mask & (1 << SSH_CIPHER_3DES)) == 0)
3459 bombout(("Server violates SSH-1 protocol by not "
3460 "supporting 3DES encryption"));
3461 else
3462 /* shouldn't happen */
3463 bombout(("No supported ciphers found"));
3464 crStop(0);
3465 }
3466
3467 /* Warn about chosen cipher if necessary. */
3468 if (warn) {
3469 ssh_set_frozen(ssh, 1);
3470 s->dlgret = askalg(ssh->frontend, "cipher", cipher_string,
3471 ssh_dialog_callback, ssh);
3472 if (s->dlgret < 0) {
3473 do {
3474 crReturn(0);
3475 if (pktin) {
3476 bombout(("Unexpected data from server while waiting"
3477 " for user response"));
3478 crStop(0);
3479 }
3480 } while (pktin || inlen > 0);
3481 s->dlgret = ssh->user_response;
3482 }
3483 ssh_set_frozen(ssh, 0);
3484 if (s->dlgret == 0) {
3485 ssh_disconnect(ssh, "User aborted at cipher warning", NULL,
3486 0, TRUE);
3487 crStop(0);
3488 }
3489 }
3490 }
3491
3492 switch (s->cipher_type) {
3493 case SSH_CIPHER_3DES:
3494 logevent("Using 3DES encryption");
3495 break;
3496 case SSH_CIPHER_DES:
3497 logevent("Using single-DES encryption");
3498 break;
3499 case SSH_CIPHER_BLOWFISH:
3500 logevent("Using Blowfish encryption");
3501 break;
3502 }
3503
3504 send_packet(ssh, SSH1_CMSG_SESSION_KEY,
3505 PKT_CHAR, s->cipher_type,
3506 PKT_DATA, cookie, 8,
3507 PKT_CHAR, (s->len * 8) >> 8, PKT_CHAR, (s->len * 8) & 0xFF,
3508 PKT_DATA, s->rsabuf, s->len,
3509 PKT_INT, ssh->v1_local_protoflags, PKT_END);
3510
3511 logevent("Trying to enable encryption...");
3512
3513 sfree(s->rsabuf);
3514
3515 ssh->cipher = (s->cipher_type == SSH_CIPHER_BLOWFISH ? &ssh_blowfish_ssh1 :
3516 s->cipher_type == SSH_CIPHER_DES ? &ssh_des :
3517 &ssh_3des);
3518 ssh->v1_cipher_ctx = ssh->cipher->make_context();
3519 ssh->cipher->sesskey(ssh->v1_cipher_ctx, ssh->session_key);
3520 logeventf(ssh, "Initialised %s encryption", ssh->cipher->text_name);
3521
3522 ssh->crcda_ctx = crcda_make_context();
3523 logevent("Installing CRC compensation attack detector");
3524
3525 if (servkey.modulus) {
3526 sfree(servkey.modulus);
3527 servkey.modulus = NULL;
3528 }
3529 if (servkey.exponent) {
3530 sfree(servkey.exponent);
3531 servkey.exponent = NULL;
3532 }
3533 if (hostkey.modulus) {
3534 sfree(hostkey.modulus);
3535 hostkey.modulus = NULL;
3536 }
3537 if (hostkey.exponent) {
3538 sfree(hostkey.exponent);
3539 hostkey.exponent = NULL;
3540 }
3541 crWaitUntil(pktin);
3542
3543 if (pktin->type != SSH1_SMSG_SUCCESS) {
3544 bombout(("Encryption not successfully enabled"));
3545 crStop(0);
3546 }
3547
3548 logevent("Successfully started encryption");
3549
3550 fflush(stdout); /* FIXME eh? */
3551 {
3552 if ((ssh->username = get_remote_username(ssh->conf)) == NULL) {
3553 int ret; /* need not be kept over crReturn */
3554 s->cur_prompt = new_prompts(ssh->frontend);
3555 s->cur_prompt->to_server = TRUE;
3556 s->cur_prompt->name = dupstr("SSH login name");
3557 add_prompt(s->cur_prompt, dupstr("login as: "), TRUE);
3558 ret = get_userpass_input(s->cur_prompt, NULL, 0);
3559 while (ret < 0) {
3560 ssh->send_ok = 1;
3561 crWaitUntil(!pktin);
3562 ret = get_userpass_input(s->cur_prompt, in, inlen);
3563 ssh->send_ok = 0;
3564 }
3565 if (!ret) {
3566 /*
3567 * Failed to get a username. Terminate.
3568 */
3569 free_prompts(s->cur_prompt);
3570 ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE);
3571 crStop(0);
3572 }
3573 ssh->username = dupstr(s->cur_prompt->prompts[0]->result);
3574 free_prompts(s->cur_prompt);
3575 }
3576
3577 send_packet(ssh, SSH1_CMSG_USER, PKT_STR, ssh->username, PKT_END);
3578 {
3579 char *userlog = dupprintf("Sent username \"%s\"", ssh->username);
3580 logevent(userlog);
3581 if (flags & FLAG_INTERACTIVE &&
3582 (!((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)))) {
3583 c_write_str(ssh, userlog);
3584 c_write_str(ssh, "\r\n");
3585 }
3586 sfree(userlog);
3587 }
3588 }
3589
3590 crWaitUntil(pktin);
3591
3592 if ((s->supported_auths_mask & (1 << SSH1_AUTH_RSA)) == 0) {
3593 /* We must not attempt PK auth. Pretend we've already tried it. */
3594 s->tried_publickey = s->tried_agent = 1;
3595 } else {
3596 s->tried_publickey = s->tried_agent = 0;
3597 }
3598 s->tis_auth_refused = s->ccard_auth_refused = 0;
3599 /*
3600 * Load the public half of any configured keyfile for later use.
3601 */
3602 s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile);
3603 if (!filename_is_null(s->keyfile)) {
3604 int keytype;
3605 logeventf(ssh, "Reading private key file \"%.150s\"",
3606 filename_to_str(s->keyfile));
3607 keytype = key_type(s->keyfile);
3608 if (keytype == SSH_KEYTYPE_SSH1) {
3609 const char *error;
3610 if (rsakey_pubblob(s->keyfile,
3611 &s->publickey_blob, &s->publickey_bloblen,
3612 &s->publickey_comment, &error)) {
3613 s->publickey_encrypted = rsakey_encrypted(s->keyfile,
3614 NULL);
3615 } else {
3616 char *msgbuf;
3617 logeventf(ssh, "Unable to load private key (%s)", error);
3618 msgbuf = dupprintf("Unable to load private key file "
3619 "\"%.150s\" (%s)\r\n",
3620 filename_to_str(s->keyfile),
3621 error);
3622 c_write_str(ssh, msgbuf);
3623 sfree(msgbuf);
3624 s->publickey_blob = NULL;
3625 }
3626 } else {
3627 char *msgbuf;
3628 logeventf(ssh, "Unable to use this key file (%s)",
3629 key_type_to_str(keytype));
3630 msgbuf = dupprintf("Unable to use key file \"%.150s\""
3631 " (%s)\r\n",
3632 filename_to_str(s->keyfile),
3633 key_type_to_str(keytype));
3634 c_write_str(ssh, msgbuf);
3635 sfree(msgbuf);
3636 s->publickey_blob = NULL;
3637 }
3638 } else
3639 s->publickey_blob = NULL;
3640
3641 while (pktin->type == SSH1_SMSG_FAILURE) {
3642 s->pwpkt_type = SSH1_CMSG_AUTH_PASSWORD;
3643
3644 if (conf_get_int(ssh->conf, CONF_tryagent) && agent_exists() && !s->tried_agent) {
3645 /*
3646 * Attempt RSA authentication using Pageant.
3647 */
3648 void *r;
3649
3650 s->authed = FALSE;
3651 s->tried_agent = 1;
3652 logevent("Pageant is running. Requesting keys.");
3653
3654 /* Request the keys held by the agent. */
3655 PUT_32BIT(s->request, 1);
3656 s->request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES;
3657 if (!agent_query(s->request, 5, &r, &s->responselen,
3658 ssh_agent_callback, ssh)) {
3659 do {
3660 crReturn(0);
3661 if (pktin) {
3662 bombout(("Unexpected data from server while waiting"
3663 " for agent response"));
3664 crStop(0);
3665 }
3666 } while (pktin || inlen > 0);
3667 r = ssh->agent_response;
3668 s->responselen = ssh->agent_response_len;
3669 }
3670 s->response = (unsigned char *) r;
3671 if (s->response && s->responselen >= 5 &&
3672 s->response[4] == SSH1_AGENT_RSA_IDENTITIES_ANSWER) {
3673 s->p = s->response + 5;
3674 s->nkeys = GET_32BIT(s->p);
3675 s->p += 4;
3676 logeventf(ssh, "Pageant has %d SSH-1 keys", s->nkeys);
3677 for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) {
3678 unsigned char *pkblob = s->p;
3679 s->p += 4;
3680 {
3681 int n, ok = FALSE;
3682 do { /* do while (0) to make breaking easy */
3683 n = ssh1_read_bignum
3684 (s->p, s->responselen-(s->p-s->response),
3685 &s->key.exponent);
3686 if (n < 0)
3687 break;
3688 s->p += n;
3689 n = ssh1_read_bignum
3690 (s->p, s->responselen-(s->p-s->response),
3691 &s->key.modulus);
3692 if (n < 0)
3693 break;
3694 s->p += n;
3695 if (s->responselen - (s->p-s->response) < 4)
3696 break;
3697 s->commentlen = GET_32BIT(s->p);
3698 s->p += 4;
3699 if (s->responselen - (s->p-s->response) <
3700 s->commentlen)
3701 break;
3702 s->commentp = (char *)s->p;
3703 s->p += s->commentlen;
3704 ok = TRUE;
3705 } while (0);
3706 if (!ok) {
3707 logevent("Pageant key list packet was truncated");
3708 break;
3709 }
3710 }
3711 if (s->publickey_blob) {
3712 if (!memcmp(pkblob, s->publickey_blob,
3713 s->publickey_bloblen)) {
3714 logeventf(ssh, "Pageant key #%d matches "
3715 "configured key file", s->keyi);
3716 s->tried_publickey = 1;
3717 } else
3718 /* Skip non-configured key */
3719 continue;
3720 }
3721 logeventf(ssh, "Trying Pageant key #%d", s->keyi);
3722 send_packet(ssh, SSH1_CMSG_AUTH_RSA,
3723 PKT_BIGNUM, s->key.modulus, PKT_END);
3724 crWaitUntil(pktin);
3725 if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {
3726 logevent("Key refused");
3727 continue;
3728 }
3729 logevent("Received RSA challenge");
3730 if ((s->challenge = ssh1_pkt_getmp(pktin)) == NULL) {
3731 bombout(("Server's RSA challenge was badly formatted"));
3732 crStop(0);
3733 }
3734
3735 {
3736 char *agentreq, *q, *ret;
3737 void *vret;
3738 int len, retlen;
3739 len = 1 + 4; /* message type, bit count */
3740 len += ssh1_bignum_length(s->key.exponent);
3741 len += ssh1_bignum_length(s->key.modulus);
3742 len += ssh1_bignum_length(s->challenge);
3743 len += 16; /* session id */
3744 len += 4; /* response format */
3745 agentreq = snewn(4 + len, char);
3746 PUT_32BIT(agentreq, len);
3747 q = agentreq + 4;
3748 *q++ = SSH1_AGENTC_RSA_CHALLENGE;
3749 PUT_32BIT(q, bignum_bitcount(s->key.modulus));
3750 q += 4;
3751 q += ssh1_write_bignum(q, s->key.exponent);
3752 q += ssh1_write_bignum(q, s->key.modulus);
3753 q += ssh1_write_bignum(q, s->challenge);
3754 memcpy(q, s->session_id, 16);
3755 q += 16;
3756 PUT_32BIT(q, 1); /* response format */
3757 if (!agent_query(agentreq, len + 4, &vret, &retlen,
3758 ssh_agent_callback, ssh)) {
3759 sfree(agentreq);
3760 do {
3761 crReturn(0);
3762 if (pktin) {
3763 bombout(("Unexpected data from server"
3764 " while waiting for agent"
3765 " response"));
3766 crStop(0);
3767 }
3768 } while (pktin || inlen > 0);
3769 vret = ssh->agent_response;
3770 retlen = ssh->agent_response_len;
3771 } else
3772 sfree(agentreq);
3773 ret = vret;
3774 if (ret) {
3775 if (ret[4] == SSH1_AGENT_RSA_RESPONSE) {
3776 logevent("Sending Pageant's response");
3777 send_packet(ssh, SSH1_CMSG_AUTH_RSA_RESPONSE,
3778 PKT_DATA, ret + 5, 16,
3779 PKT_END);
3780 sfree(ret);
3781 crWaitUntil(pktin);
3782 if (pktin->type == SSH1_SMSG_SUCCESS) {
3783 logevent
3784 ("Pageant's response accepted");
3785 if (flags & FLAG_VERBOSE) {
3786 c_write_str(ssh, "Authenticated using"
3787 " RSA key \"");
3788 c_write(ssh, s->commentp,
3789 s->commentlen);
3790 c_write_str(ssh, "\" from agent\r\n");
3791 }
3792 s->authed = TRUE;
3793 } else
3794 logevent
3795 ("Pageant's response not accepted");
3796 } else {
3797 logevent
3798 ("Pageant failed to answer challenge");
3799 sfree(ret);
3800 }
3801 } else {
3802 logevent("No reply received from Pageant");
3803 }
3804 }
3805 freebn(s->key.exponent);
3806 freebn(s->key.modulus);
3807 freebn(s->challenge);
3808 if (s->authed)
3809 break;
3810 }
3811 sfree(s->response);
3812 if (s->publickey_blob && !s->tried_publickey)
3813 logevent("Configured key file not in Pageant");
3814 } else {
3815 logevent("Failed to get reply from Pageant");
3816 }
3817 if (s->authed)
3818 break;
3819 }
3820 if (s->publickey_blob && !s->tried_publickey) {
3821 /*
3822 * Try public key authentication with the specified
3823 * key file.
3824 */
3825 int got_passphrase; /* need not be kept over crReturn */
3826 if (flags & FLAG_VERBOSE)
3827 c_write_str(ssh, "Trying public key authentication.\r\n");
3828 s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile);
3829 logeventf(ssh, "Trying public key \"%s\"",
3830 filename_to_str(s->keyfile));
3831 s->tried_publickey = 1;
3832 got_passphrase = FALSE;
3833 while (!got_passphrase) {
3834 /*
3835 * Get a passphrase, if necessary.
3836 */
3837 char *passphrase = NULL; /* only written after crReturn */
3838 const char *error;
3839 if (!s->publickey_encrypted) {
3840 if (flags & FLAG_VERBOSE)
3841 c_write_str(ssh, "No passphrase required.\r\n");
3842 passphrase = NULL;
3843 } else {
3844 int ret; /* need not be kept over crReturn */
3845 s->cur_prompt = new_prompts(ssh->frontend);
3846 s->cur_prompt->to_server = FALSE;
3847 s->cur_prompt->name = dupstr("SSH key passphrase");
3848 add_prompt(s->cur_prompt,
3849 dupprintf("Passphrase for key \"%.100s\": ",
3850 s->publickey_comment), FALSE);
3851 ret = get_userpass_input(s->cur_prompt, NULL, 0);
3852 while (ret < 0) {
3853 ssh->send_ok = 1;
3854 crWaitUntil(!pktin);
3855 ret = get_userpass_input(s->cur_prompt, in, inlen);
3856 ssh->send_ok = 0;
3857 }
3858 if (!ret) {
3859 /* Failed to get a passphrase. Terminate. */
3860 free_prompts(s->cur_prompt);
3861 ssh_disconnect(ssh, NULL, "Unable to authenticate",
3862 0, TRUE);
3863 crStop(0);
3864 }
3865 passphrase = dupstr(s->cur_prompt->prompts[0]->result);
3866 free_prompts(s->cur_prompt);
3867 }
3868 /*
3869 * Try decrypting key with passphrase.
3870 */
3871 s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile);
3872 ret = loadrsakey(s->keyfile, &s->key, passphrase,
3873 &error);
3874 if (passphrase) {
3875 smemclr(passphrase, strlen(passphrase));
3876 sfree(passphrase);
3877 }
3878 if (ret == 1) {
3879 /* Correct passphrase. */
3880 got_passphrase = TRUE;
3881 } else if (ret == 0) {
3882 c_write_str(ssh, "Couldn't load private key from ");
3883 c_write_str(ssh, filename_to_str(s->keyfile));
3884 c_write_str(ssh, " (");
3885 c_write_str(ssh, error);
3886 c_write_str(ssh, ").\r\n");
3887 got_passphrase = FALSE;
3888 break; /* go and try something else */
3889 } else if (ret == -1) {
3890 c_write_str(ssh, "Wrong passphrase.\r\n"); /* FIXME */
3891 got_passphrase = FALSE;
3892 /* and try again */
3893 } else {
3894 assert(0 && "unexpected return from loadrsakey()");
3895 got_passphrase = FALSE; /* placate optimisers */
3896 }
3897 }
3898
3899 if (got_passphrase) {
3900
3901 /*
3902 * Send a public key attempt.
3903 */
3904 send_packet(ssh, SSH1_CMSG_AUTH_RSA,
3905 PKT_BIGNUM, s->key.modulus, PKT_END);
3906
3907 crWaitUntil(pktin);
3908 if (pktin->type == SSH1_SMSG_FAILURE) {
3909 c_write_str(ssh, "Server refused our public key.\r\n");
3910 continue; /* go and try something else */
3911 }
3912 if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {
3913 bombout(("Bizarre response to offer of public key"));
3914 crStop(0);
3915 }
3916
3917 {
3918 int i;
3919 unsigned char buffer[32];
3920 Bignum challenge, response;
3921
3922 if ((challenge = ssh1_pkt_getmp(pktin)) == NULL) {
3923 bombout(("Server's RSA challenge was badly formatted"));
3924 crStop(0);
3925 }
3926 response = rsadecrypt(challenge, &s->key);
3927 freebn(s->key.private_exponent);/* burn the evidence */
3928
3929 for (i = 0; i < 32; i++) {
3930 buffer[i] = bignum_byte(response, 31 - i);
3931 }
3932
3933 MD5Init(&md5c);
3934 MD5Update(&md5c, buffer, 32);
3935 MD5Update(&md5c, s->session_id, 16);
3936 MD5Final(buffer, &md5c);
3937
3938 send_packet(ssh, SSH1_CMSG_AUTH_RSA_RESPONSE,
3939 PKT_DATA, buffer, 16, PKT_END);
3940
3941 freebn(challenge);
3942 freebn(response);
3943 }
3944
3945 crWaitUntil(pktin);
3946 if (pktin->type == SSH1_SMSG_FAILURE) {
3947 if (flags & FLAG_VERBOSE)
3948 c_write_str(ssh, "Failed to authenticate with"
3949 " our public key.\r\n");
3950 continue; /* go and try something else */
3951 } else if (pktin->type != SSH1_SMSG_SUCCESS) {
3952 bombout(("Bizarre response to RSA authentication response"));
3953 crStop(0);
3954 }
3955
3956 break; /* we're through! */
3957 }
3958
3959 }
3960
3961 /*
3962 * Otherwise, try various forms of password-like authentication.
3963 */
3964 s->cur_prompt = new_prompts(ssh->frontend);
3965
3966 if (conf_get_int(ssh->conf, CONF_try_tis_auth) &&
3967 (s->supported_auths_mask & (1 << SSH1_AUTH_TIS)) &&
3968 !s->tis_auth_refused) {
3969 s->pwpkt_type = SSH1_CMSG_AUTH_TIS_RESPONSE;
3970 logevent("Requested TIS authentication");
3971 send_packet(ssh, SSH1_CMSG_AUTH_TIS, PKT_END);
3972 crWaitUntil(pktin);
3973 if (pktin->type != SSH1_SMSG_AUTH_TIS_CHALLENGE) {
3974 logevent("TIS authentication declined");
3975 if (flags & FLAG_INTERACTIVE)
3976 c_write_str(ssh, "TIS authentication refused.\r\n");
3977 s->tis_auth_refused = 1;
3978 continue;
3979 } else {
3980 char *challenge;
3981 int challengelen;
3982 char *instr_suf, *prompt;
3983
3984 ssh_pkt_getstring(pktin, &challenge, &challengelen);
3985 if (!challenge) {
3986 bombout(("TIS challenge packet was badly formed"));
3987 crStop(0);
3988 }
3989 logevent("Received TIS challenge");
3990 s->cur_prompt->to_server = TRUE;
3991 s->cur_prompt->name = dupstr("SSH TIS authentication");
3992 /* Prompt heuristic comes from OpenSSH */
3993 if (memchr(challenge, '\n', challengelen)) {
3994 instr_suf = dupstr("");
3995 prompt = dupprintf("%.*s", challengelen, challenge);
3996 } else {
3997 instr_suf = dupprintf("%.*s", challengelen, challenge);
3998 prompt = dupstr("Response: ");
3999 }
4000 s->cur_prompt->instruction =
4001 dupprintf("Using TIS authentication.%s%s",
4002 (*instr_suf) ? "\n" : "",
4003 instr_suf);
4004 s->cur_prompt->instr_reqd = TRUE;
4005 add_prompt(s->cur_prompt, prompt, FALSE);
4006 sfree(instr_suf);
4007 }
4008 }
4009 if (conf_get_int(ssh->conf, CONF_try_tis_auth) &&
4010 (s->supported_auths_mask & (1 << SSH1_AUTH_CCARD)) &&
4011 !s->ccard_auth_refused) {
4012 s->pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE;
4013 logevent("Requested CryptoCard authentication");
4014 send_packet(ssh, SSH1_CMSG_AUTH_CCARD, PKT_END);
4015 crWaitUntil(pktin);
4016 if (pktin->type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) {
4017 logevent("CryptoCard authentication declined");
4018 c_write_str(ssh, "CryptoCard authentication refused.\r\n");
4019 s->ccard_auth_refused = 1;
4020 continue;
4021 } else {
4022 char *challenge;
4023 int challengelen;
4024 char *instr_suf, *prompt;
4025
4026 ssh_pkt_getstring(pktin, &challenge, &challengelen);
4027 if (!challenge) {
4028 bombout(("CryptoCard challenge packet was badly formed"));
4029 crStop(0);
4030 }
4031 logevent("Received CryptoCard challenge");
4032 s->cur_prompt->to_server = TRUE;
4033 s->cur_prompt->name = dupstr("SSH CryptoCard authentication");
4034 s->cur_prompt->name_reqd = FALSE;
4035 /* Prompt heuristic comes from OpenSSH */
4036 if (memchr(challenge, '\n', challengelen)) {
4037 instr_suf = dupstr("");
4038 prompt = dupprintf("%.*s", challengelen, challenge);
4039 } else {
4040 instr_suf = dupprintf("%.*s", challengelen, challenge);
4041 prompt = dupstr("Response: ");
4042 }
4043 s->cur_prompt->instruction =
4044 dupprintf("Using CryptoCard authentication.%s%s",
4045 (*instr_suf) ? "\n" : "",
4046 instr_suf);
4047 s->cur_prompt->instr_reqd = TRUE;
4048 add_prompt(s->cur_prompt, prompt, FALSE);
4049 sfree(instr_suf);
4050 }
4051 }
4052 if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) {
4053 if ((s->supported_auths_mask & (1 << SSH1_AUTH_PASSWORD)) == 0) {
4054 bombout(("No supported authentication methods available"));
4055 crStop(0);
4056 }
4057 s->cur_prompt->to_server = TRUE;
4058 s->cur_prompt->name = dupstr("SSH password");
4059 add_prompt(s->cur_prompt, dupprintf("%s@%s's password: ",
4060 ssh->username, ssh->savedhost),
4061 FALSE);
4062 }
4063
4064 /*
4065 * Show password prompt, having first obtained it via a TIS
4066 * or CryptoCard exchange if we're doing TIS or CryptoCard
4067 * authentication.
4068 */
4069 {
4070 int ret; /* need not be kept over crReturn */
4071 ret = get_userpass_input(s->cur_prompt, NULL, 0);
4072 while (ret < 0) {
4073 ssh->send_ok = 1;
4074 crWaitUntil(!pktin);
4075 ret = get_userpass_input(s->cur_prompt, in, inlen);
4076 ssh->send_ok = 0;
4077 }
4078 if (!ret) {
4079 /*
4080 * Failed to get a password (for example
4081 * because one was supplied on the command line
4082 * which has already failed to work). Terminate.
4083 */
4084 free_prompts(s->cur_prompt);
4085 ssh_disconnect(ssh, NULL, "Unable to authenticate", 0, TRUE);
4086 crStop(0);
4087 }
4088 }
4089
4090 if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) {
4091 /*
4092 * Defence against traffic analysis: we send a
4093 * whole bunch of packets containing strings of
4094 * different lengths. One of these strings is the
4095 * password, in a SSH1_CMSG_AUTH_PASSWORD packet.
4096 * The others are all random data in
4097 * SSH1_MSG_IGNORE packets. This way a passive
4098 * listener can't tell which is the password, and
4099 * hence can't deduce the password length.
4100 *
4101 * Anybody with a password length greater than 16
4102 * bytes is going to have enough entropy in their
4103 * password that a listener won't find it _that_
4104 * much help to know how long it is. So what we'll
4105 * do is:
4106 *
4107 * - if password length < 16, we send 15 packets
4108 * containing string lengths 1 through 15
4109 *
4110 * - otherwise, we let N be the nearest multiple
4111 * of 8 below the password length, and send 8
4112 * packets containing string lengths N through
4113 * N+7. This won't obscure the order of
4114 * magnitude of the password length, but it will
4115 * introduce a bit of extra uncertainty.
4116 *
4117 * A few servers can't deal with SSH1_MSG_IGNORE, at
4118 * least in this context. For these servers, we need
4119 * an alternative defence. We make use of the fact
4120 * that the password is interpreted as a C string:
4121 * so we can append a NUL, then some random data.
4122 *
4123 * A few servers can deal with neither SSH1_MSG_IGNORE
4124 * here _nor_ a padded password string.
4125 * For these servers we are left with no defences
4126 * against password length sniffing.
4127 */
4128 if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE) &&
4129 !(ssh->remote_bugs & BUG_NEEDS_SSH1_PLAIN_PASSWORD)) {
4130 /*
4131 * The server can deal with SSH1_MSG_IGNORE, so
4132 * we can use the primary defence.
4133 */
4134 int bottom, top, pwlen, i;
4135 char *randomstr;
4136
4137 pwlen = strlen(s->cur_prompt->prompts[0]->result);
4138 if (pwlen < 16) {
4139 bottom = 0; /* zero length passwords are OK! :-) */
4140 top = 15;
4141 } else {
4142 bottom = pwlen & ~7;
4143 top = bottom + 7;
4144 }
4145
4146 assert(pwlen >= bottom && pwlen <= top);
4147
4148 randomstr = snewn(top + 1, char);
4149
4150 for (i = bottom; i <= top; i++) {
4151 if (i == pwlen) {
4152 defer_packet(ssh, s->pwpkt_type,
4153 PKTT_PASSWORD, PKT_STR,
4154 s->cur_prompt->prompts[0]->result,
4155 PKTT_OTHER, PKT_END);
4156 } else {
4157 for (j = 0; j < i; j++) {
4158 do {
4159 randomstr[j] = random_byte();
4160 } while (randomstr[j] == '\0');
4161 }
4162 randomstr[i] = '\0';
4163 defer_packet(ssh, SSH1_MSG_IGNORE,
4164 PKT_STR, randomstr, PKT_END);
4165 }
4166 }
4167 logevent("Sending password with camouflage packets");
4168 ssh_pkt_defersend(ssh);
4169 sfree(randomstr);
4170 }
4171 else if (!(ssh->remote_bugs & BUG_NEEDS_SSH1_PLAIN_PASSWORD)) {
4172 /*
4173 * The server can't deal with SSH1_MSG_IGNORE
4174 * but can deal with padded passwords, so we
4175 * can use the secondary defence.
4176 */
4177 char string[64];
4178 char *ss;
4179 int len;
4180
4181 len = strlen(s->cur_prompt->prompts[0]->result);
4182 if (len < sizeof(string)) {
4183 ss = string;
4184 strcpy(string, s->cur_prompt->prompts[0]->result);
4185 len++; /* cover the zero byte */
4186 while (len < sizeof(string)) {
4187 string[len++] = (char) random_byte();
4188 }
4189 } else {
4190 ss = s->cur_prompt->prompts[0]->result;
4191 }
4192 logevent("Sending length-padded password");
4193 send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD,
4194 PKT_INT, len, PKT_DATA, ss, len,
4195 PKTT_OTHER, PKT_END);
4196 } else {
4197 /*
4198 * The server is believed unable to cope with
4199 * any of our password camouflage methods.
4200 */
4201 int len;
4202 len = strlen(s->cur_prompt->prompts[0]->result);
4203 logevent("Sending unpadded password");
4204 send_packet(ssh, s->pwpkt_type,
4205 PKTT_PASSWORD, PKT_INT, len,
4206 PKT_DATA, s->cur_prompt->prompts[0]->result, len,
4207 PKTT_OTHER, PKT_END);
4208 }
4209 } else {
4210 send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD,
4211 PKT_STR, s->cur_prompt->prompts[0]->result,
4212 PKTT_OTHER, PKT_END);
4213 }
4214 logevent("Sent password");
4215 free_prompts(s->cur_prompt);
4216 crWaitUntil(pktin);
4217 if (pktin->type == SSH1_SMSG_FAILURE) {
4218 if (flags & FLAG_VERBOSE)
4219 c_write_str(ssh, "Access denied\r\n");
4220 logevent("Authentication refused");
4221 } else if (pktin->type != SSH1_SMSG_SUCCESS) {
4222 bombout(("Strange packet received, type %d", pktin->type));
4223 crStop(0);
4224 }
4225 }
4226
4227 /* Clear up */
4228 if (s->publickey_blob) {
4229 sfree(s->publickey_blob);
4230 sfree(s->publickey_comment);
4231 }
4232
4233 logevent("Authentication successful");
4234
4235 crFinish(1);
4236 }
4237
4238 static void ssh_channel_try_eof(struct ssh_channel *c)
4239 {
4240 Ssh ssh = c->ssh;
4241 assert(c->pending_eof); /* precondition for calling us */
4242 if (c->halfopen)
4243 return; /* can't close: not even opened yet */
4244 if (ssh->version == 2 && bufchain_size(&c->v.v2.outbuffer) > 0)
4245 return; /* can't send EOF: pending outgoing data */
4246
4247 c->pending_eof = FALSE; /* we're about to send it */
4248 if (ssh->version == 1) {
4249 send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid,
4250 PKT_END);
4251 c->closes |= CLOSES_SENT_EOF;
4252 } else {
4253 struct Packet *pktout;
4254 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF);
4255 ssh2_pkt_adduint32(pktout, c->remoteid);
4256 ssh2_pkt_send(ssh, pktout);
4257 c->closes |= CLOSES_SENT_EOF;
4258 ssh2_channel_check_close(c);
4259 }
4260 }
4261
4262 void sshfwd_write_eof(struct ssh_channel *c)
4263 {
4264 Ssh ssh = c->ssh;
4265
4266 if (ssh->state == SSH_STATE_CLOSED)
4267 return;
4268
4269 if (c->closes & CLOSES_SENT_EOF)
4270 return;
4271
4272 c->pending_eof = TRUE;
4273 ssh_channel_try_eof(c);
4274 }
4275
4276 void sshfwd_unclean_close(struct ssh_channel *c)
4277 {
4278 Ssh ssh = c->ssh;
4279 struct Packet *pktout;
4280
4281 if (ssh->state == SSH_STATE_CLOSED)
4282 return;
4283
4284 if (!(c->closes & CLOSES_SENT_CLOSE)) {
4285 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
4286 ssh2_pkt_adduint32(pktout, c->remoteid);
4287 ssh2_pkt_send(ssh, pktout);
4288 c->closes |= CLOSES_SENT_EOF | CLOSES_SENT_CLOSE;
4289 }
4290
4291 switch (c->type) {
4292 case CHAN_X11:
4293 x11_close(c->u.x11.s);
4294 break;
4295 case CHAN_SOCKDATA:
4296 case CHAN_SOCKDATA_DORMANT:
4297 pfd_close(c->u.pfd.s);
4298 break;
4299 }
4300 c->type = CHAN_ZOMBIE;
4301
4302 ssh2_channel_check_close(c);
4303 }
4304
4305 int sshfwd_write(struct ssh_channel *c, char *buf, int len)
4306 {
4307 Ssh ssh = c->ssh;
4308
4309 if (ssh->state == SSH_STATE_CLOSED)
4310 return 0;
4311
4312 if (ssh->version == 1) {
4313 send_packet(ssh, SSH1_MSG_CHANNEL_DATA,
4314 PKT_INT, c->remoteid,
4315 PKT_INT, len, PKTT_DATA, PKT_DATA, buf, len,
4316 PKTT_OTHER, PKT_END);
4317 /*
4318 * In SSH-1 we can return 0 here - implying that forwarded
4319 * connections are never individually throttled - because
4320 * the only circumstance that can cause throttling will be
4321 * the whole SSH connection backing up, in which case
4322 * _everything_ will be throttled as a whole.
4323 */
4324 return 0;
4325 } else {
4326 ssh2_add_channel_data(c, buf, len);
4327 return ssh2_try_send(c);
4328 }
4329 }
4330
4331 void sshfwd_unthrottle(struct ssh_channel *c, int bufsize)
4332 {
4333 Ssh ssh = c->ssh;
4334 int buflimit;
4335
4336 if (ssh->state == SSH_STATE_CLOSED)
4337 return;
4338
4339 if (ssh->version == 1) {
4340 buflimit = SSH1_BUFFER_LIMIT;
4341 } else {
4342 buflimit = c->v.v2.locmaxwin;
4343 ssh2_set_window(c, bufsize < buflimit ? buflimit - bufsize : 0);
4344 }
4345 if (c->throttling_conn && bufsize <= buflimit) {
4346 c->throttling_conn = 0;
4347 ssh_throttle_conn(ssh, -1);
4348 }
4349 }
4350
4351 static void ssh_queueing_handler(Ssh ssh, struct Packet *pktin)
4352 {
4353 struct queued_handler *qh = ssh->qhead;
4354
4355 assert(qh != NULL);
4356
4357 assert(pktin->type == qh->msg1 || pktin->type == qh->msg2);
4358
4359 if (qh->msg1 > 0) {
4360 assert(ssh->packet_dispatch[qh->msg1] == ssh_queueing_handler);
4361 ssh->packet_dispatch[qh->msg1] = ssh->q_saved_handler1;
4362 }
4363 if (qh->msg2 > 0) {
4364 assert(ssh->packet_dispatch[qh->msg2] == ssh_queueing_handler);
4365 ssh->packet_dispatch[qh->msg2] = ssh->q_saved_handler2;
4366 }
4367
4368 if (qh->next) {
4369 ssh->qhead = qh->next;
4370
4371 if (ssh->qhead->msg1 > 0) {
4372 ssh->q_saved_handler1 = ssh->packet_dispatch[ssh->qhead->msg1];
4373 ssh->packet_dispatch[ssh->qhead->msg1] = ssh_queueing_handler;
4374 }
4375 if (ssh->qhead->msg2 > 0) {
4376 ssh->q_saved_handler2 = ssh->packet_dispatch[ssh->qhead->msg2];
4377 ssh->packet_dispatch[ssh->qhead->msg2] = ssh_queueing_handler;
4378 }
4379 } else {
4380 ssh->qhead = ssh->qtail = NULL;
4381 }
4382
4383 qh->handler(ssh, pktin, qh->ctx);
4384
4385 sfree(qh);
4386 }
4387
4388 static void ssh_queue_handler(Ssh ssh, int msg1, int msg2,
4389 chandler_fn_t handler, void *ctx)
4390 {
4391 struct queued_handler *qh;
4392
4393 qh = snew(struct queued_handler);
4394 qh->msg1 = msg1;
4395 qh->msg2 = msg2;
4396 qh->handler = handler;
4397 qh->ctx = ctx;
4398 qh->next = NULL;
4399
4400 if (ssh->qtail == NULL) {
4401 ssh->qhead = qh;
4402
4403 if (qh->msg1 > 0) {
4404 ssh->q_saved_handler1 = ssh->packet_dispatch[ssh->qhead->msg1];
4405 ssh->packet_dispatch[qh->msg1] = ssh_queueing_handler;
4406 }
4407 if (qh->msg2 > 0) {
4408 ssh->q_saved_handler2 = ssh->packet_dispatch[ssh->qhead->msg2];
4409 ssh->packet_dispatch[qh->msg2] = ssh_queueing_handler;
4410 }
4411 } else {
4412 ssh->qtail->next = qh;
4413 }
4414 ssh->qtail = qh;
4415 }
4416
4417 static void ssh_rportfwd_succfail(Ssh ssh, struct Packet *pktin, void *ctx)
4418 {
4419 struct ssh_rportfwd *rpf, *pf = (struct ssh_rportfwd *)ctx;
4420
4421 if (pktin->type == (ssh->version == 1 ? SSH1_SMSG_SUCCESS :
4422 SSH2_MSG_REQUEST_SUCCESS)) {
4423 logeventf(ssh, "Remote port forwarding from %s enabled",
4424 pf->sportdesc);
4425 } else {
4426 logeventf(ssh, "Remote port forwarding from %s refused",
4427 pf->sportdesc);
4428
4429 rpf = del234(ssh->rportfwds, pf);
4430 assert(rpf == pf);
4431 pf->pfrec->remote = NULL;
4432 free_rportfwd(pf);
4433 }
4434 }
4435
4436 static void ssh_setup_portfwd(Ssh ssh, Conf *conf)
4437 {
4438 struct ssh_portfwd *epf;
4439 int i;
4440 char *key, *val;
4441
4442 if (!ssh->portfwds) {
4443 ssh->portfwds = newtree234(ssh_portcmp);
4444 } else {
4445 /*
4446 * Go through the existing port forwardings and tag them
4447 * with status==DESTROY. Any that we want to keep will be
4448 * re-enabled (status==KEEP) as we go through the
4449 * configuration and find out which bits are the same as
4450 * they were before.
4451 */
4452 struct ssh_portfwd *epf;
4453 int i;
4454 for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++)
4455 epf->status = DESTROY;
4456 }
4457
4458 for (val = conf_get_str_strs(conf, CONF_portfwd, NULL, &key);
4459 val != NULL;
4460 val = conf_get_str_strs(conf, CONF_portfwd, key, &key)) {
4461 char *kp, *kp2, *vp, *vp2;
4462 char address_family, type;
4463 int sport,dport,sserv,dserv;
4464 char *sports, *dports, *saddr, *host;
4465
4466 kp = key;
4467
4468 address_family = 'A';
4469 type = 'L';
4470 if (*kp == 'A' || *kp == '4' || *kp == '6')
4471 address_family = *kp++;
4472 if (*kp == 'L' || *kp == 'R')
4473 type = *kp++;
4474
4475 if ((kp2 = strchr(kp, ':')) != NULL) {
4476 /*
4477 * There's a colon in the middle of the source port
4478 * string, which means that the part before it is
4479 * actually a source address.
4480 */
4481 saddr = dupprintf("%.*s", (int)(kp2 - kp), kp);
4482 sports = kp2+1;
4483 } else {
4484 saddr = NULL;
4485 sports = kp;
4486 }
4487 sport = atoi(sports);
4488 sserv = 0;
4489 if (sport == 0) {
4490 sserv = 1;
4491 sport = net_service_lookup(sports);
4492 if (!sport) {
4493 logeventf(ssh, "Service lookup failed for source"
4494 " port \"%s\"", sports);
4495 }
4496 }
4497
4498 if (type == 'L' && !strcmp(val, "D")) {
4499 /* dynamic forwarding */
4500 host = NULL;
4501 dports = NULL;
4502 dport = -1;
4503 dserv = 0;
4504 type = 'D';
4505 } else {
4506 /* ordinary forwarding */
4507 vp = val;
4508 vp2 = vp + strcspn(vp, ":");
4509 host = dupprintf("%.*s", (int)(vp2 - vp), vp);
4510 if (vp2)
4511 vp2++;
4512 dports = vp2;
4513 dport = atoi(dports);
4514 dserv = 0;
4515 if (dport == 0) {
4516 dserv = 1;
4517 dport = net_service_lookup(dports);
4518 if (!dport) {
4519 logeventf(ssh, "Service lookup failed for destination"
4520 " port \"%s\"", dports);
4521 }
4522 }
4523 }
4524
4525 if (sport && dport) {
4526 /* Set up a description of the source port. */
4527 struct ssh_portfwd *pfrec, *epfrec;
4528
4529 pfrec = snew(struct ssh_portfwd);
4530 pfrec->type = type;
4531 pfrec->saddr = saddr;
4532 pfrec->sserv = sserv ? dupstr(sports) : NULL;
4533 pfrec->sport = sport;
4534 pfrec->daddr = host;
4535 pfrec->dserv = dserv ? dupstr(dports) : NULL;
4536 pfrec->dport = dport;
4537 pfrec->local = NULL;
4538 pfrec->remote = NULL;
4539 pfrec->addressfamily = (address_family == '4' ? ADDRTYPE_IPV4 :
4540 address_family == '6' ? ADDRTYPE_IPV6 :
4541 ADDRTYPE_UNSPEC);
4542
4543 epfrec = add234(ssh->portfwds, pfrec);
4544 if (epfrec != pfrec) {
4545 if (epfrec->status == DESTROY) {
4546 /*
4547 * We already have a port forwarding up and running
4548 * with precisely these parameters. Hence, no need
4549 * to do anything; simply re-tag the existing one
4550 * as KEEP.
4551 */
4552 epfrec->status = KEEP;
4553 }
4554 /*
4555 * Anything else indicates that there was a duplicate
4556 * in our input, which we'll silently ignore.
4557 */
4558 free_portfwd(pfrec);
4559 } else {
4560 pfrec->status = CREATE;
4561 }
4562 } else {
4563 sfree(saddr);
4564 sfree(host);
4565 }
4566 }
4567
4568 /*
4569 * Now go through and destroy any port forwardings which were
4570 * not re-enabled.
4571 */
4572 for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++)
4573 if (epf->status == DESTROY) {
4574 char *message;
4575
4576 message = dupprintf("%s port forwarding from %s%s%d",
4577 epf->type == 'L' ? "local" :
4578 epf->type == 'R' ? "remote" : "dynamic",
4579 epf->saddr ? epf->saddr : "",
4580 epf->saddr ? ":" : "",
4581 epf->sport);
4582
4583 if (epf->type != 'D') {
4584 char *msg2 = dupprintf("%s to %s:%d", message,
4585 epf->daddr, epf->dport);
4586 sfree(message);
4587 message = msg2;
4588 }
4589
4590 logeventf(ssh, "Cancelling %s", message);
4591 sfree(message);
4592
4593 /* epf->remote or epf->local may be NULL if setting up a
4594 * forwarding failed. */
4595 if (epf->remote) {
4596 struct ssh_rportfwd *rpf = epf->remote;
4597 struct Packet *pktout;
4598
4599 /*
4600 * Cancel the port forwarding at the server
4601 * end.
4602 */
4603 if (ssh->version == 1) {
4604 /*
4605 * We cannot cancel listening ports on the
4606 * server side in SSH-1! There's no message
4607 * to support it. Instead, we simply remove
4608 * the rportfwd record from the local end
4609 * so that any connections the server tries
4610 * to make on it are rejected.
4611 */
4612 } else {
4613 pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST);
4614 ssh2_pkt_addstring(pktout, "cancel-tcpip-forward");
4615 ssh2_pkt_addbool(pktout, 0);/* _don't_ want reply */
4616 if (epf->saddr) {
4617 ssh2_pkt_addstring(pktout, epf->saddr);
4618 } else if (conf_get_int(conf, CONF_rport_acceptall)) {
4619 /* XXX: rport_acceptall may not represent
4620 * what was used to open the original connection,
4621 * since it's reconfigurable. */
4622 ssh2_pkt_addstring(pktout, "0.0.0.0");
4623 } else {
4624 ssh2_pkt_addstring(pktout, "127.0.0.1");
4625 }
4626 ssh2_pkt_adduint32(pktout, epf->sport);
4627 ssh2_pkt_send(ssh, pktout);
4628 }
4629
4630 del234(ssh->rportfwds, rpf);
4631 free_rportfwd(rpf);
4632 } else if (epf->local) {
4633 pfd_terminate(epf->local);
4634 }
4635
4636 delpos234(ssh->portfwds, i);
4637 free_portfwd(epf);
4638 i--; /* so we don't skip one in the list */
4639 }
4640
4641 /*
4642 * And finally, set up any new port forwardings (status==CREATE).
4643 */
4644 for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++)
4645 if (epf->status == CREATE) {
4646 char *sportdesc, *dportdesc;
4647 sportdesc = dupprintf("%s%s%s%s%d%s",
4648 epf->saddr ? epf->saddr : "",
4649 epf->saddr ? ":" : "",
4650 epf->sserv ? epf->sserv : "",
4651 epf->sserv ? "(" : "",
4652 epf->sport,
4653 epf->sserv ? ")" : "");
4654 if (epf->type == 'D') {
4655 dportdesc = NULL;
4656 } else {
4657 dportdesc = dupprintf("%s:%s%s%d%s",
4658 epf->daddr,
4659 epf->dserv ? epf->dserv : "",
4660 epf->dserv ? "(" : "",
4661 epf->dport,
4662 epf->dserv ? ")" : "");
4663 }
4664
4665 if (epf->type == 'L') {
4666 const char *err = pfd_addforward(epf->daddr, epf->dport,
4667 epf->saddr, epf->sport,
4668 ssh, conf,
4669 &epf->local,
4670 epf->addressfamily);
4671
4672 logeventf(ssh, "Local %sport %s forwarding to %s%s%s",
4673 epf->addressfamily == ADDRTYPE_IPV4 ? "IPv4 " :
4674 epf->addressfamily == ADDRTYPE_IPV6 ? "IPv6 " : "",
4675 sportdesc, dportdesc,
4676 err ? " failed: " : "", err ? err : "");
4677 } else if (epf->type == 'D') {
4678 const char *err = pfd_addforward(NULL, -1,
4679 epf->saddr, epf->sport,
4680 ssh, conf,
4681 &epf->local,
4682 epf->addressfamily);
4683
4684 logeventf(ssh, "Local %sport %s SOCKS dynamic forwarding%s%s",
4685 epf->addressfamily == ADDRTYPE_IPV4 ? "IPv4 " :
4686 epf->addressfamily == ADDRTYPE_IPV6 ? "IPv6 " : "",
4687 sportdesc,
4688 err ? " failed: " : "", err ? err : "");
4689 } else {
4690 struct ssh_rportfwd *pf;
4691
4692 /*
4693 * Ensure the remote port forwardings tree exists.
4694 */
4695 if (!ssh->rportfwds) {
4696 if (ssh->version == 1)
4697 ssh->rportfwds = newtree234(ssh_rportcmp_ssh1);
4698 else
4699 ssh->rportfwds = newtree234(ssh_rportcmp_ssh2);
4700 }
4701
4702 pf = snew(struct ssh_rportfwd);
4703 strncpy(pf->dhost, epf->daddr, lenof(pf->dhost)-1);
4704 pf->dhost[lenof(pf->dhost)-1] = '\0';
4705 pf->dport = epf->dport;
4706 pf->sport = epf->sport;
4707 if (add234(ssh->rportfwds, pf) != pf) {
4708 logeventf(ssh, "Duplicate remote port forwarding to %s:%d",
4709 epf->daddr, epf->dport);
4710 sfree(pf);
4711 } else {
4712 logeventf(ssh, "Requesting remote port %s"
4713 " forward to %s", sportdesc, dportdesc);
4714
4715 pf->sportdesc = sportdesc;
4716 sportdesc = NULL;
4717 epf->remote = pf;
4718 pf->pfrec = epf;
4719
4720 if (ssh->version == 1) {
4721 send_packet(ssh, SSH1_CMSG_PORT_FORWARD_REQUEST,
4722 PKT_INT, epf->sport,
4723 PKT_STR, epf->daddr,
4724 PKT_INT, epf->dport,
4725 PKT_END);
4726 ssh_queue_handler(ssh, SSH1_SMSG_SUCCESS,
4727 SSH1_SMSG_FAILURE,
4728 ssh_rportfwd_succfail, pf);
4729 } else {
4730 struct Packet *pktout;
4731 pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST);
4732 ssh2_pkt_addstring(pktout, "tcpip-forward");
4733 ssh2_pkt_addbool(pktout, 1);/* want reply */
4734 if (epf->saddr) {
4735 ssh2_pkt_addstring(pktout, epf->saddr);
4736 } else if (conf_get_int(conf, CONF_rport_acceptall)) {
4737 ssh2_pkt_addstring(pktout, "0.0.0.0");
4738 } else {
4739 ssh2_pkt_addstring(pktout, "127.0.0.1");
4740 }
4741 ssh2_pkt_adduint32(pktout, epf->sport);
4742 ssh2_pkt_send(ssh, pktout);
4743
4744 ssh_queue_handler(ssh, SSH2_MSG_REQUEST_SUCCESS,
4745 SSH2_MSG_REQUEST_FAILURE,
4746 ssh_rportfwd_succfail, pf);
4747 }
4748 }
4749 }
4750 sfree(sportdesc);
4751 sfree(dportdesc);
4752 }
4753 }
4754
4755 static void ssh1_smsg_stdout_stderr_data(Ssh ssh, struct Packet *pktin)
4756 {
4757 char *string;
4758 int stringlen, bufsize;
4759
4760 ssh_pkt_getstring(pktin, &string, &stringlen);
4761 if (string == NULL) {
4762 bombout(("Incoming terminal data packet was badly formed"));
4763 return;
4764 }
4765
4766 bufsize = from_backend(ssh->frontend, pktin->type == SSH1_SMSG_STDERR_DATA,
4767 string, stringlen);
4768 if (!ssh->v1_stdout_throttling && bufsize > SSH1_BUFFER_LIMIT) {
4769 ssh->v1_stdout_throttling = 1;
4770 ssh_throttle_conn(ssh, +1);
4771 }
4772 }
4773
4774 static void ssh1_smsg_x11_open(Ssh ssh, struct Packet *pktin)
4775 {
4776 /* Remote side is trying to open a channel to talk to our
4777 * X-Server. Give them back a local channel number. */
4778 struct ssh_channel *c;
4779 int remoteid = ssh_pkt_getuint32(pktin);
4780
4781 logevent("Received X11 connect request");
4782 /* Refuse if X11 forwarding is disabled. */
4783 if (!ssh->X11_fwd_enabled) {
4784 send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4785 PKT_INT, remoteid, PKT_END);
4786 logevent("Rejected X11 connect request");
4787 } else {
4788 c = snew(struct ssh_channel);
4789 c->ssh = ssh;
4790
4791 if (x11_init(&c->u.x11.s, ssh->x11disp, c,
4792 NULL, -1, ssh->conf) != NULL) {
4793 logevent("Opening X11 forward connection failed");
4794 sfree(c);
4795 send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4796 PKT_INT, remoteid, PKT_END);
4797 } else {
4798 logevent
4799 ("Opening X11 forward connection succeeded");
4800 c->remoteid = remoteid;
4801 c->halfopen = FALSE;
4802 c->localid = alloc_channel_id(ssh);
4803 c->closes = 0;
4804 c->pending_eof = FALSE;
4805 c->throttling_conn = 0;
4806 c->type = CHAN_X11; /* identify channel type */
4807 add234(ssh->channels, c);
4808 send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION,
4809 PKT_INT, c->remoteid, PKT_INT,
4810 c->localid, PKT_END);
4811 logevent("Opened X11 forward channel");
4812 }
4813 }
4814 }
4815
4816 static void ssh1_smsg_agent_open(Ssh ssh, struct Packet *pktin)
4817 {
4818 /* Remote side is trying to open a channel to talk to our
4819 * agent. Give them back a local channel number. */
4820 struct ssh_channel *c;
4821 int remoteid = ssh_pkt_getuint32(pktin);
4822
4823 /* Refuse if agent forwarding is disabled. */
4824 if (!ssh->agentfwd_enabled) {
4825 send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4826 PKT_INT, remoteid, PKT_END);
4827 } else {
4828 c = snew(struct ssh_channel);
4829 c->ssh = ssh;
4830 c->remoteid = remoteid;
4831 c->halfopen = FALSE;
4832 c->localid = alloc_channel_id(ssh);
4833 c->closes = 0;
4834 c->pending_eof = FALSE;
4835 c->throttling_conn = 0;
4836 c->type = CHAN_AGENT; /* identify channel type */
4837 c->u.a.lensofar = 0;
4838 c->u.a.message = NULL;
4839 add234(ssh->channels, c);
4840 send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION,
4841 PKT_INT, c->remoteid, PKT_INT, c->localid,
4842 PKT_END);
4843 }
4844 }
4845
4846 static void ssh1_msg_port_open(Ssh ssh, struct Packet *pktin)
4847 {
4848 /* Remote side is trying to open a channel to talk to a
4849 * forwarded port. Give them back a local channel number. */
4850 struct ssh_channel *c;
4851 struct ssh_rportfwd pf, *pfp;
4852 int remoteid;
4853 int hostsize, port;
4854 char *host;
4855 const char *e;
4856 c = snew(struct ssh_channel);
4857 c->ssh = ssh;
4858
4859 remoteid = ssh_pkt_getuint32(pktin);
4860 ssh_pkt_getstring(pktin, &host, &hostsize);
4861 port = ssh_pkt_getuint32(pktin);
4862
4863 if (hostsize >= lenof(pf.dhost))
4864 hostsize = lenof(pf.dhost)-1;
4865 memcpy(pf.dhost, host, hostsize);
4866 pf.dhost[hostsize] = '\0';
4867 pf.dport = port;
4868 pfp = find234(ssh->rportfwds, &pf, NULL);
4869
4870 if (pfp == NULL) {
4871 logeventf(ssh, "Rejected remote port open request for %s:%d",
4872 pf.dhost, port);
4873 send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4874 PKT_INT, remoteid, PKT_END);
4875 } else {
4876 logeventf(ssh, "Received remote port open request for %s:%d",
4877 pf.dhost, port);
4878 e = pfd_newconnect(&c->u.pfd.s, pf.dhost, port,
4879 c, ssh->conf, pfp->pfrec->addressfamily);
4880 if (e != NULL) {
4881 logeventf(ssh, "Port open failed: %s", e);
4882 sfree(c);
4883 send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4884 PKT_INT, remoteid, PKT_END);
4885 } else {
4886 c->remoteid = remoteid;
4887 c->halfopen = FALSE;
4888 c->localid = alloc_channel_id(ssh);
4889 c->closes = 0;
4890 c->pending_eof = FALSE;
4891 c->throttling_conn = 0;
4892 c->type = CHAN_SOCKDATA; /* identify channel type */
4893 add234(ssh->channels, c);
4894 send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION,
4895 PKT_INT, c->remoteid, PKT_INT,
4896 c->localid, PKT_END);
4897 logevent("Forwarded port opened successfully");
4898 }
4899 }
4900 }
4901
4902 static void ssh1_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin)
4903 {
4904 unsigned int remoteid = ssh_pkt_getuint32(pktin);
4905 unsigned int localid = ssh_pkt_getuint32(pktin);
4906 struct ssh_channel *c;
4907
4908 c = find234(ssh->channels, &remoteid, ssh_channelfind);
4909 if (c && c->type == CHAN_SOCKDATA_DORMANT) {
4910 c->remoteid = localid;
4911 c->halfopen = FALSE;
4912 c->type = CHAN_SOCKDATA;
4913 c->throttling_conn = 0;
4914 pfd_confirm(c->u.pfd.s);
4915 }
4916
4917 if (c && c->pending_eof) {
4918 /*
4919 * We have a pending close on this channel,
4920 * which we decided on before the server acked
4921 * the channel open. So now we know the
4922 * remoteid, we can close it again.
4923 */
4924 ssh_channel_try_eof(c);
4925 }
4926 }
4927
4928 static void ssh1_msg_channel_open_failure(Ssh ssh, struct Packet *pktin)
4929 {
4930 unsigned int remoteid = ssh_pkt_getuint32(pktin);
4931 struct ssh_channel *c;
4932
4933 c = find234(ssh->channels, &remoteid, ssh_channelfind);
4934 if (c && c->type == CHAN_SOCKDATA_DORMANT) {
4935 logevent("Forwarded connection refused by server");
4936 pfd_close(c->u.pfd.s);
4937 del234(ssh->channels, c);
4938 sfree(c);
4939 }
4940 }
4941
4942 static void ssh1_msg_channel_close(Ssh ssh, struct Packet *pktin)
4943 {
4944 /* Remote side closes a channel. */
4945 unsigned i = ssh_pkt_getuint32(pktin);
4946 struct ssh_channel *c;
4947 c = find234(ssh->channels, &i, ssh_channelfind);
4948 if (c && !c->halfopen) {
4949
4950 if (pktin->type == SSH1_MSG_CHANNEL_CLOSE &&
4951 !(c->closes & CLOSES_RCVD_EOF)) {
4952 /*
4953 * Received CHANNEL_CLOSE, which we translate into
4954 * outgoing EOF.
4955 */
4956 int send_close = FALSE;
4957
4958 c->closes |= CLOSES_RCVD_EOF;
4959
4960 switch (c->type) {
4961 case CHAN_X11:
4962 if (c->u.x11.s)
4963 x11_send_eof(c->u.x11.s);
4964 else
4965 send_close = TRUE;
4966 break;
4967 case CHAN_SOCKDATA:
4968 if (c->u.pfd.s)
4969 pfd_send_eof(c->u.pfd.s);
4970 else
4971 send_close = TRUE;
4972 break;
4973 case CHAN_AGENT:
4974 send_close = TRUE;
4975 break;
4976 }
4977
4978 if (send_close && !(c->closes & CLOSES_SENT_EOF)) {
4979 send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid,
4980 PKT_END);
4981 c->closes |= CLOSES_SENT_EOF;
4982 }
4983 }
4984
4985 if (pktin->type == SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION &&
4986 !(c->closes & CLOSES_RCVD_CLOSE)) {
4987
4988 if (!(c->closes & CLOSES_SENT_EOF)) {
4989 bombout(("Received CHANNEL_CLOSE_CONFIRMATION for channel %d"
4990 " for which we never sent CHANNEL_CLOSE\n", i));
4991 }
4992
4993 c->closes |= CLOSES_RCVD_CLOSE;
4994 }
4995
4996 if (!((CLOSES_SENT_EOF | CLOSES_RCVD_EOF) & ~c->closes) &&
4997 !(c->closes & CLOSES_SENT_CLOSE)) {
4998 send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION,
4999 PKT_INT, c->remoteid, PKT_END);
5000 c->closes |= CLOSES_SENT_CLOSE;
5001 }
5002
5003 if (!((CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE) & ~c->closes))
5004 ssh_channel_destroy(c);
5005 } else {
5006 bombout(("Received CHANNEL_CLOSE%s for %s channel %d\n",
5007 pktin->type == SSH1_MSG_CHANNEL_CLOSE ? "" :
5008 "_CONFIRMATION", c ? "half-open" : "nonexistent",
5009 i));
5010 }
5011 }
5012
5013 static void ssh1_msg_channel_data(Ssh ssh, struct Packet *pktin)
5014 {
5015 /* Data sent down one of our channels. */
5016 int i = ssh_pkt_getuint32(pktin);
5017 char *p;
5018 int len;
5019 struct ssh_channel *c;
5020
5021 ssh_pkt_getstring(pktin, &p, &len);
5022
5023 c = find234(ssh->channels, &i, ssh_channelfind);
5024 if (c) {
5025 int bufsize = 0;
5026 switch (c->type) {
5027 case CHAN_X11:
5028 bufsize = x11_send(c->u.x11.s, p, len);
5029 break;
5030 case CHAN_SOCKDATA:
5031 bufsize = pfd_send(c->u.pfd.s, p, len);
5032 break;
5033 case CHAN_AGENT:
5034 /* Data for an agent message. Buffer it. */
5035 while (len > 0) {
5036 if (c->u.a.lensofar < 4) {
5037 unsigned int l = min(4 - c->u.a.lensofar, (unsigned)len);
5038 memcpy(c->u.a.msglen + c->u.a.lensofar, p,
5039 l);
5040 p += l;
5041 len -= l;
5042 c->u.a.lensofar += l;
5043 }
5044 if (c->u.a.lensofar == 4) {
5045 c->u.a.totallen =
5046 4 + GET_32BIT(c->u.a.msglen);
5047 c->u.a.message = snewn(c->u.a.totallen,
5048 unsigned char);
5049 memcpy(c->u.a.message, c->u.a.msglen, 4);
5050 }
5051 if (c->u.a.lensofar >= 4 && len > 0) {
5052 unsigned int l =
5053 min(c->u.a.totallen - c->u.a.lensofar,
5054 (unsigned)len);
5055 memcpy(c->u.a.message + c->u.a.lensofar, p,
5056 l);
5057 p += l;
5058 len -= l;
5059 c->u.a.lensofar += l;
5060 }
5061 if (c->u.a.lensofar == c->u.a.totallen) {
5062 void *reply;
5063 int replylen;
5064 if (agent_query(c->u.a.message,
5065 c->u.a.totallen,
5066 &reply, &replylen,
5067 ssh_agentf_callback, c))
5068 ssh_agentf_callback(c, reply, replylen);
5069 sfree(c->u.a.message);
5070 c->u.a.lensofar = 0;
5071 }
5072 }
5073 bufsize = 0; /* agent channels never back up */
5074 break;
5075 }
5076 if (!c->throttling_conn && bufsize > SSH1_BUFFER_LIMIT) {
5077 c->throttling_conn = 1;
5078 ssh_throttle_conn(ssh, +1);
5079 }
5080 }
5081 }
5082
5083 static void ssh1_smsg_exit_status(Ssh ssh, struct Packet *pktin)
5084 {
5085 ssh->exitcode = ssh_pkt_getuint32(pktin);
5086 logeventf(ssh, "Server sent command exit status %d", ssh->exitcode);
5087 send_packet(ssh, SSH1_CMSG_EXIT_CONFIRMATION, PKT_END);
5088 /*
5089 * In case `helpful' firewalls or proxies tack
5090 * extra human-readable text on the end of the
5091 * session which we might mistake for another
5092 * encrypted packet, we close the session once
5093 * we've sent EXIT_CONFIRMATION.
5094 */
5095 ssh_disconnect(ssh, NULL, NULL, 0, TRUE);
5096 }
5097
5098 /* Helper function to deal with sending tty modes for REQUEST_PTY */
5099 static void ssh1_send_ttymode(void *data, char *mode, char *val)
5100 {
5101 struct Packet *pktout = (struct Packet *)data;
5102 int i = 0;
5103 unsigned int arg = 0;
5104 while (strcmp(mode, ssh_ttymodes[i].mode) != 0) i++;
5105 if (i == lenof(ssh_ttymodes)) return;
5106 switch (ssh_ttymodes[i].type) {
5107 case TTY_OP_CHAR:
5108 arg = ssh_tty_parse_specchar(val);
5109 break;
5110 case TTY_OP_BOOL:
5111 arg = ssh_tty_parse_boolean(val);
5112 break;
5113 }
5114 ssh2_pkt_addbyte(pktout, ssh_ttymodes[i].opcode);
5115 ssh2_pkt_addbyte(pktout, arg);
5116 }
5117
5118
5119 static void do_ssh1_connection(Ssh ssh, unsigned char *in, int inlen,
5120 struct Packet *pktin)
5121 {
5122 crBegin(ssh->do_ssh1_connection_crstate);
5123
5124 ssh->packet_dispatch[SSH1_SMSG_STDOUT_DATA] =
5125 ssh->packet_dispatch[SSH1_SMSG_STDERR_DATA] =
5126 ssh1_smsg_stdout_stderr_data;
5127
5128 ssh->packet_dispatch[SSH1_MSG_CHANNEL_OPEN_CONFIRMATION] =
5129 ssh1_msg_channel_open_confirmation;
5130 ssh->packet_dispatch[SSH1_MSG_CHANNEL_OPEN_FAILURE] =
5131 ssh1_msg_channel_open_failure;
5132 ssh->packet_dispatch[SSH1_MSG_CHANNEL_CLOSE] =
5133 ssh->packet_dispatch[SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION] =
5134 ssh1_msg_channel_close;
5135 ssh->packet_dispatch[SSH1_MSG_CHANNEL_DATA] = ssh1_msg_channel_data;
5136 ssh->packet_dispatch[SSH1_SMSG_EXIT_STATUS] = ssh1_smsg_exit_status;
5137
5138 if (conf_get_int(ssh->conf, CONF_agentfwd) && agent_exists()) {
5139 logevent("Requesting agent forwarding");
5140 send_packet(ssh, SSH1_CMSG_AGENT_REQUEST_FORWARDING, PKT_END);
5141 do {
5142 crReturnV;
5143 } while (!pktin);
5144 if (pktin->type != SSH1_SMSG_SUCCESS
5145 && pktin->type != SSH1_SMSG_FAILURE) {
5146 bombout(("Protocol confusion"));
5147 crStopV;
5148 } else if (pktin->type == SSH1_SMSG_FAILURE) {
5149 logevent("Agent forwarding refused");
5150 } else {
5151 logevent("Agent forwarding enabled");
5152 ssh->agentfwd_enabled = TRUE;
5153 ssh->packet_dispatch[SSH1_SMSG_AGENT_OPEN] = ssh1_smsg_agent_open;
5154 }
5155 }
5156
5157 if (conf_get_int(ssh->conf, CONF_x11_forward) &&
5158 (ssh->x11disp = x11_setup_display(conf_get_str(ssh->conf, CONF_x11_display),
5159 conf_get_int(ssh->conf, CONF_x11_auth), ssh->conf))) {
5160 logevent("Requesting X11 forwarding");
5161 /*
5162 * Note that while we blank the X authentication data here, we don't
5163 * take any special action to blank the start of an X11 channel,
5164 * so using MIT-MAGIC-COOKIE-1 and actually opening an X connection
5165 * without having session blanking enabled is likely to leak your
5166 * cookie into the log.
5167 */
5168 if (ssh->v1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) {
5169 send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING,
5170 PKT_STR, ssh->x11disp->remoteauthprotoname,
5171 PKTT_PASSWORD,
5172 PKT_STR, ssh->x11disp->remoteauthdatastring,
5173 PKTT_OTHER,
5174 PKT_INT, ssh->x11disp->screennum,
5175 PKT_END);
5176 } else {
5177 send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING,
5178 PKT_STR, ssh->x11disp->remoteauthprotoname,
5179 PKTT_PASSWORD,
5180 PKT_STR, ssh->x11disp->remoteauthdatastring,
5181 PKTT_OTHER,
5182 PKT_END);
5183 }
5184 do {
5185 crReturnV;
5186 } while (!pktin);
5187 if (pktin->type != SSH1_SMSG_SUCCESS
5188 && pktin->type != SSH1_SMSG_FAILURE) {
5189 bombout(("Protocol confusion"));
5190 crStopV;
5191 } else if (pktin->type == SSH1_SMSG_FAILURE) {
5192 logevent("X11 forwarding refused");
5193 } else {
5194 logevent("X11 forwarding enabled");
5195 ssh->X11_fwd_enabled = TRUE;
5196 ssh->packet_dispatch[SSH1_SMSG_X11_OPEN] = ssh1_smsg_x11_open;
5197 }
5198 }
5199
5200 ssh_setup_portfwd(ssh, ssh->conf);
5201 ssh->packet_dispatch[SSH1_MSG_PORT_OPEN] = ssh1_msg_port_open;
5202
5203 if (!conf_get_int(ssh->conf, CONF_nopty)) {
5204 struct Packet *pkt;
5205 /* Unpick the terminal-speed string. */
5206 /* XXX perhaps we should allow no speeds to be sent. */
5207 ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */
5208 sscanf(conf_get_str(ssh->conf, CONF_termspeed), "%d,%d", &ssh->ospeed, &ssh->ispeed);
5209 /* Send the pty request. */
5210 pkt = ssh1_pkt_init(SSH1_CMSG_REQUEST_PTY);
5211 ssh_pkt_addstring(pkt, conf_get_str(ssh->conf, CONF_termtype));
5212 ssh_pkt_adduint32(pkt, ssh->term_height);
5213 ssh_pkt_adduint32(pkt, ssh->term_width);
5214 ssh_pkt_adduint32(pkt, 0); /* width in pixels */
5215 ssh_pkt_adduint32(pkt, 0); /* height in pixels */
5216 parse_ttymodes(ssh, ssh1_send_ttymode, (void *)pkt);
5217 ssh_pkt_addbyte(pkt, SSH1_TTY_OP_ISPEED);
5218 ssh_pkt_adduint32(pkt, ssh->ispeed);
5219 ssh_pkt_addbyte(pkt, SSH1_TTY_OP_OSPEED);
5220 ssh_pkt_adduint32(pkt, ssh->ospeed);
5221 ssh_pkt_addbyte(pkt, SSH_TTY_OP_END);
5222 s_wrpkt(ssh, pkt);
5223 ssh->state = SSH_STATE_INTERMED;
5224 do {
5225 crReturnV;
5226 } while (!pktin);
5227 if (pktin->type != SSH1_SMSG_SUCCESS
5228 && pktin->type != SSH1_SMSG_FAILURE) {
5229 bombout(("Protocol confusion"));
5230 crStopV;
5231 } else if (pktin->type == SSH1_SMSG_FAILURE) {
5232 c_write_str(ssh, "Server refused to allocate pty\r\n");
5233 ssh->editing = ssh->echoing = 1;
5234 } else {
5235 logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)",
5236 ssh->ospeed, ssh->ispeed);
5237 ssh->got_pty = TRUE;
5238 }
5239 } else {
5240 ssh->editing = ssh->echoing = 1;
5241 }
5242
5243 if (conf_get_int(ssh->conf, CONF_compression)) {
5244 send_packet(ssh, SSH1_CMSG_REQUEST_COMPRESSION, PKT_INT, 6, PKT_END);
5245 do {
5246 crReturnV;
5247 } while (!pktin);
5248 if (pktin->type != SSH1_SMSG_SUCCESS
5249 && pktin->type != SSH1_SMSG_FAILURE) {
5250 bombout(("Protocol confusion"));
5251 crStopV;
5252 } else if (pktin->type == SSH1_SMSG_FAILURE) {
5253 c_write_str(ssh, "Server refused to compress\r\n");
5254 }
5255 logevent("Started compression");
5256 ssh->v1_compressing = TRUE;
5257 ssh->cs_comp_ctx = zlib_compress_init();
5258 logevent("Initialised zlib (RFC1950) compression");
5259 ssh->sc_comp_ctx = zlib_decompress_init();
5260 logevent("Initialised zlib (RFC1950) decompression");
5261 }
5262
5263 /*
5264 * Start the shell or command.
5265 *
5266 * Special case: if the first-choice command is an SSH-2
5267 * subsystem (hence not usable here) and the second choice
5268 * exists, we fall straight back to that.
5269 */
5270 {
5271 char *cmd = conf_get_str(ssh->conf, CONF_remote_cmd);
5272
5273 if (conf_get_int(ssh->conf, CONF_ssh_subsys) &&
5274 conf_get_str(ssh->conf, CONF_remote_cmd2)) {
5275 cmd = conf_get_str(ssh->conf, CONF_remote_cmd2);
5276 ssh->fallback_cmd = TRUE;
5277 }
5278 if (*cmd)
5279 send_packet(ssh, SSH1_CMSG_EXEC_CMD, PKT_STR, cmd, PKT_END);
5280 else
5281 send_packet(ssh, SSH1_CMSG_EXEC_SHELL, PKT_END);
5282 logevent("Started session");
5283 }
5284
5285 ssh->state = SSH_STATE_SESSION;
5286 if (ssh->size_needed)
5287 ssh_size(ssh, ssh->term_width, ssh->term_height);
5288 if (ssh->eof_needed)
5289 ssh_special(ssh, TS_EOF);
5290
5291 if (ssh->ldisc)
5292 ldisc_send(ssh->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */
5293 ssh->send_ok = 1;
5294 ssh->channels = newtree234(ssh_channelcmp);
5295 while (1) {
5296
5297 /*
5298 * By this point, most incoming packets are already being
5299 * handled by the dispatch table, and we need only pay
5300 * attention to the unusual ones.
5301 */
5302
5303 crReturnV;
5304 if (pktin) {
5305 if (pktin->type == SSH1_SMSG_SUCCESS) {
5306 /* may be from EXEC_SHELL on some servers */
5307 } else if (pktin->type == SSH1_SMSG_FAILURE) {
5308 /* may be from EXEC_SHELL on some servers
5309 * if no pty is available or in other odd cases. Ignore */
5310 } else {
5311 bombout(("Strange packet received: type %d", pktin->type));
5312 crStopV;
5313 }
5314 } else {
5315 while (inlen > 0) {
5316 int len = min(inlen, 512);
5317 send_packet(ssh, SSH1_CMSG_STDIN_DATA,
5318 PKT_INT, len, PKTT_DATA, PKT_DATA, in, len,
5319 PKTT_OTHER, PKT_END);
5320 in += len;
5321 inlen -= len;
5322 }
5323 }
5324 }
5325
5326 crFinishV;
5327 }
5328
5329 /*
5330 * Handle the top-level SSH-2 protocol.
5331 */
5332 static void ssh1_msg_debug(Ssh ssh, struct Packet *pktin)
5333 {
5334 char *msg;
5335 int msglen;
5336
5337 ssh_pkt_getstring(pktin, &msg, &msglen);
5338 logeventf(ssh, "Remote debug message: %.*s", msglen, msg);
5339 }
5340
5341 static void ssh1_msg_disconnect(Ssh ssh, struct Packet *pktin)
5342 {
5343 /* log reason code in disconnect message */
5344 char *msg;
5345 int msglen;
5346
5347 ssh_pkt_getstring(pktin, &msg, &msglen);
5348 bombout(("Server sent disconnect message:\n\"%.*s\"", msglen, msg));
5349 }
5350
5351 static void ssh_msg_ignore(Ssh ssh, struct Packet *pktin)
5352 {
5353 /* Do nothing, because we're ignoring it! Duhh. */
5354 }
5355
5356 static void ssh1_protocol_setup(Ssh ssh)
5357 {
5358 int i;
5359
5360 /*
5361 * Most messages are handled by the coroutines.
5362 */
5363 for (i = 0; i < 256; i++)
5364 ssh->packet_dispatch[i] = NULL;
5365
5366 /*
5367 * These special message types we install handlers for.
5368 */
5369 ssh->packet_dispatch[SSH1_MSG_DISCONNECT] = ssh1_msg_disconnect;
5370 ssh->packet_dispatch[SSH1_MSG_IGNORE] = ssh_msg_ignore;
5371 ssh->packet_dispatch[SSH1_MSG_DEBUG] = ssh1_msg_debug;
5372 }
5373
5374 static void ssh1_protocol(Ssh ssh, void *vin, int inlen,
5375 struct Packet *pktin)
5376 {
5377 unsigned char *in=(unsigned char*)vin;
5378 if (ssh->state == SSH_STATE_CLOSED)
5379 return;
5380
5381 if (pktin && ssh->packet_dispatch[pktin->type]) {
5382 ssh->packet_dispatch[pktin->type](ssh, pktin);
5383 return;
5384 }
5385
5386 if (!ssh->protocol_initial_phase_done) {
5387 if (do_ssh1_login(ssh, in, inlen, pktin))
5388 ssh->protocol_initial_phase_done = TRUE;
5389 else
5390 return;
5391 }
5392
5393 do_ssh1_connection(ssh, in, inlen, pktin);
5394 }
5395
5396 /*
5397 * Utility routine for decoding comma-separated strings in KEXINIT.
5398 */
5399 static int in_commasep_string(char *needle, char *haystack, int haylen)
5400 {
5401 int needlen;
5402 if (!needle || !haystack) /* protect against null pointers */
5403 return 0;
5404 needlen = strlen(needle);
5405 while (1) {
5406 /*
5407 * Is it at the start of the string?
5408 */
5409 if (haylen >= needlen && /* haystack is long enough */
5410 !memcmp(needle, haystack, needlen) && /* initial match */
5411 (haylen == needlen || haystack[needlen] == ',')
5412 /* either , or EOS follows */
5413 )
5414 return 1;
5415 /*
5416 * If not, search for the next comma and resume after that.
5417 * If no comma found, terminate.
5418 */
5419 while (haylen > 0 && *haystack != ',')
5420 haylen--, haystack++;
5421 if (haylen == 0)
5422 return 0;
5423 haylen--, haystack++; /* skip over comma itself */
5424 }
5425 }
5426
5427 /*
5428 * Similar routine for checking whether we have the first string in a list.
5429 */
5430 static int first_in_commasep_string(char *needle, char *haystack, int haylen)
5431 {
5432 int needlen;
5433 if (!needle || !haystack) /* protect against null pointers */
5434 return 0;
5435 needlen = strlen(needle);
5436 /*
5437 * Is it at the start of the string?
5438 */
5439 if (haylen >= needlen && /* haystack is long enough */
5440 !memcmp(needle, haystack, needlen) && /* initial match */
5441 (haylen == needlen || haystack[needlen] == ',')
5442 /* either , or EOS follows */
5443 )
5444 return 1;
5445 return 0;
5446 }
5447
5448
5449 /*
5450 * SSH-2 key creation method.
5451 * (Currently assumes 2 lots of any hash are sufficient to generate
5452 * keys/IVs for any cipher/MAC. SSH2_MKKEY_ITERS documents this assumption.)
5453 */
5454 #define SSH2_MKKEY_ITERS (2)
5455 static void ssh2_mkkey(Ssh ssh, Bignum K, unsigned char *H, char chr,
5456 unsigned char *keyspace)
5457 {
5458 const struct ssh_hash *h = ssh->kex->hash;
5459 void *s;
5460 /* First hlen bytes. */
5461 s = h->init();
5462 if (!(ssh->remote_bugs & BUG_SSH2_DERIVEKEY))
5463 hash_mpint(h, s, K);
5464 h->bytes(s, H, h->hlen);
5465 h->bytes(s, &chr, 1);
5466 h->bytes(s, ssh->v2_session_id, ssh->v2_session_id_len);
5467 h->final(s, keyspace);
5468 /* Next hlen bytes. */
5469 s = h->init();
5470 if (!(ssh->remote_bugs & BUG_SSH2_DERIVEKEY))
5471 hash_mpint(h, s, K);
5472 h->bytes(s, H, h->hlen);
5473 h->bytes(s, keyspace, h->hlen);
5474 h->final(s, keyspace + h->hlen);
5475 }
5476
5477 /*
5478 * Handle the SSH-2 transport layer.
5479 */
5480 static int do_ssh2_transport(Ssh ssh, void *vin, int inlen,
5481 struct Packet *pktin)
5482 {
5483 unsigned char *in = (unsigned char *)vin;
5484 struct do_ssh2_transport_state {
5485 int crLine;
5486 int nbits, pbits, warn_kex, warn_cscipher, warn_sccipher;
5487 Bignum p, g, e, f, K;
5488 void *our_kexinit;
5489 int our_kexinitlen;
5490 int kex_init_value, kex_reply_value;
5491 const struct ssh_mac **maclist;
5492 int nmacs;
5493 const struct ssh2_cipher *cscipher_tobe;
5494 const struct ssh2_cipher *sccipher_tobe;
5495 const struct ssh_mac *csmac_tobe;
5496 const struct ssh_mac *scmac_tobe;
5497 const struct ssh_compress *cscomp_tobe;
5498 const struct ssh_compress *sccomp_tobe;
5499 char *hostkeydata, *sigdata, *rsakeydata, *keystr, *fingerprint;
5500 int hostkeylen, siglen, rsakeylen;
5501 void *hkey; /* actual host key */
5502 void *rsakey; /* for RSA kex */
5503 unsigned char exchange_hash[SSH2_KEX_MAX_HASH_LEN];
5504 int n_preferred_kex;
5505 const struct ssh_kexes *preferred_kex[KEX_MAX];
5506 int n_preferred_ciphers;
5507 const struct ssh2_ciphers *preferred_ciphers[CIPHER_MAX];
5508 const struct ssh_compress *preferred_comp;
5509 int userauth_succeeded; /* for delayed compression */
5510 int pending_compression;
5511 int got_session_id, activated_authconn;
5512 struct Packet *pktout;
5513 int dlgret;
5514 int guessok;
5515 int ignorepkt;
5516 };
5517 crState(do_ssh2_transport_state);
5518
5519 crBeginState;
5520
5521 s->cscipher_tobe = s->sccipher_tobe = NULL;
5522 s->csmac_tobe = s->scmac_tobe = NULL;
5523 s->cscomp_tobe = s->sccomp_tobe = NULL;
5524
5525 s->got_session_id = s->activated_authconn = FALSE;
5526 s->userauth_succeeded = FALSE;
5527 s->pending_compression = FALSE;
5528
5529 /*
5530 * Be prepared to work around the buggy MAC problem.
5531 */
5532 if (ssh->remote_bugs & BUG_SSH2_HMAC)
5533 s->maclist = buggymacs, s->nmacs = lenof(buggymacs);
5534 else
5535 s->maclist = macs, s->nmacs = lenof(macs);
5536
5537 begin_key_exchange:
5538 ssh->pkt_kctx = SSH2_PKTCTX_NOKEX;
5539 {
5540 int i, j, k, commalist_started;
5541
5542 /*
5543 * Set up the preferred key exchange. (NULL => warn below here)
5544 */
5545 s->n_preferred_kex = 0;
5546 for (i = 0; i < KEX_MAX; i++) {
5547 switch (conf_get_int_int(ssh->conf, CONF_ssh_kexlist, i)) {
5548 case KEX_DHGEX:
5549 s->preferred_kex[s->n_preferred_kex++] =
5550 &ssh_diffiehellman_gex;
5551 break;
5552 case KEX_DHGROUP14:
5553 s->preferred_kex[s->n_preferred_kex++] =
5554 &ssh_diffiehellman_group14;
5555 break;
5556 case KEX_DHGROUP1:
5557 s->preferred_kex[s->n_preferred_kex++] =
5558 &ssh_diffiehellman_group1;
5559 break;
5560 case KEX_RSA:
5561 s->preferred_kex[s->n_preferred_kex++] =
5562 &ssh_rsa_kex;
5563 break;
5564 case KEX_WARN:
5565 /* Flag for later. Don't bother if it's the last in
5566 * the list. */
5567 if (i < KEX_MAX - 1) {
5568 s->preferred_kex[s->n_preferred_kex++] = NULL;
5569 }
5570 break;
5571 }
5572 }
5573
5574 /*
5575 * Set up the preferred ciphers. (NULL => warn below here)
5576 */
5577 s->n_preferred_ciphers = 0;
5578 for (i = 0; i < CIPHER_MAX; i++) {
5579 switch (conf_get_int_int(ssh->conf, CONF_ssh_cipherlist, i)) {
5580 case CIPHER_BLOWFISH:
5581 s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_blowfish;
5582 break;
5583 case CIPHER_DES:
5584 if (conf_get_int(ssh->conf, CONF_ssh2_des_cbc)) {
5585 s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_des;
5586 }
5587 break;
5588 case CIPHER_3DES:
5589 s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_3des;
5590 break;
5591 case CIPHER_AES:
5592 s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_aes;
5593 break;
5594 case CIPHER_ARCFOUR:
5595 s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_arcfour;
5596 break;
5597 case CIPHER_WARN:
5598 /* Flag for later. Don't bother if it's the last in
5599 * the list. */
5600 if (i < CIPHER_MAX - 1) {
5601 s->preferred_ciphers[s->n_preferred_ciphers++] = NULL;
5602 }
5603 break;
5604 }
5605 }
5606
5607 /*
5608 * Set up preferred compression.
5609 */
5610 if (conf_get_int(ssh->conf, CONF_compression))
5611 s->preferred_comp = &ssh_zlib;
5612 else
5613 s->preferred_comp = &ssh_comp_none;
5614
5615 /*
5616 * Enable queueing of outgoing auth- or connection-layer
5617 * packets while we are in the middle of a key exchange.
5618 */
5619 ssh->queueing = TRUE;
5620
5621 /*
5622 * Flag that KEX is in progress.
5623 */
5624 ssh->kex_in_progress = TRUE;
5625
5626 /*
5627 * Construct and send our key exchange packet.
5628 */
5629 s->pktout = ssh2_pkt_init(SSH2_MSG_KEXINIT);
5630 for (i = 0; i < 16; i++)
5631 ssh2_pkt_addbyte(s->pktout, (unsigned char) random_byte());
5632 /* List key exchange algorithms. */
5633 ssh2_pkt_addstring_start(s->pktout);
5634 commalist_started = 0;
5635 for (i = 0; i < s->n_preferred_kex; i++) {
5636 const struct ssh_kexes *k = s->preferred_kex[i];
5637 if (!k) continue; /* warning flag */
5638 for (j = 0; j < k->nkexes; j++) {
5639 if (commalist_started)
5640 ssh2_pkt_addstring_str(s->pktout, ",");
5641 ssh2_pkt_addstring_str(s->pktout, k->list[j]->name);
5642 commalist_started = 1;
5643 }
5644 }
5645 /* List server host key algorithms. */
5646 ssh2_pkt_addstring_start(s->pktout);
5647 for (i = 0; i < lenof(hostkey_algs); i++) {
5648 ssh2_pkt_addstring_str(s->pktout, hostkey_algs[i]->name);
5649 if (i < lenof(hostkey_algs) - 1)
5650 ssh2_pkt_addstring_str(s->pktout, ",");
5651 }
5652 /* List encryption algorithms (client->server then server->client). */
5653 for (k = 0; k < 2; k++) {
5654 ssh2_pkt_addstring_start(s->pktout);
5655 commalist_started = 0;
5656 for (i = 0; i < s->n_preferred_ciphers; i++) {
5657 const struct ssh2_ciphers *c = s->preferred_ciphers[i];
5658 if (!c) continue; /* warning flag */
5659 for (j = 0; j < c->nciphers; j++) {
5660 if (commalist_started)
5661 ssh2_pkt_addstring_str(s->pktout, ",");
5662 ssh2_pkt_addstring_str(s->pktout, c->list[j]->name);
5663 commalist_started = 1;
5664 }
5665 }
5666 }
5667 /* List MAC algorithms (client->server then server->client). */
5668 for (j = 0; j < 2; j++) {
5669 ssh2_pkt_addstring_start(s->pktout);
5670 for (i = 0; i < s->nmacs; i++) {
5671 ssh2_pkt_addstring_str(s->pktout, s->maclist[i]->name);
5672 if (i < s->nmacs - 1)
5673 ssh2_pkt_addstring_str(s->pktout, ",");
5674 }
5675 }
5676 /* List client->server compression algorithms,
5677 * then server->client compression algorithms. (We use the
5678 * same set twice.) */
5679 for (j = 0; j < 2; j++) {
5680 ssh2_pkt_addstring_start(s->pktout);
5681 assert(lenof(compressions) > 1);
5682 /* Prefer non-delayed versions */
5683 ssh2_pkt_addstring_str(s->pktout, s->preferred_comp->name);
5684 /* We don't even list delayed versions of algorithms until
5685 * they're allowed to be used, to avoid a race. See the end of
5686 * this function. */
5687 if (s->userauth_succeeded && s->preferred_comp->delayed_name) {
5688 ssh2_pkt_addstring_str(s->pktout, ",");
5689 ssh2_pkt_addstring_str(s->pktout,
5690 s->preferred_comp->delayed_name);
5691 }
5692 for (i = 0; i < lenof(compressions); i++) {
5693 const struct ssh_compress *c = compressions[i];
5694 if (c != s->preferred_comp) {
5695 ssh2_pkt_addstring_str(s->pktout, ",");
5696 ssh2_pkt_addstring_str(s->pktout, c->name);
5697 if (s->userauth_succeeded && c->delayed_name) {
5698 ssh2_pkt_addstring_str(s->pktout, ",");
5699 ssh2_pkt_addstring_str(s->pktout, c->delayed_name);
5700 }
5701 }
5702 }
5703 }
5704 /* List client->server languages. Empty list. */
5705 ssh2_pkt_addstring_start(s->pktout);
5706 /* List server->client languages. Empty list. */
5707 ssh2_pkt_addstring_start(s->pktout);
5708 /* First KEX packet does _not_ follow, because we're not that brave. */
5709 ssh2_pkt_addbool(s->pktout, FALSE);
5710 /* Reserved. */
5711 ssh2_pkt_adduint32(s->pktout, 0);
5712 }
5713
5714 s->our_kexinitlen = s->pktout->length - 5;
5715 s->our_kexinit = snewn(s->our_kexinitlen, unsigned char);
5716 memcpy(s->our_kexinit, s->pktout->data + 5, s->our_kexinitlen);
5717
5718 ssh2_pkt_send_noqueue(ssh, s->pktout);
5719
5720 if (!pktin)
5721 crWaitUntil(pktin);
5722
5723 /*
5724 * Now examine the other side's KEXINIT to see what we're up
5725 * to.
5726 */
5727 {
5728 char *str, *preferred;
5729 int i, j, len;
5730
5731 if (pktin->type != SSH2_MSG_KEXINIT) {
5732 bombout(("expected key exchange packet from server"));
5733 crStop(0);
5734 }
5735 ssh->kex = NULL;
5736 ssh->hostkey = NULL;
5737 s->cscipher_tobe = NULL;
5738 s->sccipher_tobe = NULL;
5739 s->csmac_tobe = NULL;
5740 s->scmac_tobe = NULL;
5741 s->cscomp_tobe = NULL;
5742 s->sccomp_tobe = NULL;
5743 s->warn_kex = s->warn_cscipher = s->warn_sccipher = FALSE;
5744
5745 pktin->savedpos += 16; /* skip garbage cookie */
5746 ssh_pkt_getstring(pktin, &str, &len); /* key exchange algorithms */
5747
5748 preferred = NULL;
5749 for (i = 0; i < s->n_preferred_kex; i++) {
5750 const struct ssh_kexes *k = s->preferred_kex[i];
5751 if (!k) {
5752 s->warn_kex = TRUE;
5753 } else {
5754 for (j = 0; j < k->nkexes; j++) {
5755 if (!preferred) preferred = k->list[j]->name;
5756 if (in_commasep_string(k->list[j]->name, str, len)) {
5757 ssh->kex = k->list[j];
5758 break;
5759 }
5760 }
5761 }
5762 if (ssh->kex)
5763 break;
5764 }
5765 if (!ssh->kex) {
5766 bombout(("Couldn't agree a key exchange algorithm (available: %s)",
5767 str ? str : "(null)"));
5768 crStop(0);
5769 }
5770 /*
5771 * Note that the server's guess is considered wrong if it doesn't match
5772 * the first algorithm in our list, even if it's still the algorithm
5773 * we end up using.
5774 */
5775 s->guessok = first_in_commasep_string(preferred, str, len);
5776 ssh_pkt_getstring(pktin, &str, &len); /* host key algorithms */
5777 for (i = 0; i < lenof(hostkey_algs); i++) {
5778 if (in_commasep_string(hostkey_algs[i]->name, str, len)) {
5779 ssh->hostkey = hostkey_algs[i];
5780 break;
5781 }
5782 }
5783 if (!ssh->hostkey) {
5784 bombout(("Couldn't agree a host key algorithm (available: %s)",
5785 str ? str : "(null)"));
5786 crStop(0);
5787 }
5788
5789 s->guessok = s->guessok &&
5790 first_in_commasep_string(hostkey_algs[0]->name, str, len);
5791 ssh_pkt_getstring(pktin, &str, &len); /* client->server cipher */
5792 for (i = 0; i < s->n_preferred_ciphers; i++) {
5793 const struct ssh2_ciphers *c = s->preferred_ciphers[i];
5794 if (!c) {
5795 s->warn_cscipher = TRUE;
5796 } else {
5797 for (j = 0; j < c->nciphers; j++) {
5798 if (in_commasep_string(c->list[j]->name, str, len)) {
5799 s->cscipher_tobe = c->list[j];
5800 break;
5801 }
5802 }
5803 }
5804 if (s->cscipher_tobe)
5805 break;
5806 }
5807 if (!s->cscipher_tobe) {
5808 bombout(("Couldn't agree a client-to-server cipher (available: %s)",
5809 str ? str : "(null)"));
5810 crStop(0);
5811 }
5812
5813 ssh_pkt_getstring(pktin, &str, &len); /* server->client cipher */
5814 for (i = 0; i < s->n_preferred_ciphers; i++) {
5815 const struct ssh2_ciphers *c = s->preferred_ciphers[i];
5816 if (!c) {
5817 s->warn_sccipher = TRUE;
5818 } else {
5819 for (j = 0; j < c->nciphers; j++) {
5820 if (in_commasep_string(c->list[j]->name, str, len)) {
5821 s->sccipher_tobe = c->list[j];
5822 break;
5823 }
5824 }
5825 }
5826 if (s->sccipher_tobe)
5827 break;
5828 }
5829 if (!s->sccipher_tobe) {
5830 bombout(("Couldn't agree a server-to-client cipher (available: %s)",
5831 str ? str : "(null)"));
5832 crStop(0);
5833 }
5834
5835 ssh_pkt_getstring(pktin, &str, &len); /* client->server mac */
5836 for (i = 0; i < s->nmacs; i++) {
5837 if (in_commasep_string(s->maclist[i]->name, str, len)) {
5838 s->csmac_tobe = s->maclist[i];
5839 break;
5840 }
5841 }
5842 ssh_pkt_getstring(pktin, &str, &len); /* server->client mac */
5843 for (i = 0; i < s->nmacs; i++) {
5844 if (in_commasep_string(s->maclist[i]->name, str, len)) {
5845 s->scmac_tobe = s->maclist[i];
5846 break;
5847 }
5848 }
5849 ssh_pkt_getstring(pktin, &str, &len); /* client->server compression */
5850 for (i = 0; i < lenof(compressions) + 1; i++) {
5851 const struct ssh_compress *c =
5852 i == 0 ? s->preferred_comp : compressions[i - 1];
5853 if (in_commasep_string(c->name, str, len)) {
5854 s->cscomp_tobe = c;
5855 break;
5856 } else if (in_commasep_string(c->delayed_name, str, len)) {
5857 if (s->userauth_succeeded) {
5858 s->cscomp_tobe = c;
5859 break;
5860 } else {
5861 s->pending_compression = TRUE; /* try this later */
5862 }
5863 }
5864 }
5865 ssh_pkt_getstring(pktin, &str, &len); /* server->client compression */
5866 for (i = 0; i < lenof(compressions) + 1; i++) {
5867 const struct ssh_compress *c =
5868 i == 0 ? s->preferred_comp : compressions[i - 1];
5869 if (in_commasep_string(c->name, str, len)) {
5870 s->sccomp_tobe = c;
5871 break;
5872 } else if (in_commasep_string(c->delayed_name, str, len)) {
5873 if (s->userauth_succeeded) {
5874 s->sccomp_tobe = c;
5875 break;
5876 } else {
5877 s->pending_compression = TRUE; /* try this later */
5878 }
5879 }
5880 }
5881 if (s->pending_compression) {
5882 logevent("Server supports delayed compression; "
5883 "will try this later");
5884 }
5885 ssh_pkt_getstring(pktin, &str, &len); /* client->server language */
5886 ssh_pkt_getstring(pktin, &str, &len); /* server->client language */
5887 s->ignorepkt = ssh2_pkt_getbool(pktin) && !s->guessok;
5888
5889 if (s->warn_kex) {
5890 ssh_set_frozen(ssh, 1);
5891 s->dlgret = askalg(ssh->frontend, "key-exchange algorithm",
5892 ssh->kex->name,
5893 ssh_dialog_callback, ssh);
5894 if (s->dlgret < 0) {
5895 do {
5896 crReturn(0);
5897 if (pktin) {
5898 bombout(("Unexpected data from server while"
5899 " waiting for user response"));
5900 crStop(0);
5901 }
5902 } while (pktin || inlen > 0);
5903 s->dlgret = ssh->user_response;
5904 }
5905 ssh_set_frozen(ssh, 0);
5906 if (s->dlgret == 0) {
5907 ssh_disconnect(ssh, "User aborted at kex warning", NULL,
5908 0, TRUE);
5909 crStop(0);
5910 }
5911 }
5912
5913 if (s->warn_cscipher) {
5914 ssh_set_frozen(ssh, 1);
5915 s->dlgret = askalg(ssh->frontend,
5916 "client-to-server cipher",
5917 s->cscipher_tobe->name,
5918 ssh_dialog_callback, ssh);
5919 if (s->dlgret < 0) {
5920 do {
5921 crReturn(0);
5922 if (pktin) {
5923 bombout(("Unexpected data from server while"
5924 " waiting for user response"));
5925 crStop(0);
5926 }
5927 } while (pktin || inlen > 0);
5928 s->dlgret = ssh->user_response;
5929 }
5930 ssh_set_frozen(ssh, 0);
5931 if (s->dlgret == 0) {
5932 ssh_disconnect(ssh, "User aborted at cipher warning", NULL,
5933 0, TRUE);
5934 crStop(0);
5935 }
5936 }
5937
5938 if (s->warn_sccipher) {
5939 ssh_set_frozen(ssh, 1);
5940 s->dlgret = askalg(ssh->frontend,
5941 "server-to-client cipher",
5942 s->sccipher_tobe->name,
5943 ssh_dialog_callback, ssh);
5944 if (s->dlgret < 0) {
5945 do {
5946 crReturn(0);
5947 if (pktin) {
5948 bombout(("Unexpected data from server while"
5949 " waiting for user response"));
5950 crStop(0);
5951 }
5952 } while (pktin || inlen > 0);
5953 s->dlgret = ssh->user_response;
5954 }
5955 ssh_set_frozen(ssh, 0);
5956 if (s->dlgret == 0) {
5957 ssh_disconnect(ssh, "User aborted at cipher warning", NULL,
5958 0, TRUE);
5959 crStop(0);
5960 }
5961 }
5962
5963 ssh->exhash = ssh->kex->hash->init();
5964 hash_string(ssh->kex->hash, ssh->exhash, ssh->v_c, strlen(ssh->v_c));
5965 hash_string(ssh->kex->hash, ssh->exhash, ssh->v_s, strlen(ssh->v_s));
5966 hash_string(ssh->kex->hash, ssh->exhash,
5967 s->our_kexinit, s->our_kexinitlen);
5968 sfree(s->our_kexinit);
5969 if (pktin->length > 5)
5970 hash_string(ssh->kex->hash, ssh->exhash,
5971 pktin->data + 5, pktin->length - 5);
5972
5973 if (s->ignorepkt) /* first_kex_packet_follows */
5974 crWaitUntil(pktin); /* Ignore packet */
5975 }
5976
5977 if (ssh->kex->main_type == KEXTYPE_DH) {
5978 /*
5979 * Work out the number of bits of key we will need from the
5980 * key exchange. We start with the maximum key length of
5981 * either cipher...
5982 */
5983 {
5984 int csbits, scbits;
5985
5986 csbits = s->cscipher_tobe->keylen;
5987 scbits = s->sccipher_tobe->keylen;
5988 s->nbits = (csbits > scbits ? csbits : scbits);
5989 }
5990 /* The keys only have hlen-bit entropy, since they're based on
5991 * a hash. So cap the key size at hlen bits. */
5992 if (s->nbits > ssh->kex->hash->hlen * 8)
5993 s->nbits = ssh->kex->hash->hlen * 8;
5994
5995 /*
5996 * If we're doing Diffie-Hellman group exchange, start by
5997 * requesting a group.
5998 */
5999 if (!ssh->kex->pdata) {
6000 logevent("Doing Diffie-Hellman group exchange");
6001 ssh->pkt_kctx = SSH2_PKTCTX_DHGEX;
6002 /*
6003 * Work out how big a DH group we will need to allow that
6004 * much data.
6005 */
6006 s->pbits = 512 << ((s->nbits - 1) / 64);
6007 s->pktout = ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST);
6008 ssh2_pkt_adduint32(s->pktout, s->pbits);
6009 ssh2_pkt_send_noqueue(ssh, s->pktout);
6010
6011 crWaitUntil(pktin);
6012 if (pktin->type != SSH2_MSG_KEX_DH_GEX_GROUP) {
6013 bombout(("expected key exchange group packet from server"));
6014 crStop(0);
6015 }
6016 s->p = ssh2_pkt_getmp(pktin);
6017 s->g = ssh2_pkt_getmp(pktin);
6018 if (!s->p || !s->g) {
6019 bombout(("unable to read mp-ints from incoming group packet"));
6020 crStop(0);
6021 }
6022 ssh->kex_ctx = dh_setup_gex(s->p, s->g);
6023 s->kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT;
6024 s->kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY;
6025 } else {
6026 ssh->pkt_kctx = SSH2_PKTCTX_DHGROUP;
6027 ssh->kex_ctx = dh_setup_group(ssh->kex);
6028 s->kex_init_value = SSH2_MSG_KEXDH_INIT;
6029 s->kex_reply_value = SSH2_MSG_KEXDH_REPLY;
6030 logeventf(ssh, "Using Diffie-Hellman with standard group \"%s\"",
6031 ssh->kex->groupname);
6032 }
6033
6034 logeventf(ssh, "Doing Diffie-Hellman key exchange with hash %s",
6035 ssh->kex->hash->text_name);
6036 /*
6037 * Now generate and send e for Diffie-Hellman.
6038 */
6039 set_busy_status(ssh->frontend, BUSY_CPU); /* this can take a while */
6040 s->e = dh_create_e(ssh->kex_ctx, s->nbits * 2);
6041 s->pktout = ssh2_pkt_init(s->kex_init_value);
6042 ssh2_pkt_addmp(s->pktout, s->e);
6043 ssh2_pkt_send_noqueue(ssh, s->pktout);
6044
6045 set_busy_status(ssh->frontend, BUSY_WAITING); /* wait for server */
6046 crWaitUntil(pktin);
6047 if (pktin->type != s->kex_reply_value) {
6048 bombout(("expected key exchange reply packet from server"));
6049 crStop(0);
6050 }
6051 set_busy_status(ssh->frontend, BUSY_CPU); /* cogitate */
6052 ssh_pkt_getstring(pktin, &s->hostkeydata, &s->hostkeylen);
6053 s->hkey = ssh->hostkey->newkey(s->hostkeydata, s->hostkeylen);
6054 s->f = ssh2_pkt_getmp(pktin);
6055 if (!s->f) {
6056 bombout(("unable to parse key exchange reply packet"));
6057 crStop(0);
6058 }
6059 ssh_pkt_getstring(pktin, &s->sigdata, &s->siglen);
6060
6061 s->K = dh_find_K(ssh->kex_ctx, s->f);
6062
6063 /* We assume everything from now on will be quick, and it might
6064 * involve user interaction. */
6065 set_busy_status(ssh->frontend, BUSY_NOT);
6066
6067 hash_string(ssh->kex->hash, ssh->exhash, s->hostkeydata, s->hostkeylen);
6068 if (!ssh->kex->pdata) {
6069 hash_uint32(ssh->kex->hash, ssh->exhash, s->pbits);
6070 hash_mpint(ssh->kex->hash, ssh->exhash, s->p);
6071 hash_mpint(ssh->kex->hash, ssh->exhash, s->g);
6072 }
6073 hash_mpint(ssh->kex->hash, ssh->exhash, s->e);
6074 hash_mpint(ssh->kex->hash, ssh->exhash, s->f);
6075
6076 dh_cleanup(ssh->kex_ctx);
6077 freebn(s->f);
6078 if (!ssh->kex->pdata) {
6079 freebn(s->g);
6080 freebn(s->p);
6081 }
6082 } else {
6083 logeventf(ssh, "Doing RSA key exchange with hash %s",
6084 ssh->kex->hash->text_name);
6085 ssh->pkt_kctx = SSH2_PKTCTX_RSAKEX;
6086 /*
6087 * RSA key exchange. First expect a KEXRSA_PUBKEY packet
6088 * from the server.
6089 */
6090 crWaitUntil(pktin);
6091 if (pktin->type != SSH2_MSG_KEXRSA_PUBKEY) {
6092 bombout(("expected RSA public key packet from server"));
6093 crStop(0);
6094 }
6095
6096 ssh_pkt_getstring(pktin, &s->hostkeydata, &s->hostkeylen);
6097 hash_string(ssh->kex->hash, ssh->exhash,
6098 s->hostkeydata, s->hostkeylen);
6099 s->hkey = ssh->hostkey->newkey(s->hostkeydata, s->hostkeylen);
6100
6101 {
6102 char *keydata;
6103 ssh_pkt_getstring(pktin, &keydata, &s->rsakeylen);
6104 s->rsakeydata = snewn(s->rsakeylen, char);
6105 memcpy(s->rsakeydata, keydata, s->rsakeylen);
6106 }
6107
6108 s->rsakey = ssh_rsakex_newkey(s->rsakeydata, s->rsakeylen);
6109 if (!s->rsakey) {
6110 sfree(s->rsakeydata);
6111 bombout(("unable to parse RSA public key from server"));
6112 crStop(0);
6113 }
6114
6115 hash_string(ssh->kex->hash, ssh->exhash, s->rsakeydata, s->rsakeylen);
6116
6117 /*
6118 * Next, set up a shared secret K, of precisely KLEN -
6119 * 2*HLEN - 49 bits, where KLEN is the bit length of the
6120 * RSA key modulus and HLEN is the bit length of the hash
6121 * we're using.
6122 */
6123 {
6124 int klen = ssh_rsakex_klen(s->rsakey);
6125 int nbits = klen - (2*ssh->kex->hash->hlen*8 + 49);
6126 int i, byte = 0;
6127 unsigned char *kstr1, *kstr2, *outstr;
6128 int kstr1len, kstr2len, outstrlen;
6129
6130 s->K = bn_power_2(nbits - 1);
6131
6132 for (i = 0; i < nbits; i++) {
6133 if ((i & 7) == 0) {
6134 byte = random_byte();
6135 }
6136 bignum_set_bit(s->K, i, (byte >> (i & 7)) & 1);
6137 }
6138
6139 /*
6140 * Encode this as an mpint.
6141 */
6142 kstr1 = ssh2_mpint_fmt(s->K, &kstr1len);
6143 kstr2 = snewn(kstr2len = 4 + kstr1len, unsigned char);
6144 PUT_32BIT(kstr2, kstr1len);
6145 memcpy(kstr2 + 4, kstr1, kstr1len);
6146
6147 /*
6148 * Encrypt it with the given RSA key.
6149 */
6150 outstrlen = (klen + 7) / 8;
6151 outstr = snewn(outstrlen, unsigned char);
6152 ssh_rsakex_encrypt(ssh->kex->hash, kstr2, kstr2len,
6153 outstr, outstrlen, s->rsakey);
6154
6155 /*
6156 * And send it off in a return packet.
6157 */
6158 s->pktout = ssh2_pkt_init(SSH2_MSG_KEXRSA_SECRET);
6159 ssh2_pkt_addstring_start(s->pktout);
6160 ssh2_pkt_addstring_data(s->pktout, (char *)outstr, outstrlen);
6161 ssh2_pkt_send_noqueue(ssh, s->pktout);
6162
6163 hash_string(ssh->kex->hash, ssh->exhash, outstr, outstrlen);
6164
6165 sfree(kstr2);
6166 sfree(kstr1);
6167 sfree(outstr);
6168 }
6169
6170 ssh_rsakex_freekey(s->rsakey);
6171
6172 crWaitUntil(pktin);
6173 if (pktin->type != SSH2_MSG_KEXRSA_DONE) {
6174 sfree(s->rsakeydata);
6175 bombout(("expected signature packet from server"));
6176 crStop(0);
6177 }
6178
6179 ssh_pkt_getstring(pktin, &s->sigdata, &s->siglen);
6180
6181 sfree(s->rsakeydata);
6182 }
6183
6184 hash_mpint(ssh->kex->hash, ssh->exhash, s->K);
6185 assert(ssh->kex->hash->hlen <= sizeof(s->exchange_hash));
6186 ssh->kex->hash->final(ssh->exhash, s->exchange_hash);
6187
6188 ssh->kex_ctx = NULL;
6189
6190 #if 0
6191 debug(("Exchange hash is:\n"));
6192 dmemdump(s->exchange_hash, ssh->kex->hash->hlen);
6193 #endif
6194
6195 if (!s->hkey ||
6196 !ssh->hostkey->verifysig(s->hkey, s->sigdata, s->siglen,
6197 (char *)s->exchange_hash,
6198 ssh->kex->hash->hlen)) {
6199 bombout(("Server's host key did not match the signature supplied"));
6200 crStop(0);
6201 }
6202
6203 /*
6204 * Authenticate remote host: verify host key. (We've already
6205 * checked the signature of the exchange hash.)
6206 */
6207 s->keystr = ssh->hostkey->fmtkey(s->hkey);
6208 s->fingerprint = ssh->hostkey->fingerprint(s->hkey);
6209 ssh_set_frozen(ssh, 1);
6210 s->dlgret = verify_ssh_host_key(ssh->frontend,
6211 ssh->savedhost, ssh->savedport,
6212 ssh->hostkey->keytype, s->keystr,
6213 s->fingerprint,
6214 ssh_dialog_callback, ssh);
6215 if (s->dlgret < 0) {
6216 do {
6217 crReturn(0);
6218 if (pktin) {
6219 bombout(("Unexpected data from server while waiting"
6220 " for user host key response"));
6221 crStop(0);
6222 }
6223 } while (pktin || inlen > 0);
6224 s->dlgret = ssh->user_response;
6225 }
6226 ssh_set_frozen(ssh, 0);
6227 if (s->dlgret == 0) {
6228 ssh_disconnect(ssh, "User aborted at host key verification", NULL,
6229 0, TRUE);
6230 crStop(0);
6231 }
6232 if (!s->got_session_id) { /* don't bother logging this in rekeys */
6233 logevent("Host key fingerprint is:");
6234 logevent(s->fingerprint);
6235 }
6236 sfree(s->fingerprint);
6237 sfree(s->keystr);
6238 ssh->hostkey->freekey(s->hkey);
6239
6240 /*
6241 * The exchange hash from the very first key exchange is also
6242 * the session id, used in session key construction and
6243 * authentication.
6244 */
6245 if (!s->got_session_id) {
6246 assert(sizeof(s->exchange_hash) <= sizeof(ssh->v2_session_id));
6247 memcpy(ssh->v2_session_id, s->exchange_hash,
6248 sizeof(s->exchange_hash));
6249 ssh->v2_session_id_len = ssh->kex->hash->hlen;
6250 assert(ssh->v2_session_id_len <= sizeof(ssh->v2_session_id));
6251 s->got_session_id = TRUE;
6252 }
6253
6254 /*
6255 * Send SSH2_MSG_NEWKEYS.
6256 */
6257 s->pktout = ssh2_pkt_init(SSH2_MSG_NEWKEYS);
6258 ssh2_pkt_send_noqueue(ssh, s->pktout);
6259 ssh->outgoing_data_size = 0; /* start counting from here */
6260
6261 /*
6262 * We've sent client NEWKEYS, so create and initialise
6263 * client-to-server session keys.
6264 */
6265 if (ssh->cs_cipher_ctx)
6266 ssh->cscipher->free_context(ssh->cs_cipher_ctx);
6267 ssh->cscipher = s->cscipher_tobe;
6268 ssh->cs_cipher_ctx = ssh->cscipher->make_context();
6269
6270 if (ssh->cs_mac_ctx)
6271 ssh->csmac->free_context(ssh->cs_mac_ctx);
6272 ssh->csmac = s->csmac_tobe;
6273 ssh->cs_mac_ctx = ssh->csmac->make_context();
6274
6275 if (ssh->cs_comp_ctx)
6276 ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx);
6277 ssh->cscomp = s->cscomp_tobe;
6278 ssh->cs_comp_ctx = ssh->cscomp->compress_init();
6279
6280 /*
6281 * Set IVs on client-to-server keys. Here we use the exchange
6282 * hash from the _first_ key exchange.
6283 */
6284 {
6285 unsigned char keyspace[SSH2_KEX_MAX_HASH_LEN * SSH2_MKKEY_ITERS];
6286 assert(sizeof(keyspace) >= ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6287 ssh2_mkkey(ssh,s->K,s->exchange_hash,'C',keyspace);
6288 assert((ssh->cscipher->keylen+7) / 8 <=
6289 ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6290 ssh->cscipher->setkey(ssh->cs_cipher_ctx, keyspace);
6291 ssh2_mkkey(ssh,s->K,s->exchange_hash,'A',keyspace);
6292 assert(ssh->cscipher->blksize <=
6293 ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6294 ssh->cscipher->setiv(ssh->cs_cipher_ctx, keyspace);
6295 ssh2_mkkey(ssh,s->K,s->exchange_hash,'E',keyspace);
6296 assert(ssh->csmac->len <=
6297 ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6298 ssh->csmac->setkey(ssh->cs_mac_ctx, keyspace);
6299 smemclr(keyspace, sizeof(keyspace));
6300 }
6301
6302 logeventf(ssh, "Initialised %.200s client->server encryption",
6303 ssh->cscipher->text_name);
6304 logeventf(ssh, "Initialised %.200s client->server MAC algorithm",
6305 ssh->csmac->text_name);
6306 if (ssh->cscomp->text_name)
6307 logeventf(ssh, "Initialised %s compression",
6308 ssh->cscomp->text_name);
6309
6310 /*
6311 * Now our end of the key exchange is complete, we can send all
6312 * our queued higher-layer packets.
6313 */
6314 ssh->queueing = FALSE;
6315 ssh2_pkt_queuesend(ssh);
6316
6317 /*
6318 * Expect SSH2_MSG_NEWKEYS from server.
6319 */
6320 crWaitUntil(pktin);
6321 if (pktin->type != SSH2_MSG_NEWKEYS) {
6322 bombout(("expected new-keys packet from server"));
6323 crStop(0);
6324 }
6325 ssh->incoming_data_size = 0; /* start counting from here */
6326
6327 /*
6328 * We've seen server NEWKEYS, so create and initialise
6329 * server-to-client session keys.
6330 */
6331 if (ssh->sc_cipher_ctx)
6332 ssh->sccipher->free_context(ssh->sc_cipher_ctx);
6333 ssh->sccipher = s->sccipher_tobe;
6334 ssh->sc_cipher_ctx = ssh->sccipher->make_context();
6335
6336 if (ssh->sc_mac_ctx)
6337 ssh->scmac->free_context(ssh->sc_mac_ctx);
6338 ssh->scmac = s->scmac_tobe;
6339 ssh->sc_mac_ctx = ssh->scmac->make_context();
6340
6341 if (ssh->sc_comp_ctx)
6342 ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx);
6343 ssh->sccomp = s->sccomp_tobe;
6344 ssh->sc_comp_ctx = ssh->sccomp->decompress_init();
6345
6346 /*
6347 * Set IVs on server-to-client keys. Here we use the exchange
6348 * hash from the _first_ key exchange.
6349 */
6350 {
6351 unsigned char keyspace[SSH2_KEX_MAX_HASH_LEN * SSH2_MKKEY_ITERS];
6352 assert(sizeof(keyspace) >= ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6353 ssh2_mkkey(ssh,s->K,s->exchange_hash,'D',keyspace);
6354 assert((ssh->sccipher->keylen+7) / 8 <=
6355 ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6356 ssh->sccipher->setkey(ssh->sc_cipher_ctx, keyspace);
6357 ssh2_mkkey(ssh,s->K,s->exchange_hash,'B',keyspace);
6358 assert(ssh->sccipher->blksize <=
6359 ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6360 ssh->sccipher->setiv(ssh->sc_cipher_ctx, keyspace);
6361 ssh2_mkkey(ssh,s->K,s->exchange_hash,'F',keyspace);
6362 assert(ssh->scmac->len <=
6363 ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6364 ssh->scmac->setkey(ssh->sc_mac_ctx, keyspace);
6365 smemclr(keyspace, sizeof(keyspace));
6366 }
6367 logeventf(ssh, "Initialised %.200s server->client encryption",
6368 ssh->sccipher->text_name);
6369 logeventf(ssh, "Initialised %.200s server->client MAC algorithm",
6370 ssh->scmac->text_name);
6371 if (ssh->sccomp->text_name)
6372 logeventf(ssh, "Initialised %s decompression",
6373 ssh->sccomp->text_name);
6374
6375 /*
6376 * Free shared secret.
6377 */
6378 freebn(s->K);
6379
6380 /*
6381 * Key exchange is over. Loop straight back round if we have a
6382 * deferred rekey reason.
6383 */
6384 if (ssh->deferred_rekey_reason) {
6385 logevent(ssh->deferred_rekey_reason);
6386 pktin = NULL;
6387 ssh->deferred_rekey_reason = NULL;
6388 goto begin_key_exchange;
6389 }
6390
6391 /*
6392 * Otherwise, schedule a timer for our next rekey.
6393 */
6394 ssh->kex_in_progress = FALSE;
6395 ssh->last_rekey = GETTICKCOUNT();
6396 if (conf_get_int(ssh->conf, CONF_ssh_rekey_time) != 0)
6397 ssh->next_rekey = schedule_timer(conf_get_int(ssh->conf, CONF_ssh_rekey_time)*60*TICKSPERSEC,
6398 ssh2_timer, ssh);
6399
6400 /*
6401 * Now we're encrypting. Begin returning 1 to the protocol main
6402 * function so that other things can run on top of the
6403 * transport. If we ever see a KEXINIT, we must go back to the
6404 * start.
6405 *
6406 * We _also_ go back to the start if we see pktin==NULL and
6407 * inlen negative, because this is a special signal meaning
6408 * `initiate client-driven rekey', and `in' contains a message
6409 * giving the reason for the rekey.
6410 *
6411 * inlen==-1 means always initiate a rekey;
6412 * inlen==-2 means that userauth has completed successfully and
6413 * we should consider rekeying (for delayed compression).
6414 */
6415 while (!((pktin && pktin->type == SSH2_MSG_KEXINIT) ||
6416 (!pktin && inlen < 0))) {
6417 wait_for_rekey:
6418 if (!ssh->protocol_initial_phase_done) {
6419 ssh->protocol_initial_phase_done = TRUE;
6420 /*
6421 * Allow authconn to initialise itself.
6422 */
6423 do_ssh2_authconn(ssh, NULL, 0, NULL);
6424 }
6425 crReturn(1);
6426 }
6427 if (pktin) {
6428 logevent("Server initiated key re-exchange");
6429 } else {
6430 if (inlen == -2) {
6431 /*
6432 * authconn has seen a USERAUTH_SUCCEEDED. Time to enable
6433 * delayed compression, if it's available.
6434 *
6435 * draft-miller-secsh-compression-delayed-00 says that you
6436 * negotiate delayed compression in the first key exchange, and
6437 * both sides start compressing when the server has sent
6438 * USERAUTH_SUCCESS. This has a race condition -- the server
6439 * can't know when the client has seen it, and thus which incoming
6440 * packets it should treat as compressed.
6441 *
6442 * Instead, we do the initial key exchange without offering the
6443 * delayed methods, but note if the server offers them; when we
6444 * get here, if a delayed method was available that was higher
6445 * on our list than what we got, we initiate a rekey in which we
6446 * _do_ list the delayed methods (and hopefully get it as a
6447 * result). Subsequent rekeys will do the same.
6448 */
6449 assert(!s->userauth_succeeded); /* should only happen once */
6450 s->userauth_succeeded = TRUE;
6451 if (!s->pending_compression)
6452 /* Can't see any point rekeying. */
6453 goto wait_for_rekey; /* this is utterly horrid */
6454 /* else fall through to rekey... */
6455 s->pending_compression = FALSE;
6456 }
6457 /*
6458 * Now we've decided to rekey.
6459 *
6460 * Special case: if the server bug is set that doesn't
6461 * allow rekeying, we give a different log message and
6462 * continue waiting. (If such a server _initiates_ a rekey,
6463 * we process it anyway!)
6464 */
6465 if ((ssh->remote_bugs & BUG_SSH2_REKEY)) {
6466 logeventf(ssh, "Server bug prevents key re-exchange (%s)",
6467 (char *)in);
6468 /* Reset the counters, so that at least this message doesn't
6469 * hit the event log _too_ often. */
6470 ssh->outgoing_data_size = 0;
6471 ssh->incoming_data_size = 0;
6472 if (conf_get_int(ssh->conf, CONF_ssh_rekey_time) != 0) {
6473 ssh->next_rekey =
6474 schedule_timer(conf_get_int(ssh->conf, CONF_ssh_rekey_time)*60*TICKSPERSEC,
6475 ssh2_timer, ssh);
6476 }
6477 goto wait_for_rekey; /* this is still utterly horrid */
6478 } else {
6479 logeventf(ssh, "Initiating key re-exchange (%s)", (char *)in);
6480 }
6481 }
6482 goto begin_key_exchange;
6483
6484 crFinish(1);
6485 }
6486
6487 /*
6488 * Add data to an SSH-2 channel output buffer.
6489 */
6490 static void ssh2_add_channel_data(struct ssh_channel *c, char *buf,
6491 int len)
6492 {
6493 bufchain_add(&c->v.v2.outbuffer, buf, len);
6494 }
6495
6496 /*
6497 * Attempt to send data on an SSH-2 channel.
6498 */
6499 static int ssh2_try_send(struct ssh_channel *c)
6500 {
6501 Ssh ssh = c->ssh;
6502 struct Packet *pktout;
6503 int ret;
6504
6505 while (c->v.v2.remwindow > 0 && bufchain_size(&c->v.v2.outbuffer) > 0) {
6506 int len;
6507 void *data;
6508 bufchain_prefix(&c->v.v2.outbuffer, &data, &len);
6509 if ((unsigned)len > c->v.v2.remwindow)
6510 len = c->v.v2.remwindow;
6511 if ((unsigned)len > c->v.v2.remmaxpkt)
6512 len = c->v.v2.remmaxpkt;
6513 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA);
6514 ssh2_pkt_adduint32(pktout, c->remoteid);
6515 ssh2_pkt_addstring_start(pktout);
6516 dont_log_data(ssh, pktout, PKTLOG_OMIT);
6517 ssh2_pkt_addstring_data(pktout, data, len);
6518 end_log_omission(ssh, pktout);
6519 ssh2_pkt_send(ssh, pktout);
6520 bufchain_consume(&c->v.v2.outbuffer, len);
6521 c->v.v2.remwindow -= len;
6522 }
6523
6524 /*
6525 * After having sent as much data as we can, return the amount
6526 * still buffered.
6527 */
6528 ret = bufchain_size(&c->v.v2.outbuffer);
6529
6530 /*
6531 * And if there's no data pending but we need to send an EOF, send
6532 * it.
6533 */
6534 if (!ret && c->pending_eof)
6535 ssh_channel_try_eof(c);
6536
6537 return ret;
6538 }
6539
6540 static void ssh2_try_send_and_unthrottle(Ssh ssh, struct ssh_channel *c)
6541 {
6542 int bufsize;
6543 if (c->closes & CLOSES_SENT_EOF)
6544 return; /* don't send on channels we've EOFed */
6545 bufsize = ssh2_try_send(c);
6546 if (bufsize == 0) {
6547 switch (c->type) {
6548 case CHAN_MAINSESSION:
6549 /* stdin need not receive an unthrottle
6550 * notification since it will be polled */
6551 break;
6552 case CHAN_X11:
6553 x11_unthrottle(c->u.x11.s);
6554 break;
6555 case CHAN_AGENT:
6556 /* agent sockets are request/response and need no
6557 * buffer management */
6558 break;
6559 case CHAN_SOCKDATA:
6560 pfd_unthrottle(c->u.pfd.s);
6561 break;
6562 }
6563 }
6564 }
6565
6566 /*
6567 * Set up most of a new ssh_channel for SSH-2.
6568 */
6569 static void ssh2_channel_init(struct ssh_channel *c)
6570 {
6571 Ssh ssh = c->ssh;
6572 c->localid = alloc_channel_id(ssh);
6573 c->closes = 0;
6574 c->pending_eof = FALSE;
6575 c->throttling_conn = FALSE;
6576 c->v.v2.locwindow = c->v.v2.locmaxwin = c->v.v2.remlocwin =
6577 conf_get_int(ssh->conf, CONF_ssh_simple) ? OUR_V2_BIGWIN : OUR_V2_WINSIZE;
6578 c->v.v2.chanreq_head = NULL;
6579 c->v.v2.throttle_state = UNTHROTTLED;
6580 bufchain_init(&c->v.v2.outbuffer);
6581 }
6582
6583 /*
6584 * CHANNEL_FAILURE doesn't come with any indication of what message
6585 * caused it, so we have to keep track of the outstanding
6586 * CHANNEL_REQUESTs ourselves.
6587 */
6588 static void ssh2_queue_chanreq_handler(struct ssh_channel *c,
6589 cchandler_fn_t handler, void *ctx)
6590 {
6591 struct outstanding_channel_request *ocr =
6592 snew(struct outstanding_channel_request);
6593
6594 assert(!(c->closes & (CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE)));
6595 ocr->handler = handler;
6596 ocr->ctx = ctx;
6597 ocr->next = NULL;
6598 if (!c->v.v2.chanreq_head)
6599 c->v.v2.chanreq_head = ocr;
6600 else
6601 c->v.v2.chanreq_tail->next = ocr;
6602 c->v.v2.chanreq_tail = ocr;
6603 }
6604
6605 /*
6606 * Construct the common parts of a CHANNEL_REQUEST. If handler is not
6607 * NULL then a reply will be requested and the handler will be called
6608 * when it arrives. The returned packet is ready to have any
6609 * request-specific data added and be sent. Note that if a handler is
6610 * provided, it's essential that the request actually be sent.
6611 *
6612 * The handler will usually be passed the response packet in pktin.
6613 * If pktin is NULL, this means that no reply will ever be forthcoming
6614 * (e.g. because the entire connection is being destroyed) and the
6615 * handler should free any storage it's holding.
6616 */
6617 static struct Packet *ssh2_chanreq_init(struct ssh_channel *c, char *type,
6618 cchandler_fn_t handler, void *ctx)
6619 {
6620 struct Packet *pktout;
6621
6622 assert(!(c->closes & (CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE)));
6623 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
6624 ssh2_pkt_adduint32(pktout, c->remoteid);
6625 ssh2_pkt_addstring(pktout, type);
6626 ssh2_pkt_addbool(pktout, handler != NULL);
6627 if (handler != NULL)
6628 ssh2_queue_chanreq_handler(c, handler, ctx);
6629 return pktout;
6630 }
6631
6632 /*
6633 * Potentially enlarge the window on an SSH-2 channel.
6634 */
6635 static void ssh2_handle_winadj_response(struct ssh_channel *, struct Packet *,
6636 void *);
6637 static void ssh2_set_window(struct ssh_channel *c, int newwin)
6638 {
6639 Ssh ssh = c->ssh;
6640
6641 /*
6642 * Never send WINDOW_ADJUST for a channel that the remote side has
6643 * already sent EOF on; there's no point, since it won't be
6644 * sending any more data anyway. Ditto if _we've_ already sent
6645 * CLOSE.
6646 */
6647 if (c->closes & (CLOSES_RCVD_EOF | CLOSES_SENT_CLOSE))
6648 return;
6649
6650 /*
6651 * If the remote end has a habit of ignoring maxpkt, limit the
6652 * window so that it has no choice (assuming it doesn't ignore the
6653 * window as well).
6654 */
6655 if ((ssh->remote_bugs & BUG_SSH2_MAXPKT) && newwin > OUR_V2_MAXPKT)
6656 newwin = OUR_V2_MAXPKT;
6657
6658 /*
6659 * Only send a WINDOW_ADJUST if there's significantly more window
6660 * available than the other end thinks there is. This saves us
6661 * sending a WINDOW_ADJUST for every character in a shell session.
6662 *
6663 * "Significant" is arbitrarily defined as half the window size.
6664 */
6665 if (newwin / 2 >= c->v.v2.locwindow) {
6666 struct Packet *pktout;
6667 unsigned *up;
6668
6669 /*
6670 * In order to keep track of how much window the client
6671 * actually has available, we'd like it to acknowledge each
6672 * WINDOW_ADJUST. We can't do that directly, so we accompany
6673 * it with a CHANNEL_REQUEST that has to be acknowledged.
6674 *
6675 * This is only necessary if we're opening the window wide.
6676 * If we're not, then throughput is being constrained by
6677 * something other than the maximum window size anyway.
6678 */
6679 if (newwin == c->v.v2.locmaxwin &&
6680 !(ssh->remote_bugs & BUG_CHOKES_ON_WINADJ)) {
6681 up = snew(unsigned);
6682 *up = newwin - c->v.v2.locwindow;
6683 pktout = ssh2_chanreq_init(c, "winadj@putty.projects.tartarus.org",
6684 ssh2_handle_winadj_response, up);
6685 ssh2_pkt_send(ssh, pktout);
6686
6687 if (c->v.v2.throttle_state != UNTHROTTLED)
6688 c->v.v2.throttle_state = UNTHROTTLING;
6689 } else {
6690 /* Pretend the WINDOW_ADJUST was acked immediately. */
6691 c->v.v2.remlocwin = newwin;
6692 c->v.v2.throttle_state = THROTTLED;
6693 }
6694 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
6695 ssh2_pkt_adduint32(pktout, c->remoteid);
6696 ssh2_pkt_adduint32(pktout, newwin - c->v.v2.locwindow);
6697 ssh2_pkt_send(ssh, pktout);
6698 c->v.v2.locwindow = newwin;
6699 }
6700 }
6701
6702 /*
6703 * Find the channel associated with a message. If there's no channel,
6704 * or it's not properly open, make a noise about it and return NULL.
6705 */
6706 static struct ssh_channel *ssh2_channel_msg(Ssh ssh, struct Packet *pktin)
6707 {
6708 unsigned localid = ssh_pkt_getuint32(pktin);
6709 struct ssh_channel *c;
6710
6711 c = find234(ssh->channels, &localid, ssh_channelfind);
6712 if (!c ||
6713 (c->halfopen && pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION &&
6714 pktin->type != SSH2_MSG_CHANNEL_OPEN_FAILURE)) {
6715 char *buf = dupprintf("Received %s for %s channel %u",
6716 ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx,
6717 pktin->type),
6718 c ? "half-open" : "nonexistent", localid);
6719 ssh_disconnect(ssh, NULL, buf, SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE);
6720 sfree(buf);
6721 return NULL;
6722 }
6723 return c;
6724 }
6725
6726 static void ssh2_handle_winadj_response(struct ssh_channel *c,
6727 struct Packet *pktin, void *ctx)
6728 {
6729 unsigned *sizep = ctx;
6730
6731 /*
6732 * Winadj responses should always be failures. However, at least
6733 * one server ("boks_sshd") is known to return SUCCESS for channel
6734 * requests it's never heard of, such as "winadj@putty". Raised
6735 * with foxt.com as bug 090916-090424, but for the sake of a quiet
6736 * life, we don't worry about what kind of response we got.
6737 */
6738
6739 c->v.v2.remlocwin += *sizep;
6740 sfree(sizep);
6741 /*
6742 * winadj messages are only sent when the window is fully open, so
6743 * if we get an ack of one, we know any pending unthrottle is
6744 * complete.
6745 */
6746 if (c->v.v2.throttle_state == UNTHROTTLING)
6747 c->v.v2.throttle_state = UNTHROTTLED;
6748 }
6749
6750 static void ssh2_msg_channel_response(Ssh ssh, struct Packet *pktin)
6751 {
6752 struct ssh_channel *c = ssh2_channel_msg(ssh, pktin);
6753 struct outstanding_channel_request *ocr;
6754
6755 if (!c) return;
6756 ocr = c->v.v2.chanreq_head;
6757 if (!ocr) {
6758 ssh2_msg_unexpected(ssh, pktin);
6759 return;
6760 }
6761 ocr->handler(c, pktin, ocr->ctx);
6762 c->v.v2.chanreq_head = ocr->next;
6763 sfree(ocr);
6764 /*
6765 * We may now initiate channel-closing procedures, if that
6766 * CHANNEL_REQUEST was the last thing outstanding before we send
6767 * CHANNEL_CLOSE.
6768 */
6769 ssh2_channel_check_close(c);
6770 }
6771
6772 static void ssh2_msg_channel_window_adjust(Ssh ssh, struct Packet *pktin)
6773 {
6774 struct ssh_channel *c;
6775 c = ssh2_channel_msg(ssh, pktin);
6776 if (!c)
6777 return;
6778 if (!(c->closes & CLOSES_SENT_EOF)) {
6779 c->v.v2.remwindow += ssh_pkt_getuint32(pktin);
6780 ssh2_try_send_and_unthrottle(ssh, c);
6781 }
6782 }
6783
6784 static void ssh2_msg_channel_data(Ssh ssh, struct Packet *pktin)
6785 {
6786 char *data;
6787 int length;
6788 struct ssh_channel *c;
6789 c = ssh2_channel_msg(ssh, pktin);
6790 if (!c)
6791 return;
6792 if (pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA &&
6793 ssh_pkt_getuint32(pktin) != SSH2_EXTENDED_DATA_STDERR)
6794 return; /* extended but not stderr */
6795 ssh_pkt_getstring(pktin, &data, &length);
6796 if (data) {
6797 int bufsize = 0;
6798 c->v.v2.locwindow -= length;
6799 c->v.v2.remlocwin -= length;
6800 switch (c->type) {
6801 case CHAN_MAINSESSION:
6802 bufsize =
6803 from_backend(ssh->frontend, pktin->type ==
6804 SSH2_MSG_CHANNEL_EXTENDED_DATA,
6805 data, length);
6806 break;
6807 case CHAN_X11:
6808 bufsize = x11_send(c->u.x11.s, data, length);
6809 break;
6810 case CHAN_SOCKDATA:
6811 bufsize = pfd_send(c->u.pfd.s, data, length);
6812 break;
6813 case CHAN_AGENT:
6814 while (length > 0) {
6815 if (c->u.a.lensofar < 4) {
6816 unsigned int l = min(4 - c->u.a.lensofar,
6817 (unsigned)length);
6818 memcpy(c->u.a.msglen + c->u.a.lensofar,
6819 data, l);
6820 data += l;
6821 length -= l;
6822 c->u.a.lensofar += l;
6823 }
6824 if (c->u.a.lensofar == 4) {
6825 c->u.a.totallen =
6826 4 + GET_32BIT(c->u.a.msglen);
6827 c->u.a.message = snewn(c->u.a.totallen,
6828 unsigned char);
6829 memcpy(c->u.a.message, c->u.a.msglen, 4);
6830 }
6831 if (c->u.a.lensofar >= 4 && length > 0) {
6832 unsigned int l =
6833 min(c->u.a.totallen - c->u.a.lensofar,
6834 (unsigned)length);
6835 memcpy(c->u.a.message + c->u.a.lensofar,
6836 data, l);
6837 data += l;
6838 length -= l;
6839 c->u.a.lensofar += l;
6840 }
6841 if (c->u.a.lensofar == c->u.a.totallen) {
6842 void *reply;
6843 int replylen;
6844 if (agent_query(c->u.a.message,
6845 c->u.a.totallen,
6846 &reply, &replylen,
6847 ssh_agentf_callback, c))
6848 ssh_agentf_callback(c, reply, replylen);
6849 sfree(c->u.a.message);
6850 c->u.a.message = NULL;
6851 c->u.a.lensofar = 0;
6852 }
6853 }
6854 bufsize = 0;
6855 break;
6856 }
6857 /*
6858 * If it looks like the remote end hit the end of its window,
6859 * and we didn't want it to do that, think about using a
6860 * larger window.
6861 */
6862 if (c->v.v2.remlocwin <= 0 && c->v.v2.throttle_state == UNTHROTTLED &&
6863 c->v.v2.locmaxwin < 0x40000000)
6864 c->v.v2.locmaxwin += OUR_V2_WINSIZE;
6865 /*
6866 * If we are not buffering too much data,
6867 * enlarge the window again at the remote side.
6868 * If we are buffering too much, we may still
6869 * need to adjust the window if the server's
6870 * sent excess data.
6871 */
6872 ssh2_set_window(c, bufsize < c->v.v2.locmaxwin ?
6873 c->v.v2.locmaxwin - bufsize : 0);
6874 /*
6875 * If we're either buffering way too much data, or if we're
6876 * buffering anything at all and we're in "simple" mode,
6877 * throttle the whole channel.
6878 */
6879 if ((bufsize > c->v.v2.locmaxwin ||
6880 (conf_get_int(ssh->conf, CONF_ssh_simple) && bufsize > 0)) &&
6881 !c->throttling_conn) {
6882 c->throttling_conn = 1;
6883 ssh_throttle_conn(ssh, +1);
6884 }
6885 }
6886 }
6887
6888 static void ssh_channel_destroy(struct ssh_channel *c)
6889 {
6890 Ssh ssh = c->ssh;
6891
6892 switch (c->type) {
6893 case CHAN_MAINSESSION:
6894 ssh->mainchan = NULL;
6895 update_specials_menu(ssh->frontend);
6896 break;
6897 case CHAN_X11:
6898 if (c->u.x11.s != NULL)
6899 x11_close(c->u.x11.s);
6900 logevent("Forwarded X11 connection terminated");
6901 break;
6902 case CHAN_AGENT:
6903 sfree(c->u.a.message);
6904 break;
6905 case CHAN_SOCKDATA:
6906 if (c->u.pfd.s != NULL)
6907 pfd_close(c->u.pfd.s);
6908 logevent("Forwarded port closed");
6909 break;
6910 }
6911
6912 del234(ssh->channels, c);
6913 if (ssh->version == 2) {
6914 bufchain_clear(&c->v.v2.outbuffer);
6915 assert(c->v.v2.chanreq_head == NULL);
6916 }
6917 sfree(c);
6918
6919 /*
6920 * See if that was the last channel left open.
6921 * (This is only our termination condition if we're
6922 * not running in -N mode.)
6923 */
6924 if (ssh->version == 2 &&
6925 !conf_get_int(ssh->conf, CONF_ssh_no_shell) &&
6926 count234(ssh->channels) == 0) {
6927 /*
6928 * We used to send SSH_MSG_DISCONNECT here,
6929 * because I'd believed that _every_ conforming
6930 * SSH-2 connection had to end with a disconnect
6931 * being sent by at least one side; apparently
6932 * I was wrong and it's perfectly OK to
6933 * unceremoniously slam the connection shut
6934 * when you're done, and indeed OpenSSH feels
6935 * this is more polite than sending a
6936 * DISCONNECT. So now we don't.
6937 */
6938 ssh_disconnect(ssh, "All channels closed", NULL, 0, TRUE);
6939 }
6940 }
6941
6942 static void ssh2_channel_check_close(struct ssh_channel *c)
6943 {
6944 Ssh ssh = c->ssh;
6945 struct Packet *pktout;
6946
6947 if ((c->closes & (CLOSES_SENT_EOF | CLOSES_RCVD_EOF | CLOSES_SENT_CLOSE))
6948 == (CLOSES_SENT_EOF | CLOSES_RCVD_EOF) && !c->v.v2.chanreq_head) {
6949 /*
6950 * We have both sent and received EOF, and we have no
6951 * outstanding channel requests, which means the
6952 * channel is in final wind-up. But we haven't sent CLOSE, so
6953 * let's do so now.
6954 */
6955 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
6956 ssh2_pkt_adduint32(pktout, c->remoteid);
6957 ssh2_pkt_send(ssh, pktout);
6958 c->closes |= CLOSES_SENT_CLOSE;
6959 }
6960
6961 if (!((CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE) & ~c->closes)) {
6962 assert(c->v.v2.chanreq_head == NULL);
6963 /*
6964 * We have both sent and received CLOSE, which means we're
6965 * completely done with the channel.
6966 */
6967 ssh_channel_destroy(c);
6968 }
6969 }
6970
6971 static void ssh2_channel_got_eof(struct ssh_channel *c)
6972 {
6973 if (c->closes & CLOSES_RCVD_EOF)
6974 return; /* already seen EOF */
6975 c->closes |= CLOSES_RCVD_EOF;
6976
6977 if (c->type == CHAN_X11) {
6978 x11_send_eof(c->u.x11.s);
6979 } else if (c->type == CHAN_AGENT) {
6980 /* Manufacture an outgoing EOF in response to the incoming one. */
6981 sshfwd_write_eof(c);
6982 } else if (c->type == CHAN_SOCKDATA) {
6983 pfd_send_eof(c->u.pfd.s);
6984 } else if (c->type == CHAN_MAINSESSION) {
6985 Ssh ssh = c->ssh;
6986
6987 if (!ssh->sent_console_eof &&
6988 (from_backend_eof(ssh->frontend) || ssh->got_pty)) {
6989 /*
6990 * Either from_backend_eof told us that the front end
6991 * wants us to close the outgoing side of the connection
6992 * as soon as we see EOF from the far end, or else we've
6993 * unilaterally decided to do that because we've allocated
6994 * a remote pty and hence EOF isn't a particularly
6995 * meaningful concept.
6996 */
6997 sshfwd_write_eof(c);
6998 }
6999 ssh->sent_console_eof = TRUE;
7000 }
7001
7002 ssh2_channel_check_close(c);
7003 }
7004
7005 static void ssh2_msg_channel_eof(Ssh ssh, struct Packet *pktin)
7006 {
7007 struct ssh_channel *c;
7008
7009 c = ssh2_channel_msg(ssh, pktin);
7010 if (!c)
7011 return;
7012 ssh2_channel_got_eof(c);
7013 }
7014
7015 static void ssh2_msg_channel_close(Ssh ssh, struct Packet *pktin)
7016 {
7017 struct ssh_channel *c;
7018
7019 c = ssh2_channel_msg(ssh, pktin);
7020 if (!c)
7021 return;
7022
7023 /*
7024 * When we receive CLOSE on a channel, we assume it comes with an
7025 * implied EOF if we haven't seen EOF yet.
7026 */
7027 ssh2_channel_got_eof(c);
7028
7029 /*
7030 * And we also send an outgoing EOF, if we haven't already, on the
7031 * assumption that CLOSE is a pretty forceful announcement that
7032 * the remote side is doing away with the entire channel. (If it
7033 * had wanted to send us EOF and continue receiving data from us,
7034 * it would have just sent CHANNEL_EOF.)
7035 */
7036 if (!(c->closes & CLOSES_SENT_EOF)) {
7037 /*
7038 * Make sure we don't read any more from whatever our local
7039 * data source is for this channel.
7040 */
7041 switch (c->type) {
7042 case CHAN_MAINSESSION:
7043 ssh->send_ok = 0; /* stop trying to read from stdin */
7044 break;
7045 case CHAN_X11:
7046 x11_override_throttle(c->u.x11.s, 1);
7047 break;
7048 case CHAN_SOCKDATA:
7049 pfd_override_throttle(c->u.pfd.s, 1);
7050 break;
7051 }
7052
7053 /*
7054 * Send outgoing EOF.
7055 */
7056 sshfwd_write_eof(c);
7057 }
7058
7059 /*
7060 * Now process the actual close.
7061 */
7062 if (!(c->closes & CLOSES_RCVD_CLOSE)) {
7063 c->closes |= CLOSES_RCVD_CLOSE;
7064 ssh2_channel_check_close(c);
7065 }
7066 }
7067
7068 static void ssh2_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin)
7069 {
7070 struct ssh_channel *c;
7071
7072 c = ssh2_channel_msg(ssh, pktin);
7073 if (!c)
7074 return;
7075 if (c->type != CHAN_SOCKDATA_DORMANT)
7076 return; /* dunno why they're confirming this */
7077 c->remoteid = ssh_pkt_getuint32(pktin);
7078 c->halfopen = FALSE;
7079 c->type = CHAN_SOCKDATA;
7080 c->v.v2.remwindow = ssh_pkt_getuint32(pktin);
7081 c->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin);
7082 if (c->u.pfd.s)
7083 pfd_confirm(c->u.pfd.s);
7084 if (c->pending_eof)
7085 ssh_channel_try_eof(c);
7086 }
7087
7088 static void ssh2_msg_channel_open_failure(Ssh ssh, struct Packet *pktin)
7089 {
7090 static const char *const reasons[] = {
7091 "<unknown reason code>",
7092 "Administratively prohibited",
7093 "Connect failed",
7094 "Unknown channel type",
7095 "Resource shortage",
7096 };
7097 unsigned reason_code;
7098 char *reason_string;
7099 int reason_length;
7100 struct ssh_channel *c;
7101 c = ssh2_channel_msg(ssh, pktin);
7102 if (!c)
7103 return;
7104 if (c->type != CHAN_SOCKDATA_DORMANT)
7105 return; /* dunno why they're failing this */
7106
7107 reason_code = ssh_pkt_getuint32(pktin);
7108 if (reason_code >= lenof(reasons))
7109 reason_code = 0; /* ensure reasons[reason_code] in range */
7110 ssh_pkt_getstring(pktin, &reason_string, &reason_length);
7111 logeventf(ssh, "Forwarded connection refused by server: %s [%.*s]",
7112 reasons[reason_code], reason_length, reason_string);
7113
7114 pfd_close(c->u.pfd.s);
7115
7116 del234(ssh->channels, c);
7117 sfree(c);
7118 }
7119
7120 static void ssh2_msg_channel_request(Ssh ssh, struct Packet *pktin)
7121 {
7122 char *type;
7123 int typelen, want_reply;
7124 int reply = SSH2_MSG_CHANNEL_FAILURE; /* default */
7125 struct ssh_channel *c;
7126 struct Packet *pktout;
7127
7128 c = ssh2_channel_msg(ssh, pktin);
7129 if (!c)
7130 return;
7131 ssh_pkt_getstring(pktin, &type, &typelen);
7132 want_reply = ssh2_pkt_getbool(pktin);
7133
7134 /*
7135 * Having got the channel number, we now look at
7136 * the request type string to see if it's something
7137 * we recognise.
7138 */
7139 if (c == ssh->mainchan) {
7140 /*
7141 * We recognise "exit-status" and "exit-signal" on
7142 * the primary channel.
7143 */
7144 if (typelen == 11 &&
7145 !memcmp(type, "exit-status", 11)) {
7146
7147 ssh->exitcode = ssh_pkt_getuint32(pktin);
7148 logeventf(ssh, "Server sent command exit status %d",
7149 ssh->exitcode);
7150 reply = SSH2_MSG_CHANNEL_SUCCESS;
7151
7152 } else if (typelen == 11 &&
7153 !memcmp(type, "exit-signal", 11)) {
7154
7155 int is_plausible = TRUE, is_int = FALSE;
7156 char *fmt_sig = "", *fmt_msg = "";
7157 char *msg;
7158 int msglen = 0, core = FALSE;
7159 /* ICK: older versions of OpenSSH (e.g. 3.4p1)
7160 * provide an `int' for the signal, despite its
7161 * having been a `string' in the drafts of RFC 4254 since at
7162 * least 2001. (Fixed in session.c 1.147.) Try to
7163 * infer which we can safely parse it as. */
7164 {
7165 unsigned char *p = pktin->body +
7166 pktin->savedpos;
7167 long len = pktin->length - pktin->savedpos;
7168 unsigned long num = GET_32BIT(p); /* what is it? */
7169 /* If it's 0, it hardly matters; assume string */
7170 if (num == 0) {
7171 is_int = FALSE;
7172 } else {
7173 int maybe_int = FALSE, maybe_str = FALSE;
7174 #define CHECK_HYPOTHESIS(offset, result) \
7175 do { \
7176 long q = offset; \
7177 if (q >= 0 && q+4 <= len) { \
7178 q = q + 4 + GET_32BIT(p+q); \
7179 if (q >= 0 && q+4 <= len && \
7180 ((q = q + 4 + GET_32BIT(p+q))!= 0) && q == len) \
7181 result = TRUE; \
7182 } \
7183 } while(0)
7184 CHECK_HYPOTHESIS(4+1, maybe_int);
7185 CHECK_HYPOTHESIS(4+num+1, maybe_str);
7186 #undef CHECK_HYPOTHESIS
7187 if (maybe_int && !maybe_str)
7188 is_int = TRUE;
7189 else if (!maybe_int && maybe_str)
7190 is_int = FALSE;
7191 else
7192 /* Crikey. Either or neither. Panic. */
7193 is_plausible = FALSE;
7194 }
7195 }
7196 ssh->exitcode = 128; /* means `unknown signal' */
7197 if (is_plausible) {
7198 if (is_int) {
7199 /* Old non-standard OpenSSH. */
7200 int signum = ssh_pkt_getuint32(pktin);
7201 fmt_sig = dupprintf(" %d", signum);
7202 ssh->exitcode = 128 + signum;
7203 } else {
7204 /* As per RFC 4254. */
7205 char *sig;
7206 int siglen;
7207 ssh_pkt_getstring(pktin, &sig, &siglen);
7208 /* Signal name isn't supposed to be blank, but
7209 * let's cope gracefully if it is. */
7210 if (siglen) {
7211 fmt_sig = dupprintf(" \"%.*s\"",
7212 siglen, sig);
7213 }
7214
7215 /*
7216 * Really hideous method of translating the
7217 * signal description back into a locally
7218 * meaningful number.
7219 */
7220
7221 if (0)
7222 ;
7223 #define TRANSLATE_SIGNAL(s) \
7224 else if (siglen == lenof(#s)-1 && !memcmp(sig, #s, siglen)) \
7225 ssh->exitcode = 128 + SIG ## s
7226 #ifdef SIGABRT
7227 TRANSLATE_SIGNAL(ABRT);
7228 #endif
7229 #ifdef SIGALRM
7230 TRANSLATE_SIGNAL(ALRM);
7231 #endif
7232 #ifdef SIGFPE
7233 TRANSLATE_SIGNAL(FPE);
7234 #endif
7235 #ifdef SIGHUP
7236 TRANSLATE_SIGNAL(HUP);
7237 #endif
7238 #ifdef SIGILL
7239 TRANSLATE_SIGNAL(ILL);
7240 #endif
7241 #ifdef SIGINT
7242 TRANSLATE_SIGNAL(INT);
7243 #endif
7244 #ifdef SIGKILL
7245 TRANSLATE_SIGNAL(KILL);
7246 #endif
7247 #ifdef SIGPIPE
7248 TRANSLATE_SIGNAL(PIPE);
7249 #endif
7250 #ifdef SIGQUIT
7251 TRANSLATE_SIGNAL(QUIT);
7252 #endif
7253 #ifdef SIGSEGV
7254 TRANSLATE_SIGNAL(SEGV);
7255 #endif
7256 #ifdef SIGTERM
7257 TRANSLATE_SIGNAL(TERM);
7258 #endif
7259 #ifdef SIGUSR1
7260 TRANSLATE_SIGNAL(USR1);
7261 #endif
7262 #ifdef SIGUSR2
7263 TRANSLATE_SIGNAL(USR2);
7264 #endif
7265 #undef TRANSLATE_SIGNAL
7266 else
7267 ssh->exitcode = 128;
7268 }
7269 core = ssh2_pkt_getbool(pktin);
7270 ssh_pkt_getstring(pktin, &msg, &msglen);
7271 if (msglen) {
7272 fmt_msg = dupprintf(" (\"%.*s\")", msglen, msg);
7273 }
7274 /* ignore lang tag */
7275 } /* else don't attempt to parse */
7276 logeventf(ssh, "Server exited on signal%s%s%s",
7277 fmt_sig, core ? " (core dumped)" : "",
7278 fmt_msg);
7279 if (*fmt_sig) sfree(fmt_sig);
7280 if (*fmt_msg) sfree(fmt_msg);
7281 reply = SSH2_MSG_CHANNEL_SUCCESS;
7282
7283 }
7284 } else {
7285 /*
7286 * This is a channel request we don't know
7287 * about, so we now either ignore the request
7288 * or respond with CHANNEL_FAILURE, depending
7289 * on want_reply.
7290 */
7291 reply = SSH2_MSG_CHANNEL_FAILURE;
7292 }
7293 if (want_reply) {
7294 pktout = ssh2_pkt_init(reply);
7295 ssh2_pkt_adduint32(pktout, c->remoteid);
7296 ssh2_pkt_send(ssh, pktout);
7297 }
7298 }
7299
7300 static void ssh2_msg_global_request(Ssh ssh, struct Packet *pktin)
7301 {
7302 char *type;
7303 int typelen, want_reply;
7304 struct Packet *pktout;
7305
7306 ssh_pkt_getstring(pktin, &type, &typelen);
7307 want_reply = ssh2_pkt_getbool(pktin);
7308
7309 /*
7310 * We currently don't support any global requests
7311 * at all, so we either ignore the request or
7312 * respond with REQUEST_FAILURE, depending on
7313 * want_reply.
7314 */
7315 if (want_reply) {
7316 pktout = ssh2_pkt_init(SSH2_MSG_REQUEST_FAILURE);
7317 ssh2_pkt_send(ssh, pktout);
7318 }
7319 }
7320
7321 static void ssh2_msg_channel_open(Ssh ssh, struct Packet *pktin)
7322 {
7323 char *type;
7324 int typelen;
7325 char *peeraddr;
7326 int peeraddrlen;
7327 int peerport;
7328 char *error = NULL;
7329 struct ssh_channel *c;
7330 unsigned remid, winsize, pktsize;
7331 struct Packet *pktout;
7332
7333 ssh_pkt_getstring(pktin, &type, &typelen);
7334 c = snew(struct ssh_channel);
7335 c->ssh = ssh;
7336
7337 remid = ssh_pkt_getuint32(pktin);
7338 winsize = ssh_pkt_getuint32(pktin);
7339 pktsize = ssh_pkt_getuint32(pktin);
7340
7341 if (typelen == 3 && !memcmp(type, "x11", 3)) {
7342 char *addrstr;
7343 const char *x11err;
7344
7345 ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen);
7346 addrstr = snewn(peeraddrlen+1, char);
7347 memcpy(addrstr, peeraddr, peeraddrlen);
7348 addrstr[peeraddrlen] = '\0';
7349 peerport = ssh_pkt_getuint32(pktin);
7350
7351 logeventf(ssh, "Received X11 connect request from %s:%d",
7352 addrstr, peerport);
7353
7354 if (!ssh->X11_fwd_enabled)
7355 error = "X11 forwarding is not enabled";
7356 else if ((x11err = x11_init(&c->u.x11.s, ssh->x11disp, c,
7357 addrstr, peerport, ssh->conf)) != NULL) {
7358 logeventf(ssh, "Local X11 connection failed: %s", x11err);
7359 error = "Unable to open an X11 connection";
7360 } else {
7361 logevent("Opening X11 forward connection succeeded");
7362 c->type = CHAN_X11;
7363 }
7364
7365 sfree(addrstr);
7366 } else if (typelen == 15 &&
7367 !memcmp(type, "forwarded-tcpip", 15)) {
7368 struct ssh_rportfwd pf, *realpf;
7369 char *dummy;
7370 int dummylen;
7371 ssh_pkt_getstring(pktin, &dummy, &dummylen);/* skip address */
7372 pf.sport = ssh_pkt_getuint32(pktin);
7373 ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen);
7374 peerport = ssh_pkt_getuint32(pktin);
7375 realpf = find234(ssh->rportfwds, &pf, NULL);
7376 logeventf(ssh, "Received remote port %d open request "
7377 "from %s:%d", pf.sport, peeraddr, peerport);
7378 if (realpf == NULL) {
7379 error = "Remote port is not recognised";
7380 } else {
7381 const char *e = pfd_newconnect(&c->u.pfd.s,
7382 realpf->dhost,
7383 realpf->dport, c,
7384 ssh->conf,
7385 realpf->pfrec->addressfamily);
7386 logeventf(ssh, "Attempting to forward remote port to "
7387 "%s:%d", realpf->dhost, realpf->dport);
7388 if (e != NULL) {
7389 logeventf(ssh, "Port open failed: %s", e);
7390 error = "Port open failed";
7391 } else {
7392 logevent("Forwarded port opened successfully");
7393 c->type = CHAN_SOCKDATA;
7394 }
7395 }
7396 } else if (typelen == 22 &&
7397 !memcmp(type, "auth-agent@openssh.com", 22)) {
7398 if (!ssh->agentfwd_enabled)
7399 error = "Agent forwarding is not enabled";
7400 else {
7401 c->type = CHAN_AGENT; /* identify channel type */
7402 c->u.a.lensofar = 0;
7403 }
7404 } else {
7405 error = "Unsupported channel type requested";
7406 }
7407
7408 c->remoteid = remid;
7409 c->halfopen = FALSE;
7410 if (error) {
7411 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE);
7412 ssh2_pkt_adduint32(pktout, c->remoteid);
7413 ssh2_pkt_adduint32(pktout, SSH2_OPEN_CONNECT_FAILED);
7414 ssh2_pkt_addstring(pktout, error);
7415 ssh2_pkt_addstring(pktout, "en"); /* language tag */
7416 ssh2_pkt_send(ssh, pktout);
7417 logeventf(ssh, "Rejected channel open: %s", error);
7418 sfree(c);
7419 } else {
7420 ssh2_channel_init(c);
7421 c->v.v2.remwindow = winsize;
7422 c->v.v2.remmaxpkt = pktsize;
7423 add234(ssh->channels, c);
7424 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
7425 ssh2_pkt_adduint32(pktout, c->remoteid);
7426 ssh2_pkt_adduint32(pktout, c->localid);
7427 ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);
7428 ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */
7429 ssh2_pkt_send(ssh, pktout);
7430 }
7431 }
7432
7433 /*
7434 * Buffer banner messages for later display at some convenient point,
7435 * if we're going to display them.
7436 */
7437 static void ssh2_msg_userauth_banner(Ssh ssh, struct Packet *pktin)
7438 {
7439 /* Arbitrary limit to prevent unbounded inflation of buffer */
7440 if (conf_get_int(ssh->conf, CONF_ssh_show_banner) &&
7441 bufchain_size(&ssh->banner) <= 131072) {
7442 char *banner = NULL;
7443 int size = 0;
7444 ssh_pkt_getstring(pktin, &banner, &size);
7445 if (banner)
7446 bufchain_add(&ssh->banner, banner, size);
7447 }
7448 }
7449
7450 /* Helper function to deal with sending tty modes for "pty-req" */
7451 static void ssh2_send_ttymode(void *data, char *mode, char *val)
7452 {
7453 struct Packet *pktout = (struct Packet *)data;
7454 int i = 0;
7455 unsigned int arg = 0;
7456 while (strcmp(mode, ssh_ttymodes[i].mode) != 0) i++;
7457 if (i == lenof(ssh_ttymodes)) return;
7458 switch (ssh_ttymodes[i].type) {
7459 case TTY_OP_CHAR:
7460 arg = ssh_tty_parse_specchar(val);
7461 break;
7462 case TTY_OP_BOOL:
7463 arg = ssh_tty_parse_boolean(val);
7464 break;
7465 }
7466 ssh2_pkt_addbyte(pktout, ssh_ttymodes[i].opcode);
7467 ssh2_pkt_adduint32(pktout, arg);
7468 }
7469
7470 static void ssh2_maybe_setup_x11(struct ssh_channel *c, struct Packet *pktin,
7471 void *ctx)
7472 {
7473 struct ssh2_maybe_setup_x11_state {
7474 int crLine;
7475 };
7476 Ssh ssh = c->ssh;
7477 struct Packet *pktout;
7478 crStateP(ssh2_maybe_setup_x11_state, ctx);
7479
7480 crBeginState;
7481
7482 /*
7483 * Potentially enable X11 forwarding.
7484 */
7485 if (ssh->mainchan && !ssh->ncmode && conf_get_int(ssh->conf, CONF_x11_forward) &&
7486 (ssh->x11disp = x11_setup_display(conf_get_str(ssh->conf, CONF_x11_display),
7487 conf_get_int(ssh->conf, CONF_x11_auth), ssh->conf))) {
7488 logevent("Requesting X11 forwarding");
7489 pktout = ssh2_chanreq_init(ssh->mainchan, "x11-req",
7490 ssh2_maybe_setup_x11, s);
7491 ssh2_pkt_addbool(pktout, 0); /* many connections */
7492 ssh2_pkt_addstring(pktout, ssh->x11disp->remoteauthprotoname);
7493 /*
7494 * Note that while we blank the X authentication data here, we don't
7495 * take any special action to blank the start of an X11 channel,
7496 * so using MIT-MAGIC-COOKIE-1 and actually opening an X connection
7497 * without having session blanking enabled is likely to leak your
7498 * cookie into the log.
7499 */
7500 dont_log_password(ssh, pktout, PKTLOG_BLANK);
7501 ssh2_pkt_addstring(pktout, ssh->x11disp->remoteauthdatastring);
7502 end_log_omission(ssh, pktout);
7503 ssh2_pkt_adduint32(pktout, ssh->x11disp->screennum);
7504 ssh2_pkt_send(ssh, pktout);
7505
7506 crWaitUntilV(pktin);
7507
7508 if (pktin) {
7509 if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
7510 logevent("X11 forwarding enabled");
7511 ssh->X11_fwd_enabled = TRUE;
7512 } else
7513 logevent("X11 forwarding refused");
7514 }
7515 }
7516 sfree(s);
7517 crFinishV;
7518 }
7519
7520 static void ssh2_maybe_setup_agent(struct ssh_channel *c, struct Packet *pktin,
7521 void *ctx)
7522 {
7523 struct ssh2_maybe_setup_agent_state {
7524 int crLine;
7525 };
7526 Ssh ssh = c->ssh;
7527 struct Packet *pktout;
7528 crStateP(ssh2_maybe_setup_agent_state, ctx);
7529
7530 crBeginState;
7531
7532 if (ssh->mainchan && !ssh->ncmode && conf_get_int(ssh->conf, CONF_agentfwd) && agent_exists()) {
7533 logevent("Requesting OpenSSH-style agent forwarding");
7534 pktout = ssh2_chanreq_init(ssh->mainchan, "auth-agent-req@openssh.com",
7535 ssh2_maybe_setup_agent, s);
7536 ssh2_pkt_send(ssh, pktout);
7537
7538 crWaitUntilV(pktin);
7539
7540 if (pktin) {
7541 if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
7542 logevent("Agent forwarding enabled");
7543 ssh->agentfwd_enabled = TRUE;
7544 } else
7545 logevent("Agent forwarding refused");
7546 }
7547 }
7548 sfree(s);
7549 crFinishV;
7550 }
7551
7552 static void ssh2_maybe_setup_pty(struct ssh_channel *c, struct Packet *pktin,
7553 void *ctx)
7554 {
7555 struct ssh2_maybe_setup_pty_state {
7556 int crLine;
7557 };
7558 Ssh ssh = c->ssh;
7559 struct Packet *pktout;
7560 crStateP(ssh2_maybe_setup_pty_state, ctx);
7561
7562 crBeginState;
7563
7564 if (ssh->mainchan && !ssh->ncmode && !conf_get_int(ssh->conf, CONF_nopty)) {
7565 /* Unpick the terminal-speed string. */
7566 /* XXX perhaps we should allow no speeds to be sent. */
7567 ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */
7568 sscanf(conf_get_str(ssh->conf, CONF_termspeed), "%d,%d", &ssh->ospeed, &ssh->ispeed);
7569 /* Build the pty request. */
7570 pktout = ssh2_chanreq_init(ssh->mainchan, "pty-req",
7571 ssh2_maybe_setup_pty, s);
7572 ssh2_pkt_addstring(pktout, conf_get_str(ssh->conf, CONF_termtype));
7573 ssh2_pkt_adduint32(pktout, ssh->term_width);
7574 ssh2_pkt_adduint32(pktout, ssh->term_height);
7575 ssh2_pkt_adduint32(pktout, 0); /* pixel width */
7576 ssh2_pkt_adduint32(pktout, 0); /* pixel height */
7577 ssh2_pkt_addstring_start(pktout);
7578 parse_ttymodes(ssh, ssh2_send_ttymode, (void *)pktout);
7579 ssh2_pkt_addbyte(pktout, SSH2_TTY_OP_ISPEED);
7580 ssh2_pkt_adduint32(pktout, ssh->ispeed);
7581 ssh2_pkt_addbyte(pktout, SSH2_TTY_OP_OSPEED);
7582 ssh2_pkt_adduint32(pktout, ssh->ospeed);
7583 ssh2_pkt_addstring_data(pktout, "\0", 1); /* TTY_OP_END */
7584 ssh2_pkt_send(ssh, pktout);
7585 ssh->state = SSH_STATE_INTERMED;
7586
7587 crWaitUntilV(pktin);
7588
7589 if (pktin) {
7590 if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
7591 logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)",
7592 ssh->ospeed, ssh->ispeed);
7593 ssh->got_pty = TRUE;
7594 } else {
7595 c_write_str(ssh, "Server refused to allocate pty\r\n");
7596 ssh->editing = ssh->echoing = 1;
7597 }
7598 }
7599 } else {
7600 ssh->editing = ssh->echoing = 1;
7601 }
7602 sfree(s);
7603 crFinishV;
7604 }
7605
7606 static void ssh2_setup_env(struct ssh_channel *c, struct Packet *pktin,
7607 void *ctx)
7608 {
7609 struct ssh2_setup_env_state {
7610 int crLine;
7611 int num_env, env_left, env_ok;
7612 };
7613 Ssh ssh = c->ssh;
7614 struct Packet *pktout;
7615 crStateP(ssh2_setup_env_state, ctx);
7616
7617 crBeginState;
7618
7619 /*
7620 * Send environment variables.
7621 *
7622 * Simplest thing here is to send all the requests at once, and
7623 * then wait for a whole bunch of successes or failures.
7624 */
7625 s->num_env = 0;
7626 if (ssh->mainchan && !ssh->ncmode) {
7627 char *key, *val;
7628
7629 for (val = conf_get_str_strs(ssh->conf, CONF_environmt, NULL, &key);
7630 val != NULL;
7631 val = conf_get_str_strs(ssh->conf, CONF_environmt, key, &key)) {
7632 pktout = ssh2_chanreq_init(ssh->mainchan, "env", ssh2_setup_env, s);
7633 ssh2_pkt_addstring(pktout, key);
7634 ssh2_pkt_addstring(pktout, val);
7635 ssh2_pkt_send(ssh, pktout);
7636
7637 s->num_env++;
7638 }
7639 if (s->num_env)
7640 logeventf(ssh, "Sent %d environment variables", s->num_env);
7641 }
7642
7643 if (s->num_env) {
7644 s->env_ok = 0;
7645 s->env_left = s->num_env;
7646
7647 while (s->env_left > 0) {
7648 crWaitUntilV(pktin);
7649 if (!pktin) goto out;
7650 if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS)
7651 s->env_ok++;
7652 s->env_left--;
7653 }
7654
7655 if (s->env_ok == s->num_env) {
7656 logevent("All environment variables successfully set");
7657 } else if (s->env_ok == 0) {
7658 logevent("All environment variables refused");
7659 c_write_str(ssh, "Server refused to set environment variables\r\n");
7660 } else {
7661 logeventf(ssh, "%d environment variables refused",
7662 s->num_env - s->env_ok);
7663 c_write_str(ssh, "Server refused to set all environment variables\r\n");
7664 }
7665 }
7666 out:
7667 sfree(s);
7668 crFinishV;
7669 }
7670
7671 /*
7672 * Handle the SSH-2 userauth and connection layers.
7673 */
7674 static void ssh2_msg_authconn(Ssh ssh, struct Packet *pktin)
7675 {
7676 do_ssh2_authconn(ssh, NULL, 0, pktin);
7677 }
7678
7679 static void ssh2_response_authconn(struct ssh_channel *c, struct Packet *pktin,
7680 void *ctx)
7681 {
7682 do_ssh2_authconn(c->ssh, NULL, 0, pktin);
7683 }
7684
7685 static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
7686 struct Packet *pktin)
7687 {
7688 struct do_ssh2_authconn_state {
7689 int crLine;
7690 enum {
7691 AUTH_TYPE_NONE,
7692 AUTH_TYPE_PUBLICKEY,
7693 AUTH_TYPE_PUBLICKEY_OFFER_LOUD,
7694 AUTH_TYPE_PUBLICKEY_OFFER_QUIET,
7695 AUTH_TYPE_PASSWORD,
7696 AUTH_TYPE_GSSAPI, /* always QUIET */
7697 AUTH_TYPE_KEYBOARD_INTERACTIVE,
7698 AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET
7699 } type;
7700 int done_service_req;
7701 int gotit, need_pw, can_pubkey, can_passwd, can_keyb_inter;
7702 int tried_pubkey_config, done_agent;
7703 #ifndef NO_GSSAPI
7704 int can_gssapi;
7705 int tried_gssapi;
7706 #endif
7707 int kbd_inter_refused;
7708 int we_are_in, userauth_success;
7709 prompts_t *cur_prompt;
7710 int num_prompts;
7711 char *username;
7712 char *password;
7713 int got_username;
7714 void *publickey_blob;
7715 int publickey_bloblen;
7716 int publickey_encrypted;
7717 char *publickey_algorithm;
7718 char *publickey_comment;
7719 unsigned char agent_request[5], *agent_response, *agentp;
7720 int agent_responselen;
7721 unsigned char *pkblob_in_agent;
7722 int keyi, nkeys;
7723 char *pkblob, *alg, *commentp;
7724 int pklen, alglen, commentlen;
7725 int siglen, retlen, len;
7726 char *q, *agentreq, *ret;
7727 int try_send;
7728 struct Packet *pktout;
7729 Filename *keyfile;
7730 #ifndef NO_GSSAPI
7731 struct ssh_gss_library *gsslib;
7732 Ssh_gss_ctx gss_ctx;
7733 Ssh_gss_buf gss_buf;
7734 Ssh_gss_buf gss_rcvtok, gss_sndtok;
7735 Ssh_gss_name gss_srv_name;
7736 Ssh_gss_stat gss_stat;
7737 #endif
7738 };
7739 crState(do_ssh2_authconn_state);
7740
7741 crBeginState;
7742
7743 /* Register as a handler for all the messages this coroutine handles. */
7744 ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = ssh2_msg_authconn;
7745 ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = ssh2_msg_authconn;
7746 ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = ssh2_msg_authconn;
7747 ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = ssh2_msg_authconn;
7748 ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_authconn;
7749 ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = ssh2_msg_authconn;
7750 /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = ssh2_msg_authconn; duplicate case value */
7751 /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_REQUEST] = ssh2_msg_authconn; duplicate case value */
7752 ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = ssh2_msg_authconn;
7753 ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_authconn;
7754 ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = ssh2_msg_authconn;
7755 ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = ssh2_msg_authconn;
7756 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_authconn;
7757 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_authconn;
7758 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_authconn;
7759 ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_authconn;
7760 ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh2_msg_authconn;
7761 ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = ssh2_msg_authconn;
7762 ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_authconn;
7763 ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_authconn;
7764
7765 s->done_service_req = FALSE;
7766 s->we_are_in = s->userauth_success = FALSE;
7767 #ifndef NO_GSSAPI
7768 s->tried_gssapi = FALSE;
7769 #endif
7770
7771 if (!conf_get_int(ssh->conf, CONF_ssh_no_userauth)) {
7772 /*
7773 * Request userauth protocol, and await a response to it.
7774 */
7775 s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST);
7776 ssh2_pkt_addstring(s->pktout, "ssh-userauth");
7777 ssh2_pkt_send(ssh, s->pktout);
7778 crWaitUntilV(pktin);
7779 if (pktin->type == SSH2_MSG_SERVICE_ACCEPT)
7780 s->done_service_req = TRUE;
7781 }
7782 if (!s->done_service_req) {
7783 /*
7784 * Request connection protocol directly, without authentication.
7785 */
7786 s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST);
7787 ssh2_pkt_addstring(s->pktout, "ssh-connection");
7788 ssh2_pkt_send(ssh, s->pktout);
7789 crWaitUntilV(pktin);
7790 if (pktin->type == SSH2_MSG_SERVICE_ACCEPT) {
7791 s->we_are_in = TRUE; /* no auth required */
7792 } else {
7793 bombout(("Server refused service request"));
7794 crStopV;
7795 }
7796 }
7797
7798 /* Arrange to be able to deal with any BANNERs that come in.
7799 * (We do this now as packets may come in during the next bit.) */
7800 bufchain_init(&ssh->banner);
7801 ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] =
7802 ssh2_msg_userauth_banner;
7803
7804 /*
7805 * Misc one-time setup for authentication.
7806 */
7807 s->publickey_blob = NULL;
7808 if (!s->we_are_in) {
7809
7810 /*
7811 * Load the public half of any configured public key file
7812 * for later use.
7813 */
7814 s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile);
7815 if (!filename_is_null(s->keyfile)) {
7816 int keytype;
7817 logeventf(ssh, "Reading private key file \"%.150s\"",
7818 filename_to_str(s->keyfile));
7819 keytype = key_type(s->keyfile);
7820 if (keytype == SSH_KEYTYPE_SSH2) {
7821 const char *error;
7822 s->publickey_blob =
7823 ssh2_userkey_loadpub(s->keyfile,
7824 &s->publickey_algorithm,
7825 &s->publickey_bloblen,
7826 &s->publickey_comment, &error);
7827 if (s->publickey_blob) {
7828 s->publickey_encrypted =
7829 ssh2_userkey_encrypted(s->keyfile, NULL);
7830 } else {
7831 char *msgbuf;
7832 logeventf(ssh, "Unable to load private key (%s)",
7833 error);
7834 msgbuf = dupprintf("Unable to load private key file "
7835 "\"%.150s\" (%s)\r\n",
7836 filename_to_str(s->keyfile),
7837 error);
7838 c_write_str(ssh, msgbuf);
7839 sfree(msgbuf);
7840 }
7841 } else {
7842 char *msgbuf;
7843 logeventf(ssh, "Unable to use this key file (%s)",
7844 key_type_to_str(keytype));
7845 msgbuf = dupprintf("Unable to use key file \"%.150s\""
7846 " (%s)\r\n",
7847 filename_to_str(s->keyfile),
7848 key_type_to_str(keytype));
7849 c_write_str(ssh, msgbuf);
7850 sfree(msgbuf);
7851 s->publickey_blob = NULL;
7852 }
7853 }
7854
7855 /*
7856 * Find out about any keys Pageant has (but if there's a
7857 * public key configured, filter out all others).
7858 */
7859 s->nkeys = 0;
7860 s->agent_response = NULL;
7861 s->pkblob_in_agent = NULL;
7862 if (conf_get_int(ssh->conf, CONF_tryagent) && agent_exists()) {
7863
7864 void *r;
7865
7866 logevent("Pageant is running. Requesting keys.");
7867
7868 /* Request the keys held by the agent. */
7869 PUT_32BIT(s->agent_request, 1);
7870 s->agent_request[4] = SSH2_AGENTC_REQUEST_IDENTITIES;
7871 if (!agent_query(s->agent_request, 5, &r, &s->agent_responselen,
7872 ssh_agent_callback, ssh)) {
7873 do {
7874 crReturnV;
7875 if (pktin) {
7876 bombout(("Unexpected data from server while"
7877 " waiting for agent response"));
7878 crStopV;
7879 }
7880 } while (pktin || inlen > 0);
7881 r = ssh->agent_response;
7882 s->agent_responselen = ssh->agent_response_len;
7883 }
7884 s->agent_response = (unsigned char *) r;
7885 if (s->agent_response && s->agent_responselen >= 5 &&
7886 s->agent_response[4] == SSH2_AGENT_IDENTITIES_ANSWER) {
7887 int keyi;
7888 unsigned char *p;
7889 p = s->agent_response + 5;
7890 s->nkeys = GET_32BIT(p);
7891 p += 4;
7892 logeventf(ssh, "Pageant has %d SSH-2 keys", s->nkeys);
7893 if (s->publickey_blob) {
7894 /* See if configured key is in agent. */
7895 for (keyi = 0; keyi < s->nkeys; keyi++) {
7896 s->pklen = GET_32BIT(p);
7897 if (s->pklen == s->publickey_bloblen &&
7898 !memcmp(p+4, s->publickey_blob,
7899 s->publickey_bloblen)) {
7900 logeventf(ssh, "Pageant key #%d matches "
7901 "configured key file", keyi);
7902 s->keyi = keyi;
7903 s->pkblob_in_agent = p;
7904 break;
7905 }
7906 p += 4 + s->pklen;
7907 p += GET_32BIT(p) + 4; /* comment */
7908 }
7909 if (!s->pkblob_in_agent) {
7910 logevent("Configured key file not in Pageant");
7911 s->nkeys = 0;
7912 }
7913 }
7914 } else {
7915 logevent("Failed to get reply from Pageant");
7916 }
7917 }
7918
7919 }
7920
7921 /*
7922 * We repeat this whole loop, including the username prompt,
7923 * until we manage a successful authentication. If the user
7924 * types the wrong _password_, they can be sent back to the
7925 * beginning to try another username, if this is configured on.
7926 * (If they specify a username in the config, they are never
7927 * asked, even if they do give a wrong password.)
7928 *
7929 * I think this best serves the needs of
7930 *
7931 * - the people who have no configuration, no keys, and just
7932 * want to try repeated (username,password) pairs until they
7933 * type both correctly
7934 *
7935 * - people who have keys and configuration but occasionally
7936 * need to fall back to passwords
7937 *
7938 * - people with a key held in Pageant, who might not have
7939 * logged in to a particular machine before; so they want to
7940 * type a username, and then _either_ their key will be
7941 * accepted, _or_ they will type a password. If they mistype
7942 * the username they will want to be able to get back and
7943 * retype it!
7944 */
7945 s->got_username = FALSE;
7946 while (!s->we_are_in) {
7947 /*
7948 * Get a username.
7949 */
7950 if (s->got_username && !conf_get_int(ssh->conf, CONF_change_username)) {
7951 /*
7952 * We got a username last time round this loop, and
7953 * with change_username turned off we don't try to get
7954 * it again.
7955 */
7956 } else if ((ssh->username = get_remote_username(ssh->conf)) == NULL) {
7957 int ret; /* need not be kept over crReturn */
7958 s->cur_prompt = new_prompts(ssh->frontend);
7959 s->cur_prompt->to_server = TRUE;
7960 s->cur_prompt->name = dupstr("SSH login name");
7961 add_prompt(s->cur_prompt, dupstr("login as: "), TRUE);
7962 ret = get_userpass_input(s->cur_prompt, NULL, 0);
7963 while (ret < 0) {
7964 ssh->send_ok = 1;
7965 crWaitUntilV(!pktin);
7966 ret = get_userpass_input(s->cur_prompt, in, inlen);
7967 ssh->send_ok = 0;
7968 }
7969 if (!ret) {
7970 /*
7971 * get_userpass_input() failed to get a username.
7972 * Terminate.
7973 */
7974 free_prompts(s->cur_prompt);
7975 ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE);
7976 crStopV;
7977 }
7978 ssh->username = dupstr(s->cur_prompt->prompts[0]->result);
7979 free_prompts(s->cur_prompt);
7980 } else {
7981 char *stuff;
7982 if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)) {
7983 stuff = dupprintf("Using username \"%s\".\r\n", ssh->username);
7984 c_write_str(ssh, stuff);
7985 sfree(stuff);
7986 }
7987 }
7988 s->got_username = TRUE;
7989
7990 /*
7991 * Send an authentication request using method "none": (a)
7992 * just in case it succeeds, and (b) so that we know what
7993 * authentication methods we can usefully try next.
7994 */
7995 ssh->pkt_actx = SSH2_PKTCTX_NOAUTH;
7996
7997 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
7998 ssh2_pkt_addstring(s->pktout, ssh->username);
7999 ssh2_pkt_addstring(s->pktout, "ssh-connection");/* service requested */
8000 ssh2_pkt_addstring(s->pktout, "none"); /* method */
8001 ssh2_pkt_send(ssh, s->pktout);
8002 s->type = AUTH_TYPE_NONE;
8003 s->gotit = FALSE;
8004 s->we_are_in = FALSE;
8005
8006 s->tried_pubkey_config = FALSE;
8007 s->kbd_inter_refused = FALSE;
8008
8009 /* Reset agent request state. */
8010 s->done_agent = FALSE;
8011 if (s->agent_response) {
8012 if (s->pkblob_in_agent) {
8013 s->agentp = s->pkblob_in_agent;
8014 } else {
8015 s->agentp = s->agent_response + 5 + 4;
8016 s->keyi = 0;
8017 }
8018 }
8019
8020 while (1) {
8021 char *methods = NULL;
8022 int methlen = 0;
8023
8024 /*
8025 * Wait for the result of the last authentication request.
8026 */
8027 if (!s->gotit)
8028 crWaitUntilV(pktin);
8029 /*
8030 * Now is a convenient point to spew any banner material
8031 * that we've accumulated. (This should ensure that when
8032 * we exit the auth loop, we haven't any left to deal
8033 * with.)
8034 */
8035 {
8036 int size = bufchain_size(&ssh->banner);
8037 /*
8038 * Don't show the banner if we're operating in
8039 * non-verbose non-interactive mode. (It's probably
8040 * a script, which means nobody will read the
8041 * banner _anyway_, and moreover the printing of
8042 * the banner will screw up processing on the
8043 * output of (say) plink.)
8044 */
8045 if (size && (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE))) {
8046 char *banner = snewn(size, char);
8047 bufchain_fetch(&ssh->banner, banner, size);
8048 c_write_untrusted(ssh, banner, size);
8049 sfree(banner);
8050 }
8051 bufchain_clear(&ssh->banner);
8052 }
8053 if (pktin->type == SSH2_MSG_USERAUTH_SUCCESS) {
8054 logevent("Access granted");
8055 s->we_are_in = s->userauth_success = TRUE;
8056 break;
8057 }
8058
8059 if (pktin->type != SSH2_MSG_USERAUTH_FAILURE && s->type != AUTH_TYPE_GSSAPI) {
8060 bombout(("Strange packet received during authentication: "
8061 "type %d", pktin->type));
8062 crStopV;
8063 }
8064
8065 s->gotit = FALSE;
8066
8067 /*
8068 * OK, we're now sitting on a USERAUTH_FAILURE message, so
8069 * we can look at the string in it and know what we can
8070 * helpfully try next.
8071 */
8072 if (pktin->type == SSH2_MSG_USERAUTH_FAILURE) {
8073 ssh_pkt_getstring(pktin, &methods, &methlen);
8074 if (!ssh2_pkt_getbool(pktin)) {
8075 /*
8076 * We have received an unequivocal Access
8077 * Denied. This can translate to a variety of
8078 * messages, or no message at all.
8079 *
8080 * For forms of authentication which are attempted
8081 * implicitly, by which I mean without printing
8082 * anything in the window indicating that we're
8083 * trying them, we should never print 'Access
8084 * denied'.
8085 *
8086 * If we do print a message saying that we're
8087 * attempting some kind of authentication, it's OK
8088 * to print a followup message saying it failed -
8089 * but the message may sometimes be more specific
8090 * than simply 'Access denied'.
8091 *
8092 * Additionally, if we'd just tried password
8093 * authentication, we should break out of this
8094 * whole loop so as to go back to the username
8095 * prompt (iff we're configured to allow
8096 * username change attempts).
8097 */
8098 if (s->type == AUTH_TYPE_NONE) {
8099 /* do nothing */
8100 } else if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD ||
8101 s->type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) {
8102 if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD)
8103 c_write_str(ssh, "Server refused our key\r\n");
8104 logevent("Server refused our key");
8105 } else if (s->type == AUTH_TYPE_PUBLICKEY) {
8106 /* This _shouldn't_ happen except by a
8107 * protocol bug causing client and server to
8108 * disagree on what is a correct signature. */
8109 c_write_str(ssh, "Server refused public-key signature"
8110 " despite accepting key!\r\n");
8111 logevent("Server refused public-key signature"
8112 " despite accepting key!");
8113 } else if (s->type==AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET) {
8114 /* quiet, so no c_write */
8115 logevent("Server refused keyboard-interactive authentication");
8116 } else if (s->type==AUTH_TYPE_GSSAPI) {
8117 /* always quiet, so no c_write */
8118 /* also, the code down in the GSSAPI block has
8119 * already logged this in the Event Log */
8120 } else if (s->type == AUTH_TYPE_KEYBOARD_INTERACTIVE) {
8121 logevent("Keyboard-interactive authentication failed");
8122 c_write_str(ssh, "Access denied\r\n");
8123 } else {
8124 assert(s->type == AUTH_TYPE_PASSWORD);
8125 logevent("Password authentication failed");
8126 c_write_str(ssh, "Access denied\r\n");
8127
8128 if (conf_get_int(ssh->conf, CONF_change_username)) {
8129 /* XXX perhaps we should allow
8130 * keyboard-interactive to do this too? */
8131 s->we_are_in = FALSE;
8132 break;
8133 }
8134 }
8135 } else {
8136 c_write_str(ssh, "Further authentication required\r\n");
8137 logevent("Further authentication required");
8138 }
8139
8140 s->can_pubkey =
8141 in_commasep_string("publickey", methods, methlen);
8142 s->can_passwd =
8143 in_commasep_string("password", methods, methlen);
8144 s->can_keyb_inter = conf_get_int(ssh->conf, CONF_try_ki_auth) &&
8145 in_commasep_string("keyboard-interactive", methods, methlen);
8146 #ifndef NO_GSSAPI
8147 if (!ssh->gsslibs)
8148 ssh->gsslibs = ssh_gss_setup(ssh->conf);
8149 s->can_gssapi = conf_get_int(ssh->conf, CONF_try_gssapi_auth) &&
8150 in_commasep_string("gssapi-with-mic", methods, methlen) &&
8151 ssh->gsslibs->nlibraries > 0;
8152 #endif
8153 }
8154
8155 ssh->pkt_actx = SSH2_PKTCTX_NOAUTH;
8156
8157 if (s->can_pubkey && !s->done_agent && s->nkeys) {
8158
8159 /*
8160 * Attempt public-key authentication using a key from Pageant.
8161 */
8162
8163 ssh->pkt_actx = SSH2_PKTCTX_PUBLICKEY;
8164
8165 logeventf(ssh, "Trying Pageant key #%d", s->keyi);
8166
8167 /* Unpack key from agent response */
8168 s->pklen = GET_32BIT(s->agentp);
8169 s->agentp += 4;
8170 s->pkblob = (char *)s->agentp;
8171 s->agentp += s->pklen;
8172 s->alglen = GET_32BIT(s->pkblob);
8173 s->alg = s->pkblob + 4;
8174 s->commentlen = GET_32BIT(s->agentp);
8175 s->agentp += 4;
8176 s->commentp = (char *)s->agentp;
8177 s->agentp += s->commentlen;
8178 /* s->agentp now points at next key, if any */
8179
8180 /* See if server will accept it */
8181 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
8182 ssh2_pkt_addstring(s->pktout, ssh->username);
8183 ssh2_pkt_addstring(s->pktout, "ssh-connection");
8184 /* service requested */
8185 ssh2_pkt_addstring(s->pktout, "publickey");
8186 /* method */
8187 ssh2_pkt_addbool(s->pktout, FALSE); /* no signature included */
8188 ssh2_pkt_addstring_start(s->pktout);
8189 ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen);
8190 ssh2_pkt_addstring_start(s->pktout);
8191 ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen);
8192 ssh2_pkt_send(ssh, s->pktout);
8193 s->type = AUTH_TYPE_PUBLICKEY_OFFER_QUIET;
8194
8195 crWaitUntilV(pktin);
8196 if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) {
8197
8198 /* Offer of key refused. */
8199 s->gotit = TRUE;
8200
8201 } else {
8202
8203 void *vret;
8204
8205 if (flags & FLAG_VERBOSE) {
8206 c_write_str(ssh, "Authenticating with "
8207 "public key \"");
8208 c_write(ssh, s->commentp, s->commentlen);
8209 c_write_str(ssh, "\" from agent\r\n");
8210 }
8211
8212 /*
8213 * Server is willing to accept the key.
8214 * Construct a SIGN_REQUEST.
8215 */
8216 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
8217 ssh2_pkt_addstring(s->pktout, ssh->username);
8218 ssh2_pkt_addstring(s->pktout, "ssh-connection");
8219 /* service requested */
8220 ssh2_pkt_addstring(s->pktout, "publickey");
8221 /* method */
8222 ssh2_pkt_addbool(s->pktout, TRUE); /* signature included */
8223 ssh2_pkt_addstring_start(s->pktout);
8224 ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen);
8225 ssh2_pkt_addstring_start(s->pktout);
8226 ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen);
8227
8228 /* Ask agent for signature. */
8229 s->siglen = s->pktout->length - 5 + 4 +
8230 ssh->v2_session_id_len;
8231 if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)
8232 s->siglen -= 4;
8233 s->len = 1; /* message type */
8234 s->len += 4 + s->pklen; /* key blob */
8235 s->len += 4 + s->siglen; /* data to sign */
8236 s->len += 4; /* flags */
8237 s->agentreq = snewn(4 + s->len, char);
8238 PUT_32BIT(s->agentreq, s->len);
8239 s->q = s->agentreq + 4;
8240 *s->q++ = SSH2_AGENTC_SIGN_REQUEST;
8241 PUT_32BIT(s->q, s->pklen);
8242 s->q += 4;
8243 memcpy(s->q, s->pkblob, s->pklen);
8244 s->q += s->pklen;
8245 PUT_32BIT(s->q, s->siglen);
8246 s->q += 4;
8247 /* Now the data to be signed... */
8248 if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) {
8249 PUT_32BIT(s->q, ssh->v2_session_id_len);
8250 s->q += 4;
8251 }
8252 memcpy(s->q, ssh->v2_session_id,
8253 ssh->v2_session_id_len);
8254 s->q += ssh->v2_session_id_len;
8255 memcpy(s->q, s->pktout->data + 5,
8256 s->pktout->length - 5);
8257 s->q += s->pktout->length - 5;
8258 /* And finally the (zero) flags word. */
8259 PUT_32BIT(s->q, 0);
8260 if (!agent_query(s->agentreq, s->len + 4,
8261 &vret, &s->retlen,
8262 ssh_agent_callback, ssh)) {
8263 do {
8264 crReturnV;
8265 if (pktin) {
8266 bombout(("Unexpected data from server"
8267 " while waiting for agent"
8268 " response"));
8269 crStopV;
8270 }
8271 } while (pktin || inlen > 0);
8272 vret = ssh->agent_response;
8273 s->retlen = ssh->agent_response_len;
8274 }
8275 s->ret = vret;
8276 sfree(s->agentreq);
8277 if (s->ret) {
8278 if (s->ret[4] == SSH2_AGENT_SIGN_RESPONSE) {
8279 logevent("Sending Pageant's response");
8280 ssh2_add_sigblob(ssh, s->pktout,
8281 s->pkblob, s->pklen,
8282 s->ret + 9,
8283 GET_32BIT(s->ret + 5));
8284 ssh2_pkt_send(ssh, s->pktout);
8285 s->type = AUTH_TYPE_PUBLICKEY;
8286 } else {
8287 /* FIXME: less drastic response */
8288 bombout(("Pageant failed to answer challenge"));
8289 crStopV;
8290 }
8291 }
8292 }
8293
8294 /* Do we have any keys left to try? */
8295 if (s->pkblob_in_agent) {
8296 s->done_agent = TRUE;
8297 s->tried_pubkey_config = TRUE;
8298 } else {
8299 s->keyi++;
8300 if (s->keyi >= s->nkeys)
8301 s->done_agent = TRUE;
8302 }
8303
8304 } else if (s->can_pubkey && s->publickey_blob &&
8305 !s->tried_pubkey_config) {
8306
8307 struct ssh2_userkey *key; /* not live over crReturn */
8308 char *passphrase; /* not live over crReturn */
8309
8310 ssh->pkt_actx = SSH2_PKTCTX_PUBLICKEY;
8311
8312 s->tried_pubkey_config = TRUE;
8313
8314 /*
8315 * Try the public key supplied in the configuration.
8316 *
8317 * First, offer the public blob to see if the server is
8318 * willing to accept it.
8319 */
8320 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
8321 ssh2_pkt_addstring(s->pktout, ssh->username);
8322 ssh2_pkt_addstring(s->pktout, "ssh-connection");
8323 /* service requested */
8324 ssh2_pkt_addstring(s->pktout, "publickey"); /* method */
8325 ssh2_pkt_addbool(s->pktout, FALSE);
8326 /* no signature included */
8327 ssh2_pkt_addstring(s->pktout, s->publickey_algorithm);
8328 ssh2_pkt_addstring_start(s->pktout);
8329 ssh2_pkt_addstring_data(s->pktout,
8330 (char *)s->publickey_blob,
8331 s->publickey_bloblen);
8332 ssh2_pkt_send(ssh, s->pktout);
8333 logevent("Offered public key");
8334
8335 crWaitUntilV(pktin);
8336 if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) {
8337 /* Key refused. Give up. */
8338 s->gotit = TRUE; /* reconsider message next loop */
8339 s->type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD;
8340 continue; /* process this new message */
8341 }
8342 logevent("Offer of public key accepted");
8343
8344 /*
8345 * Actually attempt a serious authentication using
8346 * the key.
8347 */
8348 if (flags & FLAG_VERBOSE) {
8349 c_write_str(ssh, "Authenticating with public key \"");
8350 c_write_str(ssh, s->publickey_comment);
8351 c_write_str(ssh, "\"\r\n");
8352 }
8353 key = NULL;
8354 while (!key) {
8355 const char *error; /* not live over crReturn */
8356 if (s->publickey_encrypted) {
8357 /*
8358 * Get a passphrase from the user.
8359 */
8360 int ret; /* need not be kept over crReturn */
8361 s->cur_prompt = new_prompts(ssh->frontend);
8362 s->cur_prompt->to_server = FALSE;
8363 s->cur_prompt->name = dupstr("SSH key passphrase");
8364 add_prompt(s->cur_prompt,
8365 dupprintf("Passphrase for key \"%.100s\": ",
8366 s->publickey_comment),
8367 FALSE);
8368 ret = get_userpass_input(s->cur_prompt, NULL, 0);
8369 while (ret < 0) {
8370 ssh->send_ok = 1;
8371 crWaitUntilV(!pktin);
8372 ret = get_userpass_input(s->cur_prompt,
8373 in, inlen);
8374 ssh->send_ok = 0;
8375 }
8376 if (!ret) {
8377 /* Failed to get a passphrase. Terminate. */
8378 free_prompts(s->cur_prompt);
8379 ssh_disconnect(ssh, NULL,
8380 "Unable to authenticate",
8381 SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
8382 TRUE);
8383 crStopV;
8384 }
8385 passphrase =
8386 dupstr(s->cur_prompt->prompts[0]->result);
8387 free_prompts(s->cur_prompt);
8388 } else {
8389 passphrase = NULL; /* no passphrase needed */
8390 }
8391
8392 /*
8393 * Try decrypting the key.
8394 */
8395 s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile);
8396 key = ssh2_load_userkey(s->keyfile, passphrase, &error);
8397 if (passphrase) {
8398 /* burn the evidence */
8399 smemclr(passphrase, strlen(passphrase));
8400 sfree(passphrase);
8401 }
8402 if (key == SSH2_WRONG_PASSPHRASE || key == NULL) {
8403 if (passphrase &&
8404 (key == SSH2_WRONG_PASSPHRASE)) {
8405 c_write_str(ssh, "Wrong passphrase\r\n");
8406 key = NULL;
8407 /* and loop again */
8408 } else {
8409 c_write_str(ssh, "Unable to load private key (");
8410 c_write_str(ssh, error);
8411 c_write_str(ssh, ")\r\n");
8412 key = NULL;
8413 break; /* try something else */
8414 }
8415 }
8416 }
8417
8418 if (key) {
8419 unsigned char *pkblob, *sigblob, *sigdata;
8420 int pkblob_len, sigblob_len, sigdata_len;
8421 int p;
8422
8423 /*
8424 * We have loaded the private key and the server
8425 * has announced that it's willing to accept it.
8426 * Hallelujah. Generate a signature and send it.
8427 */
8428 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
8429 ssh2_pkt_addstring(s->pktout, ssh->username);
8430 ssh2_pkt_addstring(s->pktout, "ssh-connection");
8431 /* service requested */
8432 ssh2_pkt_addstring(s->pktout, "publickey");
8433 /* method */
8434 ssh2_pkt_addbool(s->pktout, TRUE);
8435 /* signature follows */
8436 ssh2_pkt_addstring(s->pktout, key->alg->name);
8437 pkblob = key->alg->public_blob(key->data,
8438 &pkblob_len);
8439 ssh2_pkt_addstring_start(s->pktout);
8440 ssh2_pkt_addstring_data(s->pktout, (char *)pkblob,
8441 pkblob_len);
8442
8443 /*
8444 * The data to be signed is:
8445 *
8446 * string session-id
8447 *
8448 * followed by everything so far placed in the
8449 * outgoing packet.
8450 */
8451 sigdata_len = s->pktout->length - 5 + 4 +
8452 ssh->v2_session_id_len;
8453 if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)
8454 sigdata_len -= 4;
8455 sigdata = snewn(sigdata_len, unsigned char);
8456 p = 0;
8457 if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) {
8458 PUT_32BIT(sigdata+p, ssh->v2_session_id_len);
8459 p += 4;
8460 }
8461 memcpy(sigdata+p, ssh->v2_session_id,
8462 ssh->v2_session_id_len);
8463 p += ssh->v2_session_id_len;
8464 memcpy(sigdata+p, s->pktout->data + 5,
8465 s->pktout->length - 5);
8466 p += s->pktout->length - 5;
8467 assert(p == sigdata_len);
8468 sigblob = key->alg->sign(key->data, (char *)sigdata,
8469 sigdata_len, &sigblob_len);
8470 ssh2_add_sigblob(ssh, s->pktout, pkblob, pkblob_len,
8471 sigblob, sigblob_len);
8472 sfree(pkblob);
8473 sfree(sigblob);
8474 sfree(sigdata);
8475
8476 ssh2_pkt_send(ssh, s->pktout);
8477 logevent("Sent public key signature");
8478 s->type = AUTH_TYPE_PUBLICKEY;
8479 key->alg->freekey(key->data);
8480 }
8481
8482 #ifndef NO_GSSAPI
8483 } else if (s->can_gssapi && !s->tried_gssapi) {
8484
8485 /* GSSAPI Authentication */
8486
8487 int micoffset, len;
8488 char *data;
8489 Ssh_gss_buf mic;
8490 s->type = AUTH_TYPE_GSSAPI;
8491 s->tried_gssapi = TRUE;
8492 s->gotit = TRUE;
8493 ssh->pkt_actx = SSH2_PKTCTX_GSSAPI;
8494
8495 /*
8496 * Pick the highest GSS library on the preference
8497 * list.
8498 */
8499 {
8500 int i, j;
8501 s->gsslib = NULL;
8502 for (i = 0; i < ngsslibs; i++) {
8503 int want_id = conf_get_int_int(ssh->conf,
8504 CONF_ssh_gsslist, i);
8505 for (j = 0; j < ssh->gsslibs->nlibraries; j++)
8506 if (ssh->gsslibs->libraries[j].id == want_id) {
8507 s->gsslib = &ssh->gsslibs->libraries[j];
8508 goto got_gsslib; /* double break */
8509 }
8510 }
8511 got_gsslib:
8512 /*
8513 * We always expect to have found something in
8514 * the above loop: we only came here if there
8515 * was at least one viable GSS library, and the
8516 * preference list should always mention
8517 * everything and only change the order.
8518 */
8519 assert(s->gsslib);
8520 }
8521
8522 if (s->gsslib->gsslogmsg)
8523 logevent(s->gsslib->gsslogmsg);
8524
8525 /* Sending USERAUTH_REQUEST with "gssapi-with-mic" method */
8526 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
8527 ssh2_pkt_addstring(s->pktout, ssh->username);
8528 ssh2_pkt_addstring(s->pktout, "ssh-connection");
8529 ssh2_pkt_addstring(s->pktout, "gssapi-with-mic");
8530 logevent("Attempting GSSAPI authentication");
8531
8532 /* add mechanism info */
8533 s->gsslib->indicate_mech(s->gsslib, &s->gss_buf);
8534
8535 /* number of GSSAPI mechanisms */
8536 ssh2_pkt_adduint32(s->pktout,1);
8537
8538 /* length of OID + 2 */
8539 ssh2_pkt_adduint32(s->pktout, s->gss_buf.length + 2);
8540 ssh2_pkt_addbyte(s->pktout, SSH2_GSS_OIDTYPE);
8541
8542 /* length of OID */
8543 ssh2_pkt_addbyte(s->pktout, (unsigned char) s->gss_buf.length);
8544
8545 ssh_pkt_adddata(s->pktout, s->gss_buf.value,
8546 s->gss_buf.length);
8547 ssh2_pkt_send(ssh, s->pktout);
8548 crWaitUntilV(pktin);
8549 if (pktin->type != SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) {
8550 logevent("GSSAPI authentication request refused");
8551 continue;
8552 }
8553
8554 /* check returned packet ... */
8555
8556 ssh_pkt_getstring(pktin, &data, &len);
8557 s->gss_rcvtok.value = data;
8558 s->gss_rcvtok.length = len;
8559 if (s->gss_rcvtok.length != s->gss_buf.length + 2 ||
8560 ((char *)s->gss_rcvtok.value)[0] != SSH2_GSS_OIDTYPE ||
8561 ((char *)s->gss_rcvtok.value)[1] != s->gss_buf.length ||
8562 memcmp((char *)s->gss_rcvtok.value + 2,
8563 s->gss_buf.value,s->gss_buf.length) ) {
8564 logevent("GSSAPI authentication - wrong response from server");
8565 continue;
8566 }
8567
8568 /* now start running */
8569 s->gss_stat = s->gsslib->import_name(s->gsslib,
8570 ssh->fullhostname,
8571 &s->gss_srv_name);
8572 if (s->gss_stat != SSH_GSS_OK) {
8573 if (s->gss_stat == SSH_GSS_BAD_HOST_NAME)
8574 logevent("GSSAPI import name failed - Bad service name");
8575 else
8576 logevent("GSSAPI import name failed");
8577 continue;
8578 }
8579
8580 /* fetch TGT into GSS engine */
8581 s->gss_stat = s->gsslib->acquire_cred(s->gsslib, &s->gss_ctx);
8582
8583 if (s->gss_stat != SSH_GSS_OK) {
8584 logevent("GSSAPI authentication failed to get credentials");
8585 s->gsslib->release_name(s->gsslib, &s->gss_srv_name);
8586 continue;
8587 }
8588
8589 /* initial tokens are empty */
8590 SSH_GSS_CLEAR_BUF(&s->gss_rcvtok);
8591 SSH_GSS_CLEAR_BUF(&s->gss_sndtok);
8592
8593 /* now enter the loop */
8594 do {
8595 s->gss_stat = s->gsslib->init_sec_context
8596 (s->gsslib,
8597 &s->gss_ctx,
8598 s->gss_srv_name,
8599 conf_get_int(ssh->conf, CONF_gssapifwd),
8600 &s->gss_rcvtok,
8601 &s->gss_sndtok);
8602
8603 if (s->gss_stat!=SSH_GSS_S_COMPLETE &&
8604 s->gss_stat!=SSH_GSS_S_CONTINUE_NEEDED) {
8605 logevent("GSSAPI authentication initialisation failed");
8606
8607 if (s->gsslib->display_status(s->gsslib, s->gss_ctx,
8608 &s->gss_buf) == SSH_GSS_OK) {
8609 logevent(s->gss_buf.value);
8610 sfree(s->gss_buf.value);
8611 }
8612
8613 break;
8614 }
8615 logevent("GSSAPI authentication initialised");
8616
8617 /* Client and server now exchange tokens until GSSAPI
8618 * no longer says CONTINUE_NEEDED */
8619
8620 if (s->gss_sndtok.length != 0) {
8621 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_GSSAPI_TOKEN);
8622 ssh_pkt_addstring_start(s->pktout);
8623 ssh_pkt_addstring_data(s->pktout,s->gss_sndtok.value,s->gss_sndtok.length);
8624 ssh2_pkt_send(ssh, s->pktout);
8625 s->gsslib->free_tok(s->gsslib, &s->gss_sndtok);
8626 }
8627
8628 if (s->gss_stat == SSH_GSS_S_CONTINUE_NEEDED) {
8629 crWaitUntilV(pktin);
8630 if (pktin->type != SSH2_MSG_USERAUTH_GSSAPI_TOKEN) {
8631 logevent("GSSAPI authentication - bad server response");
8632 s->gss_stat = SSH_GSS_FAILURE;
8633 break;
8634 }
8635 ssh_pkt_getstring(pktin, &data, &len);
8636 s->gss_rcvtok.value = data;
8637 s->gss_rcvtok.length = len;
8638 }
8639 } while (s-> gss_stat == SSH_GSS_S_CONTINUE_NEEDED);
8640
8641 if (s->gss_stat != SSH_GSS_OK) {
8642 s->gsslib->release_name(s->gsslib, &s->gss_srv_name);
8643 s->gsslib->release_cred(s->gsslib, &s->gss_ctx);
8644 continue;
8645 }
8646 logevent("GSSAPI authentication loop finished OK");
8647
8648 /* Now send the MIC */
8649
8650 s->pktout = ssh2_pkt_init(0);
8651 micoffset = s->pktout->length;
8652 ssh_pkt_addstring_start(s->pktout);
8653 ssh_pkt_addstring_data(s->pktout, (char *)ssh->v2_session_id, ssh->v2_session_id_len);
8654 ssh_pkt_addbyte(s->pktout, SSH2_MSG_USERAUTH_REQUEST);
8655 ssh_pkt_addstring(s->pktout, ssh->username);
8656 ssh_pkt_addstring(s->pktout, "ssh-connection");
8657 ssh_pkt_addstring(s->pktout, "gssapi-with-mic");
8658
8659 s->gss_buf.value = (char *)s->pktout->data + micoffset;
8660 s->gss_buf.length = s->pktout->length - micoffset;
8661
8662 s->gsslib->get_mic(s->gsslib, s->gss_ctx, &s->gss_buf, &mic);
8663 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_GSSAPI_MIC);
8664 ssh_pkt_addstring_start(s->pktout);
8665 ssh_pkt_addstring_data(s->pktout, mic.value, mic.length);
8666 ssh2_pkt_send(ssh, s->pktout);
8667 s->gsslib->free_mic(s->gsslib, &mic);
8668
8669 s->gotit = FALSE;
8670
8671 s->gsslib->release_name(s->gsslib, &s->gss_srv_name);
8672 s->gsslib->release_cred(s->gsslib, &s->gss_ctx);
8673 continue;
8674 #endif
8675 } else if (s->can_keyb_inter && !s->kbd_inter_refused) {
8676
8677 /*
8678 * Keyboard-interactive authentication.
8679 */
8680
8681 s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE;
8682
8683 ssh->pkt_actx = SSH2_PKTCTX_KBDINTER;
8684
8685 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
8686 ssh2_pkt_addstring(s->pktout, ssh->username);
8687 ssh2_pkt_addstring(s->pktout, "ssh-connection");
8688 /* service requested */
8689 ssh2_pkt_addstring(s->pktout, "keyboard-interactive");
8690 /* method */
8691 ssh2_pkt_addstring(s->pktout, ""); /* lang */
8692 ssh2_pkt_addstring(s->pktout, ""); /* submethods */
8693 ssh2_pkt_send(ssh, s->pktout);
8694
8695 logevent("Attempting keyboard-interactive authentication");
8696
8697 crWaitUntilV(pktin);
8698 if (pktin->type != SSH2_MSG_USERAUTH_INFO_REQUEST) {
8699 /* Server is not willing to do keyboard-interactive
8700 * at all (or, bizarrely but legally, accepts the
8701 * user without actually issuing any prompts).
8702 * Give up on it entirely. */
8703 s->gotit = TRUE;
8704 s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET;
8705 s->kbd_inter_refused = TRUE; /* don't try it again */
8706 continue;
8707 }
8708
8709 /*
8710 * Loop while the server continues to send INFO_REQUESTs.
8711 */
8712 while (pktin->type == SSH2_MSG_USERAUTH_INFO_REQUEST) {
8713
8714 char *name, *inst, *lang;
8715 int name_len, inst_len, lang_len;
8716 int i;
8717
8718 /*
8719 * We've got a fresh USERAUTH_INFO_REQUEST.
8720 * Get the preamble and start building a prompt.
8721 */
8722 ssh_pkt_getstring(pktin, &name, &name_len);
8723 ssh_pkt_getstring(pktin, &inst, &inst_len);
8724 ssh_pkt_getstring(pktin, &lang, &lang_len);
8725 s->cur_prompt = new_prompts(ssh->frontend);
8726 s->cur_prompt->to_server = TRUE;
8727
8728 /*
8729 * Get any prompt(s) from the packet.
8730 */
8731 s->num_prompts = ssh_pkt_getuint32(pktin);
8732 for (i = 0; i < s->num_prompts; i++) {
8733 char *prompt;
8734 int prompt_len;
8735 int echo;
8736 static char noprompt[] =
8737 "<server failed to send prompt>: ";
8738
8739 ssh_pkt_getstring(pktin, &prompt, &prompt_len);
8740 echo = ssh2_pkt_getbool(pktin);
8741 if (!prompt_len) {
8742 prompt = noprompt;
8743 prompt_len = lenof(noprompt)-1;
8744 }
8745 add_prompt(s->cur_prompt,
8746 dupprintf("%.*s", prompt_len, prompt),
8747 echo);
8748 }
8749
8750 if (name_len) {
8751 /* FIXME: better prefix to distinguish from
8752 * local prompts? */
8753 s->cur_prompt->name =
8754 dupprintf("SSH server: %.*s", name_len, name);
8755 s->cur_prompt->name_reqd = TRUE;
8756 } else {
8757 s->cur_prompt->name =
8758 dupstr("SSH server authentication");
8759 s->cur_prompt->name_reqd = FALSE;
8760 }
8761 /* We add a prefix to try to make it clear that a prompt
8762 * has come from the server.
8763 * FIXME: ugly to print "Using..." in prompt _every_
8764 * time round. Can this be done more subtly? */
8765 /* Special case: for reasons best known to themselves,
8766 * some servers send k-i requests with no prompts and
8767 * nothing to display. Keep quiet in this case. */
8768 if (s->num_prompts || name_len || inst_len) {
8769 s->cur_prompt->instruction =
8770 dupprintf("Using keyboard-interactive authentication.%s%.*s",
8771 inst_len ? "\n" : "", inst_len, inst);
8772 s->cur_prompt->instr_reqd = TRUE;
8773 } else {
8774 s->cur_prompt->instr_reqd = FALSE;
8775 }
8776
8777 /*
8778 * Display any instructions, and get the user's
8779 * response(s).
8780 */
8781 {
8782 int ret; /* not live over crReturn */
8783 ret = get_userpass_input(s->cur_prompt, NULL, 0);
8784 while (ret < 0) {
8785 ssh->send_ok = 1;
8786 crWaitUntilV(!pktin);
8787 ret = get_userpass_input(s->cur_prompt, in, inlen);
8788 ssh->send_ok = 0;
8789 }
8790 if (!ret) {
8791 /*
8792 * Failed to get responses. Terminate.
8793 */
8794 free_prompts(s->cur_prompt);
8795 ssh_disconnect(ssh, NULL, "Unable to authenticate",
8796 SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
8797 TRUE);
8798 crStopV;
8799 }
8800 }
8801
8802 /*
8803 * Send the response(s) to the server.
8804 */
8805 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE);
8806 ssh2_pkt_adduint32(s->pktout, s->num_prompts);
8807 for (i=0; i < s->num_prompts; i++) {
8808 dont_log_password(ssh, s->pktout, PKTLOG_BLANK);
8809 ssh2_pkt_addstring(s->pktout,
8810 s->cur_prompt->prompts[i]->result);
8811 end_log_omission(ssh, s->pktout);
8812 }
8813 ssh2_pkt_send_with_padding(ssh, s->pktout, 256);
8814
8815 /*
8816 * Free the prompts structure from this iteration.
8817 * If there's another, a new one will be allocated
8818 * when we return to the top of this while loop.
8819 */
8820 free_prompts(s->cur_prompt);
8821
8822 /*
8823 * Get the next packet in case it's another
8824 * INFO_REQUEST.
8825 */
8826 crWaitUntilV(pktin);
8827
8828 }
8829
8830 /*
8831 * We should have SUCCESS or FAILURE now.
8832 */
8833 s->gotit = TRUE;
8834
8835 } else if (s->can_passwd) {
8836
8837 /*
8838 * Plain old password authentication.
8839 */
8840 int ret; /* not live over crReturn */
8841 int changereq_first_time; /* not live over crReturn */
8842
8843 ssh->pkt_actx = SSH2_PKTCTX_PASSWORD;
8844
8845 s->cur_prompt = new_prompts(ssh->frontend);
8846 s->cur_prompt->to_server = TRUE;
8847 s->cur_prompt->name = dupstr("SSH password");
8848 add_prompt(s->cur_prompt, dupprintf("%s@%s's password: ",
8849 ssh->username,
8850 ssh->savedhost),
8851 FALSE);
8852
8853 ret = get_userpass_input(s->cur_prompt, NULL, 0);
8854 while (ret < 0) {
8855 ssh->send_ok = 1;
8856 crWaitUntilV(!pktin);
8857 ret = get_userpass_input(s->cur_prompt, in, inlen);
8858 ssh->send_ok = 0;
8859 }
8860 if (!ret) {
8861 /*
8862 * Failed to get responses. Terminate.
8863 */
8864 free_prompts(s->cur_prompt);
8865 ssh_disconnect(ssh, NULL, "Unable to authenticate",
8866 SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
8867 TRUE);
8868 crStopV;
8869 }
8870 /*
8871 * Squirrel away the password. (We may need it later if
8872 * asked to change it.)
8873 */
8874 s->password = dupstr(s->cur_prompt->prompts[0]->result);
8875 free_prompts(s->cur_prompt);
8876
8877 /*
8878 * Send the password packet.
8879 *
8880 * We pad out the password packet to 256 bytes to make
8881 * it harder for an attacker to find the length of the
8882 * user's password.
8883 *
8884 * Anyone using a password longer than 256 bytes
8885 * probably doesn't have much to worry about from
8886 * people who find out how long their password is!
8887 */
8888 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
8889 ssh2_pkt_addstring(s->pktout, ssh->username);
8890 ssh2_pkt_addstring(s->pktout, "ssh-connection");
8891 /* service requested */
8892 ssh2_pkt_addstring(s->pktout, "password");
8893 ssh2_pkt_addbool(s->pktout, FALSE);
8894 dont_log_password(ssh, s->pktout, PKTLOG_BLANK);
8895 ssh2_pkt_addstring(s->pktout, s->password);
8896 end_log_omission(ssh, s->pktout);
8897 ssh2_pkt_send_with_padding(ssh, s->pktout, 256);
8898 logevent("Sent password");
8899 s->type = AUTH_TYPE_PASSWORD;
8900
8901 /*
8902 * Wait for next packet, in case it's a password change
8903 * request.
8904 */
8905 crWaitUntilV(pktin);
8906 changereq_first_time = TRUE;
8907
8908 while (pktin->type == SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ) {
8909
8910 /*
8911 * We're being asked for a new password
8912 * (perhaps not for the first time).
8913 * Loop until the server accepts it.
8914 */
8915
8916 int got_new = FALSE; /* not live over crReturn */
8917 char *prompt; /* not live over crReturn */
8918 int prompt_len; /* not live over crReturn */
8919
8920 {
8921 char *msg;
8922 if (changereq_first_time)
8923 msg = "Server requested password change";
8924 else
8925 msg = "Server rejected new password";
8926 logevent(msg);
8927 c_write_str(ssh, msg);
8928 c_write_str(ssh, "\r\n");
8929 }
8930
8931 ssh_pkt_getstring(pktin, &prompt, &prompt_len);
8932
8933 s->cur_prompt = new_prompts(ssh->frontend);
8934 s->cur_prompt->to_server = TRUE;
8935 s->cur_prompt->name = dupstr("New SSH password");
8936 s->cur_prompt->instruction =
8937 dupprintf("%.*s", prompt_len, prompt);
8938 s->cur_prompt->instr_reqd = TRUE;
8939 /*
8940 * There's no explicit requirement in the protocol
8941 * for the "old" passwords in the original and
8942 * password-change messages to be the same, and
8943 * apparently some Cisco kit supports password change
8944 * by the user entering a blank password originally
8945 * and the real password subsequently, so,
8946 * reluctantly, we prompt for the old password again.
8947 *
8948 * (On the other hand, some servers don't even bother
8949 * to check this field.)
8950 */
8951 add_prompt(s->cur_prompt,
8952 dupstr("Current password (blank for previously entered password): "),
8953 FALSE);
8954 add_prompt(s->cur_prompt, dupstr("Enter new password: "),
8955 FALSE);
8956 add_prompt(s->cur_prompt, dupstr("Confirm new password: "),
8957 FALSE);
8958
8959 /*
8960 * Loop until the user manages to enter the same
8961 * password twice.
8962 */
8963 while (!got_new) {
8964
8965 ret = get_userpass_input(s->cur_prompt, NULL, 0);
8966 while (ret < 0) {
8967 ssh->send_ok = 1;
8968 crWaitUntilV(!pktin);
8969 ret = get_userpass_input(s->cur_prompt, in, inlen);
8970 ssh->send_ok = 0;
8971 }
8972 if (!ret) {
8973 /*
8974 * Failed to get responses. Terminate.
8975 */
8976 /* burn the evidence */
8977 free_prompts(s->cur_prompt);
8978 smemclr(s->password, strlen(s->password));
8979 sfree(s->password);
8980 ssh_disconnect(ssh, NULL, "Unable to authenticate",
8981 SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
8982 TRUE);
8983 crStopV;
8984 }
8985
8986 /*
8987 * If the user specified a new original password
8988 * (IYSWIM), overwrite any previously specified
8989 * one.
8990 * (A side effect is that the user doesn't have to
8991 * re-enter it if they louse up the new password.)
8992 */
8993 if (s->cur_prompt->prompts[0]->result[0]) {
8994 smemclr(s->password, strlen(s->password));
8995 /* burn the evidence */
8996 sfree(s->password);
8997 s->password =
8998 dupstr(s->cur_prompt->prompts[0]->result);
8999 }
9000
9001 /*
9002 * Check the two new passwords match.
9003 */
9004 got_new = (strcmp(s->cur_prompt->prompts[1]->result,
9005 s->cur_prompt->prompts[2]->result)
9006 == 0);
9007 if (!got_new)
9008 /* They don't. Silly user. */
9009 c_write_str(ssh, "Passwords do not match\r\n");
9010
9011 }
9012
9013 /*
9014 * Send the new password (along with the old one).
9015 * (see above for padding rationale)
9016 */
9017 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9018 ssh2_pkt_addstring(s->pktout, ssh->username);
9019 ssh2_pkt_addstring(s->pktout, "ssh-connection");
9020 /* service requested */
9021 ssh2_pkt_addstring(s->pktout, "password");
9022 ssh2_pkt_addbool(s->pktout, TRUE);
9023 dont_log_password(ssh, s->pktout, PKTLOG_BLANK);
9024 ssh2_pkt_addstring(s->pktout, s->password);
9025 ssh2_pkt_addstring(s->pktout,
9026 s->cur_prompt->prompts[1]->result);
9027 free_prompts(s->cur_prompt);
9028 end_log_omission(ssh, s->pktout);
9029 ssh2_pkt_send_with_padding(ssh, s->pktout, 256);
9030 logevent("Sent new password");
9031
9032 /*
9033 * Now see what the server has to say about it.
9034 * (If it's CHANGEREQ again, it's not happy with the
9035 * new password.)
9036 */
9037 crWaitUntilV(pktin);
9038 changereq_first_time = FALSE;
9039
9040 }
9041
9042 /*
9043 * We need to reexamine the current pktin at the top
9044 * of the loop. Either:
9045 * - we weren't asked to change password at all, in
9046 * which case it's a SUCCESS or FAILURE with the
9047 * usual meaning
9048 * - we sent a new password, and the server was
9049 * either OK with it (SUCCESS or FAILURE w/partial
9050 * success) or unhappy with the _old_ password
9051 * (FAILURE w/o partial success)
9052 * In any of these cases, we go back to the top of
9053 * the loop and start again.
9054 */
9055 s->gotit = TRUE;
9056
9057 /*
9058 * We don't need the old password any more, in any
9059 * case. Burn the evidence.
9060 */
9061 smemclr(s->password, strlen(s->password));
9062 sfree(s->password);
9063
9064 } else {
9065 char *str = dupprintf("No supported authentication methods available"
9066 " (server sent: %.*s)",
9067 methlen, methods);
9068
9069 ssh_disconnect(ssh, str,
9070 "No supported authentication methods available",
9071 SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
9072 FALSE);
9073 sfree(str);
9074
9075 crStopV;
9076
9077 }
9078
9079 }
9080 }
9081 ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = NULL;
9082
9083 /* Clear up various bits and pieces from authentication. */
9084 if (s->publickey_blob) {
9085 sfree(s->publickey_blob);
9086 sfree(s->publickey_comment);
9087 }
9088 if (s->agent_response)
9089 sfree(s->agent_response);
9090
9091 if (s->userauth_success) {
9092 /*
9093 * We've just received USERAUTH_SUCCESS, and we haven't sent any
9094 * packets since. Signal the transport layer to consider enacting
9095 * delayed compression.
9096 *
9097 * (Relying on we_are_in is not sufficient, as
9098 * draft-miller-secsh-compression-delayed is quite clear that it
9099 * triggers on USERAUTH_SUCCESS specifically, and we_are_in can
9100 * become set for other reasons.)
9101 */
9102 do_ssh2_transport(ssh, "enabling delayed compression", -2, NULL);
9103 }
9104
9105 /*
9106 * Now the connection protocol has started, one way or another.
9107 */
9108
9109 ssh->channels = newtree234(ssh_channelcmp);
9110
9111 /*
9112 * Set up handlers for some connection protocol messages, so we
9113 * don't have to handle them repeatedly in this coroutine.
9114 */
9115 ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] =
9116 ssh2_msg_channel_window_adjust;
9117 ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] =
9118 ssh2_msg_global_request;
9119
9120 /*
9121 * Create the main session channel.
9122 */
9123 if (conf_get_int(ssh->conf, CONF_ssh_no_shell)) {
9124 ssh->mainchan = NULL;
9125 } else if (*conf_get_str(ssh->conf, CONF_ssh_nc_host)) {
9126 /*
9127 * Just start a direct-tcpip channel and use it as the main
9128 * channel.
9129 */
9130 ssh->mainchan = snew(struct ssh_channel);
9131 ssh->mainchan->ssh = ssh;
9132 ssh2_channel_init(ssh->mainchan);
9133 logeventf(ssh,
9134 "Opening direct-tcpip channel to %s:%d in place of session",
9135 conf_get_str(ssh->conf, CONF_ssh_nc_host),
9136 conf_get_int(ssh->conf, CONF_ssh_nc_port));
9137 s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
9138 ssh2_pkt_addstring(s->pktout, "direct-tcpip");
9139 ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid);
9140 ssh2_pkt_adduint32(s->pktout, ssh->mainchan->v.v2.locwindow);/* our window size */
9141 ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */
9142 ssh2_pkt_addstring(s->pktout, conf_get_str(ssh->conf, CONF_ssh_nc_host));
9143 ssh2_pkt_adduint32(s->pktout, conf_get_int(ssh->conf, CONF_ssh_nc_port));
9144 /*
9145 * There's nothing meaningful to put in the originator
9146 * fields, but some servers insist on syntactically correct
9147 * information.
9148 */
9149 ssh2_pkt_addstring(s->pktout, "0.0.0.0");
9150 ssh2_pkt_adduint32(s->pktout, 0);
9151 ssh2_pkt_send(ssh, s->pktout);
9152
9153 crWaitUntilV(pktin);
9154 if (pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) {
9155 bombout(("Server refused to open a direct-tcpip channel"));
9156 crStopV;
9157 /* FIXME: error data comes back in FAILURE packet */
9158 }
9159 if (ssh_pkt_getuint32(pktin) != ssh->mainchan->localid) {
9160 bombout(("Server's channel confirmation cited wrong channel"));
9161 crStopV;
9162 }
9163 ssh->mainchan->remoteid = ssh_pkt_getuint32(pktin);
9164 ssh->mainchan->halfopen = FALSE;
9165 ssh->mainchan->type = CHAN_MAINSESSION;
9166 ssh->mainchan->v.v2.remwindow = ssh_pkt_getuint32(pktin);
9167 ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin);
9168 add234(ssh->channels, ssh->mainchan);
9169 update_specials_menu(ssh->frontend);
9170 logevent("Opened direct-tcpip channel");
9171 ssh->ncmode = TRUE;
9172 } else {
9173 ssh->mainchan = snew(struct ssh_channel);
9174 ssh->mainchan->ssh = ssh;
9175 ssh2_channel_init(ssh->mainchan);
9176 s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
9177 ssh2_pkt_addstring(s->pktout, "session");
9178 ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid);
9179 ssh2_pkt_adduint32(s->pktout, ssh->mainchan->v.v2.locwindow);/* our window size */
9180 ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT); /* our max pkt size */
9181 ssh2_pkt_send(ssh, s->pktout);
9182 crWaitUntilV(pktin);
9183 if (pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) {
9184 bombout(("Server refused to open a session"));
9185 crStopV;
9186 /* FIXME: error data comes back in FAILURE packet */
9187 }
9188 if (ssh_pkt_getuint32(pktin) != ssh->mainchan->localid) {
9189 bombout(("Server's channel confirmation cited wrong channel"));
9190 crStopV;
9191 }
9192 ssh->mainchan->remoteid = ssh_pkt_getuint32(pktin);
9193 ssh->mainchan->halfopen = FALSE;
9194 ssh->mainchan->type = CHAN_MAINSESSION;
9195 ssh->mainchan->v.v2.remwindow = ssh_pkt_getuint32(pktin);
9196 ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin);
9197 add234(ssh->channels, ssh->mainchan);
9198 update_specials_menu(ssh->frontend);
9199 logevent("Opened channel for session");
9200 ssh->ncmode = FALSE;
9201 }
9202
9203 /*
9204 * Now we have a channel, make dispatch table entries for
9205 * general channel-based messages.
9206 */
9207 ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] =
9208 ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] =
9209 ssh2_msg_channel_data;
9210 ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_channel_eof;
9211 ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_channel_close;
9212 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] =
9213 ssh2_msg_channel_open_confirmation;
9214 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] =
9215 ssh2_msg_channel_open_failure;
9216 ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] =
9217 ssh2_msg_channel_request;
9218 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] =
9219 ssh2_msg_channel_open;
9220 ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_channel_response;
9221 ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_channel_response;
9222
9223
9224 if (ssh->mainchan && conf_get_int(ssh->conf, CONF_ssh_simple)) {
9225 /*
9226 * This message indicates to the server that we promise
9227 * not to try to run any other channel in parallel with
9228 * this one, so it's safe for it to advertise a very large
9229 * window and leave the flow control to TCP.
9230 */
9231 s->pktout = ssh2_chanreq_init(ssh->mainchan,
9232 "simple@putty.projects.tartarus.org",
9233 NULL, NULL);
9234 ssh2_pkt_send(ssh, s->pktout);
9235 }
9236
9237 /*
9238 * Enable port forwardings.
9239 */
9240 ssh_setup_portfwd(ssh, ssh->conf);
9241
9242 /*
9243 * Send the CHANNEL_REQUESTS for the main channel. Each one is
9244 * handled by its own little asynchronous co-routine.
9245 */
9246
9247 /*
9248 * Potentially enable X11 forwarding.
9249 */
9250 ssh2_maybe_setup_x11(ssh->mainchan, NULL, NULL);
9251
9252 /*
9253 * Potentially enable agent forwarding.
9254 */
9255 ssh2_maybe_setup_agent(ssh->mainchan, NULL, NULL);
9256
9257 /*
9258 * Now allocate a pty for the session.
9259 */
9260 ssh2_maybe_setup_pty(ssh->mainchan, NULL, NULL);
9261
9262 /*
9263 * Send environment variables.
9264 */
9265 ssh2_setup_env(ssh->mainchan, NULL, NULL);
9266
9267 /*
9268 * Start a shell or a remote command. We may have to attempt
9269 * this twice if the config data has provided a second choice
9270 * of command.
9271 */
9272 if (ssh->mainchan && !ssh->ncmode) while (1) {
9273 int subsys;
9274 char *cmd;
9275
9276 if (ssh->fallback_cmd) {
9277 subsys = conf_get_int(ssh->conf, CONF_ssh_subsys2);
9278 cmd = conf_get_str(ssh->conf, CONF_remote_cmd2);
9279 } else {
9280 subsys = conf_get_int(ssh->conf, CONF_ssh_subsys);
9281 cmd = conf_get_str(ssh->conf, CONF_remote_cmd);
9282 }
9283
9284 if (subsys) {
9285 s->pktout = ssh2_chanreq_init(ssh->mainchan, "subsystem",
9286 ssh2_response_authconn, NULL);
9287 ssh2_pkt_addstring(s->pktout, cmd);
9288 } else if (*cmd) {
9289 s->pktout = ssh2_chanreq_init(ssh->mainchan, "exec",
9290 ssh2_response_authconn, NULL);
9291 ssh2_pkt_addstring(s->pktout, cmd);
9292 } else {
9293 s->pktout = ssh2_chanreq_init(ssh->mainchan, "shell",
9294 ssh2_response_authconn, NULL);
9295 }
9296 ssh2_pkt_send(ssh, s->pktout);
9297
9298 crWaitUntilV(pktin);
9299
9300 if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) {
9301 if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) {
9302 bombout(("Unexpected response to shell/command request:"
9303 " packet type %d", pktin->type));
9304 crStopV;
9305 }
9306 /*
9307 * We failed to start the command. If this is the
9308 * fallback command, we really are finished; if it's
9309 * not, and if the fallback command exists, try falling
9310 * back to it before complaining.
9311 */
9312 if (!ssh->fallback_cmd &&
9313 *conf_get_str(ssh->conf, CONF_remote_cmd2)) {
9314 logevent("Primary command failed; attempting fallback");
9315 ssh->fallback_cmd = TRUE;
9316 continue;
9317 }
9318 bombout(("Server refused to start a shell/command"));
9319 crStopV;
9320 } else {
9321 logevent("Started a shell/command");
9322 }
9323 break;
9324 }
9325
9326 ssh->state = SSH_STATE_SESSION;
9327 if (ssh->size_needed)
9328 ssh_size(ssh, ssh->term_width, ssh->term_height);
9329 if (ssh->eof_needed)
9330 ssh_special(ssh, TS_EOF);
9331
9332 /*
9333 * All the initial channel requests are done, so install the default
9334 * response handler.
9335 */
9336 ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_channel_response;
9337 ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_channel_response;
9338
9339 /*
9340 * Transfer data!
9341 */
9342 if (ssh->ldisc)
9343 ldisc_send(ssh->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */
9344 if (ssh->mainchan)
9345 ssh->send_ok = 1;
9346 while (1) {
9347 crReturnV;
9348 s->try_send = FALSE;
9349 if (pktin) {
9350
9351 /*
9352 * _All_ the connection-layer packets we expect to
9353 * receive are now handled by the dispatch table.
9354 * Anything that reaches here must be bogus.
9355 */
9356
9357 bombout(("Strange packet received: type %d", pktin->type));
9358 crStopV;
9359 } else if (ssh->mainchan) {
9360 /*
9361 * We have spare data. Add it to the channel buffer.
9362 */
9363 ssh2_add_channel_data(ssh->mainchan, (char *)in, inlen);
9364 s->try_send = TRUE;
9365 }
9366 if (s->try_send) {
9367 int i;
9368 struct ssh_channel *c;
9369 /*
9370 * Try to send data on all channels if we can.
9371 */
9372 for (i = 0; NULL != (c = index234(ssh->channels, i)); i++)
9373 ssh2_try_send_and_unthrottle(ssh, c);
9374 }
9375 }
9376
9377 crFinishV;
9378 }
9379
9380 /*
9381 * Handlers for SSH-2 messages that might arrive at any moment.
9382 */
9383 static void ssh2_msg_disconnect(Ssh ssh, struct Packet *pktin)
9384 {
9385 /* log reason code in disconnect message */
9386 char *buf, *msg;
9387 int reason, msglen;
9388
9389 reason = ssh_pkt_getuint32(pktin);
9390 ssh_pkt_getstring(pktin, &msg, &msglen);
9391
9392 if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) {
9393 buf = dupprintf("Received disconnect message (%s)",
9394 ssh2_disconnect_reasons[reason]);
9395 } else {
9396 buf = dupprintf("Received disconnect message (unknown"
9397 " type %d)", reason);
9398 }
9399 logevent(buf);
9400 sfree(buf);
9401 buf = dupprintf("Disconnection message text: %.*s",
9402 msglen, msg);
9403 logevent(buf);
9404 bombout(("Server sent disconnect message\ntype %d (%s):\n\"%.*s\"",
9405 reason,
9406 (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) ?
9407 ssh2_disconnect_reasons[reason] : "unknown",
9408 msglen, msg));
9409 sfree(buf);
9410 }
9411
9412 static void ssh2_msg_debug(Ssh ssh, struct Packet *pktin)
9413 {
9414 /* log the debug message */
9415 char *msg;
9416 int msglen;
9417
9418 /* XXX maybe we should actually take notice of the return value */
9419 ssh2_pkt_getbool(pktin);
9420 ssh_pkt_getstring(pktin, &msg, &msglen);
9421
9422 logeventf(ssh, "Remote debug message: %.*s", msglen, msg);
9423 }
9424
9425 static void ssh2_msg_transport(Ssh ssh, struct Packet *pktin)
9426 {
9427 do_ssh2_transport(ssh, NULL, 0, pktin);
9428 }
9429
9430 /*
9431 * Called if we receive a packet that isn't allowed by the protocol.
9432 * This only applies to packets whose meaning PuTTY understands.
9433 * Entirely unknown packets are handled below.
9434 */
9435 static void ssh2_msg_unexpected(Ssh ssh, struct Packet *pktin)
9436 {
9437 char *buf = dupprintf("Server protocol violation: unexpected %s packet",
9438 ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx,
9439 pktin->type));
9440 ssh_disconnect(ssh, NULL, buf, SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE);
9441 sfree(buf);
9442 }
9443
9444 static void ssh2_msg_something_unimplemented(Ssh ssh, struct Packet *pktin)
9445 {
9446 struct Packet *pktout;
9447 pktout = ssh2_pkt_init(SSH2_MSG_UNIMPLEMENTED);
9448 ssh2_pkt_adduint32(pktout, pktin->sequence);
9449 /*
9450 * UNIMPLEMENTED messages MUST appear in the same order as the
9451 * messages they respond to. Hence, never queue them.
9452 */
9453 ssh2_pkt_send_noqueue(ssh, pktout);
9454 }
9455
9456 /*
9457 * Handle the top-level SSH-2 protocol.
9458 */
9459 static void ssh2_protocol_setup(Ssh ssh)
9460 {
9461 int i;
9462
9463 /*
9464 * Most messages cause SSH2_MSG_UNIMPLEMENTED.
9465 */
9466 for (i = 0; i < 256; i++)
9467 ssh->packet_dispatch[i] = ssh2_msg_something_unimplemented;
9468
9469 /*
9470 * Initially, we only accept transport messages (and a few generic
9471 * ones). do_ssh2_authconn will add more when it starts.
9472 * Messages that are understood but not currently acceptable go to
9473 * ssh2_msg_unexpected.
9474 */
9475 ssh->packet_dispatch[SSH2_MSG_UNIMPLEMENTED] = ssh2_msg_unexpected;
9476 ssh->packet_dispatch[SSH2_MSG_SERVICE_REQUEST] = ssh2_msg_unexpected;
9477 ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = ssh2_msg_unexpected;
9478 ssh->packet_dispatch[SSH2_MSG_KEXINIT] = ssh2_msg_transport;
9479 ssh->packet_dispatch[SSH2_MSG_NEWKEYS] = ssh2_msg_transport;
9480 ssh->packet_dispatch[SSH2_MSG_KEXDH_INIT] = ssh2_msg_transport;
9481 ssh->packet_dispatch[SSH2_MSG_KEXDH_REPLY] = ssh2_msg_transport;
9482 /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REQUEST] = ssh2_msg_transport; duplicate case value */
9483 /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_GROUP] = ssh2_msg_transport; duplicate case value */
9484 ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_INIT] = ssh2_msg_transport;
9485 ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REPLY] = ssh2_msg_transport;
9486 ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = ssh2_msg_unexpected;
9487 ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = ssh2_msg_unexpected;
9488 ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = ssh2_msg_unexpected;
9489 ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_unexpected;
9490 ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = ssh2_msg_unexpected;
9491 /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = ssh2_msg_unexpected; duplicate case value */
9492 /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_REQUEST] = ssh2_msg_unexpected; duplicate case value */
9493 ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = ssh2_msg_unexpected;
9494 ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_unexpected;
9495 ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = ssh2_msg_unexpected;
9496 ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = ssh2_msg_unexpected;
9497 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_unexpected;
9498 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_unexpected;
9499 ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_unexpected;
9500 ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_unexpected;
9501 ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh2_msg_unexpected;
9502 ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = ssh2_msg_unexpected;
9503 ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_unexpected;
9504 ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_unexpected;
9505 ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_unexpected;
9506 ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_unexpected;
9507 ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_unexpected;
9508
9509 /*
9510 * These messages have a special handler from the start.
9511 */
9512 ssh->packet_dispatch[SSH2_MSG_DISCONNECT] = ssh2_msg_disconnect;
9513 ssh->packet_dispatch[SSH2_MSG_IGNORE] = ssh_msg_ignore; /* shared with SSH-1 */
9514 ssh->packet_dispatch[SSH2_MSG_DEBUG] = ssh2_msg_debug;
9515 }
9516
9517 static void ssh2_timer(void *ctx, long now)
9518 {
9519 Ssh ssh = (Ssh)ctx;
9520
9521 if (ssh->state == SSH_STATE_CLOSED)
9522 return;
9523
9524 if (!ssh->kex_in_progress && conf_get_int(ssh->conf, CONF_ssh_rekey_time) != 0 &&
9525 now - ssh->next_rekey >= 0) {
9526 do_ssh2_transport(ssh, "timeout", -1, NULL);
9527 }
9528 }
9529
9530 static void ssh2_protocol(Ssh ssh, void *vin, int inlen,
9531 struct Packet *pktin)
9532 {
9533 unsigned char *in = (unsigned char *)vin;
9534 if (ssh->state == SSH_STATE_CLOSED)
9535 return;
9536
9537 if (pktin) {
9538 ssh->incoming_data_size += pktin->encrypted_len;
9539 if (!ssh->kex_in_progress &&
9540 ssh->max_data_size != 0 &&
9541 ssh->incoming_data_size > ssh->max_data_size)
9542 do_ssh2_transport(ssh, "too much data received", -1, NULL);
9543 }
9544
9545 if (pktin)
9546 ssh->packet_dispatch[pktin->type](ssh, pktin);
9547 else if (!ssh->protocol_initial_phase_done)
9548 do_ssh2_transport(ssh, in, inlen, pktin);
9549 else
9550 do_ssh2_authconn(ssh, in, inlen, pktin);
9551 }
9552
9553 static void ssh_cache_conf_values(Ssh ssh)
9554 {
9555 ssh->logomitdata = conf_get_int(ssh->conf, CONF_logomitdata);
9556 }
9557
9558 /*
9559 * Called to set up the connection.
9560 *
9561 * Returns an error message, or NULL on success.
9562 */
9563 static const char *ssh_init(void *frontend_handle, void **backend_handle,
9564 Conf *conf, char *host, int port, char **realhost,
9565 int nodelay, int keepalive)
9566 {
9567 const char *p;
9568 Ssh ssh;
9569
9570 ssh = snew(struct ssh_tag);
9571 ssh->conf = conf_copy(conf);
9572 ssh_cache_conf_values(ssh);
9573 ssh->version = 0; /* when not ready yet */
9574 ssh->s = NULL;
9575 ssh->cipher = NULL;
9576 ssh->v1_cipher_ctx = NULL;
9577 ssh->crcda_ctx = NULL;
9578 ssh->cscipher = NULL;
9579 ssh->cs_cipher_ctx = NULL;
9580 ssh->sccipher = NULL;
9581 ssh->sc_cipher_ctx = NULL;
9582 ssh->csmac = NULL;
9583 ssh->cs_mac_ctx = NULL;
9584 ssh->scmac = NULL;
9585 ssh->sc_mac_ctx = NULL;
9586 ssh->cscomp = NULL;
9587 ssh->cs_comp_ctx = NULL;
9588 ssh->sccomp = NULL;
9589 ssh->sc_comp_ctx = NULL;
9590 ssh->kex = NULL;
9591 ssh->kex_ctx = NULL;
9592 ssh->hostkey = NULL;
9593 ssh->exitcode = -1;
9594 ssh->close_expected = FALSE;
9595 ssh->clean_exit = FALSE;
9596 ssh->state = SSH_STATE_PREPACKET;
9597 ssh->size_needed = FALSE;
9598 ssh->eof_needed = FALSE;
9599 ssh->ldisc = NULL;
9600 ssh->logctx = NULL;
9601 ssh->deferred_send_data = NULL;
9602 ssh->deferred_len = 0;
9603 ssh->deferred_size = 0;
9604 ssh->fallback_cmd = 0;
9605 ssh->pkt_kctx = SSH2_PKTCTX_NOKEX;
9606 ssh->pkt_actx = SSH2_PKTCTX_NOAUTH;
9607 ssh->x11disp = NULL;
9608 ssh->v1_compressing = FALSE;
9609 ssh->v2_outgoing_sequence = 0;
9610 ssh->ssh1_rdpkt_crstate = 0;
9611 ssh->ssh2_rdpkt_crstate = 0;
9612 ssh->ssh_gotdata_crstate = 0;
9613 ssh->do_ssh1_connection_crstate = 0;
9614 ssh->do_ssh_init_state = NULL;
9615 ssh->do_ssh1_login_state = NULL;
9616 ssh->do_ssh2_transport_state = NULL;
9617 ssh->do_ssh2_authconn_state = NULL;
9618 ssh->v_c = NULL;
9619 ssh->v_s = NULL;
9620 ssh->mainchan = NULL;
9621 ssh->throttled_all = 0;
9622 ssh->v1_stdout_throttling = 0;
9623 ssh->queue = NULL;
9624 ssh->queuelen = ssh->queuesize = 0;
9625 ssh->queueing = FALSE;
9626 ssh->qhead = ssh->qtail = NULL;
9627 ssh->deferred_rekey_reason = NULL;
9628 bufchain_init(&ssh->queued_incoming_data);
9629 ssh->frozen = FALSE;
9630 ssh->username = NULL;
9631 ssh->sent_console_eof = FALSE;
9632 ssh->got_pty = FALSE;
9633
9634 *backend_handle = ssh;
9635
9636 #ifdef MSCRYPTOAPI
9637 if (crypto_startup() == 0)
9638 return "Microsoft high encryption pack not installed!";
9639 #endif
9640
9641 ssh->frontend = frontend_handle;
9642 ssh->term_width = conf_get_int(ssh->conf, CONF_width);
9643 ssh->term_height = conf_get_int(ssh->conf, CONF_height);
9644
9645 ssh->channels = NULL;
9646 ssh->rportfwds = NULL;
9647 ssh->portfwds = NULL;
9648
9649 ssh->send_ok = 0;
9650 ssh->editing = 0;
9651 ssh->echoing = 0;
9652 ssh->conn_throttle_count = 0;
9653 ssh->overall_bufsize = 0;
9654 ssh->fallback_cmd = 0;
9655
9656 ssh->protocol = NULL;
9657
9658 ssh->protocol_initial_phase_done = FALSE;
9659
9660 ssh->pinger = NULL;
9661
9662 ssh->incoming_data_size = ssh->outgoing_data_size =
9663 ssh->deferred_data_size = 0L;
9664 ssh->max_data_size = parse_blocksize(conf_get_str(ssh->conf,
9665 CONF_ssh_rekey_data));
9666 ssh->kex_in_progress = FALSE;
9667
9668 #ifndef NO_GSSAPI
9669 ssh->gsslibs = NULL;
9670 #endif
9671
9672 p = connect_to_host(ssh, host, port, realhost, nodelay, keepalive);
9673 if (p != NULL)
9674 return p;
9675
9676 random_ref();
9677
9678 return NULL;
9679 }
9680
9681 static void ssh_free(void *handle)
9682 {
9683 Ssh ssh = (Ssh) handle;
9684 struct ssh_channel *c;
9685 struct ssh_rportfwd *pf;
9686
9687 if (ssh->v1_cipher_ctx)
9688 ssh->cipher->free_context(ssh->v1_cipher_ctx);
9689 if (ssh->cs_cipher_ctx)
9690 ssh->cscipher->free_context(ssh->cs_cipher_ctx);
9691 if (ssh->sc_cipher_ctx)
9692 ssh->sccipher->free_context(ssh->sc_cipher_ctx);
9693 if (ssh->cs_mac_ctx)
9694 ssh->csmac->free_context(ssh->cs_mac_ctx);
9695 if (ssh->sc_mac_ctx)
9696 ssh->scmac->free_context(ssh->sc_mac_ctx);
9697 if (ssh->cs_comp_ctx) {
9698 if (ssh->cscomp)
9699 ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx);
9700 else
9701 zlib_compress_cleanup(ssh->cs_comp_ctx);
9702 }
9703 if (ssh->sc_comp_ctx) {
9704 if (ssh->sccomp)
9705 ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx);
9706 else
9707 zlib_decompress_cleanup(ssh->sc_comp_ctx);
9708 }
9709 if (ssh->kex_ctx)
9710 dh_cleanup(ssh->kex_ctx);
9711 sfree(ssh->savedhost);
9712
9713 while (ssh->queuelen-- > 0)
9714 ssh_free_packet(ssh->queue[ssh->queuelen]);
9715 sfree(ssh->queue);
9716
9717 while (ssh->qhead) {
9718 struct queued_handler *qh = ssh->qhead;
9719 ssh->qhead = qh->next;
9720 sfree(ssh->qhead);
9721 }
9722 ssh->qhead = ssh->qtail = NULL;
9723
9724 if (ssh->channels) {
9725 while ((c = delpos234(ssh->channels, 0)) != NULL) {
9726 switch (c->type) {
9727 case CHAN_X11:
9728 if (c->u.x11.s != NULL)
9729 x11_close(c->u.x11.s);
9730 break;
9731 case CHAN_SOCKDATA:
9732 case CHAN_SOCKDATA_DORMANT:
9733 if (c->u.pfd.s != NULL)
9734 pfd_close(c->u.pfd.s);
9735 break;
9736 }
9737 if (ssh->version == 2) {
9738 struct outstanding_channel_request *ocr, *nocr;
9739 ocr = c->v.v2.chanreq_head;
9740 while (ocr) {
9741 ocr->handler(c, NULL, ocr->ctx);
9742 nocr = ocr->next;
9743 sfree(ocr);
9744 ocr = nocr;
9745 }
9746 bufchain_clear(&c->v.v2.outbuffer);
9747 }
9748 sfree(c);
9749 }
9750 freetree234(ssh->channels);
9751 ssh->channels = NULL;
9752 }
9753
9754 if (ssh->rportfwds) {
9755 while ((pf = delpos234(ssh->rportfwds, 0)) != NULL)
9756 free_rportfwd(pf);
9757 freetree234(ssh->rportfwds);
9758 ssh->rportfwds = NULL;
9759 }
9760 sfree(ssh->deferred_send_data);
9761 if (ssh->x11disp)
9762 x11_free_display(ssh->x11disp);
9763 sfree(ssh->do_ssh_init_state);
9764 sfree(ssh->do_ssh1_login_state);
9765 sfree(ssh->do_ssh2_transport_state);
9766 sfree(ssh->do_ssh2_authconn_state);
9767 sfree(ssh->v_c);
9768 sfree(ssh->v_s);
9769 sfree(ssh->fullhostname);
9770 if (ssh->crcda_ctx) {
9771 crcda_free_context(ssh->crcda_ctx);
9772 ssh->crcda_ctx = NULL;
9773 }
9774 if (ssh->s)
9775 ssh_do_close(ssh, TRUE);
9776 expire_timer_context(ssh);
9777 if (ssh->pinger)
9778 pinger_free(ssh->pinger);
9779 bufchain_clear(&ssh->queued_incoming_data);
9780 sfree(ssh->username);
9781 conf_free(ssh->conf);
9782 #ifndef NO_GSSAPI
9783 if (ssh->gsslibs)
9784 ssh_gss_cleanup(ssh->gsslibs);
9785 #endif
9786 sfree(ssh);
9787
9788 random_unref();
9789 }
9790
9791 /*
9792 * Reconfigure the SSH backend.
9793 */
9794 static void ssh_reconfig(void *handle, Conf *conf)
9795 {
9796 Ssh ssh = (Ssh) handle;
9797 char *rekeying = NULL, rekey_mandatory = FALSE;
9798 unsigned long old_max_data_size;
9799 int i, rekey_time;
9800
9801 pinger_reconfig(ssh->pinger, ssh->conf, conf);
9802 if (ssh->portfwds)
9803 ssh_setup_portfwd(ssh, conf);
9804
9805 rekey_time = conf_get_int(conf, CONF_ssh_rekey_time);
9806 if (conf_get_int(ssh->conf, CONF_ssh_rekey_time) != rekey_time &&
9807 rekey_time != 0) {
9808 long new_next = ssh->last_rekey + rekey_time*60*TICKSPERSEC;
9809 long now = GETTICKCOUNT();
9810
9811 if (new_next - now < 0) {
9812 rekeying = "timeout shortened";
9813 } else {
9814 ssh->next_rekey = schedule_timer(new_next - now, ssh2_timer, ssh);
9815 }
9816 }
9817
9818 old_max_data_size = ssh->max_data_size;
9819 ssh->max_data_size = parse_blocksize(conf_get_str(ssh->conf,
9820 CONF_ssh_rekey_data));
9821 if (old_max_data_size != ssh->max_data_size &&
9822 ssh->max_data_size != 0) {
9823 if (ssh->outgoing_data_size > ssh->max_data_size ||
9824 ssh->incoming_data_size > ssh->max_data_size)
9825 rekeying = "data limit lowered";
9826 }
9827
9828 if (conf_get_int(ssh->conf, CONF_compression) !=
9829 conf_get_int(conf, CONF_compression)) {
9830 rekeying = "compression setting changed";
9831 rekey_mandatory = TRUE;
9832 }
9833
9834 for (i = 0; i < CIPHER_MAX; i++)
9835 if (conf_get_int_int(ssh->conf, CONF_ssh_cipherlist, i) !=
9836 conf_get_int_int(conf, CONF_ssh_cipherlist, i)) {
9837 rekeying = "cipher settings changed";
9838 rekey_mandatory = TRUE;
9839 }
9840 if (conf_get_int(ssh->conf, CONF_ssh2_des_cbc) !=
9841 conf_get_int(conf, CONF_ssh2_des_cbc)) {
9842 rekeying = "cipher settings changed";
9843 rekey_mandatory = TRUE;
9844 }
9845
9846 conf_free(ssh->conf);
9847 ssh->conf = conf_copy(conf);
9848 ssh_cache_conf_values(ssh);
9849
9850 if (rekeying) {
9851 if (!ssh->kex_in_progress) {
9852 do_ssh2_transport(ssh, rekeying, -1, NULL);
9853 } else if (rekey_mandatory) {
9854 ssh->deferred_rekey_reason = rekeying;
9855 }
9856 }
9857 }
9858
9859 /*
9860 * Called to send data down the SSH connection.
9861 */
9862 static int ssh_send(void *handle, char *buf, int len)
9863 {
9864 Ssh ssh = (Ssh) handle;
9865
9866 if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL)
9867 return 0;
9868
9869 ssh->protocol(ssh, (unsigned char *)buf, len, 0);
9870
9871 return ssh_sendbuffer(ssh);
9872 }
9873
9874 /*
9875 * Called to query the current amount of buffered stdin data.
9876 */
9877 static int ssh_sendbuffer(void *handle)
9878 {
9879 Ssh ssh = (Ssh) handle;
9880 int override_value;
9881
9882 if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL)
9883 return 0;
9884
9885 /*
9886 * If the SSH socket itself has backed up, add the total backup
9887 * size on that to any individual buffer on the stdin channel.
9888 */
9889 override_value = 0;
9890 if (ssh->throttled_all)
9891 override_value = ssh->overall_bufsize;
9892
9893 if (ssh->version == 1) {
9894 return override_value;
9895 } else if (ssh->version == 2) {
9896 if (!ssh->mainchan)
9897 return override_value;
9898 else
9899 return (override_value +
9900 bufchain_size(&ssh->mainchan->v.v2.outbuffer));
9901 }
9902
9903 return 0;
9904 }
9905
9906 /*
9907 * Called to set the size of the window from SSH's POV.
9908 */
9909 static void ssh_size(void *handle, int width, int height)
9910 {
9911 Ssh ssh = (Ssh) handle;
9912 struct Packet *pktout;
9913
9914 ssh->term_width = width;
9915 ssh->term_height = height;
9916
9917 switch (ssh->state) {
9918 case SSH_STATE_BEFORE_SIZE:
9919 case SSH_STATE_PREPACKET:
9920 case SSH_STATE_CLOSED:
9921 break; /* do nothing */
9922 case SSH_STATE_INTERMED:
9923 ssh->size_needed = TRUE; /* buffer for later */
9924 break;
9925 case SSH_STATE_SESSION:
9926 if (!conf_get_int(ssh->conf, CONF_nopty)) {
9927 if (ssh->version == 1) {
9928 send_packet(ssh, SSH1_CMSG_WINDOW_SIZE,
9929 PKT_INT, ssh->term_height,
9930 PKT_INT, ssh->term_width,
9931 PKT_INT, 0, PKT_INT, 0, PKT_END);
9932 } else if (ssh->mainchan) {
9933 pktout = ssh2_chanreq_init(ssh->mainchan, "window-change",
9934 NULL, NULL);
9935 ssh2_pkt_adduint32(pktout, ssh->term_width);
9936 ssh2_pkt_adduint32(pktout, ssh->term_height);
9937 ssh2_pkt_adduint32(pktout, 0);
9938 ssh2_pkt_adduint32(pktout, 0);
9939 ssh2_pkt_send(ssh, pktout);
9940 }
9941 }
9942 break;
9943 }
9944 }
9945
9946 /*
9947 * Return a list of the special codes that make sense in this
9948 * protocol.
9949 */
9950 static const struct telnet_special *ssh_get_specials(void *handle)
9951 {
9952 static const struct telnet_special ssh1_ignore_special[] = {
9953 {"IGNORE message", TS_NOP}
9954 };
9955 static const struct telnet_special ssh2_ignore_special[] = {
9956 {"IGNORE message", TS_NOP},
9957 };
9958 static const struct telnet_special ssh2_rekey_special[] = {
9959 {"Repeat key exchange", TS_REKEY},
9960 };
9961 static const struct telnet_special ssh2_session_specials[] = {
9962 {NULL, TS_SEP},
9963 {"Break", TS_BRK},
9964 /* These are the signal names defined by RFC 4254.
9965 * They include all the ISO C signals, but are a subset of the POSIX
9966 * required signals. */
9967 {"SIGINT (Interrupt)", TS_SIGINT},
9968 {"SIGTERM (Terminate)", TS_SIGTERM},
9969 {"SIGKILL (Kill)", TS_SIGKILL},
9970 {"SIGQUIT (Quit)", TS_SIGQUIT},
9971 {"SIGHUP (Hangup)", TS_SIGHUP},
9972 {"More signals", TS_SUBMENU},
9973 {"SIGABRT", TS_SIGABRT}, {"SIGALRM", TS_SIGALRM},
9974 {"SIGFPE", TS_SIGFPE}, {"SIGILL", TS_SIGILL},
9975 {"SIGPIPE", TS_SIGPIPE}, {"SIGSEGV", TS_SIGSEGV},
9976 {"SIGUSR1", TS_SIGUSR1}, {"SIGUSR2", TS_SIGUSR2},
9977 {NULL, TS_EXITMENU}
9978 };
9979 static const struct telnet_special specials_end[] = {
9980 {NULL, TS_EXITMENU}
9981 };
9982 /* XXX review this length for any changes: */
9983 static struct telnet_special ssh_specials[lenof(ssh2_ignore_special) +
9984 lenof(ssh2_rekey_special) +
9985 lenof(ssh2_session_specials) +
9986 lenof(specials_end)];
9987 Ssh ssh = (Ssh) handle;
9988 int i = 0;
9989 #define ADD_SPECIALS(name) \
9990 do { \
9991 assert((i + lenof(name)) <= lenof(ssh_specials)); \
9992 memcpy(&ssh_specials[i], name, sizeof name); \
9993 i += lenof(name); \
9994 } while(0)
9995
9996 if (ssh->version == 1) {
9997 /* Don't bother offering IGNORE if we've decided the remote
9998 * won't cope with it, since we wouldn't bother sending it if
9999 * asked anyway. */
10000 if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE))
10001 ADD_SPECIALS(ssh1_ignore_special);
10002 } else if (ssh->version == 2) {
10003 if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE))
10004 ADD_SPECIALS(ssh2_ignore_special);
10005 if (!(ssh->remote_bugs & BUG_SSH2_REKEY))
10006 ADD_SPECIALS(ssh2_rekey_special);
10007 if (ssh->mainchan)
10008 ADD_SPECIALS(ssh2_session_specials);
10009 } /* else we're not ready yet */
10010
10011 if (i) {
10012 ADD_SPECIALS(specials_end);
10013 return ssh_specials;
10014 } else {
10015 return NULL;
10016 }
10017 #undef ADD_SPECIALS
10018 }
10019
10020 /*
10021 * Send special codes. TS_EOF is useful for `plink', so you
10022 * can send an EOF and collect resulting output (e.g. `plink
10023 * hostname sort').
10024 */
10025 static void ssh_special(void *handle, Telnet_Special code)
10026 {
10027 Ssh ssh = (Ssh) handle;
10028 struct Packet *pktout;
10029
10030 if (code == TS_EOF) {
10031 if (ssh->state != SSH_STATE_SESSION) {
10032 /*
10033 * Buffer the EOF in case we are pre-SESSION, so we can
10034 * send it as soon as we reach SESSION.
10035 */
10036 if (code == TS_EOF)
10037 ssh->eof_needed = TRUE;
10038 return;
10039 }
10040 if (ssh->version == 1) {
10041 send_packet(ssh, SSH1_CMSG_EOF, PKT_END);
10042 } else if (ssh->mainchan) {
10043 sshfwd_write_eof(ssh->mainchan);
10044 ssh->send_ok = 0; /* now stop trying to read from stdin */
10045 }
10046 logevent("Sent EOF message");
10047 } else if (code == TS_PING || code == TS_NOP) {
10048 if (ssh->state == SSH_STATE_CLOSED
10049 || ssh->state == SSH_STATE_PREPACKET) return;
10050 if (ssh->version == 1) {
10051 if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE))
10052 send_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, "", PKT_END);
10053 } else {
10054 if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE)) {
10055 pktout = ssh2_pkt_init(SSH2_MSG_IGNORE);
10056 ssh2_pkt_addstring_start(pktout);
10057 ssh2_pkt_send_noqueue(ssh, pktout);
10058 }
10059 }
10060 } else if (code == TS_REKEY) {
10061 if (!ssh->kex_in_progress && ssh->version == 2) {
10062 do_ssh2_transport(ssh, "at user request", -1, NULL);
10063 }
10064 } else if (code == TS_BRK) {
10065 if (ssh->state == SSH_STATE_CLOSED
10066 || ssh->state == SSH_STATE_PREPACKET) return;
10067 if (ssh->version == 1) {
10068 logevent("Unable to send BREAK signal in SSH-1");
10069 } else if (ssh->mainchan) {
10070 pktout = ssh2_chanreq_init(ssh->mainchan, "break", NULL, NULL);
10071 ssh2_pkt_adduint32(pktout, 0); /* default break length */
10072 ssh2_pkt_send(ssh, pktout);
10073 }
10074 } else {
10075 /* Is is a POSIX signal? */
10076 char *signame = NULL;
10077 if (code == TS_SIGABRT) signame = "ABRT";
10078 if (code == TS_SIGALRM) signame = "ALRM";
10079 if (code == TS_SIGFPE) signame = "FPE";
10080 if (code == TS_SIGHUP) signame = "HUP";
10081 if (code == TS_SIGILL) signame = "ILL";
10082 if (code == TS_SIGINT) signame = "INT";
10083 if (code == TS_SIGKILL) signame = "KILL";
10084 if (code == TS_SIGPIPE) signame = "PIPE";
10085 if (code == TS_SIGQUIT) signame = "QUIT";
10086 if (code == TS_SIGSEGV) signame = "SEGV";
10087 if (code == TS_SIGTERM) signame = "TERM";
10088 if (code == TS_SIGUSR1) signame = "USR1";
10089 if (code == TS_SIGUSR2) signame = "USR2";
10090 /* The SSH-2 protocol does in principle support arbitrary named
10091 * signals, including signame@domain, but we don't support those. */
10092 if (signame) {
10093 /* It's a signal. */
10094 if (ssh->version == 2 && ssh->mainchan) {
10095 pktout = ssh2_chanreq_init(ssh->mainchan, "signal", NULL, NULL);
10096 ssh2_pkt_addstring(pktout, signame);
10097 ssh2_pkt_send(ssh, pktout);
10098 logeventf(ssh, "Sent signal SIG%s", signame);
10099 }
10100 } else {
10101 /* Never heard of it. Do nothing */
10102 }
10103 }
10104 }
10105
10106 void *new_sock_channel(void *handle, Socket s)
10107 {
10108 Ssh ssh = (Ssh) handle;
10109 struct ssh_channel *c;
10110 c = snew(struct ssh_channel);
10111
10112 c->ssh = ssh;
10113 ssh2_channel_init(c);
10114 c->halfopen = TRUE;
10115 c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */
10116 c->u.pfd.s = s;
10117 add234(ssh->channels, c);
10118 return c;
10119 }
10120
10121 /*
10122 * This is called when stdout/stderr (the entity to which
10123 * from_backend sends data) manages to clear some backlog.
10124 */
10125 static void ssh_unthrottle(void *handle, int bufsize)
10126 {
10127 Ssh ssh = (Ssh) handle;
10128 int buflimit;
10129
10130 if (ssh->version == 1) {
10131 if (ssh->v1_stdout_throttling && bufsize < SSH1_BUFFER_LIMIT) {
10132 ssh->v1_stdout_throttling = 0;
10133 ssh_throttle_conn(ssh, -1);
10134 }
10135 } else {
10136 if (ssh->mainchan) {
10137 ssh2_set_window(ssh->mainchan,
10138 bufsize < ssh->mainchan->v.v2.locmaxwin ?
10139 ssh->mainchan->v.v2.locmaxwin - bufsize : 0);
10140 if (conf_get_int(ssh->conf, CONF_ssh_simple))
10141 buflimit = 0;
10142 else
10143 buflimit = ssh->mainchan->v.v2.locmaxwin;
10144 if (ssh->mainchan->throttling_conn && bufsize <= buflimit) {
10145 ssh->mainchan->throttling_conn = 0;
10146 ssh_throttle_conn(ssh, -1);
10147 }
10148 }
10149 }
10150
10151 /*
10152 * Now process any SSH connection data that was stashed in our
10153 * queue while we were frozen.
10154 */
10155 ssh_process_queued_incoming_data(ssh);
10156 }
10157
10158 void ssh_send_port_open(void *channel, char *hostname, int port, char *org)
10159 {
10160 struct ssh_channel *c = (struct ssh_channel *)channel;
10161 Ssh ssh = c->ssh;
10162 struct Packet *pktout;
10163
10164 logeventf(ssh, "Opening forwarded connection to %s:%d", hostname, port);
10165
10166 if (ssh->version == 1) {
10167 send_packet(ssh, SSH1_MSG_PORT_OPEN,
10168 PKT_INT, c->localid,
10169 PKT_STR, hostname,
10170 PKT_INT, port,
10171 /* PKT_STR, <org:orgport>, */
10172 PKT_END);
10173 } else {
10174 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
10175 ssh2_pkt_addstring(pktout, "direct-tcpip");
10176 ssh2_pkt_adduint32(pktout, c->localid);
10177 ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);/* our window size */
10178 ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT); /* our max pkt size */
10179 ssh2_pkt_addstring(pktout, hostname);
10180 ssh2_pkt_adduint32(pktout, port);
10181 /*
10182 * We make up values for the originator data; partly it's
10183 * too much hassle to keep track, and partly I'm not
10184 * convinced the server should be told details like that
10185 * about my local network configuration.
10186 * The "originator IP address" is syntactically a numeric
10187 * IP address, and some servers (e.g., Tectia) get upset
10188 * if it doesn't match this syntax.
10189 */
10190 ssh2_pkt_addstring(pktout, "0.0.0.0");
10191 ssh2_pkt_adduint32(pktout, 0);
10192 ssh2_pkt_send(ssh, pktout);
10193 }
10194 }
10195
10196 static int ssh_connected(void *handle)
10197 {
10198 Ssh ssh = (Ssh) handle;
10199 return ssh->s != NULL;
10200 }
10201
10202 static int ssh_sendok(void *handle)
10203 {
10204 Ssh ssh = (Ssh) handle;
10205 return ssh->send_ok;
10206 }
10207
10208 static int ssh_ldisc(void *handle, int option)
10209 {
10210 Ssh ssh = (Ssh) handle;
10211 if (option == LD_ECHO)
10212 return ssh->echoing;
10213 if (option == LD_EDIT)
10214 return ssh->editing;
10215 return FALSE;
10216 }
10217
10218 static void ssh_provide_ldisc(void *handle, void *ldisc)
10219 {
10220 Ssh ssh = (Ssh) handle;
10221 ssh->ldisc = ldisc;
10222 }
10223
10224 static void ssh_provide_logctx(void *handle, void *logctx)
10225 {
10226 Ssh ssh = (Ssh) handle;
10227 ssh->logctx = logctx;
10228 }
10229
10230 static int ssh_return_exitcode(void *handle)
10231 {
10232 Ssh ssh = (Ssh) handle;
10233 if (ssh->s != NULL)
10234 return -1;
10235 else
10236 return (ssh->exitcode >= 0 ? ssh->exitcode : INT_MAX);
10237 }
10238
10239 /*
10240 * cfg_info for SSH is the currently running version of the
10241 * protocol. (1 for 1; 2 for 2; 0 for not-decided-yet.)
10242 */
10243 static int ssh_cfg_info(void *handle)
10244 {
10245 Ssh ssh = (Ssh) handle;
10246 return ssh->version;
10247 }
10248
10249 /*
10250 * Gross hack: pscp will try to start SFTP but fall back to scp1 if
10251 * that fails. This variable is the means by which scp.c can reach
10252 * into the SSH code and find out which one it got.
10253 */
10254 extern int ssh_fallback_cmd(void *handle)
10255 {
10256 Ssh ssh = (Ssh) handle;
10257 return ssh->fallback_cmd;
10258 }
10259
10260 Backend ssh_backend = {
10261 ssh_init,
10262 ssh_free,
10263 ssh_reconfig,
10264 ssh_send,
10265 ssh_sendbuffer,
10266 ssh_size,
10267 ssh_special,
10268 ssh_get_specials,
10269 ssh_connected,
10270 ssh_return_exitcode,
10271 ssh_sendok,
10272 ssh_ldisc,
10273 ssh_provide_ldisc,
10274 ssh_provide_logctx,
10275 ssh_unthrottle,
10276 ssh_cfg_info,
10277 "ssh",
10278 PROT_SSH,
10279 22
10280 };