]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - ssh.c
Fix handle leak in winhandl.c.
[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         s->K = dh_find_K(ssh->kex_ctx, s->f);
6649
6650         /* We assume everything from now on will be quick, and it might
6651          * involve user interaction. */
6652         set_busy_status(ssh->frontend, BUSY_NOT);
6653
6654         hash_string(ssh->kex->hash, ssh->exhash, s->hostkeydata, s->hostkeylen);
6655         if (!ssh->kex->pdata) {
6656             hash_uint32(ssh->kex->hash, ssh->exhash, s->pbits);
6657             hash_mpint(ssh->kex->hash, ssh->exhash, s->p);
6658             hash_mpint(ssh->kex->hash, ssh->exhash, s->g);
6659         }
6660         hash_mpint(ssh->kex->hash, ssh->exhash, s->e);
6661         hash_mpint(ssh->kex->hash, ssh->exhash, s->f);
6662
6663         dh_cleanup(ssh->kex_ctx);
6664         freebn(s->f);
6665         if (!ssh->kex->pdata) {
6666             freebn(s->g);
6667             freebn(s->p);
6668         }
6669     } else {
6670         logeventf(ssh, "Doing RSA key exchange with hash %s",
6671                   ssh->kex->hash->text_name);
6672         ssh->pkt_kctx = SSH2_PKTCTX_RSAKEX;
6673         /*
6674          * RSA key exchange. First expect a KEXRSA_PUBKEY packet
6675          * from the server.
6676          */
6677         crWaitUntilV(pktin);
6678         if (pktin->type != SSH2_MSG_KEXRSA_PUBKEY) {
6679             bombout(("expected RSA public key packet from server"));
6680             crStopV;
6681         }
6682
6683         ssh_pkt_getstring(pktin, &s->hostkeydata, &s->hostkeylen);
6684         hash_string(ssh->kex->hash, ssh->exhash,
6685                     s->hostkeydata, s->hostkeylen);
6686         s->hkey = ssh->hostkey->newkey(s->hostkeydata, s->hostkeylen);
6687
6688         {
6689             char *keydata;
6690             ssh_pkt_getstring(pktin, &keydata, &s->rsakeylen);
6691             s->rsakeydata = snewn(s->rsakeylen, char);
6692             memcpy(s->rsakeydata, keydata, s->rsakeylen);
6693         }
6694
6695         s->rsakey = ssh_rsakex_newkey(s->rsakeydata, s->rsakeylen);
6696         if (!s->rsakey) {
6697             sfree(s->rsakeydata);
6698             bombout(("unable to parse RSA public key from server"));
6699             crStopV;
6700         }
6701
6702         hash_string(ssh->kex->hash, ssh->exhash, s->rsakeydata, s->rsakeylen);
6703
6704         /*
6705          * Next, set up a shared secret K, of precisely KLEN -
6706          * 2*HLEN - 49 bits, where KLEN is the bit length of the
6707          * RSA key modulus and HLEN is the bit length of the hash
6708          * we're using.
6709          */
6710         {
6711             int klen = ssh_rsakex_klen(s->rsakey);
6712             int nbits = klen - (2*ssh->kex->hash->hlen*8 + 49);
6713             int i, byte = 0;
6714             unsigned char *kstr1, *kstr2, *outstr;
6715             int kstr1len, kstr2len, outstrlen;
6716
6717             s->K = bn_power_2(nbits - 1);
6718
6719             for (i = 0; i < nbits; i++) {
6720                 if ((i & 7) == 0) {
6721                     byte = random_byte();
6722                 }
6723                 bignum_set_bit(s->K, i, (byte >> (i & 7)) & 1);
6724             }
6725
6726             /*
6727              * Encode this as an mpint.
6728              */
6729             kstr1 = ssh2_mpint_fmt(s->K, &kstr1len);
6730             kstr2 = snewn(kstr2len = 4 + kstr1len, unsigned char);
6731             PUT_32BIT(kstr2, kstr1len);
6732             memcpy(kstr2 + 4, kstr1, kstr1len);
6733
6734             /*
6735              * Encrypt it with the given RSA key.
6736              */
6737             outstrlen = (klen + 7) / 8;
6738             outstr = snewn(outstrlen, unsigned char);
6739             ssh_rsakex_encrypt(ssh->kex->hash, kstr2, kstr2len,
6740                                outstr, outstrlen, s->rsakey);
6741
6742             /*
6743              * And send it off in a return packet.
6744              */
6745             s->pktout = ssh2_pkt_init(SSH2_MSG_KEXRSA_SECRET);
6746             ssh2_pkt_addstring_start(s->pktout);
6747             ssh2_pkt_addstring_data(s->pktout, (char *)outstr, outstrlen);
6748             ssh2_pkt_send_noqueue(ssh, s->pktout);
6749
6750             hash_string(ssh->kex->hash, ssh->exhash, outstr, outstrlen);
6751
6752             sfree(kstr2);
6753             sfree(kstr1);
6754             sfree(outstr);
6755         }
6756
6757         ssh_rsakex_freekey(s->rsakey);
6758
6759         crWaitUntilV(pktin);
6760         if (pktin->type != SSH2_MSG_KEXRSA_DONE) {
6761             sfree(s->rsakeydata);
6762             bombout(("expected signature packet from server"));
6763             crStopV;
6764         }
6765
6766         ssh_pkt_getstring(pktin, &s->sigdata, &s->siglen);
6767
6768         sfree(s->rsakeydata);
6769     }
6770
6771     hash_mpint(ssh->kex->hash, ssh->exhash, s->K);
6772     assert(ssh->kex->hash->hlen <= sizeof(s->exchange_hash));
6773     ssh->kex->hash->final(ssh->exhash, s->exchange_hash);
6774
6775     ssh->kex_ctx = NULL;
6776
6777 #if 0
6778     debug(("Exchange hash is:\n"));
6779     dmemdump(s->exchange_hash, ssh->kex->hash->hlen);
6780 #endif
6781
6782     if (!s->hkey ||
6783         !ssh->hostkey->verifysig(s->hkey, s->sigdata, s->siglen,
6784                                  (char *)s->exchange_hash,
6785                                  ssh->kex->hash->hlen)) {
6786         bombout(("Server's host key did not match the signature supplied"));
6787         crStopV;
6788     }
6789
6790     s->keystr = ssh->hostkey->fmtkey(s->hkey);
6791     if (!s->got_session_id) {
6792         /*
6793          * Authenticate remote host: verify host key. (We've already
6794          * checked the signature of the exchange hash.)
6795          */
6796         s->fingerprint = ssh->hostkey->fingerprint(s->hkey);
6797         logevent("Host key fingerprint is:");
6798         logevent(s->fingerprint);
6799         /* First check against manually configured host keys. */
6800         s->dlgret = verify_ssh_manual_host_key(ssh, s->fingerprint,
6801                                                ssh->hostkey, s->hkey);
6802         if (s->dlgret == 0) {          /* did not match */
6803             bombout(("Host key did not appear in manually configured list"));
6804             crStopV;
6805         } else if (s->dlgret < 0) { /* none configured; use standard handling */
6806             ssh_set_frozen(ssh, 1);
6807             s->dlgret = verify_ssh_host_key(ssh->frontend,
6808                                             ssh->savedhost, ssh->savedport,
6809                                             ssh->hostkey->keytype, s->keystr,
6810                                             s->fingerprint,
6811                                             ssh_dialog_callback, ssh);
6812             if (s->dlgret < 0) {
6813                 do {
6814                     crReturnV;
6815                     if (pktin) {
6816                         bombout(("Unexpected data from server while waiting"
6817                                  " for user host key response"));
6818                         crStopV;
6819                     }
6820                 } while (pktin || inlen > 0);
6821                 s->dlgret = ssh->user_response;
6822             }
6823             ssh_set_frozen(ssh, 0);
6824             if (s->dlgret == 0) {
6825                 ssh_disconnect(ssh, "Aborted at host key verification", NULL,
6826                                0, TRUE);
6827                 crStopV;
6828             }
6829         }
6830         sfree(s->fingerprint);
6831         /*
6832          * Save this host key, to check against the one presented in
6833          * subsequent rekeys.
6834          */
6835         ssh->hostkey_str = s->keystr;
6836     } else {
6837         /*
6838          * In a rekey, we never present an interactive host key
6839          * verification request to the user. Instead, we simply
6840          * enforce that the key we're seeing this time is identical to
6841          * the one we saw before.
6842          */
6843         if (strcmp(ssh->hostkey_str, s->keystr)) {
6844             bombout(("Host key was different in repeat key exchange"));
6845             crStopV;
6846         }
6847         sfree(s->keystr);
6848     }
6849     ssh->hostkey->freekey(s->hkey);
6850
6851     /*
6852      * The exchange hash from the very first key exchange is also
6853      * the session id, used in session key construction and
6854      * authentication.
6855      */
6856     if (!s->got_session_id) {
6857         assert(sizeof(s->exchange_hash) <= sizeof(ssh->v2_session_id));
6858         memcpy(ssh->v2_session_id, s->exchange_hash,
6859                sizeof(s->exchange_hash));
6860         ssh->v2_session_id_len = ssh->kex->hash->hlen;
6861         assert(ssh->v2_session_id_len <= sizeof(ssh->v2_session_id));
6862         s->got_session_id = TRUE;
6863     }
6864
6865     /*
6866      * Send SSH2_MSG_NEWKEYS.
6867      */
6868     s->pktout = ssh2_pkt_init(SSH2_MSG_NEWKEYS);
6869     ssh2_pkt_send_noqueue(ssh, s->pktout);
6870     ssh->outgoing_data_size = 0;       /* start counting from here */
6871
6872     /*
6873      * We've sent client NEWKEYS, so create and initialise
6874      * client-to-server session keys.
6875      */
6876     if (ssh->cs_cipher_ctx)
6877         ssh->cscipher->free_context(ssh->cs_cipher_ctx);
6878     ssh->cscipher = s->cscipher_tobe;
6879     ssh->cs_cipher_ctx = ssh->cscipher->make_context();
6880
6881     if (ssh->cs_mac_ctx)
6882         ssh->csmac->free_context(ssh->cs_mac_ctx);
6883     ssh->csmac = s->csmac_tobe;
6884     ssh->cs_mac_ctx = ssh->csmac->make_context();
6885
6886     if (ssh->cs_comp_ctx)
6887         ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx);
6888     ssh->cscomp = s->cscomp_tobe;
6889     ssh->cs_comp_ctx = ssh->cscomp->compress_init();
6890
6891     /*
6892      * Set IVs on client-to-server keys. Here we use the exchange
6893      * hash from the _first_ key exchange.
6894      */
6895     {
6896         unsigned char keyspace[SSH2_KEX_MAX_HASH_LEN * SSH2_MKKEY_ITERS];
6897         assert(sizeof(keyspace) >= ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6898         ssh2_mkkey(ssh,s->K,s->exchange_hash,'C',keyspace);
6899         assert((ssh->cscipher->keylen+7) / 8 <=
6900                ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6901         ssh->cscipher->setkey(ssh->cs_cipher_ctx, keyspace);
6902         ssh2_mkkey(ssh,s->K,s->exchange_hash,'A',keyspace);
6903         assert(ssh->cscipher->blksize <=
6904                ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6905         ssh->cscipher->setiv(ssh->cs_cipher_ctx, keyspace);
6906         ssh2_mkkey(ssh,s->K,s->exchange_hash,'E',keyspace);
6907         assert(ssh->csmac->len <=
6908                ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6909         ssh->csmac->setkey(ssh->cs_mac_ctx, keyspace);
6910         smemclr(keyspace, sizeof(keyspace));
6911     }
6912
6913     logeventf(ssh, "Initialised %.200s client->server encryption",
6914               ssh->cscipher->text_name);
6915     logeventf(ssh, "Initialised %.200s client->server MAC algorithm",
6916               ssh->csmac->text_name);
6917     if (ssh->cscomp->text_name)
6918         logeventf(ssh, "Initialised %s compression",
6919                   ssh->cscomp->text_name);
6920
6921     /*
6922      * Now our end of the key exchange is complete, we can send all
6923      * our queued higher-layer packets.
6924      */
6925     ssh->queueing = FALSE;
6926     ssh2_pkt_queuesend(ssh);
6927
6928     /*
6929      * Expect SSH2_MSG_NEWKEYS from server.
6930      */
6931     crWaitUntilV(pktin);
6932     if (pktin->type != SSH2_MSG_NEWKEYS) {
6933         bombout(("expected new-keys packet from server"));
6934         crStopV;
6935     }
6936     ssh->incoming_data_size = 0;       /* start counting from here */
6937
6938     /*
6939      * We've seen server NEWKEYS, so create and initialise
6940      * server-to-client session keys.
6941      */
6942     if (ssh->sc_cipher_ctx)
6943         ssh->sccipher->free_context(ssh->sc_cipher_ctx);
6944     ssh->sccipher = s->sccipher_tobe;
6945     ssh->sc_cipher_ctx = ssh->sccipher->make_context();
6946
6947     if (ssh->sc_mac_ctx)
6948         ssh->scmac->free_context(ssh->sc_mac_ctx);
6949     ssh->scmac = s->scmac_tobe;
6950     ssh->sc_mac_ctx = ssh->scmac->make_context();
6951
6952     if (ssh->sc_comp_ctx)
6953         ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx);
6954     ssh->sccomp = s->sccomp_tobe;
6955     ssh->sc_comp_ctx = ssh->sccomp->decompress_init();
6956
6957     /*
6958      * Set IVs on server-to-client keys. Here we use the exchange
6959      * hash from the _first_ key exchange.
6960      */
6961     {
6962         unsigned char keyspace[SSH2_KEX_MAX_HASH_LEN * SSH2_MKKEY_ITERS];
6963         assert(sizeof(keyspace) >= ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6964         ssh2_mkkey(ssh,s->K,s->exchange_hash,'D',keyspace);
6965         assert((ssh->sccipher->keylen+7) / 8 <=
6966                ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6967         ssh->sccipher->setkey(ssh->sc_cipher_ctx, keyspace);
6968         ssh2_mkkey(ssh,s->K,s->exchange_hash,'B',keyspace);
6969         assert(ssh->sccipher->blksize <=
6970                ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6971         ssh->sccipher->setiv(ssh->sc_cipher_ctx, keyspace);
6972         ssh2_mkkey(ssh,s->K,s->exchange_hash,'F',keyspace);
6973         assert(ssh->scmac->len <=
6974                ssh->kex->hash->hlen * SSH2_MKKEY_ITERS);
6975         ssh->scmac->setkey(ssh->sc_mac_ctx, keyspace);
6976         smemclr(keyspace, sizeof(keyspace));
6977     }
6978     logeventf(ssh, "Initialised %.200s server->client encryption",
6979               ssh->sccipher->text_name);
6980     logeventf(ssh, "Initialised %.200s server->client MAC algorithm",
6981               ssh->scmac->text_name);
6982     if (ssh->sccomp->text_name)
6983         logeventf(ssh, "Initialised %s decompression",
6984                   ssh->sccomp->text_name);
6985
6986     /*
6987      * Free shared secret.
6988      */
6989     freebn(s->K);
6990
6991     /*
6992      * Key exchange is over. Loop straight back round if we have a
6993      * deferred rekey reason.
6994      */
6995     if (ssh->deferred_rekey_reason) {
6996         logevent(ssh->deferred_rekey_reason);
6997         pktin = NULL;
6998         ssh->deferred_rekey_reason = NULL;
6999         goto begin_key_exchange;
7000     }
7001
7002     /*
7003      * Otherwise, schedule a timer for our next rekey.
7004      */
7005     ssh->kex_in_progress = FALSE;
7006     ssh->last_rekey = GETTICKCOUNT();
7007     if (conf_get_int(ssh->conf, CONF_ssh_rekey_time) != 0)
7008         ssh->next_rekey = schedule_timer(conf_get_int(ssh->conf, CONF_ssh_rekey_time)*60*TICKSPERSEC,
7009                                          ssh2_timer, ssh);
7010
7011     /*
7012      * Now we're encrypting. Begin returning 1 to the protocol main
7013      * function so that other things can run on top of the
7014      * transport. If we ever see a KEXINIT, we must go back to the
7015      * start.
7016      * 
7017      * We _also_ go back to the start if we see pktin==NULL and
7018      * inlen negative, because this is a special signal meaning
7019      * `initiate client-driven rekey', and `in' contains a message
7020      * giving the reason for the rekey.
7021      *
7022      * inlen==-1 means always initiate a rekey;
7023      * inlen==-2 means that userauth has completed successfully and
7024      *   we should consider rekeying (for delayed compression).
7025      */
7026     while (!((pktin && pktin->type == SSH2_MSG_KEXINIT) ||
7027              (!pktin && inlen < 0))) {
7028         wait_for_rekey:
7029         if (!ssh->protocol_initial_phase_done) {
7030             ssh->protocol_initial_phase_done = TRUE;
7031             /*
7032              * Allow authconn to initialise itself.
7033              */
7034             do_ssh2_authconn(ssh, NULL, 0, NULL);
7035         }
7036         crReturnV;
7037     }
7038     if (pktin) {
7039         logevent("Server initiated key re-exchange");
7040     } else {
7041         if (inlen == -2) {
7042             /* 
7043              * authconn has seen a USERAUTH_SUCCEEDED. Time to enable
7044              * delayed compression, if it's available.
7045              *
7046              * draft-miller-secsh-compression-delayed-00 says that you
7047              * negotiate delayed compression in the first key exchange, and
7048              * both sides start compressing when the server has sent
7049              * USERAUTH_SUCCESS. This has a race condition -- the server
7050              * can't know when the client has seen it, and thus which incoming
7051              * packets it should treat as compressed.
7052              *
7053              * Instead, we do the initial key exchange without offering the
7054              * delayed methods, but note if the server offers them; when we
7055              * get here, if a delayed method was available that was higher
7056              * on our list than what we got, we initiate a rekey in which we
7057              * _do_ list the delayed methods (and hopefully get it as a
7058              * result). Subsequent rekeys will do the same.
7059              */
7060             assert(!s->userauth_succeeded); /* should only happen once */
7061             s->userauth_succeeded = TRUE;
7062             if (!s->pending_compression)
7063                 /* Can't see any point rekeying. */
7064                 goto wait_for_rekey;       /* this is utterly horrid */
7065             /* else fall through to rekey... */
7066             s->pending_compression = FALSE;
7067         }
7068         /*
7069          * Now we've decided to rekey.
7070          *
7071          * Special case: if the server bug is set that doesn't
7072          * allow rekeying, we give a different log message and
7073          * continue waiting. (If such a server _initiates_ a rekey,
7074          * we process it anyway!)
7075          */
7076         if ((ssh->remote_bugs & BUG_SSH2_REKEY)) {
7077             logeventf(ssh, "Server bug prevents key re-exchange (%s)",
7078                       (char *)in);
7079             /* Reset the counters, so that at least this message doesn't
7080              * hit the event log _too_ often. */
7081             ssh->outgoing_data_size = 0;
7082             ssh->incoming_data_size = 0;
7083             if (conf_get_int(ssh->conf, CONF_ssh_rekey_time) != 0) {
7084                 ssh->next_rekey =
7085                     schedule_timer(conf_get_int(ssh->conf, CONF_ssh_rekey_time)*60*TICKSPERSEC,
7086                                    ssh2_timer, ssh);
7087             }
7088             goto wait_for_rekey;       /* this is still utterly horrid */
7089         } else {
7090             logeventf(ssh, "Initiating key re-exchange (%s)", (char *)in);
7091         }
7092     }
7093     goto begin_key_exchange;
7094
7095     crFinishV;
7096 }
7097
7098 /*
7099  * Add data to an SSH-2 channel output buffer.
7100  */
7101 static void ssh2_add_channel_data(struct ssh_channel *c, char *buf,
7102                                   int len)
7103 {
7104     bufchain_add(&c->v.v2.outbuffer, buf, len);
7105 }
7106
7107 /*
7108  * Attempt to send data on an SSH-2 channel.
7109  */
7110 static int ssh2_try_send(struct ssh_channel *c)
7111 {
7112     Ssh ssh = c->ssh;
7113     struct Packet *pktout;
7114     int ret;
7115
7116     while (c->v.v2.remwindow > 0 && bufchain_size(&c->v.v2.outbuffer) > 0) {
7117         int len;
7118         void *data;
7119         bufchain_prefix(&c->v.v2.outbuffer, &data, &len);
7120         if ((unsigned)len > c->v.v2.remwindow)
7121             len = c->v.v2.remwindow;
7122         if ((unsigned)len > c->v.v2.remmaxpkt)
7123             len = c->v.v2.remmaxpkt;
7124         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA);
7125         ssh2_pkt_adduint32(pktout, c->remoteid);
7126         ssh2_pkt_addstring_start(pktout);
7127         ssh2_pkt_addstring_data(pktout, data, len);
7128         ssh2_pkt_send(ssh, pktout);
7129         bufchain_consume(&c->v.v2.outbuffer, len);
7130         c->v.v2.remwindow -= len;
7131     }
7132
7133     /*
7134      * After having sent as much data as we can, return the amount
7135      * still buffered.
7136      */
7137     ret = bufchain_size(&c->v.v2.outbuffer);
7138
7139     /*
7140      * And if there's no data pending but we need to send an EOF, send
7141      * it.
7142      */
7143     if (!ret && c->pending_eof)
7144         ssh_channel_try_eof(c);
7145
7146     return ret;
7147 }
7148
7149 static void ssh2_try_send_and_unthrottle(Ssh ssh, struct ssh_channel *c)
7150 {
7151     int bufsize;
7152     if (c->closes & CLOSES_SENT_EOF)
7153         return;                   /* don't send on channels we've EOFed */
7154     bufsize = ssh2_try_send(c);
7155     if (bufsize == 0) {
7156         switch (c->type) {
7157           case CHAN_MAINSESSION:
7158             /* stdin need not receive an unthrottle
7159              * notification since it will be polled */
7160             break;
7161           case CHAN_X11:
7162             x11_unthrottle(c->u.x11.xconn);
7163             break;
7164           case CHAN_AGENT:
7165             /* agent sockets are request/response and need no
7166              * buffer management */
7167             break;
7168           case CHAN_SOCKDATA:
7169             pfd_unthrottle(c->u.pfd.pf);
7170             break;
7171         }
7172     }
7173 }
7174
7175 static int ssh_is_simple(Ssh ssh)
7176 {
7177     /*
7178      * We use the 'simple' variant of the SSH protocol if we're asked
7179      * to, except not if we're also doing connection-sharing (either
7180      * tunnelling our packets over an upstream or expecting to be
7181      * tunnelled over ourselves), since then the assumption that we
7182      * have only one channel to worry about is not true after all.
7183      */
7184     return (conf_get_int(ssh->conf, CONF_ssh_simple) &&
7185             !ssh->bare_connection && !ssh->connshare);
7186 }
7187
7188 /*
7189  * Set up most of a new ssh_channel for SSH-2.
7190  */
7191 static void ssh2_channel_init(struct ssh_channel *c)
7192 {
7193     Ssh ssh = c->ssh;
7194     c->localid = alloc_channel_id(ssh);
7195     c->closes = 0;
7196     c->pending_eof = FALSE;
7197     c->throttling_conn = FALSE;
7198     c->v.v2.locwindow = c->v.v2.locmaxwin = c->v.v2.remlocwin =
7199         ssh_is_simple(ssh) ? OUR_V2_BIGWIN : OUR_V2_WINSIZE;
7200     c->v.v2.chanreq_head = NULL;
7201     c->v.v2.throttle_state = UNTHROTTLED;
7202     bufchain_init(&c->v.v2.outbuffer);
7203 }
7204
7205 /*
7206  * Construct the common parts of a CHANNEL_OPEN.
7207  */
7208 static struct Packet *ssh2_chanopen_init(struct ssh_channel *c, char *type)
7209 {
7210     struct Packet *pktout;
7211
7212     pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
7213     ssh2_pkt_addstring(pktout, type);
7214     ssh2_pkt_adduint32(pktout, c->localid);
7215     ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);/* our window size */
7216     ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT);      /* our max pkt size */
7217     return pktout;
7218 }
7219
7220 /*
7221  * CHANNEL_FAILURE doesn't come with any indication of what message
7222  * caused it, so we have to keep track of the outstanding
7223  * CHANNEL_REQUESTs ourselves.
7224  */
7225 static void ssh2_queue_chanreq_handler(struct ssh_channel *c,
7226                                        cchandler_fn_t handler, void *ctx)
7227 {
7228     struct outstanding_channel_request *ocr =
7229         snew(struct outstanding_channel_request);
7230
7231     assert(!(c->closes & (CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE)));
7232     ocr->handler = handler;
7233     ocr->ctx = ctx;
7234     ocr->next = NULL;
7235     if (!c->v.v2.chanreq_head)
7236         c->v.v2.chanreq_head = ocr;
7237     else
7238         c->v.v2.chanreq_tail->next = ocr;
7239     c->v.v2.chanreq_tail = ocr;
7240 }
7241
7242 /*
7243  * Construct the common parts of a CHANNEL_REQUEST.  If handler is not
7244  * NULL then a reply will be requested and the handler will be called
7245  * when it arrives.  The returned packet is ready to have any
7246  * request-specific data added and be sent.  Note that if a handler is
7247  * provided, it's essential that the request actually be sent.
7248  *
7249  * The handler will usually be passed the response packet in pktin. If
7250  * pktin is NULL, this means that no reply will ever be forthcoming
7251  * (e.g. because the entire connection is being destroyed, or because
7252  * the server initiated channel closure before we saw the response)
7253  * and the handler should free any storage it's holding.
7254  */
7255 static struct Packet *ssh2_chanreq_init(struct ssh_channel *c, char *type,
7256                                         cchandler_fn_t handler, void *ctx)
7257 {
7258     struct Packet *pktout;
7259
7260     assert(!(c->closes & (CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE)));
7261     pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
7262     ssh2_pkt_adduint32(pktout, c->remoteid);
7263     ssh2_pkt_addstring(pktout, type);
7264     ssh2_pkt_addbool(pktout, handler != NULL);
7265     if (handler != NULL)
7266         ssh2_queue_chanreq_handler(c, handler, ctx);
7267     return pktout;
7268 }
7269
7270 /*
7271  * Potentially enlarge the window on an SSH-2 channel.
7272  */
7273 static void ssh2_handle_winadj_response(struct ssh_channel *, struct Packet *,
7274                                         void *);
7275 static void ssh2_set_window(struct ssh_channel *c, int newwin)
7276 {
7277     Ssh ssh = c->ssh;
7278
7279     /*
7280      * Never send WINDOW_ADJUST for a channel that the remote side has
7281      * already sent EOF on; there's no point, since it won't be
7282      * sending any more data anyway. Ditto if _we've_ already sent
7283      * CLOSE.
7284      */
7285     if (c->closes & (CLOSES_RCVD_EOF | CLOSES_SENT_CLOSE))
7286         return;
7287
7288     /*
7289      * Also, never widen the window for an X11 channel when we're
7290      * still waiting to see its initial auth and may yet hand it off
7291      * to a downstream.
7292      */
7293     if (c->type == CHAN_X11 && c->u.x11.initial)
7294         return;
7295
7296     /*
7297      * If the remote end has a habit of ignoring maxpkt, limit the
7298      * window so that it has no choice (assuming it doesn't ignore the
7299      * window as well).
7300      */
7301     if ((ssh->remote_bugs & BUG_SSH2_MAXPKT) && newwin > OUR_V2_MAXPKT)
7302         newwin = OUR_V2_MAXPKT;
7303
7304     /*
7305      * Only send a WINDOW_ADJUST if there's significantly more window
7306      * available than the other end thinks there is.  This saves us
7307      * sending a WINDOW_ADJUST for every character in a shell session.
7308      *
7309      * "Significant" is arbitrarily defined as half the window size.
7310      */
7311     if (newwin / 2 >= c->v.v2.locwindow) {
7312         struct Packet *pktout;
7313         unsigned *up;
7314
7315         /*
7316          * In order to keep track of how much window the client
7317          * actually has available, we'd like it to acknowledge each
7318          * WINDOW_ADJUST.  We can't do that directly, so we accompany
7319          * it with a CHANNEL_REQUEST that has to be acknowledged.
7320          *
7321          * This is only necessary if we're opening the window wide.
7322          * If we're not, then throughput is being constrained by
7323          * something other than the maximum window size anyway.
7324          */
7325         if (newwin == c->v.v2.locmaxwin &&
7326             !(ssh->remote_bugs & BUG_CHOKES_ON_WINADJ)) {
7327             up = snew(unsigned);
7328             *up = newwin - c->v.v2.locwindow;
7329             pktout = ssh2_chanreq_init(c, "winadj@putty.projects.tartarus.org",
7330                                        ssh2_handle_winadj_response, up);
7331             ssh2_pkt_send(ssh, pktout);
7332
7333             if (c->v.v2.throttle_state != UNTHROTTLED)
7334                 c->v.v2.throttle_state = UNTHROTTLING;
7335         } else {
7336             /* Pretend the WINDOW_ADJUST was acked immediately. */
7337             c->v.v2.remlocwin = newwin;
7338             c->v.v2.throttle_state = THROTTLED;
7339         }
7340         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
7341         ssh2_pkt_adduint32(pktout, c->remoteid);
7342         ssh2_pkt_adduint32(pktout, newwin - c->v.v2.locwindow);
7343         ssh2_pkt_send(ssh, pktout);
7344         c->v.v2.locwindow = newwin;
7345     }
7346 }
7347
7348 /*
7349  * Find the channel associated with a message.  If there's no channel,
7350  * or it's not properly open, make a noise about it and return NULL.
7351  */
7352 static struct ssh_channel *ssh2_channel_msg(Ssh ssh, struct Packet *pktin)
7353 {
7354     unsigned localid = ssh_pkt_getuint32(pktin);
7355     struct ssh_channel *c;
7356
7357     c = find234(ssh->channels, &localid, ssh_channelfind);
7358     if (!c ||
7359         (c->type != CHAN_SHARING && c->halfopen &&
7360          pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION &&
7361          pktin->type != SSH2_MSG_CHANNEL_OPEN_FAILURE)) {
7362         char *buf = dupprintf("Received %s for %s channel %u",
7363                               ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx,
7364                                             pktin->type),
7365                               c ? "half-open" : "nonexistent", localid);
7366         ssh_disconnect(ssh, NULL, buf, SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE);
7367         sfree(buf);
7368         return NULL;
7369     }
7370     return c;
7371 }
7372
7373 static void ssh2_handle_winadj_response(struct ssh_channel *c,
7374                                         struct Packet *pktin, void *ctx)
7375 {
7376     unsigned *sizep = ctx;
7377
7378     /*
7379      * Winadj responses should always be failures. However, at least
7380      * one server ("boks_sshd") is known to return SUCCESS for channel
7381      * requests it's never heard of, such as "winadj@putty". Raised
7382      * with foxt.com as bug 090916-090424, but for the sake of a quiet
7383      * life, we don't worry about what kind of response we got.
7384      */
7385
7386     c->v.v2.remlocwin += *sizep;
7387     sfree(sizep);
7388     /*
7389      * winadj messages are only sent when the window is fully open, so
7390      * if we get an ack of one, we know any pending unthrottle is
7391      * complete.
7392      */
7393     if (c->v.v2.throttle_state == UNTHROTTLING)
7394         c->v.v2.throttle_state = UNTHROTTLED;
7395 }
7396
7397 static void ssh2_msg_channel_response(Ssh ssh, struct Packet *pktin)
7398 {
7399     struct ssh_channel *c = ssh2_channel_msg(ssh, pktin);
7400     struct outstanding_channel_request *ocr;
7401
7402     if (!c) return;
7403     if (c->type == CHAN_SHARING) {
7404         share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
7405                                   pktin->body, pktin->length);
7406         return;
7407     }
7408     ocr = c->v.v2.chanreq_head;
7409     if (!ocr) {
7410         ssh2_msg_unexpected(ssh, pktin);
7411         return;
7412     }
7413     ocr->handler(c, pktin, ocr->ctx);
7414     c->v.v2.chanreq_head = ocr->next;
7415     sfree(ocr);
7416     /*
7417      * We may now initiate channel-closing procedures, if that
7418      * CHANNEL_REQUEST was the last thing outstanding before we send
7419      * CHANNEL_CLOSE.
7420      */
7421     ssh2_channel_check_close(c);
7422 }
7423
7424 static void ssh2_msg_channel_window_adjust(Ssh ssh, struct Packet *pktin)
7425 {
7426     struct ssh_channel *c;
7427     c = ssh2_channel_msg(ssh, pktin);
7428     if (!c)
7429         return;
7430     if (c->type == CHAN_SHARING) {
7431         share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
7432                                   pktin->body, pktin->length);
7433         return;
7434     }
7435     if (!(c->closes & CLOSES_SENT_EOF)) {
7436         c->v.v2.remwindow += ssh_pkt_getuint32(pktin);
7437         ssh2_try_send_and_unthrottle(ssh, c);
7438     }
7439 }
7440
7441 static void ssh2_msg_channel_data(Ssh ssh, struct Packet *pktin)
7442 {
7443     char *data;
7444     int length;
7445     struct ssh_channel *c;
7446     c = ssh2_channel_msg(ssh, pktin);
7447     if (!c)
7448         return;
7449     if (c->type == CHAN_SHARING) {
7450         share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
7451                                   pktin->body, pktin->length);
7452         return;
7453     }
7454     if (pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA &&
7455         ssh_pkt_getuint32(pktin) != SSH2_EXTENDED_DATA_STDERR)
7456         return;                        /* extended but not stderr */
7457     ssh_pkt_getstring(pktin, &data, &length);
7458     if (data) {
7459         int bufsize = 0;
7460         c->v.v2.locwindow -= length;
7461         c->v.v2.remlocwin -= length;
7462         switch (c->type) {
7463           case CHAN_MAINSESSION:
7464             bufsize =
7465                 from_backend(ssh->frontend, pktin->type ==
7466                              SSH2_MSG_CHANNEL_EXTENDED_DATA,
7467                              data, length);
7468             break;
7469           case CHAN_X11:
7470             bufsize = x11_send(c->u.x11.xconn, data, length);
7471             break;
7472           case CHAN_SOCKDATA:
7473             bufsize = pfd_send(c->u.pfd.pf, data, length);
7474             break;
7475           case CHAN_AGENT:
7476             while (length > 0) {
7477                 if (c->u.a.lensofar < 4) {
7478                     unsigned int l = min(4 - c->u.a.lensofar,
7479                                          (unsigned)length);
7480                     memcpy(c->u.a.msglen + c->u.a.lensofar,
7481                            data, l);
7482                     data += l;
7483                     length -= l;
7484                     c->u.a.lensofar += l;
7485                 }
7486                 if (c->u.a.lensofar == 4) {
7487                     c->u.a.totallen =
7488                         4 + GET_32BIT(c->u.a.msglen);
7489                     c->u.a.message = snewn(c->u.a.totallen,
7490                                            unsigned char);
7491                     memcpy(c->u.a.message, c->u.a.msglen, 4);
7492                 }
7493                 if (c->u.a.lensofar >= 4 && length > 0) {
7494                     unsigned int l =
7495                         min(c->u.a.totallen - c->u.a.lensofar,
7496                             (unsigned)length);
7497                     memcpy(c->u.a.message + c->u.a.lensofar,
7498                            data, l);
7499                     data += l;
7500                     length -= l;
7501                     c->u.a.lensofar += l;
7502                 }
7503                 if (c->u.a.lensofar == c->u.a.totallen) {
7504                     void *reply;
7505                     int replylen;
7506                     c->u.a.outstanding_requests++;
7507                     if (agent_query(c->u.a.message,
7508                                     c->u.a.totallen,
7509                                     &reply, &replylen,
7510                                     ssh_agentf_callback, c))
7511                         ssh_agentf_callback(c, reply, replylen);
7512                     sfree(c->u.a.message);
7513                     c->u.a.message = NULL;
7514                     c->u.a.lensofar = 0;
7515                 }
7516             }
7517             bufsize = 0;
7518             break;
7519         }
7520         /*
7521          * If it looks like the remote end hit the end of its window,
7522          * and we didn't want it to do that, think about using a
7523          * larger window.
7524          */
7525         if (c->v.v2.remlocwin <= 0 && c->v.v2.throttle_state == UNTHROTTLED &&
7526             c->v.v2.locmaxwin < 0x40000000)
7527             c->v.v2.locmaxwin += OUR_V2_WINSIZE;
7528         /*
7529          * If we are not buffering too much data,
7530          * enlarge the window again at the remote side.
7531          * If we are buffering too much, we may still
7532          * need to adjust the window if the server's
7533          * sent excess data.
7534          */
7535         ssh2_set_window(c, bufsize < c->v.v2.locmaxwin ?
7536                         c->v.v2.locmaxwin - bufsize : 0);
7537         /*
7538          * If we're either buffering way too much data, or if we're
7539          * buffering anything at all and we're in "simple" mode,
7540          * throttle the whole channel.
7541          */
7542         if ((bufsize > c->v.v2.locmaxwin || (ssh_is_simple(ssh) && bufsize>0))
7543             && !c->throttling_conn) {
7544             c->throttling_conn = 1;
7545             ssh_throttle_conn(ssh, +1);
7546         }
7547     }
7548 }
7549
7550 static void ssh_check_termination(Ssh ssh)
7551 {
7552     if (ssh->version == 2 &&
7553         !conf_get_int(ssh->conf, CONF_ssh_no_shell) &&
7554         count234(ssh->channels) == 0 &&
7555         !(ssh->connshare && share_ndownstreams(ssh->connshare) > 0)) {
7556         /*
7557          * We used to send SSH_MSG_DISCONNECT here, because I'd
7558          * believed that _every_ conforming SSH-2 connection had to
7559          * end with a disconnect being sent by at least one side;
7560          * apparently I was wrong and it's perfectly OK to
7561          * unceremoniously slam the connection shut when you're done,
7562          * and indeed OpenSSH feels this is more polite than sending a
7563          * DISCONNECT. So now we don't.
7564          */
7565         ssh_disconnect(ssh, "All channels closed", NULL, 0, TRUE);
7566     }
7567 }
7568
7569 void ssh_sharing_downstream_connected(Ssh ssh, unsigned id)
7570 {
7571     logeventf(ssh, "Connection sharing downstream #%u connected", id);
7572 }
7573
7574 void ssh_sharing_downstream_disconnected(Ssh ssh, unsigned id)
7575 {
7576     logeventf(ssh, "Connection sharing downstream #%u disconnected", id);
7577     ssh_check_termination(ssh);
7578 }
7579
7580 void ssh_sharing_logf(Ssh ssh, unsigned id, const char *logfmt, ...)
7581 {
7582     va_list ap;
7583     char *buf;
7584
7585     va_start(ap, logfmt);
7586     buf = dupvprintf(logfmt, ap);
7587     va_end(ap);
7588     if (id)
7589         logeventf(ssh, "Connection sharing downstream #%u: %s", id, buf);
7590     else
7591         logeventf(ssh, "Connection sharing: %s", buf);
7592     sfree(buf);
7593 }
7594
7595 static void ssh_channel_destroy(struct ssh_channel *c)
7596 {
7597     Ssh ssh = c->ssh;
7598
7599     switch (c->type) {
7600       case CHAN_MAINSESSION:
7601         ssh->mainchan = NULL;
7602         update_specials_menu(ssh->frontend);
7603         break;
7604       case CHAN_X11:
7605         if (c->u.x11.xconn != NULL)
7606             x11_close(c->u.x11.xconn);
7607         logevent("Forwarded X11 connection terminated");
7608         break;
7609       case CHAN_AGENT:
7610         sfree(c->u.a.message);
7611         break;
7612       case CHAN_SOCKDATA:
7613         if (c->u.pfd.pf != NULL)
7614             pfd_close(c->u.pfd.pf);
7615         logevent("Forwarded port closed");
7616         break;
7617     }
7618
7619     del234(ssh->channels, c);
7620     if (ssh->version == 2) {
7621         bufchain_clear(&c->v.v2.outbuffer);
7622         assert(c->v.v2.chanreq_head == NULL);
7623     }
7624     sfree(c);
7625
7626     /*
7627      * If that was the last channel left open, we might need to
7628      * terminate.
7629      */
7630     ssh_check_termination(ssh);
7631 }
7632
7633 static void ssh2_channel_check_close(struct ssh_channel *c)
7634 {
7635     Ssh ssh = c->ssh;
7636     struct Packet *pktout;
7637
7638     if (c->halfopen) {
7639         /*
7640          * If we've sent out our own CHANNEL_OPEN but not yet seen
7641          * either OPEN_CONFIRMATION or OPEN_FAILURE in response, then
7642          * it's too early to be sending close messages of any kind.
7643          */
7644         return;
7645     }
7646
7647     if ((!((CLOSES_SENT_EOF | CLOSES_RCVD_EOF) & ~c->closes) ||
7648          c->type == CHAN_ZOMBIE) &&
7649         !c->v.v2.chanreq_head &&
7650         !(c->closes & CLOSES_SENT_CLOSE)) {
7651         /*
7652          * We have both sent and received EOF (or the channel is a
7653          * zombie), and we have no outstanding channel requests, which
7654          * means the channel is in final wind-up. But we haven't sent
7655          * CLOSE, so let's do so now.
7656          */
7657         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
7658         ssh2_pkt_adduint32(pktout, c->remoteid);
7659         ssh2_pkt_send(ssh, pktout);
7660         c->closes |= CLOSES_SENT_EOF | CLOSES_SENT_CLOSE;
7661     }
7662
7663     if (!((CLOSES_SENT_CLOSE | CLOSES_RCVD_CLOSE) & ~c->closes)) {
7664         assert(c->v.v2.chanreq_head == NULL);
7665         /*
7666          * We have both sent and received CLOSE, which means we're
7667          * completely done with the channel.
7668          */
7669         ssh_channel_destroy(c);
7670     }
7671 }
7672
7673 static void ssh2_channel_got_eof(struct ssh_channel *c)
7674 {
7675     if (c->closes & CLOSES_RCVD_EOF)
7676         return;                        /* already seen EOF */
7677     c->closes |= CLOSES_RCVD_EOF;
7678
7679     if (c->type == CHAN_X11) {
7680         x11_send_eof(c->u.x11.xconn);
7681     } else if (c->type == CHAN_AGENT) {
7682         if (c->u.a.outstanding_requests == 0) {
7683             /* Manufacture an outgoing EOF in response to the incoming one. */
7684             sshfwd_write_eof(c);
7685         }
7686     } else if (c->type == CHAN_SOCKDATA) {
7687         pfd_send_eof(c->u.pfd.pf);
7688     } else if (c->type == CHAN_MAINSESSION) {
7689         Ssh ssh = c->ssh;
7690
7691         if (!ssh->sent_console_eof &&
7692             (from_backend_eof(ssh->frontend) || ssh->got_pty)) {
7693             /*
7694              * Either from_backend_eof told us that the front end
7695              * wants us to close the outgoing side of the connection
7696              * as soon as we see EOF from the far end, or else we've
7697              * unilaterally decided to do that because we've allocated
7698              * a remote pty and hence EOF isn't a particularly
7699              * meaningful concept.
7700              */
7701             sshfwd_write_eof(c);
7702         }
7703         ssh->sent_console_eof = TRUE;
7704     }
7705
7706     ssh2_channel_check_close(c);
7707 }
7708
7709 static void ssh2_msg_channel_eof(Ssh ssh, struct Packet *pktin)
7710 {
7711     struct ssh_channel *c;
7712
7713     c = ssh2_channel_msg(ssh, pktin);
7714     if (!c)
7715         return;
7716     if (c->type == CHAN_SHARING) {
7717         share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
7718                                   pktin->body, pktin->length);
7719         return;
7720     }
7721     ssh2_channel_got_eof(c);
7722 }
7723
7724 static void ssh2_msg_channel_close(Ssh ssh, struct Packet *pktin)
7725 {
7726     struct ssh_channel *c;
7727
7728     c = ssh2_channel_msg(ssh, pktin);
7729     if (!c)
7730         return;
7731     if (c->type == CHAN_SHARING) {
7732         share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
7733                                   pktin->body, pktin->length);
7734         return;
7735     }
7736
7737     /*
7738      * When we receive CLOSE on a channel, we assume it comes with an
7739      * implied EOF if we haven't seen EOF yet.
7740      */
7741     ssh2_channel_got_eof(c);
7742
7743     if (!(ssh->remote_bugs & BUG_SENDS_LATE_REQUEST_REPLY)) {
7744         /*
7745          * It also means we stop expecting to see replies to any
7746          * outstanding channel requests, so clean those up too.
7747          * (ssh_chanreq_init will enforce by assertion that we don't
7748          * subsequently put anything back on this list.)
7749          */
7750         while (c->v.v2.chanreq_head) {
7751             struct outstanding_channel_request *ocr = c->v.v2.chanreq_head;
7752             ocr->handler(c, NULL, ocr->ctx);
7753             c->v.v2.chanreq_head = ocr->next;
7754             sfree(ocr);
7755         }
7756     }
7757
7758     /*
7759      * And we also send an outgoing EOF, if we haven't already, on the
7760      * assumption that CLOSE is a pretty forceful announcement that
7761      * the remote side is doing away with the entire channel. (If it
7762      * had wanted to send us EOF and continue receiving data from us,
7763      * it would have just sent CHANNEL_EOF.)
7764      */
7765     if (!(c->closes & CLOSES_SENT_EOF)) {
7766         /*
7767          * Make sure we don't read any more from whatever our local
7768          * data source is for this channel.
7769          */
7770         switch (c->type) {
7771           case CHAN_MAINSESSION:
7772             ssh->send_ok = 0;     /* stop trying to read from stdin */
7773             break;
7774           case CHAN_X11:
7775             x11_override_throttle(c->u.x11.xconn, 1);
7776             break;
7777           case CHAN_SOCKDATA:
7778             pfd_override_throttle(c->u.pfd.pf, 1);
7779             break;
7780         }
7781
7782         /*
7783          * Abandon any buffered data we still wanted to send to this
7784          * channel. Receiving a CHANNEL_CLOSE is an indication that
7785          * the server really wants to get on and _destroy_ this
7786          * channel, and it isn't going to send us any further
7787          * WINDOW_ADJUSTs to permit us to send pending stuff.
7788          */
7789         bufchain_clear(&c->v.v2.outbuffer);
7790
7791         /*
7792          * Send outgoing EOF.
7793          */
7794         sshfwd_write_eof(c);
7795     }
7796
7797     /*
7798      * Now process the actual close.
7799      */
7800     if (!(c->closes & CLOSES_RCVD_CLOSE)) {
7801         c->closes |= CLOSES_RCVD_CLOSE;
7802         ssh2_channel_check_close(c);
7803     }
7804 }
7805
7806 static void ssh2_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin)
7807 {
7808     struct ssh_channel *c;
7809
7810     c = ssh2_channel_msg(ssh, pktin);
7811     if (!c)
7812         return;
7813     if (c->type == CHAN_SHARING) {
7814         share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
7815                                   pktin->body, pktin->length);
7816         return;
7817     }
7818     assert(c->halfopen); /* ssh2_channel_msg will have enforced this */
7819     c->remoteid = ssh_pkt_getuint32(pktin);
7820     c->halfopen = FALSE;
7821     c->v.v2.remwindow = ssh_pkt_getuint32(pktin);
7822     c->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin);
7823
7824     if (c->type == CHAN_SOCKDATA_DORMANT) {
7825         c->type = CHAN_SOCKDATA;
7826         if (c->u.pfd.pf)
7827             pfd_confirm(c->u.pfd.pf);
7828     } else if (c->type == CHAN_ZOMBIE) {
7829         /*
7830          * This case can occur if a local socket error occurred
7831          * between us sending out CHANNEL_OPEN and receiving
7832          * OPEN_CONFIRMATION. In this case, all we can do is
7833          * immediately initiate close proceedings now that we know the
7834          * server's id to put in the close message.
7835          */
7836         ssh2_channel_check_close(c);
7837     } else {
7838         /*
7839          * We never expect to receive OPEN_CONFIRMATION for any
7840          * *other* channel type (since only local-to-remote port
7841          * forwardings cause us to send CHANNEL_OPEN after the main
7842          * channel is live - all other auxiliary channel types are
7843          * initiated from the server end). It's safe to enforce this
7844          * by assertion rather than by ssh_disconnect, because the
7845          * real point is that we never constructed a half-open channel
7846          * structure in the first place with any type other than the
7847          * above.
7848          */
7849         assert(!"Funny channel type in ssh2_msg_channel_open_confirmation");
7850     }
7851
7852     if (c->pending_eof)
7853         ssh_channel_try_eof(c);        /* in case we had a pending EOF */
7854 }
7855
7856 static void ssh2_msg_channel_open_failure(Ssh ssh, struct Packet *pktin)
7857 {
7858     static const char *const reasons[] = {
7859         "<unknown reason code>",
7860             "Administratively prohibited",
7861             "Connect failed",
7862             "Unknown channel type",
7863             "Resource shortage",
7864     };
7865     unsigned reason_code;
7866     char *reason_string;
7867     int reason_length;
7868     struct ssh_channel *c;
7869
7870     c = ssh2_channel_msg(ssh, pktin);
7871     if (!c)
7872         return;
7873     if (c->type == CHAN_SHARING) {
7874         share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
7875                                   pktin->body, pktin->length);
7876         return;
7877     }
7878     assert(c->halfopen); /* ssh2_channel_msg will have enforced this */
7879
7880     if (c->type == CHAN_SOCKDATA_DORMANT) {
7881         reason_code = ssh_pkt_getuint32(pktin);
7882         if (reason_code >= lenof(reasons))
7883             reason_code = 0; /* ensure reasons[reason_code] in range */
7884         ssh_pkt_getstring(pktin, &reason_string, &reason_length);
7885         logeventf(ssh, "Forwarded connection refused by server: %s [%.*s]",
7886                   reasons[reason_code], reason_length, reason_string);
7887
7888         pfd_close(c->u.pfd.pf);
7889     } else if (c->type == CHAN_ZOMBIE) {
7890         /*
7891          * This case can occur if a local socket error occurred
7892          * between us sending out CHANNEL_OPEN and receiving
7893          * OPEN_FAILURE. In this case, we need do nothing except allow
7894          * the code below to throw the half-open channel away.
7895          */
7896     } else {
7897         /*
7898          * We never expect to receive OPEN_FAILURE for any *other*
7899          * channel type (since only local-to-remote port forwardings
7900          * cause us to send CHANNEL_OPEN after the main channel is
7901          * live - all other auxiliary channel types are initiated from
7902          * the server end). It's safe to enforce this by assertion
7903          * rather than by ssh_disconnect, because the real point is
7904          * that we never constructed a half-open channel structure in
7905          * the first place with any type other than the above.
7906          */
7907         assert(!"Funny channel type in ssh2_msg_channel_open_failure");
7908     }
7909
7910     del234(ssh->channels, c);
7911     sfree(c);
7912 }
7913
7914 static void ssh2_msg_channel_request(Ssh ssh, struct Packet *pktin)
7915 {
7916     char *type;
7917     int typelen, want_reply;
7918     int reply = SSH2_MSG_CHANNEL_FAILURE; /* default */
7919     struct ssh_channel *c;
7920     struct Packet *pktout;
7921
7922     c = ssh2_channel_msg(ssh, pktin);
7923     if (!c)
7924         return;
7925     if (c->type == CHAN_SHARING) {
7926         share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
7927                                   pktin->body, pktin->length);
7928         return;
7929     }
7930     ssh_pkt_getstring(pktin, &type, &typelen);
7931     want_reply = ssh2_pkt_getbool(pktin);
7932
7933     if (c->closes & CLOSES_SENT_CLOSE) {
7934         /*
7935          * We don't reply to channel requests after we've sent
7936          * CHANNEL_CLOSE for the channel, because our reply might
7937          * cross in the network with the other side's CHANNEL_CLOSE
7938          * and arrive after they have wound the channel up completely.
7939          */
7940         want_reply = FALSE;
7941     }
7942
7943     /*
7944      * Having got the channel number, we now look at
7945      * the request type string to see if it's something
7946      * we recognise.
7947      */
7948     if (c == ssh->mainchan) {
7949         /*
7950          * We recognise "exit-status" and "exit-signal" on
7951          * the primary channel.
7952          */
7953         if (typelen == 11 &&
7954             !memcmp(type, "exit-status", 11)) {
7955
7956             ssh->exitcode = ssh_pkt_getuint32(pktin);
7957             logeventf(ssh, "Server sent command exit status %d",
7958                       ssh->exitcode);
7959             reply = SSH2_MSG_CHANNEL_SUCCESS;
7960
7961         } else if (typelen == 11 &&
7962                    !memcmp(type, "exit-signal", 11)) {
7963
7964             int is_plausible = TRUE, is_int = FALSE;
7965             char *fmt_sig = "", *fmt_msg = "";
7966             char *msg;
7967             int msglen = 0, core = FALSE;
7968             /* ICK: older versions of OpenSSH (e.g. 3.4p1)
7969              * provide an `int' for the signal, despite its
7970              * having been a `string' in the drafts of RFC 4254 since at
7971              * least 2001. (Fixed in session.c 1.147.) Try to
7972              * infer which we can safely parse it as. */
7973             {
7974                 unsigned char *p = pktin->body +
7975                     pktin->savedpos;
7976                 long len = pktin->length - pktin->savedpos;
7977                 unsigned long num = GET_32BIT(p); /* what is it? */
7978                 /* If it's 0, it hardly matters; assume string */
7979                 if (num == 0) {
7980                     is_int = FALSE;
7981                 } else {
7982                     int maybe_int = FALSE, maybe_str = FALSE;
7983 #define CHECK_HYPOTHESIS(offset, result)                                \
7984                     do                                                  \
7985                     {                                                   \
7986                         int q = toint(offset);                          \
7987                         if (q >= 0 && q+4 <= len) {                     \
7988                             q = toint(q + 4 + GET_32BIT(p+q));          \
7989                             if (q >= 0 && q+4 <= len &&                 \
7990                                 ((q = toint(q + 4 + GET_32BIT(p+q))) != 0) && \
7991                                 q == len)                               \
7992                                 result = TRUE;                          \
7993                         }                                               \
7994                     } while(0)
7995                     CHECK_HYPOTHESIS(4+1, maybe_int);
7996                     CHECK_HYPOTHESIS(4+num+1, maybe_str);
7997 #undef CHECK_HYPOTHESIS
7998                     if (maybe_int && !maybe_str)
7999                         is_int = TRUE;
8000                     else if (!maybe_int && maybe_str)
8001                         is_int = FALSE;
8002                     else
8003                         /* Crikey. Either or neither. Panic. */
8004                         is_plausible = FALSE;
8005                 }
8006             }
8007             ssh->exitcode = 128;       /* means `unknown signal' */
8008             if (is_plausible) {
8009                 if (is_int) {
8010                     /* Old non-standard OpenSSH. */
8011                     int signum = ssh_pkt_getuint32(pktin);
8012                     fmt_sig = dupprintf(" %d", signum);
8013                     ssh->exitcode = 128 + signum;
8014                 } else {
8015                     /* As per RFC 4254. */
8016                     char *sig;
8017                     int siglen;
8018                     ssh_pkt_getstring(pktin, &sig, &siglen);
8019                     /* Signal name isn't supposed to be blank, but
8020                      * let's cope gracefully if it is. */
8021                     if (siglen) {
8022                         fmt_sig = dupprintf(" \"%.*s\"",
8023                                             siglen, sig);
8024                     }
8025
8026                     /*
8027                      * Really hideous method of translating the
8028                      * signal description back into a locally
8029                      * meaningful number.
8030                      */
8031
8032                     if (0)
8033                         ;
8034 #define TRANSLATE_SIGNAL(s) \
8035     else if (siglen == lenof(#s)-1 && !memcmp(sig, #s, siglen)) \
8036         ssh->exitcode = 128 + SIG ## s
8037 #ifdef SIGABRT
8038                     TRANSLATE_SIGNAL(ABRT);
8039 #endif
8040 #ifdef SIGALRM
8041                     TRANSLATE_SIGNAL(ALRM);
8042 #endif
8043 #ifdef SIGFPE
8044                     TRANSLATE_SIGNAL(FPE);
8045 #endif
8046 #ifdef SIGHUP
8047                     TRANSLATE_SIGNAL(HUP);
8048 #endif
8049 #ifdef SIGILL
8050                     TRANSLATE_SIGNAL(ILL);
8051 #endif
8052 #ifdef SIGINT
8053                     TRANSLATE_SIGNAL(INT);
8054 #endif
8055 #ifdef SIGKILL
8056                     TRANSLATE_SIGNAL(KILL);
8057 #endif
8058 #ifdef SIGPIPE
8059                     TRANSLATE_SIGNAL(PIPE);
8060 #endif
8061 #ifdef SIGQUIT
8062                     TRANSLATE_SIGNAL(QUIT);
8063 #endif
8064 #ifdef SIGSEGV
8065                     TRANSLATE_SIGNAL(SEGV);
8066 #endif
8067 #ifdef SIGTERM
8068                     TRANSLATE_SIGNAL(TERM);
8069 #endif
8070 #ifdef SIGUSR1
8071                     TRANSLATE_SIGNAL(USR1);
8072 #endif
8073 #ifdef SIGUSR2
8074                     TRANSLATE_SIGNAL(USR2);
8075 #endif
8076 #undef TRANSLATE_SIGNAL
8077                     else
8078                         ssh->exitcode = 128;
8079                 }
8080                 core = ssh2_pkt_getbool(pktin);
8081                 ssh_pkt_getstring(pktin, &msg, &msglen);
8082                 if (msglen) {
8083                     fmt_msg = dupprintf(" (\"%.*s\")", msglen, msg);
8084                 }
8085                 /* ignore lang tag */
8086             } /* else don't attempt to parse */
8087             logeventf(ssh, "Server exited on signal%s%s%s",
8088                       fmt_sig, core ? " (core dumped)" : "",
8089                       fmt_msg);
8090             if (*fmt_sig) sfree(fmt_sig);
8091             if (*fmt_msg) sfree(fmt_msg);
8092             reply = SSH2_MSG_CHANNEL_SUCCESS;
8093
8094         }
8095     } else {
8096         /*
8097          * This is a channel request we don't know
8098          * about, so we now either ignore the request
8099          * or respond with CHANNEL_FAILURE, depending
8100          * on want_reply.
8101          */
8102         reply = SSH2_MSG_CHANNEL_FAILURE;
8103     }
8104     if (want_reply) {
8105         pktout = ssh2_pkt_init(reply);
8106         ssh2_pkt_adduint32(pktout, c->remoteid);
8107         ssh2_pkt_send(ssh, pktout);
8108     }
8109 }
8110
8111 static void ssh2_msg_global_request(Ssh ssh, struct Packet *pktin)
8112 {
8113     char *type;
8114     int typelen, want_reply;
8115     struct Packet *pktout;
8116
8117     ssh_pkt_getstring(pktin, &type, &typelen);
8118     want_reply = ssh2_pkt_getbool(pktin);
8119
8120     /*
8121      * We currently don't support any global requests
8122      * at all, so we either ignore the request or
8123      * respond with REQUEST_FAILURE, depending on
8124      * want_reply.
8125      */
8126     if (want_reply) {
8127         pktout = ssh2_pkt_init(SSH2_MSG_REQUEST_FAILURE);
8128         ssh2_pkt_send(ssh, pktout);
8129     }
8130 }
8131
8132 struct X11FakeAuth *ssh_sharing_add_x11_display(Ssh ssh, int authtype,
8133                                                 void *share_cs,
8134                                                 void *share_chan)
8135 {
8136     struct X11FakeAuth *auth;
8137
8138     /*
8139      * Make up a new set of fake X11 auth data, and add it to the tree
8140      * of currently valid ones with an indication of the sharing
8141      * context that it's relevant to.
8142      */
8143     auth = x11_invent_fake_auth(ssh->x11authtree, authtype);
8144     auth->share_cs = share_cs;
8145     auth->share_chan = share_chan;
8146
8147     return auth;
8148 }
8149
8150 void ssh_sharing_remove_x11_display(Ssh ssh, struct X11FakeAuth *auth)
8151 {
8152     del234(ssh->x11authtree, auth);
8153     x11_free_fake_auth(auth);
8154 }
8155
8156 static void ssh2_msg_channel_open(Ssh ssh, struct Packet *pktin)
8157 {
8158     char *type;
8159     int typelen;
8160     char *peeraddr;
8161     int peeraddrlen;
8162     int peerport;
8163     char *error = NULL;
8164     struct ssh_channel *c;
8165     unsigned remid, winsize, pktsize;
8166     unsigned our_winsize_override = 0;
8167     struct Packet *pktout;
8168
8169     ssh_pkt_getstring(pktin, &type, &typelen);
8170     c = snew(struct ssh_channel);
8171     c->ssh = ssh;
8172
8173     remid = ssh_pkt_getuint32(pktin);
8174     winsize = ssh_pkt_getuint32(pktin);
8175     pktsize = ssh_pkt_getuint32(pktin);
8176
8177     if (typelen == 3 && !memcmp(type, "x11", 3)) {
8178         char *addrstr;
8179
8180         ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen);
8181         addrstr = snewn(peeraddrlen+1, char);
8182         memcpy(addrstr, peeraddr, peeraddrlen);
8183         addrstr[peeraddrlen] = '\0';
8184         peerport = ssh_pkt_getuint32(pktin);
8185
8186         logeventf(ssh, "Received X11 connect request from %s:%d",
8187                   addrstr, peerport);
8188
8189         if (!ssh->X11_fwd_enabled && !ssh->connshare)
8190             error = "X11 forwarding is not enabled";
8191         else {
8192             c->u.x11.xconn = x11_init(ssh->x11authtree, c,
8193                                       addrstr, peerport);
8194             c->type = CHAN_X11;
8195             c->u.x11.initial = TRUE;
8196
8197             /*
8198              * If we are a connection-sharing upstream, then we should
8199              * initially present a very small window, adequate to take
8200              * the X11 initial authorisation packet but not much more.
8201              * Downstream will then present us a larger window (by
8202              * fiat of the connection-sharing protocol) and we can
8203              * guarantee to send a positive-valued WINDOW_ADJUST.
8204              */
8205             if (ssh->connshare)
8206                 our_winsize_override = 128;
8207
8208             logevent("Opened X11 forward channel");
8209         }
8210
8211         sfree(addrstr);
8212     } else if (typelen == 15 &&
8213                !memcmp(type, "forwarded-tcpip", 15)) {
8214         struct ssh_rportfwd pf, *realpf;
8215         char *shost;
8216         int shostlen;
8217         ssh_pkt_getstring(pktin, &shost, &shostlen);/* skip address */
8218         pf.shost = dupprintf("%.*s", shostlen, shost);
8219         pf.sport = ssh_pkt_getuint32(pktin);
8220         ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen);
8221         peerport = ssh_pkt_getuint32(pktin);
8222         realpf = find234(ssh->rportfwds, &pf, NULL);
8223         logeventf(ssh, "Received remote port %s:%d open request "
8224                   "from %s:%d", pf.shost, pf.sport, peeraddr, peerport);
8225         sfree(pf.shost);
8226
8227         if (realpf == NULL) {
8228             error = "Remote port is not recognised";
8229         } else {
8230             char *err;
8231
8232             if (realpf->share_ctx) {
8233                 /*
8234                  * This port forwarding is on behalf of a
8235                  * connection-sharing downstream, so abandon our own
8236                  * channel-open procedure and just pass the message on
8237                  * to sshshare.c.
8238                  */
8239                 share_got_pkt_from_server(realpf->share_ctx, pktin->type,
8240                                           pktin->body, pktin->length);
8241                 sfree(c);
8242                 return;
8243             }
8244
8245             err = pfd_connect(&c->u.pfd.pf, realpf->dhost, realpf->dport,
8246                               c, ssh->conf, realpf->pfrec->addressfamily);
8247             logeventf(ssh, "Attempting to forward remote port to "
8248                       "%s:%d", realpf->dhost, realpf->dport);
8249             if (err != NULL) {
8250                 logeventf(ssh, "Port open failed: %s", err);
8251                 sfree(err);
8252                 error = "Port open failed";
8253             } else {
8254                 logevent("Forwarded port opened successfully");
8255                 c->type = CHAN_SOCKDATA;
8256             }
8257         }
8258     } else if (typelen == 22 &&
8259                !memcmp(type, "auth-agent@openssh.com", 22)) {
8260         if (!ssh->agentfwd_enabled)
8261             error = "Agent forwarding is not enabled";
8262         else {
8263             c->type = CHAN_AGENT;       /* identify channel type */
8264             c->u.a.lensofar = 0;
8265             c->u.a.message = NULL;
8266             c->u.a.outstanding_requests = 0;
8267         }
8268     } else {
8269         error = "Unsupported channel type requested";
8270     }
8271
8272     c->remoteid = remid;
8273     c->halfopen = FALSE;
8274     if (error) {
8275         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE);
8276         ssh2_pkt_adduint32(pktout, c->remoteid);
8277         ssh2_pkt_adduint32(pktout, SSH2_OPEN_CONNECT_FAILED);
8278         ssh2_pkt_addstring(pktout, error);
8279         ssh2_pkt_addstring(pktout, "en");       /* language tag */
8280         ssh2_pkt_send(ssh, pktout);
8281         logeventf(ssh, "Rejected channel open: %s", error);
8282         sfree(c);
8283     } else {
8284         ssh2_channel_init(c);
8285         c->v.v2.remwindow = winsize;
8286         c->v.v2.remmaxpkt = pktsize;
8287         if (our_winsize_override) {
8288             c->v.v2.locwindow = c->v.v2.locmaxwin = c->v.v2.remlocwin =
8289                 our_winsize_override;
8290         }
8291         add234(ssh->channels, c);
8292         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
8293         ssh2_pkt_adduint32(pktout, c->remoteid);
8294         ssh2_pkt_adduint32(pktout, c->localid);
8295         ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);
8296         ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT);      /* our max pkt size */
8297         ssh2_pkt_send(ssh, pktout);
8298     }
8299 }
8300
8301 void sshfwd_x11_sharing_handover(struct ssh_channel *c,
8302                                  void *share_cs, void *share_chan,
8303                                  const char *peer_addr, int peer_port,
8304                                  int endian, int protomajor, int protominor,
8305                                  const void *initial_data, int initial_len)
8306 {
8307     /*
8308      * This function is called when we've just discovered that an X
8309      * forwarding channel on which we'd been handling the initial auth
8310      * ourselves turns out to be destined for a connection-sharing
8311      * downstream. So we turn the channel into a CHAN_SHARING, meaning
8312      * that we completely stop tracking windows and buffering data and
8313      * just pass more or less unmodified SSH messages back and forth.
8314      */
8315     c->type = CHAN_SHARING;
8316     c->u.sharing.ctx = share_cs;
8317     share_setup_x11_channel(share_cs, share_chan,
8318                             c->localid, c->remoteid, c->v.v2.remwindow,
8319                             c->v.v2.remmaxpkt, c->v.v2.locwindow,
8320                             peer_addr, peer_port, endian,
8321                             protomajor, protominor,
8322                             initial_data, initial_len);
8323 }
8324
8325 void sshfwd_x11_is_local(struct ssh_channel *c)
8326 {
8327     /*
8328      * This function is called when we've just discovered that an X
8329      * forwarding channel is _not_ destined for a connection-sharing
8330      * downstream but we're going to handle it ourselves. We stop
8331      * presenting a cautiously small window and go into ordinary data
8332      * exchange mode.
8333      */
8334     c->u.x11.initial = FALSE;
8335     ssh2_set_window(c, ssh_is_simple(c->ssh) ? OUR_V2_BIGWIN : OUR_V2_WINSIZE);
8336 }
8337
8338 /*
8339  * Buffer banner messages for later display at some convenient point,
8340  * if we're going to display them.
8341  */
8342 static void ssh2_msg_userauth_banner(Ssh ssh, struct Packet *pktin)
8343 {
8344     /* Arbitrary limit to prevent unbounded inflation of buffer */
8345     if (conf_get_int(ssh->conf, CONF_ssh_show_banner) &&
8346         bufchain_size(&ssh->banner) <= 131072) {
8347         char *banner = NULL;
8348         int size = 0;
8349         ssh_pkt_getstring(pktin, &banner, &size);
8350         if (banner)
8351             bufchain_add(&ssh->banner, banner, size);
8352     }
8353 }
8354
8355 /* Helper function to deal with sending tty modes for "pty-req" */
8356 static void ssh2_send_ttymode(void *data, char *mode, char *val)
8357 {
8358     struct Packet *pktout = (struct Packet *)data;
8359     int i = 0;
8360     unsigned int arg = 0;
8361     while (strcmp(mode, ssh_ttymodes[i].mode) != 0) i++;
8362     if (i == lenof(ssh_ttymodes)) return;
8363     switch (ssh_ttymodes[i].type) {
8364       case TTY_OP_CHAR:
8365         arg = ssh_tty_parse_specchar(val);
8366         break;
8367       case TTY_OP_BOOL:
8368         arg = ssh_tty_parse_boolean(val);
8369         break;
8370     }
8371     ssh2_pkt_addbyte(pktout, ssh_ttymodes[i].opcode);
8372     ssh2_pkt_adduint32(pktout, arg);
8373 }
8374
8375 static void ssh2_setup_x11(struct ssh_channel *c, struct Packet *pktin,
8376                            void *ctx)
8377 {
8378     struct ssh2_setup_x11_state {
8379         int crLine;
8380     };
8381     Ssh ssh = c->ssh;
8382     struct Packet *pktout;
8383     crStateP(ssh2_setup_x11_state, ctx);
8384
8385     crBeginState;
8386
8387     logevent("Requesting X11 forwarding");
8388     pktout = ssh2_chanreq_init(ssh->mainchan, "x11-req",
8389                                ssh2_setup_x11, s);
8390     ssh2_pkt_addbool(pktout, 0);               /* many connections */
8391     ssh2_pkt_addstring(pktout, ssh->x11auth->protoname);
8392     ssh2_pkt_addstring(pktout, ssh->x11auth->datastring);
8393     ssh2_pkt_adduint32(pktout, ssh->x11disp->screennum);
8394     ssh2_pkt_send(ssh, pktout);
8395
8396     /* Wait to be called back with either a response packet, or NULL
8397      * meaning clean up and free our data */
8398     crReturnV;
8399
8400     if (pktin) {
8401         if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
8402             logevent("X11 forwarding enabled");
8403             ssh->X11_fwd_enabled = TRUE;
8404         } else
8405             logevent("X11 forwarding refused");
8406     }
8407
8408     crFinishFreeV;
8409 }
8410
8411 static void ssh2_setup_agent(struct ssh_channel *c, struct Packet *pktin,
8412                                    void *ctx)
8413 {
8414     struct ssh2_setup_agent_state {
8415         int crLine;
8416     };
8417     Ssh ssh = c->ssh;
8418     struct Packet *pktout;
8419     crStateP(ssh2_setup_agent_state, ctx);
8420
8421     crBeginState;
8422
8423     logevent("Requesting OpenSSH-style agent forwarding");
8424     pktout = ssh2_chanreq_init(ssh->mainchan, "auth-agent-req@openssh.com",
8425                                ssh2_setup_agent, s);
8426     ssh2_pkt_send(ssh, pktout);
8427
8428     /* Wait to be called back with either a response packet, or NULL
8429      * meaning clean up and free our data */
8430     crReturnV;
8431
8432     if (pktin) {
8433         if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
8434             logevent("Agent forwarding enabled");
8435             ssh->agentfwd_enabled = TRUE;
8436         } else
8437             logevent("Agent forwarding refused");
8438     }
8439
8440     crFinishFreeV;
8441 }
8442
8443 static void ssh2_setup_pty(struct ssh_channel *c, struct Packet *pktin,
8444                                  void *ctx)
8445 {
8446     struct ssh2_setup_pty_state {
8447         int crLine;
8448     };
8449     Ssh ssh = c->ssh;
8450     struct Packet *pktout;
8451     crStateP(ssh2_setup_pty_state, ctx);
8452
8453     crBeginState;
8454
8455     /* Unpick the terminal-speed string. */
8456     /* XXX perhaps we should allow no speeds to be sent. */
8457     ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */
8458     sscanf(conf_get_str(ssh->conf, CONF_termspeed), "%d,%d", &ssh->ospeed, &ssh->ispeed);
8459     /* Build the pty request. */
8460     pktout = ssh2_chanreq_init(ssh->mainchan, "pty-req",
8461                                ssh2_setup_pty, s);
8462     ssh2_pkt_addstring(pktout, conf_get_str(ssh->conf, CONF_termtype));
8463     ssh2_pkt_adduint32(pktout, ssh->term_width);
8464     ssh2_pkt_adduint32(pktout, ssh->term_height);
8465     ssh2_pkt_adduint32(pktout, 0);             /* pixel width */
8466     ssh2_pkt_adduint32(pktout, 0);             /* pixel height */
8467     ssh2_pkt_addstring_start(pktout);
8468     parse_ttymodes(ssh, ssh2_send_ttymode, (void *)pktout);
8469     ssh2_pkt_addbyte(pktout, SSH2_TTY_OP_ISPEED);
8470     ssh2_pkt_adduint32(pktout, ssh->ispeed);
8471     ssh2_pkt_addbyte(pktout, SSH2_TTY_OP_OSPEED);
8472     ssh2_pkt_adduint32(pktout, ssh->ospeed);
8473     ssh2_pkt_addstring_data(pktout, "\0", 1); /* TTY_OP_END */
8474     ssh2_pkt_send(ssh, pktout);
8475     ssh->state = SSH_STATE_INTERMED;
8476
8477     /* Wait to be called back with either a response packet, or NULL
8478      * meaning clean up and free our data */
8479     crReturnV;
8480
8481     if (pktin) {
8482         if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS) {
8483             logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)",
8484                       ssh->ospeed, ssh->ispeed);
8485             ssh->got_pty = TRUE;
8486         } else {
8487             c_write_str(ssh, "Server refused to allocate pty\r\n");
8488             ssh->editing = ssh->echoing = 1;
8489         }
8490     }
8491
8492     crFinishFreeV;
8493 }
8494
8495 static void ssh2_setup_env(struct ssh_channel *c, struct Packet *pktin,
8496                            void *ctx)
8497 {
8498     struct ssh2_setup_env_state {
8499         int crLine;
8500         int num_env, env_left, env_ok;
8501     };
8502     Ssh ssh = c->ssh;
8503     struct Packet *pktout;
8504     crStateP(ssh2_setup_env_state, ctx);
8505
8506     crBeginState;
8507
8508     /*
8509      * Send environment variables.
8510      * 
8511      * Simplest thing here is to send all the requests at once, and
8512      * then wait for a whole bunch of successes or failures.
8513      */
8514     s->num_env = 0;
8515     {
8516         char *key, *val;
8517
8518         for (val = conf_get_str_strs(ssh->conf, CONF_environmt, NULL, &key);
8519              val != NULL;
8520              val = conf_get_str_strs(ssh->conf, CONF_environmt, key, &key)) {
8521             pktout = ssh2_chanreq_init(ssh->mainchan, "env", ssh2_setup_env, s);
8522             ssh2_pkt_addstring(pktout, key);
8523             ssh2_pkt_addstring(pktout, val);
8524             ssh2_pkt_send(ssh, pktout);
8525
8526             s->num_env++;
8527         }
8528         if (s->num_env)
8529             logeventf(ssh, "Sent %d environment variables", s->num_env);
8530     }
8531
8532     if (s->num_env) {
8533         s->env_ok = 0;
8534         s->env_left = s->num_env;
8535
8536         while (s->env_left > 0) {
8537             /* Wait to be called back with either a response packet,
8538              * or NULL meaning clean up and free our data */
8539             crReturnV;
8540             if (!pktin) goto out;
8541             if (pktin->type == SSH2_MSG_CHANNEL_SUCCESS)
8542                 s->env_ok++;
8543             s->env_left--;
8544         }
8545
8546         if (s->env_ok == s->num_env) {
8547             logevent("All environment variables successfully set");
8548         } else if (s->env_ok == 0) {
8549             logevent("All environment variables refused");
8550             c_write_str(ssh, "Server refused to set environment variables\r\n");
8551         } else {
8552             logeventf(ssh, "%d environment variables refused",
8553                       s->num_env - s->env_ok);
8554             c_write_str(ssh, "Server refused to set all environment variables\r\n");
8555         }
8556     }
8557   out:;
8558     crFinishFreeV;
8559 }
8560
8561 /*
8562  * Handle the SSH-2 userauth and connection layers.
8563  */
8564 static void ssh2_msg_authconn(Ssh ssh, struct Packet *pktin)
8565 {
8566     do_ssh2_authconn(ssh, NULL, 0, pktin);
8567 }
8568
8569 static void ssh2_response_authconn(struct ssh_channel *c, struct Packet *pktin,
8570                                    void *ctx)
8571 {
8572     if (pktin)
8573         do_ssh2_authconn(c->ssh, NULL, 0, pktin);
8574 }
8575
8576 static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
8577                              struct Packet *pktin)
8578 {
8579     struct do_ssh2_authconn_state {
8580         int crLine;
8581         enum {
8582             AUTH_TYPE_NONE,
8583                 AUTH_TYPE_PUBLICKEY,
8584                 AUTH_TYPE_PUBLICKEY_OFFER_LOUD,
8585                 AUTH_TYPE_PUBLICKEY_OFFER_QUIET,
8586                 AUTH_TYPE_PASSWORD,
8587                 AUTH_TYPE_GSSAPI,      /* always QUIET */
8588                 AUTH_TYPE_KEYBOARD_INTERACTIVE,
8589                 AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET
8590         } type;
8591         int done_service_req;
8592         int gotit, need_pw, can_pubkey, can_passwd, can_keyb_inter;
8593         int tried_pubkey_config, done_agent;
8594 #ifndef NO_GSSAPI
8595         int can_gssapi;
8596         int tried_gssapi;
8597 #endif
8598         int kbd_inter_refused;
8599         int we_are_in, userauth_success;
8600         prompts_t *cur_prompt;
8601         int num_prompts;
8602         char *username;
8603         char *password;
8604         int got_username;
8605         void *publickey_blob;
8606         int publickey_bloblen;
8607         int publickey_encrypted;
8608         char *publickey_algorithm;
8609         char *publickey_comment;
8610         unsigned char agent_request[5], *agent_response, *agentp;
8611         int agent_responselen;
8612         unsigned char *pkblob_in_agent;
8613         int keyi, nkeys;
8614         char *pkblob, *alg, *commentp;
8615         int pklen, alglen, commentlen;
8616         int siglen, retlen, len;
8617         char *q, *agentreq, *ret;
8618         int try_send;
8619         struct Packet *pktout;
8620         Filename *keyfile;
8621 #ifndef NO_GSSAPI
8622         struct ssh_gss_library *gsslib;
8623         Ssh_gss_ctx gss_ctx;
8624         Ssh_gss_buf gss_buf;
8625         Ssh_gss_buf gss_rcvtok, gss_sndtok;
8626         Ssh_gss_name gss_srv_name;
8627         Ssh_gss_stat gss_stat;
8628 #endif
8629     };
8630     crState(do_ssh2_authconn_state);
8631
8632     crBeginState;
8633
8634     /* Register as a handler for all the messages this coroutine handles. */
8635     ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = ssh2_msg_authconn;
8636     ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = ssh2_msg_authconn;
8637     ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = ssh2_msg_authconn;
8638     ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = ssh2_msg_authconn;
8639     ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_authconn;
8640     ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = ssh2_msg_authconn;
8641     /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = ssh2_msg_authconn; duplicate case value */
8642     /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_REQUEST] = ssh2_msg_authconn; duplicate case value */
8643     ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = ssh2_msg_authconn;
8644     ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_authconn;
8645     ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = ssh2_msg_authconn;
8646     ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = ssh2_msg_authconn;
8647     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_authconn;
8648     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_authconn;
8649     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_authconn;
8650     ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_authconn;
8651     ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh2_msg_authconn;
8652     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = ssh2_msg_authconn;
8653     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_authconn;
8654     ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_authconn;
8655     
8656     s->done_service_req = FALSE;
8657     s->we_are_in = s->userauth_success = FALSE;
8658     s->agent_response = NULL;
8659 #ifndef NO_GSSAPI
8660     s->tried_gssapi = FALSE;
8661 #endif
8662
8663     if (!ssh->bare_connection) {
8664         if (!conf_get_int(ssh->conf, CONF_ssh_no_userauth)) {
8665             /*
8666              * Request userauth protocol, and await a response to it.
8667              */
8668             s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST);
8669             ssh2_pkt_addstring(s->pktout, "ssh-userauth");
8670             ssh2_pkt_send(ssh, s->pktout);
8671             crWaitUntilV(pktin);
8672             if (pktin->type == SSH2_MSG_SERVICE_ACCEPT)
8673                 s->done_service_req = TRUE;
8674         }
8675         if (!s->done_service_req) {
8676             /*
8677              * Request connection protocol directly, without authentication.
8678              */
8679             s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST);
8680             ssh2_pkt_addstring(s->pktout, "ssh-connection");
8681             ssh2_pkt_send(ssh, s->pktout);
8682             crWaitUntilV(pktin);
8683             if (pktin->type == SSH2_MSG_SERVICE_ACCEPT) {
8684                 s->we_are_in = TRUE; /* no auth required */
8685             } else {
8686                 bombout(("Server refused service request"));
8687                 crStopV;
8688             }
8689         }
8690     } else {
8691         s->we_are_in = TRUE;
8692     }
8693
8694     /* Arrange to be able to deal with any BANNERs that come in.
8695      * (We do this now as packets may come in during the next bit.) */
8696     bufchain_init(&ssh->banner);
8697     ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] =
8698         ssh2_msg_userauth_banner;
8699
8700     /*
8701      * Misc one-time setup for authentication.
8702      */
8703     s->publickey_blob = NULL;
8704     if (!s->we_are_in) {
8705
8706         /*
8707          * Load the public half of any configured public key file
8708          * for later use.
8709          */
8710         s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile);
8711         if (!filename_is_null(s->keyfile)) {
8712             int keytype;
8713             logeventf(ssh, "Reading private key file \"%.150s\"",
8714                       filename_to_str(s->keyfile));
8715             keytype = key_type(s->keyfile);
8716             if (keytype == SSH_KEYTYPE_SSH2) {
8717                 const char *error;
8718                 s->publickey_blob =
8719                     ssh2_userkey_loadpub(s->keyfile,
8720                                          &s->publickey_algorithm,
8721                                          &s->publickey_bloblen, 
8722                                          &s->publickey_comment, &error);
8723                 if (s->publickey_blob) {
8724                     s->publickey_encrypted =
8725                         ssh2_userkey_encrypted(s->keyfile, NULL);
8726                 } else {
8727                     char *msgbuf;
8728                     logeventf(ssh, "Unable to load private key (%s)", 
8729                               error);
8730                     msgbuf = dupprintf("Unable to load private key file "
8731                                        "\"%.150s\" (%s)\r\n",
8732                                        filename_to_str(s->keyfile),
8733                                        error);
8734                     c_write_str(ssh, msgbuf);
8735                     sfree(msgbuf);
8736                 }
8737             } else {
8738                 char *msgbuf;
8739                 logeventf(ssh, "Unable to use this key file (%s)",
8740                           key_type_to_str(keytype));
8741                 msgbuf = dupprintf("Unable to use key file \"%.150s\""
8742                                    " (%s)\r\n",
8743                                    filename_to_str(s->keyfile),
8744                                    key_type_to_str(keytype));
8745                 c_write_str(ssh, msgbuf);
8746                 sfree(msgbuf);
8747                 s->publickey_blob = NULL;
8748             }
8749         }
8750
8751         /*
8752          * Find out about any keys Pageant has (but if there's a
8753          * public key configured, filter out all others).
8754          */
8755         s->nkeys = 0;
8756         s->agent_response = NULL;
8757         s->pkblob_in_agent = NULL;
8758         if (conf_get_int(ssh->conf, CONF_tryagent) && agent_exists()) {
8759
8760             void *r;
8761
8762             logevent("Pageant is running. Requesting keys.");
8763
8764             /* Request the keys held by the agent. */
8765             PUT_32BIT(s->agent_request, 1);
8766             s->agent_request[4] = SSH2_AGENTC_REQUEST_IDENTITIES;
8767             if (!agent_query(s->agent_request, 5, &r, &s->agent_responselen,
8768                              ssh_agent_callback, ssh)) {
8769                 do {
8770                     crReturnV;
8771                     if (pktin) {
8772                         bombout(("Unexpected data from server while"
8773                                  " waiting for agent response"));
8774                         crStopV;
8775                     }
8776                 } while (pktin || inlen > 0);
8777                 r = ssh->agent_response;
8778                 s->agent_responselen = ssh->agent_response_len;
8779             }
8780             s->agent_response = (unsigned char *) r;
8781             if (s->agent_response && s->agent_responselen >= 5 &&
8782                 s->agent_response[4] == SSH2_AGENT_IDENTITIES_ANSWER) {
8783                 int keyi;
8784                 unsigned char *p;
8785                 p = s->agent_response + 5;
8786                 s->nkeys = toint(GET_32BIT(p));
8787
8788                 /*
8789                  * Vet the Pageant response to ensure that the key
8790                  * count and blob lengths make sense.
8791                  */
8792                 if (s->nkeys < 0) {
8793                     logeventf(ssh, "Pageant response contained a negative"
8794                               " key count %d", s->nkeys);
8795                     s->nkeys = 0;
8796                     goto done_agent_query;
8797                 } else {
8798                     unsigned char *q = p + 4;
8799                     int lenleft = s->agent_responselen - 5 - 4;
8800
8801                     for (keyi = 0; keyi < s->nkeys; keyi++) {
8802                         int bloblen, commentlen;
8803                         if (lenleft < 4) {
8804                             logeventf(ssh, "Pageant response was truncated");
8805                             s->nkeys = 0;
8806                             goto done_agent_query;
8807                         }
8808                         bloblen = toint(GET_32BIT(q));
8809                         if (bloblen < 0 || bloblen > lenleft) {
8810                             logeventf(ssh, "Pageant response was truncated");
8811                             s->nkeys = 0;
8812                             goto done_agent_query;
8813                         }
8814                         lenleft -= 4 + bloblen;
8815                         q += 4 + bloblen;
8816                         commentlen = toint(GET_32BIT(q));
8817                         if (commentlen < 0 || commentlen > lenleft) {
8818                             logeventf(ssh, "Pageant response was truncated");
8819                             s->nkeys = 0;
8820                             goto done_agent_query;
8821                         }
8822                         lenleft -= 4 + commentlen;
8823                         q += 4 + commentlen;
8824                     }
8825                 }
8826
8827                 p += 4;
8828                 logeventf(ssh, "Pageant has %d SSH-2 keys", s->nkeys);
8829                 if (s->publickey_blob) {
8830                     /* See if configured key is in agent. */
8831                     for (keyi = 0; keyi < s->nkeys; keyi++) {
8832                         s->pklen = toint(GET_32BIT(p));
8833                         if (s->pklen == s->publickey_bloblen &&
8834                             !memcmp(p+4, s->publickey_blob,
8835                                     s->publickey_bloblen)) {
8836                             logeventf(ssh, "Pageant key #%d matches "
8837                                       "configured key file", keyi);
8838                             s->keyi = keyi;
8839                             s->pkblob_in_agent = p;
8840                             break;
8841                         }
8842                         p += 4 + s->pklen;
8843                         p += toint(GET_32BIT(p)) + 4; /* comment */
8844                     }
8845                     if (!s->pkblob_in_agent) {
8846                         logevent("Configured key file not in Pageant");
8847                         s->nkeys = 0;
8848                     }
8849                 }
8850             } else {
8851                 logevent("Failed to get reply from Pageant");
8852             }
8853           done_agent_query:;
8854         }
8855
8856     }
8857
8858     /*
8859      * We repeat this whole loop, including the username prompt,
8860      * until we manage a successful authentication. If the user
8861      * types the wrong _password_, they can be sent back to the
8862      * beginning to try another username, if this is configured on.
8863      * (If they specify a username in the config, they are never
8864      * asked, even if they do give a wrong password.)
8865      * 
8866      * I think this best serves the needs of
8867      * 
8868      *  - the people who have no configuration, no keys, and just
8869      *    want to try repeated (username,password) pairs until they
8870      *    type both correctly
8871      * 
8872      *  - people who have keys and configuration but occasionally
8873      *    need to fall back to passwords
8874      * 
8875      *  - people with a key held in Pageant, who might not have
8876      *    logged in to a particular machine before; so they want to
8877      *    type a username, and then _either_ their key will be
8878      *    accepted, _or_ they will type a password. If they mistype
8879      *    the username they will want to be able to get back and
8880      *    retype it!
8881      */
8882     s->got_username = FALSE;
8883     while (!s->we_are_in) {
8884         /*
8885          * Get a username.
8886          */
8887         if (s->got_username && !conf_get_int(ssh->conf, CONF_change_username)) {
8888             /*
8889              * We got a username last time round this loop, and
8890              * with change_username turned off we don't try to get
8891              * it again.
8892              */
8893         } else if ((ssh->username = get_remote_username(ssh->conf)) == NULL) {
8894             int ret; /* need not be kept over crReturn */
8895             s->cur_prompt = new_prompts(ssh->frontend);
8896             s->cur_prompt->to_server = TRUE;
8897             s->cur_prompt->name = dupstr("SSH login name");
8898             add_prompt(s->cur_prompt, dupstr("login as: "), TRUE); 
8899             ret = get_userpass_input(s->cur_prompt, NULL, 0);
8900             while (ret < 0) {
8901                 ssh->send_ok = 1;
8902                 crWaitUntilV(!pktin);
8903                 ret = get_userpass_input(s->cur_prompt, in, inlen);
8904                 ssh->send_ok = 0;
8905             }
8906             if (!ret) {
8907                 /*
8908                  * get_userpass_input() failed to get a username.
8909                  * Terminate.
8910                  */
8911                 free_prompts(s->cur_prompt);
8912                 ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE);
8913                 crStopV;
8914             }
8915             ssh->username = dupstr(s->cur_prompt->prompts[0]->result);
8916             free_prompts(s->cur_prompt);
8917         } else {
8918             char *stuff;
8919             if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)) {
8920                 stuff = dupprintf("Using username \"%s\".\r\n", ssh->username);
8921                 c_write_str(ssh, stuff);
8922                 sfree(stuff);
8923             }
8924         }
8925         s->got_username = TRUE;
8926
8927         /*
8928          * Send an authentication request using method "none": (a)
8929          * just in case it succeeds, and (b) so that we know what
8930          * authentication methods we can usefully try next.
8931          */
8932         ssh->pkt_actx = SSH2_PKTCTX_NOAUTH;
8933
8934         s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
8935         ssh2_pkt_addstring(s->pktout, ssh->username);
8936         ssh2_pkt_addstring(s->pktout, "ssh-connection");/* service requested */
8937         ssh2_pkt_addstring(s->pktout, "none");    /* method */
8938         ssh2_pkt_send(ssh, s->pktout);
8939         s->type = AUTH_TYPE_NONE;
8940         s->gotit = FALSE;
8941         s->we_are_in = FALSE;
8942
8943         s->tried_pubkey_config = FALSE;
8944         s->kbd_inter_refused = FALSE;
8945
8946         /* Reset agent request state. */
8947         s->done_agent = FALSE;
8948         if (s->agent_response) {
8949             if (s->pkblob_in_agent) {
8950                 s->agentp = s->pkblob_in_agent;
8951             } else {
8952                 s->agentp = s->agent_response + 5 + 4;
8953                 s->keyi = 0;
8954             }
8955         }
8956
8957         while (1) {
8958             char *methods = NULL;
8959             int methlen = 0;
8960
8961             /*
8962              * Wait for the result of the last authentication request.
8963              */
8964             if (!s->gotit)
8965                 crWaitUntilV(pktin);
8966             /*
8967              * Now is a convenient point to spew any banner material
8968              * that we've accumulated. (This should ensure that when
8969              * we exit the auth loop, we haven't any left to deal
8970              * with.)
8971              */
8972             {
8973                 int size = bufchain_size(&ssh->banner);
8974                 /*
8975                  * Don't show the banner if we're operating in
8976                  * non-verbose non-interactive mode. (It's probably
8977                  * a script, which means nobody will read the
8978                  * banner _anyway_, and moreover the printing of
8979                  * the banner will screw up processing on the
8980                  * output of (say) plink.)
8981                  */
8982                 if (size && (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE))) {
8983                     char *banner = snewn(size, char);
8984                     bufchain_fetch(&ssh->banner, banner, size);
8985                     c_write_untrusted(ssh, banner, size);
8986                     sfree(banner);
8987                 }
8988                 bufchain_clear(&ssh->banner);
8989             }
8990             if (pktin->type == SSH2_MSG_USERAUTH_SUCCESS) {
8991                 logevent("Access granted");
8992                 s->we_are_in = s->userauth_success = TRUE;
8993                 break;
8994             }
8995
8996             if (pktin->type != SSH2_MSG_USERAUTH_FAILURE && s->type != AUTH_TYPE_GSSAPI) {
8997                 bombout(("Strange packet received during authentication: "
8998                          "type %d", pktin->type));
8999                 crStopV;
9000             }
9001
9002             s->gotit = FALSE;
9003
9004             /*
9005              * OK, we're now sitting on a USERAUTH_FAILURE message, so
9006              * we can look at the string in it and know what we can
9007              * helpfully try next.
9008              */
9009             if (pktin->type == SSH2_MSG_USERAUTH_FAILURE) {
9010                 ssh_pkt_getstring(pktin, &methods, &methlen);
9011                 if (!ssh2_pkt_getbool(pktin)) {
9012                     /*
9013                      * We have received an unequivocal Access
9014                      * Denied. This can translate to a variety of
9015                      * messages, or no message at all.
9016                      *
9017                      * For forms of authentication which are attempted
9018                      * implicitly, by which I mean without printing
9019                      * anything in the window indicating that we're
9020                      * trying them, we should never print 'Access
9021                      * denied'.
9022                      *
9023                      * If we do print a message saying that we're
9024                      * attempting some kind of authentication, it's OK
9025                      * to print a followup message saying it failed -
9026                      * but the message may sometimes be more specific
9027                      * than simply 'Access denied'.
9028                      *
9029                      * Additionally, if we'd just tried password
9030                      * authentication, we should break out of this
9031                      * whole loop so as to go back to the username
9032                      * prompt (iff we're configured to allow
9033                      * username change attempts).
9034                      */
9035                     if (s->type == AUTH_TYPE_NONE) {
9036                         /* do nothing */
9037                     } else if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD ||
9038                                s->type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) {
9039                         if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD)
9040                             c_write_str(ssh, "Server refused our key\r\n");
9041                         logevent("Server refused our key");
9042                     } else if (s->type == AUTH_TYPE_PUBLICKEY) {
9043                         /* This _shouldn't_ happen except by a
9044                          * protocol bug causing client and server to
9045                          * disagree on what is a correct signature. */
9046                         c_write_str(ssh, "Server refused public-key signature"
9047                                     " despite accepting key!\r\n");
9048                         logevent("Server refused public-key signature"
9049                                  " despite accepting key!");
9050                     } else if (s->type==AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET) {
9051                         /* quiet, so no c_write */
9052                         logevent("Server refused keyboard-interactive authentication");
9053                     } else if (s->type==AUTH_TYPE_GSSAPI) {
9054                         /* always quiet, so no c_write */
9055                         /* also, the code down in the GSSAPI block has
9056                          * already logged this in the Event Log */
9057                     } else if (s->type == AUTH_TYPE_KEYBOARD_INTERACTIVE) {
9058                         logevent("Keyboard-interactive authentication failed");
9059                         c_write_str(ssh, "Access denied\r\n");
9060                     } else {
9061                         assert(s->type == AUTH_TYPE_PASSWORD);
9062                         logevent("Password authentication failed");
9063                         c_write_str(ssh, "Access denied\r\n");
9064
9065                         if (conf_get_int(ssh->conf, CONF_change_username)) {
9066                             /* XXX perhaps we should allow
9067                              * keyboard-interactive to do this too? */
9068                             s->we_are_in = FALSE;
9069                             break;
9070                         }
9071                     }
9072                 } else {
9073                     c_write_str(ssh, "Further authentication required\r\n");
9074                     logevent("Further authentication required");
9075                 }
9076
9077                 s->can_pubkey =
9078                     in_commasep_string("publickey", methods, methlen);
9079                 s->can_passwd =
9080                     in_commasep_string("password", methods, methlen);
9081                 s->can_keyb_inter = conf_get_int(ssh->conf, CONF_try_ki_auth) &&
9082                     in_commasep_string("keyboard-interactive", methods, methlen);
9083 #ifndef NO_GSSAPI
9084                 if (!ssh->gsslibs)
9085                     ssh->gsslibs = ssh_gss_setup(ssh->conf);
9086                 s->can_gssapi = conf_get_int(ssh->conf, CONF_try_gssapi_auth) &&
9087                     in_commasep_string("gssapi-with-mic", methods, methlen) &&
9088                     ssh->gsslibs->nlibraries > 0;
9089 #endif
9090             }
9091
9092             ssh->pkt_actx = SSH2_PKTCTX_NOAUTH;
9093
9094             if (s->can_pubkey && !s->done_agent && s->nkeys) {
9095
9096                 /*
9097                  * Attempt public-key authentication using a key from Pageant.
9098                  */
9099
9100                 ssh->pkt_actx = SSH2_PKTCTX_PUBLICKEY;
9101
9102                 logeventf(ssh, "Trying Pageant key #%d", s->keyi);
9103
9104                 /* Unpack key from agent response */
9105                 s->pklen = toint(GET_32BIT(s->agentp));
9106                 s->agentp += 4;
9107                 s->pkblob = (char *)s->agentp;
9108                 s->agentp += s->pklen;
9109                 s->alglen = toint(GET_32BIT(s->pkblob));
9110                 s->alg = s->pkblob + 4;
9111                 s->commentlen = toint(GET_32BIT(s->agentp));
9112                 s->agentp += 4;
9113                 s->commentp = (char *)s->agentp;
9114                 s->agentp += s->commentlen;
9115                 /* s->agentp now points at next key, if any */
9116
9117                 /* See if server will accept it */
9118                 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9119                 ssh2_pkt_addstring(s->pktout, ssh->username);
9120                 ssh2_pkt_addstring(s->pktout, "ssh-connection");
9121                                                     /* service requested */
9122                 ssh2_pkt_addstring(s->pktout, "publickey");
9123                                                     /* method */
9124                 ssh2_pkt_addbool(s->pktout, FALSE); /* no signature included */
9125                 ssh2_pkt_addstring_start(s->pktout);
9126                 ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen);
9127                 ssh2_pkt_addstring_start(s->pktout);
9128                 ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen);
9129                 ssh2_pkt_send(ssh, s->pktout);
9130                 s->type = AUTH_TYPE_PUBLICKEY_OFFER_QUIET;
9131
9132                 crWaitUntilV(pktin);
9133                 if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) {
9134
9135                     /* Offer of key refused. */
9136                     s->gotit = TRUE;
9137
9138                 } else {
9139                     
9140                     void *vret;
9141
9142                     if (flags & FLAG_VERBOSE) {
9143                         c_write_str(ssh, "Authenticating with "
9144                                     "public key \"");
9145                         c_write(ssh, s->commentp, s->commentlen);
9146                         c_write_str(ssh, "\" from agent\r\n");
9147                     }
9148
9149                     /*
9150                      * Server is willing to accept the key.
9151                      * Construct a SIGN_REQUEST.
9152                      */
9153                     s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9154                     ssh2_pkt_addstring(s->pktout, ssh->username);
9155                     ssh2_pkt_addstring(s->pktout, "ssh-connection");
9156                                                         /* service requested */
9157                     ssh2_pkt_addstring(s->pktout, "publickey");
9158                                                         /* method */
9159                     ssh2_pkt_addbool(s->pktout, TRUE);  /* signature included */
9160                     ssh2_pkt_addstring_start(s->pktout);
9161                     ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen);
9162                     ssh2_pkt_addstring_start(s->pktout);
9163                     ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen);
9164
9165                     /* Ask agent for signature. */
9166                     s->siglen = s->pktout->length - 5 + 4 +
9167                         ssh->v2_session_id_len;
9168                     if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)
9169                         s->siglen -= 4;
9170                     s->len = 1;       /* message type */
9171                     s->len += 4 + s->pklen;     /* key blob */
9172                     s->len += 4 + s->siglen;    /* data to sign */
9173                     s->len += 4;      /* flags */
9174                     s->agentreq = snewn(4 + s->len, char);
9175                     PUT_32BIT(s->agentreq, s->len);
9176                     s->q = s->agentreq + 4;
9177                     *s->q++ = SSH2_AGENTC_SIGN_REQUEST;
9178                     PUT_32BIT(s->q, s->pklen);
9179                     s->q += 4;
9180                     memcpy(s->q, s->pkblob, s->pklen);
9181                     s->q += s->pklen;
9182                     PUT_32BIT(s->q, s->siglen);
9183                     s->q += 4;
9184                     /* Now the data to be signed... */
9185                     if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) {
9186                         PUT_32BIT(s->q, ssh->v2_session_id_len);
9187                         s->q += 4;
9188                     }
9189                     memcpy(s->q, ssh->v2_session_id,
9190                            ssh->v2_session_id_len);
9191                     s->q += ssh->v2_session_id_len;
9192                     memcpy(s->q, s->pktout->data + 5,
9193                            s->pktout->length - 5);
9194                     s->q += s->pktout->length - 5;
9195                     /* And finally the (zero) flags word. */
9196                     PUT_32BIT(s->q, 0);
9197                     if (!agent_query(s->agentreq, s->len + 4,
9198                                      &vret, &s->retlen,
9199                                      ssh_agent_callback, ssh)) {
9200                         do {
9201                             crReturnV;
9202                             if (pktin) {
9203                                 bombout(("Unexpected data from server"
9204                                          " while waiting for agent"
9205                                          " response"));
9206                                 crStopV;
9207                             }
9208                         } while (pktin || inlen > 0);
9209                         vret = ssh->agent_response;
9210                         s->retlen = ssh->agent_response_len;
9211                     }
9212                     s->ret = vret;
9213                     sfree(s->agentreq);
9214                     if (s->ret) {
9215                         if (s->retlen >= 9 &&
9216                             s->ret[4] == SSH2_AGENT_SIGN_RESPONSE &&
9217                             GET_32BIT(s->ret + 5) <= (unsigned)(s->retlen-9)) {
9218                             logevent("Sending Pageant's response");
9219                             ssh2_add_sigblob(ssh, s->pktout,
9220                                              s->pkblob, s->pklen,
9221                                              s->ret + 9,
9222                                              GET_32BIT(s->ret + 5));
9223                             ssh2_pkt_send(ssh, s->pktout);
9224                             s->type = AUTH_TYPE_PUBLICKEY;
9225                         } else {
9226                             /* FIXME: less drastic response */
9227                             bombout(("Pageant failed to answer challenge"));
9228                             crStopV;
9229                         }
9230                     }
9231                 }
9232
9233                 /* Do we have any keys left to try? */
9234                 if (s->pkblob_in_agent) {
9235                     s->done_agent = TRUE;
9236                     s->tried_pubkey_config = TRUE;
9237                 } else {
9238                     s->keyi++;
9239                     if (s->keyi >= s->nkeys)
9240                         s->done_agent = TRUE;
9241                 }
9242
9243             } else if (s->can_pubkey && s->publickey_blob &&
9244                        !s->tried_pubkey_config) {
9245
9246                 struct ssh2_userkey *key;   /* not live over crReturn */
9247                 char *passphrase;           /* not live over crReturn */
9248
9249                 ssh->pkt_actx = SSH2_PKTCTX_PUBLICKEY;
9250
9251                 s->tried_pubkey_config = TRUE;
9252
9253                 /*
9254                  * Try the public key supplied in the configuration.
9255                  *
9256                  * First, offer the public blob to see if the server is
9257                  * willing to accept it.
9258                  */
9259                 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9260                 ssh2_pkt_addstring(s->pktout, ssh->username);
9261                 ssh2_pkt_addstring(s->pktout, "ssh-connection");
9262                                                 /* service requested */
9263                 ssh2_pkt_addstring(s->pktout, "publickey");     /* method */
9264                 ssh2_pkt_addbool(s->pktout, FALSE);
9265                                                 /* no signature included */
9266                 ssh2_pkt_addstring(s->pktout, s->publickey_algorithm);
9267                 ssh2_pkt_addstring_start(s->pktout);
9268                 ssh2_pkt_addstring_data(s->pktout,
9269                                         (char *)s->publickey_blob,
9270                                         s->publickey_bloblen);
9271                 ssh2_pkt_send(ssh, s->pktout);
9272                 logevent("Offered public key");
9273
9274                 crWaitUntilV(pktin);
9275                 if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) {
9276                     /* Key refused. Give up. */
9277                     s->gotit = TRUE; /* reconsider message next loop */
9278                     s->type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD;
9279                     continue; /* process this new message */
9280                 }
9281                 logevent("Offer of public key accepted");
9282
9283                 /*
9284                  * Actually attempt a serious authentication using
9285                  * the key.
9286                  */
9287                 if (flags & FLAG_VERBOSE) {
9288                     c_write_str(ssh, "Authenticating with public key \"");
9289                     c_write_str(ssh, s->publickey_comment);
9290                     c_write_str(ssh, "\"\r\n");
9291                 }
9292                 key = NULL;
9293                 while (!key) {
9294                     const char *error;  /* not live over crReturn */
9295                     if (s->publickey_encrypted) {
9296                         /*
9297                          * Get a passphrase from the user.
9298                          */
9299                         int ret; /* need not be kept over crReturn */
9300                         s->cur_prompt = new_prompts(ssh->frontend);
9301                         s->cur_prompt->to_server = FALSE;
9302                         s->cur_prompt->name = dupstr("SSH key passphrase");
9303                         add_prompt(s->cur_prompt,
9304                                    dupprintf("Passphrase for key \"%.100s\": ",
9305                                              s->publickey_comment),
9306                                    FALSE);
9307                         ret = get_userpass_input(s->cur_prompt, NULL, 0);
9308                         while (ret < 0) {
9309                             ssh->send_ok = 1;
9310                             crWaitUntilV(!pktin);
9311                             ret = get_userpass_input(s->cur_prompt,
9312                                                      in, inlen);
9313                             ssh->send_ok = 0;
9314                         }
9315                         if (!ret) {
9316                             /* Failed to get a passphrase. Terminate. */
9317                             free_prompts(s->cur_prompt);
9318                             ssh_disconnect(ssh, NULL,
9319                                            "Unable to authenticate",
9320                                            SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
9321                                            TRUE);
9322                             crStopV;
9323                         }
9324                         passphrase =
9325                             dupstr(s->cur_prompt->prompts[0]->result);
9326                         free_prompts(s->cur_prompt);
9327                     } else {
9328                         passphrase = NULL; /* no passphrase needed */
9329                     }
9330
9331                     /*
9332                      * Try decrypting the key.
9333                      */
9334                     s->keyfile = conf_get_filename(ssh->conf, CONF_keyfile);
9335                     key = ssh2_load_userkey(s->keyfile, passphrase, &error);
9336                     if (passphrase) {
9337                         /* burn the evidence */
9338                         smemclr(passphrase, strlen(passphrase));
9339                         sfree(passphrase);
9340                     }
9341                     if (key == SSH2_WRONG_PASSPHRASE || key == NULL) {
9342                         if (passphrase &&
9343                             (key == SSH2_WRONG_PASSPHRASE)) {
9344                             c_write_str(ssh, "Wrong passphrase\r\n");
9345                             key = NULL;
9346                             /* and loop again */
9347                         } else {
9348                             c_write_str(ssh, "Unable to load private key (");
9349                             c_write_str(ssh, error);
9350                             c_write_str(ssh, ")\r\n");
9351                             key = NULL;
9352                             break; /* try something else */
9353                         }
9354                     }
9355                 }
9356
9357                 if (key) {
9358                     unsigned char *pkblob, *sigblob, *sigdata;
9359                     int pkblob_len, sigblob_len, sigdata_len;
9360                     int p;
9361
9362                     /*
9363                      * We have loaded the private key and the server
9364                      * has announced that it's willing to accept it.
9365                      * Hallelujah. Generate a signature and send it.
9366                      */
9367                     s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9368                     ssh2_pkt_addstring(s->pktout, ssh->username);
9369                     ssh2_pkt_addstring(s->pktout, "ssh-connection");
9370                                                     /* service requested */
9371                     ssh2_pkt_addstring(s->pktout, "publickey");
9372                                                     /* method */
9373                     ssh2_pkt_addbool(s->pktout, TRUE);
9374                                                     /* signature follows */
9375                     ssh2_pkt_addstring(s->pktout, key->alg->name);
9376                     pkblob = key->alg->public_blob(key->data,
9377                                                    &pkblob_len);
9378                     ssh2_pkt_addstring_start(s->pktout);
9379                     ssh2_pkt_addstring_data(s->pktout, (char *)pkblob,
9380                                             pkblob_len);
9381
9382                     /*
9383                      * The data to be signed is:
9384                      *
9385                      *   string  session-id
9386                      *
9387                      * followed by everything so far placed in the
9388                      * outgoing packet.
9389                      */
9390                     sigdata_len = s->pktout->length - 5 + 4 +
9391                         ssh->v2_session_id_len;
9392                     if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)
9393                         sigdata_len -= 4;
9394                     sigdata = snewn(sigdata_len, unsigned char);
9395                     p = 0;
9396                     if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) {
9397                         PUT_32BIT(sigdata+p, ssh->v2_session_id_len);
9398                         p += 4;
9399                     }
9400                     memcpy(sigdata+p, ssh->v2_session_id,
9401                            ssh->v2_session_id_len);
9402                     p += ssh->v2_session_id_len;
9403                     memcpy(sigdata+p, s->pktout->data + 5,
9404                            s->pktout->length - 5);
9405                     p += s->pktout->length - 5;
9406                     assert(p == sigdata_len);
9407                     sigblob = key->alg->sign(key->data, (char *)sigdata,
9408                                              sigdata_len, &sigblob_len);
9409                     ssh2_add_sigblob(ssh, s->pktout, pkblob, pkblob_len,
9410                                      sigblob, sigblob_len);
9411                     sfree(pkblob);
9412                     sfree(sigblob);
9413                     sfree(sigdata);
9414
9415                     ssh2_pkt_send(ssh, s->pktout);
9416                     logevent("Sent public key signature");
9417                     s->type = AUTH_TYPE_PUBLICKEY;
9418                     key->alg->freekey(key->data);
9419                 }
9420
9421 #ifndef NO_GSSAPI
9422             } else if (s->can_gssapi && !s->tried_gssapi) {
9423
9424                 /* GSSAPI Authentication */
9425
9426                 int micoffset, len;
9427                 char *data;
9428                 Ssh_gss_buf mic;
9429                 s->type = AUTH_TYPE_GSSAPI;
9430                 s->tried_gssapi = TRUE;
9431                 s->gotit = TRUE;
9432                 ssh->pkt_actx = SSH2_PKTCTX_GSSAPI;
9433
9434                 /*
9435                  * Pick the highest GSS library on the preference
9436                  * list.
9437                  */
9438                 {
9439                     int i, j;
9440                     s->gsslib = NULL;
9441                     for (i = 0; i < ngsslibs; i++) {
9442                         int want_id = conf_get_int_int(ssh->conf,
9443                                                        CONF_ssh_gsslist, i);
9444                         for (j = 0; j < ssh->gsslibs->nlibraries; j++)
9445                             if (ssh->gsslibs->libraries[j].id == want_id) {
9446                                 s->gsslib = &ssh->gsslibs->libraries[j];
9447                                 goto got_gsslib;   /* double break */
9448                             }
9449                     }
9450                     got_gsslib:
9451                     /*
9452                      * We always expect to have found something in
9453                      * the above loop: we only came here if there
9454                      * was at least one viable GSS library, and the
9455                      * preference list should always mention
9456                      * everything and only change the order.
9457                      */
9458                     assert(s->gsslib);
9459                 }
9460
9461                 if (s->gsslib->gsslogmsg)
9462                     logevent(s->gsslib->gsslogmsg);
9463
9464                 /* Sending USERAUTH_REQUEST with "gssapi-with-mic" method */
9465                 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9466                 ssh2_pkt_addstring(s->pktout, ssh->username);
9467                 ssh2_pkt_addstring(s->pktout, "ssh-connection");
9468                 ssh2_pkt_addstring(s->pktout, "gssapi-with-mic");
9469                 logevent("Attempting GSSAPI authentication");
9470
9471                 /* add mechanism info */
9472                 s->gsslib->indicate_mech(s->gsslib, &s->gss_buf);
9473
9474                 /* number of GSSAPI mechanisms */
9475                 ssh2_pkt_adduint32(s->pktout,1);
9476
9477                 /* length of OID + 2 */
9478                 ssh2_pkt_adduint32(s->pktout, s->gss_buf.length + 2);
9479                 ssh2_pkt_addbyte(s->pktout, SSH2_GSS_OIDTYPE);
9480
9481                 /* length of OID */
9482                 ssh2_pkt_addbyte(s->pktout, (unsigned char) s->gss_buf.length);
9483
9484                 ssh_pkt_adddata(s->pktout, s->gss_buf.value,
9485                                 s->gss_buf.length);
9486                 ssh2_pkt_send(ssh, s->pktout);
9487                 crWaitUntilV(pktin);
9488                 if (pktin->type != SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) {
9489                     logevent("GSSAPI authentication request refused");
9490                     continue;
9491                 }
9492
9493                 /* check returned packet ... */
9494
9495                 ssh_pkt_getstring(pktin, &data, &len);
9496                 s->gss_rcvtok.value = data;
9497                 s->gss_rcvtok.length = len;
9498                 if (s->gss_rcvtok.length != s->gss_buf.length + 2 ||
9499                     ((char *)s->gss_rcvtok.value)[0] != SSH2_GSS_OIDTYPE ||
9500                     ((char *)s->gss_rcvtok.value)[1] != s->gss_buf.length ||
9501                     memcmp((char *)s->gss_rcvtok.value + 2,
9502                            s->gss_buf.value,s->gss_buf.length) ) {
9503                     logevent("GSSAPI authentication - wrong response from server");
9504                     continue;
9505                 }
9506
9507                 /* now start running */
9508                 s->gss_stat = s->gsslib->import_name(s->gsslib,
9509                                                      ssh->fullhostname,
9510                                                      &s->gss_srv_name);
9511                 if (s->gss_stat != SSH_GSS_OK) {
9512                     if (s->gss_stat == SSH_GSS_BAD_HOST_NAME)
9513                         logevent("GSSAPI import name failed - Bad service name");
9514                     else
9515                         logevent("GSSAPI import name failed");
9516                     continue;
9517                 }
9518
9519                 /* fetch TGT into GSS engine */
9520                 s->gss_stat = s->gsslib->acquire_cred(s->gsslib, &s->gss_ctx);
9521
9522                 if (s->gss_stat != SSH_GSS_OK) {
9523                     logevent("GSSAPI authentication failed to get credentials");
9524                     s->gsslib->release_name(s->gsslib, &s->gss_srv_name);
9525                     continue;
9526                 }
9527
9528                 /* initial tokens are empty */
9529                 SSH_GSS_CLEAR_BUF(&s->gss_rcvtok);
9530                 SSH_GSS_CLEAR_BUF(&s->gss_sndtok);
9531
9532                 /* now enter the loop */
9533                 do {
9534                     s->gss_stat = s->gsslib->init_sec_context
9535                         (s->gsslib,
9536                          &s->gss_ctx,
9537                          s->gss_srv_name,
9538                          conf_get_int(ssh->conf, CONF_gssapifwd),
9539                          &s->gss_rcvtok,
9540                          &s->gss_sndtok);
9541
9542                     if (s->gss_stat!=SSH_GSS_S_COMPLETE &&
9543                         s->gss_stat!=SSH_GSS_S_CONTINUE_NEEDED) {
9544                         logevent("GSSAPI authentication initialisation failed");
9545
9546                         if (s->gsslib->display_status(s->gsslib, s->gss_ctx,
9547                                                       &s->gss_buf) == SSH_GSS_OK) {
9548                             logevent(s->gss_buf.value);
9549                             sfree(s->gss_buf.value);
9550                         }
9551
9552                         break;
9553                     }
9554                     logevent("GSSAPI authentication initialised");
9555
9556                     /* Client and server now exchange tokens until GSSAPI
9557                      * no longer says CONTINUE_NEEDED */
9558
9559                     if (s->gss_sndtok.length != 0) {
9560                         s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_GSSAPI_TOKEN);
9561                         ssh_pkt_addstring_start(s->pktout);
9562                         ssh_pkt_addstring_data(s->pktout,s->gss_sndtok.value,s->gss_sndtok.length);
9563                         ssh2_pkt_send(ssh, s->pktout);
9564                         s->gsslib->free_tok(s->gsslib, &s->gss_sndtok);
9565                     }
9566
9567                     if (s->gss_stat == SSH_GSS_S_CONTINUE_NEEDED) {
9568                         crWaitUntilV(pktin);
9569                         if (pktin->type != SSH2_MSG_USERAUTH_GSSAPI_TOKEN) {
9570                             logevent("GSSAPI authentication - bad server response");
9571                             s->gss_stat = SSH_GSS_FAILURE;
9572                             break;
9573                         }
9574                         ssh_pkt_getstring(pktin, &data, &len);
9575                         s->gss_rcvtok.value = data;
9576                         s->gss_rcvtok.length = len;
9577                     }
9578                 } while (s-> gss_stat == SSH_GSS_S_CONTINUE_NEEDED);
9579
9580                 if (s->gss_stat != SSH_GSS_OK) {
9581                     s->gsslib->release_name(s->gsslib, &s->gss_srv_name);
9582                     s->gsslib->release_cred(s->gsslib, &s->gss_ctx);
9583                     continue;
9584                 }
9585                 logevent("GSSAPI authentication loop finished OK");
9586
9587                 /* Now send the MIC */
9588
9589                 s->pktout = ssh2_pkt_init(0);
9590                 micoffset = s->pktout->length;
9591                 ssh_pkt_addstring_start(s->pktout);
9592                 ssh_pkt_addstring_data(s->pktout, (char *)ssh->v2_session_id, ssh->v2_session_id_len);
9593                 ssh_pkt_addbyte(s->pktout, SSH2_MSG_USERAUTH_REQUEST);
9594                 ssh_pkt_addstring(s->pktout, ssh->username);
9595                 ssh_pkt_addstring(s->pktout, "ssh-connection");
9596                 ssh_pkt_addstring(s->pktout, "gssapi-with-mic");
9597
9598                 s->gss_buf.value = (char *)s->pktout->data + micoffset;
9599                 s->gss_buf.length = s->pktout->length - micoffset;
9600
9601                 s->gsslib->get_mic(s->gsslib, s->gss_ctx, &s->gss_buf, &mic);
9602                 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_GSSAPI_MIC);
9603                 ssh_pkt_addstring_start(s->pktout);
9604                 ssh_pkt_addstring_data(s->pktout, mic.value, mic.length);
9605                 ssh2_pkt_send(ssh, s->pktout);
9606                 s->gsslib->free_mic(s->gsslib, &mic);
9607
9608                 s->gotit = FALSE;
9609
9610                 s->gsslib->release_name(s->gsslib, &s->gss_srv_name);
9611                 s->gsslib->release_cred(s->gsslib, &s->gss_ctx);
9612                 continue;
9613 #endif
9614             } else if (s->can_keyb_inter && !s->kbd_inter_refused) {
9615
9616                 /*
9617                  * Keyboard-interactive authentication.
9618                  */
9619
9620                 s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE;
9621
9622                 ssh->pkt_actx = SSH2_PKTCTX_KBDINTER;
9623
9624                 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9625                 ssh2_pkt_addstring(s->pktout, ssh->username);
9626                 ssh2_pkt_addstring(s->pktout, "ssh-connection");
9627                                                         /* service requested */
9628                 ssh2_pkt_addstring(s->pktout, "keyboard-interactive");
9629                                                         /* method */
9630                 ssh2_pkt_addstring(s->pktout, "");      /* lang */
9631                 ssh2_pkt_addstring(s->pktout, "");      /* submethods */
9632                 ssh2_pkt_send(ssh, s->pktout);
9633                 
9634                 logevent("Attempting keyboard-interactive authentication");
9635
9636                 crWaitUntilV(pktin);
9637                 if (pktin->type != SSH2_MSG_USERAUTH_INFO_REQUEST) {
9638                     /* Server is not willing to do keyboard-interactive
9639                      * at all (or, bizarrely but legally, accepts the
9640                      * user without actually issuing any prompts).
9641                      * Give up on it entirely. */
9642                     s->gotit = TRUE;
9643                     s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET;
9644                     s->kbd_inter_refused = TRUE; /* don't try it again */
9645                     continue;
9646                 }
9647
9648                 /*
9649                  * Loop while the server continues to send INFO_REQUESTs.
9650                  */
9651                 while (pktin->type == SSH2_MSG_USERAUTH_INFO_REQUEST) {
9652
9653                     char *name, *inst, *lang;
9654                     int name_len, inst_len, lang_len;
9655                     int i;
9656
9657                     /*
9658                      * We've got a fresh USERAUTH_INFO_REQUEST.
9659                      * Get the preamble and start building a prompt.
9660                      */
9661                     ssh_pkt_getstring(pktin, &name, &name_len);
9662                     ssh_pkt_getstring(pktin, &inst, &inst_len);
9663                     ssh_pkt_getstring(pktin, &lang, &lang_len);
9664                     s->cur_prompt = new_prompts(ssh->frontend);
9665                     s->cur_prompt->to_server = TRUE;
9666
9667                     /*
9668                      * Get any prompt(s) from the packet.
9669                      */
9670                     s->num_prompts = ssh_pkt_getuint32(pktin);
9671                     for (i = 0; i < s->num_prompts; i++) {
9672                         char *prompt;
9673                         int prompt_len;
9674                         int echo;
9675                         static char noprompt[] =
9676                             "<server failed to send prompt>: ";
9677
9678                         ssh_pkt_getstring(pktin, &prompt, &prompt_len);
9679                         echo = ssh2_pkt_getbool(pktin);
9680                         if (!prompt_len) {
9681                             prompt = noprompt;
9682                             prompt_len = lenof(noprompt)-1;
9683                         }
9684                         add_prompt(s->cur_prompt,
9685                                    dupprintf("%.*s", prompt_len, prompt),
9686                                    echo);
9687                     }
9688
9689                     if (name_len) {
9690                         /* FIXME: better prefix to distinguish from
9691                          * local prompts? */
9692                         s->cur_prompt->name =
9693                             dupprintf("SSH server: %.*s", name_len, name);
9694                         s->cur_prompt->name_reqd = TRUE;
9695                     } else {
9696                         s->cur_prompt->name =
9697                             dupstr("SSH server authentication");
9698                         s->cur_prompt->name_reqd = FALSE;
9699                     }
9700                     /* We add a prefix to try to make it clear that a prompt
9701                      * has come from the server.
9702                      * FIXME: ugly to print "Using..." in prompt _every_
9703                      * time round. Can this be done more subtly? */
9704                     /* Special case: for reasons best known to themselves,
9705                      * some servers send k-i requests with no prompts and
9706                      * nothing to display. Keep quiet in this case. */
9707                     if (s->num_prompts || name_len || inst_len) {
9708                         s->cur_prompt->instruction =
9709                             dupprintf("Using keyboard-interactive authentication.%s%.*s",
9710                                       inst_len ? "\n" : "", inst_len, inst);
9711                         s->cur_prompt->instr_reqd = TRUE;
9712                     } else {
9713                         s->cur_prompt->instr_reqd = FALSE;
9714                     }
9715
9716                     /*
9717                      * Display any instructions, and get the user's
9718                      * response(s).
9719                      */
9720                     {
9721                         int ret; /* not live over crReturn */
9722                         ret = get_userpass_input(s->cur_prompt, NULL, 0);
9723                         while (ret < 0) {
9724                             ssh->send_ok = 1;
9725                             crWaitUntilV(!pktin);
9726                             ret = get_userpass_input(s->cur_prompt, in, inlen);
9727                             ssh->send_ok = 0;
9728                         }
9729                         if (!ret) {
9730                             /*
9731                              * Failed to get responses. Terminate.
9732                              */
9733                             free_prompts(s->cur_prompt);
9734                             ssh_disconnect(ssh, NULL, "Unable to authenticate",
9735                                            SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
9736                                            TRUE);
9737                             crStopV;
9738                         }
9739                     }
9740
9741                     /*
9742                      * Send the response(s) to the server.
9743                      */
9744                     s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE);
9745                     ssh2_pkt_adduint32(s->pktout, s->num_prompts);
9746                     for (i=0; i < s->num_prompts; i++) {
9747                         ssh2_pkt_addstring(s->pktout,
9748                                            s->cur_prompt->prompts[i]->result);
9749                     }
9750                     ssh2_pkt_send_with_padding(ssh, s->pktout, 256);
9751
9752                     /*
9753                      * Free the prompts structure from this iteration.
9754                      * If there's another, a new one will be allocated
9755                      * when we return to the top of this while loop.
9756                      */
9757                     free_prompts(s->cur_prompt);
9758
9759                     /*
9760                      * Get the next packet in case it's another
9761                      * INFO_REQUEST.
9762                      */
9763                     crWaitUntilV(pktin);
9764
9765                 }
9766
9767                 /*
9768                  * We should have SUCCESS or FAILURE now.
9769                  */
9770                 s->gotit = TRUE;
9771
9772             } else if (s->can_passwd) {
9773
9774                 /*
9775                  * Plain old password authentication.
9776                  */
9777                 int ret; /* not live over crReturn */
9778                 int changereq_first_time; /* not live over crReturn */
9779
9780                 ssh->pkt_actx = SSH2_PKTCTX_PASSWORD;
9781
9782                 s->cur_prompt = new_prompts(ssh->frontend);
9783                 s->cur_prompt->to_server = TRUE;
9784                 s->cur_prompt->name = dupstr("SSH password");
9785                 add_prompt(s->cur_prompt, dupprintf("%s@%s's password: ",
9786                                                     ssh->username,
9787                                                     ssh->savedhost),
9788                            FALSE);
9789
9790                 ret = get_userpass_input(s->cur_prompt, NULL, 0);
9791                 while (ret < 0) {
9792                     ssh->send_ok = 1;
9793                     crWaitUntilV(!pktin);
9794                     ret = get_userpass_input(s->cur_prompt, in, inlen);
9795                     ssh->send_ok = 0;
9796                 }
9797                 if (!ret) {
9798                     /*
9799                      * Failed to get responses. Terminate.
9800                      */
9801                     free_prompts(s->cur_prompt);
9802                     ssh_disconnect(ssh, NULL, "Unable to authenticate",
9803                                    SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
9804                                    TRUE);
9805                     crStopV;
9806                 }
9807                 /*
9808                  * Squirrel away the password. (We may need it later if
9809                  * asked to change it.)
9810                  */
9811                 s->password = dupstr(s->cur_prompt->prompts[0]->result);
9812                 free_prompts(s->cur_prompt);
9813
9814                 /*
9815                  * Send the password packet.
9816                  *
9817                  * We pad out the password packet to 256 bytes to make
9818                  * it harder for an attacker to find the length of the
9819                  * user's password.
9820                  *
9821                  * Anyone using a password longer than 256 bytes
9822                  * probably doesn't have much to worry about from
9823                  * people who find out how long their password is!
9824                  */
9825                 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9826                 ssh2_pkt_addstring(s->pktout, ssh->username);
9827                 ssh2_pkt_addstring(s->pktout, "ssh-connection");
9828                                                         /* service requested */
9829                 ssh2_pkt_addstring(s->pktout, "password");
9830                 ssh2_pkt_addbool(s->pktout, FALSE);
9831                 ssh2_pkt_addstring(s->pktout, s->password);
9832                 ssh2_pkt_send_with_padding(ssh, s->pktout, 256);
9833                 logevent("Sent password");
9834                 s->type = AUTH_TYPE_PASSWORD;
9835
9836                 /*
9837                  * Wait for next packet, in case it's a password change
9838                  * request.
9839                  */
9840                 crWaitUntilV(pktin);
9841                 changereq_first_time = TRUE;
9842
9843                 while (pktin->type == SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ) {
9844
9845                     /* 
9846                      * We're being asked for a new password
9847                      * (perhaps not for the first time).
9848                      * Loop until the server accepts it.
9849                      */
9850
9851                     int got_new = FALSE; /* not live over crReturn */
9852                     char *prompt;   /* not live over crReturn */
9853                     int prompt_len; /* not live over crReturn */
9854                     
9855                     {
9856                         char *msg;
9857                         if (changereq_first_time)
9858                             msg = "Server requested password change";
9859                         else
9860                             msg = "Server rejected new password";
9861                         logevent(msg);
9862                         c_write_str(ssh, msg);
9863                         c_write_str(ssh, "\r\n");
9864                     }
9865
9866                     ssh_pkt_getstring(pktin, &prompt, &prompt_len);
9867
9868                     s->cur_prompt = new_prompts(ssh->frontend);
9869                     s->cur_prompt->to_server = TRUE;
9870                     s->cur_prompt->name = dupstr("New SSH password");
9871                     s->cur_prompt->instruction =
9872                         dupprintf("%.*s", prompt_len, prompt);
9873                     s->cur_prompt->instr_reqd = TRUE;
9874                     /*
9875                      * There's no explicit requirement in the protocol
9876                      * for the "old" passwords in the original and
9877                      * password-change messages to be the same, and
9878                      * apparently some Cisco kit supports password change
9879                      * by the user entering a blank password originally
9880                      * and the real password subsequently, so,
9881                      * reluctantly, we prompt for the old password again.
9882                      *
9883                      * (On the other hand, some servers don't even bother
9884                      * to check this field.)
9885                      */
9886                     add_prompt(s->cur_prompt,
9887                                dupstr("Current password (blank for previously entered password): "),
9888                                FALSE);
9889                     add_prompt(s->cur_prompt, dupstr("Enter new password: "),
9890                                FALSE);
9891                     add_prompt(s->cur_prompt, dupstr("Confirm new password: "),
9892                                FALSE);
9893
9894                     /*
9895                      * Loop until the user manages to enter the same
9896                      * password twice.
9897                      */
9898                     while (!got_new) {
9899
9900                         ret = get_userpass_input(s->cur_prompt, NULL, 0);
9901                         while (ret < 0) {
9902                             ssh->send_ok = 1;
9903                             crWaitUntilV(!pktin);
9904                             ret = get_userpass_input(s->cur_prompt, in, inlen);
9905                             ssh->send_ok = 0;
9906                         }
9907                         if (!ret) {
9908                             /*
9909                              * Failed to get responses. Terminate.
9910                              */
9911                             /* burn the evidence */
9912                             free_prompts(s->cur_prompt);
9913                             smemclr(s->password, strlen(s->password));
9914                             sfree(s->password);
9915                             ssh_disconnect(ssh, NULL, "Unable to authenticate",
9916                                            SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER,
9917                                            TRUE);
9918                             crStopV;
9919                         }
9920
9921                         /*
9922                          * If the user specified a new original password
9923                          * (IYSWIM), overwrite any previously specified
9924                          * one.
9925                          * (A side effect is that the user doesn't have to
9926                          * re-enter it if they louse up the new password.)
9927                          */
9928                         if (s->cur_prompt->prompts[0]->result[0]) {
9929                             smemclr(s->password, strlen(s->password));
9930                                 /* burn the evidence */
9931                             sfree(s->password);
9932                             s->password =
9933                                 dupstr(s->cur_prompt->prompts[0]->result);
9934                         }
9935
9936                         /*
9937                          * Check the two new passwords match.
9938                          */
9939                         got_new = (strcmp(s->cur_prompt->prompts[1]->result,
9940                                           s->cur_prompt->prompts[2]->result)
9941                                    == 0);
9942                         if (!got_new)
9943                             /* They don't. Silly user. */
9944                             c_write_str(ssh, "Passwords do not match\r\n");
9945
9946                     }
9947
9948                     /*
9949                      * Send the new password (along with the old one).
9950                      * (see above for padding rationale)
9951                      */
9952                     s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
9953                     ssh2_pkt_addstring(s->pktout, ssh->username);
9954                     ssh2_pkt_addstring(s->pktout, "ssh-connection");
9955                                                         /* service requested */
9956                     ssh2_pkt_addstring(s->pktout, "password");
9957                     ssh2_pkt_addbool(s->pktout, TRUE);
9958                     ssh2_pkt_addstring(s->pktout, s->password);
9959                     ssh2_pkt_addstring(s->pktout,
9960                                        s->cur_prompt->prompts[1]->result);
9961                     free_prompts(s->cur_prompt);
9962                     ssh2_pkt_send_with_padding(ssh, s->pktout, 256);
9963                     logevent("Sent new password");
9964                     
9965                     /*
9966                      * Now see what the server has to say about it.
9967                      * (If it's CHANGEREQ again, it's not happy with the
9968                      * new password.)
9969                      */
9970                     crWaitUntilV(pktin);
9971                     changereq_first_time = FALSE;
9972
9973                 }
9974
9975                 /*
9976                  * We need to reexamine the current pktin at the top
9977                  * of the loop. Either:
9978                  *  - we weren't asked to change password at all, in
9979                  *    which case it's a SUCCESS or FAILURE with the
9980                  *    usual meaning
9981                  *  - we sent a new password, and the server was
9982                  *    either OK with it (SUCCESS or FAILURE w/partial
9983                  *    success) or unhappy with the _old_ password
9984                  *    (FAILURE w/o partial success)
9985                  * In any of these cases, we go back to the top of
9986                  * the loop and start again.
9987                  */
9988                 s->gotit = TRUE;
9989
9990                 /*
9991                  * We don't need the old password any more, in any
9992                  * case. Burn the evidence.
9993                  */
9994                 smemclr(s->password, strlen(s->password));
9995                 sfree(s->password);
9996
9997             } else {
9998                 char *str = dupprintf("No supported authentication methods available"
9999                                       " (server sent: %.*s)",
10000                                       methlen, methods);
10001
10002                 ssh_disconnect(ssh, str,
10003                                "No supported authentication methods available",
10004                                SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE,
10005                                FALSE);
10006                 sfree(str);
10007
10008                 crStopV;
10009
10010             }
10011
10012         }
10013     }
10014     ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = NULL;
10015
10016     /* Clear up various bits and pieces from authentication. */
10017     if (s->publickey_blob) {
10018         sfree(s->publickey_blob);
10019         sfree(s->publickey_comment);
10020     }
10021     if (s->agent_response)
10022         sfree(s->agent_response);
10023
10024     if (s->userauth_success && !ssh->bare_connection) {
10025         /*
10026          * We've just received USERAUTH_SUCCESS, and we haven't sent any
10027          * packets since. Signal the transport layer to consider enacting
10028          * delayed compression.
10029          *
10030          * (Relying on we_are_in is not sufficient, as
10031          * draft-miller-secsh-compression-delayed is quite clear that it
10032          * triggers on USERAUTH_SUCCESS specifically, and we_are_in can
10033          * become set for other reasons.)
10034          */
10035         do_ssh2_transport(ssh, "enabling delayed compression", -2, NULL);
10036     }
10037
10038     ssh->channels = newtree234(ssh_channelcmp);
10039
10040     /*
10041      * Set up handlers for some connection protocol messages, so we
10042      * don't have to handle them repeatedly in this coroutine.
10043      */
10044     ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] =
10045         ssh2_msg_channel_window_adjust;
10046     ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] =
10047         ssh2_msg_global_request;
10048
10049     /*
10050      * Create the main session channel.
10051      */
10052     if (conf_get_int(ssh->conf, CONF_ssh_no_shell)) {
10053         ssh->mainchan = NULL;
10054     } else {
10055         ssh->mainchan = snew(struct ssh_channel);
10056         ssh->mainchan->ssh = ssh;
10057         ssh2_channel_init(ssh->mainchan);
10058
10059         if (*conf_get_str(ssh->conf, CONF_ssh_nc_host)) {
10060             /*
10061              * Just start a direct-tcpip channel and use it as the main
10062              * channel.
10063              */
10064             ssh_send_port_open(ssh->mainchan,
10065                                conf_get_str(ssh->conf, CONF_ssh_nc_host),
10066                                conf_get_int(ssh->conf, CONF_ssh_nc_port),
10067                                "main channel");
10068             ssh->ncmode = TRUE;
10069         } else {
10070             s->pktout = ssh2_chanopen_init(ssh->mainchan, "session");
10071             logevent("Opening session as main channel");
10072             ssh2_pkt_send(ssh, s->pktout);
10073             ssh->ncmode = FALSE;
10074         }
10075         crWaitUntilV(pktin);
10076         if (pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) {
10077             bombout(("Server refused to open channel"));
10078             crStopV;
10079             /* FIXME: error data comes back in FAILURE packet */
10080         }
10081         if (ssh_pkt_getuint32(pktin) != ssh->mainchan->localid) {
10082             bombout(("Server's channel confirmation cited wrong channel"));
10083             crStopV;
10084         }
10085         ssh->mainchan->remoteid = ssh_pkt_getuint32(pktin);
10086         ssh->mainchan->halfopen = FALSE;
10087         ssh->mainchan->type = CHAN_MAINSESSION;
10088         ssh->mainchan->v.v2.remwindow = ssh_pkt_getuint32(pktin);
10089         ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin);
10090         add234(ssh->channels, ssh->mainchan);
10091         update_specials_menu(ssh->frontend);
10092         logevent("Opened main channel");
10093     }
10094
10095     /*
10096      * Now we have a channel, make dispatch table entries for
10097      * general channel-based messages.
10098      */
10099     ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] =
10100     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] =
10101         ssh2_msg_channel_data;
10102     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_channel_eof;
10103     ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_channel_close;
10104     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] =
10105         ssh2_msg_channel_open_confirmation;
10106     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] =
10107         ssh2_msg_channel_open_failure;
10108     ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] =
10109         ssh2_msg_channel_request;
10110     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] =
10111         ssh2_msg_channel_open;
10112     ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_channel_response;
10113     ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_channel_response;
10114
10115     /*
10116      * Now the connection protocol is properly up and running, with
10117      * all those dispatch table entries, so it's safe to let
10118      * downstreams start trying to open extra channels through us.
10119      */
10120     if (ssh->connshare)
10121         share_activate(ssh->connshare, ssh->v_s);
10122
10123     if (ssh->mainchan && ssh_is_simple(ssh)) {
10124         /*
10125          * This message indicates to the server that we promise
10126          * not to try to run any other channel in parallel with
10127          * this one, so it's safe for it to advertise a very large
10128          * window and leave the flow control to TCP.
10129          */
10130         s->pktout = ssh2_chanreq_init(ssh->mainchan,
10131                                       "simple@putty.projects.tartarus.org",
10132                                       NULL, NULL);
10133         ssh2_pkt_send(ssh, s->pktout);
10134     }
10135
10136     /*
10137      * Enable port forwardings.
10138      */
10139     ssh_setup_portfwd(ssh, ssh->conf);
10140
10141     if (ssh->mainchan && !ssh->ncmode) {
10142         /*
10143          * Send the CHANNEL_REQUESTS for the main session channel.
10144          * Each one is handled by its own little asynchronous
10145          * co-routine.
10146          */
10147
10148         /* Potentially enable X11 forwarding. */
10149         if (conf_get_int(ssh->conf, CONF_x11_forward)) {
10150             ssh->x11disp =
10151                 x11_setup_display(conf_get_str(ssh->conf, CONF_x11_display),
10152                                   ssh->conf);
10153             if (!ssh->x11disp) {
10154                 /* FIXME: return an error message from x11_setup_display */
10155                 logevent("X11 forwarding not enabled: unable to"
10156                          " initialise X display");
10157             } else {
10158                 ssh->x11auth = x11_invent_fake_auth
10159                     (ssh->x11authtree, conf_get_int(ssh->conf, CONF_x11_auth));
10160                 ssh->x11auth->disp = ssh->x11disp;
10161
10162                 ssh2_setup_x11(ssh->mainchan, NULL, NULL);
10163             }
10164         }
10165
10166         /* Potentially enable agent forwarding. */
10167         if (ssh_agent_forwarding_permitted(ssh))
10168             ssh2_setup_agent(ssh->mainchan, NULL, NULL);
10169
10170         /* Now allocate a pty for the session. */
10171         if (!conf_get_int(ssh->conf, CONF_nopty))
10172             ssh2_setup_pty(ssh->mainchan, NULL, NULL);
10173
10174         /* Send environment variables. */
10175         ssh2_setup_env(ssh->mainchan, NULL, NULL);
10176
10177         /*
10178          * Start a shell or a remote command. We may have to attempt
10179          * this twice if the config data has provided a second choice
10180          * of command.
10181          */
10182         while (1) {
10183             int subsys;
10184             char *cmd;
10185
10186             if (ssh->fallback_cmd) {
10187                 subsys = conf_get_int(ssh->conf, CONF_ssh_subsys2);
10188                 cmd = conf_get_str(ssh->conf, CONF_remote_cmd2);
10189             } else {
10190                 subsys = conf_get_int(ssh->conf, CONF_ssh_subsys);
10191                 cmd = conf_get_str(ssh->conf, CONF_remote_cmd);
10192             }
10193
10194             if (subsys) {
10195                 s->pktout = ssh2_chanreq_init(ssh->mainchan, "subsystem",
10196                                               ssh2_response_authconn, NULL);
10197                 ssh2_pkt_addstring(s->pktout, cmd);
10198             } else if (*cmd) {
10199                 s->pktout = ssh2_chanreq_init(ssh->mainchan, "exec",
10200                                               ssh2_response_authconn, NULL);
10201                 ssh2_pkt_addstring(s->pktout, cmd);
10202             } else {
10203                 s->pktout = ssh2_chanreq_init(ssh->mainchan, "shell",
10204                                               ssh2_response_authconn, NULL);
10205             }
10206             ssh2_pkt_send(ssh, s->pktout);
10207
10208             crWaitUntilV(pktin);
10209
10210             if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) {
10211                 if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) {
10212                     bombout(("Unexpected response to shell/command request:"
10213                              " packet type %d", pktin->type));
10214                     crStopV;
10215                 }
10216                 /*
10217                  * We failed to start the command. If this is the
10218                  * fallback command, we really are finished; if it's
10219                  * not, and if the fallback command exists, try falling
10220                  * back to it before complaining.
10221                  */
10222                 if (!ssh->fallback_cmd &&
10223                     *conf_get_str(ssh->conf, CONF_remote_cmd2)) {
10224                     logevent("Primary command failed; attempting fallback");
10225                     ssh->fallback_cmd = TRUE;
10226                     continue;
10227                 }
10228                 bombout(("Server refused to start a shell/command"));
10229                 crStopV;
10230             } else {
10231                 logevent("Started a shell/command");
10232             }
10233             break;
10234         }
10235     } else {
10236         ssh->editing = ssh->echoing = TRUE;
10237     }
10238
10239     ssh->state = SSH_STATE_SESSION;
10240     if (ssh->size_needed)
10241         ssh_size(ssh, ssh->term_width, ssh->term_height);
10242     if (ssh->eof_needed)
10243         ssh_special(ssh, TS_EOF);
10244
10245     /*
10246      * Transfer data!
10247      */
10248     if (ssh->ldisc)
10249         ldisc_send(ssh->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */
10250     if (ssh->mainchan)
10251         ssh->send_ok = 1;
10252     while (1) {
10253         crReturnV;
10254         s->try_send = FALSE;
10255         if (pktin) {
10256
10257             /*
10258              * _All_ the connection-layer packets we expect to
10259              * receive are now handled by the dispatch table.
10260              * Anything that reaches here must be bogus.
10261              */
10262
10263             bombout(("Strange packet received: type %d", pktin->type));
10264             crStopV;
10265         } else if (ssh->mainchan) {
10266             /*
10267              * We have spare data. Add it to the channel buffer.
10268              */
10269             ssh2_add_channel_data(ssh->mainchan, (char *)in, inlen);
10270             s->try_send = TRUE;
10271         }
10272         if (s->try_send) {
10273             int i;
10274             struct ssh_channel *c;
10275             /*
10276              * Try to send data on all channels if we can.
10277              */
10278             for (i = 0; NULL != (c = index234(ssh->channels, i)); i++)
10279                 ssh2_try_send_and_unthrottle(ssh, c);
10280         }
10281     }
10282
10283     crFinishV;
10284 }
10285
10286 /*
10287  * Handlers for SSH-2 messages that might arrive at any moment.
10288  */
10289 static void ssh2_msg_disconnect(Ssh ssh, struct Packet *pktin)
10290 {
10291     /* log reason code in disconnect message */
10292     char *buf, *msg;
10293     int reason, msglen;
10294
10295     reason = ssh_pkt_getuint32(pktin);
10296     ssh_pkt_getstring(pktin, &msg, &msglen);
10297
10298     if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) {
10299         buf = dupprintf("Received disconnect message (%s)",
10300                         ssh2_disconnect_reasons[reason]);
10301     } else {
10302         buf = dupprintf("Received disconnect message (unknown"
10303                         " type %d)", reason);
10304     }
10305     logevent(buf);
10306     sfree(buf);
10307     buf = dupprintf("Disconnection message text: %.*s",
10308                     msglen, msg);
10309     logevent(buf);
10310     bombout(("Server sent disconnect message\ntype %d (%s):\n\"%.*s\"",
10311              reason,
10312              (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) ?
10313              ssh2_disconnect_reasons[reason] : "unknown",
10314              msglen, msg));
10315     sfree(buf);
10316 }
10317
10318 static void ssh2_msg_debug(Ssh ssh, struct Packet *pktin)
10319 {
10320     /* log the debug message */
10321     char *msg;
10322     int msglen;
10323
10324     /* XXX maybe we should actually take notice of the return value */
10325     ssh2_pkt_getbool(pktin);
10326     ssh_pkt_getstring(pktin, &msg, &msglen);
10327
10328     logeventf(ssh, "Remote debug message: %.*s", msglen, msg);
10329 }
10330
10331 static void ssh2_msg_transport(Ssh ssh, struct Packet *pktin)
10332 {
10333     do_ssh2_transport(ssh, NULL, 0, pktin);
10334 }
10335
10336 /*
10337  * Called if we receive a packet that isn't allowed by the protocol.
10338  * This only applies to packets whose meaning PuTTY understands.
10339  * Entirely unknown packets are handled below.
10340  */
10341 static void ssh2_msg_unexpected(Ssh ssh, struct Packet *pktin)
10342 {
10343     char *buf = dupprintf("Server protocol violation: unexpected %s packet",
10344                           ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx,
10345                                         pktin->type));
10346     ssh_disconnect(ssh, NULL, buf, SSH2_DISCONNECT_PROTOCOL_ERROR, FALSE);
10347     sfree(buf);
10348 }
10349
10350 static void ssh2_msg_something_unimplemented(Ssh ssh, struct Packet *pktin)
10351 {
10352     struct Packet *pktout;
10353     pktout = ssh2_pkt_init(SSH2_MSG_UNIMPLEMENTED);
10354     ssh2_pkt_adduint32(pktout, pktin->sequence);
10355     /*
10356      * UNIMPLEMENTED messages MUST appear in the same order as the
10357      * messages they respond to. Hence, never queue them.
10358      */
10359     ssh2_pkt_send_noqueue(ssh, pktout);
10360 }
10361
10362 /*
10363  * Handle the top-level SSH-2 protocol.
10364  */
10365 static void ssh2_protocol_setup(Ssh ssh)
10366 {
10367     int i;
10368
10369     /*
10370      * Most messages cause SSH2_MSG_UNIMPLEMENTED.
10371      */
10372     for (i = 0; i < 256; i++)
10373         ssh->packet_dispatch[i] = ssh2_msg_something_unimplemented;
10374
10375     /*
10376      * Initially, we only accept transport messages (and a few generic
10377      * ones).  do_ssh2_authconn will add more when it starts.
10378      * Messages that are understood but not currently acceptable go to
10379      * ssh2_msg_unexpected.
10380      */
10381     ssh->packet_dispatch[SSH2_MSG_UNIMPLEMENTED] = ssh2_msg_unexpected;
10382     ssh->packet_dispatch[SSH2_MSG_SERVICE_REQUEST] = ssh2_msg_unexpected;
10383     ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = ssh2_msg_unexpected;
10384     ssh->packet_dispatch[SSH2_MSG_KEXINIT] = ssh2_msg_transport;
10385     ssh->packet_dispatch[SSH2_MSG_NEWKEYS] = ssh2_msg_transport;
10386     ssh->packet_dispatch[SSH2_MSG_KEXDH_INIT] = ssh2_msg_transport;
10387     ssh->packet_dispatch[SSH2_MSG_KEXDH_REPLY] = ssh2_msg_transport;
10388     /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REQUEST] = ssh2_msg_transport; duplicate case value */
10389     /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_GROUP] = ssh2_msg_transport; duplicate case value */
10390     ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_INIT] = ssh2_msg_transport;
10391     ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REPLY] = ssh2_msg_transport;
10392     ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = ssh2_msg_unexpected;
10393     ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = ssh2_msg_unexpected;
10394     ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = ssh2_msg_unexpected;
10395     ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = ssh2_msg_unexpected;
10396     ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = ssh2_msg_unexpected;
10397     /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = ssh2_msg_unexpected; duplicate case value */
10398     /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_REQUEST] = ssh2_msg_unexpected; duplicate case value */
10399     ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = ssh2_msg_unexpected;
10400     ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_unexpected;
10401     ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = ssh2_msg_unexpected;
10402     ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = ssh2_msg_unexpected;
10403     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_unexpected;
10404     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_unexpected;
10405     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_unexpected;
10406     ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_unexpected;
10407     ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh2_msg_unexpected;
10408     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = ssh2_msg_unexpected;
10409     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_unexpected;
10410     ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_unexpected;
10411     ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_unexpected;
10412     ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_unexpected;
10413     ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_unexpected;
10414
10415     /*
10416      * These messages have a special handler from the start.
10417      */
10418     ssh->packet_dispatch[SSH2_MSG_DISCONNECT] = ssh2_msg_disconnect;
10419     ssh->packet_dispatch[SSH2_MSG_IGNORE] = ssh_msg_ignore; /* shared with SSH-1 */
10420     ssh->packet_dispatch[SSH2_MSG_DEBUG] = ssh2_msg_debug;
10421 }
10422
10423 static void ssh2_bare_connection_protocol_setup(Ssh ssh)
10424 {
10425     int i;
10426
10427     /*
10428      * Most messages cause SSH2_MSG_UNIMPLEMENTED.
10429      */
10430     for (i = 0; i < 256; i++)
10431         ssh->packet_dispatch[i] = ssh2_msg_something_unimplemented;
10432
10433     /*
10434      * Initially, we set all ssh-connection messages to 'unexpected';
10435      * do_ssh2_authconn will fill things in properly. We also handle a
10436      * couple of messages from the transport protocol which aren't
10437      * related to key exchange (UNIMPLEMENTED, IGNORE, DEBUG,
10438      * DISCONNECT).
10439      */
10440     ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = ssh2_msg_unexpected;
10441     ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = ssh2_msg_unexpected;
10442     ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = ssh2_msg_unexpected;
10443     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = ssh2_msg_unexpected;
10444     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = ssh2_msg_unexpected;
10445     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = ssh2_msg_unexpected;
10446     ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = ssh2_msg_unexpected;
10447     ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = ssh2_msg_unexpected;
10448     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = ssh2_msg_unexpected;
10449     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_unexpected;
10450     ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_unexpected;
10451     ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = ssh2_msg_unexpected;
10452     ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = ssh2_msg_unexpected;
10453     ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = ssh2_msg_unexpected;
10454
10455     ssh->packet_dispatch[SSH2_MSG_UNIMPLEMENTED] = ssh2_msg_unexpected;
10456
10457     /*
10458      * These messages have a special handler from the start.
10459      */
10460     ssh->packet_dispatch[SSH2_MSG_DISCONNECT] = ssh2_msg_disconnect;
10461     ssh->packet_dispatch[SSH2_MSG_IGNORE] = ssh_msg_ignore;
10462     ssh->packet_dispatch[SSH2_MSG_DEBUG] = ssh2_msg_debug;
10463 }
10464
10465 static void ssh2_timer(void *ctx, unsigned long now)
10466 {
10467     Ssh ssh = (Ssh)ctx;
10468
10469     if (ssh->state == SSH_STATE_CLOSED)
10470         return;
10471
10472     if (!ssh->kex_in_progress && !ssh->bare_connection &&
10473         conf_get_int(ssh->conf, CONF_ssh_rekey_time) != 0 &&
10474         now == ssh->next_rekey) {
10475         do_ssh2_transport(ssh, "timeout", -1, NULL);
10476     }
10477 }
10478
10479 static void ssh2_protocol(Ssh ssh, void *vin, int inlen,
10480                           struct Packet *pktin)
10481 {
10482     unsigned char *in = (unsigned char *)vin;
10483     if (ssh->state == SSH_STATE_CLOSED)
10484         return;
10485
10486     if (pktin) {
10487         ssh->incoming_data_size += pktin->encrypted_len;
10488         if (!ssh->kex_in_progress &&
10489             ssh->max_data_size != 0 &&
10490             ssh->incoming_data_size > ssh->max_data_size)
10491             do_ssh2_transport(ssh, "too much data received", -1, NULL);
10492     }
10493
10494     if (pktin)
10495         ssh->packet_dispatch[pktin->type](ssh, pktin);
10496     else if (!ssh->protocol_initial_phase_done)
10497         do_ssh2_transport(ssh, in, inlen, pktin);
10498     else
10499         do_ssh2_authconn(ssh, in, inlen, pktin);
10500 }
10501
10502 static void ssh2_bare_connection_protocol(Ssh ssh, void *vin, int inlen,
10503                                           struct Packet *pktin)
10504 {
10505     unsigned char *in = (unsigned char *)vin;
10506     if (ssh->state == SSH_STATE_CLOSED)
10507         return;
10508
10509     if (pktin)
10510         ssh->packet_dispatch[pktin->type](ssh, pktin);
10511     else
10512         do_ssh2_authconn(ssh, in, inlen, pktin);
10513 }
10514
10515 static void ssh_cache_conf_values(Ssh ssh)
10516 {
10517     ssh->logomitdata = conf_get_int(ssh->conf, CONF_logomitdata);
10518 }
10519
10520 /*
10521  * Called to set up the connection.
10522  *
10523  * Returns an error message, or NULL on success.
10524  */
10525 static const char *ssh_init(void *frontend_handle, void **backend_handle,
10526                             Conf *conf, char *host, int port, char **realhost,
10527                             int nodelay, int keepalive)
10528 {
10529     const char *p;
10530     Ssh ssh;
10531
10532     ssh = snew(struct ssh_tag);
10533     ssh->conf = conf_copy(conf);
10534     ssh_cache_conf_values(ssh);
10535     ssh->version = 0;                  /* when not ready yet */
10536     ssh->s = NULL;
10537     ssh->cipher = NULL;
10538     ssh->v1_cipher_ctx = NULL;
10539     ssh->crcda_ctx = NULL;
10540     ssh->cscipher = NULL;
10541     ssh->cs_cipher_ctx = NULL;
10542     ssh->sccipher = NULL;
10543     ssh->sc_cipher_ctx = NULL;
10544     ssh->csmac = NULL;
10545     ssh->cs_mac_ctx = NULL;
10546     ssh->scmac = NULL;
10547     ssh->sc_mac_ctx = NULL;
10548     ssh->cscomp = NULL;
10549     ssh->cs_comp_ctx = NULL;
10550     ssh->sccomp = NULL;
10551     ssh->sc_comp_ctx = NULL;
10552     ssh->kex = NULL;
10553     ssh->kex_ctx = NULL;
10554     ssh->hostkey = NULL;
10555     ssh->hostkey_str = NULL;
10556     ssh->exitcode = -1;
10557     ssh->close_expected = FALSE;
10558     ssh->clean_exit = FALSE;
10559     ssh->state = SSH_STATE_PREPACKET;
10560     ssh->size_needed = FALSE;
10561     ssh->eof_needed = FALSE;
10562     ssh->ldisc = NULL;
10563     ssh->logctx = NULL;
10564     ssh->deferred_send_data = NULL;
10565     ssh->deferred_len = 0;
10566     ssh->deferred_size = 0;
10567     ssh->fallback_cmd = 0;
10568     ssh->pkt_kctx = SSH2_PKTCTX_NOKEX;
10569     ssh->pkt_actx = SSH2_PKTCTX_NOAUTH;
10570     ssh->x11disp = NULL;
10571     ssh->x11auth = NULL;
10572     ssh->x11authtree = newtree234(x11_authcmp);
10573     ssh->v1_compressing = FALSE;
10574     ssh->v2_outgoing_sequence = 0;
10575     ssh->ssh1_rdpkt_crstate = 0;
10576     ssh->ssh2_rdpkt_crstate = 0;
10577     ssh->ssh2_bare_rdpkt_crstate = 0;
10578     ssh->ssh_gotdata_crstate = 0;
10579     ssh->do_ssh1_connection_crstate = 0;
10580     ssh->do_ssh_init_state = NULL;
10581     ssh->do_ssh_connection_init_state = NULL;
10582     ssh->do_ssh1_login_state = NULL;
10583     ssh->do_ssh2_transport_state = NULL;
10584     ssh->do_ssh2_authconn_state = NULL;
10585     ssh->v_c = NULL;
10586     ssh->v_s = NULL;
10587     ssh->mainchan = NULL;
10588     ssh->throttled_all = 0;
10589     ssh->v1_stdout_throttling = 0;
10590     ssh->queue = NULL;
10591     ssh->queuelen = ssh->queuesize = 0;
10592     ssh->queueing = FALSE;
10593     ssh->qhead = ssh->qtail = NULL;
10594     ssh->deferred_rekey_reason = NULL;
10595     bufchain_init(&ssh->queued_incoming_data);
10596     ssh->frozen = FALSE;
10597     ssh->username = NULL;
10598     ssh->sent_console_eof = FALSE;
10599     ssh->got_pty = FALSE;
10600     ssh->bare_connection = FALSE;
10601     ssh->X11_fwd_enabled = FALSE;
10602     ssh->connshare = NULL;
10603     ssh->attempting_connshare = FALSE;
10604
10605     *backend_handle = ssh;
10606
10607 #ifdef MSCRYPTOAPI
10608     if (crypto_startup() == 0)
10609         return "Microsoft high encryption pack not installed!";
10610 #endif
10611
10612     ssh->frontend = frontend_handle;
10613     ssh->term_width = conf_get_int(ssh->conf, CONF_width);
10614     ssh->term_height = conf_get_int(ssh->conf, CONF_height);
10615
10616     ssh->channels = NULL;
10617     ssh->rportfwds = NULL;
10618     ssh->portfwds = NULL;
10619
10620     ssh->send_ok = 0;
10621     ssh->editing = 0;
10622     ssh->echoing = 0;
10623     ssh->conn_throttle_count = 0;
10624     ssh->overall_bufsize = 0;
10625     ssh->fallback_cmd = 0;
10626
10627     ssh->protocol = NULL;
10628
10629     ssh->protocol_initial_phase_done = FALSE;
10630
10631     ssh->pinger = NULL;
10632
10633     ssh->incoming_data_size = ssh->outgoing_data_size =
10634         ssh->deferred_data_size = 0L;
10635     ssh->max_data_size = parse_blocksize(conf_get_str(ssh->conf,
10636                                                       CONF_ssh_rekey_data));
10637     ssh->kex_in_progress = FALSE;
10638
10639 #ifndef NO_GSSAPI
10640     ssh->gsslibs = NULL;
10641 #endif
10642
10643     random_ref(); /* do this now - may be needed by sharing setup code */
10644
10645     p = connect_to_host(ssh, host, port, realhost, nodelay, keepalive);
10646     if (p != NULL) {
10647         random_unref();
10648         return p;
10649     }
10650
10651     return NULL;
10652 }
10653
10654 static void ssh_free(void *handle)
10655 {
10656     Ssh ssh = (Ssh) handle;
10657     struct ssh_channel *c;
10658     struct ssh_rportfwd *pf;
10659     struct X11FakeAuth *auth;
10660
10661     if (ssh->v1_cipher_ctx)
10662         ssh->cipher->free_context(ssh->v1_cipher_ctx);
10663     if (ssh->cs_cipher_ctx)
10664         ssh->cscipher->free_context(ssh->cs_cipher_ctx);
10665     if (ssh->sc_cipher_ctx)
10666         ssh->sccipher->free_context(ssh->sc_cipher_ctx);
10667     if (ssh->cs_mac_ctx)
10668         ssh->csmac->free_context(ssh->cs_mac_ctx);
10669     if (ssh->sc_mac_ctx)
10670         ssh->scmac->free_context(ssh->sc_mac_ctx);
10671     if (ssh->cs_comp_ctx) {
10672         if (ssh->cscomp)
10673             ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx);
10674         else
10675             zlib_compress_cleanup(ssh->cs_comp_ctx);
10676     }
10677     if (ssh->sc_comp_ctx) {
10678         if (ssh->sccomp)
10679             ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx);
10680         else
10681             zlib_decompress_cleanup(ssh->sc_comp_ctx);
10682     }
10683     if (ssh->kex_ctx)
10684         dh_cleanup(ssh->kex_ctx);
10685     sfree(ssh->savedhost);
10686
10687     while (ssh->queuelen-- > 0)
10688         ssh_free_packet(ssh->queue[ssh->queuelen]);
10689     sfree(ssh->queue);
10690
10691     while (ssh->qhead) {
10692         struct queued_handler *qh = ssh->qhead;
10693         ssh->qhead = qh->next;
10694         sfree(qh);
10695     }
10696     ssh->qhead = ssh->qtail = NULL;
10697
10698     if (ssh->channels) {
10699         while ((c = delpos234(ssh->channels, 0)) != NULL) {
10700             switch (c->type) {
10701               case CHAN_X11:
10702                 if (c->u.x11.xconn != NULL)
10703                     x11_close(c->u.x11.xconn);
10704                 break;
10705               case CHAN_SOCKDATA:
10706               case CHAN_SOCKDATA_DORMANT:
10707                 if (c->u.pfd.pf != NULL)
10708                     pfd_close(c->u.pfd.pf);
10709                 break;
10710             }
10711             if (ssh->version == 2) {
10712                 struct outstanding_channel_request *ocr, *nocr;
10713                 ocr = c->v.v2.chanreq_head;
10714                 while (ocr) {
10715                     ocr->handler(c, NULL, ocr->ctx);
10716                     nocr = ocr->next;
10717                     sfree(ocr);
10718                     ocr = nocr;
10719                 }
10720                 bufchain_clear(&c->v.v2.outbuffer);
10721             }
10722             sfree(c);
10723         }
10724         freetree234(ssh->channels);
10725         ssh->channels = NULL;
10726     }
10727
10728     if (ssh->connshare)
10729         sharestate_free(ssh->connshare);
10730
10731     if (ssh->rportfwds) {
10732         while ((pf = delpos234(ssh->rportfwds, 0)) != NULL)
10733             free_rportfwd(pf);
10734         freetree234(ssh->rportfwds);
10735         ssh->rportfwds = NULL;
10736     }
10737     sfree(ssh->deferred_send_data);
10738     if (ssh->x11disp)
10739         x11_free_display(ssh->x11disp);
10740     while ((auth = delpos234(ssh->x11authtree, 0)) != NULL)
10741         x11_free_fake_auth(auth);
10742     freetree234(ssh->x11authtree);
10743     sfree(ssh->do_ssh_init_state);
10744     sfree(ssh->do_ssh1_login_state);
10745     sfree(ssh->do_ssh2_transport_state);
10746     sfree(ssh->do_ssh2_authconn_state);
10747     sfree(ssh->v_c);
10748     sfree(ssh->v_s);
10749     sfree(ssh->fullhostname);
10750     sfree(ssh->hostkey_str);
10751     if (ssh->crcda_ctx) {
10752         crcda_free_context(ssh->crcda_ctx);
10753         ssh->crcda_ctx = NULL;
10754     }
10755     if (ssh->s)
10756         ssh_do_close(ssh, TRUE);
10757     expire_timer_context(ssh);
10758     if (ssh->pinger)
10759         pinger_free(ssh->pinger);
10760     bufchain_clear(&ssh->queued_incoming_data);
10761     sfree(ssh->username);
10762     conf_free(ssh->conf);
10763 #ifndef NO_GSSAPI
10764     if (ssh->gsslibs)
10765         ssh_gss_cleanup(ssh->gsslibs);
10766 #endif
10767     sfree(ssh);
10768
10769     random_unref();
10770 }
10771
10772 /*
10773  * Reconfigure the SSH backend.
10774  */
10775 static void ssh_reconfig(void *handle, Conf *conf)
10776 {
10777     Ssh ssh = (Ssh) handle;
10778     char *rekeying = NULL, rekey_mandatory = FALSE;
10779     unsigned long old_max_data_size;
10780     int i, rekey_time;
10781
10782     pinger_reconfig(ssh->pinger, ssh->conf, conf);
10783     if (ssh->portfwds)
10784         ssh_setup_portfwd(ssh, conf);
10785
10786     rekey_time = conf_get_int(conf, CONF_ssh_rekey_time);
10787     if (conf_get_int(ssh->conf, CONF_ssh_rekey_time) != rekey_time &&
10788         rekey_time != 0) {
10789         unsigned long new_next = ssh->last_rekey + rekey_time*60*TICKSPERSEC;
10790         unsigned long now = GETTICKCOUNT();
10791
10792         if (now - ssh->last_rekey > rekey_time*60*TICKSPERSEC) {
10793             rekeying = "timeout shortened";
10794         } else {
10795             ssh->next_rekey = schedule_timer(new_next - now, ssh2_timer, ssh);
10796         }
10797     }
10798
10799     old_max_data_size = ssh->max_data_size;
10800     ssh->max_data_size = parse_blocksize(conf_get_str(ssh->conf,
10801                                                       CONF_ssh_rekey_data));
10802     if (old_max_data_size != ssh->max_data_size &&
10803         ssh->max_data_size != 0) {
10804         if (ssh->outgoing_data_size > ssh->max_data_size ||
10805             ssh->incoming_data_size > ssh->max_data_size)
10806             rekeying = "data limit lowered";
10807     }
10808
10809     if (conf_get_int(ssh->conf, CONF_compression) !=
10810         conf_get_int(conf, CONF_compression)) {
10811         rekeying = "compression setting changed";
10812         rekey_mandatory = TRUE;
10813     }
10814
10815     for (i = 0; i < CIPHER_MAX; i++)
10816         if (conf_get_int_int(ssh->conf, CONF_ssh_cipherlist, i) !=
10817             conf_get_int_int(conf, CONF_ssh_cipherlist, i)) {
10818         rekeying = "cipher settings changed";
10819         rekey_mandatory = TRUE;
10820     }
10821     if (conf_get_int(ssh->conf, CONF_ssh2_des_cbc) !=
10822         conf_get_int(conf, CONF_ssh2_des_cbc)) {
10823         rekeying = "cipher settings changed";
10824         rekey_mandatory = TRUE;
10825     }
10826
10827     conf_free(ssh->conf);
10828     ssh->conf = conf_copy(conf);
10829     ssh_cache_conf_values(ssh);
10830
10831     if (!ssh->bare_connection && rekeying) {
10832         if (!ssh->kex_in_progress) {
10833             do_ssh2_transport(ssh, rekeying, -1, NULL);
10834         } else if (rekey_mandatory) {
10835             ssh->deferred_rekey_reason = rekeying;
10836         }
10837     }
10838 }
10839
10840 /*
10841  * Called to send data down the SSH connection.
10842  */
10843 static int ssh_send(void *handle, char *buf, int len)
10844 {
10845     Ssh ssh = (Ssh) handle;
10846
10847     if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL)
10848         return 0;
10849
10850     ssh->protocol(ssh, (unsigned char *)buf, len, 0);
10851
10852     return ssh_sendbuffer(ssh);
10853 }
10854
10855 /*
10856  * Called to query the current amount of buffered stdin data.
10857  */
10858 static int ssh_sendbuffer(void *handle)
10859 {
10860     Ssh ssh = (Ssh) handle;
10861     int override_value;
10862
10863     if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL)
10864         return 0;
10865
10866     /*
10867      * If the SSH socket itself has backed up, add the total backup
10868      * size on that to any individual buffer on the stdin channel.
10869      */
10870     override_value = 0;
10871     if (ssh->throttled_all)
10872         override_value = ssh->overall_bufsize;
10873
10874     if (ssh->version == 1) {
10875         return override_value;
10876     } else if (ssh->version == 2) {
10877         if (!ssh->mainchan)
10878             return override_value;
10879         else
10880             return (override_value +
10881                     bufchain_size(&ssh->mainchan->v.v2.outbuffer));
10882     }
10883
10884     return 0;
10885 }
10886
10887 /*
10888  * Called to set the size of the window from SSH's POV.
10889  */
10890 static void ssh_size(void *handle, int width, int height)
10891 {
10892     Ssh ssh = (Ssh) handle;
10893     struct Packet *pktout;
10894
10895     ssh->term_width = width;
10896     ssh->term_height = height;
10897
10898     switch (ssh->state) {
10899       case SSH_STATE_BEFORE_SIZE:
10900       case SSH_STATE_PREPACKET:
10901       case SSH_STATE_CLOSED:
10902         break;                         /* do nothing */
10903       case SSH_STATE_INTERMED:
10904         ssh->size_needed = TRUE;       /* buffer for later */
10905         break;
10906       case SSH_STATE_SESSION:
10907         if (!conf_get_int(ssh->conf, CONF_nopty)) {
10908             if (ssh->version == 1) {
10909                 send_packet(ssh, SSH1_CMSG_WINDOW_SIZE,
10910                             PKT_INT, ssh->term_height,
10911                             PKT_INT, ssh->term_width,
10912                             PKT_INT, 0, PKT_INT, 0, PKT_END);
10913             } else if (ssh->mainchan) {
10914                 pktout = ssh2_chanreq_init(ssh->mainchan, "window-change",
10915                                            NULL, NULL);
10916                 ssh2_pkt_adduint32(pktout, ssh->term_width);
10917                 ssh2_pkt_adduint32(pktout, ssh->term_height);
10918                 ssh2_pkt_adduint32(pktout, 0);
10919                 ssh2_pkt_adduint32(pktout, 0);
10920                 ssh2_pkt_send(ssh, pktout);
10921             }
10922         }
10923         break;
10924     }
10925 }
10926
10927 /*
10928  * Return a list of the special codes that make sense in this
10929  * protocol.
10930  */
10931 static const struct telnet_special *ssh_get_specials(void *handle)
10932 {
10933     static const struct telnet_special ssh1_ignore_special[] = {
10934         {"IGNORE message", TS_NOP}
10935     };
10936     static const struct telnet_special ssh2_ignore_special[] = {
10937         {"IGNORE message", TS_NOP},
10938     };
10939     static const struct telnet_special ssh2_rekey_special[] = {
10940         {"Repeat key exchange", TS_REKEY},
10941     };
10942     static const struct telnet_special ssh2_session_specials[] = {
10943         {NULL, TS_SEP},
10944         {"Break", TS_BRK},
10945         /* These are the signal names defined by RFC 4254.
10946          * They include all the ISO C signals, but are a subset of the POSIX
10947          * required signals. */
10948         {"SIGINT (Interrupt)", TS_SIGINT},
10949         {"SIGTERM (Terminate)", TS_SIGTERM},
10950         {"SIGKILL (Kill)", TS_SIGKILL},
10951         {"SIGQUIT (Quit)", TS_SIGQUIT},
10952         {"SIGHUP (Hangup)", TS_SIGHUP},
10953         {"More signals", TS_SUBMENU},
10954           {"SIGABRT", TS_SIGABRT}, {"SIGALRM", TS_SIGALRM},
10955           {"SIGFPE",  TS_SIGFPE},  {"SIGILL",  TS_SIGILL},
10956           {"SIGPIPE", TS_SIGPIPE}, {"SIGSEGV", TS_SIGSEGV},
10957           {"SIGUSR1", TS_SIGUSR1}, {"SIGUSR2", TS_SIGUSR2},
10958         {NULL, TS_EXITMENU}
10959     };
10960     static const struct telnet_special specials_end[] = {
10961         {NULL, TS_EXITMENU}
10962     };
10963     /* XXX review this length for any changes: */
10964     static struct telnet_special ssh_specials[lenof(ssh2_ignore_special) +
10965                                               lenof(ssh2_rekey_special) +
10966                                               lenof(ssh2_session_specials) +
10967                                               lenof(specials_end)];
10968     Ssh ssh = (Ssh) handle;
10969     int i = 0;
10970 #define ADD_SPECIALS(name) \
10971     do { \
10972         assert((i + lenof(name)) <= lenof(ssh_specials)); \
10973         memcpy(&ssh_specials[i], name, sizeof name); \
10974         i += lenof(name); \
10975     } while(0)
10976
10977     if (ssh->version == 1) {
10978         /* Don't bother offering IGNORE if we've decided the remote
10979          * won't cope with it, since we wouldn't bother sending it if
10980          * asked anyway. */
10981         if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE))
10982             ADD_SPECIALS(ssh1_ignore_special);
10983     } else if (ssh->version == 2) {
10984         if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE))
10985             ADD_SPECIALS(ssh2_ignore_special);
10986         if (!(ssh->remote_bugs & BUG_SSH2_REKEY) && !ssh->bare_connection)
10987             ADD_SPECIALS(ssh2_rekey_special);
10988         if (ssh->mainchan)
10989             ADD_SPECIALS(ssh2_session_specials);
10990     } /* else we're not ready yet */
10991
10992     if (i) {
10993         ADD_SPECIALS(specials_end);
10994         return ssh_specials;
10995     } else {
10996         return NULL;
10997     }
10998 #undef ADD_SPECIALS
10999 }
11000
11001 /*
11002  * Send special codes. TS_EOF is useful for `plink', so you
11003  * can send an EOF and collect resulting output (e.g. `plink
11004  * hostname sort').
11005  */
11006 static void ssh_special(void *handle, Telnet_Special code)
11007 {
11008     Ssh ssh = (Ssh) handle;
11009     struct Packet *pktout;
11010
11011     if (code == TS_EOF) {
11012         if (ssh->state != SSH_STATE_SESSION) {
11013             /*
11014              * Buffer the EOF in case we are pre-SESSION, so we can
11015              * send it as soon as we reach SESSION.
11016              */
11017             if (code == TS_EOF)
11018                 ssh->eof_needed = TRUE;
11019             return;
11020         }
11021         if (ssh->version == 1) {
11022             send_packet(ssh, SSH1_CMSG_EOF, PKT_END);
11023         } else if (ssh->mainchan) {
11024             sshfwd_write_eof(ssh->mainchan);
11025             ssh->send_ok = 0;          /* now stop trying to read from stdin */
11026         }
11027         logevent("Sent EOF message");
11028     } else if (code == TS_PING || code == TS_NOP) {
11029         if (ssh->state == SSH_STATE_CLOSED
11030             || ssh->state == SSH_STATE_PREPACKET) return;
11031         if (ssh->version == 1) {
11032             if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE))
11033                 send_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, "", PKT_END);
11034         } else {
11035             if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH2_IGNORE)) {
11036                 pktout = ssh2_pkt_init(SSH2_MSG_IGNORE);
11037                 ssh2_pkt_addstring_start(pktout);
11038                 ssh2_pkt_send_noqueue(ssh, pktout);
11039             }
11040         }
11041     } else if (code == TS_REKEY) {
11042         if (!ssh->kex_in_progress && !ssh->bare_connection &&
11043             ssh->version == 2) {
11044             do_ssh2_transport(ssh, "at user request", -1, NULL);
11045         }
11046     } else if (code == TS_BRK) {
11047         if (ssh->state == SSH_STATE_CLOSED
11048             || ssh->state == SSH_STATE_PREPACKET) return;
11049         if (ssh->version == 1) {
11050             logevent("Unable to send BREAK signal in SSH-1");
11051         } else if (ssh->mainchan) {
11052             pktout = ssh2_chanreq_init(ssh->mainchan, "break", NULL, NULL);
11053             ssh2_pkt_adduint32(pktout, 0);   /* default break length */
11054             ssh2_pkt_send(ssh, pktout);
11055         }
11056     } else {
11057         /* Is is a POSIX signal? */
11058         char *signame = NULL;
11059         if (code == TS_SIGABRT) signame = "ABRT";
11060         if (code == TS_SIGALRM) signame = "ALRM";
11061         if (code == TS_SIGFPE)  signame = "FPE";
11062         if (code == TS_SIGHUP)  signame = "HUP";
11063         if (code == TS_SIGILL)  signame = "ILL";
11064         if (code == TS_SIGINT)  signame = "INT";
11065         if (code == TS_SIGKILL) signame = "KILL";
11066         if (code == TS_SIGPIPE) signame = "PIPE";
11067         if (code == TS_SIGQUIT) signame = "QUIT";
11068         if (code == TS_SIGSEGV) signame = "SEGV";
11069         if (code == TS_SIGTERM) signame = "TERM";
11070         if (code == TS_SIGUSR1) signame = "USR1";
11071         if (code == TS_SIGUSR2) signame = "USR2";
11072         /* The SSH-2 protocol does in principle support arbitrary named
11073          * signals, including signame@domain, but we don't support those. */
11074         if (signame) {
11075             /* It's a signal. */
11076             if (ssh->version == 2 && ssh->mainchan) {
11077                 pktout = ssh2_chanreq_init(ssh->mainchan, "signal", NULL, NULL);
11078                 ssh2_pkt_addstring(pktout, signame);
11079                 ssh2_pkt_send(ssh, pktout);
11080                 logeventf(ssh, "Sent signal SIG%s", signame);
11081             }
11082         } else {
11083             /* Never heard of it. Do nothing */
11084         }
11085     }
11086 }
11087
11088 void *new_sock_channel(void *handle, struct PortForwarding *pf)
11089 {
11090     Ssh ssh = (Ssh) handle;
11091     struct ssh_channel *c;
11092     c = snew(struct ssh_channel);
11093
11094     c->ssh = ssh;
11095     ssh2_channel_init(c);
11096     c->halfopen = TRUE;
11097     c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */
11098     c->u.pfd.pf = pf;
11099     add234(ssh->channels, c);
11100     return c;
11101 }
11102
11103 unsigned ssh_alloc_sharing_channel(Ssh ssh, void *sharing_ctx)
11104 {
11105     struct ssh_channel *c;
11106     c = snew(struct ssh_channel);
11107
11108     c->ssh = ssh;
11109     ssh2_channel_init(c);
11110     c->type = CHAN_SHARING;
11111     c->u.sharing.ctx = sharing_ctx;
11112     add234(ssh->channels, c);
11113     return c->localid;
11114 }
11115
11116 void ssh_delete_sharing_channel(Ssh ssh, unsigned localid)
11117 {
11118     struct ssh_channel *c;
11119
11120     c = find234(ssh->channels, &localid, ssh_channelfind);
11121     if (c)
11122         ssh_channel_destroy(c);
11123 }
11124
11125 void ssh_send_packet_from_downstream(Ssh ssh, unsigned id, int type,
11126                                      const void *data, int datalen,
11127                                      const char *additional_log_text)
11128 {
11129     struct Packet *pkt;
11130
11131     pkt = ssh2_pkt_init(type);
11132     pkt->downstream_id = id;
11133     pkt->additional_log_text = additional_log_text;
11134     ssh2_pkt_adddata(pkt, data, datalen);
11135     ssh2_pkt_send(ssh, pkt);
11136 }
11137
11138 /*
11139  * This is called when stdout/stderr (the entity to which
11140  * from_backend sends data) manages to clear some backlog.
11141  */
11142 static void ssh_unthrottle(void *handle, int bufsize)
11143 {
11144     Ssh ssh = (Ssh) handle;
11145     int buflimit;
11146
11147     if (ssh->version == 1) {
11148         if (ssh->v1_stdout_throttling && bufsize < SSH1_BUFFER_LIMIT) {
11149             ssh->v1_stdout_throttling = 0;
11150             ssh_throttle_conn(ssh, -1);
11151         }
11152     } else {
11153         if (ssh->mainchan) {
11154             ssh2_set_window(ssh->mainchan,
11155                             bufsize < ssh->mainchan->v.v2.locmaxwin ?
11156                             ssh->mainchan->v.v2.locmaxwin - bufsize : 0);
11157             if (ssh_is_simple(ssh))
11158                 buflimit = 0;
11159             else
11160                 buflimit = ssh->mainchan->v.v2.locmaxwin;
11161             if (ssh->mainchan->throttling_conn && bufsize <= buflimit) {
11162                 ssh->mainchan->throttling_conn = 0;
11163                 ssh_throttle_conn(ssh, -1);
11164             }
11165         }
11166     }
11167
11168     /*
11169      * Now process any SSH connection data that was stashed in our
11170      * queue while we were frozen.
11171      */
11172     ssh_process_queued_incoming_data(ssh);
11173 }
11174
11175 void ssh_send_port_open(void *channel, char *hostname, int port, char *org)
11176 {
11177     struct ssh_channel *c = (struct ssh_channel *)channel;
11178     Ssh ssh = c->ssh;
11179     struct Packet *pktout;
11180
11181     logeventf(ssh, "Opening connection to %s:%d for %s", hostname, port, org);
11182
11183     if (ssh->version == 1) {
11184         send_packet(ssh, SSH1_MSG_PORT_OPEN,
11185                     PKT_INT, c->localid,
11186                     PKT_STR, hostname,
11187                     PKT_INT, port,
11188                     /* PKT_STR, <org:orgport>, */
11189                     PKT_END);
11190     } else {
11191         pktout = ssh2_chanopen_init(c, "direct-tcpip");
11192         {
11193             char *trimmed_host = host_strduptrim(hostname);
11194             ssh2_pkt_addstring(pktout, trimmed_host);
11195             sfree(trimmed_host);
11196         }
11197         ssh2_pkt_adduint32(pktout, port);
11198         /*
11199          * We make up values for the originator data; partly it's
11200          * too much hassle to keep track, and partly I'm not
11201          * convinced the server should be told details like that
11202          * about my local network configuration.
11203          * The "originator IP address" is syntactically a numeric
11204          * IP address, and some servers (e.g., Tectia) get upset
11205          * if it doesn't match this syntax.
11206          */
11207         ssh2_pkt_addstring(pktout, "0.0.0.0");
11208         ssh2_pkt_adduint32(pktout, 0);
11209         ssh2_pkt_send(ssh, pktout);
11210     }
11211 }
11212
11213 static int ssh_connected(void *handle)
11214 {
11215     Ssh ssh = (Ssh) handle;
11216     return ssh->s != NULL;
11217 }
11218
11219 static int ssh_sendok(void *handle)
11220 {
11221     Ssh ssh = (Ssh) handle;
11222     return ssh->send_ok;
11223 }
11224
11225 static int ssh_ldisc(void *handle, int option)
11226 {
11227     Ssh ssh = (Ssh) handle;
11228     if (option == LD_ECHO)
11229         return ssh->echoing;
11230     if (option == LD_EDIT)
11231         return ssh->editing;
11232     return FALSE;
11233 }
11234
11235 static void ssh_provide_ldisc(void *handle, void *ldisc)
11236 {
11237     Ssh ssh = (Ssh) handle;
11238     ssh->ldisc = ldisc;
11239 }
11240
11241 static void ssh_provide_logctx(void *handle, void *logctx)
11242 {
11243     Ssh ssh = (Ssh) handle;
11244     ssh->logctx = logctx;
11245 }
11246
11247 static int ssh_return_exitcode(void *handle)
11248 {
11249     Ssh ssh = (Ssh) handle;
11250     if (ssh->s != NULL)
11251         return -1;
11252     else
11253         return (ssh->exitcode >= 0 ? ssh->exitcode : INT_MAX);
11254 }
11255
11256 /*
11257  * cfg_info for SSH is the protocol running in this session.
11258  * (1 or 2 for the full SSH-1 or SSH-2 protocol; -1 for the bare
11259  * SSH-2 connection protocol, i.e. a downstream; 0 for not-decided-yet.)
11260  */
11261 static int ssh_cfg_info(void *handle)
11262 {
11263     Ssh ssh = (Ssh) handle;
11264     if (ssh->version == 0)
11265         return 0; /* don't know yet */
11266     else if (ssh->bare_connection)
11267         return -1;
11268     else
11269         return ssh->version;
11270 }
11271
11272 /*
11273  * Gross hack: pscp will try to start SFTP but fall back to scp1 if
11274  * that fails. This variable is the means by which scp.c can reach
11275  * into the SSH code and find out which one it got.
11276  */
11277 extern int ssh_fallback_cmd(void *handle)
11278 {
11279     Ssh ssh = (Ssh) handle;
11280     return ssh->fallback_cmd;
11281 }
11282
11283 Backend ssh_backend = {
11284     ssh_init,
11285     ssh_free,
11286     ssh_reconfig,
11287     ssh_send,
11288     ssh_sendbuffer,
11289     ssh_size,
11290     ssh_special,
11291     ssh_get_specials,
11292     ssh_connected,
11293     ssh_return_exitcode,
11294     ssh_sendok,
11295     ssh_ldisc,
11296     ssh_provide_ldisc,
11297     ssh_provide_logctx,
11298     ssh_unthrottle,
11299     ssh_cfg_info,
11300     "ssh",
11301     PROT_SSH,
11302     22
11303 };