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