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