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