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