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