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