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