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