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