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