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