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