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