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