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