]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - ssh.c
e2e80772c8a9a5d653da05f2dcbdfa477ec2527d
[PuTTY.git] / ssh.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 #include <assert.h>
5
6 #include "putty.h"
7 #include "tree234.h"
8 #include "ssh.h"
9
10 #ifndef FALSE
11 #define FALSE 0
12 #endif
13 #ifndef TRUE
14 #define TRUE 1
15 #endif
16
17 #define SSH1_MSG_DISCONNECT                       1     /* 0x1 */
18 #define SSH1_SMSG_PUBLIC_KEY                      2     /* 0x2 */
19 #define SSH1_CMSG_SESSION_KEY                     3     /* 0x3 */
20 #define SSH1_CMSG_USER                            4     /* 0x4 */
21 #define SSH1_CMSG_AUTH_RSA                        6     /* 0x6 */
22 #define SSH1_SMSG_AUTH_RSA_CHALLENGE              7     /* 0x7 */
23 #define SSH1_CMSG_AUTH_RSA_RESPONSE               8     /* 0x8 */
24 #define SSH1_CMSG_AUTH_PASSWORD                   9     /* 0x9 */
25 #define SSH1_CMSG_REQUEST_PTY                     10    /* 0xa */
26 #define SSH1_CMSG_WINDOW_SIZE                     11    /* 0xb */
27 #define SSH1_CMSG_EXEC_SHELL                      12    /* 0xc */
28 #define SSH1_CMSG_EXEC_CMD                        13    /* 0xd */
29 #define SSH1_SMSG_SUCCESS                         14    /* 0xe */
30 #define SSH1_SMSG_FAILURE                         15    /* 0xf */
31 #define SSH1_CMSG_STDIN_DATA                      16    /* 0x10 */
32 #define SSH1_SMSG_STDOUT_DATA                     17    /* 0x11 */
33 #define SSH1_SMSG_STDERR_DATA                     18    /* 0x12 */
34 #define SSH1_CMSG_EOF                             19    /* 0x13 */
35 #define SSH1_SMSG_EXIT_STATUS                     20    /* 0x14 */
36 #define SSH1_MSG_CHANNEL_OPEN_CONFIRMATION        21    /* 0x15 */
37 #define SSH1_MSG_CHANNEL_OPEN_FAILURE             22    /* 0x16 */
38 #define SSH1_MSG_CHANNEL_DATA                     23    /* 0x17 */
39 #define SSH1_MSG_CHANNEL_CLOSE                    24    /* 0x18 */
40 #define SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION       25    /* 0x19 */
41 #define SSH1_SMSG_X11_OPEN                        27    /* 0x1b */
42 #define SSH1_CMSG_PORT_FORWARD_REQUEST            28    /* 0x1c */
43 #define SSH1_MSG_PORT_OPEN                        29    /* 0x1d */
44 #define SSH1_CMSG_AGENT_REQUEST_FORWARDING        30    /* 0x1e */
45 #define SSH1_SMSG_AGENT_OPEN                      31    /* 0x1f */
46 #define SSH1_MSG_IGNORE                           32    /* 0x20 */
47 #define SSH1_CMSG_EXIT_CONFIRMATION               33    /* 0x21 */
48 #define SSH1_CMSG_X11_REQUEST_FORWARDING          34    /* 0x22 */
49 #define SSH1_CMSG_AUTH_RHOSTS_RSA                 35    /* 0x23 */
50 #define SSH1_MSG_DEBUG                            36    /* 0x24 */
51 #define SSH1_CMSG_REQUEST_COMPRESSION             37    /* 0x25 */
52 #define SSH1_CMSG_AUTH_TIS                        39    /* 0x27 */
53 #define SSH1_SMSG_AUTH_TIS_CHALLENGE              40    /* 0x28 */
54 #define SSH1_CMSG_AUTH_TIS_RESPONSE               41    /* 0x29 */
55 #define SSH1_CMSG_AUTH_CCARD                      70    /* 0x46 */
56 #define SSH1_SMSG_AUTH_CCARD_CHALLENGE            71    /* 0x47 */
57 #define SSH1_CMSG_AUTH_CCARD_RESPONSE             72    /* 0x48 */
58
59 #define SSH1_AUTH_TIS                             5     /* 0x5 */
60 #define SSH1_AUTH_CCARD                           16    /* 0x10 */
61
62 #define SSH1_PROTOFLAG_SCREEN_NUMBER              1     /* 0x1 */
63 /* Mask for protoflags we will echo back to server if seen */
64 #define SSH1_PROTOFLAGS_SUPPORTED                 0     /* 0x1 */
65
66 #define SSH2_MSG_DISCONNECT                       1     /* 0x1 */
67 #define SSH2_MSG_IGNORE                           2     /* 0x2 */
68 #define SSH2_MSG_UNIMPLEMENTED                    3     /* 0x3 */
69 #define SSH2_MSG_DEBUG                            4     /* 0x4 */
70 #define SSH2_MSG_SERVICE_REQUEST                  5     /* 0x5 */
71 #define SSH2_MSG_SERVICE_ACCEPT                   6     /* 0x6 */
72 #define SSH2_MSG_KEXINIT                          20    /* 0x14 */
73 #define SSH2_MSG_NEWKEYS                          21    /* 0x15 */
74 #define SSH2_MSG_KEXDH_INIT                       30    /* 0x1e */
75 #define SSH2_MSG_KEXDH_REPLY                      31    /* 0x1f */
76 #define SSH2_MSG_KEX_DH_GEX_REQUEST               30    /* 0x1e */
77 #define SSH2_MSG_KEX_DH_GEX_GROUP                 31    /* 0x1f */
78 #define SSH2_MSG_KEX_DH_GEX_INIT                  32    /* 0x20 */
79 #define SSH2_MSG_KEX_DH_GEX_REPLY                 33    /* 0x21 */
80 #define SSH2_MSG_USERAUTH_REQUEST                 50    /* 0x32 */
81 #define SSH2_MSG_USERAUTH_FAILURE                 51    /* 0x33 */
82 #define SSH2_MSG_USERAUTH_SUCCESS                 52    /* 0x34 */
83 #define SSH2_MSG_USERAUTH_BANNER                  53    /* 0x35 */
84 #define SSH2_MSG_USERAUTH_PK_OK                   60    /* 0x3c */
85 #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ        60    /* 0x3c */
86 #define SSH2_MSG_USERAUTH_INFO_REQUEST            60    /* 0x3c */
87 #define SSH2_MSG_USERAUTH_INFO_RESPONSE           61    /* 0x3d */
88 #define SSH2_MSG_GLOBAL_REQUEST                   80    /* 0x50 */
89 #define SSH2_MSG_REQUEST_SUCCESS                  81    /* 0x51 */
90 #define SSH2_MSG_REQUEST_FAILURE                  82    /* 0x52 */
91 #define SSH2_MSG_CHANNEL_OPEN                     90    /* 0x5a */
92 #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION        91    /* 0x5b */
93 #define SSH2_MSG_CHANNEL_OPEN_FAILURE             92    /* 0x5c */
94 #define SSH2_MSG_CHANNEL_WINDOW_ADJUST            93    /* 0x5d */
95 #define SSH2_MSG_CHANNEL_DATA                     94    /* 0x5e */
96 #define SSH2_MSG_CHANNEL_EXTENDED_DATA            95    /* 0x5f */
97 #define SSH2_MSG_CHANNEL_EOF                      96    /* 0x60 */
98 #define SSH2_MSG_CHANNEL_CLOSE                    97    /* 0x61 */
99 #define SSH2_MSG_CHANNEL_REQUEST                  98    /* 0x62 */
100 #define SSH2_MSG_CHANNEL_SUCCESS                  99    /* 0x63 */
101 #define SSH2_MSG_CHANNEL_FAILURE                  100   /* 0x64 */
102
103 /*
104  * Packet type contexts, so that ssh2_pkt_type can correctly decode
105  * the ambiguous type numbers back into the correct type strings.
106  */
107 #define SSH2_PKTCTX_DHGROUP          0x0001
108 #define SSH2_PKTCTX_DHGEX            0x0002
109 #define SSH2_PKTCTX_KEX_MASK         0x000F
110 #define SSH2_PKTCTX_PUBLICKEY        0x0010
111 #define SSH2_PKTCTX_PASSWORD         0x0020
112 #define SSH2_PKTCTX_KBDINTER         0x0040
113 #define SSH2_PKTCTX_AUTH_MASK        0x00F0
114
115 #define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1   /* 0x1 */
116 #define SSH2_DISCONNECT_PROTOCOL_ERROR            2     /* 0x2 */
117 #define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED       3     /* 0x3 */
118 #define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4    /* 0x4 */
119 #define SSH2_DISCONNECT_MAC_ERROR                 5     /* 0x5 */
120 #define SSH2_DISCONNECT_COMPRESSION_ERROR         6     /* 0x6 */
121 #define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE     7     /* 0x7 */
122 #define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8        /* 0x8 */
123 #define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE   9     /* 0x9 */
124 #define SSH2_DISCONNECT_CONNECTION_LOST           10    /* 0xa */
125 #define SSH2_DISCONNECT_BY_APPLICATION            11    /* 0xb */
126 #define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS      12    /* 0xc */
127 #define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER    13    /* 0xd */
128 #define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14       /* 0xe */
129 #define SSH2_DISCONNECT_ILLEGAL_USER_NAME         15    /* 0xf */
130
131 static const char *const ssh2_disconnect_reasons[] = {
132     NULL,
133     "SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT",
134     "SSH_DISCONNECT_PROTOCOL_ERROR",
135     "SSH_DISCONNECT_KEY_EXCHANGE_FAILED",
136     "SSH_DISCONNECT_HOST_AUTHENTICATION_FAILED",
137     "SSH_DISCONNECT_MAC_ERROR",
138     "SSH_DISCONNECT_COMPRESSION_ERROR",
139     "SSH_DISCONNECT_SERVICE_NOT_AVAILABLE",
140     "SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED",
141     "SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE",
142     "SSH_DISCONNECT_CONNECTION_LOST",
143     "SSH_DISCONNECT_BY_APPLICATION",
144     "SSH_DISCONNECT_TOO_MANY_CONNECTIONS",
145     "SSH_DISCONNECT_AUTH_CANCELLED_BY_USER",
146     "SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE",
147     "SSH_DISCONNECT_ILLEGAL_USER_NAME",
148 };
149
150 #define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED     1     /* 0x1 */
151 #define SSH2_OPEN_CONNECT_FAILED                  2     /* 0x2 */
152 #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE            3     /* 0x3 */
153 #define SSH2_OPEN_RESOURCE_SHORTAGE               4     /* 0x4 */
154
155 #define SSH2_EXTENDED_DATA_STDERR                 1     /* 0x1 */
156
157 /*
158  * Various remote-bug flags.
159  */
160 #define BUG_CHOKES_ON_SSH1_IGNORE                 1
161 #define BUG_SSH2_HMAC                             2
162 #define BUG_NEEDS_SSH1_PLAIN_PASSWORD             4
163 #define BUG_CHOKES_ON_RSA                         8
164 #define BUG_SSH2_RSA_PADDING                     16
165 #define BUG_SSH2_DERIVEKEY                       32
166 #define BUG_SSH2_REKEY                           64
167 #define BUG_SSH2_PK_SESSIONID                   128
168
169 #define translate(x) if (type == x) return #x
170 #define translatec(x,ctx) if (type == x && (pkt_ctx & ctx)) return #x
171 static char *ssh1_pkt_type(int type)
172 {
173     translate(SSH1_MSG_DISCONNECT);
174     translate(SSH1_SMSG_PUBLIC_KEY);
175     translate(SSH1_CMSG_SESSION_KEY);
176     translate(SSH1_CMSG_USER);
177     translate(SSH1_CMSG_AUTH_RSA);
178     translate(SSH1_SMSG_AUTH_RSA_CHALLENGE);
179     translate(SSH1_CMSG_AUTH_RSA_RESPONSE);
180     translate(SSH1_CMSG_AUTH_PASSWORD);
181     translate(SSH1_CMSG_REQUEST_PTY);
182     translate(SSH1_CMSG_WINDOW_SIZE);
183     translate(SSH1_CMSG_EXEC_SHELL);
184     translate(SSH1_CMSG_EXEC_CMD);
185     translate(SSH1_SMSG_SUCCESS);
186     translate(SSH1_SMSG_FAILURE);
187     translate(SSH1_CMSG_STDIN_DATA);
188     translate(SSH1_SMSG_STDOUT_DATA);
189     translate(SSH1_SMSG_STDERR_DATA);
190     translate(SSH1_CMSG_EOF);
191     translate(SSH1_SMSG_EXIT_STATUS);
192     translate(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION);
193     translate(SSH1_MSG_CHANNEL_OPEN_FAILURE);
194     translate(SSH1_MSG_CHANNEL_DATA);
195     translate(SSH1_MSG_CHANNEL_CLOSE);
196     translate(SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION);
197     translate(SSH1_SMSG_X11_OPEN);
198     translate(SSH1_CMSG_PORT_FORWARD_REQUEST);
199     translate(SSH1_MSG_PORT_OPEN);
200     translate(SSH1_CMSG_AGENT_REQUEST_FORWARDING);
201     translate(SSH1_SMSG_AGENT_OPEN);
202     translate(SSH1_MSG_IGNORE);
203     translate(SSH1_CMSG_EXIT_CONFIRMATION);
204     translate(SSH1_CMSG_X11_REQUEST_FORWARDING);
205     translate(SSH1_CMSG_AUTH_RHOSTS_RSA);
206     translate(SSH1_MSG_DEBUG);
207     translate(SSH1_CMSG_REQUEST_COMPRESSION);
208     translate(SSH1_CMSG_AUTH_TIS);
209     translate(SSH1_SMSG_AUTH_TIS_CHALLENGE);
210     translate(SSH1_CMSG_AUTH_TIS_RESPONSE);
211     translate(SSH1_CMSG_AUTH_CCARD);
212     translate(SSH1_SMSG_AUTH_CCARD_CHALLENGE);
213     translate(SSH1_CMSG_AUTH_CCARD_RESPONSE);
214     return "unknown";
215 }
216 static char *ssh2_pkt_type(int pkt_ctx, int type)
217 {
218     translate(SSH2_MSG_DISCONNECT);
219     translate(SSH2_MSG_IGNORE);
220     translate(SSH2_MSG_UNIMPLEMENTED);
221     translate(SSH2_MSG_DEBUG);
222     translate(SSH2_MSG_SERVICE_REQUEST);
223     translate(SSH2_MSG_SERVICE_ACCEPT);
224     translate(SSH2_MSG_KEXINIT);
225     translate(SSH2_MSG_NEWKEYS);
226     translatec(SSH2_MSG_KEXDH_INIT, SSH2_PKTCTX_DHGROUP);
227     translatec(SSH2_MSG_KEXDH_REPLY, SSH2_PKTCTX_DHGROUP);
228     translatec(SSH2_MSG_KEX_DH_GEX_REQUEST, SSH2_PKTCTX_DHGEX);
229     translatec(SSH2_MSG_KEX_DH_GEX_GROUP, SSH2_PKTCTX_DHGEX);
230     translatec(SSH2_MSG_KEX_DH_GEX_INIT, SSH2_PKTCTX_DHGEX);
231     translatec(SSH2_MSG_KEX_DH_GEX_REPLY, SSH2_PKTCTX_DHGEX);
232     translate(SSH2_MSG_USERAUTH_REQUEST);
233     translate(SSH2_MSG_USERAUTH_FAILURE);
234     translate(SSH2_MSG_USERAUTH_SUCCESS);
235     translate(SSH2_MSG_USERAUTH_BANNER);
236     translatec(SSH2_MSG_USERAUTH_PK_OK, SSH2_PKTCTX_PUBLICKEY);
237     translatec(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, SSH2_PKTCTX_PASSWORD);
238     translatec(SSH2_MSG_USERAUTH_INFO_REQUEST, SSH2_PKTCTX_KBDINTER);
239     translatec(SSH2_MSG_USERAUTH_INFO_RESPONSE, SSH2_PKTCTX_KBDINTER);
240     translate(SSH2_MSG_GLOBAL_REQUEST);
241     translate(SSH2_MSG_REQUEST_SUCCESS);
242     translate(SSH2_MSG_REQUEST_FAILURE);
243     translate(SSH2_MSG_CHANNEL_OPEN);
244     translate(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
245     translate(SSH2_MSG_CHANNEL_OPEN_FAILURE);
246     translate(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
247     translate(SSH2_MSG_CHANNEL_DATA);
248     translate(SSH2_MSG_CHANNEL_EXTENDED_DATA);
249     translate(SSH2_MSG_CHANNEL_EOF);
250     translate(SSH2_MSG_CHANNEL_CLOSE);
251     translate(SSH2_MSG_CHANNEL_REQUEST);
252     translate(SSH2_MSG_CHANNEL_SUCCESS);
253     translate(SSH2_MSG_CHANNEL_FAILURE);
254     return "unknown";
255 }
256 #undef translate
257 #undef translatec
258
259 #define GET_32BIT(cp) \
260     (((unsigned long)(unsigned char)(cp)[0] << 24) | \
261     ((unsigned long)(unsigned char)(cp)[1] << 16) | \
262     ((unsigned long)(unsigned char)(cp)[2] << 8) | \
263     ((unsigned long)(unsigned char)(cp)[3]))
264
265 #define PUT_32BIT(cp, value) { \
266     (cp)[0] = (unsigned char)((value) >> 24); \
267     (cp)[1] = (unsigned char)((value) >> 16); \
268     (cp)[2] = (unsigned char)((value) >> 8); \
269     (cp)[3] = (unsigned char)(value); }
270
271 /* Enumeration values for fields in SSH-1 packets */
272 enum {
273     PKT_END, PKT_INT, PKT_CHAR, PKT_DATA, PKT_STR, PKT_BIGNUM,
274     /* These values are for communicating relevant semantics of
275      * fields to the packet logging code. */
276     PKTT_OTHER, PKTT_PASSWORD, PKTT_DATA
277 };
278
279 /*
280  * Coroutine mechanics for the sillier bits of the code. If these
281  * macros look impenetrable to you, you might find it helpful to
282  * read
283  * 
284  *   http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
285  * 
286  * which explains the theory behind these macros.
287  * 
288  * In particular, if you are getting `case expression not constant'
289  * errors when building with MS Visual Studio, this is because MS's
290  * Edit and Continue debugging feature causes their compiler to
291  * violate ANSI C. To disable Edit and Continue debugging:
292  * 
293  *  - right-click ssh.c in the FileView
294  *  - click Settings
295  *  - select the C/C++ tab and the General category
296  *  - under `Debug info:', select anything _other_ than `Program
297  *    Database for Edit and Continue'.
298  */
299 #define crBegin(v)      { int *crLine = &v; switch(v) { case 0:;
300 #define crState(t) \
301     struct t *s; \
302     if (!ssh->t) ssh->t = snew(struct t); \
303     s = ssh->t;
304 #define crFinish(z)     } *crLine = 0; return (z); }
305 #define crFinishV       } *crLine = 0; return; }
306 #define crReturn(z)     \
307         do {\
308             *crLine =__LINE__; return (z); case __LINE__:;\
309         } while (0)
310 #define crReturnV       \
311         do {\
312             *crLine=__LINE__; return; case __LINE__:;\
313         } while (0)
314 #define crStop(z)       do{ *crLine = 0; return (z); }while(0)
315 #define crStopV         do{ *crLine = 0; return; }while(0)
316 #define crWaitUntil(c)  do { crReturn(0); } while (!(c))
317 #define crWaitUntilV(c) do { crReturnV; } while (!(c))
318
319 typedef struct ssh_tag *Ssh;
320 struct Packet;
321
322 static struct Packet *ssh2_pkt_init(int pkt_type);
323 static void ssh2_pkt_addbool(struct Packet *, unsigned char value);
324 static void ssh2_pkt_adduint32(struct Packet *, unsigned long value);
325 static void ssh2_pkt_addstring_start(struct Packet *);
326 static void ssh2_pkt_addstring_str(struct Packet *, char *data);
327 static void ssh2_pkt_addstring_data(struct Packet *, char *data, int len);
328 static void ssh2_pkt_addstring(struct Packet *, char *data);
329 static unsigned char *ssh2_mpint_fmt(Bignum b, int *len);
330 static void ssh2_pkt_addmp(struct Packet *, Bignum b);
331 static int ssh2_pkt_construct(Ssh, struct Packet *);
332 static void ssh2_pkt_send(Ssh, struct Packet *);
333 static void ssh2_pkt_send_noqueue(Ssh, struct Packet *);
334 static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
335                          struct Packet *pktin);
336 static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
337                              struct Packet *pktin);
338
339 /*
340  * Buffer management constants. There are several of these for
341  * various different purposes:
342  * 
343  *  - SSH1_BUFFER_LIMIT is the amount of backlog that must build up
344  *    on a local data stream before we throttle the whole SSH
345  *    connection (in SSH1 only). Throttling the whole connection is
346  *    pretty drastic so we set this high in the hope it won't
347  *    happen very often.
348  * 
349  *  - SSH_MAX_BACKLOG is the amount of backlog that must build up
350  *    on the SSH connection itself before we defensively throttle
351  *    _all_ local data streams. This is pretty drastic too (though
352  *    thankfully unlikely in SSH2 since the window mechanism should
353  *    ensure that the server never has any need to throttle its end
354  *    of the connection), so we set this high as well.
355  * 
356  *  - OUR_V2_WINSIZE is the maximum window size we present on SSH2
357  *    channels.
358  */
359
360 #define SSH1_BUFFER_LIMIT 32768
361 #define SSH_MAX_BACKLOG 32768
362 #define OUR_V2_WINSIZE 16384
363 #define OUR_V2_MAXPKT 0x4000UL
364
365 const static struct ssh_signkey *hostkey_algs[] = { &ssh_rsa, &ssh_dss };
366
367 static void *nullmac_make_context(void)
368 {
369     return NULL;
370 }
371 static void nullmac_free_context(void *handle)
372 {
373 }
374 static void nullmac_key(void *handle, unsigned char *key)
375 {
376 }
377 static void nullmac_generate(void *handle, unsigned char *blk, int len,
378                              unsigned long seq)
379 {
380 }
381 static int nullmac_verify(void *handle, unsigned char *blk, int len,
382                           unsigned long seq)
383 {
384     return 1;
385 }
386 const static struct ssh_mac ssh_mac_none = {
387     nullmac_make_context, nullmac_free_context, nullmac_key,
388     nullmac_generate, nullmac_verify, "none", 0
389 };
390 const static struct ssh_mac *macs[] = {
391     &ssh_sha1, &ssh_md5, &ssh_mac_none
392 };
393 const static struct ssh_mac *buggymacs[] = {
394     &ssh_sha1_buggy, &ssh_md5, &ssh_mac_none
395 };
396
397 static void *ssh_comp_none_init(void)
398 {
399     return NULL;
400 }
401 static void ssh_comp_none_cleanup(void *handle)
402 {
403 }
404 static int ssh_comp_none_block(void *handle, unsigned char *block, int len,
405                                unsigned char **outblock, int *outlen)
406 {
407     return 0;
408 }
409 static int ssh_comp_none_disable(void *handle)
410 {
411     return 0;
412 }
413 const static struct ssh_compress ssh_comp_none = {
414     "none",
415     ssh_comp_none_init, ssh_comp_none_cleanup, ssh_comp_none_block,
416     ssh_comp_none_init, ssh_comp_none_cleanup, ssh_comp_none_block,
417     ssh_comp_none_disable, NULL
418 };
419 extern const struct ssh_compress ssh_zlib;
420 const static struct ssh_compress *compressions[] = {
421     &ssh_zlib, &ssh_comp_none
422 };
423
424 enum {                                 /* channel types */
425     CHAN_MAINSESSION,
426     CHAN_X11,
427     CHAN_AGENT,
428     CHAN_SOCKDATA,
429     CHAN_SOCKDATA_DORMANT              /* one the remote hasn't confirmed */
430 };
431
432 /*
433  * 2-3-4 tree storing channels.
434  */
435 struct ssh_channel {
436     Ssh ssh;                           /* pointer back to main context */
437     unsigned remoteid, localid;
438     int type;
439     /* True if we opened this channel but server hasn't confirmed. */
440     int halfopen;
441     /*
442      * In SSH1, this value contains four bits:
443      * 
444      *   1   We have sent SSH1_MSG_CHANNEL_CLOSE.
445      *   2   We have sent SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION.
446      *   4   We have received SSH1_MSG_CHANNEL_CLOSE.
447      *   8   We have received SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION.
448      * 
449      * A channel is completely finished with when all four bits are set.
450      */
451     int closes;
452     union {
453         struct ssh1_data_channel {
454             int throttling;
455         } v1;
456         struct ssh2_data_channel {
457             bufchain outbuffer;
458             unsigned remwindow, remmaxpkt;
459             unsigned locwindow;
460         } v2;
461     } v;
462     union {
463         struct ssh_agent_channel {
464             unsigned char *message;
465             unsigned char msglen[4];
466             unsigned lensofar, totallen;
467         } a;
468         struct ssh_x11_channel {
469             Socket s;
470         } x11;
471         struct ssh_pfd_channel {
472             Socket s;
473         } pfd;
474     } u;
475 };
476
477 /*
478  * 2-3-4 tree storing remote->local port forwardings. SSH 1 and SSH
479  * 2 use this structure in different ways, reflecting SSH 2's
480  * altogether saner approach to port forwarding.
481  * 
482  * In SSH 1, you arrange a remote forwarding by sending the server
483  * the remote port number, and the local destination host:port.
484  * When a connection comes in, the server sends you back that
485  * host:port pair, and you connect to it. This is a ready-made
486  * security hole if you're not on the ball: a malicious server
487  * could send you back _any_ host:port pair, so if you trustingly
488  * connect to the address it gives you then you've just opened the
489  * entire inside of your corporate network just by connecting
490  * through it to a dodgy SSH server. Hence, we must store a list of
491  * host:port pairs we _are_ trying to forward to, and reject a
492  * connection request from the server if it's not in the list.
493  * 
494  * In SSH 2, each side of the connection minds its own business and
495  * doesn't send unnecessary information to the other. You arrange a
496  * remote forwarding by sending the server just the remote port
497  * number. When a connection comes in, the server tells you which
498  * of its ports was connected to; and _you_ have to remember what
499  * local host:port pair went with that port number.
500  * 
501  * Hence, in SSH 1 this structure is indexed by destination
502  * host:port pair, whereas in SSH 2 it is indexed by source port.
503  */
504 struct ssh_portfwd; /* forward declaration */
505
506 struct ssh_rportfwd {
507     unsigned sport, dport;
508     char dhost[256];
509     char *sportdesc;
510     struct ssh_portfwd *pfrec;
511 };
512 #define free_rportfwd(pf) ( \
513     ((pf) ? (sfree((pf)->sportdesc)) : (void)0 ), sfree(pf) )
514
515 /*
516  * Separately to the rportfwd tree (which is for looking up port
517  * open requests from the server), a tree of _these_ structures is
518  * used to keep track of all the currently open port forwardings,
519  * so that we can reconfigure in mid-session if the user requests
520  * it.
521  */
522 struct ssh_portfwd {
523     enum { DESTROY, KEEP, CREATE } status;
524     int type;
525     unsigned sport, dport;
526     char *saddr, *daddr;
527     char *sserv, *dserv;
528     struct ssh_rportfwd *remote;
529     int addressfamily;
530     void *local;
531 };
532 #define free_portfwd(pf) ( \
533     ((pf) ? (sfree((pf)->saddr), sfree((pf)->daddr), \
534              sfree((pf)->sserv), sfree((pf)->dserv)) : (void)0 ), sfree(pf) )
535
536 struct Packet {
537     long length;
538     long forcepad; /* Force padding to at least this length */
539     int type;
540     unsigned long sequence;
541     unsigned char *data;
542     unsigned char *body;
543     long savedpos;
544     long maxlen;
545     long encrypted_len;                /* for SSH2 total-size counting */
546
547     /*
548      * State associated with packet logging
549      */
550     int logmode;
551     int nblanks;
552     struct logblank_t *blanks;
553 };
554
555 static void ssh1_protocol(Ssh ssh, void *vin, int inlen,
556                           struct Packet *pktin);
557 static void ssh2_protocol(Ssh ssh, void *vin, int inlen,
558                           struct Packet *pktin);
559 static void ssh1_protocol_setup(Ssh ssh);
560 static void ssh2_protocol_setup(Ssh ssh);
561 static void ssh_size(void *handle, int width, int height);
562 static void ssh_special(void *handle, Telnet_Special);
563 static int ssh2_try_send(struct ssh_channel *c);
564 static void ssh2_add_channel_data(struct ssh_channel *c, char *buf, int len);
565 static void ssh_throttle_all(Ssh ssh, int enable, int bufsize);
566 static void ssh2_set_window(struct ssh_channel *c, unsigned newwin);
567 static int ssh_sendbuffer(void *handle);
568 static int ssh_do_close(Ssh ssh, int notify_exit);
569 static unsigned long ssh_pkt_getuint32(struct Packet *pkt);
570 static int ssh2_pkt_getbool(struct Packet *pkt);
571 static void ssh_pkt_getstring(struct Packet *pkt, char **p, int *length);
572 static void ssh2_timer(void *ctx, long now);
573 static int do_ssh2_transport(Ssh ssh, void *vin, int inlen,
574                              struct Packet *pktin);
575
576 struct rdpkt1_state_tag {
577     long len, pad, biglen, to_read;
578     unsigned long realcrc, gotcrc;
579     unsigned char *p;
580     int i;
581     int chunk;
582     struct Packet *pktin;
583 };
584
585 struct rdpkt2_state_tag {
586     long len, pad, payload, packetlen, maclen;
587     int i;
588     int cipherblk;
589     unsigned long incoming_sequence;
590     struct Packet *pktin;
591 };
592
593 typedef void (*handler_fn_t)(Ssh ssh, struct Packet *pktin);
594 typedef void (*chandler_fn_t)(Ssh ssh, struct Packet *pktin, void *ctx);
595
596 struct queued_handler;
597 struct queued_handler {
598     int msg1, msg2;
599     chandler_fn_t handler;
600     void *ctx;
601     struct queued_handler *next;
602 };
603
604 struct ssh_tag {
605     const struct plug_function_table *fn;
606     /* the above field _must_ be first in the structure */
607
608     SHA_State exhash, exhashbase;
609
610     Socket s;
611
612     void *ldisc;
613     void *logctx;
614
615     unsigned char session_key[32];
616     int v1_compressing;
617     int v1_remote_protoflags;
618     int v1_local_protoflags;
619     int agentfwd_enabled;
620     int X11_fwd_enabled;
621     int remote_bugs;
622     const struct ssh_cipher *cipher;
623     void *v1_cipher_ctx;
624     void *crcda_ctx;
625     const struct ssh2_cipher *cscipher, *sccipher;
626     void *cs_cipher_ctx, *sc_cipher_ctx;
627     const struct ssh_mac *csmac, *scmac;
628     void *cs_mac_ctx, *sc_mac_ctx;
629     const struct ssh_compress *cscomp, *sccomp;
630     void *cs_comp_ctx, *sc_comp_ctx;
631     const struct ssh_kex *kex;
632     const struct ssh_signkey *hostkey;
633     unsigned char v2_session_id[20];
634     void *kex_ctx;
635
636     char *savedhost;
637     int savedport;
638     int send_ok;
639     int echoing, editing;
640
641     void *frontend;
642
643     int ospeed, ispeed;                /* temporaries */
644     int term_width, term_height;
645
646     tree234 *channels;                 /* indexed by local id */
647     struct ssh_channel *mainchan;      /* primary session channel */
648     int exitcode;
649     int close_expected;
650
651     tree234 *rportfwds, *portfwds;
652
653     enum {
654         SSH_STATE_PREPACKET,
655         SSH_STATE_BEFORE_SIZE,
656         SSH_STATE_INTERMED,
657         SSH_STATE_SESSION,
658         SSH_STATE_CLOSED
659     } state;
660
661     int size_needed, eof_needed;
662
663     struct Packet **queue;
664     int queuelen, queuesize;
665     int queueing;
666     unsigned char *deferred_send_data;
667     int deferred_len, deferred_size;
668
669     /*
670      * Gross hack: pscp will try to start SFTP but fall back to
671      * scp1 if that fails. This variable is the means by which
672      * scp.c can reach into the SSH code and find out which one it
673      * got.
674      */
675     int fallback_cmd;
676
677     /*
678      * Used for username and password input.
679      */
680     char *userpass_input_buffer;
681     int userpass_input_buflen;
682     int userpass_input_bufpos;
683     int userpass_input_echo;
684
685     int pkt_ctx;
686
687     void *x11auth;
688
689     int version;
690     int v1_throttle_count;
691     int overall_bufsize;
692     int throttled_all;
693     int v1_stdout_throttling;
694     unsigned long v2_outgoing_sequence;
695
696     int ssh1_rdpkt_crstate;
697     int ssh2_rdpkt_crstate;
698     int do_ssh_init_crstate;
699     int ssh_gotdata_crstate;
700     int do_ssh1_login_crstate;
701     int do_ssh1_connection_crstate;
702     int do_ssh2_transport_crstate;
703     int do_ssh2_authconn_crstate;
704
705     void *do_ssh_init_state;
706     void *do_ssh1_login_state;
707     void *do_ssh2_transport_state;
708     void *do_ssh2_authconn_state;
709
710     struct rdpkt1_state_tag rdpkt1_state;
711     struct rdpkt2_state_tag rdpkt2_state;
712
713     /* ssh1 and ssh2 use this for different things, but both use it */
714     int protocol_initial_phase_done;
715
716     void (*protocol) (Ssh ssh, void *vin, int inlen,
717                       struct Packet *pkt);
718     struct Packet *(*s_rdpkt) (Ssh ssh, unsigned char **data, int *datalen);
719
720     /*
721      * We maintain a full _copy_ of a Config structure here, not
722      * merely a pointer to it. That way, when we're passed a new
723      * one for reconfiguration, we can check the differences and
724      * potentially reconfigure port forwardings etc in mid-session.
725      */
726     Config cfg;
727
728     /*
729      * Used to transfer data back from async agent callbacks.
730      */
731     void *agent_response;
732     int agent_response_len;
733
734     /*
735      * Dispatch table for packet types that we may have to deal
736      * with at any time.
737      */
738     handler_fn_t packet_dispatch[256];
739
740     /*
741      * Queues of one-off handler functions for success/failure
742      * indications from a request.
743      */
744     struct queued_handler *qhead, *qtail;
745
746     /*
747      * This module deals with sending keepalives.
748      */
749     Pinger pinger;
750
751     /*
752      * Track incoming and outgoing data sizes and time, for
753      * size-based rekeys.
754      */
755     unsigned long incoming_data_size, outgoing_data_size, deferred_data_size;
756     unsigned long max_data_size;
757     int kex_in_progress;
758     long next_rekey, last_rekey;
759     char *deferred_rekey_reason;    /* points to STATIC string; don't free */
760 };
761
762 #define logevent(s) logevent(ssh->frontend, s)
763
764 /* logevent, only printf-formatted. */
765 static void logeventf(Ssh ssh, const char *fmt, ...)
766 {
767     va_list ap;
768     char *buf;
769
770     va_start(ap, fmt);
771     buf = dupvprintf(fmt, ap);
772     va_end(ap);
773     logevent(buf);
774     sfree(buf);
775 }
776
777 #define bombout(msg) \
778     do { \
779         char *text = dupprintf msg; \
780         ssh_do_close(ssh, FALSE); \
781         logevent(text); \
782         connection_fatal(ssh->frontend, "%s", text); \
783         sfree(text); \
784     } while (0)
785
786 /* Functions to leave bits out of the SSH packet log file. */
787
788 static void dont_log_password(Ssh ssh, struct Packet *pkt, int blanktype)
789 {
790     if (ssh->cfg.logomitpass)
791         pkt->logmode = blanktype;
792 }
793
794 static void dont_log_data(Ssh ssh, struct Packet *pkt, int blanktype)
795 {
796     if (ssh->cfg.logomitdata)
797         pkt->logmode = blanktype;
798 }
799
800 static void end_log_omission(Ssh ssh, struct Packet *pkt)
801 {
802     pkt->logmode = PKTLOG_EMIT;
803 }
804
805 static int ssh_channelcmp(void *av, void *bv)
806 {
807     struct ssh_channel *a = (struct ssh_channel *) av;
808     struct ssh_channel *b = (struct ssh_channel *) bv;
809     if (a->localid < b->localid)
810         return -1;
811     if (a->localid > b->localid)
812         return +1;
813     return 0;
814 }
815 static int ssh_channelfind(void *av, void *bv)
816 {
817     unsigned *a = (unsigned *) av;
818     struct ssh_channel *b = (struct ssh_channel *) bv;
819     if (*a < b->localid)
820         return -1;
821     if (*a > b->localid)
822         return +1;
823     return 0;
824 }
825
826 static int ssh_rportcmp_ssh1(void *av, void *bv)
827 {
828     struct ssh_rportfwd *a = (struct ssh_rportfwd *) av;
829     struct ssh_rportfwd *b = (struct ssh_rportfwd *) bv;
830     int i;
831     if ( (i = strcmp(a->dhost, b->dhost)) != 0)
832         return i < 0 ? -1 : +1;
833     if (a->dport > b->dport)
834         return +1;
835     if (a->dport < b->dport)
836         return -1;
837     return 0;
838 }
839
840 static int ssh_rportcmp_ssh2(void *av, void *bv)
841 {
842     struct ssh_rportfwd *a = (struct ssh_rportfwd *) av;
843     struct ssh_rportfwd *b = (struct ssh_rportfwd *) bv;
844
845     if (a->sport > b->sport)
846         return +1;
847     if (a->sport < b->sport)
848         return -1;
849     return 0;
850 }
851
852 /*
853  * Special form of strcmp which can cope with NULL inputs. NULL is
854  * defined to sort before even the empty string.
855  */
856 static int nullstrcmp(const char *a, const char *b)
857 {
858     if (a == NULL && b == NULL)
859         return 0;
860     if (a == NULL)
861         return -1;
862     if (b == NULL)
863         return +1;
864     return strcmp(a, b);
865 }
866
867 static int ssh_portcmp(void *av, void *bv)
868 {
869     struct ssh_portfwd *a = (struct ssh_portfwd *) av;
870     struct ssh_portfwd *b = (struct ssh_portfwd *) bv;
871     int i;
872     if (a->type > b->type)
873         return +1;
874     if (a->type < b->type)
875         return -1;
876     if (a->addressfamily > b->addressfamily)
877         return +1;
878     if (a->addressfamily < b->addressfamily)
879         return -1;
880     if ( (i = nullstrcmp(a->saddr, b->saddr)) != 0)
881         return i < 0 ? -1 : +1;
882     if (a->sport > b->sport)
883         return +1;
884     if (a->sport < b->sport)
885         return -1;
886     if (a->type != 'D') {
887         if ( (i = nullstrcmp(a->daddr, b->daddr)) != 0)
888             return i < 0 ? -1 : +1;
889         if (a->dport > b->dport)
890             return +1;
891         if (a->dport < b->dport)
892             return -1;
893     }
894     return 0;
895 }
896
897 static int alloc_channel_id(Ssh ssh)
898 {
899     const unsigned CHANNEL_NUMBER_OFFSET = 256;
900     unsigned low, high, mid;
901     int tsize;
902     struct ssh_channel *c;
903
904     /*
905      * First-fit allocation of channel numbers: always pick the
906      * lowest unused one. To do this, binary-search using the
907      * counted B-tree to find the largest channel ID which is in a
908      * contiguous sequence from the beginning. (Precisely
909      * everything in that sequence must have ID equal to its tree
910      * index plus CHANNEL_NUMBER_OFFSET.)
911      */
912     tsize = count234(ssh->channels);
913
914     low = -1;
915     high = tsize;
916     while (high - low > 1) {
917         mid = (high + low) / 2;
918         c = index234(ssh->channels, mid);
919         if (c->localid == mid + CHANNEL_NUMBER_OFFSET)
920             low = mid;                 /* this one is fine */
921         else
922             high = mid;                /* this one is past it */
923     }
924     /*
925      * Now low points to either -1, or the tree index of the
926      * largest ID in the initial sequence.
927      */
928     {
929         unsigned i = low + 1 + CHANNEL_NUMBER_OFFSET;
930         assert(NULL == find234(ssh->channels, &i, ssh_channelfind));
931     }
932     return low + 1 + CHANNEL_NUMBER_OFFSET;
933 }
934
935 static void c_write(Ssh ssh, const char *buf, int len)
936 {
937     if ((flags & FLAG_STDERR)) {
938         int i;
939         for (i = 0; i < len; i++)
940             if (buf[i] != '\r')
941                 fputc(buf[i], stderr);
942         return;
943     }
944     from_backend(ssh->frontend, 1, buf, len);
945 }
946
947 static void c_write_untrusted(Ssh ssh, const char *buf, int len)
948 {
949     int i;
950     for (i = 0; i < len; i++) {
951         if (buf[i] == '\n')
952             c_write(ssh, "\r\n", 2);
953         else if ((buf[i] & 0x60) || (buf[i] == '\r'))
954             c_write(ssh, buf + i, 1);
955     }
956 }
957
958 static void c_write_str(Ssh ssh, const char *buf)
959 {
960     c_write(ssh, buf, strlen(buf));
961 }
962
963 static void ssh_free_packet(struct Packet *pkt)
964 {
965     sfree(pkt->data);
966     sfree(pkt);
967 }
968 static struct Packet *ssh_new_packet(void)
969 {
970     struct Packet *pkt = snew(struct Packet);
971
972     pkt->data = NULL;
973     pkt->maxlen = 0;
974     pkt->logmode = PKTLOG_EMIT;
975     pkt->nblanks = 0;
976     pkt->blanks = NULL;
977
978     return pkt;
979 }
980
981 /*
982  * Collect incoming data in the incoming packet buffer.
983  * Decipher and verify the packet when it is completely read.
984  * Drop SSH1_MSG_DEBUG and SSH1_MSG_IGNORE packets.
985  * Update the *data and *datalen variables.
986  * Return a Packet structure when a packet is completed.
987  */
988 static struct Packet *ssh1_rdpkt(Ssh ssh, unsigned char **data, int *datalen)
989 {
990     struct rdpkt1_state_tag *st = &ssh->rdpkt1_state;
991
992     crBegin(ssh->ssh1_rdpkt_crstate);
993
994     st->pktin = ssh_new_packet();
995
996     st->pktin->type = 0;
997     st->pktin->length = 0;
998
999     for (st->i = st->len = 0; st->i < 4; st->i++) {
1000         while ((*datalen) == 0)
1001             crReturn(NULL);
1002         st->len = (st->len << 8) + **data;
1003         (*data)++, (*datalen)--;
1004     }
1005
1006     st->pad = 8 - (st->len % 8);
1007     st->biglen = st->len + st->pad;
1008     st->pktin->length = st->len - 5;
1009
1010     if (st->biglen < 0) {
1011         bombout(("Extremely large packet length from server suggests"
1012                  " data stream corruption"));
1013         ssh_free_packet(st->pktin);
1014         crStop(NULL);
1015     }
1016
1017     st->pktin->maxlen = st->biglen;
1018     st->pktin->data = snewn(st->biglen + APIEXTRA, unsigned char);
1019
1020     st->to_read = st->biglen;
1021     st->p = st->pktin->data;
1022     while (st->to_read > 0) {
1023         st->chunk = st->to_read;
1024         while ((*datalen) == 0)
1025             crReturn(NULL);
1026         if (st->chunk > (*datalen))
1027             st->chunk = (*datalen);
1028         memcpy(st->p, *data, st->chunk);
1029         *data += st->chunk;
1030         *datalen -= st->chunk;
1031         st->p += st->chunk;
1032         st->to_read -= st->chunk;
1033     }
1034
1035     if (ssh->cipher && detect_attack(ssh->crcda_ctx, st->pktin->data,
1036                                      st->biglen, NULL)) {
1037         bombout(("Network attack (CRC compensation) detected!"));
1038         ssh_free_packet(st->pktin);
1039         crStop(NULL);
1040     }
1041
1042     if (ssh->cipher)
1043         ssh->cipher->decrypt(ssh->v1_cipher_ctx, st->pktin->data, st->biglen);
1044
1045     st->realcrc = crc32_compute(st->pktin->data, st->biglen - 4);
1046     st->gotcrc = GET_32BIT(st->pktin->data + st->biglen - 4);
1047     if (st->gotcrc != st->realcrc) {
1048         bombout(("Incorrect CRC received on packet"));
1049         ssh_free_packet(st->pktin);
1050         crStop(NULL);
1051     }
1052
1053     st->pktin->body = st->pktin->data + st->pad + 1;
1054     st->pktin->savedpos = 0;
1055
1056     if (ssh->v1_compressing) {
1057         unsigned char *decompblk;
1058         int decomplen;
1059         if (!zlib_decompress_block(ssh->sc_comp_ctx,
1060                                    st->pktin->body - 1, st->pktin->length + 1,
1061                                    &decompblk, &decomplen)) {
1062             bombout(("Zlib decompression encountered invalid data"));
1063             ssh_free_packet(st->pktin);
1064             crStop(NULL);
1065         }
1066
1067         if (st->pktin->maxlen < st->pad + decomplen) {
1068             st->pktin->maxlen = st->pad + decomplen;
1069             st->pktin->data = sresize(st->pktin->data,
1070                                       st->pktin->maxlen + APIEXTRA,
1071                                       unsigned char);
1072             st->pktin->body = st->pktin->data + st->pad + 1;
1073         }
1074
1075         memcpy(st->pktin->body - 1, decompblk, decomplen);
1076         sfree(decompblk);
1077         st->pktin->length = decomplen - 1;
1078     }
1079
1080     st->pktin->type = st->pktin->body[-1];
1081
1082     /*
1083      * Log incoming packet, possibly omitting sensitive fields.
1084      */
1085     if (ssh->logctx) {
1086         int nblanks = 0;
1087         struct logblank_t blank;
1088         if (ssh->cfg.logomitdata) {
1089             int do_blank = FALSE, blank_prefix = 0;
1090             /* "Session data" packets - omit the data field */
1091             if ((st->pktin->type == SSH1_SMSG_STDOUT_DATA) ||
1092                 (st->pktin->type == SSH1_SMSG_STDERR_DATA)) {
1093                 do_blank = TRUE; blank_prefix = 0;
1094             } else if (st->pktin->type == SSH1_MSG_CHANNEL_DATA) {
1095                 do_blank = TRUE; blank_prefix = 4;
1096             }
1097             if (do_blank) {
1098                 blank.offset = blank_prefix;
1099                 blank.len = st->pktin->length;
1100                 blank.type = PKTLOG_OMIT;
1101                 nblanks = 1;
1102             }
1103         }
1104         log_packet(ssh->logctx,
1105                    PKT_INCOMING, st->pktin->type,
1106                    ssh1_pkt_type(st->pktin->type),
1107                    st->pktin->body, st->pktin->length,
1108                    nblanks, &blank);
1109     }
1110
1111     crFinish(st->pktin);
1112 }
1113
1114 static struct Packet *ssh2_rdpkt(Ssh ssh, unsigned char **data, int *datalen)
1115 {
1116     struct rdpkt2_state_tag *st = &ssh->rdpkt2_state;
1117
1118     crBegin(ssh->ssh2_rdpkt_crstate);
1119
1120     st->pktin = ssh_new_packet();
1121
1122     st->pktin->type = 0;
1123     st->pktin->length = 0;
1124     if (ssh->sccipher)
1125         st->cipherblk = ssh->sccipher->blksize;
1126     else
1127         st->cipherblk = 8;
1128     if (st->cipherblk < 8)
1129         st->cipherblk = 8;
1130
1131     st->pktin->data = snewn(st->cipherblk + APIEXTRA, unsigned char);
1132
1133     /*
1134      * Acquire and decrypt the first block of the packet. This will
1135      * contain the length and padding details.
1136      */
1137     for (st->i = st->len = 0; st->i < st->cipherblk; st->i++) {
1138         while ((*datalen) == 0)
1139             crReturn(NULL);
1140         st->pktin->data[st->i] = *(*data)++;
1141         (*datalen)--;
1142     }
1143
1144     if (ssh->sccipher)
1145         ssh->sccipher->decrypt(ssh->sc_cipher_ctx,
1146                                st->pktin->data, st->cipherblk);
1147
1148     /*
1149      * Now get the length and padding figures.
1150      */
1151     st->len = GET_32BIT(st->pktin->data);
1152     st->pad = st->pktin->data[4];
1153
1154     /*
1155      * _Completely_ silly lengths should be stomped on before they
1156      * do us any more damage.
1157      */
1158     if (st->len < 0 || st->pad < 0 || st->len + st->pad < 0) {
1159         bombout(("Incoming packet was garbled on decryption"));
1160         ssh_free_packet(st->pktin);
1161         crStop(NULL);
1162     }
1163
1164     /*
1165      * This enables us to deduce the payload length.
1166      */
1167     st->payload = st->len - st->pad - 1;
1168
1169     st->pktin->length = st->payload + 5;
1170
1171     /*
1172      * So now we can work out the total packet length.
1173      */
1174     st->packetlen = st->len + 4;
1175     st->maclen = ssh->scmac ? ssh->scmac->len : 0;
1176
1177     /*
1178      * Allocate memory for the rest of the packet.
1179      */
1180     st->pktin->maxlen = st->packetlen + st->maclen;
1181     st->pktin->data = sresize(st->pktin->data,
1182                               st->pktin->maxlen + APIEXTRA,
1183                               unsigned char);
1184
1185     /*
1186      * Read and decrypt the remainder of the packet.
1187      */
1188     for (st->i = st->cipherblk; st->i < st->packetlen + st->maclen;
1189          st->i++) {
1190         while ((*datalen) == 0)
1191             crReturn(NULL);
1192         st->pktin->data[st->i] = *(*data)++;
1193         (*datalen)--;
1194     }
1195     /* Decrypt everything _except_ the MAC. */
1196     if (ssh->sccipher)
1197         ssh->sccipher->decrypt(ssh->sc_cipher_ctx,
1198                                st->pktin->data + st->cipherblk,
1199                                st->packetlen - st->cipherblk);
1200
1201     st->pktin->encrypted_len = st->packetlen;
1202
1203     /*
1204      * Check the MAC.
1205      */
1206     if (ssh->scmac
1207         && !ssh->scmac->verify(ssh->sc_mac_ctx, st->pktin->data, st->len + 4,
1208                                st->incoming_sequence)) {
1209         bombout(("Incorrect MAC received on packet"));
1210         ssh_free_packet(st->pktin);
1211         crStop(NULL);
1212     }
1213
1214     st->pktin->sequence = st->incoming_sequence++;
1215
1216     /*
1217      * Decompress packet payload.
1218      */
1219     {
1220         unsigned char *newpayload;
1221         int newlen;
1222         if (ssh->sccomp &&
1223             ssh->sccomp->decompress(ssh->sc_comp_ctx,
1224                                     st->pktin->data + 5, st->pktin->length - 5,
1225                                     &newpayload, &newlen)) {
1226             if (st->pktin->maxlen < newlen + 5) {
1227                 st->pktin->maxlen = newlen + 5;
1228                 st->pktin->data = sresize(st->pktin->data,
1229                                           st->pktin->maxlen + APIEXTRA,
1230                                           unsigned char);
1231             }
1232             st->pktin->length = 5 + newlen;
1233             memcpy(st->pktin->data + 5, newpayload, newlen);
1234             sfree(newpayload);
1235         }
1236     }
1237
1238     st->pktin->savedpos = 6;
1239     st->pktin->body = st->pktin->data;
1240     st->pktin->type = st->pktin->data[5];
1241
1242     /*
1243      * Log incoming packet, possibly omitting sensitive fields.
1244      */
1245     if (ssh->logctx) {
1246         int nblanks = 0;
1247         struct logblank_t blank;
1248         if (ssh->cfg.logomitdata) {
1249             int do_blank = FALSE, blank_prefix = 0;
1250             /* "Session data" packets - omit the data field */
1251             if (st->pktin->type == SSH2_MSG_CHANNEL_DATA) {
1252                 do_blank = TRUE; blank_prefix = 4;
1253             } else if (st->pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA) {
1254                 do_blank = TRUE; blank_prefix = 8;
1255             }
1256             if (do_blank) {
1257                 blank.offset = blank_prefix;
1258                 blank.len = (st->pktin->length-6) - blank_prefix;
1259                 blank.type = PKTLOG_OMIT;
1260                 nblanks = 1;
1261             }
1262         }
1263         log_packet(ssh->logctx, PKT_INCOMING, st->pktin->type,
1264                    ssh2_pkt_type(ssh->pkt_ctx, st->pktin->type),
1265                    st->pktin->data+6, st->pktin->length-6,
1266                    nblanks, &blank);
1267     }
1268
1269     crFinish(st->pktin);
1270 }
1271
1272 static void ssh1_pktout_size(struct Packet *pkt, int len)
1273 {
1274     int pad, biglen;
1275
1276     len += 5;                          /* type and CRC */
1277     pad = 8 - (len % 8);
1278     biglen = len + pad;
1279
1280     pkt->length = len - 5;
1281     if (pkt->maxlen < biglen) {
1282         pkt->maxlen = biglen;
1283         pkt->data = sresize(pkt->data, biglen + 4 + APIEXTRA, unsigned char);
1284     }
1285     pkt->body = pkt->data + 4 + pad + 1;
1286 }
1287
1288 static struct Packet *s_wrpkt_start(int type, int len)
1289 {
1290     struct Packet *pkt = ssh_new_packet();
1291     ssh1_pktout_size(pkt, len);
1292     pkt->type = type;
1293     /* Initialise log omission state */
1294     pkt->nblanks = 0;
1295     pkt->blanks = NULL;
1296     return pkt;
1297 }
1298
1299 static int s_wrpkt_prepare(Ssh ssh, struct Packet *pkt)
1300 {
1301     int pad, biglen, i;
1302     unsigned long crc;
1303 #ifdef __SC__
1304     /*
1305      * XXX various versions of SC (including 8.8.4) screw up the
1306      * register allocation in this function and use the same register
1307      * (D6) for len and as a temporary, with predictable results.  The
1308      * following sledgehammer prevents this.
1309      */
1310     volatile
1311 #endif
1312     int len;
1313
1314     pkt->body[-1] = pkt->type;
1315
1316     if (ssh->logctx)
1317         log_packet(ssh->logctx, PKT_OUTGOING, pkt->type,
1318                    ssh1_pkt_type(pkt->type),
1319                    pkt->body, pkt->length,
1320                    pkt->nblanks, pkt->blanks);
1321     sfree(pkt->blanks); pkt->blanks = NULL;
1322     pkt->nblanks = 0;
1323
1324     if (ssh->v1_compressing) {
1325         unsigned char *compblk;
1326         int complen;
1327         zlib_compress_block(ssh->cs_comp_ctx,
1328                             pkt->body - 1, pkt->length + 1,
1329                             &compblk, &complen);
1330         ssh1_pktout_size(pkt, complen - 1);
1331         memcpy(pkt->body - 1, compblk, complen);
1332         sfree(compblk);
1333     }
1334
1335     len = pkt->length + 5;             /* type and CRC */
1336     pad = 8 - (len % 8);
1337     biglen = len + pad;
1338
1339     for (i = 0; i < pad; i++)
1340         pkt->data[i + 4] = random_byte();
1341     crc = crc32_compute(pkt->data + 4, biglen - 4);
1342     PUT_32BIT(pkt->data + biglen, crc);
1343     PUT_32BIT(pkt->data, len);
1344
1345     if (ssh->cipher)
1346         ssh->cipher->encrypt(ssh->v1_cipher_ctx, pkt->data + 4, biglen);
1347
1348     return biglen + 4;
1349 }
1350
1351 static void s_wrpkt(Ssh ssh, struct Packet *pkt)
1352 {
1353     int len, backlog;
1354     len = s_wrpkt_prepare(ssh, pkt);
1355     backlog = sk_write(ssh->s, (char *)pkt->data, len);
1356     if (backlog > SSH_MAX_BACKLOG)
1357         ssh_throttle_all(ssh, 1, backlog);
1358 }
1359
1360 static void s_wrpkt_defer(Ssh ssh, struct Packet *pkt)
1361 {
1362     int len;
1363     len = s_wrpkt_prepare(ssh, pkt);
1364     if (ssh->deferred_len + len > ssh->deferred_size) {
1365         ssh->deferred_size = ssh->deferred_len + len + 128;
1366         ssh->deferred_send_data = sresize(ssh->deferred_send_data,
1367                                           ssh->deferred_size,
1368                                           unsigned char);
1369     }
1370     memcpy(ssh->deferred_send_data + ssh->deferred_len, pkt->data, len);
1371     ssh->deferred_len += len;
1372 }
1373
1374 /*
1375  * Construct a packet with the specified contents.
1376  */
1377 static struct Packet *construct_packet(Ssh ssh, int pkttype,
1378                                        va_list ap1, va_list ap2)
1379 {
1380     unsigned char *p, *argp, argchar;
1381     unsigned long argint;
1382     int pktlen, argtype, arglen;
1383     Bignum bn;
1384     struct Packet *pkt;
1385
1386     pktlen = 0;
1387     while ((argtype = va_arg(ap1, int)) != PKT_END) {
1388         switch (argtype) {
1389           case PKT_INT:
1390             (void) va_arg(ap1, int);
1391             pktlen += 4;
1392             break;
1393           case PKT_CHAR:
1394             (void) va_arg(ap1, int);
1395             pktlen++;
1396             break;
1397           case PKT_DATA:
1398             (void) va_arg(ap1, unsigned char *);
1399             arglen = va_arg(ap1, int);
1400             pktlen += arglen;
1401             break;
1402           case PKT_STR:
1403             argp = va_arg(ap1, unsigned char *);
1404             arglen = strlen((char *)argp);
1405             pktlen += 4 + arglen;
1406             break;
1407           case PKT_BIGNUM:
1408             bn = va_arg(ap1, Bignum);
1409             pktlen += ssh1_bignum_length(bn);
1410             break;
1411           case PKTT_PASSWORD:
1412           case PKTT_DATA:
1413           case PKTT_OTHER:
1414             /* ignore this pass */
1415             break;
1416           default:
1417             assert(0);
1418         }
1419     }
1420
1421     pkt = s_wrpkt_start(pkttype, pktlen);
1422     p = pkt->body;
1423
1424     while ((argtype = va_arg(ap2, int)) != PKT_END) {
1425         int offset = p - pkt->body, len = 0;
1426         switch (argtype) {
1427           /* Actual fields in the packet */
1428           case PKT_INT:
1429             argint = va_arg(ap2, int);
1430             PUT_32BIT(p, argint);
1431             len = 4;
1432             break;
1433           case PKT_CHAR:
1434             argchar = (unsigned char) va_arg(ap2, int);
1435             *p = argchar;
1436             len = 1;
1437             break;
1438           case PKT_DATA:
1439             argp = va_arg(ap2, unsigned char *);
1440             arglen = va_arg(ap2, int);
1441             memcpy(p, argp, arglen);
1442             len = arglen;
1443             break;
1444           case PKT_STR:
1445             argp = va_arg(ap2, unsigned char *);
1446             arglen = strlen((char *)argp);
1447             PUT_32BIT(p, arglen);
1448             memcpy(p + 4, argp, arglen);
1449             len = arglen + 4;
1450             break;
1451           case PKT_BIGNUM:
1452             bn = va_arg(ap2, Bignum);
1453             len = ssh1_write_bignum(p, bn);
1454             break;
1455           /* Tokens for modifications to packet logging */
1456           case PKTT_PASSWORD:
1457             dont_log_password(ssh, pkt, PKTLOG_BLANK);
1458             break;
1459           case PKTT_DATA:
1460             dont_log_data(ssh, pkt, PKTLOG_OMIT);
1461             break;
1462           case PKTT_OTHER:
1463             end_log_omission(ssh, pkt);
1464             break;
1465         }
1466         p += len;
1467         /* Deal with logfile omission, if required. */
1468         if (len && (pkt->logmode != PKTLOG_EMIT)) {
1469             pkt->nblanks++;
1470             pkt->blanks = sresize(pkt->blanks, pkt->nblanks,
1471                                   struct logblank_t);
1472             pkt->blanks[pkt->nblanks-1].offset = offset;
1473             pkt->blanks[pkt->nblanks-1].len    = len;
1474             pkt->blanks[pkt->nblanks-1].type   = pkt->logmode;
1475         }
1476     }
1477
1478     return pkt;
1479 }
1480
1481 static void send_packet(Ssh ssh, int pkttype, ...)
1482 {
1483     struct Packet *pkt;
1484     va_list ap1, ap2;
1485     va_start(ap1, pkttype);
1486     va_start(ap2, pkttype);
1487     pkt = construct_packet(ssh, pkttype, ap1, ap2);
1488     va_end(ap2);
1489     va_end(ap1);
1490     s_wrpkt(ssh, pkt);
1491     ssh_free_packet(pkt);
1492 }
1493
1494 static void defer_packet(Ssh ssh, int pkttype, ...)
1495 {
1496     struct Packet *pkt;
1497     va_list ap1, ap2;
1498     va_start(ap1, pkttype);
1499     va_start(ap2, pkttype);
1500     pkt = construct_packet(ssh, pkttype, ap1, ap2);
1501     va_end(ap2);
1502     va_end(ap1);
1503     s_wrpkt_defer(ssh, pkt);
1504     ssh_free_packet(pkt);
1505 }
1506
1507 static int ssh_versioncmp(char *a, char *b)
1508 {
1509     char *ae, *be;
1510     unsigned long av, bv;
1511
1512     av = strtoul(a, &ae, 10);
1513     bv = strtoul(b, &be, 10);
1514     if (av != bv)
1515         return (av < bv ? -1 : +1);
1516     if (*ae == '.')
1517         ae++;
1518     if (*be == '.')
1519         be++;
1520     av = strtoul(ae, &ae, 10);
1521     bv = strtoul(be, &be, 10);
1522     if (av != bv)
1523         return (av < bv ? -1 : +1);
1524     return 0;
1525 }
1526
1527 /*
1528  * Utility routines for putting an SSH-protocol `string' and
1529  * `uint32' into a SHA state.
1530  */
1531 #include <stdio.h>
1532 static void sha_string(SHA_State * s, void *str, int len)
1533 {
1534     unsigned char lenblk[4];
1535     PUT_32BIT(lenblk, len);
1536     SHA_Bytes(s, lenblk, 4);
1537     SHA_Bytes(s, str, len);
1538 }
1539
1540 static void sha_uint32(SHA_State * s, unsigned i)
1541 {
1542     unsigned char intblk[4];
1543     PUT_32BIT(intblk, i);
1544     SHA_Bytes(s, intblk, 4);
1545 }
1546
1547 /*
1548  * SSH2 packet construction functions.
1549  */
1550 static void ssh2_pkt_ensure(struct Packet *pkt, int length)
1551 {
1552     if (pkt->maxlen < length) {
1553         pkt->maxlen = length + 256;
1554         pkt->data = sresize(pkt->data, pkt->maxlen + APIEXTRA, unsigned char);
1555     }
1556 }
1557 static void ssh2_pkt_adddata(struct Packet *pkt, void *data, int len)
1558 {
1559     if (pkt->logmode != PKTLOG_EMIT) {
1560         pkt->nblanks++;
1561         pkt->blanks = sresize(pkt->blanks, pkt->nblanks, struct logblank_t);
1562         pkt->blanks[pkt->nblanks-1].offset = pkt->length - 6;
1563         pkt->blanks[pkt->nblanks-1].len = len;
1564         pkt->blanks[pkt->nblanks-1].type = pkt->logmode;
1565     }
1566     pkt->length += len;
1567     ssh2_pkt_ensure(pkt, pkt->length);
1568     memcpy(pkt->data + pkt->length - len, data, len);
1569 }
1570 static void ssh2_pkt_addbyte(struct Packet *pkt, unsigned char byte)
1571 {
1572     ssh2_pkt_adddata(pkt, &byte, 1);
1573 }
1574 static struct Packet *ssh2_pkt_init(int pkt_type)
1575 {
1576     struct Packet *pkt = ssh_new_packet();
1577     pkt->length = 5;
1578     pkt->forcepad = 0;
1579     ssh2_pkt_addbyte(pkt, (unsigned char) pkt_type);
1580     return pkt;
1581 }
1582 static void ssh2_pkt_addbool(struct Packet *pkt, unsigned char value)
1583 {
1584     ssh2_pkt_adddata(pkt, &value, 1);
1585 }
1586 static void ssh2_pkt_adduint32(struct Packet *pkt, unsigned long value)
1587 {
1588     unsigned char x[4];
1589     PUT_32BIT(x, value);
1590     ssh2_pkt_adddata(pkt, x, 4);
1591 }
1592 static void ssh2_pkt_addstring_start(struct Packet *pkt)
1593 {
1594     ssh2_pkt_adduint32(pkt, 0);
1595     pkt->savedpos = pkt->length;
1596 }
1597 static void ssh2_pkt_addstring_str(struct Packet *pkt, char *data)
1598 {
1599     ssh2_pkt_adddata(pkt, data, strlen(data));
1600     PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos);
1601 }
1602 static void ssh2_pkt_addstring_data(struct Packet *pkt, char *data, int len)
1603 {
1604     ssh2_pkt_adddata(pkt, data, len);
1605     PUT_32BIT(pkt->data + pkt->savedpos - 4, pkt->length - pkt->savedpos);
1606 }
1607 static void ssh2_pkt_addstring(struct Packet *pkt, char *data)
1608 {
1609     ssh2_pkt_addstring_start(pkt);
1610     ssh2_pkt_addstring_str(pkt, data);
1611 }
1612 static unsigned char *ssh2_mpint_fmt(Bignum b, int *len)
1613 {
1614     unsigned char *p;
1615     int i, n = (bignum_bitcount(b) + 7) / 8;
1616     p = snewn(n + 1, unsigned char);
1617     if (!p)
1618         fatalbox("out of memory");
1619     p[0] = 0;
1620     for (i = 1; i <= n; i++)
1621         p[i] = bignum_byte(b, n - i);
1622     i = 0;
1623     while (i <= n && p[i] == 0 && (p[i + 1] & 0x80) == 0)
1624         i++;
1625     memmove(p, p + i, n + 1 - i);
1626     *len = n + 1 - i;
1627     return p;
1628 }
1629 static void ssh2_pkt_addmp(struct Packet *pkt, Bignum b)
1630 {
1631     unsigned char *p;
1632     int len;
1633     p = ssh2_mpint_fmt(b, &len);
1634     ssh2_pkt_addstring_start(pkt);
1635     ssh2_pkt_addstring_data(pkt, (char *)p, len);
1636     sfree(p);
1637 }
1638
1639 /*
1640  * Construct an SSH2 final-form packet: compress it, encrypt it,
1641  * put the MAC on it. Final packet, ready to be sent, is stored in
1642  * pkt->data. Total length is returned.
1643  */
1644 static int ssh2_pkt_construct(Ssh ssh, struct Packet *pkt)
1645 {
1646     int cipherblk, maclen, padding, i;
1647
1648     if (ssh->logctx)
1649         log_packet(ssh->logctx, PKT_OUTGOING, pkt->data[5],
1650                    ssh2_pkt_type(ssh->pkt_ctx, pkt->data[5]),
1651                    pkt->data + 6, pkt->length - 6,
1652                    pkt->nblanks, pkt->blanks);
1653     sfree(pkt->blanks); pkt->blanks = NULL;
1654     pkt->nblanks = 0;
1655
1656     /*
1657      * Compress packet payload.
1658      */
1659     {
1660         unsigned char *newpayload;
1661         int newlen;
1662         if (ssh->cscomp &&
1663             ssh->cscomp->compress(ssh->cs_comp_ctx, pkt->data + 5,
1664                                   pkt->length - 5,
1665                                   &newpayload, &newlen)) {
1666             pkt->length = 5;
1667             ssh2_pkt_adddata(pkt, newpayload, newlen);
1668             sfree(newpayload);
1669         }
1670     }
1671
1672     /*
1673      * Add padding. At least four bytes, and must also bring total
1674      * length (minus MAC) up to a multiple of the block size.
1675      * If pkt->forcepad is set, make sure the packet is at least that size
1676      * after padding.
1677      */
1678     cipherblk = ssh->cscipher ? ssh->cscipher->blksize : 8;  /* block size */
1679     cipherblk = cipherblk < 8 ? 8 : cipherblk;  /* or 8 if blksize < 8 */
1680     padding = 4;
1681     if (pkt->length + padding < pkt->forcepad)
1682         padding = pkt->forcepad - pkt->length;
1683     padding +=
1684         (cipherblk - (pkt->length + padding) % cipherblk) % cipherblk;
1685     assert(padding <= 255);
1686     maclen = ssh->csmac ? ssh->csmac->len : 0;
1687     ssh2_pkt_ensure(pkt, pkt->length + padding + maclen);
1688     pkt->data[4] = padding;
1689     for (i = 0; i < padding; i++)
1690         pkt->data[pkt->length + i] = random_byte();
1691     PUT_32BIT(pkt->data, pkt->length + padding - 4);
1692     if (ssh->csmac)
1693         ssh->csmac->generate(ssh->cs_mac_ctx, pkt->data,
1694                              pkt->length + padding,
1695                              ssh->v2_outgoing_sequence);
1696     ssh->v2_outgoing_sequence++;       /* whether or not we MACed */
1697
1698     if (ssh->cscipher)
1699         ssh->cscipher->encrypt(ssh->cs_cipher_ctx,
1700                                pkt->data, pkt->length + padding);
1701
1702     pkt->encrypted_len = pkt->length + padding;
1703
1704     /* Ready-to-send packet starts at pkt->data. We return length. */
1705     return pkt->length + padding + maclen;
1706 }
1707
1708 /*
1709  * Routines called from the main SSH code to send packets. There
1710  * are quite a few of these, because we have two separate
1711  * mechanisms for delaying the sending of packets:
1712  * 
1713  *  - In order to send an IGNORE message and a password message in
1714  *    a single fixed-length blob, we require the ability to
1715  *    concatenate the encrypted forms of those two packets _into_ a
1716  *    single blob and then pass it to our <network.h> transport
1717  *    layer in one go. Hence, there's a deferment mechanism which
1718  *    works after packet encryption.
1719  * 
1720  *  - In order to avoid sending any connection-layer messages
1721  *    during repeat key exchange, we have to queue up any such
1722  *    outgoing messages _before_ they are encrypted (and in
1723  *    particular before they're allocated sequence numbers), and
1724  *    then send them once we've finished.
1725  * 
1726  * I call these mechanisms `defer' and `queue' respectively, so as
1727  * to distinguish them reasonably easily.
1728  * 
1729  * The functions send_noqueue() and defer_noqueue() free the packet
1730  * structure they are passed. Every outgoing packet goes through
1731  * precisely one of these functions in its life; packets passed to
1732  * ssh2_pkt_send() or ssh2_pkt_defer() either go straight to one of
1733  * these or get queued, and then when the queue is later emptied
1734  * the packets are all passed to defer_noqueue().
1735  */
1736
1737 /*
1738  * Send an SSH2 packet immediately, without queuing or deferring.
1739  */
1740 static void ssh2_pkt_send_noqueue(Ssh ssh, struct Packet *pkt)
1741 {
1742     int len;
1743     int backlog;
1744     len = ssh2_pkt_construct(ssh, pkt);
1745     backlog = sk_write(ssh->s, (char *)pkt->data, len);
1746     if (backlog > SSH_MAX_BACKLOG)
1747         ssh_throttle_all(ssh, 1, backlog);
1748
1749     ssh->outgoing_data_size += pkt->encrypted_len;
1750     if (!ssh->kex_in_progress &&
1751         ssh->max_data_size != 0 &&
1752         ssh->outgoing_data_size > ssh->max_data_size)
1753         do_ssh2_transport(ssh, "too much data sent", -1, NULL);
1754
1755     ssh_free_packet(pkt);
1756 }
1757
1758 /*
1759  * Defer an SSH2 packet.
1760  */
1761 static void ssh2_pkt_defer_noqueue(Ssh ssh, struct Packet *pkt)
1762 {
1763     int len = ssh2_pkt_construct(ssh, pkt);
1764     if (ssh->deferred_len + len > ssh->deferred_size) {
1765         ssh->deferred_size = ssh->deferred_len + len + 128;
1766         ssh->deferred_send_data = sresize(ssh->deferred_send_data,
1767                                           ssh->deferred_size,
1768                                           unsigned char);
1769     }
1770     memcpy(ssh->deferred_send_data + ssh->deferred_len, pkt->data, len);
1771     ssh->deferred_len += len;
1772     ssh->deferred_data_size += pkt->encrypted_len;
1773     ssh_free_packet(pkt);
1774 }
1775
1776 /*
1777  * Queue an SSH2 packet.
1778  */
1779 static void ssh2_pkt_queue(Ssh ssh, struct Packet *pkt)
1780 {
1781     assert(ssh->queueing);
1782
1783     if (ssh->queuelen >= ssh->queuesize) {
1784         ssh->queuesize = ssh->queuelen + 32;
1785         ssh->queue = sresize(ssh->queue, ssh->queuesize, struct Packet *);
1786     }
1787
1788     ssh->queue[ssh->queuelen++] = pkt;
1789 }
1790
1791 /*
1792  * Either queue or send a packet, depending on whether queueing is
1793  * set.
1794  */
1795 static void ssh2_pkt_send(Ssh ssh, struct Packet *pkt)
1796 {
1797     if (ssh->queueing)
1798         ssh2_pkt_queue(ssh, pkt);
1799     else
1800         ssh2_pkt_send_noqueue(ssh, pkt);
1801 }
1802
1803 #if 0 /* disused */
1804 /*
1805  * Either queue or defer a packet, depending on whether queueing is
1806  * set.
1807  */
1808 static void ssh2_pkt_defer(Ssh ssh, struct Packet *pkt)
1809 {
1810     if (ssh->queueing)
1811         ssh2_pkt_queue(ssh, pkt);
1812     else
1813         ssh2_pkt_defer_noqueue(ssh, pkt);
1814 }
1815 #endif
1816
1817 /*
1818  * Send the whole deferred data block constructed by
1819  * ssh2_pkt_defer() or SSH1's defer_packet().
1820  * 
1821  * The expected use of the defer mechanism is that you call
1822  * ssh2_pkt_defer() a few times, then call ssh_pkt_defersend(). If
1823  * not currently queueing, this simply sets up deferred_send_data
1824  * and then sends it. If we _are_ currently queueing, the calls to
1825  * ssh2_pkt_defer() put the deferred packets on to the queue
1826  * instead, and therefore ssh_pkt_defersend() has no deferred data
1827  * to send. Hence, there's no need to make it conditional on
1828  * ssh->queueing.
1829  */
1830 static void ssh_pkt_defersend(Ssh ssh)
1831 {
1832     int backlog;
1833     backlog = sk_write(ssh->s, (char *)ssh->deferred_send_data,
1834                        ssh->deferred_len);
1835     ssh->deferred_len = ssh->deferred_size = 0;
1836     sfree(ssh->deferred_send_data);
1837     ssh->deferred_send_data = NULL;
1838     if (backlog > SSH_MAX_BACKLOG)
1839         ssh_throttle_all(ssh, 1, backlog);
1840
1841     ssh->outgoing_data_size += ssh->deferred_data_size;
1842     if (!ssh->kex_in_progress &&
1843         ssh->max_data_size != 0 &&
1844         ssh->outgoing_data_size > ssh->max_data_size)
1845         do_ssh2_transport(ssh, "too much data sent", -1, NULL);
1846     ssh->deferred_data_size = 0;
1847 }
1848
1849 /*
1850  * Send all queued SSH2 packets. We send them by means of
1851  * ssh2_pkt_defer_noqueue(), in case they included a pair of
1852  * packets that needed to be lumped together.
1853  */
1854 static void ssh2_pkt_queuesend(Ssh ssh)
1855 {
1856     int i;
1857
1858     assert(!ssh->queueing);
1859
1860     for (i = 0; i < ssh->queuelen; i++)
1861         ssh2_pkt_defer_noqueue(ssh, ssh->queue[i]);
1862     ssh->queuelen = 0;
1863
1864     ssh_pkt_defersend(ssh);
1865 }
1866
1867 #if 0
1868 void bndebug(char *string, Bignum b)
1869 {
1870     unsigned char *p;
1871     int i, len;
1872     p = ssh2_mpint_fmt(b, &len);
1873     debug(("%s", string));
1874     for (i = 0; i < len; i++)
1875         debug((" %02x", p[i]));
1876     debug(("\n"));
1877     sfree(p);
1878 }
1879 #endif
1880
1881 static void sha_mpint(SHA_State * s, Bignum b)
1882 {
1883     unsigned char *p;
1884     int len;
1885     p = ssh2_mpint_fmt(b, &len);
1886     sha_string(s, p, len);
1887     sfree(p);
1888 }
1889
1890 /*
1891  * Packet decode functions for both SSH1 and SSH2.
1892  */
1893 static unsigned long ssh_pkt_getuint32(struct Packet *pkt)
1894 {
1895     unsigned long value;
1896     if (pkt->length - pkt->savedpos < 4)
1897         return 0;                      /* arrgh, no way to decline (FIXME?) */
1898     value = GET_32BIT(pkt->body + pkt->savedpos);
1899     pkt->savedpos += 4;
1900     return value;
1901 }
1902 static int ssh2_pkt_getbool(struct Packet *pkt)
1903 {
1904     unsigned long value;
1905     if (pkt->length - pkt->savedpos < 1)
1906         return 0;                      /* arrgh, no way to decline (FIXME?) */
1907     value = pkt->body[pkt->savedpos] != 0;
1908     pkt->savedpos++;
1909     return value;
1910 }
1911 static void ssh_pkt_getstring(struct Packet *pkt, char **p, int *length)
1912 {
1913     int len;
1914     *p = NULL;
1915     *length = 0;
1916     if (pkt->length - pkt->savedpos < 4)
1917         return;
1918     len = GET_32BIT(pkt->body + pkt->savedpos);
1919     if (len < 0)
1920         return;
1921     *length = len;
1922     pkt->savedpos += 4;
1923     if (pkt->length - pkt->savedpos < *length)
1924         return;
1925     *p = (char *)(pkt->body + pkt->savedpos);
1926     pkt->savedpos += *length;
1927 }
1928 static void *ssh_pkt_getdata(struct Packet *pkt, int length)
1929 {
1930     if (pkt->length - pkt->savedpos < length)
1931         return NULL;
1932     pkt->savedpos += length;
1933     return pkt->body + (pkt->savedpos - length);
1934 }
1935 static int ssh1_pkt_getrsakey(struct Packet *pkt, struct RSAKey *key,
1936                               unsigned char **keystr)
1937 {
1938     int j;
1939
1940     j = makekey(pkt->body + pkt->savedpos,
1941                 pkt->length - pkt->savedpos,
1942                 key, keystr, 0);
1943
1944     if (j < 0)
1945         return FALSE;
1946     
1947     pkt->savedpos += j;
1948     assert(pkt->savedpos < pkt->length);
1949
1950     return TRUE;
1951 }
1952 static Bignum ssh1_pkt_getmp(struct Packet *pkt)
1953 {
1954     int j;
1955     Bignum b;
1956
1957     j = ssh1_read_bignum(pkt->body + pkt->savedpos,
1958                          pkt->length - pkt->savedpos, &b);
1959
1960     if (j < 0)
1961         return NULL;
1962
1963     pkt->savedpos += j;
1964     return b;
1965 }
1966 static Bignum ssh2_pkt_getmp(struct Packet *pkt)
1967 {
1968     char *p;
1969     int length;
1970     Bignum b;
1971
1972     ssh_pkt_getstring(pkt, &p, &length);
1973     if (!p)
1974         return NULL;
1975     if (p[0] & 0x80)
1976         return NULL;
1977     b = bignum_from_bytes((unsigned char *)p, length);
1978     return b;
1979 }
1980
1981 /*
1982  * Helper function to add an SSH2 signature blob to a packet.
1983  * Expects to be shown the public key blob as well as the signature
1984  * blob. Normally works just like ssh2_pkt_addstring, but will
1985  * fiddle with the signature packet if necessary for
1986  * BUG_SSH2_RSA_PADDING.
1987  */
1988 static void ssh2_add_sigblob(Ssh ssh, struct Packet *pkt,
1989                              void *pkblob_v, int pkblob_len,
1990                              void *sigblob_v, int sigblob_len)
1991 {
1992     unsigned char *pkblob = (unsigned char *)pkblob_v;
1993     unsigned char *sigblob = (unsigned char *)sigblob_v;
1994
1995     /* dmemdump(pkblob, pkblob_len); */
1996     /* dmemdump(sigblob, sigblob_len); */
1997
1998     /*
1999      * See if this is in fact an ssh-rsa signature and a buggy
2000      * server; otherwise we can just do this the easy way.
2001      */
2002     if ((ssh->remote_bugs & BUG_SSH2_RSA_PADDING) &&
2003         (GET_32BIT(pkblob) == 7 && !memcmp(pkblob+4, "ssh-rsa", 7))) {
2004         int pos, len, siglen;
2005
2006         /*
2007          * Find the byte length of the modulus.
2008          */
2009
2010         pos = 4+7;                     /* skip over "ssh-rsa" */
2011         pos += 4 + GET_32BIT(pkblob+pos);   /* skip over exponent */
2012         len = GET_32BIT(pkblob+pos);   /* find length of modulus */
2013         pos += 4;                      /* find modulus itself */
2014         while (len > 0 && pkblob[pos] == 0)
2015             len--, pos++;
2016         /* debug(("modulus length is %d\n", len)); */
2017
2018         /*
2019          * Now find the signature integer.
2020          */
2021         pos = 4+7;                     /* skip over "ssh-rsa" */
2022         siglen = GET_32BIT(sigblob+pos);
2023         /* debug(("signature length is %d\n", siglen)); */
2024
2025         if (len != siglen) {
2026             unsigned char newlen[4];
2027             ssh2_pkt_addstring_start(pkt);
2028             ssh2_pkt_addstring_data(pkt, (char *)sigblob, pos);
2029             /* dmemdump(sigblob, pos); */
2030             pos += 4;                  /* point to start of actual sig */
2031             PUT_32BIT(newlen, len);
2032             ssh2_pkt_addstring_data(pkt, (char *)newlen, 4);
2033             /* dmemdump(newlen, 4); */
2034             newlen[0] = 0;
2035             while (len-- > siglen) {
2036                 ssh2_pkt_addstring_data(pkt, (char *)newlen, 1);
2037                 /* dmemdump(newlen, 1); */
2038             }
2039             ssh2_pkt_addstring_data(pkt, (char *)(sigblob+pos), siglen);
2040             /* dmemdump(sigblob+pos, siglen); */
2041             return;
2042         }
2043
2044         /* Otherwise fall through and do it the easy way. */
2045     }
2046
2047     ssh2_pkt_addstring_start(pkt);
2048     ssh2_pkt_addstring_data(pkt, (char *)sigblob, sigblob_len);
2049 }
2050
2051 /*
2052  * Examine the remote side's version string and compare it against
2053  * a list of known buggy implementations.
2054  */
2055 static void ssh_detect_bugs(Ssh ssh, char *vstring)
2056 {
2057     char *imp;                         /* pointer to implementation part */
2058     imp = vstring;
2059     imp += strcspn(imp, "-");
2060     if (*imp) imp++;
2061     imp += strcspn(imp, "-");
2062     if (*imp) imp++;
2063
2064     ssh->remote_bugs = 0;
2065
2066     if (ssh->cfg.sshbug_ignore1 == FORCE_ON ||
2067         (ssh->cfg.sshbug_ignore1 == AUTO &&
2068          (!strcmp(imp, "1.2.18") || !strcmp(imp, "1.2.19") ||
2069           !strcmp(imp, "1.2.20") || !strcmp(imp, "1.2.21") ||
2070           !strcmp(imp, "1.2.22") || !strcmp(imp, "Cisco-1.25") ||
2071           !strcmp(imp, "OSU_1.4alpha3") || !strcmp(imp, "OSU_1.5alpha4")))) {
2072         /*
2073          * These versions don't support SSH1_MSG_IGNORE, so we have
2074          * to use a different defence against password length
2075          * sniffing.
2076          */
2077         ssh->remote_bugs |= BUG_CHOKES_ON_SSH1_IGNORE;
2078         logevent("We believe remote version has SSH1 ignore bug");
2079     }
2080
2081     if (ssh->cfg.sshbug_plainpw1 == FORCE_ON ||
2082         (ssh->cfg.sshbug_plainpw1 == AUTO &&
2083          (!strcmp(imp, "Cisco-1.25") || !strcmp(imp, "OSU_1.4alpha3")))) {
2084         /*
2085          * These versions need a plain password sent; they can't
2086          * handle having a null and a random length of data after
2087          * the password.
2088          */
2089         ssh->remote_bugs |= BUG_NEEDS_SSH1_PLAIN_PASSWORD;
2090         logevent("We believe remote version needs a plain SSH1 password");
2091     }
2092
2093     if (ssh->cfg.sshbug_rsa1 == FORCE_ON ||
2094         (ssh->cfg.sshbug_rsa1 == AUTO &&
2095          (!strcmp(imp, "Cisco-1.25")))) {
2096         /*
2097          * These versions apparently have no clue whatever about
2098          * RSA authentication and will panic and die if they see
2099          * an AUTH_RSA message.
2100          */
2101         ssh->remote_bugs |= BUG_CHOKES_ON_RSA;
2102         logevent("We believe remote version can't handle RSA authentication");
2103     }
2104
2105     if (ssh->cfg.sshbug_hmac2 == FORCE_ON ||
2106         (ssh->cfg.sshbug_hmac2 == AUTO &&
2107          !wc_match("* VShell", imp) &&
2108          (wc_match("2.1.0*", imp) || wc_match("2.0.*", imp) ||
2109           wc_match("2.2.0*", imp) || wc_match("2.3.0*", imp) ||
2110           wc_match("2.1 *", imp)))) {
2111         /*
2112          * These versions have the HMAC bug.
2113          */
2114         ssh->remote_bugs |= BUG_SSH2_HMAC;
2115         logevent("We believe remote version has SSH2 HMAC bug");
2116     }
2117
2118     if (ssh->cfg.sshbug_derivekey2 == FORCE_ON ||
2119         (ssh->cfg.sshbug_derivekey2 == AUTO &&
2120          !wc_match("* VShell", imp) &&
2121          (wc_match("2.0.0*", imp) || wc_match("2.0.10*", imp) ))) {
2122         /*
2123          * These versions have the key-derivation bug (failing to
2124          * include the literal shared secret in the hashes that
2125          * generate the keys).
2126          */
2127         ssh->remote_bugs |= BUG_SSH2_DERIVEKEY;
2128         logevent("We believe remote version has SSH2 key-derivation bug");
2129     }
2130
2131     if (ssh->cfg.sshbug_rsapad2 == FORCE_ON ||
2132         (ssh->cfg.sshbug_rsapad2 == AUTO &&
2133          (wc_match("OpenSSH_2.[5-9]*", imp) ||
2134           wc_match("OpenSSH_3.[0-2]*", imp)))) {
2135         /*
2136          * These versions have the SSH2 RSA padding bug.
2137          */
2138         ssh->remote_bugs |= BUG_SSH2_RSA_PADDING;
2139         logevent("We believe remote version has SSH2 RSA padding bug");
2140     }
2141
2142     if (ssh->cfg.sshbug_pksessid2 == FORCE_ON ||
2143         (ssh->cfg.sshbug_pksessid2 == AUTO &&
2144          wc_match("OpenSSH_2.[0-2]*", imp))) {
2145         /*
2146          * These versions have the SSH2 session-ID bug in
2147          * public-key authentication.
2148          */
2149         ssh->remote_bugs |= BUG_SSH2_PK_SESSIONID;
2150         logevent("We believe remote version has SSH2 public-key-session-ID bug");
2151     }
2152
2153     if (ssh->cfg.sshbug_rekey2 == FORCE_ON ||
2154         (ssh->cfg.sshbug_rekey2 == AUTO &&
2155          (wc_match("OpenSSH_2.[0-4]*", imp) ||
2156           wc_match("OpenSSH_2.5.[0-3]*", imp) ||
2157           wc_match("Sun_SSH_1.0", imp) ||
2158           wc_match("Sun_SSH_1.0.1", imp)))) {
2159         /*
2160          * These versions have the SSH2 rekey bug.
2161          */
2162         ssh->remote_bugs |= BUG_SSH2_REKEY;
2163         logevent("We believe remote version has SSH2 rekey bug");
2164     }
2165 }
2166
2167 /*
2168  * The `software version' part of an SSH version string is required
2169  * to contain no spaces or minus signs.
2170  */
2171 static void ssh_fix_verstring(char *str)
2172 {
2173     /* Eat "SSH-<protoversion>-". */
2174     assert(*str == 'S'); str++;
2175     assert(*str == 'S'); str++;
2176     assert(*str == 'H'); str++;
2177     assert(*str == '-'); str++;
2178     while (*str && *str != '-') str++;
2179     assert(*str == '-'); str++;
2180
2181     /* Convert minus signs and spaces in the remaining string into
2182      * underscores. */
2183     while (*str) {
2184         if (*str == '-' || *str == ' ')
2185             *str = '_';
2186         str++;
2187     }
2188 }
2189
2190 static int do_ssh_init(Ssh ssh, unsigned char c)
2191 {
2192     struct do_ssh_init_state {
2193         int vslen;
2194         char version[10];
2195         char *vstring;
2196         int vstrsize;
2197         int i;
2198         int proto1, proto2;
2199     };
2200     crState(do_ssh_init_state);
2201
2202     crBegin(ssh->do_ssh_init_crstate);
2203
2204     /* Search for the string "SSH-" in the input. */
2205     s->i = 0;
2206     while (1) {
2207         static const int transS[] = { 1, 2, 2, 1 };
2208         static const int transH[] = { 0, 0, 3, 0 };
2209         static const int transminus[] = { 0, 0, 0, -1 };
2210         if (c == 'S')
2211             s->i = transS[s->i];
2212         else if (c == 'H')
2213             s->i = transH[s->i];
2214         else if (c == '-')
2215             s->i = transminus[s->i];
2216         else
2217             s->i = 0;
2218         if (s->i < 0)
2219             break;
2220         crReturn(1);                   /* get another character */
2221     }
2222
2223     s->vstrsize = 16;
2224     s->vstring = snewn(s->vstrsize, char);
2225     strcpy(s->vstring, "SSH-");
2226     s->vslen = 4;
2227     s->i = 0;
2228     while (1) {
2229         crReturn(1);                   /* get another char */
2230         if (s->vslen >= s->vstrsize - 1) {
2231             s->vstrsize += 16;
2232             s->vstring = sresize(s->vstring, s->vstrsize, char);
2233         }
2234         s->vstring[s->vslen++] = c;
2235         if (s->i >= 0) {
2236             if (c == '-') {
2237                 s->version[s->i] = '\0';
2238                 s->i = -1;
2239             } else if (s->i < sizeof(s->version) - 1)
2240                 s->version[s->i++] = c;
2241         } else if (c == '\012')
2242             break;
2243     }
2244
2245     ssh->agentfwd_enabled = FALSE;
2246     ssh->rdpkt2_state.incoming_sequence = 0;
2247
2248     s->vstring[s->vslen] = 0;
2249     s->vstring[strcspn(s->vstring, "\015\012")] = '\0';/* remove EOL chars */
2250     logeventf(ssh, "Server version: %s", s->vstring);
2251     ssh_detect_bugs(ssh, s->vstring);
2252
2253     /*
2254      * Decide which SSH protocol version to support.
2255      */
2256
2257     /* Anything strictly below "2.0" means protocol 1 is supported. */
2258     s->proto1 = ssh_versioncmp(s->version, "2.0") < 0;
2259     /* Anything greater or equal to "1.99" means protocol 2 is supported. */
2260     s->proto2 = ssh_versioncmp(s->version, "1.99") >= 0;
2261
2262     if (ssh->cfg.sshprot == 0 && !s->proto1) {
2263         bombout(("SSH protocol version 1 required by user but not provided by server"));
2264         crStop(0);
2265     }
2266     if (ssh->cfg.sshprot == 3 && !s->proto2) {
2267         bombout(("SSH protocol version 2 required by user but not provided by server"));
2268         crStop(0);
2269     }
2270
2271     {
2272         char *verstring;
2273
2274         if (s->proto2 && (ssh->cfg.sshprot >= 2 || !s->proto1)) {
2275             /*
2276              * Construct a v2 version string.
2277              */
2278             verstring = dupprintf("SSH-2.0-%s\015\012", sshver);
2279             ssh->version = 2;
2280         } else {
2281             /*
2282              * Construct a v1 version string.
2283              */
2284             verstring = dupprintf("SSH-%s-%s\012",
2285                                   (ssh_versioncmp(s->version, "1.5") <= 0 ?
2286                                    s->version : "1.5"),
2287                                   sshver);
2288             ssh->version = 1;
2289         }
2290
2291         ssh_fix_verstring(verstring);
2292
2293         if (ssh->version == 2) {
2294             /*
2295              * Hash our version string and their version string.
2296              */
2297             SHA_Init(&ssh->exhashbase);
2298             sha_string(&ssh->exhashbase, verstring,
2299                        strcspn(verstring, "\015\012"));
2300             sha_string(&ssh->exhashbase, s->vstring,
2301                        strcspn(s->vstring, "\015\012"));
2302
2303             /*
2304              * Initialise SSHv2 protocol.
2305              */
2306             ssh->protocol = ssh2_protocol;
2307             ssh2_protocol_setup(ssh);
2308             ssh->s_rdpkt = ssh2_rdpkt;
2309         } else {
2310             /*
2311              * Initialise SSHv1 protocol.
2312              */
2313             ssh->protocol = ssh1_protocol;
2314             ssh1_protocol_setup(ssh);
2315             ssh->s_rdpkt = ssh1_rdpkt;
2316         }
2317         logeventf(ssh, "We claim version: %.*s",
2318                   strcspn(verstring, "\015\012"), verstring);
2319         sk_write(ssh->s, verstring, strlen(verstring));
2320         sfree(verstring);
2321     }
2322
2323     logeventf(ssh, "Using SSH protocol version %d", ssh->version);
2324
2325     update_specials_menu(ssh->frontend);
2326     ssh->state = SSH_STATE_BEFORE_SIZE;
2327     ssh->pinger = pinger_new(&ssh->cfg, &ssh_backend, ssh);
2328
2329     sfree(s->vstring);
2330
2331     crFinish(0);
2332 }
2333
2334 static void ssh_gotdata(Ssh ssh, unsigned char *data, int datalen)
2335 {
2336     crBegin(ssh->ssh_gotdata_crstate);
2337
2338     /*
2339      * To begin with, feed the characters one by one to the
2340      * protocol initialisation / selection function do_ssh_init().
2341      * When that returns 0, we're done with the initial greeting
2342      * exchange and can move on to packet discipline.
2343      */
2344     while (1) {
2345         int ret;                       /* need not be kept across crReturn */
2346         if (datalen == 0)
2347             crReturnV;                 /* more data please */
2348         ret = do_ssh_init(ssh, *data);
2349         data++;
2350         datalen--;
2351         if (ret == 0)
2352             break;
2353     }
2354
2355     /*
2356      * We emerge from that loop when the initial negotiation is
2357      * over and we have selected an s_rdpkt function. Now pass
2358      * everything to s_rdpkt, and then pass the resulting packets
2359      * to the proper protocol handler.
2360      */
2361     if (datalen == 0)
2362         crReturnV;
2363     while (1) {
2364         while (datalen > 0) {
2365             struct Packet *pktin = ssh->s_rdpkt(ssh, &data, &datalen);
2366             if (pktin) {
2367                 ssh->protocol(ssh, NULL, 0, pktin);
2368                 ssh_free_packet(pktin);
2369             }
2370             if (ssh->state == SSH_STATE_CLOSED)
2371                 return;
2372         }
2373         crReturnV;
2374     }
2375     crFinishV;
2376 }
2377
2378 static int ssh_do_close(Ssh ssh, int notify_exit)
2379 {
2380     int ret = 0;
2381     struct ssh_channel *c;
2382
2383     ssh->state = SSH_STATE_CLOSED;
2384     if (ssh->s) {
2385         sk_close(ssh->s);
2386         ssh->s = NULL;
2387         if (notify_exit)
2388             notify_remote_exit(ssh->frontend);
2389         else
2390             ret = 1;
2391     }
2392     /*
2393      * Now we must shut down any port- and X-forwarded channels going
2394      * through this connection.
2395      */
2396     if (ssh->channels) {
2397         while (NULL != (c = index234(ssh->channels, 0))) {
2398             switch (c->type) {
2399               case CHAN_X11:
2400                 x11_close(c->u.x11.s);
2401                 break;
2402               case CHAN_SOCKDATA:
2403                 pfd_close(c->u.pfd.s);
2404                 break;
2405             }
2406             del234(ssh->channels, c); /* moving next one to index 0 */
2407             if (ssh->version == 2)
2408                 bufchain_clear(&c->v.v2.outbuffer);
2409             sfree(c);
2410         }
2411     }
2412     /*
2413      * Go through port-forwardings, and close any associated
2414      * listening sockets.
2415      */
2416     if (ssh->portfwds) {
2417         struct ssh_portfwd *pf;
2418         while (NULL != (pf = index234(ssh->portfwds, 0))) {
2419             /* Dispose of any listening socket. */
2420             if (pf->local)
2421                 pfd_terminate(pf->local);
2422             del234(ssh->portfwds, pf); /* moving next one to index 0 */
2423             free_portfwd(pf);
2424         }
2425     }
2426
2427     return ret;
2428 }
2429
2430 static void ssh_log(Plug plug, int type, SockAddr addr, int port,
2431                     const char *error_msg, int error_code)
2432 {
2433     Ssh ssh = (Ssh) plug;
2434     char addrbuf[256], *msg;
2435
2436     sk_getaddr(addr, addrbuf, lenof(addrbuf));
2437
2438     if (type == 0)
2439         msg = dupprintf("Connecting to %s port %d", addrbuf, port);
2440     else
2441         msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg);
2442
2443     logevent(msg);
2444     sfree(msg);
2445 }
2446
2447 static int ssh_closing(Plug plug, const char *error_msg, int error_code,
2448                        int calling_back)
2449 {
2450     Ssh ssh = (Ssh) plug;
2451     int need_notify = ssh_do_close(ssh, FALSE);
2452
2453     if (!error_msg && !ssh->close_expected) {
2454         error_msg = "Server unexpectedly closed network connection";
2455     }
2456
2457     if (error_msg) {
2458         /* A socket error has occurred. */
2459         logevent(error_msg);
2460         connection_fatal(ssh->frontend, "%s", error_msg);
2461     } else {
2462         logevent("Server closed network connection");
2463     }
2464     if (need_notify)
2465         notify_remote_exit(ssh->frontend);
2466     return 0;
2467 }
2468
2469 static int ssh_receive(Plug plug, int urgent, char *data, int len)
2470 {
2471     Ssh ssh = (Ssh) plug;
2472     ssh_gotdata(ssh, (unsigned char *)data, len);
2473     if (ssh->state == SSH_STATE_CLOSED) {
2474         ssh_do_close(ssh, TRUE);
2475         return 0;
2476     }
2477     return 1;
2478 }
2479
2480 static void ssh_sent(Plug plug, int bufsize)
2481 {
2482     Ssh ssh = (Ssh) plug;
2483     /*
2484      * If the send backlog on the SSH socket itself clears, we
2485      * should unthrottle the whole world if it was throttled.
2486      */
2487     if (bufsize < SSH_MAX_BACKLOG)
2488         ssh_throttle_all(ssh, 0, bufsize);
2489 }
2490
2491 /*
2492  * Connect to specified host and port.
2493  * Returns an error message, or NULL on success.
2494  * Also places the canonical host name into `realhost'. It must be
2495  * freed by the caller.
2496  */
2497 static const char *connect_to_host(Ssh ssh, char *host, int port,
2498                                    char **realhost, int nodelay, int keepalive)
2499 {
2500     static const struct plug_function_table fn_table = {
2501         ssh_log,
2502         ssh_closing,
2503         ssh_receive,
2504         ssh_sent,
2505         NULL
2506     };
2507
2508     SockAddr addr;
2509     const char *err;
2510
2511     ssh->savedhost = snewn(1 + strlen(host), char);
2512     if (!ssh->savedhost)
2513         fatalbox("Out of memory");
2514     strcpy(ssh->savedhost, host);
2515
2516     if (port < 0)
2517         port = 22;                     /* default ssh port */
2518     ssh->savedport = port;
2519
2520     /*
2521      * Try to find host.
2522      */
2523     logeventf(ssh, "Looking up host \"%s\"%s", host,
2524               (ssh->cfg.addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" :
2525                (ssh->cfg.addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" : "")));
2526     addr = name_lookup(host, port, realhost, &ssh->cfg,
2527                        ssh->cfg.addressfamily);
2528     if ((err = sk_addr_error(addr)) != NULL) {
2529         sk_addr_free(addr);
2530         return err;
2531     }
2532
2533     /*
2534      * Open socket.
2535      */
2536     ssh->fn = &fn_table;
2537     ssh->s = new_connection(addr, *realhost, port,
2538                             0, 1, nodelay, keepalive, (Plug) ssh, &ssh->cfg);
2539     if ((err = sk_socket_error(ssh->s)) != NULL) {
2540         ssh->s = NULL;
2541         notify_remote_exit(ssh->frontend);
2542         return err;
2543     }
2544
2545     return NULL;
2546 }
2547
2548 /*
2549  * Throttle or unthrottle the SSH connection.
2550  */
2551 static void ssh1_throttle(Ssh ssh, int adjust)
2552 {
2553     int old_count = ssh->v1_throttle_count;
2554     ssh->v1_throttle_count += adjust;
2555     assert(ssh->v1_throttle_count >= 0);
2556     if (ssh->v1_throttle_count && !old_count) {
2557         sk_set_frozen(ssh->s, 1);
2558     } else if (!ssh->v1_throttle_count && old_count) {
2559         sk_set_frozen(ssh->s, 0);
2560     }
2561 }
2562
2563 /*
2564  * Throttle or unthrottle _all_ local data streams (for when sends
2565  * on the SSH connection itself back up).
2566  */
2567 static void ssh_throttle_all(Ssh ssh, int enable, int bufsize)
2568 {
2569     int i;
2570     struct ssh_channel *c;
2571
2572     if (enable == ssh->throttled_all)
2573         return;
2574     ssh->throttled_all = enable;
2575     ssh->overall_bufsize = bufsize;
2576     if (!ssh->channels)
2577         return;
2578     for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) {
2579         switch (c->type) {
2580           case CHAN_MAINSESSION:
2581             /*
2582              * This is treated separately, outside the switch.
2583              */
2584             break;
2585           case CHAN_X11:
2586             x11_override_throttle(c->u.x11.s, enable);
2587             break;
2588           case CHAN_AGENT:
2589             /* Agent channels require no buffer management. */
2590             break;
2591           case CHAN_SOCKDATA:
2592             pfd_override_throttle(c->u.pfd.s, enable);
2593             break;
2594         }
2595     }
2596 }
2597
2598 /*
2599  * Username and password input, abstracted off into routines
2600  * reusable in several places - even between SSH1 and SSH2.
2601  */
2602
2603 /* Set up a username or password input loop on a given buffer. */
2604 static void setup_userpass_input(Ssh ssh, char *buffer, int buflen, int echo)
2605 {
2606     ssh->userpass_input_buffer = buffer;
2607     ssh->userpass_input_buflen = buflen;
2608     ssh->userpass_input_bufpos = 0;
2609     ssh->userpass_input_echo = echo;
2610 }
2611
2612 /*
2613  * Process some terminal data in the course of username/password
2614  * input. Returns >0 for success (line of input returned in
2615  * buffer), <0 for failure (user hit ^C/^D, bomb out and exit), 0
2616  * for inconclusive (keep waiting for more input please).
2617  */
2618 static int process_userpass_input(Ssh ssh, unsigned char *in, int inlen)
2619 {
2620     char c;
2621
2622     while (inlen--) {
2623         switch (c = *in++) {
2624           case 10:
2625           case 13:
2626             ssh->userpass_input_buffer[ssh->userpass_input_bufpos] = 0;
2627             ssh->userpass_input_buffer[ssh->userpass_input_buflen-1] = 0;
2628             return +1;
2629             break;
2630           case 8:
2631           case 127:
2632             if (ssh->userpass_input_bufpos > 0) {
2633                 if (ssh->userpass_input_echo)
2634                     c_write_str(ssh, "\b \b");
2635                 ssh->userpass_input_bufpos--;
2636             }
2637             break;
2638           case 21:
2639           case 27:
2640             while (ssh->userpass_input_bufpos > 0) {
2641                 if (ssh->userpass_input_echo)
2642                     c_write_str(ssh, "\b \b");
2643                 ssh->userpass_input_bufpos--;
2644             }
2645             break;
2646           case 3:
2647           case 4:
2648             return -1;
2649             break;
2650           default:
2651             /*
2652              * This simplistic check for printability is disabled
2653              * when we're doing password input, because some people
2654              * have control characters in their passwords.o
2655              */
2656             if ((!ssh->userpass_input_echo ||
2657                  (c >= ' ' && c <= '~') ||
2658                  ((unsigned char) c >= 160))
2659                 && ssh->userpass_input_bufpos < ssh->userpass_input_buflen-1) {
2660                 ssh->userpass_input_buffer[ssh->userpass_input_bufpos++] = c;
2661                 if (ssh->userpass_input_echo)
2662                     c_write(ssh, &c, 1);
2663             }
2664             break;
2665         }
2666     }
2667     return 0;
2668 }
2669
2670 static void ssh_agent_callback(void *sshv, void *reply, int replylen)
2671 {
2672     Ssh ssh = (Ssh) sshv;
2673
2674     ssh->agent_response = reply;
2675     ssh->agent_response_len = replylen;
2676
2677     if (ssh->version == 1)
2678         do_ssh1_login(ssh, NULL, -1, NULL);
2679     else
2680         do_ssh2_authconn(ssh, NULL, -1, NULL);
2681 }
2682
2683 static void ssh_agentf_callback(void *cv, void *reply, int replylen)
2684 {
2685     struct ssh_channel *c = (struct ssh_channel *)cv;
2686     Ssh ssh = c->ssh;
2687     void *sentreply = reply;
2688
2689     if (!sentreply) {
2690         /* Fake SSH_AGENT_FAILURE. */
2691         sentreply = "\0\0\0\1\5";
2692         replylen = 5;
2693     }
2694     if (ssh->version == 2) {
2695         ssh2_add_channel_data(c, sentreply, replylen);
2696         ssh2_try_send(c);
2697     } else {
2698         send_packet(ssh, SSH1_MSG_CHANNEL_DATA,
2699                     PKT_INT, c->remoteid,
2700                     PKTT_DATA,
2701                     PKT_INT, replylen,
2702                     PKT_DATA, sentreply, replylen,
2703                     PKTT_OTHER,
2704                     PKT_END);
2705     }
2706     if (reply)
2707         sfree(reply);
2708 }
2709
2710 /*
2711  * Handle the key exchange and user authentication phases.
2712  */
2713 static int do_ssh1_login(Ssh ssh, unsigned char *in, int inlen,
2714                          struct Packet *pktin)
2715 {
2716     int i, j, ret;
2717     unsigned char cookie[8], *ptr;
2718     struct RSAKey servkey, hostkey;
2719     struct MD5Context md5c;
2720     struct do_ssh1_login_state {
2721         int len;
2722         unsigned char *rsabuf, *keystr1, *keystr2;
2723         unsigned long supported_ciphers_mask, supported_auths_mask;
2724         int tried_publickey, tried_agent;
2725         int tis_auth_refused, ccard_auth_refused;
2726         unsigned char session_id[16];
2727         int cipher_type;
2728         char username[100];
2729         void *publickey_blob;
2730         int publickey_bloblen;
2731         char password[100];
2732         char prompt[200];
2733         int pos;
2734         char c;
2735         int pwpkt_type;
2736         unsigned char request[5], *response, *p;
2737         int responselen;
2738         int keyi, nkeys;
2739         int authed;
2740         struct RSAKey key;
2741         Bignum challenge;
2742         char *commentp;
2743         int commentlen;
2744     };
2745     crState(do_ssh1_login_state);
2746
2747     crBegin(ssh->do_ssh1_login_crstate);
2748
2749     if (!pktin)
2750         crWaitUntil(pktin);
2751
2752     if (pktin->type != SSH1_SMSG_PUBLIC_KEY) {
2753         bombout(("Public key packet not received"));
2754         crStop(0);
2755     }
2756
2757     logevent("Received public keys");
2758
2759     ptr = ssh_pkt_getdata(pktin, 8);
2760     if (!ptr) {
2761         bombout(("SSH1 public key packet stopped before random cookie"));
2762         crStop(0);
2763     }
2764     memcpy(cookie, ptr, 8);
2765
2766     if (!ssh1_pkt_getrsakey(pktin, &servkey, &s->keystr1) ||
2767         !ssh1_pkt_getrsakey(pktin, &hostkey, &s->keystr2)) {    
2768         bombout(("Failed to read SSH1 public keys from public key packet"));
2769         crStop(0);
2770     }
2771
2772     /*
2773      * Log the host key fingerprint.
2774      */
2775     {
2776         char logmsg[80];
2777         logevent("Host key fingerprint is:");
2778         strcpy(logmsg, "      ");
2779         hostkey.comment = NULL;
2780         rsa_fingerprint(logmsg + strlen(logmsg),
2781                         sizeof(logmsg) - strlen(logmsg), &hostkey);
2782         logevent(logmsg);
2783     }
2784
2785     ssh->v1_remote_protoflags = ssh_pkt_getuint32(pktin);
2786     s->supported_ciphers_mask = ssh_pkt_getuint32(pktin);
2787     s->supported_auths_mask = ssh_pkt_getuint32(pktin);
2788
2789     ssh->v1_local_protoflags =
2790         ssh->v1_remote_protoflags & SSH1_PROTOFLAGS_SUPPORTED;
2791     ssh->v1_local_protoflags |= SSH1_PROTOFLAG_SCREEN_NUMBER;
2792
2793     MD5Init(&md5c);
2794     MD5Update(&md5c, s->keystr2, hostkey.bytes);
2795     MD5Update(&md5c, s->keystr1, servkey.bytes);
2796     MD5Update(&md5c, cookie, 8);
2797     MD5Final(s->session_id, &md5c);
2798
2799     for (i = 0; i < 32; i++)
2800         ssh->session_key[i] = random_byte();
2801
2802     /*
2803      * Verify that the `bits' and `bytes' parameters match.
2804      */
2805     if (hostkey.bits > hostkey.bytes * 8 ||
2806         servkey.bits > servkey.bytes * 8) {
2807         bombout(("SSH1 public keys were badly formatted"));
2808         crStop(0);
2809     }
2810
2811     s->len = (hostkey.bytes > servkey.bytes ? hostkey.bytes : servkey.bytes);
2812
2813     s->rsabuf = snewn(s->len, unsigned char);
2814     if (!s->rsabuf)
2815         fatalbox("Out of memory");
2816
2817     /*
2818      * Verify the host key.
2819      */
2820     {
2821         /*
2822          * First format the key into a string.
2823          */
2824         int len = rsastr_len(&hostkey);
2825         char fingerprint[100];
2826         char *keystr = snewn(len, char);
2827         if (!keystr)
2828             fatalbox("Out of memory");
2829         rsastr_fmt(keystr, &hostkey);
2830         rsa_fingerprint(fingerprint, sizeof(fingerprint), &hostkey);
2831         verify_ssh_host_key(ssh->frontend,
2832                             ssh->savedhost, ssh->savedport, "rsa", keystr,
2833                             fingerprint);
2834         sfree(keystr);
2835     }
2836
2837     for (i = 0; i < 32; i++) {
2838         s->rsabuf[i] = ssh->session_key[i];
2839         if (i < 16)
2840             s->rsabuf[i] ^= s->session_id[i];
2841     }
2842
2843     if (hostkey.bytes > servkey.bytes) {
2844         ret = rsaencrypt(s->rsabuf, 32, &servkey);
2845         if (ret)
2846             ret = rsaencrypt(s->rsabuf, servkey.bytes, &hostkey);
2847     } else {
2848         ret = rsaencrypt(s->rsabuf, 32, &hostkey);
2849         if (ret)
2850             ret = rsaencrypt(s->rsabuf, hostkey.bytes, &servkey);
2851     }
2852     if (!ret) {
2853         bombout(("SSH1 public key encryptions failed due to bad formatting"));
2854         crStop(0);      
2855     }
2856
2857     logevent("Encrypted session key");
2858
2859     {
2860         int cipher_chosen = 0, warn = 0;
2861         char *cipher_string = NULL;
2862         int i;
2863         for (i = 0; !cipher_chosen && i < CIPHER_MAX; i++) {
2864             int next_cipher = ssh->cfg.ssh_cipherlist[i];
2865             if (next_cipher == CIPHER_WARN) {
2866                 /* If/when we choose a cipher, warn about it */
2867                 warn = 1;
2868             } else if (next_cipher == CIPHER_AES) {
2869                 /* XXX Probably don't need to mention this. */
2870                 logevent("AES not supported in SSH1, skipping");
2871             } else {
2872                 switch (next_cipher) {
2873                   case CIPHER_3DES:     s->cipher_type = SSH_CIPHER_3DES;
2874                                         cipher_string = "3DES"; break;
2875                   case CIPHER_BLOWFISH: s->cipher_type = SSH_CIPHER_BLOWFISH;
2876                                         cipher_string = "Blowfish"; break;
2877                   case CIPHER_DES:      s->cipher_type = SSH_CIPHER_DES;
2878                                         cipher_string = "single-DES"; break;
2879                 }
2880                 if (s->supported_ciphers_mask & (1 << s->cipher_type))
2881                     cipher_chosen = 1;
2882             }
2883         }
2884         if (!cipher_chosen) {
2885             if ((s->supported_ciphers_mask & (1 << SSH_CIPHER_3DES)) == 0)
2886                 bombout(("Server violates SSH 1 protocol by not "
2887                          "supporting 3DES encryption"));
2888             else
2889                 /* shouldn't happen */
2890                 bombout(("No supported ciphers found"));
2891             crStop(0);
2892         }
2893
2894         /* Warn about chosen cipher if necessary. */
2895         if (warn) {
2896             sk_set_frozen(ssh->s, 1);
2897             askalg(ssh->frontend, "cipher", cipher_string);
2898             sk_set_frozen(ssh->s, 0);
2899         }
2900     }
2901
2902     switch (s->cipher_type) {
2903       case SSH_CIPHER_3DES:
2904         logevent("Using 3DES encryption");
2905         break;
2906       case SSH_CIPHER_DES:
2907         logevent("Using single-DES encryption");
2908         break;
2909       case SSH_CIPHER_BLOWFISH:
2910         logevent("Using Blowfish encryption");
2911         break;
2912     }
2913
2914     send_packet(ssh, SSH1_CMSG_SESSION_KEY,
2915                 PKT_CHAR, s->cipher_type,
2916                 PKT_DATA, cookie, 8,
2917                 PKT_CHAR, (s->len * 8) >> 8, PKT_CHAR, (s->len * 8) & 0xFF,
2918                 PKT_DATA, s->rsabuf, s->len,
2919                 PKT_INT, ssh->v1_local_protoflags, PKT_END);
2920
2921     logevent("Trying to enable encryption...");
2922
2923     sfree(s->rsabuf);
2924
2925     ssh->cipher = (s->cipher_type == SSH_CIPHER_BLOWFISH ? &ssh_blowfish_ssh1 :
2926                    s->cipher_type == SSH_CIPHER_DES ? &ssh_des :
2927                    &ssh_3des);
2928     ssh->v1_cipher_ctx = ssh->cipher->make_context();
2929     ssh->cipher->sesskey(ssh->v1_cipher_ctx, ssh->session_key);
2930     logeventf(ssh, "Initialised %s encryption", ssh->cipher->text_name);
2931
2932     ssh->crcda_ctx = crcda_make_context();
2933     logevent("Installing CRC compensation attack detector");
2934
2935     if (servkey.modulus) {
2936         sfree(servkey.modulus);
2937         servkey.modulus = NULL;
2938     }
2939     if (servkey.exponent) {
2940         sfree(servkey.exponent);
2941         servkey.exponent = NULL;
2942     }
2943     if (hostkey.modulus) {
2944         sfree(hostkey.modulus);
2945         hostkey.modulus = NULL;
2946     }
2947     if (hostkey.exponent) {
2948         sfree(hostkey.exponent);
2949         hostkey.exponent = NULL;
2950     }
2951     crWaitUntil(pktin);
2952
2953     if (pktin->type != SSH1_SMSG_SUCCESS) {
2954         bombout(("Encryption not successfully enabled"));
2955         crStop(0);
2956     }
2957
2958     logevent("Successfully started encryption");
2959
2960     fflush(stdout);
2961     {
2962         if (!*ssh->cfg.username) {
2963             if (ssh_get_line && !ssh_getline_pw_only) {
2964                 if (!ssh_get_line("login as: ",
2965                                   s->username, sizeof(s->username), FALSE)) {
2966                     /*
2967                      * get_line failed to get a username.
2968                      * Terminate.
2969                      */
2970                     logevent("No username provided. Abandoning session.");
2971                     ssh->close_expected = TRUE;
2972                     ssh_closing((Plug)ssh, NULL, 0, 0);
2973                     crStop(1);
2974                 }
2975             } else {
2976                 int ret;               /* need not be kept over crReturn */
2977                 c_write_str(ssh, "login as: ");
2978                 ssh->send_ok = 1;
2979
2980                 setup_userpass_input(ssh, s->username, sizeof(s->username), 1);
2981                 do {
2982                     crWaitUntil(!pktin);
2983                     ret = process_userpass_input(ssh, in, inlen);
2984                 } while (ret == 0);
2985                 if (ret < 0)
2986                     cleanup_exit(0);
2987                 c_write_str(ssh, "\r\n");
2988             }
2989         } else {
2990             strncpy(s->username, ssh->cfg.username, sizeof(s->username));
2991             s->username[sizeof(s->username)-1] = '\0';
2992         }
2993
2994         send_packet(ssh, SSH1_CMSG_USER, PKT_STR, s->username, PKT_END);
2995         {
2996             char userlog[22 + sizeof(s->username)];
2997             sprintf(userlog, "Sent username \"%s\"", s->username);
2998             logevent(userlog);
2999             if (flags & FLAG_INTERACTIVE &&
3000                 (!((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)))) {
3001                 strcat(userlog, "\r\n");
3002                 c_write_str(ssh, userlog);
3003             }
3004         }
3005     }
3006
3007     crWaitUntil(pktin);
3008
3009     if ((ssh->remote_bugs & BUG_CHOKES_ON_RSA)) {
3010         /* We must not attempt PK auth. Pretend we've already tried it. */
3011         s->tried_publickey = s->tried_agent = 1;
3012     } else {
3013         s->tried_publickey = s->tried_agent = 0;
3014     }
3015     s->tis_auth_refused = s->ccard_auth_refused = 0;
3016     /* Load the public half of ssh->cfg.keyfile so we notice if it's in Pageant */
3017     if (!filename_is_null(ssh->cfg.keyfile)) {
3018         if (!rsakey_pubblob(&ssh->cfg.keyfile,
3019                             &s->publickey_blob, &s->publickey_bloblen, NULL))
3020             s->publickey_blob = NULL;
3021     } else
3022         s->publickey_blob = NULL;
3023
3024     while (pktin->type == SSH1_SMSG_FAILURE) {
3025         s->pwpkt_type = SSH1_CMSG_AUTH_PASSWORD;
3026
3027         if (agent_exists() && !s->tried_agent) {
3028             /*
3029              * Attempt RSA authentication using Pageant.
3030              */
3031             void *r;
3032
3033             s->authed = FALSE;
3034             s->tried_agent = 1;
3035             logevent("Pageant is running. Requesting keys.");
3036
3037             /* Request the keys held by the agent. */
3038             PUT_32BIT(s->request, 1);
3039             s->request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES;
3040             if (!agent_query(s->request, 5, &r, &s->responselen,
3041                              ssh_agent_callback, ssh)) {
3042                 do {
3043                     crReturn(0);
3044                     if (pktin) {
3045                         bombout(("Unexpected data from server while waiting"
3046                                  " for agent response"));
3047                         crStop(0);
3048                     }
3049                 } while (pktin || inlen > 0);
3050                 r = ssh->agent_response;
3051                 s->responselen = ssh->agent_response_len;
3052             }
3053             s->response = (unsigned char *) r;
3054             if (s->response && s->responselen >= 5 &&
3055                 s->response[4] == SSH1_AGENT_RSA_IDENTITIES_ANSWER) {
3056                 s->p = s->response + 5;
3057                 s->nkeys = GET_32BIT(s->p);
3058                 s->p += 4;
3059                 logeventf(ssh, "Pageant has %d SSH1 keys", s->nkeys);
3060                 for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) {
3061                     logeventf(ssh, "Trying Pageant key #%d", s->keyi);
3062                     if (s->publickey_blob &&
3063                         !memcmp(s->p, s->publickey_blob,
3064                                 s->publickey_bloblen)) {
3065                         logevent("This key matches configured key file");
3066                         s->tried_publickey = 1;
3067                     }
3068                     s->p += 4;
3069                     {
3070                         int n, ok = FALSE;
3071                         do {           /* do while (0) to make breaking easy */
3072                             n = ssh1_read_bignum
3073                                 (s->p, s->responselen-(s->p-s->response),
3074                                  &s->key.exponent);
3075                             if (n < 0)
3076                                 break;
3077                             s->p += n;
3078                             n = ssh1_read_bignum
3079                                 (s->p, s->responselen-(s->p-s->response),
3080                                  &s->key.modulus);
3081                             if (n < 0)
3082                             break;
3083                             s->p += n;
3084                             if (s->responselen - (s->p-s->response) < 4)
3085                                 break;
3086                             s->commentlen = GET_32BIT(s->p);
3087                             s->p += 4;
3088                             if (s->responselen - (s->p-s->response) <
3089                                 s->commentlen)
3090                                 break;
3091                             s->commentp = (char *)s->p;
3092                             s->p += s->commentlen;
3093                             ok = TRUE;
3094                         } while (0);
3095                         if (!ok) {
3096                             logevent("Pageant key list packet was truncated");
3097                             break;
3098                         }
3099                     }
3100                     send_packet(ssh, SSH1_CMSG_AUTH_RSA,
3101                                 PKT_BIGNUM, s->key.modulus, PKT_END);
3102                     crWaitUntil(pktin);
3103                     if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {
3104                         logevent("Key refused");
3105                         continue;
3106                     }
3107                     logevent("Received RSA challenge");
3108                     if ((s->challenge = ssh1_pkt_getmp(pktin)) == NULL) {
3109                         bombout(("Server's RSA challenge was badly formatted"));
3110                         crStop(0);
3111                     }
3112
3113                     {
3114                         char *agentreq, *q, *ret;
3115                         void *vret;
3116                         int len, retlen;
3117                         len = 1 + 4;   /* message type, bit count */
3118                         len += ssh1_bignum_length(s->key.exponent);
3119                         len += ssh1_bignum_length(s->key.modulus);
3120                         len += ssh1_bignum_length(s->challenge);
3121                         len += 16;     /* session id */
3122                         len += 4;      /* response format */
3123                         agentreq = snewn(4 + len, char);
3124                         PUT_32BIT(agentreq, len);
3125                         q = agentreq + 4;
3126                         *q++ = SSH1_AGENTC_RSA_CHALLENGE;
3127                         PUT_32BIT(q, bignum_bitcount(s->key.modulus));
3128                         q += 4;
3129                         q += ssh1_write_bignum(q, s->key.exponent);
3130                         q += ssh1_write_bignum(q, s->key.modulus);
3131                         q += ssh1_write_bignum(q, s->challenge);
3132                         memcpy(q, s->session_id, 16);
3133                         q += 16;
3134                         PUT_32BIT(q, 1);        /* response format */
3135                         if (!agent_query(agentreq, len + 4, &vret, &retlen,
3136                                          ssh_agent_callback, ssh)) {
3137                             sfree(agentreq);
3138                             do {
3139                                 crReturn(0);
3140                                 if (pktin) {
3141                                     bombout(("Unexpected data from server"
3142                                              " while waiting for agent"
3143                                              " response"));
3144                                     crStop(0);
3145                                 }
3146                             } while (pktin || inlen > 0);
3147                             vret = ssh->agent_response;
3148                             retlen = ssh->agent_response_len;
3149                         } else
3150                             sfree(agentreq);
3151                         ret = vret;
3152                         if (ret) {
3153                             if (ret[4] == SSH1_AGENT_RSA_RESPONSE) {
3154                                 logevent("Sending Pageant's response");
3155                                 send_packet(ssh, SSH1_CMSG_AUTH_RSA_RESPONSE,
3156                                             PKT_DATA, ret + 5, 16,
3157                                             PKT_END);
3158                                 sfree(ret);
3159                                 crWaitUntil(pktin);
3160                                 if (pktin->type == SSH1_SMSG_SUCCESS) {
3161                                     logevent
3162                                         ("Pageant's response accepted");
3163                                     if (flags & FLAG_VERBOSE) {
3164                                         c_write_str(ssh, "Authenticated using"
3165                                                     " RSA key \"");
3166                                         c_write(ssh, s->commentp,
3167                                                 s->commentlen);
3168                                         c_write_str(ssh, "\" from agent\r\n");
3169                                     }
3170                                     s->authed = TRUE;
3171                                 } else
3172                                     logevent
3173                                         ("Pageant's response not accepted");
3174                             } else {
3175                                 logevent
3176                                     ("Pageant failed to answer challenge");
3177                                 sfree(ret);
3178                             }
3179                         } else {
3180                             logevent("No reply received from Pageant");
3181                         }
3182                     }
3183                     freebn(s->key.exponent);
3184                     freebn(s->key.modulus);
3185                     freebn(s->challenge);
3186                     if (s->authed)
3187                         break;
3188                 }
3189                 sfree(s->response);
3190             }
3191             if (s->authed)
3192                 break;
3193         }
3194         if (!filename_is_null(ssh->cfg.keyfile) && !s->tried_publickey)
3195             s->pwpkt_type = SSH1_CMSG_AUTH_RSA;
3196
3197         if (ssh->cfg.try_tis_auth &&
3198             (s->supported_auths_mask & (1 << SSH1_AUTH_TIS)) &&
3199             !s->tis_auth_refused) {
3200             s->pwpkt_type = SSH1_CMSG_AUTH_TIS_RESPONSE;
3201             logevent("Requested TIS authentication");
3202             send_packet(ssh, SSH1_CMSG_AUTH_TIS, PKT_END);
3203             crWaitUntil(pktin);
3204             if (pktin->type != SSH1_SMSG_AUTH_TIS_CHALLENGE) {
3205                 logevent("TIS authentication declined");
3206                 if (flags & FLAG_INTERACTIVE)
3207                     c_write_str(ssh, "TIS authentication refused.\r\n");
3208                 s->tis_auth_refused = 1;
3209                 continue;
3210             } else {
3211                 char *challenge;
3212                 int challengelen;
3213
3214                 ssh_pkt_getstring(pktin, &challenge, &challengelen);
3215                 if (!challenge) {
3216                     bombout(("TIS challenge packet was badly formed"));
3217                     crStop(0);
3218                 }
3219                 logevent("Received TIS challenge");
3220                 if (challengelen > sizeof(s->prompt) - 1)
3221                     challengelen = sizeof(s->prompt) - 1;/* prevent overrun */
3222                 memcpy(s->prompt, challenge, challengelen);
3223                 /* Prompt heuristic comes from OpenSSH */
3224                 strncpy(s->prompt + challengelen,
3225                         memchr(s->prompt, '\n', challengelen) ?
3226                         "": "\r\nResponse: ",
3227                         (sizeof s->prompt) - challengelen);
3228                 s->prompt[(sizeof s->prompt) - 1] = '\0';
3229             }
3230         }
3231         if (ssh->cfg.try_tis_auth &&
3232             (s->supported_auths_mask & (1 << SSH1_AUTH_CCARD)) &&
3233             !s->ccard_auth_refused) {
3234             s->pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE;
3235             logevent("Requested CryptoCard authentication");
3236             send_packet(ssh, SSH1_CMSG_AUTH_CCARD, PKT_END);
3237             crWaitUntil(pktin);
3238             if (pktin->type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) {
3239                 logevent("CryptoCard authentication declined");
3240                 c_write_str(ssh, "CryptoCard authentication refused.\r\n");
3241                 s->ccard_auth_refused = 1;
3242                 continue;
3243             } else {
3244                 char *challenge;
3245                 int challengelen;
3246
3247                 ssh_pkt_getstring(pktin, &challenge, &challengelen);
3248                 if (!challenge) {
3249                     bombout(("CryptoCard challenge packet was badly formed"));
3250                     crStop(0);
3251                 }
3252                 logevent("Received CryptoCard challenge");
3253                 if (challengelen > sizeof(s->prompt) - 1)
3254                     challengelen = sizeof(s->prompt) - 1;/* prevent overrun */
3255                 memcpy(s->prompt, challenge, challengelen);
3256                 strncpy(s->prompt + challengelen,
3257                         memchr(s->prompt, '\n', challengelen) ?
3258                         "" : "\r\nResponse: ",
3259                         sizeof(s->prompt) - challengelen);
3260                 s->prompt[sizeof(s->prompt) - 1] = '\0';
3261             }
3262         }
3263         if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) {
3264             sprintf(s->prompt, "%.90s@%.90s's password: ",
3265                     s->username, ssh->savedhost);
3266         }
3267         if (s->pwpkt_type == SSH1_CMSG_AUTH_RSA) {
3268             char *comment = NULL;
3269             int type;
3270             if (flags & FLAG_VERBOSE)
3271                 c_write_str(ssh, "Trying public key authentication.\r\n");
3272             logeventf(ssh, "Trying public key \"%s\"",
3273                       filename_to_str(&ssh->cfg.keyfile));
3274             type = key_type(&ssh->cfg.keyfile);
3275             if (type != SSH_KEYTYPE_SSH1) {
3276                 char *msg = dupprintf("Key is of wrong type (%s)",
3277                                       key_type_to_str(type));
3278                 logevent(msg);
3279                 c_write_str(ssh, msg);
3280                 c_write_str(ssh, "\r\n");
3281                 sfree(msg);
3282                 s->tried_publickey = 1;
3283                 continue;
3284             }
3285             if (!rsakey_encrypted(&ssh->cfg.keyfile, &comment)) {
3286                 if (flags & FLAG_VERBOSE)
3287                     c_write_str(ssh, "No passphrase required.\r\n");
3288                 goto tryauth;
3289             }
3290             sprintf(s->prompt, "Passphrase for key \"%.100s\": ", comment);
3291             sfree(comment);
3292         }
3293
3294         /*
3295          * Show password prompt, having first obtained it via a TIS
3296          * or CryptoCard exchange if we're doing TIS or CryptoCard
3297          * authentication.
3298          */
3299         if (ssh_get_line) {
3300             if (!ssh_get_line(s->prompt, s->password,
3301                               sizeof(s->password), TRUE)) {
3302                 /*
3303                  * get_line failed to get a password (for example
3304                  * because one was supplied on the command line
3305                  * which has already failed to work). Terminate.
3306                  */
3307                 send_packet(ssh, SSH1_MSG_DISCONNECT,
3308                             PKT_STR, "No more passwords available to try",
3309                             PKT_END);
3310                 logevent("Unable to authenticate");
3311                 connection_fatal(ssh->frontend, "Unable to authenticate");
3312                 ssh->close_expected = TRUE;
3313                 ssh_closing((Plug)ssh, NULL, 0, 0);
3314                 crStop(1);
3315             }
3316         } else {
3317             /* Prompt may have come from server. We've munged it a bit, so
3318              * we know it to be zero-terminated at least once. */
3319             int ret;                   /* need not be saved over crReturn */
3320             c_write_untrusted(ssh, s->prompt, strlen(s->prompt));
3321             s->pos = 0;
3322
3323             setup_userpass_input(ssh, s->password, sizeof(s->password), 0);
3324             do {
3325                 crWaitUntil(!pktin);
3326                 ret = process_userpass_input(ssh, in, inlen);
3327             } while (ret == 0);
3328             if (ret < 0)
3329                 cleanup_exit(0);
3330             c_write_str(ssh, "\r\n");
3331         }
3332
3333       tryauth:
3334         if (s->pwpkt_type == SSH1_CMSG_AUTH_RSA) {
3335             /*
3336              * Try public key authentication with the specified
3337              * key file.
3338              */
3339             s->tried_publickey = 1;
3340             
3341             {
3342                 const char *error = NULL;
3343                 int ret = loadrsakey(&ssh->cfg.keyfile, &s->key, s->password,
3344                                      &error);
3345                 if (ret == 0) {
3346                     c_write_str(ssh, "Couldn't load private key from ");
3347                     c_write_str(ssh, filename_to_str(&ssh->cfg.keyfile));
3348                     c_write_str(ssh, " (");
3349                     c_write_str(ssh, error);
3350                     c_write_str(ssh, ").\r\n");
3351                     continue;          /* go and try password */
3352                 }
3353                 if (ret == -1) {
3354                     c_write_str(ssh, "Wrong passphrase.\r\n");
3355                     s->tried_publickey = 0;
3356                     continue;          /* try again */
3357                 }
3358             }
3359
3360             /*
3361              * Send a public key attempt.
3362              */
3363             send_packet(ssh, SSH1_CMSG_AUTH_RSA,
3364                         PKT_BIGNUM, s->key.modulus, PKT_END);
3365
3366             crWaitUntil(pktin);
3367             if (pktin->type == SSH1_SMSG_FAILURE) {
3368                 c_write_str(ssh, "Server refused our public key.\r\n");
3369                 continue;              /* go and try password */
3370             }
3371             if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {
3372                 bombout(("Bizarre response to offer of public key"));
3373                 crStop(0);
3374             }
3375
3376             {
3377                 int i;
3378                 unsigned char buffer[32];
3379                 Bignum challenge, response;
3380
3381                 if ((challenge = ssh1_pkt_getmp(pktin)) == NULL) {
3382                     bombout(("Server's RSA challenge was badly formatted"));
3383                     crStop(0);
3384                 }
3385                 response = rsadecrypt(challenge, &s->key);
3386                 freebn(s->key.private_exponent);/* burn the evidence */
3387
3388                 for (i = 0; i < 32; i++) {
3389                     buffer[i] = bignum_byte(response, 31 - i);
3390                 }
3391
3392                 MD5Init(&md5c);
3393                 MD5Update(&md5c, buffer, 32);
3394                 MD5Update(&md5c, s->session_id, 16);
3395                 MD5Final(buffer, &md5c);
3396
3397                 send_packet(ssh, SSH1_CMSG_AUTH_RSA_RESPONSE,
3398                             PKT_DATA, buffer, 16, PKT_END);
3399
3400                 freebn(challenge);
3401                 freebn(response);
3402             }
3403
3404             crWaitUntil(pktin);
3405             if (pktin->type == SSH1_SMSG_FAILURE) {
3406                 if (flags & FLAG_VERBOSE)
3407                     c_write_str(ssh, "Failed to authenticate with"
3408                                 " our public key.\r\n");
3409                 continue;              /* go and try password */
3410             } else if (pktin->type != SSH1_SMSG_SUCCESS) {
3411                 bombout(("Bizarre response to RSA authentication response"));
3412                 crStop(0);
3413             }
3414
3415             break;                     /* we're through! */
3416         } else {
3417             if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) {
3418                 /*
3419                  * Defence against traffic analysis: we send a
3420                  * whole bunch of packets containing strings of
3421                  * different lengths. One of these strings is the
3422                  * password, in a SSH1_CMSG_AUTH_PASSWORD packet.
3423                  * The others are all random data in
3424                  * SSH1_MSG_IGNORE packets. This way a passive
3425                  * listener can't tell which is the password, and
3426                  * hence can't deduce the password length.
3427                  * 
3428                  * Anybody with a password length greater than 16
3429                  * bytes is going to have enough entropy in their
3430                  * password that a listener won't find it _that_
3431                  * much help to know how long it is. So what we'll
3432                  * do is:
3433                  * 
3434                  *  - if password length < 16, we send 15 packets
3435                  *    containing string lengths 1 through 15
3436                  * 
3437                  *  - otherwise, we let N be the nearest multiple
3438                  *    of 8 below the password length, and send 8
3439                  *    packets containing string lengths N through
3440                  *    N+7. This won't obscure the order of
3441                  *    magnitude of the password length, but it will
3442                  *    introduce a bit of extra uncertainty.
3443                  * 
3444                  * A few servers (the old 1.2.18 through 1.2.22)
3445                  * can't deal with SSH1_MSG_IGNORE. For these
3446                  * servers, we need an alternative defence. We make
3447                  * use of the fact that the password is interpreted
3448                  * as a C string: so we can append a NUL, then some
3449                  * random data.
3450                  * 
3451                  * One server (a Cisco one) can deal with neither
3452                  * SSH1_MSG_IGNORE _nor_ a padded password string.
3453                  * For this server we are left with no defences
3454                  * against password length sniffing.
3455                  */
3456                 if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE)) {
3457                     /*
3458                      * The server can deal with SSH1_MSG_IGNORE, so
3459                      * we can use the primary defence.
3460                      */
3461                     int bottom, top, pwlen, i;
3462                     char *randomstr;
3463
3464                     pwlen = strlen(s->password);
3465                     if (pwlen < 16) {
3466                         bottom = 0;    /* zero length passwords are OK! :-) */
3467                         top = 15;
3468                     } else {
3469                         bottom = pwlen & ~7;
3470                         top = bottom + 7;
3471                     }
3472
3473                     assert(pwlen >= bottom && pwlen <= top);
3474
3475                     randomstr = snewn(top + 1, char);
3476
3477                     for (i = bottom; i <= top; i++) {
3478                         if (i == pwlen) {
3479                             defer_packet(ssh, s->pwpkt_type,
3480                                          PKTT_PASSWORD, PKT_STR, s->password,
3481                                          PKTT_OTHER, PKT_END);
3482                         } else {
3483                             for (j = 0; j < i; j++) {
3484                                 do {
3485                                     randomstr[j] = random_byte();
3486                                 } while (randomstr[j] == '\0');
3487                             }
3488                             randomstr[i] = '\0';
3489                             defer_packet(ssh, SSH1_MSG_IGNORE,
3490                                          PKT_STR, randomstr, PKT_END);
3491                         }
3492                     }
3493                     logevent("Sending password with camouflage packets");
3494                     ssh_pkt_defersend(ssh);
3495                     sfree(randomstr);
3496                 } 
3497                 else if (!(ssh->remote_bugs & BUG_NEEDS_SSH1_PLAIN_PASSWORD)) {
3498                     /*
3499                      * The server can't deal with SSH1_MSG_IGNORE
3500                      * but can deal with padded passwords, so we
3501                      * can use the secondary defence.
3502                      */
3503                     char string[64];
3504                     char *ss;
3505                     int len;
3506
3507                     len = strlen(s->password);
3508                     if (len < sizeof(string)) {
3509                         ss = string;
3510                         strcpy(string, s->password);
3511                         len++;         /* cover the zero byte */
3512                         while (len < sizeof(string)) {
3513                             string[len++] = (char) random_byte();
3514                         }
3515                     } else {
3516                         ss = s->password;
3517                     }
3518                     logevent("Sending length-padded password");
3519                     send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD,
3520                                 PKT_INT, len, PKT_DATA, ss, len,
3521                                 PKTT_OTHER, PKT_END);
3522                 } else {
3523                     /*
3524                      * The server has _both_
3525                      * BUG_CHOKES_ON_SSH1_IGNORE and
3526                      * BUG_NEEDS_SSH1_PLAIN_PASSWORD. There is
3527                      * therefore nothing we can do.
3528                      */
3529                     int len;
3530                     len = strlen(s->password);
3531                     logevent("Sending unpadded password");
3532                     send_packet(ssh, s->pwpkt_type,
3533                                 PKTT_PASSWORD, PKT_INT, len,
3534                                 PKT_DATA, s->password, len,
3535                                 PKTT_OTHER, PKT_END);
3536                 }
3537             } else {
3538                 send_packet(ssh, s->pwpkt_type, PKTT_PASSWORD,
3539                             PKT_STR, s->password, PKTT_OTHER, PKT_END);
3540             }
3541         }
3542         logevent("Sent password");
3543         memset(s->password, 0, strlen(s->password));
3544         crWaitUntil(pktin);
3545         if (pktin->type == SSH1_SMSG_FAILURE) {
3546             if (flags & FLAG_VERBOSE)
3547                 c_write_str(ssh, "Access denied\r\n");
3548             logevent("Authentication refused");
3549         } else if (pktin->type != SSH1_SMSG_SUCCESS) {
3550             bombout(("Strange packet received, type %d", pktin->type));
3551             crStop(0);
3552         }
3553     }
3554
3555     logevent("Authentication successful");
3556
3557     crFinish(1);
3558 }
3559
3560 void sshfwd_close(struct ssh_channel *c)
3561 {
3562     Ssh ssh = c->ssh;
3563
3564     if (ssh->state != SSH_STATE_SESSION) {
3565         assert(ssh->state == SSH_STATE_CLOSED);
3566         return;
3567     }
3568
3569     if (c && !c->closes) {
3570         /*
3571          * If halfopen is true, we have sent
3572          * CHANNEL_OPEN for this channel, but it hasn't even been
3573          * acknowledged by the server. So we must set a close flag
3574          * on it now, and then when the server acks the channel
3575          * open, we can close it then.
3576          */
3577         if (!c->halfopen) {
3578             if (ssh->version == 1) {
3579                 send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid,
3580                             PKT_END);
3581             } else {
3582                 struct Packet *pktout;
3583                 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
3584                 ssh2_pkt_adduint32(pktout, c->remoteid);
3585                 ssh2_pkt_send(ssh, pktout);
3586             }
3587         }
3588         c->closes = 1;                 /* sent MSG_CLOSE */
3589         if (c->type == CHAN_X11) {
3590             c->u.x11.s = NULL;
3591             logevent("Forwarded X11 connection terminated");
3592         } else if (c->type == CHAN_SOCKDATA ||
3593                    c->type == CHAN_SOCKDATA_DORMANT) {
3594             c->u.pfd.s = NULL;
3595             logevent("Forwarded port closed");
3596         }
3597     }
3598 }
3599
3600 int sshfwd_write(struct ssh_channel *c, char *buf, int len)
3601 {
3602     Ssh ssh = c->ssh;
3603
3604     if (ssh->state != SSH_STATE_SESSION) {
3605         assert(ssh->state == SSH_STATE_CLOSED);
3606         return 0;
3607     }
3608
3609     if (ssh->version == 1) {
3610         send_packet(ssh, SSH1_MSG_CHANNEL_DATA,
3611                     PKT_INT, c->remoteid,
3612                     PKTT_DATA,
3613                     PKT_INT, len, PKT_DATA, buf, len,
3614                     PKTT_OTHER, PKT_END);
3615         /*
3616          * In SSH1 we can return 0 here - implying that forwarded
3617          * connections are never individually throttled - because
3618          * the only circumstance that can cause throttling will be
3619          * the whole SSH connection backing up, in which case
3620          * _everything_ will be throttled as a whole.
3621          */
3622         return 0;
3623     } else {
3624         ssh2_add_channel_data(c, buf, len);
3625         return ssh2_try_send(c);
3626     }
3627 }
3628
3629 void sshfwd_unthrottle(struct ssh_channel *c, int bufsize)
3630 {
3631     Ssh ssh = c->ssh;
3632
3633     if (ssh->state != SSH_STATE_SESSION) {
3634         assert(ssh->state == SSH_STATE_CLOSED);
3635         return;
3636     }
3637
3638     if (ssh->version == 1) {
3639         if (c->v.v1.throttling && bufsize < SSH1_BUFFER_LIMIT) {
3640             c->v.v1.throttling = 0;
3641             ssh1_throttle(ssh, -1);
3642         }
3643     } else {
3644         ssh2_set_window(c, OUR_V2_WINSIZE - bufsize);
3645     }
3646 }
3647
3648 static void ssh_queueing_handler(Ssh ssh, struct Packet *pktin)
3649 {
3650     struct queued_handler *qh = ssh->qhead;
3651
3652     assert(qh != NULL);
3653
3654     assert(pktin->type == qh->msg1 || pktin->type == qh->msg2);
3655
3656     if (qh->msg1 > 0) {
3657         assert(ssh->packet_dispatch[qh->msg1] == ssh_queueing_handler);
3658         ssh->packet_dispatch[qh->msg1] = NULL;
3659     }
3660     if (qh->msg2 > 0) {
3661         assert(ssh->packet_dispatch[qh->msg2] == ssh_queueing_handler);
3662         ssh->packet_dispatch[qh->msg2] = NULL;
3663     }
3664
3665     if (qh->next) {
3666         ssh->qhead = qh->next;
3667
3668         if (ssh->qhead->msg1 > 0) {
3669             assert(ssh->packet_dispatch[ssh->qhead->msg1] == NULL);
3670             ssh->packet_dispatch[ssh->qhead->msg1] = ssh_queueing_handler;
3671         }
3672         if (ssh->qhead->msg2 > 0) {
3673             assert(ssh->packet_dispatch[ssh->qhead->msg2] == NULL);
3674             ssh->packet_dispatch[ssh->qhead->msg2] = ssh_queueing_handler;
3675         }
3676     } else {
3677         ssh->qhead = ssh->qtail = NULL;
3678         ssh->packet_dispatch[pktin->type] = NULL;
3679     }
3680
3681     qh->handler(ssh, pktin, qh->ctx);
3682
3683     sfree(qh);
3684 }
3685
3686 static void ssh_queue_handler(Ssh ssh, int msg1, int msg2,
3687                               chandler_fn_t handler, void *ctx)
3688 {
3689     struct queued_handler *qh;
3690
3691     qh = snew(struct queued_handler);
3692     qh->msg1 = msg1;
3693     qh->msg2 = msg2;
3694     qh->handler = handler;
3695     qh->ctx = ctx;
3696     qh->next = NULL;
3697
3698     if (ssh->qtail == NULL) {
3699         ssh->qhead = qh;
3700
3701         if (qh->msg1 > 0) {
3702             assert(ssh->packet_dispatch[qh->msg1] == NULL);
3703             ssh->packet_dispatch[qh->msg1] = ssh_queueing_handler;
3704         }
3705         if (qh->msg2 > 0) {
3706             assert(ssh->packet_dispatch[qh->msg2] == NULL);
3707             ssh->packet_dispatch[qh->msg2] = ssh_queueing_handler;
3708         }
3709     } else {
3710         ssh->qtail->next = qh;
3711     }
3712     ssh->qtail = qh;
3713 }
3714
3715 static void ssh_rportfwd_succfail(Ssh ssh, struct Packet *pktin, void *ctx)
3716 {
3717     struct ssh_rportfwd *rpf, *pf = (struct ssh_rportfwd *)ctx;
3718
3719     if (pktin->type == (ssh->version == 1 ? SSH1_SMSG_SUCCESS :
3720                         SSH2_MSG_REQUEST_SUCCESS)) {
3721         logeventf(ssh, "Remote port forwarding from %s enabled",
3722                   pf->sportdesc);
3723     } else {
3724         logeventf(ssh, "Remote port forwarding from %s refused",
3725                   pf->sportdesc);
3726
3727         rpf = del234(ssh->rportfwds, pf);
3728         assert(rpf == pf);
3729         free_rportfwd(pf);
3730     }
3731 }
3732
3733 static void ssh_setup_portfwd(Ssh ssh, const Config *cfg)
3734 {
3735     const char *portfwd_strptr = cfg->portfwd;
3736     struct ssh_portfwd *epf;
3737     int i;
3738
3739     if (!ssh->portfwds) {
3740         ssh->portfwds = newtree234(ssh_portcmp);
3741     } else {
3742         /*
3743          * Go through the existing port forwardings and tag them
3744          * with status==DESTROY. Any that we want to keep will be
3745          * re-enabled (status==KEEP) as we go through the
3746          * configuration and find out which bits are the same as
3747          * they were before.
3748          */
3749         struct ssh_portfwd *epf;
3750         int i;
3751         for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++)
3752             epf->status = DESTROY;
3753     }
3754
3755     while (*portfwd_strptr) {
3756         char address_family, type;
3757         int sport,dport,sserv,dserv;
3758         char sports[256], dports[256], saddr[256], host[256];
3759         int n;
3760
3761         address_family = 'A';
3762         type = 'L';
3763         if (*portfwd_strptr == 'A' ||
3764             *portfwd_strptr == '4' ||
3765             *portfwd_strptr == '6')
3766             address_family = *portfwd_strptr++;
3767         if (*portfwd_strptr == 'L' ||
3768             *portfwd_strptr == 'R' ||
3769             *portfwd_strptr == 'D')
3770             type = *portfwd_strptr++;
3771
3772         saddr[0] = '\0';
3773
3774         n = 0;
3775         while (*portfwd_strptr && *portfwd_strptr != '\t') {
3776             if (*portfwd_strptr == ':') {
3777                 /*
3778                  * We've seen a colon in the middle of the
3779                  * source port number. This means that
3780                  * everything we've seen until now is the
3781                  * source _address_, so we'll move it into
3782                  * saddr and start sports from the beginning
3783                  * again.
3784                  */
3785                 portfwd_strptr++;
3786                 sports[n] = '\0';
3787                 if (ssh->version == 1 && type == 'R') {
3788                     logeventf(ssh, "SSH1 cannot handle remote source address "
3789                               "spec \"%s\"; ignoring", sports);
3790                 } else
3791                     strcpy(saddr, sports);
3792                 n = 0;
3793             }
3794             if (n < 255) sports[n++] = *portfwd_strptr++;
3795         }
3796         sports[n] = 0;
3797         if (type != 'D') {
3798             if (*portfwd_strptr == '\t')
3799                 portfwd_strptr++;
3800             n = 0;
3801             while (*portfwd_strptr && *portfwd_strptr != ':') {
3802                 if (n < 255) host[n++] = *portfwd_strptr++;
3803             }
3804             host[n] = 0;
3805             if (*portfwd_strptr == ':')
3806                 portfwd_strptr++;
3807             n = 0;
3808             while (*portfwd_strptr) {
3809                 if (n < 255) dports[n++] = *portfwd_strptr++;
3810             }
3811             dports[n] = 0;
3812             portfwd_strptr++;
3813             dport = atoi(dports);
3814             dserv = 0;
3815             if (dport == 0) {
3816                 dserv = 1;
3817                 dport = net_service_lookup(dports);
3818                 if (!dport) {
3819                     logeventf(ssh, "Service lookup failed for destination"
3820                               " port \"%s\"", dports);
3821                 }
3822             }
3823         } else {
3824             while (*portfwd_strptr) portfwd_strptr++;
3825             host[0] = 0;
3826             dports[0] = 0;
3827             dport = dserv = -1;
3828             portfwd_strptr++;          /* eat the NUL and move to next one */
3829         }
3830         sport = atoi(sports);
3831         sserv = 0;
3832         if (sport == 0) {
3833             sserv = 1;
3834             sport = net_service_lookup(sports);
3835             if (!sport) {
3836                 logeventf(ssh, "Service lookup failed for source"
3837                           " port \"%s\"", sports);
3838             }
3839         }
3840         if (sport && dport) {
3841             /* Set up a description of the source port. */
3842             struct ssh_portfwd *pfrec, *epfrec;
3843
3844             pfrec = snew(struct ssh_portfwd);
3845             pfrec->type = type;
3846             pfrec->saddr = *saddr ? dupstr(saddr) : NULL;
3847             pfrec->sserv = sserv ? dupstr(sports) : NULL;
3848             pfrec->sport = sport;
3849             pfrec->daddr = *host ? dupstr(host) : NULL;
3850             pfrec->dserv = dserv ? dupstr(dports) : NULL;
3851             pfrec->dport = dport;
3852             pfrec->local = NULL;
3853             pfrec->remote = NULL;
3854             pfrec->addressfamily = (address_family == '4' ? ADDRTYPE_IPV4 :
3855                                     address_family == '6' ? ADDRTYPE_IPV6 :
3856                                     ADDRTYPE_UNSPEC);
3857
3858             epfrec = add234(ssh->portfwds, pfrec);
3859             if (epfrec != pfrec) {
3860                 /*
3861                  * We already have a port forwarding with precisely
3862                  * these parameters. Hence, no need to do anything;
3863                  * simply tag the existing one as KEEP.
3864                  */
3865                 epfrec->status = KEEP;
3866                 free_portfwd(pfrec);
3867             } else {
3868                 pfrec->status = CREATE;
3869             }
3870         }
3871     }
3872
3873     /*
3874      * Now go through and destroy any port forwardings which were
3875      * not re-enabled.
3876      */
3877     for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++)
3878         if (epf->status == DESTROY) {
3879             char *message;
3880
3881             message = dupprintf("%s port forwarding from %s%s%d",
3882                                 epf->type == 'L' ? "local" :
3883                                 epf->type == 'R' ? "remote" : "dynamic",
3884                                 epf->saddr ? epf->saddr : "",
3885                                 epf->saddr ? ":" : "",
3886                                 epf->sport);
3887
3888             if (epf->type != 'D') {
3889                 char *msg2 = dupprintf("%s to %s:%d", message,
3890                                        epf->daddr, epf->dport);
3891                 sfree(message);
3892                 message = msg2;
3893             }
3894
3895             logeventf(ssh, "Cancelling %s", message);
3896             sfree(message);
3897
3898             if (epf->remote) {
3899                 struct ssh_rportfwd *rpf = epf->remote;
3900                 struct Packet *pktout;
3901
3902                 /*
3903                  * Cancel the port forwarding at the server
3904                  * end.
3905                  */
3906                 if (ssh->version == 1) {
3907                     /*
3908                      * We cannot cancel listening ports on the
3909                      * server side in SSH1! There's no message
3910                      * to support it. Instead, we simply remove
3911                      * the rportfwd record from the local end
3912                      * so that any connections the server tries
3913                      * to make on it are rejected.
3914                      */
3915                 } else {
3916                     pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST);
3917                     ssh2_pkt_addstring(pktout, "cancel-tcpip-forward");
3918                     ssh2_pkt_addbool(pktout, 0);/* _don't_ want reply */
3919                     if (epf->saddr) {
3920                         ssh2_pkt_addstring(pktout, epf->saddr);
3921                     } else if (ssh->cfg.rport_acceptall) {
3922                         /* XXX: ssh->cfg.rport_acceptall may not represent
3923                          * what was used to open the original connection,
3924                          * since it's reconfigurable. */
3925                         ssh2_pkt_addstring(pktout, "0.0.0.0");
3926                     } else {
3927                         ssh2_pkt_addstring(pktout, "127.0.0.1");
3928                     }
3929                     ssh2_pkt_adduint32(pktout, epf->sport);
3930                     ssh2_pkt_send(ssh, pktout);
3931                 }
3932
3933                 del234(ssh->rportfwds, rpf);
3934                 free_rportfwd(rpf);
3935             } else if (epf->local) {
3936                 pfd_terminate(epf->local);
3937             }
3938
3939             delpos234(ssh->portfwds, i);
3940             free_portfwd(epf);
3941             i--;                       /* so we don't skip one in the list */
3942         }
3943
3944     /*
3945      * And finally, set up any new port forwardings (status==CREATE).
3946      */
3947     for (i = 0; (epf = index234(ssh->portfwds, i)) != NULL; i++)
3948         if (epf->status == CREATE) {
3949             char *sportdesc, *dportdesc;
3950             sportdesc = dupprintf("%s%s%s%s%d%s",
3951                                   epf->saddr ? epf->saddr : "",
3952                                   epf->saddr ? ":" : "",
3953                                   epf->sserv ? epf->sserv : "",
3954                                   epf->sserv ? "(" : "",
3955                                   epf->sport,
3956                                   epf->sserv ? ")" : "");
3957             if (epf->type == 'D') {
3958                 dportdesc = NULL;
3959             } else {
3960                 dportdesc = dupprintf("%s:%s%s%d%s",
3961                                       epf->daddr,
3962                                       epf->dserv ? epf->dserv : "",
3963                                       epf->dserv ? "(" : "",
3964                                       epf->dport,
3965                                       epf->dserv ? ")" : "");
3966             }
3967
3968             if (epf->type == 'L') {
3969                 const char *err = pfd_addforward(epf->daddr, epf->dport,
3970                                                  epf->saddr, epf->sport,
3971                                                  ssh, cfg,
3972                                                  &epf->local,
3973                                                  epf->addressfamily);
3974
3975                 logeventf(ssh, "Local %sport %s forwarding to %s%s%s",
3976                           epf->addressfamily == ADDRTYPE_IPV4 ? "IPv4 " :
3977                           epf->addressfamily == ADDRTYPE_IPV6 ? "IPv6 " : "",
3978                           sportdesc, dportdesc,
3979                           err ? " failed: " : "", err ? err : "");
3980             } else if (epf->type == 'D') {
3981                 const char *err = pfd_addforward(NULL, -1,
3982                                                  epf->saddr, epf->sport,
3983                                                  ssh, cfg,
3984                                                  &epf->local,
3985                                                  epf->addressfamily);
3986
3987                 logeventf(ssh, "Local %sport %s SOCKS dynamic forwarding%s%s",
3988                           epf->addressfamily == ADDRTYPE_IPV4 ? "IPv4 " :
3989                           epf->addressfamily == ADDRTYPE_IPV6 ? "IPv6 " : "",
3990                           sportdesc,
3991                           err ? " failed: " : "", err ? err : "");
3992             } else {
3993                 struct ssh_rportfwd *pf;
3994
3995                 /*
3996                  * Ensure the remote port forwardings tree exists.
3997                  */
3998                 if (!ssh->rportfwds) {
3999                     if (ssh->version == 1)
4000                         ssh->rportfwds = newtree234(ssh_rportcmp_ssh1);
4001                     else
4002                         ssh->rportfwds = newtree234(ssh_rportcmp_ssh2);
4003                 }
4004
4005                 pf = snew(struct ssh_rportfwd);
4006                 strncpy(pf->dhost, epf->daddr, lenof(pf->dhost)-1);
4007                 pf->dhost[lenof(pf->dhost)-1] = '\0';
4008                 pf->dport = epf->dport;
4009                 pf->sport = epf->sport;
4010                 if (add234(ssh->rportfwds, pf) != pf) {
4011                     logeventf(ssh, "Duplicate remote port forwarding to %s:%d",
4012                               epf->daddr, epf->dport);
4013                     sfree(pf);
4014                 } else {
4015                     logeventf(ssh, "Requesting remote port %s"
4016                               " forward to %s", sportdesc, dportdesc);
4017
4018                     pf->sportdesc = sportdesc;
4019                     sportdesc = NULL;
4020                     epf->remote = pf;
4021                     pf->pfrec = epf;
4022
4023                     if (ssh->version == 1) {
4024                         send_packet(ssh, SSH1_CMSG_PORT_FORWARD_REQUEST,
4025                                     PKT_INT, epf->sport,
4026                                     PKT_STR, epf->daddr,
4027                                     PKT_INT, epf->dport,
4028                                     PKT_END);
4029                         ssh_queue_handler(ssh, SSH1_SMSG_SUCCESS,
4030                                           SSH1_SMSG_FAILURE,
4031                                           ssh_rportfwd_succfail, pf);
4032                     } else {
4033                         struct Packet *pktout;
4034                         pktout = ssh2_pkt_init(SSH2_MSG_GLOBAL_REQUEST);
4035                         ssh2_pkt_addstring(pktout, "tcpip-forward");
4036                         ssh2_pkt_addbool(pktout, 1);/* want reply */
4037                         if (epf->saddr) {
4038                             ssh2_pkt_addstring(pktout, epf->saddr);
4039                         } else if (cfg->rport_acceptall) {
4040                             ssh2_pkt_addstring(pktout, "0.0.0.0");
4041                         } else {
4042                             ssh2_pkt_addstring(pktout, "127.0.0.1");
4043                         }
4044                         ssh2_pkt_adduint32(pktout, epf->sport);
4045                         ssh2_pkt_send(ssh, pktout);
4046
4047                         ssh_queue_handler(ssh, SSH2_MSG_REQUEST_SUCCESS,
4048                                           SSH2_MSG_REQUEST_FAILURE,
4049                                           ssh_rportfwd_succfail, pf);
4050                     }
4051                 }
4052             }
4053             sfree(sportdesc);
4054             sfree(dportdesc);
4055         }
4056 }
4057
4058 static void ssh1_smsg_stdout_stderr_data(Ssh ssh, struct Packet *pktin)
4059 {
4060     char *string;
4061     int stringlen, bufsize;
4062
4063     ssh_pkt_getstring(pktin, &string, &stringlen);
4064     if (string == NULL) {
4065         bombout(("Incoming terminal data packet was badly formed"));
4066         return;
4067     }
4068
4069     bufsize = from_backend(ssh->frontend, pktin->type == SSH1_SMSG_STDERR_DATA,
4070                            string, stringlen);
4071     if (!ssh->v1_stdout_throttling && bufsize > SSH1_BUFFER_LIMIT) {
4072         ssh->v1_stdout_throttling = 1;
4073         ssh1_throttle(ssh, +1);
4074     }
4075 }
4076
4077 static void ssh1_smsg_x11_open(Ssh ssh, struct Packet *pktin)
4078 {
4079     /* Remote side is trying to open a channel to talk to our
4080      * X-Server. Give them back a local channel number. */
4081     struct ssh_channel *c;
4082     int remoteid = ssh_pkt_getuint32(pktin);
4083
4084     logevent("Received X11 connect request");
4085     /* Refuse if X11 forwarding is disabled. */
4086     if (!ssh->X11_fwd_enabled) {
4087         send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4088                     PKT_INT, remoteid, PKT_END);
4089         logevent("Rejected X11 connect request");
4090     } else {
4091         c = snew(struct ssh_channel);
4092         c->ssh = ssh;
4093
4094         if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c,
4095                      ssh->x11auth, NULL, -1, &ssh->cfg) != NULL) {
4096             logevent("Opening X11 forward connection failed");
4097             sfree(c);
4098             send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4099                         PKT_INT, remoteid, PKT_END);
4100         } else {
4101             logevent
4102                 ("Opening X11 forward connection succeeded");
4103             c->remoteid = remoteid;
4104             c->halfopen = FALSE;
4105             c->localid = alloc_channel_id(ssh);
4106             c->closes = 0;
4107             c->v.v1.throttling = 0;
4108             c->type = CHAN_X11; /* identify channel type */
4109             add234(ssh->channels, c);
4110             send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION,
4111                         PKT_INT, c->remoteid, PKT_INT,
4112                         c->localid, PKT_END);
4113             logevent("Opened X11 forward channel");
4114         }
4115     }
4116 }
4117
4118 static void ssh1_smsg_agent_open(Ssh ssh, struct Packet *pktin)
4119 {
4120     /* Remote side is trying to open a channel to talk to our
4121      * agent. Give them back a local channel number. */
4122     struct ssh_channel *c;
4123     int remoteid = ssh_pkt_getuint32(pktin);
4124
4125     /* Refuse if agent forwarding is disabled. */
4126     if (!ssh->agentfwd_enabled) {
4127         send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4128                     PKT_INT, remoteid, PKT_END);
4129     } else {
4130         c = snew(struct ssh_channel);
4131         c->ssh = ssh;
4132         c->remoteid = remoteid;
4133         c->halfopen = FALSE;
4134         c->localid = alloc_channel_id(ssh);
4135         c->closes = 0;
4136         c->v.v1.throttling = 0;
4137         c->type = CHAN_AGENT;   /* identify channel type */
4138         c->u.a.lensofar = 0;
4139         add234(ssh->channels, c);
4140         send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION,
4141                     PKT_INT, c->remoteid, PKT_INT, c->localid,
4142                     PKT_END);
4143     }
4144 }
4145
4146 static void ssh1_msg_port_open(Ssh ssh, struct Packet *pktin)
4147 {
4148     /* Remote side is trying to open a channel to talk to a
4149      * forwarded port. Give them back a local channel number. */
4150     struct ssh_channel *c;
4151     struct ssh_rportfwd pf, *pfp;
4152     int remoteid;
4153     int hostsize, port;
4154     char *host;
4155     const char *e;
4156     c = snew(struct ssh_channel);
4157     c->ssh = ssh;
4158
4159     remoteid = ssh_pkt_getuint32(pktin);
4160     ssh_pkt_getstring(pktin, &host, &hostsize);
4161     port = ssh_pkt_getuint32(pktin);
4162
4163     if (hostsize >= lenof(pf.dhost))
4164         hostsize = lenof(pf.dhost)-1;
4165     memcpy(pf.dhost, host, hostsize);
4166     pf.dhost[hostsize] = '\0';
4167     pf.dport = port;
4168     pfp = find234(ssh->rportfwds, &pf, NULL);
4169
4170     if (pfp == NULL) {
4171         logeventf(ssh, "Rejected remote port open request for %s:%d",
4172                   pf.dhost, port);
4173         send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4174                     PKT_INT, remoteid, PKT_END);
4175     } else {
4176         logeventf(ssh, "Received remote port open request for %s:%d",
4177                   pf.dhost, port);
4178         e = pfd_newconnect(&c->u.pfd.s, pf.dhost, port,
4179                            c, &ssh->cfg, pfp->pfrec->addressfamily);
4180         if (e != NULL) {
4181             logeventf(ssh, "Port open failed: %s", e);
4182             sfree(c);
4183             send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_FAILURE,
4184                         PKT_INT, remoteid, PKT_END);
4185         } else {
4186             c->remoteid = remoteid;
4187             c->halfopen = FALSE;
4188             c->localid = alloc_channel_id(ssh);
4189             c->closes = 0;
4190             c->v.v1.throttling = 0;
4191             c->type = CHAN_SOCKDATA;    /* identify channel type */
4192             add234(ssh->channels, c);
4193             send_packet(ssh, SSH1_MSG_CHANNEL_OPEN_CONFIRMATION,
4194                         PKT_INT, c->remoteid, PKT_INT,
4195                         c->localid, PKT_END);
4196             logevent("Forwarded port opened successfully");
4197         }
4198     }
4199 }
4200
4201 static void ssh1_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin)
4202 {
4203     unsigned int remoteid = ssh_pkt_getuint32(pktin);
4204     unsigned int localid = ssh_pkt_getuint32(pktin);
4205     struct ssh_channel *c;
4206
4207     c = find234(ssh->channels, &remoteid, ssh_channelfind);
4208     if (c && c->type == CHAN_SOCKDATA_DORMANT) {
4209         c->remoteid = localid;
4210         c->halfopen = FALSE;
4211         c->type = CHAN_SOCKDATA;
4212         c->v.v1.throttling = 0;
4213         pfd_confirm(c->u.pfd.s);
4214     }
4215
4216     if (c && c->closes) {
4217         /*
4218          * We have a pending close on this channel,
4219          * which we decided on before the server acked
4220          * the channel open. So now we know the
4221          * remoteid, we can close it again.
4222          */
4223         send_packet(ssh, SSH1_MSG_CHANNEL_CLOSE,
4224                     PKT_INT, c->remoteid, PKT_END);
4225     }
4226 }
4227
4228 static void ssh1_msg_channel_open_failure(Ssh ssh, struct Packet *pktin)
4229 {
4230     unsigned int remoteid = ssh_pkt_getuint32(pktin);
4231     struct ssh_channel *c;
4232
4233     c = find234(ssh->channels, &remoteid, ssh_channelfind);
4234     if (c && c->type == CHAN_SOCKDATA_DORMANT) {
4235         logevent("Forwarded connection refused by server");
4236         pfd_close(c->u.pfd.s);
4237         del234(ssh->channels, c);
4238         sfree(c);
4239     }
4240 }
4241
4242 static void ssh1_msg_channel_close(Ssh ssh, struct Packet *pktin)
4243 {
4244     /* Remote side closes a channel. */
4245     unsigned i = ssh_pkt_getuint32(pktin);
4246     struct ssh_channel *c;
4247     c = find234(ssh->channels, &i, ssh_channelfind);
4248     if (c && !c->halfopen) {
4249         int closetype;
4250         closetype =
4251             (pktin->type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2);
4252
4253         if ((c->closes == 0) && (c->type == CHAN_X11)) {
4254             logevent("Forwarded X11 connection terminated");
4255             assert(c->u.x11.s != NULL);
4256             x11_close(c->u.x11.s);
4257             c->u.x11.s = NULL;
4258         }
4259         if ((c->closes == 0) && (c->type == CHAN_SOCKDATA)) {
4260             logevent("Forwarded port closed");
4261             assert(c->u.pfd.s != NULL);
4262             pfd_close(c->u.pfd.s);
4263             c->u.pfd.s = NULL;
4264         }
4265
4266         c->closes |= (closetype << 2);   /* seen this message */
4267         if (!(c->closes & closetype)) {
4268             send_packet(ssh, pktin->type, PKT_INT, c->remoteid,
4269                         PKT_END);
4270             c->closes |= closetype;      /* sent it too */
4271         }
4272
4273         if (c->closes == 15) {
4274             del234(ssh->channels, c);
4275             sfree(c);
4276         }
4277     } else {
4278         bombout(("Received CHANNEL_CLOSE%s for %s channel %d\n",
4279                  pktin->type == SSH1_MSG_CHANNEL_CLOSE ? "" :
4280                  "_CONFIRMATION", c ? "half-open" : "nonexistent",
4281                  i));
4282     }
4283 }
4284
4285 static void ssh1_msg_channel_data(Ssh ssh, struct Packet *pktin)
4286 {
4287     /* Data sent down one of our channels. */
4288     int i = ssh_pkt_getuint32(pktin);
4289     char *p;
4290     int len;
4291     struct ssh_channel *c;
4292
4293     ssh_pkt_getstring(pktin, &p, &len);
4294
4295     c = find234(ssh->channels, &i, ssh_channelfind);
4296     if (c) {
4297         int bufsize = 0;
4298         switch (c->type) {
4299           case CHAN_X11:
4300             bufsize = x11_send(c->u.x11.s, p, len);
4301             break;
4302           case CHAN_SOCKDATA:
4303             bufsize = pfd_send(c->u.pfd.s, p, len);
4304             break;
4305           case CHAN_AGENT:
4306             /* Data for an agent message. Buffer it. */
4307             while (len > 0) {
4308                 if (c->u.a.lensofar < 4) {
4309                     unsigned int l = min(4 - c->u.a.lensofar, len);
4310                     memcpy(c->u.a.msglen + c->u.a.lensofar, p,
4311                            l);
4312                     p += l;
4313                     len -= l;
4314                     c->u.a.lensofar += l;
4315                 }
4316                 if (c->u.a.lensofar == 4) {
4317                     c->u.a.totallen =
4318                         4 + GET_32BIT(c->u.a.msglen);
4319                     c->u.a.message = snewn(c->u.a.totallen,
4320                                            unsigned char);
4321                     memcpy(c->u.a.message, c->u.a.msglen, 4);
4322                 }
4323                 if (c->u.a.lensofar >= 4 && len > 0) {
4324                     unsigned int l =
4325                         min(c->u.a.totallen - c->u.a.lensofar,
4326                             len);
4327                     memcpy(c->u.a.message + c->u.a.lensofar, p,
4328                            l);
4329                     p += l;
4330                     len -= l;
4331                     c->u.a.lensofar += l;
4332                 }
4333                 if (c->u.a.lensofar == c->u.a.totallen) {
4334                     void *reply;
4335                     int replylen;
4336                     if (agent_query(c->u.a.message,
4337                                     c->u.a.totallen,
4338                                     &reply, &replylen,
4339                                     ssh_agentf_callback, c))
4340                         ssh_agentf_callback(c, reply, replylen);
4341                     sfree(c->u.a.message);
4342                     c->u.a.lensofar = 0;
4343                 }
4344             }
4345             bufsize = 0;   /* agent channels never back up */
4346             break;
4347         }
4348         if (!c->v.v1.throttling && bufsize > SSH1_BUFFER_LIMIT) {
4349             c->v.v1.throttling = 1;
4350             ssh1_throttle(ssh, +1);
4351         }
4352     }
4353 }
4354
4355 static void ssh1_smsg_exit_status(Ssh ssh, struct Packet *pktin)
4356 {
4357     ssh->exitcode = ssh_pkt_getuint32(pktin);
4358     logeventf(ssh, "Server sent command exit status %d", ssh->exitcode);
4359     send_packet(ssh, SSH1_CMSG_EXIT_CONFIRMATION, PKT_END);
4360     /*
4361      * In case `helpful' firewalls or proxies tack
4362      * extra human-readable text on the end of the
4363      * session which we might mistake for another
4364      * encrypted packet, we close the session once
4365      * we've sent EXIT_CONFIRMATION.
4366      */
4367     ssh->close_expected = TRUE;
4368     ssh_closing((Plug)ssh, NULL, 0, 0);
4369 }
4370
4371 static void do_ssh1_connection(Ssh ssh, unsigned char *in, int inlen,
4372                                struct Packet *pktin)
4373 {
4374     crBegin(ssh->do_ssh1_connection_crstate);
4375
4376     ssh->packet_dispatch[SSH1_SMSG_STDOUT_DATA] = 
4377         ssh->packet_dispatch[SSH1_SMSG_STDERR_DATA] =
4378         ssh1_smsg_stdout_stderr_data;
4379
4380     ssh->packet_dispatch[SSH1_MSG_CHANNEL_OPEN_CONFIRMATION] =
4381         ssh1_msg_channel_open_confirmation;
4382     ssh->packet_dispatch[SSH1_MSG_CHANNEL_OPEN_FAILURE] =
4383         ssh1_msg_channel_open_failure;
4384     ssh->packet_dispatch[SSH1_MSG_CHANNEL_CLOSE] =
4385         ssh->packet_dispatch[SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION] =
4386         ssh1_msg_channel_close;
4387     ssh->packet_dispatch[SSH1_MSG_CHANNEL_DATA] = ssh1_msg_channel_data;
4388     ssh->packet_dispatch[SSH1_SMSG_EXIT_STATUS] = ssh1_smsg_exit_status;
4389
4390     if (ssh->cfg.agentfwd && agent_exists()) {
4391         logevent("Requesting agent forwarding");
4392         send_packet(ssh, SSH1_CMSG_AGENT_REQUEST_FORWARDING, PKT_END);
4393         do {
4394             crReturnV;
4395         } while (!pktin);
4396         if (pktin->type != SSH1_SMSG_SUCCESS
4397             && pktin->type != SSH1_SMSG_FAILURE) {
4398             bombout(("Protocol confusion"));
4399             crStopV;
4400         } else if (pktin->type == SSH1_SMSG_FAILURE) {
4401             logevent("Agent forwarding refused");
4402         } else {
4403             logevent("Agent forwarding enabled");
4404             ssh->agentfwd_enabled = TRUE;
4405             ssh->packet_dispatch[SSH1_SMSG_AGENT_OPEN] = ssh1_smsg_agent_open;
4406         }
4407     }
4408
4409     if (ssh->cfg.x11_forward) {
4410         char proto[20], data[64];
4411         logevent("Requesting X11 forwarding");
4412         ssh->x11auth = x11_invent_auth(proto, sizeof(proto),
4413                                        data, sizeof(data), ssh->cfg.x11_auth);
4414         x11_get_real_auth(ssh->x11auth, ssh->cfg.x11_display);
4415         if (ssh->v1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) {
4416             send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING,
4417                         PKT_STR, proto, PKT_STR, data,
4418                         PKT_INT, x11_get_screen_number(ssh->cfg.x11_display),
4419                         PKT_END);
4420         } else {
4421             send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING,
4422                         PKT_STR, proto, PKT_STR, data, PKT_END);
4423         }
4424         do {
4425             crReturnV;
4426         } while (!pktin);
4427         if (pktin->type != SSH1_SMSG_SUCCESS
4428             && pktin->type != SSH1_SMSG_FAILURE) {
4429             bombout(("Protocol confusion"));
4430             crStopV;
4431         } else if (pktin->type == SSH1_SMSG_FAILURE) {
4432             logevent("X11 forwarding refused");
4433         } else {
4434             logevent("X11 forwarding enabled");
4435             ssh->X11_fwd_enabled = TRUE;
4436             ssh->packet_dispatch[SSH1_SMSG_X11_OPEN] = ssh1_smsg_x11_open;
4437         }
4438     }
4439
4440     ssh_setup_portfwd(ssh, &ssh->cfg);
4441     ssh->packet_dispatch[SSH1_MSG_PORT_OPEN] = ssh1_msg_port_open;
4442
4443     if (!ssh->cfg.nopty) {
4444         /* Unpick the terminal-speed string. */
4445         /* XXX perhaps we should allow no speeds to be sent. */
4446         ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */
4447         sscanf(ssh->cfg.termspeed, "%d,%d", &ssh->ospeed, &ssh->ispeed);
4448         /* Send the pty request. */
4449         send_packet(ssh, SSH1_CMSG_REQUEST_PTY,
4450                     PKT_STR, ssh->cfg.termtype,
4451                     PKT_INT, ssh->term_height,
4452                     PKT_INT, ssh->term_width,
4453                     PKT_INT, 0, PKT_INT, 0, /* width,height in pixels */
4454                     PKT_CHAR, 192, PKT_INT, ssh->ispeed, /* TTY_OP_ISPEED */
4455                     PKT_CHAR, 193, PKT_INT, ssh->ospeed, /* TTY_OP_OSPEED */
4456                     PKT_CHAR, 0, PKT_END);
4457         ssh->state = SSH_STATE_INTERMED;
4458         do {
4459             crReturnV;
4460         } while (!pktin);
4461         if (pktin->type != SSH1_SMSG_SUCCESS
4462             && pktin->type != SSH1_SMSG_FAILURE) {
4463             bombout(("Protocol confusion"));
4464             crStopV;
4465         } else if (pktin->type == SSH1_SMSG_FAILURE) {
4466             c_write_str(ssh, "Server refused to allocate pty\r\n");
4467             ssh->editing = ssh->echoing = 1;
4468         }
4469         logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)",
4470                   ssh->ospeed, ssh->ispeed);
4471     } else {
4472         ssh->editing = ssh->echoing = 1;
4473     }
4474
4475     if (ssh->cfg.compression) {
4476         send_packet(ssh, SSH1_CMSG_REQUEST_COMPRESSION, PKT_INT, 6, PKT_END);
4477         do {
4478             crReturnV;
4479         } while (!pktin);
4480         if (pktin->type != SSH1_SMSG_SUCCESS
4481             && pktin->type != SSH1_SMSG_FAILURE) {
4482             bombout(("Protocol confusion"));
4483             crStopV;
4484         } else if (pktin->type == SSH1_SMSG_FAILURE) {
4485             c_write_str(ssh, "Server refused to compress\r\n");
4486         }
4487         logevent("Started compression");
4488         ssh->v1_compressing = TRUE;
4489         ssh->cs_comp_ctx = zlib_compress_init();
4490         logevent("Initialised zlib (RFC1950) compression");
4491         ssh->sc_comp_ctx = zlib_decompress_init();
4492         logevent("Initialised zlib (RFC1950) decompression");
4493     }
4494
4495     /*
4496      * Start the shell or command.
4497      * 
4498      * Special case: if the first-choice command is an SSH2
4499      * subsystem (hence not usable here) and the second choice
4500      * exists, we fall straight back to that.
4501      */
4502     {
4503         char *cmd = ssh->cfg.remote_cmd_ptr;
4504         
4505         if (ssh->cfg.ssh_subsys && ssh->cfg.remote_cmd_ptr2) {
4506             cmd = ssh->cfg.remote_cmd_ptr2;
4507             ssh->fallback_cmd = TRUE;
4508         }
4509         if (*cmd)
4510             send_packet(ssh, SSH1_CMSG_EXEC_CMD, PKT_STR, cmd, PKT_END);
4511         else
4512             send_packet(ssh, SSH1_CMSG_EXEC_SHELL, PKT_END);
4513         logevent("Started session");
4514     }
4515
4516     ssh->state = SSH_STATE_SESSION;
4517     if (ssh->size_needed)
4518         ssh_size(ssh, ssh->term_width, ssh->term_height);
4519     if (ssh->eof_needed)
4520         ssh_special(ssh, TS_EOF);
4521
4522     if (ssh->ldisc)
4523         ldisc_send(ssh->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */
4524     ssh->send_ok = 1;
4525     ssh->channels = newtree234(ssh_channelcmp);
4526     while (1) {
4527
4528         /*
4529          * By this point, most incoming packets are already being
4530          * handled by the dispatch table, and we need only pay
4531          * attention to the unusual ones.
4532          */
4533
4534         crReturnV;
4535         if (pktin) {
4536             if (pktin->type == SSH1_SMSG_SUCCESS) {
4537                 /* may be from EXEC_SHELL on some servers */
4538             } else if (pktin->type == SSH1_SMSG_FAILURE) {
4539                 /* may be from EXEC_SHELL on some servers
4540                  * if no pty is available or in other odd cases. Ignore */
4541             } else {
4542                 bombout(("Strange packet received: type %d", pktin->type));
4543                 crStopV;
4544             }
4545         } else {
4546             while (inlen > 0) {
4547                 int len = min(inlen, 512);
4548                 send_packet(ssh, SSH1_CMSG_STDIN_DATA, PKTT_DATA,
4549                             PKT_INT, len, PKT_DATA, in, len,
4550                             PKTT_OTHER, PKT_END);
4551                 in += len;
4552                 inlen -= len;
4553             }
4554         }
4555     }
4556
4557     crFinishV;
4558 }
4559
4560 /*
4561  * Handle the top-level SSH2 protocol.
4562  */
4563 static void ssh1_msg_debug(Ssh ssh, struct Packet *pktin)
4564 {
4565     char *msg;
4566     int msglen;
4567
4568     ssh_pkt_getstring(pktin, &msg, &msglen);
4569     logeventf(ssh, "Remote debug message: %.*s", msglen, msg);
4570 }
4571
4572 static void ssh1_msg_disconnect(Ssh ssh, struct Packet *pktin)
4573 {
4574     /* log reason code in disconnect message */
4575     char *msg;
4576     int msglen;
4577
4578     ssh_pkt_getstring(pktin, &msg, &msglen);
4579     bombout(("Server sent disconnect message:\n\"%.*s\"", msglen, msg));
4580 }
4581
4582 static void ssh_msg_ignore(Ssh ssh, struct Packet *pktin)
4583 {
4584     /* Do nothing, because we're ignoring it! Duhh. */
4585 }
4586
4587 static void ssh1_protocol_setup(Ssh ssh)
4588 {
4589     int i;
4590
4591     /*
4592      * Most messages are handled by the coroutines.
4593      */
4594     for (i = 0; i < 256; i++)
4595         ssh->packet_dispatch[i] = NULL;
4596
4597     /*
4598      * These special message types we install handlers for.
4599      */
4600     ssh->packet_dispatch[SSH1_MSG_DISCONNECT] = ssh1_msg_disconnect;
4601     ssh->packet_dispatch[SSH1_MSG_IGNORE] = ssh_msg_ignore;
4602     ssh->packet_dispatch[SSH1_MSG_DEBUG] = ssh1_msg_debug;
4603 }
4604
4605 static void ssh1_protocol(Ssh ssh, void *vin, int inlen,
4606                           struct Packet *pktin)
4607 {
4608     unsigned char *in=(unsigned char*)vin;
4609     if (ssh->state == SSH_STATE_CLOSED)
4610         return;
4611
4612     if (pktin && ssh->packet_dispatch[pktin->type]) {
4613         ssh->packet_dispatch[pktin->type](ssh, pktin);
4614         return;
4615     }
4616
4617     if (!ssh->protocol_initial_phase_done) {
4618         if (do_ssh1_login(ssh, in, inlen, pktin))
4619             ssh->protocol_initial_phase_done = TRUE;
4620         else
4621             return;
4622     }
4623
4624     do_ssh1_connection(ssh, in, inlen, pktin);
4625 }
4626
4627 /*
4628  * Utility routine for decoding comma-separated strings in KEXINIT.
4629  */
4630 static int in_commasep_string(char *needle, char *haystack, int haylen)
4631 {
4632     int needlen;
4633     if (!needle || !haystack)          /* protect against null pointers */
4634         return 0;
4635     needlen = strlen(needle);
4636     while (1) {
4637         /*
4638          * Is it at the start of the string?
4639          */
4640         if (haylen >= needlen &&       /* haystack is long enough */
4641             !memcmp(needle, haystack, needlen) &&       /* initial match */
4642             (haylen == needlen || haystack[needlen] == ',')
4643             /* either , or EOS follows */
4644             )
4645             return 1;
4646         /*
4647          * If not, search for the next comma and resume after that.
4648          * If no comma found, terminate.
4649          */
4650         while (haylen > 0 && *haystack != ',')
4651             haylen--, haystack++;
4652         if (haylen == 0)
4653             return 0;
4654         haylen--, haystack++;          /* skip over comma itself */
4655     }
4656 }
4657
4658 /*
4659  * Similar routine for checking whether we have the first string in a list.
4660  */
4661 static int first_in_commasep_string(char *needle, char *haystack, int haylen)
4662 {
4663     int needlen;
4664     if (!needle || !haystack)          /* protect against null pointers */
4665         return 0;
4666     needlen = strlen(needle);
4667     /*
4668      * Is it at the start of the string?
4669      */
4670     if (haylen >= needlen &&       /* haystack is long enough */
4671         !memcmp(needle, haystack, needlen) &&   /* initial match */
4672         (haylen == needlen || haystack[needlen] == ',')
4673         /* either , or EOS follows */
4674         )
4675         return 1;
4676     return 0;
4677 }
4678
4679
4680 /*
4681  * SSH2 key creation method.
4682  */
4683 static void ssh2_mkkey(Ssh ssh, Bignum K, unsigned char *H,
4684                        unsigned char *sessid, char chr,
4685                        unsigned char *keyspace)
4686 {
4687     SHA_State s;
4688     /* First 20 bytes. */
4689     SHA_Init(&s);
4690     if (!(ssh->remote_bugs & BUG_SSH2_DERIVEKEY))
4691         sha_mpint(&s, K);
4692     SHA_Bytes(&s, H, 20);
4693     SHA_Bytes(&s, &chr, 1);
4694     SHA_Bytes(&s, sessid, 20);
4695     SHA_Final(&s, keyspace);
4696     /* Next 20 bytes. */
4697     SHA_Init(&s);
4698     if (!(ssh->remote_bugs & BUG_SSH2_DERIVEKEY))
4699         sha_mpint(&s, K);
4700     SHA_Bytes(&s, H, 20);
4701     SHA_Bytes(&s, keyspace, 20);
4702     SHA_Final(&s, keyspace + 20);
4703 }
4704
4705 /*
4706  * Handle the SSH2 transport layer.
4707  */
4708 static int do_ssh2_transport(Ssh ssh, void *vin, int inlen,
4709                              struct Packet *pktin)
4710 {
4711     unsigned char *in = (unsigned char *)vin;
4712     struct do_ssh2_transport_state {
4713         int nbits, pbits, warn;
4714         Bignum p, g, e, f, K;
4715         int kex_init_value, kex_reply_value;
4716         const struct ssh_mac **maclist;
4717         int nmacs;
4718         const struct ssh2_cipher *cscipher_tobe;
4719         const struct ssh2_cipher *sccipher_tobe;
4720         const struct ssh_mac *csmac_tobe;
4721         const struct ssh_mac *scmac_tobe;
4722         const struct ssh_compress *cscomp_tobe;
4723         const struct ssh_compress *sccomp_tobe;
4724         char *hostkeydata, *sigdata, *keystr, *fingerprint;
4725         int hostkeylen, siglen;
4726         void *hkey;                    /* actual host key */
4727         unsigned char exchange_hash[20];
4728         int n_preferred_kex;
4729         const struct ssh_kex *preferred_kex[KEX_MAX];
4730         int n_preferred_ciphers;
4731         const struct ssh2_ciphers *preferred_ciphers[CIPHER_MAX];
4732         const struct ssh_compress *preferred_comp;
4733         int got_session_id, activated_authconn;
4734         struct Packet *pktout;
4735     };
4736     crState(do_ssh2_transport_state);
4737
4738     crBegin(ssh->do_ssh2_transport_crstate);
4739
4740     s->cscipher_tobe = s->sccipher_tobe = NULL;
4741     s->csmac_tobe = s->scmac_tobe = NULL;
4742     s->cscomp_tobe = s->sccomp_tobe = NULL;
4743
4744     s->got_session_id = s->activated_authconn = FALSE;
4745
4746     /*
4747      * Be prepared to work around the buggy MAC problem.
4748      */
4749     if (ssh->remote_bugs & BUG_SSH2_HMAC)
4750         s->maclist = buggymacs, s->nmacs = lenof(buggymacs);
4751     else
4752         s->maclist = macs, s->nmacs = lenof(macs);
4753
4754   begin_key_exchange:
4755     ssh->pkt_ctx &= ~SSH2_PKTCTX_KEX_MASK;
4756     {
4757         int i, j, commalist_started;
4758
4759         /*
4760          * Set up the preferred key exchange. (NULL => warn below here)
4761          */
4762         s->n_preferred_kex = 0;
4763         for (i = 0; i < KEX_MAX; i++) {
4764             switch (ssh->cfg.ssh_kexlist[i]) {
4765               case KEX_DHGEX:
4766                 s->preferred_kex[s->n_preferred_kex++] =
4767                     &ssh_diffiehellman_gex;
4768                 break;
4769               case KEX_DHGROUP14:
4770                 s->preferred_kex[s->n_preferred_kex++] =
4771                     &ssh_diffiehellman_group14;
4772                 break;
4773               case KEX_DHGROUP1:
4774                 s->preferred_kex[s->n_preferred_kex++] =
4775                     &ssh_diffiehellman_group1;
4776                 break;
4777               case CIPHER_WARN:
4778                 /* Flag for later. Don't bother if it's the last in
4779                  * the list. */
4780                 if (i < KEX_MAX - 1) {
4781                     s->preferred_kex[s->n_preferred_kex++] = NULL;
4782                 }
4783                 break;
4784             }
4785         }
4786
4787         /*
4788          * Set up the preferred ciphers. (NULL => warn below here)
4789          */
4790         s->n_preferred_ciphers = 0;
4791         for (i = 0; i < CIPHER_MAX; i++) {
4792             switch (ssh->cfg.ssh_cipherlist[i]) {
4793               case CIPHER_BLOWFISH:
4794                 s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_blowfish;
4795                 break;
4796               case CIPHER_DES:
4797                 if (ssh->cfg.ssh2_des_cbc) {
4798                     s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_des;
4799                 }
4800                 break;
4801               case CIPHER_3DES:
4802                 s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_3des;
4803                 break;
4804               case CIPHER_AES:
4805                 s->preferred_ciphers[s->n_preferred_ciphers++] = &ssh2_aes;
4806                 break;
4807               case CIPHER_WARN:
4808                 /* Flag for later. Don't bother if it's the last in
4809                  * the list. */
4810                 if (i < CIPHER_MAX - 1) {
4811                     s->preferred_ciphers[s->n_preferred_ciphers++] = NULL;
4812                 }
4813                 break;
4814             }
4815         }
4816
4817         /*
4818          * Set up preferred compression.
4819          */
4820         if (ssh->cfg.compression)
4821             s->preferred_comp = &ssh_zlib;
4822         else
4823             s->preferred_comp = &ssh_comp_none;
4824
4825         /*
4826          * Enable queueing of outgoing auth- or connection-layer
4827          * packets while we are in the middle of a key exchange.
4828          */
4829         ssh->queueing = TRUE;
4830
4831         /*
4832          * Flag that KEX is in progress.
4833          */
4834         ssh->kex_in_progress = TRUE;
4835
4836         /*
4837          * Construct and send our key exchange packet.
4838          */
4839         s->pktout = ssh2_pkt_init(SSH2_MSG_KEXINIT);
4840         for (i = 0; i < 16; i++)
4841             ssh2_pkt_addbyte(s->pktout, (unsigned char) random_byte());
4842         /* List key exchange algorithms. */
4843         ssh2_pkt_addstring_start(s->pktout);
4844         commalist_started = 0;
4845         for (i = 0; i < s->n_preferred_kex; i++) {
4846             const struct ssh_kex *k = s->preferred_kex[i];
4847             if (!k) continue;          /* warning flag */
4848             if (commalist_started)
4849                 ssh2_pkt_addstring_str(s->pktout, ",");
4850             ssh2_pkt_addstring_str(s->pktout, s->preferred_kex[i]->name);
4851             commalist_started = 1;
4852         }
4853         /* List server host key algorithms. */
4854         ssh2_pkt_addstring_start(s->pktout);
4855         for (i = 0; i < lenof(hostkey_algs); i++) {
4856             ssh2_pkt_addstring_str(s->pktout, hostkey_algs[i]->name);
4857             if (i < lenof(hostkey_algs) - 1)
4858                 ssh2_pkt_addstring_str(s->pktout, ",");
4859         }
4860         /* List client->server encryption algorithms. */
4861         ssh2_pkt_addstring_start(s->pktout);
4862         commalist_started = 0;
4863         for (i = 0; i < s->n_preferred_ciphers; i++) {
4864             const struct ssh2_ciphers *c = s->preferred_ciphers[i];
4865             if (!c) continue;          /* warning flag */
4866             for (j = 0; j < c->nciphers; j++) {
4867                 if (commalist_started)
4868                     ssh2_pkt_addstring_str(s->pktout, ",");
4869                 ssh2_pkt_addstring_str(s->pktout, c->list[j]->name);
4870                 commalist_started = 1;
4871             }
4872         }
4873         /* List server->client encryption algorithms. */
4874         ssh2_pkt_addstring_start(s->pktout);
4875         commalist_started = 0;
4876         for (i = 0; i < s->n_preferred_ciphers; i++) {
4877             const struct ssh2_ciphers *c = s->preferred_ciphers[i];
4878             if (!c) continue; /* warning flag */
4879             for (j = 0; j < c->nciphers; j++) {
4880                 if (commalist_started)
4881                     ssh2_pkt_addstring_str(s->pktout, ",");
4882                 ssh2_pkt_addstring_str(s->pktout, c->list[j]->name);
4883                 commalist_started = 1;
4884             }
4885         }
4886         /* List client->server MAC algorithms. */
4887         ssh2_pkt_addstring_start(s->pktout);
4888         for (i = 0; i < s->nmacs; i++) {
4889             ssh2_pkt_addstring_str(s->pktout, s->maclist[i]->name);
4890             if (i < s->nmacs - 1)
4891                 ssh2_pkt_addstring_str(s->pktout, ",");
4892         }
4893         /* List server->client MAC algorithms. */
4894         ssh2_pkt_addstring_start(s->pktout);
4895         for (i = 0; i < s->nmacs; i++) {
4896             ssh2_pkt_addstring_str(s->pktout, s->maclist[i]->name);
4897             if (i < s->nmacs - 1)
4898                 ssh2_pkt_addstring_str(s->pktout, ",");
4899         }
4900         /* List client->server compression algorithms. */
4901         ssh2_pkt_addstring_start(s->pktout);
4902         assert(lenof(compressions) > 1);
4903         ssh2_pkt_addstring_str(s->pktout, s->preferred_comp->name);
4904         for (i = 0; i < lenof(compressions); i++) {
4905             const struct ssh_compress *c = compressions[i];
4906             if (c != s->preferred_comp) {
4907                 ssh2_pkt_addstring_str(s->pktout, ",");
4908                 ssh2_pkt_addstring_str(s->pktout, c->name);
4909             }
4910         }
4911         /* List server->client compression algorithms. */
4912         ssh2_pkt_addstring_start(s->pktout);
4913         assert(lenof(compressions) > 1);
4914         ssh2_pkt_addstring_str(s->pktout, s->preferred_comp->name);
4915         for (i = 0; i < lenof(compressions); i++) {
4916             const struct ssh_compress *c = compressions[i];
4917             if (c != s->preferred_comp) {
4918                 ssh2_pkt_addstring_str(s->pktout, ",");
4919                 ssh2_pkt_addstring_str(s->pktout, c->name);
4920             }
4921         }
4922         /* List client->server languages. Empty list. */
4923         ssh2_pkt_addstring_start(s->pktout);
4924         /* List server->client languages. Empty list. */
4925         ssh2_pkt_addstring_start(s->pktout);
4926         /* First KEX packet does _not_ follow, because we're not that brave. */
4927         ssh2_pkt_addbool(s->pktout, FALSE);
4928         /* Reserved. */
4929         ssh2_pkt_adduint32(s->pktout, 0);
4930     }
4931
4932     ssh->exhash = ssh->exhashbase;
4933     sha_string(&ssh->exhash, s->pktout->data + 5, s->pktout->length - 5);
4934
4935     ssh2_pkt_send_noqueue(ssh, s->pktout);
4936
4937     if (!pktin)
4938         crWaitUntil(pktin);
4939     if (pktin->length > 5)
4940         sha_string(&ssh->exhash, pktin->data + 5, pktin->length - 5);
4941
4942     /*
4943      * Now examine the other side's KEXINIT to see what we're up
4944      * to.
4945      */
4946     {
4947         char *str;
4948         int i, j, len, guessok;
4949
4950         if (pktin->type != SSH2_MSG_KEXINIT) {
4951             bombout(("expected key exchange packet from server"));
4952             crStop(0);
4953         }
4954         ssh->kex = NULL;
4955         ssh->hostkey = NULL;
4956         s->cscipher_tobe = NULL;
4957         s->sccipher_tobe = NULL;
4958         s->csmac_tobe = NULL;
4959         s->scmac_tobe = NULL;
4960         s->cscomp_tobe = NULL;
4961         s->sccomp_tobe = NULL;
4962         pktin->savedpos += 16;          /* skip garbage cookie */
4963         ssh_pkt_getstring(pktin, &str, &len);    /* key exchange algorithms */
4964         s->warn = 0;
4965         for (i = 0; i < s->n_preferred_kex; i++) {
4966             const struct ssh_kex *k = s->preferred_kex[i];
4967             if (!k) {
4968                 s->warn = 1;
4969             } else if (in_commasep_string(k->name, str, len)) {
4970                 ssh->kex = k;
4971             }
4972             if (ssh->kex) {
4973                 if (s->warn) {
4974                     sk_set_frozen(ssh->s, 1);
4975                     askalg(ssh->frontend, "key-exchange algorithm",
4976                            ssh->kex->name);
4977                     sk_set_frozen(ssh->s, 0);
4978                 }
4979                 break;
4980             }
4981         }
4982         if (!ssh->kex) {
4983             bombout(("Couldn't agree a key exchange algorithm (available: %s)",
4984                      str ? str : "(null)"));
4985             crStop(0);
4986         }
4987         /*
4988          * Note that the server's guess is considered wrong if it doesn't match
4989          * the first algorithm in our list, even if it's still the algorithm
4990          * we end up using.
4991          */
4992         guessok =
4993             first_in_commasep_string(s->preferred_kex[0]->name, str, len);
4994         ssh_pkt_getstring(pktin, &str, &len);    /* host key algorithms */
4995         for (i = 0; i < lenof(hostkey_algs); i++) {
4996             if (in_commasep_string(hostkey_algs[i]->name, str, len)) {
4997                 ssh->hostkey = hostkey_algs[i];
4998                 break;
4999             }
5000         }
5001         guessok = guessok &&
5002             first_in_commasep_string(hostkey_algs[0]->name, str, len);
5003         ssh_pkt_getstring(pktin, &str, &len);    /* client->server cipher */
5004         s->warn = 0;
5005         for (i = 0; i < s->n_preferred_ciphers; i++) {
5006             const struct ssh2_ciphers *c = s->preferred_ciphers[i];
5007             if (!c) {
5008                 s->warn = 1;
5009             } else {
5010                 for (j = 0; j < c->nciphers; j++) {
5011                     if (in_commasep_string(c->list[j]->name, str, len)) {
5012                         s->cscipher_tobe = c->list[j];
5013                         break;
5014                     }
5015                 }
5016             }
5017             if (s->cscipher_tobe) {
5018                 if (s->warn) {
5019                     sk_set_frozen(ssh->s, 1);
5020                     askalg(ssh->frontend, "client-to-server cipher",
5021                            s->cscipher_tobe->name);
5022                     sk_set_frozen(ssh->s, 0);
5023                 }
5024                 break;
5025             }
5026         }
5027         if (!s->cscipher_tobe) {
5028             bombout(("Couldn't agree a client-to-server cipher (available: %s)",
5029                      str ? str : "(null)"));
5030             crStop(0);
5031         }
5032
5033         ssh_pkt_getstring(pktin, &str, &len);    /* server->client cipher */
5034         s->warn = 0;
5035         for (i = 0; i < s->n_preferred_ciphers; i++) {
5036             const struct ssh2_ciphers *c = s->preferred_ciphers[i];
5037             if (!c) {
5038                 s->warn = 1;
5039             } else {
5040                 for (j = 0; j < c->nciphers; j++) {
5041                     if (in_commasep_string(c->list[j]->name, str, len)) {
5042                         s->sccipher_tobe = c->list[j];
5043                         break;
5044                     }
5045                 }
5046             }
5047             if (s->sccipher_tobe) {
5048                 if (s->warn) {
5049                     sk_set_frozen(ssh->s, 1);
5050                     askalg(ssh->frontend, "server-to-client cipher",
5051                            s->sccipher_tobe->name);
5052                     sk_set_frozen(ssh->s, 0);
5053                 }
5054                 break;
5055             }
5056         }
5057         if (!s->sccipher_tobe) {
5058             bombout(("Couldn't agree a server-to-client cipher (available: %s)",
5059                      str ? str : "(null)"));
5060             crStop(0);
5061         }
5062
5063         ssh_pkt_getstring(pktin, &str, &len);    /* client->server mac */
5064         for (i = 0; i < s->nmacs; i++) {
5065             if (in_commasep_string(s->maclist[i]->name, str, len)) {
5066                 s->csmac_tobe = s->maclist[i];
5067                 break;
5068             }
5069         }
5070         ssh_pkt_getstring(pktin, &str, &len);    /* server->client mac */
5071         for (i = 0; i < s->nmacs; i++) {
5072             if (in_commasep_string(s->maclist[i]->name, str, len)) {
5073                 s->scmac_tobe = s->maclist[i];
5074                 break;
5075             }
5076         }
5077         ssh_pkt_getstring(pktin, &str, &len);  /* client->server compression */
5078         for (i = 0; i < lenof(compressions) + 1; i++) {
5079             const struct ssh_compress *c =
5080                 i == 0 ? s->preferred_comp : compressions[i - 1];
5081             if (in_commasep_string(c->name, str, len)) {
5082                 s->cscomp_tobe = c;
5083                 break;
5084             }
5085         }
5086         ssh_pkt_getstring(pktin, &str, &len);  /* server->client compression */
5087         for (i = 0; i < lenof(compressions) + 1; i++) {
5088             const struct ssh_compress *c =
5089                 i == 0 ? s->preferred_comp : compressions[i - 1];
5090             if (in_commasep_string(c->name, str, len)) {
5091                 s->sccomp_tobe = c;
5092                 break;
5093             }
5094         }
5095         ssh_pkt_getstring(pktin, &str, &len);  /* client->server language */
5096         ssh_pkt_getstring(pktin, &str, &len);  /* server->client language */
5097         if (ssh2_pkt_getbool(pktin) && !guessok) /* first_kex_packet_follows */
5098             crWaitUntil(pktin);                /* Ignore packet */
5099     }
5100
5101     /*
5102      * Work out the number of bits of key we will need from the key
5103      * exchange. We start with the maximum key length of either
5104      * cipher...
5105      */
5106     {
5107         int csbits, scbits;
5108
5109         csbits = s->cscipher_tobe->keylen;
5110         scbits = s->sccipher_tobe->keylen;
5111         s->nbits = (csbits > scbits ? csbits : scbits);
5112     }
5113     /* The keys only have 160-bit entropy, since they're based on
5114      * a SHA-1 hash. So cap the key size at 160 bits. */
5115     if (s->nbits > 160)
5116         s->nbits = 160;
5117
5118     /*
5119      * If we're doing Diffie-Hellman group exchange, start by
5120      * requesting a group.
5121      */
5122     if (!ssh->kex->pdata) {
5123         logevent("Doing Diffie-Hellman group exchange");
5124         ssh->pkt_ctx |= SSH2_PKTCTX_DHGEX;
5125         /*
5126          * Work out how big a DH group we will need to allow that
5127          * much data.
5128          */
5129         s->pbits = 512 << ((s->nbits - 1) / 64);
5130         s->pktout = ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST);
5131         ssh2_pkt_adduint32(s->pktout, s->pbits);
5132         ssh2_pkt_send_noqueue(ssh, s->pktout);
5133
5134         crWaitUntil(pktin);
5135         if (pktin->type != SSH2_MSG_KEX_DH_GEX_GROUP) {
5136             bombout(("expected key exchange group packet from server"));
5137             crStop(0);
5138         }
5139         s->p = ssh2_pkt_getmp(pktin);
5140         s->g = ssh2_pkt_getmp(pktin);
5141         if (!s->p || !s->g) {
5142             bombout(("unable to read mp-ints from incoming group packet"));
5143             crStop(0);
5144         }
5145         ssh->kex_ctx = dh_setup_gex(s->p, s->g);
5146         s->kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT;
5147         s->kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY;
5148     } else {
5149         ssh->pkt_ctx |= SSH2_PKTCTX_DHGROUP;
5150         ssh->kex_ctx = dh_setup_group(ssh->kex);
5151         s->kex_init_value = SSH2_MSG_KEXDH_INIT;
5152         s->kex_reply_value = SSH2_MSG_KEXDH_REPLY;
5153         logeventf(ssh, "Using Diffie-Hellman with standard group \"%s\"",
5154                   ssh->kex->groupname);
5155     }
5156
5157     logevent("Doing Diffie-Hellman key exchange");
5158     /*
5159      * Now generate and send e for Diffie-Hellman.
5160      */
5161     set_busy_status(ssh->frontend, BUSY_CPU); /* this can take a while */
5162     s->e = dh_create_e(ssh->kex_ctx, s->nbits * 2);
5163     s->pktout = ssh2_pkt_init(s->kex_init_value);
5164     ssh2_pkt_addmp(s->pktout, s->e);
5165     ssh2_pkt_send_noqueue(ssh, s->pktout);
5166
5167     set_busy_status(ssh->frontend, BUSY_WAITING); /* wait for server */
5168     crWaitUntil(pktin);
5169     if (pktin->type != s->kex_reply_value) {
5170         bombout(("expected key exchange reply packet from server"));
5171         crStop(0);
5172     }
5173     set_busy_status(ssh->frontend, BUSY_CPU); /* cogitate */
5174     ssh_pkt_getstring(pktin, &s->hostkeydata, &s->hostkeylen);
5175     s->f = ssh2_pkt_getmp(pktin);
5176     if (!s->f) {
5177         bombout(("unable to parse key exchange reply packet"));
5178         crStop(0);
5179     }
5180     ssh_pkt_getstring(pktin, &s->sigdata, &s->siglen);
5181
5182     s->K = dh_find_K(ssh->kex_ctx, s->f);
5183
5184     /* We assume everything from now on will be quick, and it might
5185      * involve user interaction. */
5186     set_busy_status(ssh->frontend, BUSY_NOT);
5187
5188     sha_string(&ssh->exhash, s->hostkeydata, s->hostkeylen);
5189     if (ssh->kex == &ssh_diffiehellman_gex) {
5190         sha_uint32(&ssh->exhash, s->pbits);
5191         sha_mpint(&ssh->exhash, s->p);
5192         sha_mpint(&ssh->exhash, s->g);
5193     }
5194     sha_mpint(&ssh->exhash, s->e);
5195     sha_mpint(&ssh->exhash, s->f);
5196     sha_mpint(&ssh->exhash, s->K);
5197     SHA_Final(&ssh->exhash, s->exchange_hash);
5198
5199     dh_cleanup(ssh->kex_ctx);
5200     ssh->kex_ctx = NULL;
5201
5202 #if 0
5203     debug(("Exchange hash is:\n"));
5204     dmemdump(s->exchange_hash, 20);
5205 #endif
5206
5207     s->hkey = ssh->hostkey->newkey(s->hostkeydata, s->hostkeylen);
5208     if (!s->hkey ||
5209         !ssh->hostkey->verifysig(s->hkey, s->sigdata, s->siglen,
5210                                  (char *)s->exchange_hash, 20)) {
5211         bombout(("Server's host key did not match the signature supplied"));
5212         crStop(0);
5213     }
5214
5215     /*
5216      * Authenticate remote host: verify host key. (We've already
5217      * checked the signature of the exchange hash.)
5218      */
5219     s->keystr = ssh->hostkey->fmtkey(s->hkey);
5220     s->fingerprint = ssh->hostkey->fingerprint(s->hkey);
5221     sk_set_frozen(ssh->s, 1);
5222     verify_ssh_host_key(ssh->frontend,
5223                         ssh->savedhost, ssh->savedport, ssh->hostkey->keytype,
5224                         s->keystr, s->fingerprint);
5225     sk_set_frozen(ssh->s, 0);
5226     if (!s->got_session_id) {     /* don't bother logging this in rekeys */
5227         logevent("Host key fingerprint is:");
5228         logevent(s->fingerprint);
5229     }
5230     sfree(s->fingerprint);
5231     sfree(s->keystr);
5232     ssh->hostkey->freekey(s->hkey);
5233
5234     /*
5235      * The exchange hash from the very first key exchange is also
5236      * the session id, used in session key construction and
5237      * authentication.
5238      */
5239     if (!s->got_session_id) {
5240         memcpy(ssh->v2_session_id, s->exchange_hash,
5241                sizeof(s->exchange_hash));
5242         s->got_session_id = TRUE;
5243     }
5244
5245     /*
5246      * Send SSH2_MSG_NEWKEYS.
5247      */
5248     s->pktout = ssh2_pkt_init(SSH2_MSG_NEWKEYS);
5249     ssh2_pkt_send_noqueue(ssh, s->pktout);
5250     ssh->outgoing_data_size = 0;       /* start counting from here */
5251
5252     /*
5253      * We've sent client NEWKEYS, so create and initialise
5254      * client-to-server session keys.
5255      */
5256     if (ssh->cs_cipher_ctx)
5257         ssh->cscipher->free_context(ssh->cs_cipher_ctx);
5258     ssh->cscipher = s->cscipher_tobe;
5259     ssh->cs_cipher_ctx = ssh->cscipher->make_context();
5260
5261     if (ssh->cs_mac_ctx)
5262         ssh->csmac->free_context(ssh->cs_mac_ctx);
5263     ssh->csmac = s->csmac_tobe;
5264     ssh->cs_mac_ctx = ssh->csmac->make_context();
5265
5266     if (ssh->cs_comp_ctx)
5267         ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx);
5268     ssh->cscomp = s->cscomp_tobe;
5269     ssh->cs_comp_ctx = ssh->cscomp->compress_init();
5270
5271     /*
5272      * Set IVs on client-to-server keys. Here we use the exchange
5273      * hash from the _first_ key exchange.
5274      */
5275     {
5276         unsigned char keyspace[40];
5277         ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'C',keyspace);
5278         ssh->cscipher->setkey(ssh->cs_cipher_ctx, keyspace);
5279         ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'A',keyspace);
5280         ssh->cscipher->setiv(ssh->cs_cipher_ctx, keyspace);
5281         ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'E',keyspace);
5282         ssh->csmac->setkey(ssh->cs_mac_ctx, keyspace);
5283     }
5284
5285     logeventf(ssh, "Initialised %.200s client->server encryption",
5286               ssh->cscipher->text_name);
5287     logeventf(ssh, "Initialised %.200s client->server MAC algorithm",
5288               ssh->csmac->text_name);
5289     if (ssh->cscomp->text_name)
5290         logeventf(ssh, "Initialised %s compression",
5291                   ssh->cscomp->text_name);
5292
5293     /*
5294      * Now our end of the key exchange is complete, we can send all
5295      * our queued higher-layer packets.
5296      */
5297     ssh->queueing = FALSE;
5298     ssh2_pkt_queuesend(ssh);
5299
5300     /*
5301      * Expect SSH2_MSG_NEWKEYS from server.
5302      */
5303     crWaitUntil(pktin);
5304     if (pktin->type != SSH2_MSG_NEWKEYS) {
5305         bombout(("expected new-keys packet from server"));
5306         crStop(0);
5307     }
5308     ssh->incoming_data_size = 0;       /* start counting from here */
5309
5310     /*
5311      * We've seen server NEWKEYS, so create and initialise
5312      * server-to-client session keys.
5313      */
5314     if (ssh->sc_cipher_ctx)
5315         ssh->sccipher->free_context(ssh->sc_cipher_ctx);
5316     ssh->sccipher = s->sccipher_tobe;
5317     ssh->sc_cipher_ctx = ssh->sccipher->make_context();
5318
5319     if (ssh->sc_mac_ctx)
5320         ssh->scmac->free_context(ssh->sc_mac_ctx);
5321     ssh->scmac = s->scmac_tobe;
5322     ssh->sc_mac_ctx = ssh->scmac->make_context();
5323
5324     if (ssh->sc_comp_ctx)
5325         ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx);
5326     ssh->sccomp = s->sccomp_tobe;
5327     ssh->sc_comp_ctx = ssh->sccomp->decompress_init();
5328
5329     /*
5330      * Set IVs on server-to-client keys. Here we use the exchange
5331      * hash from the _first_ key exchange.
5332      */
5333     {
5334         unsigned char keyspace[40];
5335         ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'D',keyspace);
5336         ssh->sccipher->setkey(ssh->sc_cipher_ctx, keyspace);
5337         ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'B',keyspace);
5338         ssh->sccipher->setiv(ssh->sc_cipher_ctx, keyspace);
5339         ssh2_mkkey(ssh,s->K,s->exchange_hash,ssh->v2_session_id,'F',keyspace);
5340         ssh->scmac->setkey(ssh->sc_mac_ctx, keyspace);
5341     }
5342     logeventf(ssh, "Initialised %.200s server->client encryption",
5343               ssh->sccipher->text_name);
5344     logeventf(ssh, "Initialised %.200s server->client MAC algorithm",
5345               ssh->scmac->text_name);
5346     if (ssh->sccomp->text_name)
5347         logeventf(ssh, "Initialised %s decompression",
5348                   ssh->sccomp->text_name);
5349
5350     /*
5351      * Free key exchange data.
5352      */
5353     freebn(s->f);
5354     freebn(s->K);
5355     if (ssh->kex == &ssh_diffiehellman_gex) {
5356         freebn(s->g);
5357         freebn(s->p);
5358     }
5359
5360     /*
5361      * Key exchange is over. Loop straight back round if we have a
5362      * deferred rekey reason.
5363      */
5364     if (ssh->deferred_rekey_reason) {
5365         logevent(ssh->deferred_rekey_reason);
5366         pktin = NULL;
5367         ssh->deferred_rekey_reason = NULL;
5368         goto begin_key_exchange;
5369     }
5370
5371     /*
5372      * Otherwise, schedule a timer for our next rekey.
5373      */
5374     ssh->kex_in_progress = FALSE;
5375     ssh->last_rekey = GETTICKCOUNT();
5376     if (ssh->cfg.ssh_rekey_time != 0)
5377         ssh->next_rekey = schedule_timer(ssh->cfg.ssh_rekey_time*60*TICKSPERSEC,
5378                                          ssh2_timer, ssh);
5379
5380     /*
5381      * If this is the first key exchange phase, we must pass the
5382      * SSH2_MSG_NEWKEYS packet to the next layer, not because it
5383      * wants to see it but because it will need time to initialise
5384      * itself before it sees an actual packet. In subsequent key
5385      * exchange phases, we don't pass SSH2_MSG_NEWKEYS on, because
5386      * it would only confuse the layer above.
5387      */
5388     if (s->activated_authconn) {
5389         crReturn(1);
5390     }
5391     s->activated_authconn = TRUE;
5392
5393     /*
5394      * Now we're encrypting. Begin returning 1 to the protocol main
5395      * function so that other things can run on top of the
5396      * transport. If we ever see a KEXINIT, we must go back to the
5397      * start.
5398      * 
5399      * We _also_ go back to the start if we see pktin==NULL and
5400      * inlen==-1, because this is a special signal meaning
5401      * `initiate client-driven rekey', and `in' contains a message
5402      * giving the reason for the rekey.
5403      */
5404     while (!((pktin && pktin->type == SSH2_MSG_KEXINIT) ||
5405              (!pktin && inlen == -1))) {
5406         wait_for_rekey:
5407         crReturn(1);
5408     }
5409     if (pktin) {
5410         logevent("Server initiated key re-exchange");
5411     } else {
5412         /*
5413          * Special case: if the server bug is set that doesn't
5414          * allow rekeying, we give a different log message and
5415          * continue waiting. (If such a server _initiates_ a rekey,
5416          * we process it anyway!)
5417          */
5418         if ((ssh->remote_bugs & BUG_SSH2_REKEY)) {
5419             logeventf(ssh, "Server bug prevents key re-exchange (%s)",
5420                       (char *)in);
5421             /* Reset the counters, so that at least this message doesn't
5422              * hit the event log _too_ often. */
5423             ssh->outgoing_data_size = 0;
5424             ssh->incoming_data_size = 0;
5425             if (ssh->cfg.ssh_rekey_time != 0) {
5426                 ssh->next_rekey =
5427                     schedule_timer(ssh->cfg.ssh_rekey_time*60*TICKSPERSEC,
5428                                    ssh2_timer, ssh);
5429             }
5430             goto wait_for_rekey;       /* this is utterly horrid */
5431         } else {
5432             logeventf(ssh, "Initiating key re-exchange (%s)", (char *)in);
5433         }
5434     }
5435     goto begin_key_exchange;
5436
5437     crFinish(1);
5438 }
5439
5440 /*
5441  * Add data to an SSH2 channel output buffer.
5442  */
5443 static void ssh2_add_channel_data(struct ssh_channel *c, char *buf,
5444                                   int len)
5445 {
5446     bufchain_add(&c->v.v2.outbuffer, buf, len);
5447 }
5448
5449 /*
5450  * Attempt to send data on an SSH2 channel.
5451  */
5452 static int ssh2_try_send(struct ssh_channel *c)
5453 {
5454     Ssh ssh = c->ssh;
5455     struct Packet *pktout;
5456
5457     while (c->v.v2.remwindow > 0 && bufchain_size(&c->v.v2.outbuffer) > 0) {
5458         int len;
5459         void *data;
5460         bufchain_prefix(&c->v.v2.outbuffer, &data, &len);
5461         if ((unsigned)len > c->v.v2.remwindow)
5462             len = c->v.v2.remwindow;
5463         if ((unsigned)len > c->v.v2.remmaxpkt)
5464             len = c->v.v2.remmaxpkt;
5465         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA);
5466         ssh2_pkt_adduint32(pktout, c->remoteid);
5467         dont_log_data(ssh, pktout, PKTLOG_OMIT);
5468         ssh2_pkt_addstring_start(pktout);
5469         ssh2_pkt_addstring_data(pktout, data, len);
5470         end_log_omission(ssh, pktout);
5471         ssh2_pkt_send(ssh, pktout);
5472         bufchain_consume(&c->v.v2.outbuffer, len);
5473         c->v.v2.remwindow -= len;
5474     }
5475
5476     /*
5477      * After having sent as much data as we can, return the amount
5478      * still buffered.
5479      */
5480     return bufchain_size(&c->v.v2.outbuffer);
5481 }
5482
5483 /*
5484  * Potentially enlarge the window on an SSH2 channel.
5485  */
5486 static void ssh2_set_window(struct ssh_channel *c, unsigned newwin)
5487 {
5488     Ssh ssh = c->ssh;
5489
5490     /*
5491      * Never send WINDOW_ADJUST for a channel that the remote side
5492      * already thinks it's closed; there's no point, since it won't
5493      * be sending any more data anyway.
5494      */
5495     if (c->closes != 0)
5496         return;
5497
5498     /*
5499      * Only send a WINDOW_ADJUST if there's significantly more window
5500      * available than the other end thinks there is.  This saves us
5501      * sending a WINDOW_ADJUST for every character in a shell session.
5502      *
5503      * "Significant" is arbitrarily defined as half the window size.
5504      */
5505     if (newwin > c->v.v2.locwindow * 2) {
5506         struct Packet *pktout;
5507
5508         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
5509         ssh2_pkt_adduint32(pktout, c->remoteid);
5510         ssh2_pkt_adduint32(pktout, newwin - c->v.v2.locwindow);
5511         ssh2_pkt_send(ssh, pktout);
5512         c->v.v2.locwindow = newwin;
5513     }
5514 }
5515
5516 static void ssh2_msg_channel_window_adjust(Ssh ssh, struct Packet *pktin)
5517 {
5518     unsigned i = ssh_pkt_getuint32(pktin);
5519     struct ssh_channel *c;
5520     c = find234(ssh->channels, &i, ssh_channelfind);
5521     if (c && !c->closes)
5522         c->v.v2.remwindow += ssh_pkt_getuint32(pktin);
5523 }
5524
5525 static void ssh2_msg_channel_data(Ssh ssh, struct Packet *pktin)
5526 {
5527     char *data;
5528     int length;
5529     unsigned i = ssh_pkt_getuint32(pktin);
5530     struct ssh_channel *c;
5531     c = find234(ssh->channels, &i, ssh_channelfind);
5532     if (!c)
5533         return;                        /* nonexistent channel */
5534     if (pktin->type == SSH2_MSG_CHANNEL_EXTENDED_DATA &&
5535         ssh_pkt_getuint32(pktin) != SSH2_EXTENDED_DATA_STDERR)
5536         return;                        /* extended but not stderr */
5537     ssh_pkt_getstring(pktin, &data, &length);
5538     if (data) {
5539         int bufsize = 0;
5540         c->v.v2.locwindow -= length;
5541         switch (c->type) {
5542           case CHAN_MAINSESSION:
5543             bufsize =
5544                 from_backend(ssh->frontend, pktin->type ==
5545                              SSH2_MSG_CHANNEL_EXTENDED_DATA,
5546                              data, length);
5547             break;
5548           case CHAN_X11:
5549             bufsize = x11_send(c->u.x11.s, data, length);
5550             break;
5551           case CHAN_SOCKDATA:
5552             bufsize = pfd_send(c->u.pfd.s, data, length);
5553             break;
5554           case CHAN_AGENT:
5555             while (length > 0) {
5556                 if (c->u.a.lensofar < 4) {
5557                     unsigned int l = min(4 - c->u.a.lensofar, length);
5558                     memcpy(c->u.a.msglen + c->u.a.lensofar,
5559                            data, l);
5560                     data += l;
5561                     length -= l;
5562                     c->u.a.lensofar += l;
5563                 }
5564                 if (c->u.a.lensofar == 4) {
5565                     c->u.a.totallen =
5566                         4 + GET_32BIT(c->u.a.msglen);
5567                     c->u.a.message = snewn(c->u.a.totallen,
5568                                            unsigned char);
5569                     memcpy(c->u.a.message, c->u.a.msglen, 4);
5570                 }
5571                 if (c->u.a.lensofar >= 4 && length > 0) {
5572                     unsigned int l =
5573                         min(c->u.a.totallen - c->u.a.lensofar,
5574                             length);
5575                     memcpy(c->u.a.message + c->u.a.lensofar,
5576                            data, l);
5577                     data += l;
5578                     length -= l;
5579                     c->u.a.lensofar += l;
5580                 }
5581                 if (c->u.a.lensofar == c->u.a.totallen) {
5582                     void *reply;
5583                     int replylen;
5584                     if (agent_query(c->u.a.message,
5585                                     c->u.a.totallen,
5586                                     &reply, &replylen,
5587                                     ssh_agentf_callback, c))
5588                         ssh_agentf_callback(c, reply, replylen);
5589                     sfree(c->u.a.message);
5590                     c->u.a.lensofar = 0;
5591                 }
5592             }
5593             bufsize = 0;
5594             break;
5595         }
5596         /*
5597          * If we are not buffering too much data,
5598          * enlarge the window again at the remote side.
5599          */
5600         if (bufsize < OUR_V2_WINSIZE)
5601             ssh2_set_window(c, OUR_V2_WINSIZE - bufsize);
5602     }
5603 }
5604
5605 static void ssh2_msg_channel_eof(Ssh ssh, struct Packet *pktin)
5606 {
5607     unsigned i = ssh_pkt_getuint32(pktin);
5608     struct ssh_channel *c;
5609
5610     c = find234(ssh->channels, &i, ssh_channelfind);
5611     if (!c)
5612         return;                        /* nonexistent channel */
5613
5614     if (c->type == CHAN_X11) {
5615         /*
5616          * Remote EOF on an X11 channel means we should
5617          * wrap up and close the channel ourselves.
5618          */
5619         x11_close(c->u.x11.s);
5620         sshfwd_close(c);
5621     } else if (c->type == CHAN_AGENT) {
5622         sshfwd_close(c);
5623     } else if (c->type == CHAN_SOCKDATA) {
5624         pfd_close(c->u.pfd.s);
5625         sshfwd_close(c);
5626     }
5627 }
5628
5629 static void ssh2_msg_channel_close(Ssh ssh, struct Packet *pktin)
5630 {
5631     unsigned i = ssh_pkt_getuint32(pktin);
5632     struct ssh_channel *c;
5633     struct Packet *pktout;
5634
5635     c = find234(ssh->channels, &i, ssh_channelfind);
5636     if (!c || c->halfopen) {
5637         bombout(("Received CHANNEL_CLOSE for %s channel %d\n",
5638                  c ? "half-open" : "nonexistent", i));
5639         return;
5640     }
5641     /* Do pre-close processing on the channel. */
5642     switch (c->type) {
5643       case CHAN_MAINSESSION:
5644         ssh->mainchan = NULL;
5645         update_specials_menu(ssh->frontend);
5646         break;
5647       case CHAN_X11:
5648         if (c->u.x11.s != NULL)
5649             x11_close(c->u.x11.s);
5650         sshfwd_close(c);
5651         break;
5652       case CHAN_AGENT:
5653         sshfwd_close(c);
5654         break;
5655       case CHAN_SOCKDATA:
5656         if (c->u.pfd.s != NULL)
5657             pfd_close(c->u.pfd.s);
5658         sshfwd_close(c);
5659         break;
5660     }
5661     if (c->closes == 0) {
5662         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
5663         ssh2_pkt_adduint32(pktout, c->remoteid);
5664         ssh2_pkt_send(ssh, pktout);
5665     }
5666     del234(ssh->channels, c);
5667     bufchain_clear(&c->v.v2.outbuffer);
5668     sfree(c);
5669
5670     /*
5671      * See if that was the last channel left open.
5672      * (This is only our termination condition if we're
5673      * not running in -N mode.)
5674      */
5675     if (!ssh->cfg.ssh_no_shell && count234(ssh->channels) == 0) {
5676         logevent("All channels closed. Disconnecting");
5677 #if 0
5678         /*
5679          * We used to send SSH_MSG_DISCONNECT here,
5680          * because I'd believed that _every_ conforming
5681          * SSH2 connection had to end with a disconnect
5682          * being sent by at least one side; apparently
5683          * I was wrong and it's perfectly OK to
5684          * unceremoniously slam the connection shut
5685          * when you're done, and indeed OpenSSH feels
5686          * this is more polite than sending a
5687          * DISCONNECT. So now we don't.
5688          */
5689         s->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT);
5690         ssh2_pkt_adduint32(s->pktout, SSH2_DISCONNECT_BY_APPLICATION);
5691         ssh2_pkt_addstring(s->pktout, "All open channels closed");
5692         ssh2_pkt_addstring(s->pktout, "en");    /* language tag */
5693         ssh2_pkt_send_noqueue(ssh, s->pktout);
5694 #endif
5695         ssh->close_expected = TRUE;
5696         ssh_closing((Plug)ssh, NULL, 0, 0);
5697     }
5698 }
5699
5700 static void ssh2_msg_channel_open_confirmation(Ssh ssh, struct Packet *pktin)
5701 {
5702     unsigned i = ssh_pkt_getuint32(pktin);
5703     struct ssh_channel *c;
5704     struct Packet *pktout;
5705
5706     c = find234(ssh->channels, &i, ssh_channelfind);
5707     if (!c)
5708         return;                        /* nonexistent channel */
5709     if (c->type != CHAN_SOCKDATA_DORMANT)
5710         return;                        /* dunno why they're confirming this */
5711     c->remoteid = ssh_pkt_getuint32(pktin);
5712     c->halfopen = FALSE;
5713     c->type = CHAN_SOCKDATA;
5714     c->v.v2.remwindow = ssh_pkt_getuint32(pktin);
5715     c->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin);
5716     if (c->u.pfd.s)
5717         pfd_confirm(c->u.pfd.s);
5718     if (c->closes) {
5719         /*
5720          * We have a pending close on this channel,
5721          * which we decided on before the server acked
5722          * the channel open. So now we know the
5723          * remoteid, we can close it again.
5724          */
5725         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
5726         ssh2_pkt_adduint32(pktout, c->remoteid);
5727         ssh2_pkt_send(ssh, pktout);
5728     }
5729 }
5730
5731 static void ssh2_msg_channel_open_failure(Ssh ssh, struct Packet *pktin)
5732 {
5733     static const char *const reasons[] = {
5734         "<unknown reason code>",
5735             "Administratively prohibited",
5736             "Connect failed",
5737             "Unknown channel type",
5738             "Resource shortage",
5739     };
5740     unsigned i = ssh_pkt_getuint32(pktin);
5741     unsigned reason_code;
5742     char *reason_string;
5743     int reason_length;
5744     struct ssh_channel *c;
5745     c = find234(ssh->channels, &i, ssh_channelfind);
5746     if (!c)
5747         return;                        /* nonexistent channel */
5748     if (c->type != CHAN_SOCKDATA_DORMANT)
5749         return;                        /* dunno why they're failing this */
5750
5751     reason_code = ssh_pkt_getuint32(pktin);
5752     if (reason_code >= lenof(reasons))
5753         reason_code = 0; /* ensure reasons[reason_code] in range */
5754     ssh_pkt_getstring(pktin, &reason_string, &reason_length);
5755     logeventf(ssh, "Forwarded connection refused by server: %s [%.*s]",
5756               reasons[reason_code], reason_length, reason_string);
5757
5758     pfd_close(c->u.pfd.s);
5759
5760     del234(ssh->channels, c);
5761     sfree(c);
5762 }
5763
5764 static void ssh2_msg_channel_request(Ssh ssh, struct Packet *pktin)
5765 {
5766     unsigned localid;
5767     char *type;
5768     int typelen, want_reply;
5769     int reply = SSH2_MSG_CHANNEL_FAILURE; /* default */
5770     struct ssh_channel *c;
5771     struct Packet *pktout;
5772
5773     localid = ssh_pkt_getuint32(pktin);
5774     ssh_pkt_getstring(pktin, &type, &typelen);
5775     want_reply = ssh2_pkt_getbool(pktin);
5776
5777     /*
5778      * First, check that the channel exists. Otherwise,
5779      * we can instantly disconnect with a rude message.
5780      */
5781     c = find234(ssh->channels, &localid, ssh_channelfind);
5782     if (!c) {
5783         char buf[80];
5784         sprintf(buf, "Received channel request for nonexistent"
5785                 " channel %d", localid);
5786         logevent(buf);
5787         pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT);
5788         ssh2_pkt_adduint32(pktout, SSH2_DISCONNECT_BY_APPLICATION);
5789         ssh2_pkt_addstring(pktout, buf);
5790         ssh2_pkt_addstring(pktout, "en");       /* language tag */
5791         ssh2_pkt_send_noqueue(ssh, pktout);
5792         connection_fatal(ssh->frontend, "%s", buf);
5793         ssh->close_expected = TRUE;
5794         ssh_closing((Plug)ssh, NULL, 0, 0);
5795         return;
5796     }
5797
5798     /*
5799      * Having got the channel number, we now look at
5800      * the request type string to see if it's something
5801      * we recognise.
5802      */
5803     if (c == ssh->mainchan) {
5804         /*
5805          * We recognise "exit-status" and "exit-signal" on
5806          * the primary channel.
5807          */
5808         if (typelen == 11 &&
5809             !memcmp(type, "exit-status", 11)) {
5810
5811             ssh->exitcode = ssh_pkt_getuint32(pktin);
5812             logeventf(ssh, "Server sent command exit status %d",
5813                       ssh->exitcode);
5814             reply = SSH2_MSG_CHANNEL_SUCCESS;
5815
5816         } else if (typelen == 11 &&
5817                    !memcmp(type, "exit-signal", 11)) {
5818
5819             int is_plausible = TRUE, is_int = FALSE;
5820             char *fmt_sig = "", *fmt_msg = "";
5821             char *msg;
5822             int msglen = 0, core = FALSE;
5823             /* ICK: older versions of OpenSSH (e.g. 3.4p1)
5824              * provide an `int' for the signal, despite its
5825              * having been a `string' in the drafts since at
5826              * least 2001. (Fixed in session.c 1.147.) Try to
5827              * infer which we can safely parse it as. */
5828             {
5829                 unsigned char *p = pktin->body +
5830                     pktin->savedpos;
5831                 long len = pktin->length - pktin->savedpos;
5832                 unsigned long num = GET_32BIT(p); /* what is it? */
5833                 /* If it's 0, it hardly matters; assume string */
5834                 if (num == 0) {
5835                     is_int = FALSE;
5836                 } else {
5837                     int maybe_int = FALSE, maybe_str = FALSE;
5838 #define CHECK_HYPOTHESIS(offset, result) \
5839     do { \
5840         long q = offset; \
5841         if (q >= 0 && q+4 <= len) { \
5842             q = q + 4 + GET_32BIT(p+q); \
5843             if (q >= 0 && q+4 <= len && \
5844                     ((q = q + 4 + GET_32BIT(p+q))!= 0) && q == len) \
5845                 result = TRUE; \
5846         } \
5847     } while(0)
5848                     CHECK_HYPOTHESIS(4+1, maybe_int);
5849                     CHECK_HYPOTHESIS(4+num+1, maybe_str);
5850 #undef CHECK_HYPOTHESIS
5851                     if (maybe_int && !maybe_str)
5852                         is_int = TRUE;
5853                     else if (!maybe_int && maybe_str)
5854                         is_int = FALSE;
5855                     else
5856                         /* Crikey. Either or neither. Panic. */
5857                         is_plausible = FALSE;
5858                 }
5859             }
5860             if (is_plausible) {
5861                 if (is_int) {
5862                     /* Old non-standard OpenSSH. */
5863                     int signum = ssh_pkt_getuint32(pktin);
5864                     fmt_sig = dupprintf(" %d", signum);
5865                 } else {
5866                     /* As per the drafts. */
5867                     char *sig;
5868                     int siglen;
5869                     ssh_pkt_getstring(pktin, &sig, &siglen);
5870                     /* Signal name isn't supposed to be blank, but
5871                      * let's cope gracefully if it is. */
5872                     if (siglen) {
5873                         fmt_sig = dupprintf(" \"%.*s\"",
5874                                             siglen, sig);
5875                     }
5876                 }
5877                 core = ssh2_pkt_getbool(pktin);
5878                 ssh_pkt_getstring(pktin, &msg, &msglen);
5879                 if (msglen) {
5880                     fmt_msg = dupprintf(" (\"%.*s\")", msglen, msg);
5881                 }
5882                 /* ignore lang tag */
5883             } /* else don't attempt to parse */
5884             logeventf(ssh, "Server exited on signal%s%s%s",
5885                       fmt_sig, core ? " (core dumped)" : "",
5886                       fmt_msg);
5887             if (*fmt_sig) sfree(fmt_sig);
5888             if (*fmt_msg) sfree(fmt_msg);
5889             reply = SSH2_MSG_CHANNEL_SUCCESS;
5890
5891         }
5892     } else {
5893         /*
5894          * This is a channel request we don't know
5895          * about, so we now either ignore the request
5896          * or respond with CHANNEL_FAILURE, depending
5897          * on want_reply.
5898          */
5899         reply = SSH2_MSG_CHANNEL_FAILURE;
5900     }
5901     if (want_reply) {
5902         pktout = ssh2_pkt_init(reply);
5903         ssh2_pkt_adduint32(pktout, c->remoteid);
5904         ssh2_pkt_send(ssh, pktout);
5905     }
5906 }
5907
5908 static void ssh2_msg_global_request(Ssh ssh, struct Packet *pktin)
5909 {
5910     char *type;
5911     int typelen, want_reply;
5912     struct Packet *pktout;
5913
5914     ssh_pkt_getstring(pktin, &type, &typelen);
5915     want_reply = ssh2_pkt_getbool(pktin);
5916
5917     /*
5918      * We currently don't support any global requests
5919      * at all, so we either ignore the request or
5920      * respond with REQUEST_FAILURE, depending on
5921      * want_reply.
5922      */
5923     if (want_reply) {
5924         pktout = ssh2_pkt_init(SSH2_MSG_REQUEST_FAILURE);
5925         ssh2_pkt_send(ssh, pktout);
5926     }
5927 }
5928
5929 static void ssh2_msg_channel_open(Ssh ssh, struct Packet *pktin)
5930 {
5931     char *type;
5932     int typelen;
5933     char *peeraddr;
5934     int peeraddrlen;
5935     int peerport;
5936     char *error = NULL;
5937     struct ssh_channel *c;
5938     unsigned remid, winsize, pktsize;
5939     struct Packet *pktout;
5940
5941     ssh_pkt_getstring(pktin, &type, &typelen);
5942     c = snew(struct ssh_channel);
5943     c->ssh = ssh;
5944
5945     remid = ssh_pkt_getuint32(pktin);
5946     winsize = ssh_pkt_getuint32(pktin);
5947     pktsize = ssh_pkt_getuint32(pktin);
5948
5949     if (typelen == 3 && !memcmp(type, "x11", 3)) {
5950         char *addrstr;
5951
5952         ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen);
5953         addrstr = snewn(peeraddrlen+1, char);
5954         memcpy(addrstr, peeraddr, peeraddrlen);
5955         addrstr[peeraddrlen] = '\0';
5956         peerport = ssh_pkt_getuint32(pktin);
5957
5958         logeventf(ssh, "Received X11 connect request from %s:%d",
5959                   addrstr, peerport);
5960
5961         if (!ssh->X11_fwd_enabled)
5962             error = "X11 forwarding is not enabled";
5963         else if (x11_init(&c->u.x11.s, ssh->cfg.x11_display, c,
5964                           ssh->x11auth, addrstr, peerport,
5965                           &ssh->cfg) != NULL) {
5966             error = "Unable to open an X11 connection";
5967         } else {
5968             logevent("Opening X11 forward connection succeeded");
5969             c->type = CHAN_X11;
5970         }
5971
5972         sfree(addrstr);
5973     } else if (typelen == 15 &&
5974                !memcmp(type, "forwarded-tcpip", 15)) {
5975         struct ssh_rportfwd pf, *realpf;
5976         char *dummy;
5977         int dummylen;
5978         ssh_pkt_getstring(pktin, &dummy, &dummylen);/* skip address */
5979         pf.sport = ssh_pkt_getuint32(pktin);
5980         ssh_pkt_getstring(pktin, &peeraddr, &peeraddrlen);
5981         peerport = ssh_pkt_getuint32(pktin);
5982         realpf = find234(ssh->rportfwds, &pf, NULL);
5983         logeventf(ssh, "Received remote port %d open request "
5984                   "from %s:%d", pf.sport, peeraddr, peerport);
5985         if (realpf == NULL) {
5986             error = "Remote port is not recognised";
5987         } else {
5988             const char *e = pfd_newconnect(&c->u.pfd.s,
5989                                            realpf->dhost,
5990                                            realpf->dport, c,
5991                                            &ssh->cfg,
5992                                            realpf->pfrec->addressfamily);
5993             logeventf(ssh, "Attempting to forward remote port to "
5994                       "%s:%d", realpf->dhost, realpf->dport);
5995             if (e != NULL) {
5996                 logeventf(ssh, "Port open failed: %s", e);
5997                 error = "Port open failed";
5998             } else {
5999                 logevent("Forwarded port opened successfully");
6000                 c->type = CHAN_SOCKDATA;
6001             }
6002         }
6003     } else if (typelen == 22 &&
6004                !memcmp(type, "auth-agent@openssh.com", 3)) {
6005         if (!ssh->agentfwd_enabled)
6006             error = "Agent forwarding is not enabled";
6007         else {
6008             c->type = CHAN_AGENT;       /* identify channel type */
6009             c->u.a.lensofar = 0;
6010         }
6011     } else {
6012         error = "Unsupported channel type requested";
6013     }
6014
6015     c->remoteid = remid;
6016     c->halfopen = FALSE;
6017     if (error) {
6018         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE);
6019         ssh2_pkt_adduint32(pktout, c->remoteid);
6020         ssh2_pkt_adduint32(pktout, SSH2_OPEN_CONNECT_FAILED);
6021         ssh2_pkt_addstring(pktout, error);
6022         ssh2_pkt_addstring(pktout, "en");       /* language tag */
6023         ssh2_pkt_send(ssh, pktout);
6024         logeventf(ssh, "Rejected channel open: %s", error);
6025         sfree(c);
6026     } else {
6027         c->localid = alloc_channel_id(ssh);
6028         c->closes = 0;
6029         c->v.v2.locwindow = OUR_V2_WINSIZE;
6030         c->v.v2.remwindow = winsize;
6031         c->v.v2.remmaxpkt = pktsize;
6032         bufchain_init(&c->v.v2.outbuffer);
6033         add234(ssh->channels, c);
6034         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
6035         ssh2_pkt_adduint32(pktout, c->remoteid);
6036         ssh2_pkt_adduint32(pktout, c->localid);
6037         ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);
6038         ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT);      /* our max pkt size */
6039         ssh2_pkt_send(ssh, pktout);
6040     }
6041 }
6042
6043 /*
6044  * Handle the SSH2 userauth and connection layers.
6045  */
6046 static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
6047                              struct Packet *pktin)
6048 {
6049     struct do_ssh2_authconn_state {
6050         enum {
6051             AUTH_INVALID, AUTH_PUBLICKEY_AGENT, AUTH_PUBLICKEY_FILE,
6052                 AUTH_PASSWORD,
6053                 AUTH_KEYBOARD_INTERACTIVE
6054         } method;
6055         enum {
6056             AUTH_TYPE_NONE,
6057                 AUTH_TYPE_PUBLICKEY,
6058                 AUTH_TYPE_PUBLICKEY_OFFER_LOUD,
6059                 AUTH_TYPE_PUBLICKEY_OFFER_QUIET,
6060                 AUTH_TYPE_PASSWORD,
6061                 AUTH_TYPE_KEYBOARD_INTERACTIVE,
6062                 AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET
6063         } type;
6064         int gotit, need_pw, can_pubkey, can_passwd, can_keyb_inter;
6065         int tried_pubkey_config, tried_agent;
6066         int kbd_inter_running, kbd_inter_refused;
6067         int we_are_in;
6068         int num_prompts, curr_prompt, echo;
6069         char username[100];
6070         int got_username;
6071         char pwprompt[512];
6072         char password[100];
6073         void *publickey_blob;
6074         int publickey_bloblen;
6075         unsigned char request[5], *response, *p;
6076         int responselen;
6077         int keyi, nkeys;
6078         int authed;
6079         char *pkblob, *alg, *commentp;
6080         int pklen, alglen, commentlen;
6081         int siglen, retlen, len;
6082         char *q, *agentreq, *ret;
6083         int try_send;
6084         int num_env, env_left, env_ok;
6085         struct Packet *pktout;
6086     };
6087     crState(do_ssh2_authconn_state);
6088
6089     crBegin(ssh->do_ssh2_authconn_crstate);
6090
6091     /*
6092      * Request userauth protocol, and await a response to it.
6093      */
6094     s->pktout = ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST);
6095     ssh2_pkt_addstring(s->pktout, "ssh-userauth");
6096     ssh2_pkt_send(ssh, s->pktout);
6097     crWaitUntilV(pktin);
6098     if (pktin->type != SSH2_MSG_SERVICE_ACCEPT) {
6099         bombout(("Server refused user authentication protocol"));
6100         crStopV;
6101     }
6102
6103     /*
6104      * We repeat this whole loop, including the username prompt,
6105      * until we manage a successful authentication. If the user
6106      * types the wrong _password_, they can be sent back to the
6107      * beginning to try another username, if this is configured on.
6108      * (If they specify a username in the config, they are never
6109      * asked, even if they do give a wrong password.)
6110      * 
6111      * I think this best serves the needs of
6112      * 
6113      *  - the people who have no configuration, no keys, and just
6114      *    want to try repeated (username,password) pairs until they
6115      *    type both correctly
6116      * 
6117      *  - people who have keys and configuration but occasionally
6118      *    need to fall back to passwords
6119      * 
6120      *  - people with a key held in Pageant, who might not have
6121      *    logged in to a particular machine before; so they want to
6122      *    type a username, and then _either_ their key will be
6123      *    accepted, _or_ they will type a password. If they mistype
6124      *    the username they will want to be able to get back and
6125      *    retype it!
6126      */
6127     s->username[0] = '\0';
6128     s->got_username = FALSE;
6129     do {
6130         /*
6131          * Get a username.
6132          */
6133         if (s->got_username && !ssh->cfg.change_username) {
6134             /*
6135              * We got a username last time round this loop, and
6136              * with change_username turned off we don't try to get
6137              * it again.
6138              */
6139         } else if (!*ssh->cfg.username) {
6140             if (ssh_get_line && !ssh_getline_pw_only) {
6141                 if (!ssh_get_line("login as: ",
6142                                   s->username, sizeof(s->username), FALSE)) {
6143                     /*
6144                      * get_line failed to get a username.
6145                      * Terminate.
6146                      */
6147                     logevent("No username provided. Abandoning session.");
6148                     ssh->close_expected = TRUE;
6149                     ssh_closing((Plug)ssh, NULL, 0, 0);
6150                     crStopV;
6151                 }
6152             } else {
6153                 int ret;               /* need not be saved across crReturn */
6154                 c_write_str(ssh, "login as: ");
6155                 ssh->send_ok = 1;
6156                 setup_userpass_input(ssh, s->username, sizeof(s->username), 1);
6157                 do {
6158                     crWaitUntilV(!pktin);
6159                     ret = process_userpass_input(ssh, in, inlen);
6160                 } while (ret == 0);
6161                 if (ret < 0)
6162                     cleanup_exit(0);
6163                 c_write_str(ssh, "\r\n");
6164             }
6165             s->username[strcspn(s->username, "\n\r")] = '\0';
6166         } else {
6167             char *stuff;
6168             strncpy(s->username, ssh->cfg.username, sizeof(s->username));
6169             s->username[sizeof(s->username)-1] = '\0';
6170             if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)) {
6171                 stuff = dupprintf("Using username \"%s\".\r\n", s->username);
6172                 c_write_str(ssh, stuff);
6173                 sfree(stuff);
6174             }
6175         }
6176         s->got_username = TRUE;
6177
6178         /*
6179          * Send an authentication request using method "none": (a)
6180          * just in case it succeeds, and (b) so that we know what
6181          * authentication methods we can usefully try next.
6182          */
6183         ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK;
6184
6185         s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
6186         ssh2_pkt_addstring(s->pktout, s->username);
6187         ssh2_pkt_addstring(s->pktout, "ssh-connection");/* service requested */
6188         ssh2_pkt_addstring(s->pktout, "none");    /* method */
6189         ssh2_pkt_send(ssh, s->pktout);
6190         s->type = AUTH_TYPE_NONE;
6191         s->gotit = FALSE;
6192         s->we_are_in = FALSE;
6193
6194         s->tried_pubkey_config = FALSE;
6195         s->tried_agent = FALSE;
6196         s->kbd_inter_running = FALSE;
6197         s->kbd_inter_refused = FALSE;
6198         /* Load the pub half of ssh->cfg.keyfile so we notice if it's in Pageant */
6199         if (!filename_is_null(ssh->cfg.keyfile)) {
6200             int keytype;
6201             logeventf(ssh, "Reading private key file \"%.150s\"",
6202                       filename_to_str(&ssh->cfg.keyfile));
6203             keytype = key_type(&ssh->cfg.keyfile);
6204             if (keytype == SSH_KEYTYPE_SSH2) {
6205                 s->publickey_blob =
6206                     ssh2_userkey_loadpub(&ssh->cfg.keyfile, NULL,
6207                                          &s->publickey_bloblen, NULL);
6208             } else {
6209                 char *msgbuf;
6210                 logeventf(ssh, "Unable to use this key file (%s)",
6211                           key_type_to_str(keytype));
6212                 msgbuf = dupprintf("Unable to use key file \"%.150s\""
6213                                    " (%s)\r\n",
6214                                    filename_to_str(&ssh->cfg.keyfile),
6215                                    key_type_to_str(keytype));
6216                 c_write_str(ssh, msgbuf);
6217                 sfree(msgbuf);
6218                 s->publickey_blob = NULL;
6219             }
6220         } else
6221             s->publickey_blob = NULL;
6222
6223         while (1) {
6224             /*
6225              * Wait for the result of the last authentication request.
6226              */
6227             if (!s->gotit)
6228                 crWaitUntilV(pktin);
6229             while (pktin->type == SSH2_MSG_USERAUTH_BANNER) {
6230                 char *banner;
6231                 int size;
6232                 /*
6233                  * Don't show the banner if we're operating in
6234                  * non-verbose non-interactive mode. (It's probably
6235                  * a script, which means nobody will read the
6236                  * banner _anyway_, and moreover the printing of
6237                  * the banner will screw up processing on the
6238                  * output of (say) plink.)
6239                  */
6240                 if (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE)) {
6241                     ssh_pkt_getstring(pktin, &banner, &size);
6242                     if (banner)
6243                         c_write_untrusted(ssh, banner, size);
6244                 }
6245                 crWaitUntilV(pktin);
6246             }
6247             if (pktin->type == SSH2_MSG_USERAUTH_SUCCESS) {
6248                 logevent("Access granted");
6249                 s->we_are_in = TRUE;
6250                 break;
6251             }
6252
6253             if (s->kbd_inter_running &&
6254                 pktin->type == SSH2_MSG_USERAUTH_INFO_REQUEST) {
6255                 /*
6256                  * This is either a further set-of-prompts packet
6257                  * in keyboard-interactive authentication, or it's
6258                  * the same one and we came back here with `gotit'
6259                  * set. In the former case, we must reset the
6260                  * curr_prompt variable.
6261                  */
6262                 if (!s->gotit)
6263                     s->curr_prompt = 0;
6264             } else if (pktin->type == SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ) {
6265                 /* FIXME: perhaps we should support this? */
6266                 bombout(("PASSWD_CHANGEREQ not yet supported"));
6267                 crStopV;
6268             } else if (pktin->type != SSH2_MSG_USERAUTH_FAILURE) {
6269                 bombout(("Strange packet received during authentication: type %d",
6270                          pktin->type));
6271                 crStopV;
6272             }
6273
6274             s->gotit = FALSE;
6275
6276             /*
6277              * OK, we're now sitting on a USERAUTH_FAILURE message, so
6278              * we can look at the string in it and know what we can
6279              * helpfully try next.
6280              */
6281             if (pktin->type == SSH2_MSG_USERAUTH_FAILURE) {
6282                 char *methods;
6283                 int methlen;
6284                 ssh_pkt_getstring(pktin, &methods, &methlen);
6285                 s->kbd_inter_running = FALSE;
6286                 if (!ssh2_pkt_getbool(pktin)) {
6287                     /*
6288                      * We have received an unequivocal Access
6289                      * Denied. This can translate to a variety of
6290                      * messages:
6291                      * 
6292                      *  - if we'd just tried "none" authentication,
6293                      *    it's not worth printing anything at all
6294                      * 
6295                      *  - if we'd just tried a public key _offer_,
6296                      *    the message should be "Server refused our
6297                      *    key" (or no message at all if the key
6298                      *    came from Pageant)
6299                      * 
6300                      *  - if we'd just tried anything else, the
6301                      *    message really should be "Access denied".
6302                      * 
6303                      * Additionally, if we'd just tried password
6304                      * authentication, we should break out of this
6305                      * whole loop so as to go back to the username
6306                      * prompt (iff we're configured to allow
6307                      * username change attempts).
6308                      */
6309                     if (s->type == AUTH_TYPE_NONE) {
6310                         /* do nothing */
6311                     } else if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD ||
6312                                s->type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) {
6313                         if (s->type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD)
6314                             c_write_str(ssh, "Server refused our key\r\n");
6315                         logevent("Server refused public key");
6316                     } else if (s->type==AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET) {
6317                         /* server declined keyboard-interactive; ignore */
6318                     } else {
6319                         c_write_str(ssh, "Access denied\r\n");
6320                         logevent("Access denied");
6321                         if (s->type == AUTH_TYPE_PASSWORD &&
6322                             ssh->cfg.change_username) {
6323                             /* XXX perhaps we should allow
6324                              * keyboard-interactive to do this too? */
6325                             s->we_are_in = FALSE;
6326                             break;
6327                         }
6328                     }
6329                 } else {
6330                     c_write_str(ssh, "Further authentication required\r\n");
6331                     logevent("Further authentication required");
6332                 }
6333
6334                 s->can_pubkey =
6335                     in_commasep_string("publickey", methods, methlen);
6336                 s->can_passwd =
6337                     in_commasep_string("password", methods, methlen);
6338                 s->can_keyb_inter = ssh->cfg.try_ki_auth &&
6339                     in_commasep_string("keyboard-interactive", methods, methlen);
6340             }
6341
6342             s->method = 0;
6343             ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK;
6344             s->need_pw = FALSE;
6345
6346             /*
6347              * Most password/passphrase prompts will be
6348              * non-echoing, so we set this to 0 by default.
6349              * Exception is that some keyboard-interactive prompts
6350              * can be echoing, in which case we'll set this to 1.
6351              */
6352             s->echo = 0;
6353
6354             if (!s->method && s->can_pubkey &&
6355                 agent_exists() && !s->tried_agent) {
6356                 /*
6357                  * Attempt public-key authentication using Pageant.
6358                  */
6359                 void *r;
6360                 s->authed = FALSE;
6361
6362                 ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK;
6363                 ssh->pkt_ctx |= SSH2_PKTCTX_PUBLICKEY;
6364
6365                 s->tried_agent = TRUE;
6366
6367                 logevent("Pageant is running. Requesting keys.");
6368
6369                 /* Request the keys held by the agent. */
6370                 PUT_32BIT(s->request, 1);
6371                 s->request[4] = SSH2_AGENTC_REQUEST_IDENTITIES;
6372                 if (!agent_query(s->request, 5, &r, &s->responselen,
6373                                  ssh_agent_callback, ssh)) {
6374                     do {
6375                         crReturnV;
6376                         if (pktin) {
6377                             bombout(("Unexpected data from server while"
6378                                      " waiting for agent response"));
6379                             crStopV;
6380                         }
6381                     } while (pktin || inlen > 0);
6382                     r = ssh->agent_response;
6383                     s->responselen = ssh->agent_response_len;
6384                 }
6385                 s->response = (unsigned char *) r;
6386                 if (s->response && s->responselen >= 5 &&
6387                     s->response[4] == SSH2_AGENT_IDENTITIES_ANSWER) {
6388                     s->p = s->response + 5;
6389                     s->nkeys = GET_32BIT(s->p);
6390                     s->p += 4;
6391                     logeventf(ssh, "Pageant has %d SSH2 keys", s->nkeys);
6392                     for (s->keyi = 0; s->keyi < s->nkeys; s->keyi++) {
6393                         void *vret;
6394
6395                         logeventf(ssh, "Trying Pageant key #%d", s->keyi);
6396                         s->pklen = GET_32BIT(s->p);
6397                         s->p += 4;
6398                         if (s->publickey_blob &&
6399                             s->pklen == s->publickey_bloblen &&
6400                             !memcmp(s->p, s->publickey_blob,
6401                                     s->publickey_bloblen)) {
6402                             logevent("This key matches configured key file");
6403                             s->tried_pubkey_config = 1;
6404                         }
6405                         s->pkblob = (char *)s->p;
6406                         s->p += s->pklen;
6407                         s->alglen = GET_32BIT(s->pkblob);
6408                         s->alg = s->pkblob + 4;
6409                         s->commentlen = GET_32BIT(s->p);
6410                         s->p += 4;
6411                         s->commentp = (char *)s->p;
6412                         s->p += s->commentlen;
6413                         s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
6414                         ssh2_pkt_addstring(s->pktout, s->username);
6415                         ssh2_pkt_addstring(s->pktout, "ssh-connection");        /* service requested */
6416                         ssh2_pkt_addstring(s->pktout, "publickey");     /* method */
6417                         ssh2_pkt_addbool(s->pktout, FALSE);     /* no signature included */
6418                         ssh2_pkt_addstring_start(s->pktout);
6419                         ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen);
6420                         ssh2_pkt_addstring_start(s->pktout);
6421                         ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen);
6422                         ssh2_pkt_send(ssh, s->pktout);
6423
6424                         crWaitUntilV(pktin);
6425                         if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) {
6426                             logevent("Key refused");
6427                             continue;
6428                         }
6429
6430                         if (flags & FLAG_VERBOSE) {
6431                             c_write_str(ssh, "Authenticating with "
6432                                         "public key \"");
6433                             c_write(ssh, s->commentp, s->commentlen);
6434                             c_write_str(ssh, "\" from agent\r\n");
6435                         }
6436
6437                         /*
6438                          * Server is willing to accept the key.
6439                          * Construct a SIGN_REQUEST.
6440                          */
6441                         s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
6442                         ssh2_pkt_addstring(s->pktout, s->username);
6443                         ssh2_pkt_addstring(s->pktout, "ssh-connection");        /* service requested */
6444                         ssh2_pkt_addstring(s->pktout, "publickey");     /* method */
6445                         ssh2_pkt_addbool(s->pktout, TRUE);
6446                         ssh2_pkt_addstring_start(s->pktout);
6447                         ssh2_pkt_addstring_data(s->pktout, s->alg, s->alglen);
6448                         ssh2_pkt_addstring_start(s->pktout);
6449                         ssh2_pkt_addstring_data(s->pktout, s->pkblob, s->pklen);
6450
6451                         s->siglen = s->pktout->length - 5 + 4 + 20;
6452                         if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)
6453                             s->siglen -= 4;
6454                         s->len = 1;       /* message type */
6455                         s->len += 4 + s->pklen; /* key blob */
6456                         s->len += 4 + s->siglen;        /* data to sign */
6457                         s->len += 4;      /* flags */
6458                         s->agentreq = snewn(4 + s->len, char);
6459                         PUT_32BIT(s->agentreq, s->len);
6460                         s->q = s->agentreq + 4;
6461                         *s->q++ = SSH2_AGENTC_SIGN_REQUEST;
6462                         PUT_32BIT(s->q, s->pklen);
6463                         s->q += 4;
6464                         memcpy(s->q, s->pkblob, s->pklen);
6465                         s->q += s->pklen;
6466                         PUT_32BIT(s->q, s->siglen);
6467                         s->q += 4;
6468                         /* Now the data to be signed... */
6469                         if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) {
6470                             PUT_32BIT(s->q, 20);
6471                             s->q += 4;
6472                         }
6473                         memcpy(s->q, ssh->v2_session_id, 20);
6474                         s->q += 20;
6475                         memcpy(s->q, s->pktout->data + 5,
6476                                s->pktout->length - 5);
6477                         s->q += s->pktout->length - 5;
6478                         /* And finally the (zero) flags word. */
6479                         PUT_32BIT(s->q, 0);
6480                         if (!agent_query(s->agentreq, s->len + 4,
6481                                          &vret, &s->retlen,
6482                                          ssh_agent_callback, ssh)) {
6483                             do {
6484                                 crReturnV;
6485                                 if (pktin) {
6486                                     bombout(("Unexpected data from server"
6487                                              " while waiting for agent"
6488                                              " response"));
6489                                     crStopV;
6490                                 }
6491                             } while (pktin || inlen > 0);
6492                             vret = ssh->agent_response;
6493                             s->retlen = ssh->agent_response_len;
6494                         }
6495                         s->ret = vret;
6496                         sfree(s->agentreq);
6497                         if (s->ret) {
6498                             if (s->ret[4] == SSH2_AGENT_SIGN_RESPONSE) {
6499                                 logevent("Sending Pageant's response");
6500                                 ssh2_add_sigblob(ssh, s->pktout,
6501                                                  s->pkblob, s->pklen,
6502                                                  s->ret + 9,
6503                                                  GET_32BIT(s->ret + 5));
6504                                 ssh2_pkt_send(ssh, s->pktout);
6505                                 s->authed = TRUE;
6506                                 break;
6507                             } else {
6508                                 logevent
6509                                     ("Pageant failed to answer challenge");
6510                                 sfree(s->ret);
6511                             }
6512                         }
6513                     }
6514                     if (s->authed)
6515                         continue;
6516                 }
6517                 sfree(s->response);
6518             }
6519
6520             if (!s->method && s->can_pubkey && s->publickey_blob
6521                 && !s->tried_pubkey_config) {
6522                 unsigned char *pub_blob;
6523                 char *algorithm, *comment;
6524                 int pub_blob_len;
6525
6526                 s->tried_pubkey_config = TRUE;
6527
6528                 ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK;
6529                 ssh->pkt_ctx |= SSH2_PKTCTX_PUBLICKEY;
6530
6531                 /*
6532                  * Try the public key supplied in the configuration.
6533                  *
6534                  * First, offer the public blob to see if the server is
6535                  * willing to accept it.
6536                  */
6537                 pub_blob =
6538                     (unsigned char *)ssh2_userkey_loadpub(&ssh->cfg.keyfile,
6539                                                           &algorithm,
6540                                                           &pub_blob_len,
6541                                                           NULL);
6542                 if (pub_blob) {
6543                     s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
6544                     ssh2_pkt_addstring(s->pktout, s->username);
6545                     ssh2_pkt_addstring(s->pktout, "ssh-connection");    /* service requested */
6546                     ssh2_pkt_addstring(s->pktout, "publickey"); /* method */
6547                     ssh2_pkt_addbool(s->pktout, FALSE); /* no signature included */
6548                     ssh2_pkt_addstring(s->pktout, algorithm);
6549                     ssh2_pkt_addstring_start(s->pktout);
6550                     ssh2_pkt_addstring_data(s->pktout, (char *)pub_blob,
6551                                             pub_blob_len);
6552                     ssh2_pkt_send(ssh, s->pktout);
6553                     logevent("Offered public key");
6554
6555                     crWaitUntilV(pktin);
6556                     if (pktin->type != SSH2_MSG_USERAUTH_PK_OK) {
6557                         s->gotit = TRUE;
6558                         s->type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD;
6559                         continue;      /* key refused; give up on it */
6560                     }
6561
6562                     logevent("Offer of public key accepted");
6563                     /*
6564                      * Actually attempt a serious authentication using
6565                      * the key.
6566                      */
6567                     if (ssh2_userkey_encrypted(&ssh->cfg.keyfile, &comment)) {
6568                         sprintf(s->pwprompt,
6569                                 "Passphrase for key \"%.100s\": ",
6570                                 comment);
6571                         s->need_pw = TRUE;
6572                     } else {
6573                         s->need_pw = FALSE;
6574                     }
6575                     if (flags & FLAG_VERBOSE) {
6576                         c_write_str(ssh, "Authenticating with public key \"");
6577                         c_write_str(ssh, comment);
6578                         c_write_str(ssh, "\"\r\n");
6579                     }
6580                     s->method = AUTH_PUBLICKEY_FILE;
6581                 }
6582             }
6583
6584             if (!s->method && s->can_keyb_inter && !s->kbd_inter_refused &&
6585                 !s->kbd_inter_running) {
6586                 s->method = AUTH_KEYBOARD_INTERACTIVE;
6587                 s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE;
6588
6589                 ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK;
6590                 ssh->pkt_ctx |= SSH2_PKTCTX_KBDINTER;
6591
6592                 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
6593                 ssh2_pkt_addstring(s->pktout, s->username);
6594                 ssh2_pkt_addstring(s->pktout, "ssh-connection");        /* service requested */
6595                 ssh2_pkt_addstring(s->pktout, "keyboard-interactive");  /* method */
6596                 ssh2_pkt_addstring(s->pktout, ""); /* lang */
6597                 ssh2_pkt_addstring(s->pktout, "");
6598                 ssh2_pkt_send(ssh, s->pktout);
6599
6600                 crWaitUntilV(pktin);
6601                 if (pktin->type != SSH2_MSG_USERAUTH_INFO_REQUEST) {
6602                     if (pktin->type == SSH2_MSG_USERAUTH_FAILURE)
6603                         s->gotit = TRUE;
6604                     logevent("Keyboard-interactive authentication refused");
6605                     s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE_QUIET;
6606                     s->kbd_inter_refused = TRUE; /* don't try it again */
6607                     continue;
6608                 }
6609
6610                 s->kbd_inter_running = TRUE;
6611                 s->curr_prompt = 0;
6612             }
6613
6614             if (s->kbd_inter_running) {
6615                 s->method = AUTH_KEYBOARD_INTERACTIVE;
6616                 s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE;
6617
6618                 ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK;
6619                 ssh->pkt_ctx |= SSH2_PKTCTX_KBDINTER;
6620
6621                 if (s->curr_prompt == 0) {
6622                     /*
6623                      * We've got a fresh USERAUTH_INFO_REQUEST.
6624                      * Display header data, and start going through
6625                      * the prompts.
6626                      */
6627                     char *name, *inst, *lang;
6628                     int name_len, inst_len, lang_len;
6629
6630                     ssh_pkt_getstring(pktin, &name, &name_len);
6631                     ssh_pkt_getstring(pktin, &inst, &inst_len);
6632                     ssh_pkt_getstring(pktin, &lang, &lang_len);
6633                     if (name_len > 0) {
6634                         c_write_untrusted(ssh, name, name_len);
6635                         c_write_str(ssh, "\r\n");
6636                     }
6637                     if (inst_len > 0) {
6638                         c_write_untrusted(ssh, inst, inst_len);
6639                         c_write_str(ssh, "\r\n");
6640                     }
6641                     s->num_prompts = ssh_pkt_getuint32(pktin);
6642                 }
6643
6644                 /*
6645                  * If there are prompts remaining in the packet,
6646                  * display one and get a response.
6647                  */
6648                 if (s->curr_prompt < s->num_prompts) {
6649                     char *prompt;
6650                     int prompt_len;
6651
6652                     ssh_pkt_getstring(pktin, &prompt, &prompt_len);
6653                     if (prompt_len > 0) {
6654                         static const char trunc[] = "<prompt truncated>: ";
6655                         static const int prlen = sizeof(s->pwprompt) -
6656                                                  lenof(trunc);
6657                         if (prompt_len > prlen) {
6658                             memcpy(s->pwprompt, prompt, prlen);
6659                             strcpy(s->pwprompt + prlen, trunc);
6660                         } else {
6661                             memcpy(s->pwprompt, prompt, prompt_len);
6662                             s->pwprompt[prompt_len] = '\0';
6663                         }
6664                     } else {
6665                         strcpy(s->pwprompt,
6666                                "<server failed to send prompt>: ");
6667                     }
6668                     s->echo = ssh2_pkt_getbool(pktin);
6669                     s->need_pw = TRUE;
6670                 } else
6671                     s->need_pw = FALSE;
6672             }
6673
6674             if (!s->method && s->can_passwd) {
6675                 s->method = AUTH_PASSWORD;
6676                 ssh->pkt_ctx &= ~SSH2_PKTCTX_AUTH_MASK;
6677                 ssh->pkt_ctx |= SSH2_PKTCTX_PASSWORD;
6678                 sprintf(s->pwprompt, "%.90s@%.90s's password: ", s->username,
6679                         ssh->savedhost);
6680                 s->need_pw = TRUE;
6681             }
6682
6683             if (s->need_pw) {
6684                 if (ssh_get_line) {
6685                     if (!ssh_get_line(s->pwprompt, s->password,
6686                                       sizeof(s->password), TRUE)) {
6687                         /*
6688                          * get_line failed to get a password (for
6689                          * example because one was supplied on the
6690                          * command line which has already failed to
6691                          * work). Terminate.
6692                          */
6693                         s->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT);
6694                         ssh2_pkt_adduint32(s->pktout,SSH2_DISCONNECT_BY_APPLICATION);
6695                         ssh2_pkt_addstring(s->pktout, "No more passwords available"
6696                                            " to try");
6697                         ssh2_pkt_addstring(s->pktout, "en");    /* language tag */
6698                         ssh2_pkt_send_noqueue(ssh, s->pktout);
6699                         logevent("Unable to authenticate");
6700                         connection_fatal(ssh->frontend,
6701                                          "Unable to authenticate");
6702                         ssh->close_expected = TRUE;
6703                         ssh_closing((Plug)ssh, NULL, 0, 0);
6704                         crStopV;
6705                     }
6706                 } else {
6707                     int ret;           /* need not be saved across crReturn */
6708                     c_write_untrusted(ssh, s->pwprompt, strlen(s->pwprompt));
6709                     ssh->send_ok = 1;
6710
6711                     setup_userpass_input(ssh, s->password,
6712                                          sizeof(s->password), s->echo);
6713                     do {
6714                         crWaitUntilV(!pktin);
6715                         ret = process_userpass_input(ssh, in, inlen);
6716                     } while (ret == 0);
6717                     if (ret < 0)
6718                         cleanup_exit(0);
6719                     c_write_str(ssh, "\r\n");
6720                 }
6721             }
6722
6723             if (s->method == AUTH_PUBLICKEY_FILE) {
6724                 /*
6725                  * We have our passphrase. Now try the actual authentication.
6726                  */
6727                 struct ssh2_userkey *key;
6728                 const char *error = NULL;
6729
6730                 key = ssh2_load_userkey(&ssh->cfg.keyfile, s->password,
6731                                         &error);
6732                 if (key == SSH2_WRONG_PASSPHRASE || key == NULL) {
6733                     if (key == SSH2_WRONG_PASSPHRASE) {
6734                         c_write_str(ssh, "Wrong passphrase\r\n");
6735                         s->tried_pubkey_config = FALSE;
6736                     } else {
6737                         c_write_str(ssh, "Unable to load private key (");
6738                         c_write_str(ssh, error);
6739                         c_write_str(ssh, ")\r\n");
6740                         s->tried_pubkey_config = TRUE;
6741                     }
6742                     /* Send a spurious AUTH_NONE to return to the top. */
6743                     s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
6744                     ssh2_pkt_addstring(s->pktout, s->username);
6745                     ssh2_pkt_addstring(s->pktout, "ssh-connection");    /* service requested */
6746                     ssh2_pkt_addstring(s->pktout, "none");      /* method */
6747                     ssh2_pkt_send(ssh, s->pktout);
6748                     s->type = AUTH_TYPE_NONE;
6749                 } else {
6750                     unsigned char *pkblob, *sigblob, *sigdata;
6751                     int pkblob_len, sigblob_len, sigdata_len;
6752                     int p;
6753
6754                     /*
6755                      * We have loaded the private key and the server
6756                      * has announced that it's willing to accept it.
6757                      * Hallelujah. Generate a signature and send it.
6758                      */
6759                     s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
6760                     ssh2_pkt_addstring(s->pktout, s->username);
6761                     ssh2_pkt_addstring(s->pktout, "ssh-connection");    /* service requested */
6762                     ssh2_pkt_addstring(s->pktout, "publickey"); /* method */
6763                     ssh2_pkt_addbool(s->pktout, TRUE);
6764                     ssh2_pkt_addstring(s->pktout, key->alg->name);
6765                     pkblob = key->alg->public_blob(key->data, &pkblob_len);
6766                     ssh2_pkt_addstring_start(s->pktout);
6767                     ssh2_pkt_addstring_data(s->pktout, (char *)pkblob, pkblob_len);
6768
6769                     /*
6770                      * The data to be signed is:
6771                      *
6772                      *   string  session-id
6773                      *
6774                      * followed by everything so far placed in the
6775                      * outgoing packet.
6776                      */
6777                     sigdata_len = s->pktout->length - 5 + 4 + 20;
6778                     if (ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)
6779                         sigdata_len -= 4;
6780                     sigdata = snewn(sigdata_len, unsigned char);
6781                     p = 0;
6782                     if (!(ssh->remote_bugs & BUG_SSH2_PK_SESSIONID)) {
6783                         PUT_32BIT(sigdata+p, 20);
6784                         p += 4;
6785                     }
6786                     memcpy(sigdata+p, ssh->v2_session_id, 20); p += 20;
6787                     memcpy(sigdata+p, s->pktout->data + 5,
6788                            s->pktout->length - 5);
6789                     p += s->pktout->length - 5;
6790                     assert(p == sigdata_len);
6791                     sigblob = key->alg->sign(key->data, (char *)sigdata,
6792                                              sigdata_len, &sigblob_len);
6793                     ssh2_add_sigblob(ssh, s->pktout, pkblob, pkblob_len,
6794                                      sigblob, sigblob_len);
6795                     sfree(pkblob);
6796                     sfree(sigblob);
6797                     sfree(sigdata);
6798
6799                     ssh2_pkt_send(ssh, s->pktout);
6800                     s->type = AUTH_TYPE_PUBLICKEY;
6801                     key->alg->freekey(key->data);
6802                 }
6803             } else if (s->method == AUTH_PASSWORD) {
6804                 /*
6805                  * We pad out the password packet to 256 bytes to make
6806                  * it harder for an attacker to find the length of the
6807                  * user's password.
6808                  *
6809                  * Anyone using a password longer than 256 bytes
6810                  * probably doesn't have much to worry about from
6811                  * people who find out how long their password is!
6812                  */
6813                 s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
6814                 s->pktout->forcepad = 256;
6815                 ssh2_pkt_addstring(s->pktout, s->username);
6816                 ssh2_pkt_addstring(s->pktout, "ssh-connection");        /* service requested */
6817                 ssh2_pkt_addstring(s->pktout, "password");
6818                 ssh2_pkt_addbool(s->pktout, FALSE);
6819                 dont_log_password(ssh, s->pktout, PKTLOG_BLANK);
6820                 ssh2_pkt_addstring(s->pktout, s->password);
6821                 memset(s->password, 0, sizeof(s->password));
6822                 end_log_omission(ssh, s->pktout);
6823                 ssh2_pkt_send(ssh, s->pktout);
6824                 logevent("Sent password");
6825                 s->type = AUTH_TYPE_PASSWORD;
6826             } else if (s->method == AUTH_KEYBOARD_INTERACTIVE) {
6827                 if (s->curr_prompt == 0) {
6828                     s->pktout = ssh2_pkt_init(SSH2_MSG_USERAUTH_INFO_RESPONSE);
6829                     s->pktout->forcepad = 256;
6830                     ssh2_pkt_adduint32(s->pktout, s->num_prompts);
6831                 }
6832                 if (s->need_pw) {      /* only add pw if we just got one! */
6833                     dont_log_password(ssh, s->pktout, PKTLOG_BLANK);
6834                     ssh2_pkt_addstring(s->pktout, s->password);
6835                     memset(s->password, 0, sizeof(s->password));
6836                     end_log_omission(ssh, s->pktout);
6837                     s->curr_prompt++;
6838                 }
6839                 if (s->curr_prompt >= s->num_prompts) {
6840                     ssh2_pkt_send(ssh, s->pktout);
6841                 } else {
6842                     /*
6843                      * If there are prompts remaining, we set
6844                      * `gotit' so that we won't attempt to get
6845                      * another packet. Then we go back round the
6846                      * loop and will end up retrieving another
6847                      * prompt out of the existing packet. Funky or
6848                      * what?
6849                      */
6850                     s->gotit = TRUE;
6851                 }
6852                 s->type = AUTH_TYPE_KEYBOARD_INTERACTIVE;
6853             } else {
6854                 c_write_str(ssh, "No supported authentication methods"
6855                             " left to try!\r\n");
6856                 logevent("No supported authentications offered."
6857                          " Disconnecting");
6858                 s->pktout = ssh2_pkt_init(SSH2_MSG_DISCONNECT);
6859                 ssh2_pkt_adduint32(s->pktout, SSH2_DISCONNECT_BY_APPLICATION);
6860                 ssh2_pkt_addstring(s->pktout, "No supported authentication"
6861                                    " methods available");
6862                 ssh2_pkt_addstring(s->pktout, "en");    /* language tag */
6863                 ssh2_pkt_send_noqueue(ssh, s->pktout);
6864                 ssh->close_expected = TRUE;
6865                 ssh_closing((Plug)ssh, NULL, 0, 0);
6866                 crStopV;
6867             }
6868         }
6869     } while (!s->we_are_in);
6870
6871     /*
6872      * Now we're authenticated for the connection protocol. The
6873      * connection protocol will automatically have started at this
6874      * point; there's no need to send SERVICE_REQUEST.
6875      */
6876
6877     ssh->channels = newtree234(ssh_channelcmp);
6878
6879     /*
6880      * Set up handlers for some connection protocol messages, so we
6881      * don't have to handle them repeatedly in this coroutine.
6882      */
6883     ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] =
6884         ssh2_msg_channel_window_adjust;
6885     ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] =
6886         ssh2_msg_global_request;
6887
6888     /*
6889      * Create the main session channel.
6890      */
6891     if (!ssh->cfg.ssh_no_shell) {
6892         ssh->mainchan = snew(struct ssh_channel);
6893         ssh->mainchan->ssh = ssh;
6894         ssh->mainchan->localid = alloc_channel_id(ssh);
6895         s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
6896         ssh2_pkt_addstring(s->pktout, "session");
6897         ssh2_pkt_adduint32(s->pktout, ssh->mainchan->localid);
6898         ssh->mainchan->v.v2.locwindow = OUR_V2_WINSIZE;
6899         ssh2_pkt_adduint32(s->pktout, ssh->mainchan->v.v2.locwindow);/* our window size */
6900         ssh2_pkt_adduint32(s->pktout, OUR_V2_MAXPKT);    /* our max pkt size */
6901         ssh2_pkt_send(ssh, s->pktout);
6902         crWaitUntilV(pktin);
6903         if (pktin->type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) {
6904             bombout(("Server refused to open a session"));
6905             crStopV;
6906             /* FIXME: error data comes back in FAILURE packet */
6907         }
6908         if (ssh_pkt_getuint32(pktin) != ssh->mainchan->localid) {
6909             bombout(("Server's channel confirmation cited wrong channel"));
6910             crStopV;
6911         }
6912         ssh->mainchan->remoteid = ssh_pkt_getuint32(pktin);
6913         ssh->mainchan->halfopen = FALSE;
6914         ssh->mainchan->type = CHAN_MAINSESSION;
6915         ssh->mainchan->closes = 0;
6916         ssh->mainchan->v.v2.remwindow = ssh_pkt_getuint32(pktin);
6917         ssh->mainchan->v.v2.remmaxpkt = ssh_pkt_getuint32(pktin);
6918         bufchain_init(&ssh->mainchan->v.v2.outbuffer);
6919         add234(ssh->channels, ssh->mainchan);
6920         update_specials_menu(ssh->frontend);
6921         logevent("Opened channel for session");
6922     } else
6923         ssh->mainchan = NULL;
6924
6925     /*
6926      * Now we have a channel, make dispatch table entries for
6927      * general channel-based messages.
6928      */
6929     ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] =
6930     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] =
6931         ssh2_msg_channel_data;
6932     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = ssh2_msg_channel_eof;
6933     ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = ssh2_msg_channel_close;
6934     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] =
6935         ssh2_msg_channel_open_confirmation;
6936     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] =
6937         ssh2_msg_channel_open_failure;
6938     ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] =
6939         ssh2_msg_channel_request;
6940     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] =
6941         ssh2_msg_channel_open;
6942
6943     /*
6944      * Potentially enable X11 forwarding.
6945      */
6946     if (ssh->mainchan && ssh->cfg.x11_forward) {
6947         char proto[20], data[64];
6948         logevent("Requesting X11 forwarding");
6949         ssh->x11auth = x11_invent_auth(proto, sizeof(proto),
6950                                        data, sizeof(data), ssh->cfg.x11_auth);
6951         x11_get_real_auth(ssh->x11auth, ssh->cfg.x11_display);
6952         s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
6953         ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid);
6954         ssh2_pkt_addstring(s->pktout, "x11-req");
6955         ssh2_pkt_addbool(s->pktout, 1);        /* want reply */
6956         ssh2_pkt_addbool(s->pktout, 0);        /* many connections */
6957         ssh2_pkt_addstring(s->pktout, proto);
6958         ssh2_pkt_addstring(s->pktout, data);
6959         ssh2_pkt_adduint32(s->pktout, x11_get_screen_number(ssh->cfg.x11_display));
6960         ssh2_pkt_send(ssh, s->pktout);
6961
6962         crWaitUntilV(pktin);
6963
6964         if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) {
6965             if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) {
6966                 bombout(("Unexpected response to X11 forwarding request:"
6967                          " packet type %d", pktin->type));
6968                 crStopV;
6969             }
6970             logevent("X11 forwarding refused");
6971         } else {
6972             logevent("X11 forwarding enabled");
6973             ssh->X11_fwd_enabled = TRUE;
6974         }
6975     }
6976
6977     /*
6978      * Enable port forwardings.
6979      */
6980     ssh_setup_portfwd(ssh, &ssh->cfg);
6981
6982     /*
6983      * Potentially enable agent forwarding.
6984      */
6985     if (ssh->mainchan && ssh->cfg.agentfwd && agent_exists()) {
6986         logevent("Requesting OpenSSH-style agent forwarding");
6987         s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
6988         ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid);
6989         ssh2_pkt_addstring(s->pktout, "auth-agent-req@openssh.com");
6990         ssh2_pkt_addbool(s->pktout, 1);        /* want reply */
6991         ssh2_pkt_send(ssh, s->pktout);
6992
6993         crWaitUntilV(pktin);
6994
6995         if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) {
6996             if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) {
6997                 bombout(("Unexpected response to agent forwarding request:"
6998                          " packet type %d", pktin->type));
6999                 crStopV;
7000             }
7001             logevent("Agent forwarding refused");
7002         } else {
7003             logevent("Agent forwarding enabled");
7004             ssh->agentfwd_enabled = TRUE;
7005         }
7006     }
7007
7008     /*
7009      * Now allocate a pty for the session.
7010      */
7011     if (ssh->mainchan && !ssh->cfg.nopty) {
7012         /* Unpick the terminal-speed string. */
7013         /* XXX perhaps we should allow no speeds to be sent. */
7014         ssh->ospeed = 38400; ssh->ispeed = 38400; /* last-resort defaults */
7015         sscanf(ssh->cfg.termspeed, "%d,%d", &ssh->ospeed, &ssh->ispeed);
7016         /* Build the pty request. */
7017         s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
7018         ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); /* recipient channel */
7019         ssh2_pkt_addstring(s->pktout, "pty-req");
7020         ssh2_pkt_addbool(s->pktout, 1);        /* want reply */
7021         ssh2_pkt_addstring(s->pktout, ssh->cfg.termtype);
7022         ssh2_pkt_adduint32(s->pktout, ssh->term_width);
7023         ssh2_pkt_adduint32(s->pktout, ssh->term_height);
7024         ssh2_pkt_adduint32(s->pktout, 0);              /* pixel width */
7025         ssh2_pkt_adduint32(s->pktout, 0);              /* pixel height */
7026         ssh2_pkt_addstring_start(s->pktout);
7027         ssh2_pkt_addbyte(s->pktout, 128);              /* TTY_OP_ISPEED */
7028         ssh2_pkt_adduint32(s->pktout, ssh->ispeed);
7029         ssh2_pkt_addbyte(s->pktout, 129);              /* TTY_OP_OSPEED */
7030         ssh2_pkt_adduint32(s->pktout, ssh->ospeed);
7031         ssh2_pkt_addstring_data(s->pktout, "\0", 1); /* TTY_OP_END */
7032         ssh2_pkt_send(ssh, s->pktout);
7033         ssh->state = SSH_STATE_INTERMED;
7034
7035         crWaitUntilV(pktin);
7036
7037         if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) {
7038             if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) {
7039                 bombout(("Unexpected response to pty request:"
7040                          " packet type %d", pktin->type));
7041                 crStopV;
7042             }
7043             c_write_str(ssh, "Server refused to allocate pty\r\n");
7044             ssh->editing = ssh->echoing = 1;
7045         } else {
7046             logeventf(ssh, "Allocated pty (ospeed %dbps, ispeed %dbps)",
7047                       ssh->ospeed, ssh->ispeed);
7048         }
7049     } else {
7050         ssh->editing = ssh->echoing = 1;
7051     }
7052
7053     /*
7054      * Send environment variables.
7055      * 
7056      * Simplest thing here is to send all the requests at once, and
7057      * then wait for a whole bunch of successes or failures.
7058      */
7059     if (ssh->mainchan && *ssh->cfg.environmt) {
7060         char *e = ssh->cfg.environmt;
7061         char *var, *varend, *val;
7062
7063         s->num_env = 0;
7064
7065         while (*e) {
7066             var = e;
7067             while (*e && *e != '\t') e++;
7068             varend = e;
7069             if (*e == '\t') e++;
7070             val = e;
7071             while (*e) e++;
7072             e++;
7073
7074             s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
7075             ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid);
7076             ssh2_pkt_addstring(s->pktout, "env");
7077             ssh2_pkt_addbool(s->pktout, 1);            /* want reply */
7078             ssh2_pkt_addstring_start(s->pktout);
7079             ssh2_pkt_addstring_data(s->pktout, var, varend-var);
7080             ssh2_pkt_addstring(s->pktout, val);
7081             ssh2_pkt_send(ssh, s->pktout);
7082
7083             s->num_env++;
7084         }
7085
7086         logeventf(ssh, "Sent %d environment variables", s->num_env);
7087
7088         s->env_ok = 0;
7089         s->env_left = s->num_env;
7090
7091         while (s->env_left > 0) {
7092             crWaitUntilV(pktin);
7093
7094             if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) {
7095                 if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) {
7096                     bombout(("Unexpected response to environment request:"
7097                              " packet type %d", pktin->type));
7098                     crStopV;
7099                 }
7100             } else {
7101                 s->env_ok++;
7102             }
7103
7104             s->env_left--;
7105         }
7106
7107         if (s->env_ok == s->num_env) {
7108             logevent("All environment variables successfully set");
7109         } else if (s->env_ok == 0) {
7110             logevent("All environment variables refused");
7111             c_write_str(ssh, "Server refused to set environment variables\r\n");
7112         } else {
7113             logeventf(ssh, "%d environment variables refused",
7114                       s->num_env - s->env_ok);
7115             c_write_str(ssh, "Server refused to set all environment variables\r\n");
7116         }
7117     }
7118
7119     /*
7120      * Start a shell or a remote command. We may have to attempt
7121      * this twice if the config data has provided a second choice
7122      * of command.
7123      */
7124     if (ssh->mainchan) while (1) {
7125         int subsys;
7126         char *cmd;
7127
7128         if (ssh->fallback_cmd) {
7129             subsys = ssh->cfg.ssh_subsys2;
7130             cmd = ssh->cfg.remote_cmd_ptr2;
7131         } else {
7132             subsys = ssh->cfg.ssh_subsys;
7133             cmd = ssh->cfg.remote_cmd_ptr;
7134         }
7135
7136         s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
7137         ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid); /* recipient channel */
7138         if (subsys) {
7139             ssh2_pkt_addstring(s->pktout, "subsystem");
7140             ssh2_pkt_addbool(s->pktout, 1);            /* want reply */
7141             ssh2_pkt_addstring(s->pktout, cmd);
7142         } else if (*cmd) {
7143             ssh2_pkt_addstring(s->pktout, "exec");
7144             ssh2_pkt_addbool(s->pktout, 1);            /* want reply */
7145             ssh2_pkt_addstring(s->pktout, cmd);
7146         } else {
7147             ssh2_pkt_addstring(s->pktout, "shell");
7148             ssh2_pkt_addbool(s->pktout, 1);            /* want reply */
7149         }
7150         ssh2_pkt_send(ssh, s->pktout);
7151
7152         crWaitUntilV(pktin);
7153
7154         if (pktin->type != SSH2_MSG_CHANNEL_SUCCESS) {
7155             if (pktin->type != SSH2_MSG_CHANNEL_FAILURE) {
7156                 bombout(("Unexpected response to shell/command request:"
7157                          " packet type %d", pktin->type));
7158                 crStopV;
7159             }
7160             /*
7161              * We failed to start the command. If this is the
7162              * fallback command, we really are finished; if it's
7163              * not, and if the fallback command exists, try falling
7164              * back to it before complaining.
7165              */
7166             if (!ssh->fallback_cmd && ssh->cfg.remote_cmd_ptr2 != NULL) {
7167                 logevent("Primary command failed; attempting fallback");
7168                 ssh->fallback_cmd = TRUE;
7169                 continue;
7170             }
7171             bombout(("Server refused to start a shell/command"));
7172             crStopV;
7173         } else {
7174             logevent("Started a shell/command");
7175         }
7176         break;
7177     }
7178
7179     ssh->state = SSH_STATE_SESSION;
7180     if (ssh->size_needed)
7181         ssh_size(ssh, ssh->term_width, ssh->term_height);
7182     if (ssh->eof_needed)
7183         ssh_special(ssh, TS_EOF);
7184
7185     /*
7186      * Transfer data!
7187      */
7188     if (ssh->ldisc)
7189         ldisc_send(ssh->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */
7190     if (ssh->mainchan)
7191         ssh->send_ok = 1;
7192     while (1) {
7193         crReturnV;
7194         s->try_send = FALSE;
7195         if (pktin) {
7196
7197             /*
7198              * _All_ the connection-layer packets we expect to
7199              * receive are now handled by the dispatch table.
7200              * Anything that reaches here must be bogus.
7201              */
7202
7203             bombout(("Strange packet received: type %d", pktin->type));
7204             crStopV;
7205         } else if (ssh->mainchan) {
7206             /*
7207              * We have spare data. Add it to the channel buffer.
7208              */
7209             ssh2_add_channel_data(ssh->mainchan, (char *)in, inlen);
7210             s->try_send = TRUE;
7211         }
7212         if (s->try_send) {
7213             int i;
7214             struct ssh_channel *c;
7215             /*
7216              * Try to send data on all channels if we can.
7217              */
7218             for (i = 0; NULL != (c = index234(ssh->channels, i)); i++) {
7219                 int bufsize;
7220                 if (c->closes)
7221                     continue;          /* don't send on closing channels */
7222                 bufsize = ssh2_try_send(c);
7223                 if (bufsize == 0) {
7224                     switch (c->type) {
7225                       case CHAN_MAINSESSION:
7226                         /* stdin need not receive an unthrottle
7227                          * notification since it will be polled */
7228                         break;
7229                       case CHAN_X11:
7230                         x11_unthrottle(c->u.x11.s);
7231                         break;
7232                       case CHAN_AGENT:
7233                         /* agent sockets are request/response and need no
7234                          * buffer management */
7235                         break;
7236                       case CHAN_SOCKDATA:
7237                         pfd_unthrottle(c->u.pfd.s);
7238                         break;
7239                     }
7240                 }
7241             }
7242         }
7243     }
7244
7245     crFinishV;
7246 }
7247
7248 /*
7249  * Handlers for SSH2 messages that might arrive at any moment.
7250  */
7251 static void ssh2_msg_disconnect(Ssh ssh, struct Packet *pktin)
7252 {
7253     /* log reason code in disconnect message */
7254     char *buf, *msg;
7255     int nowlen, reason, msglen;
7256
7257     reason = ssh_pkt_getuint32(pktin);
7258     ssh_pkt_getstring(pktin, &msg, &msglen);
7259
7260     if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) {
7261         buf = dupprintf("Received disconnect message (%s)",
7262                         ssh2_disconnect_reasons[reason]);
7263     } else {
7264         buf = dupprintf("Received disconnect message (unknown"
7265                         " type %d)", reason);
7266     }
7267     logevent(buf);
7268     sfree(buf);
7269     buf = dupprintf("Disconnection message text: %n%.*s",
7270                     &nowlen, msglen, msg);
7271     logevent(buf);
7272     bombout(("Server sent disconnect message\ntype %d (%s):\n\"%s\"",
7273              reason,
7274              (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) ?
7275              ssh2_disconnect_reasons[reason] : "unknown",
7276              buf+nowlen));
7277     sfree(buf);
7278 }
7279
7280 static void ssh2_msg_debug(Ssh ssh, struct Packet *pktin)
7281 {
7282     /* log the debug message */
7283     char *msg;
7284     int msglen;
7285     int always_display;
7286
7287     /* XXX maybe we should actually take notice of this */
7288     always_display = ssh2_pkt_getbool(pktin);
7289     ssh_pkt_getstring(pktin, &msg, &msglen);
7290
7291     logeventf(ssh, "Remote debug message: %.*s", msglen, msg);
7292 }
7293
7294 static void ssh2_msg_something_unimplemented(Ssh ssh, struct Packet *pktin)
7295 {
7296     struct Packet *pktout;
7297     pktout = ssh2_pkt_init(SSH2_MSG_UNIMPLEMENTED);
7298     ssh2_pkt_adduint32(pktout, pktin->sequence);
7299     /*
7300      * UNIMPLEMENTED messages MUST appear in the same order as the
7301      * messages they respond to. Hence, never queue them.
7302      */
7303     ssh2_pkt_send_noqueue(ssh, pktout);
7304 }
7305
7306 /*
7307  * Handle the top-level SSH2 protocol.
7308  */
7309 static void ssh2_protocol_setup(Ssh ssh)
7310 {
7311     int i;
7312
7313     /*
7314      * Most messages cause SSH2_MSG_UNIMPLEMENTED.
7315      */
7316     for (i = 0; i < 256; i++)
7317         ssh->packet_dispatch[i] = ssh2_msg_something_unimplemented;
7318
7319     /*
7320      * Any message we actually understand, we set to NULL so that
7321      * the coroutines will get it.
7322      */
7323     ssh->packet_dispatch[SSH2_MSG_UNIMPLEMENTED] = NULL;
7324     ssh->packet_dispatch[SSH2_MSG_SERVICE_REQUEST] = NULL;
7325     ssh->packet_dispatch[SSH2_MSG_SERVICE_ACCEPT] = NULL;
7326     ssh->packet_dispatch[SSH2_MSG_KEXINIT] = NULL;
7327     ssh->packet_dispatch[SSH2_MSG_NEWKEYS] = NULL;
7328     ssh->packet_dispatch[SSH2_MSG_KEXDH_INIT] = NULL;
7329     ssh->packet_dispatch[SSH2_MSG_KEXDH_REPLY] = NULL;
7330     /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REQUEST] = NULL; duplicate case value */
7331     /* ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_GROUP] = NULL; duplicate case value */
7332     ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_INIT] = NULL;
7333     ssh->packet_dispatch[SSH2_MSG_KEX_DH_GEX_REPLY] = NULL;
7334     ssh->packet_dispatch[SSH2_MSG_USERAUTH_REQUEST] = NULL;
7335     ssh->packet_dispatch[SSH2_MSG_USERAUTH_FAILURE] = NULL;
7336     ssh->packet_dispatch[SSH2_MSG_USERAUTH_SUCCESS] = NULL;
7337     ssh->packet_dispatch[SSH2_MSG_USERAUTH_BANNER] = NULL;
7338     ssh->packet_dispatch[SSH2_MSG_USERAUTH_PK_OK] = NULL;
7339     /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ] = NULL; duplicate case value */
7340     /* ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_REQUEST] = NULL; duplicate case value */
7341     ssh->packet_dispatch[SSH2_MSG_USERAUTH_INFO_RESPONSE] = NULL;
7342     ssh->packet_dispatch[SSH2_MSG_GLOBAL_REQUEST] = NULL;
7343     ssh->packet_dispatch[SSH2_MSG_REQUEST_SUCCESS] = NULL;
7344     ssh->packet_dispatch[SSH2_MSG_REQUEST_FAILURE] = NULL;
7345     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN] = NULL;
7346     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_CONFIRMATION] = NULL;
7347     ssh->packet_dispatch[SSH2_MSG_CHANNEL_OPEN_FAILURE] = NULL;
7348     ssh->packet_dispatch[SSH2_MSG_CHANNEL_WINDOW_ADJUST] = NULL;
7349     ssh->packet_dispatch[SSH2_MSG_CHANNEL_DATA] = NULL;
7350     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EXTENDED_DATA] = NULL;
7351     ssh->packet_dispatch[SSH2_MSG_CHANNEL_EOF] = NULL;
7352     ssh->packet_dispatch[SSH2_MSG_CHANNEL_CLOSE] = NULL;
7353     ssh->packet_dispatch[SSH2_MSG_CHANNEL_REQUEST] = NULL;
7354     ssh->packet_dispatch[SSH2_MSG_CHANNEL_SUCCESS] = NULL;
7355     ssh->packet_dispatch[SSH2_MSG_CHANNEL_FAILURE] = NULL;
7356
7357     /*
7358      * These special message types we install handlers for.
7359      */
7360     ssh->packet_dispatch[SSH2_MSG_DISCONNECT] = ssh2_msg_disconnect;
7361     ssh->packet_dispatch[SSH2_MSG_IGNORE] = ssh_msg_ignore; /* shared with ssh1 */
7362     ssh->packet_dispatch[SSH2_MSG_DEBUG] = ssh2_msg_debug;
7363 }
7364
7365 static void ssh2_timer(void *ctx, long now)
7366 {
7367     Ssh ssh = (Ssh)ctx;
7368
7369     if (!ssh->kex_in_progress && ssh->cfg.ssh_rekey_time != 0 &&
7370         now - ssh->next_rekey >= 0) {
7371         do_ssh2_transport(ssh, "timeout", -1, NULL);
7372     }
7373 }
7374
7375 static void ssh2_protocol(Ssh ssh, void *vin, int inlen,
7376                           struct Packet *pktin)
7377 {
7378     unsigned char *in = (unsigned char *)vin;
7379     if (ssh->state == SSH_STATE_CLOSED)
7380         return;
7381
7382     if (pktin) {
7383         ssh->incoming_data_size += pktin->encrypted_len;
7384         if (!ssh->kex_in_progress &&
7385             ssh->max_data_size != 0 &&
7386             ssh->incoming_data_size > ssh->max_data_size)
7387             do_ssh2_transport(ssh, "too much data received", -1, NULL);
7388     }
7389
7390     if (pktin && ssh->packet_dispatch[pktin->type]) {
7391         ssh->packet_dispatch[pktin->type](ssh, pktin);
7392         return;
7393     }
7394
7395     if (!ssh->protocol_initial_phase_done ||
7396         (pktin && pktin->type >= 20 && pktin->type < 50)) {
7397         if (do_ssh2_transport(ssh, in, inlen, pktin) &&
7398             !ssh->protocol_initial_phase_done) {
7399             ssh->protocol_initial_phase_done = TRUE;
7400             /*
7401              * Allow authconn to initialise itself.
7402              */
7403             do_ssh2_authconn(ssh, NULL, 0, NULL);
7404         }
7405     } else {
7406         do_ssh2_authconn(ssh, in, inlen, pktin);
7407     }
7408 }
7409
7410 /*
7411  * Called to set up the connection.
7412  *
7413  * Returns an error message, or NULL on success.
7414  */
7415 static const char *ssh_init(void *frontend_handle, void **backend_handle,
7416                             Config *cfg,
7417                             char *host, int port, char **realhost, int nodelay,
7418                             int keepalive)
7419 {
7420     const char *p;
7421     Ssh ssh;
7422
7423     ssh = snew(struct ssh_tag);
7424     ssh->cfg = *cfg;                   /* STRUCTURE COPY */
7425     ssh->version = 0;                  /* when not ready yet */
7426     ssh->s = NULL;
7427     ssh->cipher = NULL;
7428     ssh->v1_cipher_ctx = NULL;
7429     ssh->crcda_ctx = NULL;
7430     ssh->cscipher = NULL;
7431     ssh->cs_cipher_ctx = NULL;
7432     ssh->sccipher = NULL;
7433     ssh->sc_cipher_ctx = NULL;
7434     ssh->csmac = NULL;
7435     ssh->cs_mac_ctx = NULL;
7436     ssh->scmac = NULL;
7437     ssh->sc_mac_ctx = NULL;
7438     ssh->cscomp = NULL;
7439     ssh->cs_comp_ctx = NULL;
7440     ssh->sccomp = NULL;
7441     ssh->sc_comp_ctx = NULL;
7442     ssh->kex = NULL;
7443     ssh->kex_ctx = NULL;
7444     ssh->hostkey = NULL;
7445     ssh->exitcode = -1;
7446     ssh->close_expected = FALSE;
7447     ssh->state = SSH_STATE_PREPACKET;
7448     ssh->size_needed = FALSE;
7449     ssh->eof_needed = FALSE;
7450     ssh->ldisc = NULL;
7451     ssh->logctx = NULL;
7452     ssh->deferred_send_data = NULL;
7453     ssh->deferred_len = 0;
7454     ssh->deferred_size = 0;
7455     ssh->fallback_cmd = 0;
7456     ssh->pkt_ctx = 0;
7457     ssh->x11auth = NULL;
7458     ssh->v1_compressing = FALSE;
7459     ssh->v2_outgoing_sequence = 0;
7460     ssh->ssh1_rdpkt_crstate = 0;
7461     ssh->ssh2_rdpkt_crstate = 0;
7462     ssh->do_ssh_init_crstate = 0;
7463     ssh->ssh_gotdata_crstate = 0;
7464     ssh->do_ssh1_connection_crstate = 0;
7465     ssh->do_ssh1_login_crstate = 0;
7466     ssh->do_ssh2_transport_crstate = 0;
7467     ssh->do_ssh2_authconn_crstate = 0;
7468     ssh->do_ssh_init_state = NULL;
7469     ssh->do_ssh1_login_state = NULL;
7470     ssh->do_ssh2_transport_state = NULL;
7471     ssh->do_ssh2_authconn_state = NULL;
7472     ssh->mainchan = NULL;
7473     ssh->throttled_all = 0;
7474     ssh->v1_stdout_throttling = 0;
7475     ssh->queue = NULL;
7476     ssh->queuelen = ssh->queuesize = 0;
7477     ssh->queueing = FALSE;
7478     ssh->qhead = ssh->qtail = NULL;
7479     ssh->deferred_rekey_reason = NULL;
7480
7481     *backend_handle = ssh;
7482
7483 #ifdef MSCRYPTOAPI
7484     if (crypto_startup() == 0)
7485         return "Microsoft high encryption pack not installed!";
7486 #endif
7487
7488     ssh->frontend = frontend_handle;
7489     ssh->term_width = ssh->cfg.width;
7490     ssh->term_height = ssh->cfg.height;
7491
7492     ssh->channels = NULL;
7493     ssh->rportfwds = NULL;
7494     ssh->portfwds = NULL;
7495
7496     ssh->send_ok = 0;
7497     ssh->editing = 0;
7498     ssh->echoing = 0;
7499     ssh->v1_throttle_count = 0;
7500     ssh->overall_bufsize = 0;
7501     ssh->fallback_cmd = 0;
7502
7503     ssh->protocol = NULL;
7504
7505     ssh->protocol_initial_phase_done = FALSE;
7506
7507     ssh->pinger = NULL;
7508
7509     ssh->incoming_data_size = ssh->outgoing_data_size =
7510         ssh->deferred_data_size = 0L;
7511     ssh->max_data_size = parse_blocksize(ssh->cfg.ssh_rekey_data);
7512     ssh->kex_in_progress = FALSE;
7513
7514     p = connect_to_host(ssh, host, port, realhost, nodelay, keepalive);
7515     if (p != NULL)
7516         return p;
7517
7518     random_ref();
7519
7520     return NULL;
7521 }
7522
7523 static void ssh_free(void *handle)
7524 {
7525     Ssh ssh = (Ssh) handle;
7526     struct ssh_channel *c;
7527     struct ssh_rportfwd *pf;
7528
7529     if (ssh->v1_cipher_ctx)
7530         ssh->cipher->free_context(ssh->v1_cipher_ctx);
7531     if (ssh->cs_cipher_ctx)
7532         ssh->cscipher->free_context(ssh->cs_cipher_ctx);
7533     if (ssh->sc_cipher_ctx)
7534         ssh->sccipher->free_context(ssh->sc_cipher_ctx);
7535     if (ssh->cs_mac_ctx)
7536         ssh->csmac->free_context(ssh->cs_mac_ctx);
7537     if (ssh->sc_mac_ctx)
7538         ssh->scmac->free_context(ssh->sc_mac_ctx);
7539     if (ssh->cs_comp_ctx) {
7540         if (ssh->cscomp)
7541             ssh->cscomp->compress_cleanup(ssh->cs_comp_ctx);
7542         else
7543             zlib_compress_cleanup(ssh->cs_comp_ctx);
7544     }
7545     if (ssh->sc_comp_ctx) {
7546         if (ssh->sccomp)
7547             ssh->sccomp->decompress_cleanup(ssh->sc_comp_ctx);
7548         else
7549             zlib_decompress_cleanup(ssh->sc_comp_ctx);
7550     }
7551     if (ssh->kex_ctx)
7552         dh_cleanup(ssh->kex_ctx);
7553     sfree(ssh->savedhost);
7554
7555     while (ssh->queuelen-- > 0)
7556         ssh_free_packet(ssh->queue[ssh->queuelen]);
7557     sfree(ssh->queue);
7558
7559     while (ssh->qhead) {
7560         struct queued_handler *qh = ssh->qhead;
7561         ssh->qhead = qh->next;
7562         sfree(ssh->qhead);
7563     }
7564     ssh->qhead = ssh->qtail = NULL;
7565
7566     if (ssh->channels) {
7567         while ((c = delpos234(ssh->channels, 0)) != NULL) {
7568             switch (c->type) {
7569               case CHAN_X11:
7570                 if (c->u.x11.s != NULL)
7571                     x11_close(c->u.x11.s);
7572                 break;
7573               case CHAN_SOCKDATA:
7574                 if (c->u.pfd.s != NULL)
7575                     pfd_close(c->u.pfd.s);
7576                 break;
7577             }
7578             sfree(c);
7579         }
7580         freetree234(ssh->channels);
7581         ssh->channels = NULL;
7582     }
7583
7584     if (ssh->rportfwds) {
7585         while ((pf = delpos234(ssh->rportfwds, 0)) != NULL)
7586             sfree(pf);
7587         freetree234(ssh->rportfwds);
7588         ssh->rportfwds = NULL;
7589     }
7590     sfree(ssh->deferred_send_data);
7591     if (ssh->x11auth)
7592         x11_free_auth(ssh->x11auth);
7593     sfree(ssh->do_ssh_init_state);
7594     sfree(ssh->do_ssh1_login_state);
7595     sfree(ssh->do_ssh2_transport_state);
7596     sfree(ssh->do_ssh2_authconn_state);
7597     if (ssh->crcda_ctx) {
7598         crcda_free_context(ssh->crcda_ctx);
7599         ssh->crcda_ctx = NULL;
7600     }
7601     if (ssh->s)
7602         ssh_do_close(ssh, TRUE);
7603     expire_timer_context(ssh);
7604     if (ssh->pinger)
7605         pinger_free(ssh->pinger);
7606     sfree(ssh);
7607
7608     random_unref();
7609 }
7610
7611 /*
7612  * Reconfigure the SSH backend.
7613  */
7614 static void ssh_reconfig(void *handle, Config *cfg)
7615 {
7616     Ssh ssh = (Ssh) handle;
7617     char *rekeying = NULL, rekey_mandatory = FALSE;
7618     unsigned long old_max_data_size;
7619
7620     pinger_reconfig(ssh->pinger, &ssh->cfg, cfg);
7621     ssh_setup_portfwd(ssh, cfg);
7622
7623     if (ssh->cfg.ssh_rekey_time != cfg->ssh_rekey_time &&
7624         cfg->ssh_rekey_time != 0) {
7625         long new_next = ssh->last_rekey + cfg->ssh_rekey_time*60*TICKSPERSEC;
7626         long now = GETTICKCOUNT();
7627
7628         if (new_next - now < 0) {
7629             rekeying = "timeout shortened";
7630         } else {
7631             ssh->next_rekey = schedule_timer(new_next - now, ssh2_timer, ssh);
7632         }
7633     }
7634
7635     old_max_data_size = ssh->max_data_size;
7636     ssh->max_data_size = parse_blocksize(cfg->ssh_rekey_data);
7637     if (old_max_data_size != ssh->max_data_size &&
7638         ssh->max_data_size != 0) {
7639         if (ssh->outgoing_data_size > ssh->max_data_size ||
7640             ssh->incoming_data_size > ssh->max_data_size)
7641             rekeying = "data limit lowered";
7642     }
7643
7644     if (ssh->cfg.compression != cfg->compression) {
7645         rekeying = "compression setting changed";
7646         rekey_mandatory = TRUE;
7647     }
7648
7649     if (ssh->cfg.ssh2_des_cbc != cfg->ssh2_des_cbc ||
7650         memcmp(ssh->cfg.ssh_cipherlist, cfg->ssh_cipherlist,
7651                sizeof(ssh->cfg.ssh_cipherlist))) {
7652         rekeying = "cipher settings changed";
7653         rekey_mandatory = TRUE;
7654     }
7655
7656     ssh->cfg = *cfg;                   /* STRUCTURE COPY */
7657
7658     if (rekeying) {
7659         if (!ssh->kex_in_progress) {
7660             do_ssh2_transport(ssh, rekeying, -1, NULL);
7661         } else if (rekey_mandatory) {
7662             ssh->deferred_rekey_reason = rekeying;
7663         }
7664     }
7665 }
7666
7667 /*
7668  * Called to send data down the Telnet connection.
7669  */
7670 static int ssh_send(void *handle, char *buf, int len)
7671 {
7672     Ssh ssh = (Ssh) handle;
7673
7674     if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL)
7675         return 0;
7676
7677     ssh->protocol(ssh, (unsigned char *)buf, len, 0);
7678
7679     return ssh_sendbuffer(ssh);
7680 }
7681
7682 /*
7683  * Called to query the current amount of buffered stdin data.
7684  */
7685 static int ssh_sendbuffer(void *handle)
7686 {
7687     Ssh ssh = (Ssh) handle;
7688     int override_value;
7689
7690     if (ssh == NULL || ssh->s == NULL || ssh->protocol == NULL)
7691         return 0;
7692
7693     /*
7694      * If the SSH socket itself has backed up, add the total backup
7695      * size on that to any individual buffer on the stdin channel.
7696      */
7697     override_value = 0;
7698     if (ssh->throttled_all)
7699         override_value = ssh->overall_bufsize;
7700
7701     if (ssh->version == 1) {
7702         return override_value;
7703     } else if (ssh->version == 2) {
7704         if (!ssh->mainchan || ssh->mainchan->closes > 0)
7705             return override_value;
7706         else
7707             return (override_value +
7708                     bufchain_size(&ssh->mainchan->v.v2.outbuffer));
7709     }
7710
7711     return 0;
7712 }
7713
7714 /*
7715  * Called to set the size of the window from SSH's POV.
7716  */
7717 static void ssh_size(void *handle, int width, int height)
7718 {
7719     Ssh ssh = (Ssh) handle;
7720     struct Packet *pktout;
7721
7722     ssh->term_width = width;
7723     ssh->term_height = height;
7724
7725     switch (ssh->state) {
7726       case SSH_STATE_BEFORE_SIZE:
7727       case SSH_STATE_PREPACKET:
7728       case SSH_STATE_CLOSED:
7729         break;                         /* do nothing */
7730       case SSH_STATE_INTERMED:
7731         ssh->size_needed = TRUE;       /* buffer for later */
7732         break;
7733       case SSH_STATE_SESSION:
7734         if (!ssh->cfg.nopty) {
7735             if (ssh->version == 1) {
7736                 send_packet(ssh, SSH1_CMSG_WINDOW_SIZE,
7737                             PKT_INT, ssh->term_height,
7738                             PKT_INT, ssh->term_width,
7739                             PKT_INT, 0, PKT_INT, 0, PKT_END);
7740             } else if (ssh->mainchan) {
7741                 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
7742                 ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid);
7743                 ssh2_pkt_addstring(pktout, "window-change");
7744                 ssh2_pkt_addbool(pktout, 0);
7745                 ssh2_pkt_adduint32(pktout, ssh->term_width);
7746                 ssh2_pkt_adduint32(pktout, ssh->term_height);
7747                 ssh2_pkt_adduint32(pktout, 0);
7748                 ssh2_pkt_adduint32(pktout, 0);
7749                 ssh2_pkt_send(ssh, pktout);
7750             }
7751         }
7752         break;
7753     }
7754 }
7755
7756 /*
7757  * Return a list of the special codes that make sense in this
7758  * protocol.
7759  */
7760 static const struct telnet_special *ssh_get_specials(void *handle)
7761 {
7762     static const struct telnet_special ssh1_ignore_special[] = {
7763         {"IGNORE message", TS_NOP}
7764     };
7765     static const struct telnet_special ssh2_transport_specials[] = {
7766         {"IGNORE message", TS_NOP},
7767         {"Repeat key exchange", TS_REKEY},
7768     };
7769     static const struct telnet_special ssh2_session_specials[] = {
7770         {NULL, TS_SEP},
7771         {"Break", TS_BRK},
7772         /* These are the signal names defined by draft-ietf-secsh-connect-23.
7773          * They include all the ISO C signals, but are a subset of the POSIX
7774          * required signals. */
7775         {"SIGINT (Interrupt)", TS_SIGINT},
7776         {"SIGTERM (Terminate)", TS_SIGTERM},
7777         {"SIGKILL (Kill)", TS_SIGKILL},
7778         {"SIGQUIT (Quit)", TS_SIGQUIT},
7779         {"SIGHUP (Hangup)", TS_SIGHUP},
7780         {"More signals", TS_SUBMENU},
7781           {"SIGABRT", TS_SIGABRT}, {"SIGALRM", TS_SIGALRM},
7782           {"SIGFPE",  TS_SIGFPE},  {"SIGILL",  TS_SIGILL},
7783           {"SIGPIPE", TS_SIGPIPE}, {"SIGSEGV", TS_SIGSEGV},
7784           {"SIGUSR1", TS_SIGUSR1}, {"SIGUSR2", TS_SIGUSR2},
7785         {NULL, TS_EXITMENU}
7786     };
7787     static const struct telnet_special specials_end[] = {
7788         {NULL, TS_EXITMENU}
7789     };
7790     /* XXX review this length for any changes: */
7791     static struct telnet_special ssh_specials[lenof(ssh2_transport_specials) +
7792                                               lenof(ssh2_session_specials) +
7793                                               lenof(specials_end)];
7794     Ssh ssh = (Ssh) handle;
7795     int i = 0;
7796 #define ADD_SPECIALS(name) \
7797     do { \
7798         assert((i + lenof(name)) <= lenof(ssh_specials)); \
7799         memcpy(&ssh_specials[i], name, sizeof name); \
7800         i += lenof(name); \
7801     } while(0)
7802
7803     if (ssh->version == 1) {
7804         /* Don't bother offering IGNORE if we've decided the remote
7805          * won't cope with it, since we wouldn't bother sending it if
7806          * asked anyway. */
7807         if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE))
7808             ADD_SPECIALS(ssh1_ignore_special);
7809     } else if (ssh->version == 2) {
7810         ADD_SPECIALS(ssh2_transport_specials);
7811         if (ssh->mainchan)
7812             ADD_SPECIALS(ssh2_session_specials);
7813     } /* else we're not ready yet */
7814
7815     if (i) {
7816         ADD_SPECIALS(specials_end);
7817         return ssh_specials;
7818     } else {
7819         return NULL;
7820     }
7821 #undef ADD_SPECIALS
7822 }
7823
7824 /*
7825  * Send Telnet special codes. TS_EOF is useful for `plink', so you
7826  * can send an EOF and collect resulting output (e.g. `plink
7827  * hostname sort').
7828  */
7829 static void ssh_special(void *handle, Telnet_Special code)
7830 {
7831     Ssh ssh = (Ssh) handle;
7832     struct Packet *pktout;
7833
7834     if (code == TS_EOF) {
7835         if (ssh->state != SSH_STATE_SESSION) {
7836             /*
7837              * Buffer the EOF in case we are pre-SESSION, so we can
7838              * send it as soon as we reach SESSION.
7839              */
7840             if (code == TS_EOF)
7841                 ssh->eof_needed = TRUE;
7842             return;
7843         }
7844         if (ssh->version == 1) {
7845             send_packet(ssh, SSH1_CMSG_EOF, PKT_END);
7846         } else if (ssh->mainchan) {
7847             struct Packet *pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF);
7848             ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid);
7849             ssh2_pkt_send(ssh, pktout);
7850         }
7851         logevent("Sent EOF message");
7852     } else if (code == TS_PING || code == TS_NOP) {
7853         if (ssh->state == SSH_STATE_CLOSED
7854             || ssh->state == SSH_STATE_PREPACKET) return;
7855         if (ssh->version == 1) {
7856             if (!(ssh->remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE))
7857                 send_packet(ssh, SSH1_MSG_IGNORE, PKT_STR, "", PKT_END);
7858         } else {
7859             pktout = ssh2_pkt_init(SSH2_MSG_IGNORE);
7860             ssh2_pkt_addstring_start(pktout);
7861             ssh2_pkt_send_noqueue(ssh, pktout);
7862         }
7863     } else if (code == TS_REKEY) {
7864         if (!ssh->kex_in_progress && ssh->version == 2) {
7865             do_ssh2_transport(ssh, "at user request", -1, NULL);
7866         }
7867     } else if (code == TS_BRK) {
7868         if (ssh->state == SSH_STATE_CLOSED
7869             || ssh->state == SSH_STATE_PREPACKET) return;
7870         if (ssh->version == 1) {
7871             logevent("Unable to send BREAK signal in SSH1");
7872         } else if (ssh->mainchan) {
7873             pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
7874             ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid);
7875             ssh2_pkt_addstring(pktout, "break");
7876             ssh2_pkt_addbool(pktout, 0);
7877             ssh2_pkt_adduint32(pktout, 0);   /* default break length */
7878             ssh2_pkt_send(ssh, pktout);
7879         }
7880     } else {
7881         /* Is is a POSIX signal? */
7882         char *signame = NULL;
7883         if (code == TS_SIGABRT) signame = "ABRT";
7884         if (code == TS_SIGALRM) signame = "ALRM";
7885         if (code == TS_SIGFPE)  signame = "FPE";
7886         if (code == TS_SIGHUP)  signame = "HUP";
7887         if (code == TS_SIGILL)  signame = "ILL";
7888         if (code == TS_SIGINT)  signame = "INT";
7889         if (code == TS_SIGKILL) signame = "KILL";
7890         if (code == TS_SIGPIPE) signame = "PIPE";
7891         if (code == TS_SIGQUIT) signame = "QUIT";
7892         if (code == TS_SIGSEGV) signame = "SEGV";
7893         if (code == TS_SIGTERM) signame = "TERM";
7894         if (code == TS_SIGUSR1) signame = "USR1";
7895         if (code == TS_SIGUSR2) signame = "USR2";
7896         /* The SSH-2 protocol does in principle support arbitrary named
7897          * signals, including signame@domain, but we don't support those. */
7898         if (signame) {
7899             /* It's a signal. */
7900             if (ssh->version == 2 && ssh->mainchan) {
7901                 pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
7902                 ssh2_pkt_adduint32(pktout, ssh->mainchan->remoteid);
7903                 ssh2_pkt_addstring(pktout, "signal");
7904                 ssh2_pkt_addbool(pktout, 0);
7905                 ssh2_pkt_addstring(pktout, signame);
7906                 ssh2_pkt_send(ssh, pktout);
7907                 logeventf(ssh, "Sent signal SIG%s", signame);
7908             }
7909         } else {
7910             /* Never heard of it. Do nothing */
7911         }
7912     }
7913 }
7914
7915 void *new_sock_channel(void *handle, Socket s)
7916 {
7917     Ssh ssh = (Ssh) handle;
7918     struct ssh_channel *c;
7919     c = snew(struct ssh_channel);
7920     c->ssh = ssh;
7921
7922     if (c) {
7923         c->halfopen = TRUE;
7924         c->localid = alloc_channel_id(ssh);
7925         c->closes = 0;
7926         c->type = CHAN_SOCKDATA_DORMANT;/* identify channel type */
7927         c->u.pfd.s = s;
7928         bufchain_init(&c->v.v2.outbuffer);
7929         add234(ssh->channels, c);
7930     }
7931     return c;
7932 }
7933
7934 /*
7935  * This is called when stdout/stderr (the entity to which
7936  * from_backend sends data) manages to clear some backlog.
7937  */
7938 static void ssh_unthrottle(void *handle, int bufsize)
7939 {
7940     Ssh ssh = (Ssh) handle;
7941     if (ssh->version == 1) {
7942         if (ssh->v1_stdout_throttling && bufsize < SSH1_BUFFER_LIMIT) {
7943             ssh->v1_stdout_throttling = 0;
7944             ssh1_throttle(ssh, -1);
7945         }
7946     } else {
7947         if (ssh->mainchan && ssh->mainchan->closes == 0)
7948             ssh2_set_window(ssh->mainchan, OUR_V2_WINSIZE - bufsize);
7949     }
7950 }
7951
7952 void ssh_send_port_open(void *channel, char *hostname, int port, char *org)
7953 {
7954     struct ssh_channel *c = (struct ssh_channel *)channel;
7955     Ssh ssh = c->ssh;
7956     struct Packet *pktout;
7957
7958     logeventf(ssh, "Opening forwarded connection to %s:%d", hostname, port);
7959
7960     if (ssh->version == 1) {
7961         send_packet(ssh, SSH1_MSG_PORT_OPEN,
7962                     PKT_INT, c->localid,
7963                     PKT_STR, hostname,
7964                     PKT_INT, port,
7965                     /* PKT_STR, <org:orgport>, */
7966                     PKT_END);
7967     } else {
7968         pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
7969         ssh2_pkt_addstring(pktout, "direct-tcpip");
7970         ssh2_pkt_adduint32(pktout, c->localid);
7971         c->v.v2.locwindow = OUR_V2_WINSIZE;
7972         ssh2_pkt_adduint32(pktout, c->v.v2.locwindow);/* our window size */
7973         ssh2_pkt_adduint32(pktout, OUR_V2_MAXPKT);      /* our max pkt size */
7974         ssh2_pkt_addstring(pktout, hostname);
7975         ssh2_pkt_adduint32(pktout, port);
7976         /*
7977          * We make up values for the originator data; partly it's
7978          * too much hassle to keep track, and partly I'm not
7979          * convinced the server should be told details like that
7980          * about my local network configuration.
7981          */
7982         ssh2_pkt_addstring(pktout, "client-side-connection");
7983         ssh2_pkt_adduint32(pktout, 0);
7984         ssh2_pkt_send(ssh, pktout);
7985     }
7986 }
7987
7988 static Socket ssh_socket(void *handle)
7989 {
7990     Ssh ssh = (Ssh) handle;
7991     return ssh->s;
7992 }
7993
7994 static int ssh_sendok(void *handle)
7995 {
7996     Ssh ssh = (Ssh) handle;
7997     return ssh->send_ok;
7998 }
7999
8000 static int ssh_ldisc(void *handle, int option)
8001 {
8002     Ssh ssh = (Ssh) handle;
8003     if (option == LD_ECHO)
8004         return ssh->echoing;
8005     if (option == LD_EDIT)
8006         return ssh->editing;
8007     return FALSE;
8008 }
8009
8010 static void ssh_provide_ldisc(void *handle, void *ldisc)
8011 {
8012     Ssh ssh = (Ssh) handle;
8013     ssh->ldisc = ldisc;
8014 }
8015
8016 static void ssh_provide_logctx(void *handle, void *logctx)
8017 {
8018     Ssh ssh = (Ssh) handle;
8019     ssh->logctx = logctx;
8020 }
8021
8022 static int ssh_return_exitcode(void *handle)
8023 {
8024     Ssh ssh = (Ssh) handle;
8025     if (ssh->s != NULL)
8026         return -1;
8027     else
8028         return (ssh->exitcode >= 0 ? ssh->exitcode : 0);
8029 }
8030
8031 /*
8032  * cfg_info for SSH is the currently running version of the
8033  * protocol. (1 for 1; 2 for 2; 0 for not-decided-yet.)
8034  */
8035 static int ssh_cfg_info(void *handle)
8036 {
8037     Ssh ssh = (Ssh) handle;
8038     return ssh->version;
8039 }
8040
8041 /*
8042  * Gross hack: pscp will try to start SFTP but fall back to scp1 if
8043  * that fails. This variable is the means by which scp.c can reach
8044  * into the SSH code and find out which one it got.
8045  */
8046 extern int ssh_fallback_cmd(void *handle)
8047 {
8048     Ssh ssh = (Ssh) handle;
8049     return ssh->fallback_cmd;
8050 }
8051
8052 Backend ssh_backend = {
8053     ssh_init,
8054     ssh_free,
8055     ssh_reconfig,
8056     ssh_send,
8057     ssh_sendbuffer,
8058     ssh_size,
8059     ssh_special,
8060     ssh_get_specials,
8061     ssh_socket,
8062     ssh_return_exitcode,
8063     ssh_sendok,
8064     ssh_ldisc,
8065     ssh_provide_ldisc,
8066     ssh_provide_logctx,
8067     ssh_unthrottle,
8068     ssh_cfg_info,
8069     22
8070 };