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