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