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