]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - ssh.c
45354884bc8c5043ff283cb97f8408d43650c32f
[PuTTY.git] / ssh.c
1 #include <windows.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <stdarg.h>
5 #include <assert.h>
6
7 #include "putty.h"
8 #include "tree234.h"
9 #include "ssh.h"
10
11 #ifndef FALSE
12 #define FALSE 0
13 #endif
14 #ifndef TRUE
15 #define TRUE 1
16 #endif
17
18 /* uncomment this for packet level debugging */
19 /* #define DUMP_PACKETS */
20
21 #define logevent(s) { logevent(s); \
22                       if ((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) \
23                       { fprintf(stderr, "%s\n", s); fflush(stderr); } }
24
25 #define bombout(msg) ( ssh_state = SSH_STATE_CLOSED, \
26                           (s ? sk_close(s), s = NULL : 0), \
27                           connection_fatal msg )
28
29 #define SSH1_MSG_DISCONNECT                       1     /* 0x1 */
30 #define SSH1_SMSG_PUBLIC_KEY                      2     /* 0x2 */
31 #define SSH1_CMSG_SESSION_KEY                     3     /* 0x3 */
32 #define SSH1_CMSG_USER                            4     /* 0x4 */
33 #define SSH1_CMSG_AUTH_RSA                        6     /* 0x6 */
34 #define SSH1_SMSG_AUTH_RSA_CHALLENGE              7     /* 0x7 */
35 #define SSH1_CMSG_AUTH_RSA_RESPONSE               8     /* 0x8 */
36 #define SSH1_CMSG_AUTH_PASSWORD                   9     /* 0x9 */
37 #define SSH1_CMSG_REQUEST_PTY                     10    /* 0xa */
38 #define SSH1_CMSG_WINDOW_SIZE                     11    /* 0xb */
39 #define SSH1_CMSG_EXEC_SHELL                      12    /* 0xc */
40 #define SSH1_CMSG_EXEC_CMD                        13    /* 0xd */
41 #define SSH1_SMSG_SUCCESS                         14    /* 0xe */
42 #define SSH1_SMSG_FAILURE                         15    /* 0xf */
43 #define SSH1_CMSG_STDIN_DATA                      16    /* 0x10 */
44 #define SSH1_SMSG_STDOUT_DATA                     17    /* 0x11 */
45 #define SSH1_SMSG_STDERR_DATA                     18    /* 0x12 */
46 #define SSH1_CMSG_EOF                             19    /* 0x13 */
47 #define SSH1_SMSG_EXIT_STATUS                     20    /* 0x14 */
48 #define SSH1_MSG_CHANNEL_OPEN_CONFIRMATION        21    /* 0x15 */
49 #define SSH1_MSG_CHANNEL_OPEN_FAILURE             22    /* 0x16 */
50 #define SSH1_MSG_CHANNEL_DATA                     23    /* 0x17 */
51 #define SSH1_MSG_CHANNEL_CLOSE                    24    /* 0x18 */
52 #define SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION       25    /* 0x19 */
53 #define SSH1_SMSG_X11_OPEN                        27    /* 0x1b */
54 #define SSH1_CMSG_PORT_FORWARD_REQUEST            28    /* 0x1c */
55 #define SSH1_MSG_PORT_OPEN                        29    /* 0x1d */
56 #define SSH1_CMSG_AGENT_REQUEST_FORWARDING        30    /* 0x1e */
57 #define SSH1_SMSG_AGENT_OPEN                      31    /* 0x1f */
58 #define SSH1_MSG_IGNORE                           32    /* 0x20 */
59 #define SSH1_CMSG_EXIT_CONFIRMATION               33    /* 0x21 */
60 #define SSH1_CMSG_X11_REQUEST_FORWARDING          34    /* 0x22 */
61 #define SSH1_CMSG_AUTH_RHOSTS_RSA                 35    /* 0x23 */
62 #define SSH1_MSG_DEBUG                            36    /* 0x24 */
63 #define SSH1_CMSG_REQUEST_COMPRESSION             37    /* 0x25 */
64 #define SSH1_CMSG_AUTH_TIS                        39    /* 0x27 */
65 #define SSH1_SMSG_AUTH_TIS_CHALLENGE              40    /* 0x28 */
66 #define SSH1_CMSG_AUTH_TIS_RESPONSE               41    /* 0x29 */
67 #define SSH1_CMSG_AUTH_CCARD                      70    /* 0x46 */
68 #define SSH1_SMSG_AUTH_CCARD_CHALLENGE            71    /* 0x47 */
69 #define SSH1_CMSG_AUTH_CCARD_RESPONSE             72    /* 0x48 */
70
71 #define SSH1_AUTH_TIS                             5     /* 0x5 */
72 #define SSH1_AUTH_CCARD                           16    /* 0x10 */
73
74 #define SSH1_PROTOFLAG_SCREEN_NUMBER              1     /* 0x1 */
75 /* Mask for protoflags we will echo back to server if seen */
76 #define SSH1_PROTOFLAGS_SUPPORTED                 0     /* 0x1 */
77
78 #define SSH2_MSG_DISCONNECT                       1     /* 0x1 */
79 #define SSH2_MSG_IGNORE                           2     /* 0x2 */
80 #define SSH2_MSG_UNIMPLEMENTED                    3     /* 0x3 */
81 #define SSH2_MSG_DEBUG                            4     /* 0x4 */
82 #define SSH2_MSG_SERVICE_REQUEST                  5     /* 0x5 */
83 #define SSH2_MSG_SERVICE_ACCEPT                   6     /* 0x6 */
84 #define SSH2_MSG_KEXINIT                          20    /* 0x14 */
85 #define SSH2_MSG_NEWKEYS                          21    /* 0x15 */
86 #define SSH2_MSG_KEXDH_INIT                       30    /* 0x1e */
87 #define SSH2_MSG_KEXDH_REPLY                      31    /* 0x1f */
88 #define SSH2_MSG_KEX_DH_GEX_REQUEST               30    /* 0x1e */
89 #define SSH2_MSG_KEX_DH_GEX_GROUP                 31    /* 0x1f */
90 #define SSH2_MSG_KEX_DH_GEX_INIT                  32    /* 0x20 */
91 #define SSH2_MSG_KEX_DH_GEX_REPLY                 33    /* 0x21 */
92 #define SSH2_MSG_USERAUTH_REQUEST                 50    /* 0x32 */
93 #define SSH2_MSG_USERAUTH_FAILURE                 51    /* 0x33 */
94 #define SSH2_MSG_USERAUTH_SUCCESS                 52    /* 0x34 */
95 #define SSH2_MSG_USERAUTH_BANNER                  53    /* 0x35 */
96 #define SSH2_MSG_USERAUTH_PK_OK                   60    /* 0x3c */
97 #define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ        60    /* 0x3c */
98 #define SSH2_MSG_GLOBAL_REQUEST                   80    /* 0x50 */
99 #define SSH2_MSG_REQUEST_SUCCESS                  81    /* 0x51 */
100 #define SSH2_MSG_REQUEST_FAILURE                  82    /* 0x52 */
101 #define SSH2_MSG_CHANNEL_OPEN                     90    /* 0x5a */
102 #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION        91    /* 0x5b */
103 #define SSH2_MSG_CHANNEL_OPEN_FAILURE             92    /* 0x5c */
104 #define SSH2_MSG_CHANNEL_WINDOW_ADJUST            93    /* 0x5d */
105 #define SSH2_MSG_CHANNEL_DATA                     94    /* 0x5e */
106 #define SSH2_MSG_CHANNEL_EXTENDED_DATA            95    /* 0x5f */
107 #define SSH2_MSG_CHANNEL_EOF                      96    /* 0x60 */
108 #define SSH2_MSG_CHANNEL_CLOSE                    97    /* 0x61 */
109 #define SSH2_MSG_CHANNEL_REQUEST                  98    /* 0x62 */
110 #define SSH2_MSG_CHANNEL_SUCCESS                  99    /* 0x63 */
111 #define SSH2_MSG_CHANNEL_FAILURE                  100   /* 0x64 */
112
113 #define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1   /* 0x1 */
114 #define SSH2_DISCONNECT_PROTOCOL_ERROR            2     /* 0x2 */
115 #define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED       3     /* 0x3 */
116 #define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4    /* 0x4 */
117 #define SSH2_DISCONNECT_MAC_ERROR                 5     /* 0x5 */
118 #define SSH2_DISCONNECT_COMPRESSION_ERROR         6     /* 0x6 */
119 #define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE     7     /* 0x7 */
120 #define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8        /* 0x8 */
121 #define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE   9     /* 0x9 */
122 #define SSH2_DISCONNECT_CONNECTION_LOST           10    /* 0xa */
123 #define SSH2_DISCONNECT_BY_APPLICATION            11    /* 0xb */
124 #define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS      12    /* 0xc */
125 #define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER    13    /* 0xd */
126 #define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14       /* 0xe */
127 #define SSH2_DISCONNECT_ILLEGAL_USER_NAME         15    /* 0xf */
128
129 static const char *const ssh2_disconnect_reasons[] = {
130     NULL,
131     "SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT",
132     "SSH_DISCONNECT_PROTOCOL_ERROR",
133     "SSH_DISCONNECT_KEY_EXCHANGE_FAILED",
134     "SSH_DISCONNECT_HOST_AUTHENTICATION_FAILED",
135     "SSH_DISCONNECT_MAC_ERROR",
136     "SSH_DISCONNECT_COMPRESSION_ERROR",
137     "SSH_DISCONNECT_SERVICE_NOT_AVAILABLE",
138     "SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED",
139     "SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE",
140     "SSH_DISCONNECT_CONNECTION_LOST",
141     "SSH_DISCONNECT_BY_APPLICATION",
142     "SSH_DISCONNECT_TOO_MANY_CONNECTIONS",
143     "SSH_DISCONNECT_AUTH_CANCELLED_BY_USER",
144     "SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE",
145     "SSH_DISCONNECT_ILLEGAL_USER_NAME",
146 };
147
148 #define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED     1     /* 0x1 */
149 #define SSH2_OPEN_CONNECT_FAILED                  2     /* 0x2 */
150 #define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE            3     /* 0x3 */
151 #define SSH2_OPEN_RESOURCE_SHORTAGE               4     /* 0x4 */
152
153 #define SSH2_EXTENDED_DATA_STDERR                 1     /* 0x1 */
154
155 /*
156  * Various remote-bug flags.
157  */
158 #define BUG_CHOKES_ON_SSH1_IGNORE                 1
159 #define BUG_SSH2_HMAC                             2
160
161 #define GET_32BIT(cp) \
162     (((unsigned long)(unsigned char)(cp)[0] << 24) | \
163     ((unsigned long)(unsigned char)(cp)[1] << 16) | \
164     ((unsigned long)(unsigned char)(cp)[2] << 8) | \
165     ((unsigned long)(unsigned char)(cp)[3]))
166
167 #define PUT_32BIT(cp, value) { \
168     (cp)[0] = (unsigned char)((value) >> 24); \
169     (cp)[1] = (unsigned char)((value) >> 16); \
170     (cp)[2] = (unsigned char)((value) >> 8); \
171     (cp)[3] = (unsigned char)(value); }
172
173 enum { PKT_END, PKT_INT, PKT_CHAR, PKT_DATA, PKT_STR, PKT_BIGNUM };
174
175 /* Coroutine mechanics for the sillier bits of the code */
176 #define crBegin1        static int crLine = 0;
177 #define crBegin2        switch(crLine) { case 0:;
178 #define crBegin         crBegin1; crBegin2;
179 #define crFinish(z)     } crLine = 0; return (z)
180 #define crFinishV       } crLine = 0; return
181 #define crReturn(z)     \
182         do {\
183             crLine=__LINE__; return (z); case __LINE__:;\
184         } while (0)
185 #define crReturnV       \
186         do {\
187             crLine=__LINE__; return; case __LINE__:;\
188         } while (0)
189 #define crStop(z)       do{ crLine = 0; return (z); }while(0)
190 #define crStopV         do{ crLine = 0; return; }while(0)
191 #define crWaitUntil(c)  do { crReturn(0); } while (!(c))
192 #define crWaitUntilV(c) do { crReturnV; } while (!(c))
193
194 extern char *x11_init(Socket *, char *, void *);
195 extern void x11_close(Socket);
196 extern void x11_send(Socket, char *, int);
197 extern void x11_invent_auth(char *, int, char *, int);
198
199 /*
200  * Ciphers for SSH2. We miss out single-DES because it isn't
201  * supported; also 3DES and Blowfish are both done differently from
202  * SSH1. (3DES uses outer chaining; Blowfish has the opposite
203  * endianness and different-sized keys.)
204  */
205 const static struct ssh2_ciphers *ciphers[] = {
206     &ssh2_aes,
207     &ssh2_blowfish,
208     &ssh2_3des,
209 };
210
211 const static struct ssh_kex *kex_algs[] = {
212     &ssh_diffiehellman_gex,
213     &ssh_diffiehellman
214 };
215
216 const static struct ssh_signkey *hostkey_algs[] = { &ssh_rsa, &ssh_dss };
217
218 static void nullmac_key(unsigned char *key)
219 {
220 }
221 static void nullmac_generate(unsigned char *blk, int len,
222                              unsigned long seq)
223 {
224 }
225 static int nullmac_verify(unsigned char *blk, int len, unsigned long seq)
226 {
227     return 1;
228 }
229 const static struct ssh_mac ssh_mac_none = {
230     nullmac_key, nullmac_key, nullmac_generate, nullmac_verify, "none", 0
231 };
232 const static struct ssh_mac *macs[] = {
233     &ssh_sha1, &ssh_md5, &ssh_mac_none
234 };
235 const static struct ssh_mac *buggymacs[] = {
236     &ssh_sha1_buggy, &ssh_md5, &ssh_mac_none
237 };
238
239 static void ssh_comp_none_init(void)
240 {
241 }
242 static int ssh_comp_none_block(unsigned char *block, int len,
243                                unsigned char **outblock, int *outlen)
244 {
245     return 0;
246 }
247 static int ssh_comp_none_disable(void)
248 {
249     return 0;
250 }
251 const static struct ssh_compress ssh_comp_none = {
252     "none",
253     ssh_comp_none_init, ssh_comp_none_block,
254     ssh_comp_none_init, ssh_comp_none_block,
255     ssh_comp_none_disable
256 };
257 extern const struct ssh_compress ssh_zlib;
258 const static struct ssh_compress *compressions[] = {
259     &ssh_zlib, &ssh_comp_none
260 };
261
262 enum {                                 /* channel types */
263     CHAN_MAINSESSION,
264     CHAN_X11,
265     CHAN_AGENT,
266 };
267
268 /*
269  * 2-3-4 tree storing channels.
270  */
271 struct ssh_channel {
272     unsigned remoteid, localid;
273     int type;
274     int closes;
275     struct ssh2_data_channel {
276         unsigned char *outbuffer;
277         unsigned outbuflen, outbufsize;
278         unsigned remwindow, remmaxpkt;
279     } v2;
280     union {
281         struct ssh_agent_channel {
282             unsigned char *message;
283             unsigned char msglen[4];
284             int lensofar, totallen;
285         } a;
286         struct ssh_x11_channel {
287             Socket s;
288         } x11;
289     } u;
290 };
291
292 struct Packet {
293     long length;
294     int type;
295     unsigned char *data;
296     unsigned char *body;
297     long savedpos;
298     long maxlen;
299 };
300
301 static SHA_State exhash, exhashbase;
302
303 static Socket s = NULL;
304
305 static unsigned char session_key[32];
306 static int ssh1_compressing;
307 static int ssh1_remote_protoflags;
308 static int ssh1_local_protoflags;
309 static int ssh_agentfwd_enabled;
310 static int ssh_X11_fwd_enabled;
311 static int ssh_remote_bugs;
312 static const struct ssh_cipher *cipher = NULL;
313 static const struct ssh2_cipher *cscipher = NULL;
314 static const struct ssh2_cipher *sccipher = NULL;
315 static const struct ssh_mac *csmac = NULL;
316 static const struct ssh_mac *scmac = NULL;
317 static const struct ssh_compress *cscomp = NULL;
318 static const struct ssh_compress *sccomp = NULL;
319 static const struct ssh_kex *kex = NULL;
320 static const struct ssh_signkey *hostkey = NULL;
321 static unsigned char ssh2_session_id[20];
322 int (*ssh_get_line) (const char *prompt, char *str, int maxlen,
323                      int is_pw) = NULL;
324
325 static char *savedhost;
326 static int savedport;
327 static int ssh_send_ok;
328 static int ssh_echoing, ssh_editing;
329
330 static tree234 *ssh_channels;          /* indexed by local id */
331 static struct ssh_channel *mainchan;   /* primary session channel */
332
333 static enum {
334     SSH_STATE_PREPACKET,
335     SSH_STATE_BEFORE_SIZE,
336     SSH_STATE_INTERMED,
337     SSH_STATE_SESSION,
338     SSH_STATE_CLOSED
339 } ssh_state = SSH_STATE_PREPACKET;
340
341 static int size_needed = FALSE, eof_needed = FALSE;
342
343 static struct Packet pktin = { 0, 0, NULL, NULL, 0 };
344 static struct Packet pktout = { 0, 0, NULL, NULL, 0 };
345 static unsigned char *deferred_send_data = NULL;
346 static int deferred_len = 0, deferred_size = 0;
347
348 static int ssh_version;
349 static void (*ssh_protocol) (unsigned char *in, int inlen, int ispkt);
350 static void ssh1_protocol(unsigned char *in, int inlen, int ispkt);
351 static void ssh2_protocol(unsigned char *in, int inlen, int ispkt);
352 static void ssh_size(void);
353 static void ssh_special(Telnet_Special);
354 static void ssh2_try_send(struct ssh_channel *c);
355 static void ssh2_add_channel_data(struct ssh_channel *c, char *buf,
356                                   int len);
357
358 static int (*s_rdpkt) (unsigned char **data, int *datalen);
359
360 static struct rdpkt1_state_tag {
361     long len, pad, biglen, to_read;
362     unsigned long realcrc, gotcrc;
363     unsigned char *p;
364     int i;
365     int chunk;
366 } rdpkt1_state;
367
368 static struct rdpkt2_state_tag {
369     long len, pad, payload, packetlen, maclen;
370     int i;
371     int cipherblk;
372     unsigned long incoming_sequence;
373 } rdpkt2_state;
374
375 static int ssh_channelcmp(void *av, void *bv)
376 {
377     struct ssh_channel *a = (struct ssh_channel *) av;
378     struct ssh_channel *b = (struct ssh_channel *) bv;
379     if (a->localid < b->localid)
380         return -1;
381     if (a->localid > b->localid)
382         return +1;
383     return 0;
384 }
385 static int ssh_channelfind(void *av, void *bv)
386 {
387     unsigned *a = (unsigned *) av;
388     struct ssh_channel *b = (struct ssh_channel *) bv;
389     if (*a < b->localid)
390         return -1;
391     if (*a > b->localid)
392         return +1;
393     return 0;
394 }
395
396 static int alloc_channel_id(void)
397 {
398     const unsigned CHANNEL_NUMBER_OFFSET = 256;
399     unsigned low, high, mid;
400     int tsize;
401     struct ssh_channel *c;
402
403     /*
404      * First-fit allocation of channel numbers: always pick the
405      * lowest unused one. To do this, binary-search using the
406      * counted B-tree to find the largest channel ID which is in a
407      * contiguous sequence from the beginning. (Precisely
408      * everything in that sequence must have ID equal to its tree
409      * index plus CHANNEL_NUMBER_OFFSET.)
410      */
411     tsize = count234(ssh_channels);
412
413     low = -1;
414     high = tsize;
415     while (high - low > 1) {
416         mid = (high + low) / 2;
417         c = index234(ssh_channels, mid);
418         if (c->localid == mid + CHANNEL_NUMBER_OFFSET)
419             low = mid;                 /* this one is fine */
420         else
421             high = mid;                /* this one is past it */
422     }
423     /*
424      * Now low points to either -1, or the tree index of the
425      * largest ID in the initial sequence.
426      */
427     {
428         unsigned i = low + 1 + CHANNEL_NUMBER_OFFSET;
429         assert(NULL == find234(ssh_channels, &i, ssh_channelfind));
430     }
431     return low + 1 + CHANNEL_NUMBER_OFFSET;
432 }
433
434 static void c_write(char *buf, int len)
435 {
436     if ((flags & FLAG_STDERR)) {
437         int i;
438         for (i = 0; i < len; i++)
439             if (buf[i] != '\r')
440                 fputc(buf[i], stderr);
441         return;
442     }
443     from_backend(1, buf, len);
444 }
445
446 static void c_write_untrusted(char *buf, int len)
447 {
448     int i;
449     for (i = 0; i < len; i++) {
450         if (buf[i] == '\n')
451             c_write("\r\n", 2);
452         else if ((buf[i] & 0x60) || (buf[i] == '\r'))
453             c_write(buf + i, 1);
454     }
455 }
456
457 static void c_write_str(char *buf)
458 {
459     c_write(buf, strlen(buf));
460 }
461
462 /*
463  * Collect incoming data in the incoming packet buffer.
464  * Decipher and verify the packet when it is completely read.
465  * Drop SSH1_MSG_DEBUG and SSH1_MSG_IGNORE packets.
466  * Update the *data and *datalen variables.
467  * Return the additional nr of bytes needed, or 0 when
468  * a complete packet is available.
469  */
470 static int ssh1_rdpkt(unsigned char **data, int *datalen)
471 {
472     struct rdpkt1_state_tag *st = &rdpkt1_state;
473
474     crBegin;
475
476   next_packet:
477
478     pktin.type = 0;
479     pktin.length = 0;
480
481     for (st->i = st->len = 0; st->i < 4; st->i++) {
482         while ((*datalen) == 0)
483             crReturn(4 - st->i);
484         st->len = (st->len << 8) + **data;
485         (*data)++, (*datalen)--;
486     }
487
488 #ifdef FWHACK
489     if (st->len == 0x52656d6f) {       /* "Remo"te server has closed ... */
490         st->len = 0x300;               /* big enough to carry to end */
491     }
492 #endif
493
494     st->pad = 8 - (st->len % 8);
495     st->biglen = st->len + st->pad;
496     pktin.length = st->len - 5;
497
498     if (pktin.maxlen < st->biglen) {
499         pktin.maxlen = st->biglen;
500         pktin.data = (pktin.data == NULL ? smalloc(st->biglen + APIEXTRA) :
501                       srealloc(pktin.data, st->biglen + APIEXTRA));
502         if (!pktin.data)
503             fatalbox("Out of memory");
504     }
505
506     st->to_read = st->biglen;
507     st->p = pktin.data;
508     while (st->to_read > 0) {
509         st->chunk = st->to_read;
510         while ((*datalen) == 0)
511             crReturn(st->to_read);
512         if (st->chunk > (*datalen))
513             st->chunk = (*datalen);
514         memcpy(st->p, *data, st->chunk);
515         *data += st->chunk;
516         *datalen -= st->chunk;
517         st->p += st->chunk;
518         st->to_read -= st->chunk;
519     }
520
521     if (cipher)
522         cipher->decrypt(pktin.data, st->biglen);
523 #ifdef DUMP_PACKETS
524     debug(("Got packet len=%d pad=%d\n", st->len, st->pad));
525     dmemdump(pktin.data, st->biglen);
526 #endif
527
528     st->realcrc = crc32(pktin.data, st->biglen - 4);
529     st->gotcrc = GET_32BIT(pktin.data + st->biglen - 4);
530     if (st->gotcrc != st->realcrc) {
531         bombout(("Incorrect CRC received on packet"));
532         crReturn(0);
533     }
534
535     pktin.body = pktin.data + st->pad + 1;
536
537     if (ssh1_compressing) {
538         unsigned char *decompblk;
539         int decomplen;
540 #ifdef DUMP_PACKETS
541         debug(("Packet payload pre-decompression:\n"));
542         dmemdump(pktin.body - 1, pktin.length + 1);
543 #endif
544         zlib_decompress_block(pktin.body - 1, pktin.length + 1,
545                               &decompblk, &decomplen);
546
547         if (pktin.maxlen < st->pad + decomplen) {
548             pktin.maxlen = st->pad + decomplen;
549             pktin.data = srealloc(pktin.data, pktin.maxlen + APIEXTRA);
550             pktin.body = pktin.data + st->pad + 1;
551             if (!pktin.data)
552                 fatalbox("Out of memory");
553         }
554
555         memcpy(pktin.body - 1, decompblk, decomplen);
556         sfree(decompblk);
557         pktin.length = decomplen - 1;
558 #ifdef DUMP_PACKETS
559         debug(("Packet payload post-decompression:\n"));
560         dmemdump(pktin.body - 1, pktin.length + 1);
561 #endif
562     }
563
564     if (pktin.type == SSH1_SMSG_STDOUT_DATA ||
565         pktin.type == SSH1_SMSG_STDERR_DATA ||
566         pktin.type == SSH1_MSG_DEBUG ||
567         pktin.type == SSH1_SMSG_AUTH_TIS_CHALLENGE ||
568         pktin.type == SSH1_SMSG_AUTH_CCARD_CHALLENGE) {
569         long strlen = GET_32BIT(pktin.body);
570         if (strlen + 4 != pktin.length) {
571             bombout(("Received data packet with bogus string length"));
572             crReturn(0);
573         }
574     }
575
576     pktin.type = pktin.body[-1];
577
578     if (pktin.type == SSH1_MSG_DEBUG) {
579         /* log debug message */
580         char buf[80];
581         int strlen = GET_32BIT(pktin.body);
582         strcpy(buf, "Remote: ");
583         if (strlen > 70)
584             strlen = 70;
585         memcpy(buf + 8, pktin.body + 4, strlen);
586         buf[8 + strlen] = '\0';
587         logevent(buf);
588         goto next_packet;
589     } else if (pktin.type == SSH1_MSG_IGNORE) {
590         /* do nothing */
591         goto next_packet;
592     }
593
594     if (pktin.type == SSH1_MSG_DISCONNECT) {
595         /* log reason code in disconnect message */
596         char buf[256];
597         unsigned msglen = GET_32BIT(pktin.body);
598         unsigned nowlen;
599         strcpy(buf, "Remote sent disconnect: ");
600         nowlen = strlen(buf);
601         if (msglen > sizeof(buf) - nowlen - 1)
602             msglen = sizeof(buf) - nowlen - 1;
603         memcpy(buf + nowlen, pktin.body + 4, msglen);
604         buf[nowlen + msglen] = '\0';
605         logevent(buf);
606     }
607
608     crFinish(0);
609 }
610
611 static int ssh2_rdpkt(unsigned char **data, int *datalen)
612 {
613     struct rdpkt2_state_tag *st = &rdpkt2_state;
614
615     crBegin;
616
617   next_packet:
618     pktin.type = 0;
619     pktin.length = 0;
620     if (sccipher)
621         st->cipherblk = sccipher->blksize;
622     else
623         st->cipherblk = 8;
624     if (st->cipherblk < 8)
625         st->cipherblk = 8;
626
627     if (pktin.maxlen < st->cipherblk) {
628         pktin.maxlen = st->cipherblk;
629         pktin.data =
630             (pktin.data ==
631              NULL ? smalloc(st->cipherblk +
632                             APIEXTRA) : srealloc(pktin.data,
633                                                  st->cipherblk +
634                                                  APIEXTRA));
635         if (!pktin.data)
636             fatalbox("Out of memory");
637     }
638
639     /*
640      * Acquire and decrypt the first block of the packet. This will
641      * contain the length and padding details.
642      */
643     for (st->i = st->len = 0; st->i < st->cipherblk; st->i++) {
644         while ((*datalen) == 0)
645             crReturn(st->cipherblk - st->i);
646         pktin.data[st->i] = *(*data)++;
647         (*datalen)--;
648     }
649 #ifdef FWHACK
650     if (!memcmp(pktin.data, "Remo", 4)) {       /* "Remo"te server has closed ... */
651         /* FIXME */
652     }
653 #endif
654     if (sccipher)
655         sccipher->decrypt(pktin.data, st->cipherblk);
656
657     /*
658      * Now get the length and padding figures.
659      */
660     st->len = GET_32BIT(pktin.data);
661     st->pad = pktin.data[4];
662
663     /*
664      * This enables us to deduce the payload length.
665      */
666     st->payload = st->len - st->pad - 1;
667
668     pktin.length = st->payload + 5;
669
670     /*
671      * So now we can work out the total packet length.
672      */
673     st->packetlen = st->len + 4;
674     st->maclen = scmac ? scmac->len : 0;
675
676     /*
677      * Adjust memory allocation if packet is too big.
678      */
679     if (pktin.maxlen < st->packetlen + st->maclen) {
680         pktin.maxlen = st->packetlen + st->maclen;
681         pktin.data =
682             (pktin.data ==
683              NULL ? smalloc(pktin.maxlen + APIEXTRA) : srealloc(pktin.data,
684                                                                 pktin.maxlen
685                                                                 +
686                                                                 APIEXTRA));
687         if (!pktin.data)
688             fatalbox("Out of memory");
689     }
690
691     /*
692      * Read and decrypt the remainder of the packet.
693      */
694     for (st->i = st->cipherblk; st->i < st->packetlen + st->maclen;
695          st->i++) {
696         while ((*datalen) == 0)
697             crReturn(st->packetlen + st->maclen - st->i);
698         pktin.data[st->i] = *(*data)++;
699         (*datalen)--;
700     }
701     /* Decrypt everything _except_ the MAC. */
702     if (sccipher)
703         sccipher->decrypt(pktin.data + st->cipherblk,
704                           st->packetlen - st->cipherblk);
705
706 #ifdef DUMP_PACKETS
707     debug(("Got packet len=%d pad=%d\n", st->len, st->pad));
708     dmemdump(pktin.data, st->packetlen);
709 #endif
710
711     /*
712      * Check the MAC.
713      */
714     if (scmac
715         && !scmac->verify(pktin.data, st->len + 4,
716                           st->incoming_sequence)) {
717         bombout(("Incorrect MAC received on packet"));
718         crReturn(0);
719     }
720     st->incoming_sequence++;           /* whether or not we MACed */
721
722     /*
723      * Decompress packet payload.
724      */
725     {
726         unsigned char *newpayload;
727         int newlen;
728         if (sccomp && sccomp->decompress(pktin.data + 5, pktin.length - 5,
729                                          &newpayload, &newlen)) {
730             if (pktin.maxlen < newlen + 5) {
731                 pktin.maxlen = newlen + 5;
732                 pktin.data =
733                     (pktin.data ==
734                      NULL ? smalloc(pktin.maxlen +
735                                     APIEXTRA) : srealloc(pktin.data,
736                                                          pktin.maxlen +
737                                                          APIEXTRA));
738                 if (!pktin.data)
739                     fatalbox("Out of memory");
740             }
741             pktin.length = 5 + newlen;
742             memcpy(pktin.data + 5, newpayload, newlen);
743 #ifdef DUMP_PACKETS
744             debug(("Post-decompression payload:\n"));
745             dmemdump(pktin.data + 5, newlen);
746 #endif
747
748             sfree(newpayload);
749         }
750     }
751
752     pktin.savedpos = 6;
753     pktin.type = pktin.data[5];
754
755     if (pktin.type == SSH2_MSG_IGNORE || pktin.type == SSH2_MSG_DEBUG)
756         goto next_packet;              /* FIXME: print DEBUG message */
757
758     if (pktin.type == SSH2_MSG_DISCONNECT) {
759         /* log reason code in disconnect message */
760         char buf[256];
761         int reason = GET_32BIT(pktin.data + 6);
762         unsigned msglen = GET_32BIT(pktin.data + 10);
763         unsigned nowlen;
764         if (reason > 0 && reason < lenof(ssh2_disconnect_reasons)) {
765             sprintf(buf, "Received disconnect message (%s)",
766                     ssh2_disconnect_reasons[reason]);
767         } else {
768             sprintf(buf, "Received disconnect message (unknown type %d)",
769                     reason);
770         }
771         logevent(buf);
772         strcpy(buf, "Disconnection message text: ");
773         nowlen = strlen(buf);
774         if (msglen > sizeof(buf) - nowlen - 1)
775             msglen = sizeof(buf) - nowlen - 1;
776         memcpy(buf + nowlen, pktin.data + 14, msglen);
777         buf[nowlen + msglen] = '\0';
778         logevent(buf);
779     }
780
781     crFinish(0);
782 }
783
784 static void ssh1_pktout_size(int len)
785 {
786     int pad, biglen;
787
788     len += 5;                          /* type and CRC */
789     pad = 8 - (len % 8);
790     biglen = len + pad;
791
792     pktout.length = len - 5;
793     if (pktout.maxlen < biglen) {
794         pktout.maxlen = biglen;
795 #ifdef MSCRYPTOAPI
796         /* Allocate enough buffer space for extra block
797          * for MS CryptEncrypt() */
798         pktout.data = (pktout.data == NULL ? smalloc(biglen + 12) :
799                        srealloc(pktout.data, biglen + 12));
800 #else
801         pktout.data = (pktout.data == NULL ? smalloc(biglen + 4) :
802                        srealloc(pktout.data, biglen + 4));
803 #endif
804         if (!pktout.data)
805             fatalbox("Out of memory");
806     }
807     pktout.body = pktout.data + 4 + pad + 1;
808 }
809
810 static void s_wrpkt_start(int type, int len)
811 {
812     ssh1_pktout_size(len);
813     pktout.type = type;
814 }
815
816 static int s_wrpkt_prepare(void)
817 {
818     int pad, len, biglen, i;
819     unsigned long crc;
820
821     pktout.body[-1] = pktout.type;
822
823 #ifdef DUMP_PACKETS
824     debug(("Packet payload pre-compression:\n"));
825     dmemdump(pktout.body - 1, pktout.length + 1);
826 #endif
827
828     if (ssh1_compressing) {
829         unsigned char *compblk;
830         int complen;
831         zlib_compress_block(pktout.body - 1, pktout.length + 1,
832                             &compblk, &complen);
833         ssh1_pktout_size(complen - 1);
834         memcpy(pktout.body - 1, compblk, complen);
835         sfree(compblk);
836 #ifdef DUMP_PACKETS
837         debug(("Packet payload post-compression:\n"));
838         dmemdump(pktout.body - 1, pktout.length + 1);
839 #endif
840     }
841
842     len = pktout.length + 5;           /* type and CRC */
843     pad = 8 - (len % 8);
844     biglen = len + pad;
845
846     for (i = 0; i < pad; i++)
847         pktout.data[i + 4] = random_byte();
848     crc = crc32(pktout.data + 4, biglen - 4);
849     PUT_32BIT(pktout.data + biglen, crc);
850     PUT_32BIT(pktout.data, len);
851
852 #ifdef DUMP_PACKETS
853     debug(("Sending packet len=%d\n", biglen + 4));
854     dmemdump(pktout.data, biglen + 4);
855 #endif
856     if (cipher)
857         cipher->encrypt(pktout.data + 4, biglen);
858
859     return biglen + 4;
860 }
861
862 static void s_wrpkt(void)
863 {
864     int len;
865     len = s_wrpkt_prepare();
866     sk_write(s, pktout.data, len);
867 }
868
869 static void s_wrpkt_defer(void)
870 {
871     int len;
872     len = s_wrpkt_prepare();
873     if (deferred_len + len > deferred_size) {
874         deferred_size = deferred_len + len + 128;
875         deferred_send_data = srealloc(deferred_send_data, deferred_size);
876     }
877     memcpy(deferred_send_data + deferred_len, pktout.data, len);
878     deferred_len += len;
879 }
880
881 /*
882  * Construct a packet with the specified contents.
883  */
884 static void construct_packet(int pkttype, va_list ap1, va_list ap2)
885 {
886     unsigned char *p, *argp, argchar;
887     unsigned long argint;
888     int pktlen, argtype, arglen;
889     Bignum bn;
890
891     pktlen = 0;
892     while ((argtype = va_arg(ap1, int)) != PKT_END) {
893         switch (argtype) {
894           case PKT_INT:
895             (void) va_arg(ap1, int);
896             pktlen += 4;
897             break;
898           case PKT_CHAR:
899             (void) va_arg(ap1, char);
900             pktlen++;
901             break;
902           case PKT_DATA:
903             (void) va_arg(ap1, unsigned char *);
904             arglen = va_arg(ap1, int);
905             pktlen += arglen;
906             break;
907           case PKT_STR:
908             argp = va_arg(ap1, unsigned char *);
909             arglen = strlen(argp);
910             pktlen += 4 + arglen;
911             break;
912           case PKT_BIGNUM:
913             bn = va_arg(ap1, Bignum);
914             pktlen += ssh1_bignum_length(bn);
915             break;
916           default:
917             assert(0);
918         }
919     }
920
921     s_wrpkt_start(pkttype, pktlen);
922     p = pktout.body;
923
924     while ((argtype = va_arg(ap2, int)) != PKT_END) {
925         switch (argtype) {
926           case PKT_INT:
927             argint = va_arg(ap2, int);
928             PUT_32BIT(p, argint);
929             p += 4;
930             break;
931           case PKT_CHAR:
932             argchar = va_arg(ap2, unsigned char);
933             *p = argchar;
934             p++;
935             break;
936           case PKT_DATA:
937             argp = va_arg(ap2, unsigned char *);
938             arglen = va_arg(ap2, int);
939             memcpy(p, argp, arglen);
940             p += arglen;
941             break;
942           case PKT_STR:
943             argp = va_arg(ap2, unsigned char *);
944             arglen = strlen(argp);
945             PUT_32BIT(p, arglen);
946             memcpy(p + 4, argp, arglen);
947             p += 4 + arglen;
948             break;
949           case PKT_BIGNUM:
950             bn = va_arg(ap2, Bignum);
951             p += ssh1_write_bignum(p, bn);
952             break;
953         }
954     }
955 }
956
957 static void send_packet(int pkttype, ...)
958 {
959     va_list ap1, ap2;
960     va_start(ap1, pkttype);
961     va_start(ap2, pkttype);
962     construct_packet(pkttype, ap1, ap2);
963     s_wrpkt();
964 }
965
966 static void defer_packet(int pkttype, ...)
967 {
968     va_list ap1, ap2;
969     va_start(ap1, pkttype);
970     va_start(ap2, pkttype);
971     construct_packet(pkttype, ap1, ap2);
972     s_wrpkt_defer();
973 }
974
975 static int ssh_versioncmp(char *a, char *b)
976 {
977     char *ae, *be;
978     unsigned long av, bv;
979
980     av = strtoul(a, &ae, 10);
981     bv = strtoul(b, &be, 10);
982     if (av != bv)
983         return (av < bv ? -1 : +1);
984     if (*ae == '.')
985         ae++;
986     if (*be == '.')
987         be++;
988     av = strtoul(ae, &ae, 10);
989     bv = strtoul(be, &be, 10);
990     if (av != bv)
991         return (av < bv ? -1 : +1);
992     return 0;
993 }
994
995
996 /*
997  * Utility routines for putting an SSH-protocol `string' and
998  * `uint32' into a SHA state.
999  */
1000 #include <stdio.h>
1001 static void sha_string(SHA_State * s, void *str, int len)
1002 {
1003     unsigned char lenblk[4];
1004     PUT_32BIT(lenblk, len);
1005     SHA_Bytes(s, lenblk, 4);
1006     SHA_Bytes(s, str, len);
1007 }
1008
1009 static void sha_uint32(SHA_State * s, unsigned i)
1010 {
1011     unsigned char intblk[4];
1012     PUT_32BIT(intblk, i);
1013     SHA_Bytes(s, intblk, 4);
1014 }
1015
1016 /*
1017  * SSH2 packet construction functions.
1018  */
1019 static void ssh2_pkt_ensure(int length)
1020 {
1021     if (pktout.maxlen < length) {
1022         pktout.maxlen = length + 256;
1023         pktout.data =
1024             (pktout.data ==
1025              NULL ? smalloc(pktout.maxlen +
1026                             APIEXTRA) : srealloc(pktout.data,
1027                                                  pktout.maxlen +
1028                                                  APIEXTRA));
1029         if (!pktout.data)
1030             fatalbox("Out of memory");
1031     }
1032 }
1033 static void ssh2_pkt_adddata(void *data, int len)
1034 {
1035     pktout.length += len;
1036     ssh2_pkt_ensure(pktout.length);
1037     memcpy(pktout.data + pktout.length - len, data, len);
1038 }
1039 static void ssh2_pkt_addbyte(unsigned char byte)
1040 {
1041     ssh2_pkt_adddata(&byte, 1);
1042 }
1043 static void ssh2_pkt_init(int pkt_type)
1044 {
1045     pktout.length = 5;
1046     ssh2_pkt_addbyte((unsigned char) pkt_type);
1047 }
1048 static void ssh2_pkt_addbool(unsigned char value)
1049 {
1050     ssh2_pkt_adddata(&value, 1);
1051 }
1052 static void ssh2_pkt_adduint32(unsigned long value)
1053 {
1054     unsigned char x[4];
1055     PUT_32BIT(x, value);
1056     ssh2_pkt_adddata(x, 4);
1057 }
1058 static void ssh2_pkt_addstring_start(void)
1059 {
1060     ssh2_pkt_adduint32(0);
1061     pktout.savedpos = pktout.length;
1062 }
1063 static void ssh2_pkt_addstring_str(char *data)
1064 {
1065     ssh2_pkt_adddata(data, strlen(data));
1066     PUT_32BIT(pktout.data + pktout.savedpos - 4,
1067               pktout.length - pktout.savedpos);
1068 }
1069 static void ssh2_pkt_addstring_data(char *data, int len)
1070 {
1071     ssh2_pkt_adddata(data, len);
1072     PUT_32BIT(pktout.data + pktout.savedpos - 4,
1073               pktout.length - pktout.savedpos);
1074 }
1075 static void ssh2_pkt_addstring(char *data)
1076 {
1077     ssh2_pkt_addstring_start();
1078     ssh2_pkt_addstring_str(data);
1079 }
1080 static char *ssh2_mpint_fmt(Bignum b, int *len)
1081 {
1082     unsigned char *p;
1083     int i, n = (bignum_bitcount(b) + 7) / 8;
1084     p = smalloc(n + 1);
1085     if (!p)
1086         fatalbox("out of memory");
1087     p[0] = 0;
1088     for (i = 1; i <= n; i++)
1089         p[i] = bignum_byte(b, n - i);
1090     i = 0;
1091     while (i <= n && p[i] == 0 && (p[i + 1] & 0x80) == 0)
1092         i++;
1093     memmove(p, p + i, n + 1 - i);
1094     *len = n + 1 - i;
1095     return p;
1096 }
1097 static void ssh2_pkt_addmp(Bignum b)
1098 {
1099     unsigned char *p;
1100     int len;
1101     p = ssh2_mpint_fmt(b, &len);
1102     ssh2_pkt_addstring_start();
1103     ssh2_pkt_addstring_data(p, len);
1104     sfree(p);
1105 }
1106
1107 /*
1108  * Construct an SSH2 final-form packet: compress it, encrypt it,
1109  * put the MAC on it. Final packet, ready to be sent, is stored in
1110  * pktout.data. Total length is returned.
1111  */
1112 static int ssh2_pkt_construct(void)
1113 {
1114     int cipherblk, maclen, padding, i;
1115     static unsigned long outgoing_sequence = 0;
1116
1117     /*
1118      * Compress packet payload.
1119      */
1120 #ifdef DUMP_PACKETS
1121     debug(("Pre-compression payload:\n"));
1122     dmemdump(pktout.data + 5, pktout.length - 5);
1123 #endif
1124     {
1125         unsigned char *newpayload;
1126         int newlen;
1127         if (cscomp && cscomp->compress(pktout.data + 5, pktout.length - 5,
1128                                        &newpayload, &newlen)) {
1129             pktout.length = 5;
1130             ssh2_pkt_adddata(newpayload, newlen);
1131             sfree(newpayload);
1132         }
1133     }
1134
1135     /*
1136      * Add padding. At least four bytes, and must also bring total
1137      * length (minus MAC) up to a multiple of the block size.
1138      */
1139     cipherblk = cscipher ? cscipher->blksize : 8;       /* block size */
1140     cipherblk = cipherblk < 8 ? 8 : cipherblk;  /* or 8 if blksize < 8 */
1141     padding = 4;
1142     padding +=
1143         (cipherblk - (pktout.length + padding) % cipherblk) % cipherblk;
1144     maclen = csmac ? csmac->len : 0;
1145     ssh2_pkt_ensure(pktout.length + padding + maclen);
1146     pktout.data[4] = padding;
1147     for (i = 0; i < padding; i++)
1148         pktout.data[pktout.length + i] = random_byte();
1149     PUT_32BIT(pktout.data, pktout.length + padding - 4);
1150     if (csmac)
1151         csmac->generate(pktout.data, pktout.length + padding,
1152                         outgoing_sequence);
1153     outgoing_sequence++;               /* whether or not we MACed */
1154
1155 #ifdef DUMP_PACKETS
1156     debug(("Sending packet len=%d\n", pktout.length + padding));
1157     dmemdump(pktout.data, pktout.length + padding);
1158 #endif
1159
1160     if (cscipher)
1161         cscipher->encrypt(pktout.data, pktout.length + padding);
1162
1163     /* Ready-to-send packet starts at pktout.data. We return length. */
1164     return pktout.length + padding + maclen;
1165 }
1166
1167 /*
1168  * Construct and send an SSH2 packet immediately.
1169  */
1170 static void ssh2_pkt_send(void)
1171 {
1172     int len = ssh2_pkt_construct();
1173     sk_write(s, pktout.data, len);
1174 }
1175
1176 /*
1177  * Construct an SSH2 packet and add it to a deferred data block.
1178  * Useful for sending multiple packets in a single sk_write() call,
1179  * to prevent a traffic-analysing listener from being able to work
1180  * out the length of any particular packet (such as the password
1181  * packet).
1182  * 
1183  * Note that because SSH2 sequence-numbers its packets, this can
1184  * NOT be used as an m4-style `defer' allowing packets to be
1185  * constructed in one order and sent in another.
1186  */
1187 static void ssh2_pkt_defer(void)
1188 {
1189     int len = ssh2_pkt_construct();
1190     if (deferred_len + len > deferred_size) {
1191         deferred_size = deferred_len + len + 128;
1192         deferred_send_data = srealloc(deferred_send_data, deferred_size);
1193     }
1194     memcpy(deferred_send_data + deferred_len, pktout.data, len);
1195     deferred_len += len;
1196 }
1197
1198 /*
1199  * Send the whole deferred data block constructed by
1200  * ssh2_pkt_defer() or SSH1's defer_packet().
1201  */
1202 static void ssh_pkt_defersend(void)
1203 {
1204     sk_write(s, deferred_send_data, deferred_len);
1205     deferred_len = deferred_size = 0;
1206     sfree(deferred_send_data);
1207     deferred_send_data = NULL;
1208 }
1209
1210 #if 0
1211 void bndebug(char *string, Bignum b)
1212 {
1213     unsigned char *p;
1214     int i, len;
1215     p = ssh2_mpint_fmt(b, &len);
1216     debug(("%s", string));
1217     for (i = 0; i < len; i++)
1218         debug((" %02x", p[i]));
1219     debug(("\n"));
1220     sfree(p);
1221 }
1222 #endif
1223
1224 static void sha_mpint(SHA_State * s, Bignum b)
1225 {
1226     unsigned char *p;
1227     int len;
1228     p = ssh2_mpint_fmt(b, &len);
1229     sha_string(s, p, len);
1230     sfree(p);
1231 }
1232
1233 /*
1234  * SSH2 packet decode functions.
1235  */
1236 static unsigned long ssh2_pkt_getuint32(void)
1237 {
1238     unsigned long value;
1239     if (pktin.length - pktin.savedpos < 4)
1240         return 0;                      /* arrgh, no way to decline (FIXME?) */
1241     value = GET_32BIT(pktin.data + pktin.savedpos);
1242     pktin.savedpos += 4;
1243     return value;
1244 }
1245 static int ssh2_pkt_getbool(void)
1246 {
1247     unsigned long value;
1248     if (pktin.length - pktin.savedpos < 1)
1249         return 0;                      /* arrgh, no way to decline (FIXME?) */
1250     value = pktin.data[pktin.savedpos] != 0;
1251     pktin.savedpos++;
1252     return value;
1253 }
1254 static void ssh2_pkt_getstring(char **p, int *length)
1255 {
1256     *p = NULL;
1257     if (pktin.length - pktin.savedpos < 4)
1258         return;
1259     *length = GET_32BIT(pktin.data + pktin.savedpos);
1260     pktin.savedpos += 4;
1261     if (pktin.length - pktin.savedpos < *length)
1262         return;
1263     *p = pktin.data + pktin.savedpos;
1264     pktin.savedpos += *length;
1265 }
1266 static Bignum ssh2_pkt_getmp(void)
1267 {
1268     char *p;
1269     int length;
1270     Bignum b;
1271
1272     ssh2_pkt_getstring(&p, &length);
1273     if (!p)
1274         return NULL;
1275     if (p[0] & 0x80) {
1276         bombout(("internal error: Can't handle negative mpints"));
1277         return NULL;
1278     }
1279     b = bignum_from_bytes(p, length);
1280     return b;
1281 }
1282
1283 /*
1284  * Examine the remote side's version string and compare it against
1285  * a list of known buggy implementations.
1286  */
1287 static void ssh_detect_bugs(char *vstring)
1288 {
1289     char *imp;                         /* pointer to implementation part */
1290     imp = vstring;
1291     imp += strcspn(imp, "-");
1292     if (*imp)
1293         imp++;
1294     imp += strcspn(imp, "-");
1295     if (*imp)
1296         imp++;
1297
1298     ssh_remote_bugs = 0;
1299
1300     if (!strcmp(imp, "1.2.18") || !strcmp(imp, "1.2.19") ||
1301         !strcmp(imp, "1.2.20") || !strcmp(imp, "1.2.21") ||
1302         !strcmp(imp, "1.2.22")) {
1303         /*
1304          * These versions don't support SSH1_MSG_IGNORE, so we have
1305          * to use a different defence against password length
1306          * sniffing.
1307          */
1308         ssh_remote_bugs |= BUG_CHOKES_ON_SSH1_IGNORE;
1309         logevent("We believe remote version has SSH1 ignore bug");
1310     }
1311
1312     if (!strncmp(imp, "2.1.0", 5) || !strncmp(imp, "2.0.", 4) ||
1313         !strncmp(imp, "2.2.0", 5) || !strncmp(imp, "2.3.0", 5) ||
1314         !strncmp(imp, "2.1 ", 4)) {
1315         /*
1316          * These versions have the HMAC bug.
1317          */
1318         ssh_remote_bugs |= BUG_SSH2_HMAC;
1319         logevent("We believe remote version has SSH2 HMAC bug");
1320     }
1321 }
1322
1323 static int do_ssh_init(unsigned char c)
1324 {
1325     static int vslen;
1326     static char version[10];
1327     static char *vstring;
1328     static int vstrsize;
1329     static char *vlog;
1330     static int i;
1331
1332     crBegin;
1333
1334     /* Search for the string "SSH-" in the input. */
1335     i = 0;
1336     while (1) {
1337         static const int transS[] = { 1, 2, 2, 1 };
1338         static const int transH[] = { 0, 0, 3, 0 };
1339         static const int transminus[] = { 0, 0, 0, -1 };
1340         if (c == 'S')
1341             i = transS[i];
1342         else if (c == 'H')
1343             i = transH[i];
1344         else if (c == '-')
1345             i = transminus[i];
1346         else
1347             i = 0;
1348         if (i < 0)
1349             break;
1350         crReturn(1);                   /* get another character */
1351     }
1352
1353     vstring = smalloc(16);
1354     vstrsize = 16;
1355     strcpy(vstring, "SSH-");
1356     vslen = 4;
1357     i = 0;
1358     while (1) {
1359         crReturn(1);                   /* get another char */
1360         if (vslen >= vstrsize - 1) {
1361             vstrsize += 16;
1362             vstring = srealloc(vstring, vstrsize);
1363         }
1364         vstring[vslen++] = c;
1365         if (i >= 0) {
1366             if (c == '-') {
1367                 version[i] = '\0';
1368                 i = -1;
1369             } else if (i < sizeof(version) - 1)
1370                 version[i++] = c;
1371         } else if (c == '\n')
1372             break;
1373     }
1374
1375     ssh_agentfwd_enabled = FALSE;
1376     rdpkt2_state.incoming_sequence = 0;
1377
1378     vstring[vslen] = 0;
1379     vlog = smalloc(20 + vslen);
1380     sprintf(vlog, "Server version: %s", vstring);
1381     ssh_detect_bugs(vstring);
1382     vlog[strcspn(vlog, "\r\n")] = '\0';
1383     logevent(vlog);
1384     sfree(vlog);
1385
1386     /*
1387      * Server version "1.99" means we can choose whether we use v1
1388      * or v2 protocol. Choice is based on cfg.sshprot.
1389      */
1390     if (ssh_versioncmp(version, cfg.sshprot == 1 ? "2.0" : "1.99") >= 0) {
1391         /*
1392          * This is a v2 server. Begin v2 protocol.
1393          */
1394         char verstring[80], vlog[100];
1395         sprintf(verstring, "SSH-2.0-%s", sshver);
1396         SHA_Init(&exhashbase);
1397         /*
1398          * Hash our version string and their version string.
1399          */
1400         sha_string(&exhashbase, verstring, strlen(verstring));
1401         sha_string(&exhashbase, vstring, strcspn(vstring, "\r\n"));
1402         sprintf(vlog, "We claim version: %s", verstring);
1403         logevent(vlog);
1404         strcat(verstring, "\n");
1405         logevent("Using SSH protocol version 2");
1406         sk_write(s, verstring, strlen(verstring));
1407         ssh_protocol = ssh2_protocol;
1408         ssh_version = 2;
1409         s_rdpkt = ssh2_rdpkt;
1410     } else {
1411         /*
1412          * This is a v1 server. Begin v1 protocol.
1413          */
1414         char verstring[80], vlog[100];
1415         sprintf(verstring, "SSH-%s-%s",
1416                 (ssh_versioncmp(version, "1.5") <= 0 ? version : "1.5"),
1417                 sshver);
1418         sprintf(vlog, "We claim version: %s", verstring);
1419         logevent(vlog);
1420         strcat(verstring, "\n");
1421         logevent("Using SSH protocol version 1");
1422         sk_write(s, verstring, strlen(verstring));
1423         ssh_protocol = ssh1_protocol;
1424         ssh_version = 1;
1425         s_rdpkt = ssh1_rdpkt;
1426     }
1427     ssh_state = SSH_STATE_BEFORE_SIZE;
1428
1429     sfree(vstring);
1430
1431     crFinish(0);
1432 }
1433
1434 static void ssh_gotdata(unsigned char *data, int datalen)
1435 {
1436     crBegin;
1437
1438     /*
1439      * To begin with, feed the characters one by one to the
1440      * protocol initialisation / selection function do_ssh_init().
1441      * When that returns 0, we're done with the initial greeting
1442      * exchange and can move on to packet discipline.
1443      */
1444     while (1) {
1445         int ret;
1446         if (datalen == 0)
1447             crReturnV;                 /* more data please */
1448         ret = do_ssh_init(*data);
1449         data++;
1450         datalen--;
1451         if (ret == 0)
1452             break;
1453     }
1454
1455     /*
1456      * We emerge from that loop when the initial negotiation is
1457      * over and we have selected an s_rdpkt function. Now pass
1458      * everything to s_rdpkt, and then pass the resulting packets
1459      * to the proper protocol handler.
1460      */
1461     if (datalen == 0)
1462         crReturnV;
1463     while (1) {
1464         while (datalen > 0) {
1465             if (s_rdpkt(&data, &datalen) == 0) {
1466                 ssh_protocol(NULL, 0, 1);
1467                 if (ssh_state == SSH_STATE_CLOSED) {
1468                     return;
1469                 }
1470             }
1471         }
1472         crReturnV;
1473     }
1474     crFinishV;
1475 }
1476
1477 static int ssh_closing(Plug plug, char *error_msg, int error_code,
1478                        int calling_back)
1479 {
1480     ssh_state = SSH_STATE_CLOSED;
1481     sk_close(s);
1482     s = NULL;
1483     if (error_msg) {
1484         /* A socket error has occurred. */
1485         connection_fatal(error_msg);
1486     } else {
1487         /* Otherwise, the remote side closed the connection normally. */
1488     }
1489     return 0;
1490 }
1491
1492 static int ssh_receive(Plug plug, int urgent, char *data, int len)
1493 {
1494     ssh_gotdata(data, len);
1495     if (ssh_state == SSH_STATE_CLOSED) {
1496         if (s) {
1497             sk_close(s);
1498             s = NULL;
1499         }
1500         return 0;
1501     }
1502     return 1;
1503 }
1504
1505 /*
1506  * Connect to specified host and port.
1507  * Returns an error message, or NULL on success.
1508  * Also places the canonical host name into `realhost'. It must be
1509  * freed by the caller.
1510  */
1511 static char *connect_to_host(char *host, int port, char **realhost)
1512 {
1513     static struct plug_function_table fn_table = {
1514         ssh_closing,
1515         ssh_receive
1516     }, *fn_table_ptr = &fn_table;
1517
1518     SockAddr addr;
1519     char *err;
1520 #ifdef FWHACK
1521     char *FWhost;
1522     int FWport;
1523 #endif
1524
1525     savedhost = smalloc(1 + strlen(host));
1526     if (!savedhost)
1527         fatalbox("Out of memory");
1528     strcpy(savedhost, host);
1529
1530     if (port < 0)
1531         port = 22;                     /* default ssh port */
1532     savedport = port;
1533
1534 #ifdef FWHACK
1535     FWhost = host;
1536     FWport = port;
1537     host = FWSTR;
1538     port = 23;
1539 #endif
1540
1541     /*
1542      * Try to find host.
1543      */
1544     addr = sk_namelookup(host, realhost);
1545     if ((err = sk_addr_error(addr)))
1546         return err;
1547
1548 #ifdef FWHACK
1549     *realhost = strdup(FWhost);
1550 #endif
1551
1552     /*
1553      * Open socket.
1554      */
1555     s = sk_new(addr, port, 0, 1, &fn_table_ptr);
1556     if ((err = sk_socket_error(s)))
1557         return err;
1558
1559 #ifdef FWHACK
1560     sk_write(s, "connect ", 8);
1561     sk_write(s, FWhost, strlen(FWhost));
1562     {
1563         char buf[20];
1564         sprintf(buf, " %d\n", FWport);
1565         sk_write(s, buf, strlen(buf));
1566     }
1567 #endif
1568
1569     return NULL;
1570 }
1571
1572 /*
1573  * Handle the key exchange and user authentication phases.
1574  */
1575 static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
1576 {
1577     int i, j;
1578     static int len;
1579     static unsigned char *rsabuf, *keystr1, *keystr2;
1580     unsigned char cookie[8];
1581     struct RSAKey servkey, hostkey;
1582     struct MD5Context md5c;
1583     static unsigned long supported_ciphers_mask, supported_auths_mask;
1584     static int tried_publickey;
1585     static unsigned char session_id[16];
1586     static int cipher_type;
1587     static char username[100];
1588
1589     crBegin;
1590
1591     if (!ispkt)
1592         crWaitUntil(ispkt);
1593
1594     if (pktin.type != SSH1_SMSG_PUBLIC_KEY) {
1595         bombout(("Public key packet not received"));
1596         crReturn(0);
1597     }
1598
1599     logevent("Received public keys");
1600
1601     memcpy(cookie, pktin.body, 8);
1602
1603     i = makekey(pktin.body + 8, &servkey, &keystr1, 0);
1604     j = makekey(pktin.body + 8 + i, &hostkey, &keystr2, 0);
1605
1606     /*
1607      * Log the host key fingerprint.
1608      */
1609     {
1610         char logmsg[80];
1611         logevent("Host key fingerprint is:");
1612         strcpy(logmsg, "      ");
1613         hostkey.comment = NULL;
1614         rsa_fingerprint(logmsg + strlen(logmsg),
1615                         sizeof(logmsg) - strlen(logmsg), &hostkey);
1616         logevent(logmsg);
1617     }
1618
1619     ssh1_remote_protoflags = GET_32BIT(pktin.body + 8 + i + j);
1620     supported_ciphers_mask = GET_32BIT(pktin.body + 12 + i + j);
1621     supported_auths_mask = GET_32BIT(pktin.body + 16 + i + j);
1622
1623     ssh1_local_protoflags =
1624         ssh1_remote_protoflags & SSH1_PROTOFLAGS_SUPPORTED;
1625     ssh1_local_protoflags |= SSH1_PROTOFLAG_SCREEN_NUMBER;
1626
1627     MD5Init(&md5c);
1628     MD5Update(&md5c, keystr2, hostkey.bytes);
1629     MD5Update(&md5c, keystr1, servkey.bytes);
1630     MD5Update(&md5c, pktin.body, 8);
1631     MD5Final(session_id, &md5c);
1632
1633     for (i = 0; i < 32; i++)
1634         session_key[i] = random_byte();
1635
1636     len = (hostkey.bytes > servkey.bytes ? hostkey.bytes : servkey.bytes);
1637
1638     rsabuf = smalloc(len);
1639     if (!rsabuf)
1640         fatalbox("Out of memory");
1641
1642     /*
1643      * Verify the host key.
1644      */
1645     {
1646         /*
1647          * First format the key into a string.
1648          */
1649         int len = rsastr_len(&hostkey);
1650         char fingerprint[100];
1651         char *keystr = smalloc(len);
1652         if (!keystr)
1653             fatalbox("Out of memory");
1654         rsastr_fmt(keystr, &hostkey);
1655         rsa_fingerprint(fingerprint, sizeof(fingerprint), &hostkey);
1656         verify_ssh_host_key(savedhost, savedport, "rsa", keystr,
1657                             fingerprint);
1658         sfree(keystr);
1659     }
1660
1661     for (i = 0; i < 32; i++) {
1662         rsabuf[i] = session_key[i];
1663         if (i < 16)
1664             rsabuf[i] ^= session_id[i];
1665     }
1666
1667     if (hostkey.bytes > servkey.bytes) {
1668         rsaencrypt(rsabuf, 32, &servkey);
1669         rsaencrypt(rsabuf, servkey.bytes, &hostkey);
1670     } else {
1671         rsaencrypt(rsabuf, 32, &hostkey);
1672         rsaencrypt(rsabuf, hostkey.bytes, &servkey);
1673     }
1674
1675     logevent("Encrypted session key");
1676
1677     switch (cfg.cipher) {
1678       case CIPHER_BLOWFISH:
1679         cipher_type = SSH_CIPHER_BLOWFISH;
1680         break;
1681       case CIPHER_DES:
1682         cipher_type = SSH_CIPHER_DES;
1683         break;
1684       case CIPHER_3DES:
1685         cipher_type = SSH_CIPHER_3DES;
1686         break;
1687       case CIPHER_AES:
1688         c_write_str("AES not supported in SSH1, falling back to 3DES\r\n");
1689         cipher_type = SSH_CIPHER_3DES;
1690         break;
1691     }
1692     if ((supported_ciphers_mask & (1 << cipher_type)) == 0) {
1693         c_write_str
1694             ("Selected cipher not supported, falling back to 3DES\r\n");
1695         cipher_type = SSH_CIPHER_3DES;
1696         if ((supported_ciphers_mask & (1 << cipher_type)) == 0) {
1697             bombout(("Server violates SSH 1 protocol by "
1698                      "not supporting 3DES encryption"));
1699             crReturn(0);
1700         }
1701     }
1702     switch (cipher_type) {
1703       case SSH_CIPHER_3DES:
1704         logevent("Using 3DES encryption");
1705         break;
1706       case SSH_CIPHER_DES:
1707         logevent("Using single-DES encryption");
1708         break;
1709       case SSH_CIPHER_BLOWFISH:
1710         logevent("Using Blowfish encryption");
1711         break;
1712     }
1713
1714     send_packet(SSH1_CMSG_SESSION_KEY,
1715                 PKT_CHAR, cipher_type,
1716                 PKT_DATA, cookie, 8,
1717                 PKT_CHAR, (len * 8) >> 8, PKT_CHAR, (len * 8) & 0xFF,
1718                 PKT_DATA, rsabuf, len,
1719                 PKT_INT, ssh1_local_protoflags, PKT_END);
1720
1721     logevent("Trying to enable encryption...");
1722
1723     sfree(rsabuf);
1724
1725     cipher = cipher_type == SSH_CIPHER_BLOWFISH ? &ssh_blowfish_ssh1 :
1726         cipher_type == SSH_CIPHER_DES ? &ssh_des : &ssh_3des;
1727     cipher->sesskey(session_key);
1728
1729     crWaitUntil(ispkt);
1730
1731     if (pktin.type != SSH1_SMSG_SUCCESS) {
1732         bombout(("Encryption not successfully enabled"));
1733         crReturn(0);
1734     }
1735
1736     logevent("Successfully started encryption");
1737
1738     fflush(stdout);
1739     {
1740         static int pos = 0;
1741         static char c;
1742         if ((flags & FLAG_INTERACTIVE) && !*cfg.username) {
1743             if (ssh_get_line) {
1744                 if (!ssh_get_line("login as: ",
1745                                   username, sizeof(username), FALSE)) {
1746                     /*
1747                      * get_line failed to get a username.
1748                      * Terminate.
1749                      */
1750                     logevent("No username provided. Abandoning session.");
1751                     ssh_state = SSH_STATE_CLOSED;
1752                     crReturn(1);
1753                 }
1754             } else {
1755                 c_write_str("login as: ");
1756                 ssh_send_ok = 1;
1757                 while (pos >= 0) {
1758                     crWaitUntil(!ispkt);
1759                     while (inlen--)
1760                         switch (c = *in++) {
1761                           case 10:
1762                           case 13:
1763                             username[pos] = 0;
1764                             pos = -1;
1765                             break;
1766                           case 8:
1767                           case 127:
1768                             if (pos > 0) {
1769                                 c_write_str("\b \b");
1770                                 pos--;
1771                             }
1772                             break;
1773                           case 21:
1774                           case 27:
1775                             while (pos > 0) {
1776                                 c_write_str("\b \b");
1777                                 pos--;
1778                             }
1779                             break;
1780                           case 3:
1781                           case 4:
1782                             random_save_seed();
1783                             exit(0);
1784                             break;
1785                           default:
1786                             if (((c >= ' ' && c <= '~') ||
1787                                  ((unsigned char) c >= 160))
1788                                 && pos < sizeof(username)-1) {
1789                                 username[pos++] = c;
1790                                 c_write(&c, 1);
1791                             }
1792                             break;
1793                         }
1794                 }
1795                 c_write_str("\r\n");
1796                 username[strcspn(username, "\n\r")] = '\0';
1797             }
1798         } else {
1799             strncpy(username, cfg.username, 99);
1800             username[99] = '\0';
1801         }
1802
1803         send_packet(SSH1_CMSG_USER, PKT_STR, username, PKT_END);
1804         {
1805             char userlog[22 + sizeof(username)];
1806             sprintf(userlog, "Sent username \"%s\"", username);
1807             logevent(userlog);
1808             if (flags & FLAG_INTERACTIVE &&
1809                 (!((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)))) {
1810                 strcat(userlog, "\r\n");
1811                 c_write_str(userlog);
1812             }
1813         }
1814     }
1815
1816     crWaitUntil(ispkt);
1817
1818     tried_publickey = 0;
1819
1820     while (pktin.type == SSH1_SMSG_FAILURE) {
1821         static char password[100];
1822         static char prompt[200];
1823         static int pos;
1824         static char c;
1825         static int pwpkt_type;
1826         /*
1827          * Show password prompt, having first obtained it via a TIS
1828          * or CryptoCard exchange if we're doing TIS or CryptoCard
1829          * authentication.
1830          */
1831         pwpkt_type = SSH1_CMSG_AUTH_PASSWORD;
1832         if (agent_exists()) {
1833             /*
1834              * Attempt RSA authentication using Pageant.
1835              */
1836             static unsigned char request[5], *response, *p;
1837             static int responselen;
1838             static int i, nkeys;
1839             static int authed = FALSE;
1840             void *r;
1841
1842             logevent("Pageant is running. Requesting keys.");
1843
1844             /* Request the keys held by the agent. */
1845             PUT_32BIT(request, 1);
1846             request[4] = SSH1_AGENTC_REQUEST_RSA_IDENTITIES;
1847             agent_query(request, 5, &r, &responselen);
1848             response = (unsigned char *) r;
1849             if (response && responselen >= 5 &&
1850                 response[4] == SSH1_AGENT_RSA_IDENTITIES_ANSWER) {
1851                 p = response + 5;
1852                 nkeys = GET_32BIT(p);
1853                 p += 4;
1854                 {
1855                     char buf[64];
1856                     sprintf(buf, "Pageant has %d SSH1 keys", nkeys);
1857                     logevent(buf);
1858                 }
1859                 for (i = 0; i < nkeys; i++) {
1860                     static struct RSAKey key;
1861                     static Bignum challenge;
1862                     static char *commentp;
1863                     static int commentlen;
1864
1865                     {
1866                         char buf[64];
1867                         sprintf(buf, "Trying Pageant key #%d", i);
1868                         logevent(buf);
1869                     }
1870                     p += 4;
1871                     p += ssh1_read_bignum(p, &key.exponent);
1872                     p += ssh1_read_bignum(p, &key.modulus);
1873                     commentlen = GET_32BIT(p);
1874                     p += 4;
1875                     commentp = p;
1876                     p += commentlen;
1877                     send_packet(SSH1_CMSG_AUTH_RSA,
1878                                 PKT_BIGNUM, key.modulus, PKT_END);
1879                     crWaitUntil(ispkt);
1880                     if (pktin.type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {
1881                         logevent("Key refused");
1882                         continue;
1883                     }
1884                     logevent("Received RSA challenge");
1885                     ssh1_read_bignum(pktin.body, &challenge);
1886                     {
1887                         char *agentreq, *q, *ret;
1888                         void *vret;
1889                         int len, retlen;
1890                         len = 1 + 4;   /* message type, bit count */
1891                         len += ssh1_bignum_length(key.exponent);
1892                         len += ssh1_bignum_length(key.modulus);
1893                         len += ssh1_bignum_length(challenge);
1894                         len += 16;     /* session id */
1895                         len += 4;      /* response format */
1896                         agentreq = smalloc(4 + len);
1897                         PUT_32BIT(agentreq, len);
1898                         q = agentreq + 4;
1899                         *q++ = SSH1_AGENTC_RSA_CHALLENGE;
1900                         PUT_32BIT(q, bignum_bitcount(key.modulus));
1901                         q += 4;
1902                         q += ssh1_write_bignum(q, key.exponent);
1903                         q += ssh1_write_bignum(q, key.modulus);
1904                         q += ssh1_write_bignum(q, challenge);
1905                         memcpy(q, session_id, 16);
1906                         q += 16;
1907                         PUT_32BIT(q, 1);        /* response format */
1908                         agent_query(agentreq, len + 4, &vret, &retlen);
1909                         ret = vret;
1910                         sfree(agentreq);
1911                         if (ret) {
1912                             if (ret[4] == SSH1_AGENT_RSA_RESPONSE) {
1913                                 logevent("Sending Pageant's response");
1914                                 send_packet(SSH1_CMSG_AUTH_RSA_RESPONSE,
1915                                             PKT_DATA, ret + 5, 16,
1916                                             PKT_END);
1917                                 sfree(ret);
1918                                 crWaitUntil(ispkt);
1919                                 if (pktin.type == SSH1_SMSG_SUCCESS) {
1920                                     logevent
1921                                         ("Pageant's response accepted");
1922                                     if (flags & FLAG_VERBOSE) {
1923                                         c_write_str
1924                                             ("Authenticated using RSA key \"");
1925                                         c_write(commentp, commentlen);
1926                                         c_write_str("\" from agent\r\n");
1927                                     }
1928                                     authed = TRUE;
1929                                 } else
1930                                     logevent
1931                                         ("Pageant's response not accepted");
1932                             } else {
1933                                 logevent
1934                                     ("Pageant failed to answer challenge");
1935                                 sfree(ret);
1936                             }
1937                         } else {
1938                             logevent("No reply received from Pageant");
1939                         }
1940                     }
1941                     freebn(key.exponent);
1942                     freebn(key.modulus);
1943                     freebn(challenge);
1944                     if (authed)
1945                         break;
1946                 }
1947             }
1948             if (authed)
1949                 break;
1950         }
1951         if (*cfg.keyfile && !tried_publickey)
1952             pwpkt_type = SSH1_CMSG_AUTH_RSA;
1953
1954         if (pktin.type == SSH1_SMSG_FAILURE &&
1955             cfg.try_tis_auth &&
1956             (supported_auths_mask & (1 << SSH1_AUTH_TIS))) {
1957             pwpkt_type = SSH1_CMSG_AUTH_TIS_RESPONSE;
1958             logevent("Requested TIS authentication");
1959             send_packet(SSH1_CMSG_AUTH_TIS, PKT_END);
1960             crWaitUntil(ispkt);
1961             if (pktin.type != SSH1_SMSG_AUTH_TIS_CHALLENGE) {
1962                 logevent("TIS authentication declined");
1963                 if (flags & FLAG_INTERACTIVE)
1964                     c_write_str("TIS authentication refused.\r\n");
1965             } else {
1966                 int challengelen = ((pktin.body[0] << 24) |
1967                                     (pktin.body[1] << 16) |
1968                                     (pktin.body[2] << 8) |
1969                                     (pktin.body[3]));
1970                 logevent("Received TIS challenge");
1971                 if (challengelen > sizeof(prompt) - 1)
1972                     challengelen = sizeof(prompt) - 1;  /* prevent overrun */
1973                 memcpy(prompt, pktin.body + 4, challengelen);
1974                 prompt[challengelen] = '\0';
1975             }
1976         }
1977         if (pktin.type == SSH1_SMSG_FAILURE &&
1978             cfg.try_tis_auth &&
1979             (supported_auths_mask & (1 << SSH1_AUTH_CCARD))) {
1980             pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE;
1981             logevent("Requested CryptoCard authentication");
1982             send_packet(SSH1_CMSG_AUTH_CCARD, PKT_END);
1983             crWaitUntil(ispkt);
1984             if (pktin.type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) {
1985                 logevent("CryptoCard authentication declined");
1986                 c_write_str("CryptoCard authentication refused.\r\n");
1987             } else {
1988                 int challengelen = ((pktin.body[0] << 24) |
1989                                     (pktin.body[1] << 16) |
1990                                     (pktin.body[2] << 8) |
1991                                     (pktin.body[3]));
1992                 logevent("Received CryptoCard challenge");
1993                 if (challengelen > sizeof(prompt) - 1)
1994                     challengelen = sizeof(prompt) - 1;  /* prevent overrun */
1995                 memcpy(prompt, pktin.body + 4, challengelen);
1996                 strncpy(prompt + challengelen, "\r\nResponse : ",
1997                         sizeof(prompt) - challengelen);
1998                 prompt[sizeof(prompt) - 1] = '\0';
1999             }
2000         }
2001         if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) {
2002             sprintf(prompt, "%.90s@%.90s's password: ",
2003                     username, savedhost);
2004         }
2005         if (pwpkt_type == SSH1_CMSG_AUTH_RSA) {
2006             char *comment = NULL;
2007             if (flags & FLAG_VERBOSE)
2008                 c_write_str("Trying public key authentication.\r\n");
2009             if (!rsakey_encrypted(cfg.keyfile, &comment)) {
2010                 if (flags & FLAG_VERBOSE)
2011                     c_write_str("No passphrase required.\r\n");
2012                 goto tryauth;
2013             }
2014             sprintf(prompt, "Passphrase for key \"%.100s\": ", comment);
2015             sfree(comment);
2016         }
2017
2018         if (ssh_get_line) {
2019             if (!ssh_get_line(prompt, password, sizeof(password), TRUE)) {
2020                 /*
2021                  * get_line failed to get a password (for example
2022                  * because one was supplied on the command line
2023                  * which has already failed to work). Terminate.
2024                  */
2025                 send_packet(SSH1_MSG_DISCONNECT,
2026                             PKT_STR, "No more passwords available to try",
2027                             PKT_END);
2028                 connection_fatal("Unable to authenticate");
2029                 ssh_state = SSH_STATE_CLOSED;
2030                 crReturn(1);
2031             }
2032         } else {
2033             c_write_str(prompt);
2034             pos = 0;
2035             ssh_send_ok = 1;
2036             while (pos >= 0) {
2037                 crWaitUntil(!ispkt);
2038                 while (inlen--)
2039                     switch (c = *in++) {
2040                       case 10:
2041                       case 13:
2042                         password[pos] = 0;
2043                         pos = -1;
2044                         break;
2045                       case 8:
2046                       case 127:
2047                         if (pos > 0)
2048                             pos--;
2049                         break;
2050                       case 21:
2051                       case 27:
2052                         pos = 0;
2053                         break;
2054                       case 3:
2055                       case 4:
2056                         random_save_seed();
2057                         exit(0);
2058                         break;
2059                       default:
2060                         if (pos < sizeof(password)-1)
2061                             password[pos++] = c;
2062                         break;
2063                     }
2064             }
2065             c_write_str("\r\n");
2066         }
2067
2068       tryauth:
2069         if (pwpkt_type == SSH1_CMSG_AUTH_RSA) {
2070             /*
2071              * Try public key authentication with the specified
2072              * key file.
2073              */
2074             static struct RSAKey pubkey;
2075             static Bignum challenge, response;
2076             static int i;
2077             static unsigned char buffer[32];
2078
2079             tried_publickey = 1;
2080             i = loadrsakey(cfg.keyfile, &pubkey, password);
2081             if (i == 0) {
2082                 c_write_str("Couldn't load public key from ");
2083                 c_write_str(cfg.keyfile);
2084                 c_write_str(".\r\n");
2085                 continue;              /* go and try password */
2086             }
2087             if (i == -1) {
2088                 c_write_str("Wrong passphrase.\r\n");
2089                 tried_publickey = 0;
2090                 continue;              /* try again */
2091             }
2092
2093             /*
2094              * Send a public key attempt.
2095              */
2096             send_packet(SSH1_CMSG_AUTH_RSA,
2097                         PKT_BIGNUM, pubkey.modulus, PKT_END);
2098
2099             crWaitUntil(ispkt);
2100             if (pktin.type == SSH1_SMSG_FAILURE) {
2101                 c_write_str("Server refused our public key.\r\n");
2102                 continue;              /* go and try password */
2103             }
2104             if (pktin.type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {
2105                 bombout(("Bizarre response to offer of public key"));
2106                 crReturn(0);
2107             }
2108             ssh1_read_bignum(pktin.body, &challenge);
2109             response = rsadecrypt(challenge, &pubkey);
2110             freebn(pubkey.private_exponent);    /* burn the evidence */
2111
2112             for (i = 0; i < 32; i++) {
2113                 buffer[i] = bignum_byte(response, 31 - i);
2114             }
2115
2116             MD5Init(&md5c);
2117             MD5Update(&md5c, buffer, 32);
2118             MD5Update(&md5c, session_id, 16);
2119             MD5Final(buffer, &md5c);
2120
2121             send_packet(SSH1_CMSG_AUTH_RSA_RESPONSE,
2122                         PKT_DATA, buffer, 16, PKT_END);
2123
2124             crWaitUntil(ispkt);
2125             if (pktin.type == SSH1_SMSG_FAILURE) {
2126                 if (flags & FLAG_VERBOSE)
2127                     c_write_str
2128                         ("Failed to authenticate with our public key.\r\n");
2129                 continue;              /* go and try password */
2130             } else if (pktin.type != SSH1_SMSG_SUCCESS) {
2131                 bombout(
2132                         ("Bizarre response to RSA authentication response"));
2133                 crReturn(0);
2134             }
2135
2136             break;                     /* we're through! */
2137         } else {
2138             if (pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) {
2139                 /*
2140                  * Defence against traffic analysis: we send a
2141                  * whole bunch of packets containing strings of
2142                  * different lengths. One of these strings is the
2143                  * password, in a SSH1_CMSG_AUTH_PASSWORD packet.
2144                  * The others are all random data in
2145                  * SSH1_MSG_IGNORE packets. This way a passive
2146                  * listener can't tell which is the password, and
2147                  * hence can't deduce the password length.
2148                  * 
2149                  * Anybody with a password length greater than 16
2150                  * bytes is going to have enough entropy in their
2151                  * password that a listener won't find it _that_
2152                  * much help to know how long it is. So what we'll
2153                  * do is:
2154                  * 
2155                  *  - if password length < 16, we send 15 packets
2156                  *    containing string lengths 1 through 15
2157                  * 
2158                  *  - otherwise, we let N be the nearest multiple
2159                  *    of 8 below the password length, and send 8
2160                  *    packets containing string lengths N through
2161                  *    N+7. This won't obscure the order of
2162                  *    magnitude of the password length, but it will
2163                  *    introduce a bit of extra uncertainty.
2164                  * 
2165                  * A few servers (the old 1.2.18 through 1.2.22)
2166                  * can't deal with SSH1_MSG_IGNORE. For these
2167                  * servers, we need an alternative defence. We make
2168                  * use of the fact that the password is interpreted
2169                  * as a C string: so we can append a NUL, then some
2170                  * random data.
2171                  */
2172                 if (ssh_remote_bugs & BUG_CHOKES_ON_SSH1_IGNORE) {
2173                     char string[64];
2174                     char *s;
2175                     int len;
2176
2177                     len = strlen(password);
2178                     if (len < sizeof(string)) {
2179                         s = string;
2180                         strcpy(string, password);
2181                         len++;         /* cover the zero byte */
2182                         while (len < sizeof(string)) {
2183                             string[len++] = (char) random_byte();
2184                         }
2185                     } else {
2186                         s = password;
2187                     }
2188                     send_packet(pwpkt_type, PKT_INT, len,
2189                                 PKT_DATA, s, len, PKT_END);
2190                 } else {
2191                     int bottom, top, pwlen, i;
2192                     char *randomstr;
2193
2194                     pwlen = strlen(password);
2195                     if (pwlen < 16) {
2196                         bottom = 0;    /* zero length passwords are OK! :-) */
2197                         top = 15;
2198                     } else {
2199                         bottom = pwlen & ~7;
2200                         top = bottom + 7;
2201                     }
2202
2203                     assert(pwlen >= bottom && pwlen <= top);
2204
2205                     randomstr = smalloc(top + 1);
2206
2207                     for (i = bottom; i <= top; i++) {
2208                         if (i == pwlen)
2209                             defer_packet(pwpkt_type, PKT_STR, password,
2210                                          PKT_END);
2211                         else {
2212                             for (j = 0; j < i; j++) {
2213                                 do {
2214                                     randomstr[j] = random_byte();
2215                                 } while (randomstr[j] == '\0');
2216                             }
2217                             randomstr[i] = '\0';
2218                             defer_packet(SSH1_MSG_IGNORE,
2219                                          PKT_STR, randomstr, PKT_END);
2220                         }
2221                     }
2222                     ssh_pkt_defersend();
2223                 }
2224             } else {
2225                 send_packet(pwpkt_type, PKT_STR, password, PKT_END);
2226             }
2227         }
2228         logevent("Sent password");
2229         memset(password, 0, strlen(password));
2230         crWaitUntil(ispkt);
2231         if (pktin.type == SSH1_SMSG_FAILURE) {
2232             if (flags & FLAG_VERBOSE)
2233                 c_write_str("Access denied\r\n");
2234             logevent("Authentication refused");
2235         } else if (pktin.type == SSH1_MSG_DISCONNECT) {
2236             logevent("Received disconnect request");
2237             ssh_state = SSH_STATE_CLOSED;
2238             crReturn(1);
2239         } else if (pktin.type != SSH1_SMSG_SUCCESS) {
2240             bombout(("Strange packet received, type %d", pktin.type));
2241             crReturn(0);
2242         }
2243     }
2244
2245     logevent("Authentication successful");
2246
2247     crFinish(1);
2248 }
2249
2250 void sshfwd_close(struct ssh_channel *c)
2251 {
2252     if (c && !c->closes) {
2253         if (ssh_version == 1) {
2254             send_packet(SSH1_MSG_CHANNEL_CLOSE, PKT_INT, c->remoteid,
2255                         PKT_END);
2256         } else {
2257             ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
2258             ssh2_pkt_adduint32(c->remoteid);
2259             ssh2_pkt_send();
2260         }
2261         c->closes = 1;
2262         if (c->type == CHAN_X11) {
2263             c->u.x11.s = NULL;
2264             logevent("X11 connection terminated");
2265         }
2266     }
2267 }
2268
2269 void sshfwd_write(struct ssh_channel *c, char *buf, int len)
2270 {
2271     if (ssh_version == 1) {
2272         send_packet(SSH1_MSG_CHANNEL_DATA,
2273                     PKT_INT, c->remoteid,
2274                     PKT_INT, len, PKT_DATA, buf, len, PKT_END);
2275     } else {
2276         ssh2_add_channel_data(c, buf, len);
2277         ssh2_try_send(c);
2278     }
2279 }
2280
2281 static void ssh1_protocol(unsigned char *in, int inlen, int ispkt)
2282 {
2283     crBegin;
2284
2285     random_init();
2286
2287     while (!do_ssh1_login(in, inlen, ispkt)) {
2288         crReturnV;
2289     }
2290     if (ssh_state == SSH_STATE_CLOSED)
2291         crReturnV;
2292
2293     if (cfg.agentfwd && agent_exists()) {
2294         logevent("Requesting agent forwarding");
2295         send_packet(SSH1_CMSG_AGENT_REQUEST_FORWARDING, PKT_END);
2296         do {
2297             crReturnV;
2298         } while (!ispkt);
2299         if (pktin.type != SSH1_SMSG_SUCCESS
2300             && pktin.type != SSH1_SMSG_FAILURE) {
2301             bombout(("Protocol confusion"));
2302             crReturnV;
2303         } else if (pktin.type == SSH1_SMSG_FAILURE) {
2304             logevent("Agent forwarding refused");
2305         } else {
2306             logevent("Agent forwarding enabled");
2307             ssh_agentfwd_enabled = TRUE;
2308         }
2309     }
2310
2311     if (cfg.x11_forward) {
2312         char proto[20], data[64];
2313         logevent("Requesting X11 forwarding");
2314         x11_invent_auth(proto, sizeof(proto), data, sizeof(data));
2315         if (ssh1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) {
2316             send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING,
2317                         PKT_STR, proto, PKT_STR, data,
2318                         PKT_INT, 0, PKT_END);
2319         } else {
2320             send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING,
2321                         PKT_STR, proto, PKT_STR, data, PKT_END);
2322         }
2323         do {
2324             crReturnV;
2325         } while (!ispkt);
2326         if (pktin.type != SSH1_SMSG_SUCCESS
2327             && pktin.type != SSH1_SMSG_FAILURE) {
2328             bombout(("Protocol confusion"));
2329             crReturnV;
2330         } else if (pktin.type == SSH1_SMSG_FAILURE) {
2331             logevent("X11 forwarding refused");
2332         } else {
2333             logevent("X11 forwarding enabled");
2334             ssh_X11_fwd_enabled = TRUE;
2335         }
2336     }
2337
2338     if (!cfg.nopty) {
2339         send_packet(SSH1_CMSG_REQUEST_PTY,
2340                     PKT_STR, cfg.termtype,
2341                     PKT_INT, rows, PKT_INT, cols,
2342                     PKT_INT, 0, PKT_INT, 0, PKT_CHAR, 0, PKT_END);
2343         ssh_state = SSH_STATE_INTERMED;
2344         do {
2345             crReturnV;
2346         } while (!ispkt);
2347         if (pktin.type != SSH1_SMSG_SUCCESS
2348             && pktin.type != SSH1_SMSG_FAILURE) {
2349             bombout(("Protocol confusion"));
2350             crReturnV;
2351         } else if (pktin.type == SSH1_SMSG_FAILURE) {
2352             c_write_str("Server refused to allocate pty\r\n");
2353             ssh_editing = ssh_echoing = 1;
2354         }
2355         logevent("Allocated pty");
2356     } else {
2357         ssh_editing = ssh_echoing = 1;
2358     }
2359
2360     if (cfg.compression) {
2361         send_packet(SSH1_CMSG_REQUEST_COMPRESSION, PKT_INT, 6, PKT_END);
2362         do {
2363             crReturnV;
2364         } while (!ispkt);
2365         if (pktin.type != SSH1_SMSG_SUCCESS
2366             && pktin.type != SSH1_SMSG_FAILURE) {
2367             bombout(("Protocol confusion"));
2368             crReturnV;
2369         } else if (pktin.type == SSH1_SMSG_FAILURE) {
2370             c_write_str("Server refused to compress\r\n");
2371         }
2372         logevent("Started compression");
2373         ssh1_compressing = TRUE;
2374         zlib_compress_init();
2375         zlib_decompress_init();
2376     }
2377
2378     if (*cfg.remote_cmd_ptr)
2379         send_packet(SSH1_CMSG_EXEC_CMD, PKT_STR, cfg.remote_cmd_ptr,
2380                     PKT_END);
2381     else
2382         send_packet(SSH1_CMSG_EXEC_SHELL, PKT_END);
2383     logevent("Started session");
2384
2385     ssh_state = SSH_STATE_SESSION;
2386     if (size_needed)
2387         ssh_size();
2388     if (eof_needed)
2389         ssh_special(TS_EOF);
2390
2391     ldisc_send(NULL, 0);               /* cause ldisc to notice changes */
2392     ssh_send_ok = 1;
2393     ssh_channels = newtree234(ssh_channelcmp);
2394     while (1) {
2395         crReturnV;
2396         if (ispkt) {
2397             if (pktin.type == SSH1_SMSG_STDOUT_DATA ||
2398                 pktin.type == SSH1_SMSG_STDERR_DATA) {
2399                 long len = GET_32BIT(pktin.body);
2400                 from_backend(pktin.type == SSH1_SMSG_STDERR_DATA,
2401                              pktin.body + 4, len);
2402             } else if (pktin.type == SSH1_MSG_DISCONNECT) {
2403                 ssh_state = SSH_STATE_CLOSED;
2404                 logevent("Received disconnect request");
2405                 crReturnV;
2406             } else if (pktin.type == SSH1_SMSG_X11_OPEN) {
2407                 /* Remote side is trying to open a channel to talk to our
2408                  * X-Server. Give them back a local channel number. */
2409                 struct ssh_channel *c;
2410
2411                 logevent("Received X11 connect request");
2412                 /* Refuse if X11 forwarding is disabled. */
2413                 if (!ssh_X11_fwd_enabled) {
2414                     send_packet(SSH1_MSG_CHANNEL_OPEN_FAILURE,
2415                                 PKT_INT, GET_32BIT(pktin.body), PKT_END);
2416                     logevent("Rejected X11 connect request");
2417                 } else {
2418                     c = smalloc(sizeof(struct ssh_channel));
2419
2420                     if (x11_init(&c->u.x11.s, cfg.x11_display, c) != NULL) {
2421                         logevent("opening X11 forward connection failed");
2422                         sfree(c);
2423                         send_packet(SSH1_MSG_CHANNEL_OPEN_FAILURE,
2424                                     PKT_INT, GET_32BIT(pktin.body),
2425                                     PKT_END);
2426                     } else {
2427                         logevent
2428                             ("opening X11 forward connection succeeded");
2429                         c->remoteid = GET_32BIT(pktin.body);
2430                         c->localid = alloc_channel_id();
2431                         c->closes = 0;
2432                         c->type = CHAN_X11;     /* identify channel type */
2433                         add234(ssh_channels, c);
2434                         send_packet(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION,
2435                                     PKT_INT, c->remoteid, PKT_INT,
2436                                     c->localid, PKT_END);
2437                         logevent("Opened X11 forward channel");
2438                     }
2439                 }
2440             } else if (pktin.type == SSH1_SMSG_AGENT_OPEN) {
2441                 /* Remote side is trying to open a channel to talk to our
2442                  * agent. Give them back a local channel number. */
2443                 struct ssh_channel *c;
2444
2445                 /* Refuse if agent forwarding is disabled. */
2446                 if (!ssh_agentfwd_enabled) {
2447                     send_packet(SSH1_MSG_CHANNEL_OPEN_FAILURE,
2448                                 PKT_INT, GET_32BIT(pktin.body), PKT_END);
2449                 } else {
2450                     c = smalloc(sizeof(struct ssh_channel));
2451                     c->remoteid = GET_32BIT(pktin.body);
2452                     c->localid = alloc_channel_id();
2453                     c->closes = 0;
2454                     c->type = CHAN_AGENT;       /* identify channel type */
2455                     c->u.a.lensofar = 0;
2456                     add234(ssh_channels, c);
2457                     send_packet(SSH1_MSG_CHANNEL_OPEN_CONFIRMATION,
2458                                 PKT_INT, c->remoteid, PKT_INT, c->localid,
2459                                 PKT_END);
2460                 }
2461             } else if (pktin.type == SSH1_MSG_CHANNEL_CLOSE ||
2462                        pktin.type == SSH1_MSG_CHANNEL_CLOSE_CONFIRMATION) {
2463                 /* Remote side closes a channel. */
2464                 unsigned i = GET_32BIT(pktin.body);
2465                 struct ssh_channel *c;
2466                 c = find234(ssh_channels, &i, ssh_channelfind);
2467                 if (c) {
2468                     int closetype;
2469                     closetype =
2470                         (pktin.type == SSH1_MSG_CHANNEL_CLOSE ? 1 : 2);
2471                     if (!(c->closes & closetype))
2472                         send_packet(pktin.type, PKT_INT, c->remoteid,
2473                                     PKT_END);
2474                     if ((c->closes == 0) && (c->type == CHAN_X11)) {
2475                         logevent("X11 connection closed");
2476                         assert(c->u.x11.s != NULL);
2477                         x11_close(c->u.x11.s);
2478                         c->u.x11.s = NULL;
2479                     }
2480                     c->closes |= closetype;
2481                     if (c->closes == 3) {
2482                         del234(ssh_channels, c);
2483                         sfree(c);
2484                     }
2485                 }
2486             } else if (pktin.type == SSH1_MSG_CHANNEL_DATA) {
2487                 /* Data sent down one of our channels. */
2488                 int i = GET_32BIT(pktin.body);
2489                 int len = GET_32BIT(pktin.body + 4);
2490                 unsigned char *p = pktin.body + 8;
2491                 struct ssh_channel *c;
2492                 c = find234(ssh_channels, &i, ssh_channelfind);
2493                 if (c) {
2494                     switch (c->type) {
2495                       case CHAN_X11:
2496                         x11_send(c->u.x11.s, p, len);
2497                         break;
2498                       case CHAN_AGENT:
2499                         /* Data for an agent message. Buffer it. */
2500                         while (len > 0) {
2501                             if (c->u.a.lensofar < 4) {
2502                                 int l = min(4 - c->u.a.lensofar, len);
2503                                 memcpy(c->u.a.msglen + c->u.a.lensofar, p,
2504                                        l);
2505                                 p += l;
2506                                 len -= l;
2507                                 c->u.a.lensofar += l;
2508                             }
2509                             if (c->u.a.lensofar == 4) {
2510                                 c->u.a.totallen =
2511                                     4 + GET_32BIT(c->u.a.msglen);
2512                                 c->u.a.message = smalloc(c->u.a.totallen);
2513                                 memcpy(c->u.a.message, c->u.a.msglen, 4);
2514                             }
2515                             if (c->u.a.lensofar >= 4 && len > 0) {
2516                                 int l =
2517                                     min(c->u.a.totallen - c->u.a.lensofar,
2518                                         len);
2519                                 memcpy(c->u.a.message + c->u.a.lensofar, p,
2520                                        l);
2521                                 p += l;
2522                                 len -= l;
2523                                 c->u.a.lensofar += l;
2524                             }
2525                             if (c->u.a.lensofar == c->u.a.totallen) {
2526                                 void *reply, *sentreply;
2527                                 int replylen;
2528                                 agent_query(c->u.a.message,
2529                                             c->u.a.totallen, &reply,
2530                                             &replylen);
2531                                 if (reply)
2532                                     sentreply = reply;
2533                                 else {
2534                                     /* Fake SSH_AGENT_FAILURE. */
2535                                     sentreply = "\0\0\0\1\5";
2536                                     replylen = 5;
2537                                 }
2538                                 send_packet(SSH1_MSG_CHANNEL_DATA,
2539                                             PKT_INT, c->remoteid,
2540                                             PKT_INT, replylen,
2541                                             PKT_DATA, sentreply, replylen,
2542                                             PKT_END);
2543                                 if (reply)
2544                                     sfree(reply);
2545                                 sfree(c->u.a.message);
2546                                 c->u.a.lensofar = 0;
2547                             }
2548                         }
2549                         break;
2550                     }
2551                 }
2552             } else if (pktin.type == SSH1_SMSG_SUCCESS) {
2553                 /* may be from EXEC_SHELL on some servers */
2554             } else if (pktin.type == SSH1_SMSG_FAILURE) {
2555                 /* may be from EXEC_SHELL on some servers
2556                  * if no pty is available or in other odd cases. Ignore */
2557             } else if (pktin.type == SSH1_SMSG_EXIT_STATUS) {
2558                 send_packet(SSH1_CMSG_EXIT_CONFIRMATION, PKT_END);
2559             } else {
2560                 bombout(("Strange packet received: type %d", pktin.type));
2561                 crReturnV;
2562             }
2563         } else {
2564             while (inlen > 0) {
2565                 int len = min(inlen, 512);
2566                 send_packet(SSH1_CMSG_STDIN_DATA,
2567                             PKT_INT, len, PKT_DATA, in, len, PKT_END);
2568                 in += len;
2569                 inlen -= len;
2570             }
2571         }
2572     }
2573
2574     crFinishV;
2575 }
2576
2577 /*
2578  * Utility routine for decoding comma-separated strings in KEXINIT.
2579  */
2580 static int in_commasep_string(char *needle, char *haystack, int haylen)
2581 {
2582     int needlen = strlen(needle);
2583     while (1) {
2584         /*
2585          * Is it at the start of the string?
2586          */
2587         if (haylen >= needlen &&       /* haystack is long enough */
2588             !memcmp(needle, haystack, needlen) &&       /* initial match */
2589             (haylen == needlen || haystack[needlen] == ',')
2590             /* either , or EOS follows */
2591             )
2592             return 1;
2593         /*
2594          * If not, search for the next comma and resume after that.
2595          * If no comma found, terminate.
2596          */
2597         while (haylen > 0 && *haystack != ',')
2598             haylen--, haystack++;
2599         if (haylen == 0)
2600             return 0;
2601         haylen--, haystack++;          /* skip over comma itself */
2602     }
2603 }
2604
2605 /*
2606  * SSH2 key creation method.
2607  */
2608 static void ssh2_mkkey(Bignum K, char *H, char *sessid, char chr,
2609                        char *keyspace)
2610 {
2611     SHA_State s;
2612     /* First 20 bytes. */
2613     SHA_Init(&s);
2614     sha_mpint(&s, K);
2615     SHA_Bytes(&s, H, 20);
2616     SHA_Bytes(&s, &chr, 1);
2617     SHA_Bytes(&s, sessid, 20);
2618     SHA_Final(&s, keyspace);
2619     /* Next 20 bytes. */
2620     SHA_Init(&s);
2621     sha_mpint(&s, K);
2622     SHA_Bytes(&s, H, 20);
2623     SHA_Bytes(&s, keyspace, 20);
2624     SHA_Final(&s, keyspace + 20);
2625 }
2626
2627 /*
2628  * Handle the SSH2 transport layer.
2629  */
2630 static int do_ssh2_transport(unsigned char *in, int inlen, int ispkt)
2631 {
2632     static int i, j, len, nbits, pbits;
2633     static char *str;
2634     static Bignum p, g, e, f, K;
2635     static int kex_init_value, kex_reply_value;
2636     static const struct ssh_mac **maclist;
2637     static int nmacs;
2638     static const struct ssh2_cipher *cscipher_tobe = NULL;
2639     static const struct ssh2_cipher *sccipher_tobe = NULL;
2640     static const struct ssh_mac *csmac_tobe = NULL;
2641     static const struct ssh_mac *scmac_tobe = NULL;
2642     static const struct ssh_compress *cscomp_tobe = NULL;
2643     static const struct ssh_compress *sccomp_tobe = NULL;
2644     static char *hostkeydata, *sigdata, *keystr, *fingerprint;
2645     static int hostkeylen, siglen;
2646     static void *hkey;                 /* actual host key */
2647     static unsigned char exchange_hash[20];
2648     static unsigned char keyspace[40];
2649     static const struct ssh2_ciphers *preferred_cipher;
2650     static const struct ssh_compress *preferred_comp;
2651     static int first_kex;
2652
2653     crBegin;
2654     random_init();
2655     first_kex = 1;
2656
2657     /*
2658      * Set up the preferred cipher and compression.
2659      */
2660     if (cfg.cipher == CIPHER_BLOWFISH) {
2661         preferred_cipher = &ssh2_blowfish;
2662     } else if (cfg.cipher == CIPHER_DES) {
2663         logevent("Single DES not supported in SSH2; using 3DES");
2664         preferred_cipher = &ssh2_3des;
2665     } else if (cfg.cipher == CIPHER_3DES) {
2666         preferred_cipher = &ssh2_3des;
2667     } else if (cfg.cipher == CIPHER_AES) {
2668         preferred_cipher = &ssh2_aes;
2669     } else {
2670         /* Shouldn't happen, but we do want to initialise to _something_. */
2671         preferred_cipher = &ssh2_3des;
2672     }
2673     if (cfg.compression)
2674         preferred_comp = &ssh_zlib;
2675     else
2676         preferred_comp = &ssh_comp_none;
2677
2678     /*
2679      * Be prepared to work around the buggy MAC problem.
2680      */
2681     if (cfg.buggymac || (ssh_remote_bugs & BUG_SSH2_HMAC))
2682         maclist = buggymacs, nmacs = lenof(buggymacs);
2683     else
2684         maclist = macs, nmacs = lenof(macs);
2685
2686   begin_key_exchange:
2687     /*
2688      * Construct and send our key exchange packet.
2689      */
2690     ssh2_pkt_init(SSH2_MSG_KEXINIT);
2691     for (i = 0; i < 16; i++)
2692         ssh2_pkt_addbyte((unsigned char) random_byte());
2693     /* List key exchange algorithms. */
2694     ssh2_pkt_addstring_start();
2695     for (i = 0; i < lenof(kex_algs); i++) {
2696         ssh2_pkt_addstring_str(kex_algs[i]->name);
2697         if (i < lenof(kex_algs) - 1)
2698             ssh2_pkt_addstring_str(",");
2699     }
2700     /* List server host key algorithms. */
2701     ssh2_pkt_addstring_start();
2702     for (i = 0; i < lenof(hostkey_algs); i++) {
2703         ssh2_pkt_addstring_str(hostkey_algs[i]->name);
2704         if (i < lenof(hostkey_algs) - 1)
2705             ssh2_pkt_addstring_str(",");
2706     }
2707     /* List client->server encryption algorithms. */
2708     ssh2_pkt_addstring_start();
2709     for (i = 0; i < lenof(ciphers) + 1; i++) {
2710         const struct ssh2_ciphers *c =
2711             i == 0 ? preferred_cipher : ciphers[i - 1];
2712         for (j = 0; j < c->nciphers; j++) {
2713             ssh2_pkt_addstring_str(c->list[j]->name);
2714             if (i < lenof(ciphers) || j < c->nciphers - 1)
2715                 ssh2_pkt_addstring_str(",");
2716         }
2717     }
2718     /* List server->client encryption algorithms. */
2719     ssh2_pkt_addstring_start();
2720     for (i = 0; i < lenof(ciphers) + 1; i++) {
2721         const struct ssh2_ciphers *c =
2722             i == 0 ? preferred_cipher : ciphers[i - 1];
2723         for (j = 0; j < c->nciphers; j++) {
2724             ssh2_pkt_addstring_str(c->list[j]->name);
2725             if (i < lenof(ciphers) || j < c->nciphers - 1)
2726                 ssh2_pkt_addstring_str(",");
2727         }
2728     }
2729     /* List client->server MAC algorithms. */
2730     ssh2_pkt_addstring_start();
2731     for (i = 0; i < nmacs; i++) {
2732         ssh2_pkt_addstring_str(maclist[i]->name);
2733         if (i < nmacs - 1)
2734             ssh2_pkt_addstring_str(",");
2735     }
2736     /* List server->client MAC algorithms. */
2737     ssh2_pkt_addstring_start();
2738     for (i = 0; i < nmacs; i++) {
2739         ssh2_pkt_addstring_str(maclist[i]->name);
2740         if (i < nmacs - 1)
2741             ssh2_pkt_addstring_str(",");
2742     }
2743     /* List client->server compression algorithms. */
2744     ssh2_pkt_addstring_start();
2745     for (i = 0; i < lenof(compressions) + 1; i++) {
2746         const struct ssh_compress *c =
2747             i == 0 ? preferred_comp : compressions[i - 1];
2748         ssh2_pkt_addstring_str(c->name);
2749         if (i < lenof(compressions))
2750             ssh2_pkt_addstring_str(",");
2751     }
2752     /* List server->client compression algorithms. */
2753     ssh2_pkt_addstring_start();
2754     for (i = 0; i < lenof(compressions) + 1; i++) {
2755         const struct ssh_compress *c =
2756             i == 0 ? preferred_comp : compressions[i - 1];
2757         ssh2_pkt_addstring_str(c->name);
2758         if (i < lenof(compressions))
2759             ssh2_pkt_addstring_str(",");
2760     }
2761     /* List client->server languages. Empty list. */
2762     ssh2_pkt_addstring_start();
2763     /* List server->client languages. Empty list. */
2764     ssh2_pkt_addstring_start();
2765     /* First KEX packet does _not_ follow, because we're not that brave. */
2766     ssh2_pkt_addbool(FALSE);
2767     /* Reserved. */
2768     ssh2_pkt_adduint32(0);
2769
2770     exhash = exhashbase;
2771     sha_string(&exhash, pktout.data + 5, pktout.length - 5);
2772
2773     ssh2_pkt_send();
2774
2775     if (!ispkt)
2776         crWaitUntil(ispkt);
2777     sha_string(&exhash, pktin.data + 5, pktin.length - 5);
2778
2779     /*
2780      * Now examine the other side's KEXINIT to see what we're up
2781      * to.
2782      */
2783     if (pktin.type != SSH2_MSG_KEXINIT) {
2784         bombout(("expected key exchange packet from server"));
2785         crReturn(0);
2786     }
2787     kex = NULL;
2788     hostkey = NULL;
2789     cscipher_tobe = NULL;
2790     sccipher_tobe = NULL;
2791     csmac_tobe = NULL;
2792     scmac_tobe = NULL;
2793     cscomp_tobe = NULL;
2794     sccomp_tobe = NULL;
2795     pktin.savedpos += 16;              /* skip garbage cookie */
2796     ssh2_pkt_getstring(&str, &len);    /* key exchange algorithms */
2797     for (i = 0; i < lenof(kex_algs); i++) {
2798         if (in_commasep_string(kex_algs[i]->name, str, len)) {
2799             kex = kex_algs[i];
2800             break;
2801         }
2802     }
2803     ssh2_pkt_getstring(&str, &len);    /* host key algorithms */
2804     for (i = 0; i < lenof(hostkey_algs); i++) {
2805         if (in_commasep_string(hostkey_algs[i]->name, str, len)) {
2806             hostkey = hostkey_algs[i];
2807             break;
2808         }
2809     }
2810     ssh2_pkt_getstring(&str, &len);    /* client->server cipher */
2811     for (i = 0; i < lenof(ciphers) + 1; i++) {
2812         const struct ssh2_ciphers *c =
2813             i == 0 ? preferred_cipher : ciphers[i - 1];
2814         for (j = 0; j < c->nciphers; j++) {
2815             if (in_commasep_string(c->list[j]->name, str, len)) {
2816                 cscipher_tobe = c->list[j];
2817                 break;
2818             }
2819         }
2820         if (cscipher_tobe)
2821             break;
2822     }
2823     ssh2_pkt_getstring(&str, &len);    /* server->client cipher */
2824     for (i = 0; i < lenof(ciphers) + 1; i++) {
2825         const struct ssh2_ciphers *c =
2826             i == 0 ? preferred_cipher : ciphers[i - 1];
2827         for (j = 0; j < c->nciphers; j++) {
2828             if (in_commasep_string(c->list[j]->name, str, len)) {
2829                 sccipher_tobe = c->list[j];
2830                 break;
2831             }
2832         }
2833         if (sccipher_tobe)
2834             break;
2835     }
2836     ssh2_pkt_getstring(&str, &len);    /* client->server mac */
2837     for (i = 0; i < nmacs; i++) {
2838         if (in_commasep_string(maclist[i]->name, str, len)) {
2839             csmac_tobe = maclist[i];
2840             break;
2841         }
2842     }
2843     ssh2_pkt_getstring(&str, &len);    /* server->client mac */
2844     for (i = 0; i < nmacs; i++) {
2845         if (in_commasep_string(maclist[i]->name, str, len)) {
2846             scmac_tobe = maclist[i];
2847             break;
2848         }
2849     }
2850     ssh2_pkt_getstring(&str, &len);    /* client->server compression */
2851     for (i = 0; i < lenof(compressions) + 1; i++) {
2852         const struct ssh_compress *c =
2853             i == 0 ? preferred_comp : compressions[i - 1];
2854         if (in_commasep_string(c->name, str, len)) {
2855             cscomp_tobe = c;
2856             break;
2857         }
2858     }
2859     ssh2_pkt_getstring(&str, &len);    /* server->client compression */
2860     for (i = 0; i < lenof(compressions) + 1; i++) {
2861         const struct ssh_compress *c =
2862             i == 0 ? preferred_comp : compressions[i - 1];
2863         if (in_commasep_string(c->name, str, len)) {
2864             sccomp_tobe = c;
2865             break;
2866         }
2867     }
2868
2869     /*
2870      * Work out the number of bits of key we will need from the key
2871      * exchange. We start with the maximum key length of either
2872      * cipher...
2873      */
2874     {
2875         int csbits, scbits;
2876
2877         csbits = cscipher_tobe->keylen;
2878         scbits = sccipher_tobe->keylen;
2879         nbits = (csbits > scbits ? csbits : scbits);
2880     }
2881     /* The keys only have 160-bit entropy, since they're based on
2882      * a SHA-1 hash. So cap the key size at 160 bits. */
2883     if (nbits > 160)
2884         nbits = 160;
2885
2886     /*
2887      * If we're doing Diffie-Hellman group exchange, start by
2888      * requesting a group.
2889      */
2890     if (kex == &ssh_diffiehellman_gex) {
2891         logevent("Doing Diffie-Hellman group exchange");
2892         /*
2893          * Work out how big a DH group we will need to allow that
2894          * much data.
2895          */
2896         pbits = 512 << ((nbits - 1) / 64);
2897         ssh2_pkt_init(SSH2_MSG_KEX_DH_GEX_REQUEST);
2898         ssh2_pkt_adduint32(pbits);
2899         ssh2_pkt_send();
2900
2901         crWaitUntil(ispkt);
2902         if (pktin.type != SSH2_MSG_KEX_DH_GEX_GROUP) {
2903             bombout(("expected key exchange group packet from server"));
2904             crReturn(0);
2905         }
2906         p = ssh2_pkt_getmp();
2907         g = ssh2_pkt_getmp();
2908         dh_setup_group(p, g);
2909         kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT;
2910         kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY;
2911     } else {
2912         dh_setup_group1();
2913         kex_init_value = SSH2_MSG_KEXDH_INIT;
2914         kex_reply_value = SSH2_MSG_KEXDH_REPLY;
2915     }
2916
2917     logevent("Doing Diffie-Hellman key exchange");
2918     /*
2919      * Now generate and send e for Diffie-Hellman.
2920      */
2921     e = dh_create_e(nbits * 2);
2922     ssh2_pkt_init(kex_init_value);
2923     ssh2_pkt_addmp(e);
2924     ssh2_pkt_send();
2925
2926     crWaitUntil(ispkt);
2927     if (pktin.type != kex_reply_value) {
2928         bombout(("expected key exchange reply packet from server"));
2929         crReturn(0);
2930     }
2931     ssh2_pkt_getstring(&hostkeydata, &hostkeylen);
2932     f = ssh2_pkt_getmp();
2933     ssh2_pkt_getstring(&sigdata, &siglen);
2934
2935     K = dh_find_K(f);
2936
2937     sha_string(&exhash, hostkeydata, hostkeylen);
2938     if (kex == &ssh_diffiehellman_gex) {
2939         sha_uint32(&exhash, pbits);
2940         sha_mpint(&exhash, p);
2941         sha_mpint(&exhash, g);
2942     }
2943     sha_mpint(&exhash, e);
2944     sha_mpint(&exhash, f);
2945     sha_mpint(&exhash, K);
2946     SHA_Final(&exhash, exchange_hash);
2947
2948     dh_cleanup();
2949
2950 #if 0
2951     debug(("Exchange hash is:\n"));
2952     dmemdump(exchange_hash, 20);
2953 #endif
2954
2955     hkey = hostkey->newkey(hostkeydata, hostkeylen);
2956     if (!hostkey->verifysig(hkey, sigdata, siglen, exchange_hash, 20)) {
2957         bombout(("Server failed host key check"));
2958         crReturn(0);
2959     }
2960
2961     /*
2962      * Expect SSH2_MSG_NEWKEYS from server.
2963      */
2964     crWaitUntil(ispkt);
2965     if (pktin.type != SSH2_MSG_NEWKEYS) {
2966         bombout(("expected new-keys packet from server"));
2967         crReturn(0);
2968     }
2969
2970     /*
2971      * Authenticate remote host: verify host key. (We've already
2972      * checked the signature of the exchange hash.)
2973      */
2974     keystr = hostkey->fmtkey(hkey);
2975     fingerprint = hostkey->fingerprint(hkey);
2976     verify_ssh_host_key(savedhost, savedport, hostkey->keytype,
2977                         keystr, fingerprint);
2978     if (first_kex) {                   /* don't bother logging this in rekeys */
2979         logevent("Host key fingerprint is:");
2980         logevent(fingerprint);
2981     }
2982     sfree(fingerprint);
2983     sfree(keystr);
2984     hostkey->freekey(hkey);
2985
2986     /*
2987      * Send SSH2_MSG_NEWKEYS.
2988      */
2989     ssh2_pkt_init(SSH2_MSG_NEWKEYS);
2990     ssh2_pkt_send();
2991
2992     /*
2993      * Create and initialise session keys.
2994      */
2995     cscipher = cscipher_tobe;
2996     sccipher = sccipher_tobe;
2997     csmac = csmac_tobe;
2998     scmac = scmac_tobe;
2999     cscomp = cscomp_tobe;
3000     sccomp = sccomp_tobe;
3001     cscomp->compress_init();
3002     sccomp->decompress_init();
3003     /*
3004      * Set IVs after keys. Here we use the exchange hash from the
3005      * _first_ key exchange.
3006      */
3007     if (first_kex)
3008         memcpy(ssh2_session_id, exchange_hash, sizeof(exchange_hash));
3009     ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'C', keyspace);
3010     cscipher->setcskey(keyspace);
3011     ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'D', keyspace);
3012     sccipher->setsckey(keyspace);
3013     ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'A', keyspace);
3014     cscipher->setcsiv(keyspace);
3015     ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'B', keyspace);
3016     sccipher->setsciv(keyspace);
3017     ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'E', keyspace);
3018     csmac->setcskey(keyspace);
3019     ssh2_mkkey(K, exchange_hash, ssh2_session_id, 'F', keyspace);
3020     scmac->setsckey(keyspace);
3021
3022     /*
3023      * If this is the first key exchange phase, we must pass the
3024      * SSH2_MSG_NEWKEYS packet to the next layer, not because it
3025      * wants to see it but because it will need time to initialise
3026      * itself before it sees an actual packet. In subsequent key
3027      * exchange phases, we don't pass SSH2_MSG_NEWKEYS on, because
3028      * it would only confuse the layer above.
3029      */
3030     if (!first_kex) {
3031         crReturn(0);
3032     }
3033     first_kex = 0;
3034
3035     /*
3036      * Now we're encrypting. Begin returning 1 to the protocol main
3037      * function so that other things can run on top of the
3038      * transport. If we ever see a KEXINIT, we must go back to the
3039      * start.
3040      */
3041     while (!(ispkt && pktin.type == SSH2_MSG_KEXINIT)) {
3042         crReturn(1);
3043     }
3044     logevent("Server initiated key re-exchange");
3045     goto begin_key_exchange;
3046
3047     crFinish(1);
3048 }
3049
3050 /*
3051  * Add data to an SSH2 channel output buffer.
3052  */
3053 static void ssh2_add_channel_data(struct ssh_channel *c, char *buf,
3054                                   int len)
3055 {
3056     if (c->v2.outbufsize < c->v2.outbuflen + len) {
3057         c->v2.outbufsize = c->v2.outbuflen + len + 1024;
3058         c->v2.outbuffer = srealloc(c->v2.outbuffer, c->v2.outbufsize);
3059     }
3060     memcpy(c->v2.outbuffer + c->v2.outbuflen, buf, len);
3061     c->v2.outbuflen += len;
3062 }
3063
3064 /*
3065  * Attempt to send data on an SSH2 channel.
3066  */
3067 static void ssh2_try_send(struct ssh_channel *c)
3068 {
3069     while (c->v2.remwindow > 0 && c->v2.outbuflen > 0) {
3070         unsigned len = c->v2.remwindow;
3071         if (len > c->v2.outbuflen)
3072             len = c->v2.outbuflen;
3073         if (len > c->v2.remmaxpkt)
3074             len = c->v2.remmaxpkt;
3075         ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA);
3076         ssh2_pkt_adduint32(c->remoteid);
3077         ssh2_pkt_addstring_start();
3078         ssh2_pkt_addstring_data(c->v2.outbuffer, len);
3079         ssh2_pkt_send();
3080         c->v2.outbuflen -= len;
3081         memmove(c->v2.outbuffer, c->v2.outbuffer + len, c->v2.outbuflen);
3082         c->v2.remwindow -= len;
3083     }
3084 }
3085
3086 /*
3087  * Handle the SSH2 userauth and connection layers.
3088  */
3089 static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
3090 {
3091     static enum {
3092         AUTH_INVALID, AUTH_PUBLICKEY_AGENT, AUTH_PUBLICKEY_FILE,
3093         AUTH_PASSWORD
3094     } method;
3095     static enum {
3096         AUTH_TYPE_NONE,
3097         AUTH_TYPE_PUBLICKEY,
3098         AUTH_TYPE_PUBLICKEY_OFFER_LOUD,
3099         AUTH_TYPE_PUBLICKEY_OFFER_QUIET,
3100         AUTH_TYPE_PASSWORD
3101     } type;
3102     static int gotit, need_pw, can_pubkey, can_passwd;
3103     static int tried_pubkey_config, tried_agent;
3104     static int we_are_in;
3105     static char username[100];
3106     static char pwprompt[200];
3107     static char password[100];
3108
3109     crBegin;
3110
3111     /*
3112      * Request userauth protocol, and await a response to it.
3113      */
3114     ssh2_pkt_init(SSH2_MSG_SERVICE_REQUEST);
3115     ssh2_pkt_addstring("ssh-userauth");
3116     ssh2_pkt_send();
3117     crWaitUntilV(ispkt);
3118     if (pktin.type != SSH2_MSG_SERVICE_ACCEPT) {
3119         bombout(("Server refused user authentication protocol"));
3120         crReturnV;
3121     }
3122
3123     /*
3124      * We repeat this whole loop, including the username prompt,
3125      * until we manage a successful authentication. If the user
3126      * types the wrong _password_, they are sent back to the
3127      * beginning to try another username. (If they specify a
3128      * username in the config, they are never asked, even if they
3129      * do give a wrong password.)
3130      * 
3131      * I think this best serves the needs of
3132      * 
3133      *  - the people who have no configuration, no keys, and just
3134      *    want to try repeated (username,password) pairs until they
3135      *    type both correctly
3136      * 
3137      *  - people who have keys and configuration but occasionally
3138      *    need to fall back to passwords
3139      * 
3140      *  - people with a key held in Pageant, who might not have
3141      *    logged in to a particular machine before; so they want to
3142      *    type a username, and then _either_ their key will be
3143      *    accepted, _or_ they will type a password. If they mistype
3144      *    the username they will want to be able to get back and
3145      *    retype it!
3146      */
3147     do {
3148         static int pos;
3149         static char c;
3150
3151         /*
3152          * Get a username.
3153          */
3154         pos = 0;
3155         if ((flags & FLAG_INTERACTIVE) && !*cfg.username) {
3156             if (ssh_get_line) {
3157                 if (!ssh_get_line("login as: ",
3158                                   username, sizeof(username), FALSE)) {
3159                     /*
3160                      * get_line failed to get a username.
3161                      * Terminate.
3162                      */
3163                     logevent("No username provided. Abandoning session.");
3164                     ssh_state = SSH_STATE_CLOSED;
3165                     crReturnV;
3166                 }
3167             } else {
3168                 c_write_str("login as: ");
3169                 ssh_send_ok = 1;
3170                 while (pos >= 0) {
3171                     crWaitUntilV(!ispkt);
3172                     while (inlen--)
3173                         switch (c = *in++) {
3174                           case 10:
3175                           case 13:
3176                             username[pos] = 0;
3177                             pos = -1;
3178                             break;
3179                           case 8:
3180                           case 127:
3181                             if (pos > 0) {
3182                                 c_write_str("\b \b");
3183                                 pos--;
3184                             }
3185                             break;
3186                           case 21:
3187                           case 27:
3188                             while (pos > 0) {
3189                                 c_write_str("\b \b");
3190                                 pos--;
3191                             }
3192                             break;
3193                           case 3:
3194                           case 4:
3195                             random_save_seed();
3196                             exit(0);
3197                             break;
3198                           default:
3199                             if (((c >= ' ' && c <= '~') ||
3200                                  ((unsigned char) c >= 160))
3201                                 && pos < sizeof(username)-1) {
3202                                 username[pos++] = c;
3203                                 c_write(&c, 1);
3204                             }
3205                             break;
3206                         }
3207                 }
3208             }
3209             c_write_str("\r\n");
3210             username[strcspn(username, "\n\r")] = '\0';
3211         } else {
3212             char stuff[200];
3213             strncpy(username, cfg.username, 99);
3214             username[99] = '\0';
3215             if ((flags & FLAG_VERBOSE) || (flags & FLAG_INTERACTIVE)) {
3216                 sprintf(stuff, "Using username \"%s\".\r\n", username);
3217                 c_write_str(stuff);
3218             }
3219         }
3220
3221         /*
3222          * Send an authentication request using method "none": (a)
3223          * just in case it succeeds, and (b) so that we know what
3224          * authentication methods we can usefully try next.
3225          */
3226         ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
3227         ssh2_pkt_addstring(username);
3228         ssh2_pkt_addstring("ssh-connection");   /* service requested */
3229         ssh2_pkt_addstring("none");    /* method */
3230         ssh2_pkt_send();
3231         type = AUTH_TYPE_NONE;
3232         gotit = FALSE;
3233         we_are_in = FALSE;
3234
3235         tried_pubkey_config = FALSE;
3236         tried_agent = FALSE;
3237
3238         while (1) {
3239             /*
3240              * Wait for the result of the last authentication request.
3241              */
3242             if (!gotit)
3243                 crWaitUntilV(ispkt);
3244             while (pktin.type == SSH2_MSG_USERAUTH_BANNER) {
3245                 char *banner;
3246                 int size;
3247                 /*
3248                  * Don't show the banner if we're operating in
3249                  * non-verbose non-interactive mode. (It's probably
3250                  * a script, which means nobody will read the
3251                  * banner _anyway_, and moreover the printing of
3252                  * the banner will screw up processing on the
3253                  * output of (say) plink.)
3254                  */
3255                 if (flags & (FLAG_VERBOSE | FLAG_INTERACTIVE)) {
3256                     ssh2_pkt_getstring(&banner, &size);
3257                     if (banner)
3258                         c_write_untrusted(banner, size);
3259                 }
3260                 crWaitUntilV(ispkt);
3261             }
3262             if (pktin.type == SSH2_MSG_USERAUTH_SUCCESS) {
3263                 logevent("Access granted");
3264                 we_are_in = TRUE;
3265                 break;
3266             }
3267
3268             if (pktin.type != SSH2_MSG_USERAUTH_FAILURE) {
3269                 bombout(
3270                         ("Strange packet received during authentication: type %d",
3271                          pktin.type));
3272                 crReturnV;
3273             }
3274
3275             gotit = FALSE;
3276
3277             /*
3278              * OK, we're now sitting on a USERAUTH_FAILURE message, so
3279              * we can look at the string in it and know what we can
3280              * helpfully try next.
3281              */
3282             {
3283                 char *methods;
3284                 int methlen;
3285                 ssh2_pkt_getstring(&methods, &methlen);
3286                 if (!ssh2_pkt_getbool()) {
3287                     /*
3288                      * We have received an unequivocal Access
3289                      * Denied. This can translate to a variety of
3290                      * messages:
3291                      * 
3292                      *  - if we'd just tried "none" authentication,
3293                      *    it's not worth printing anything at all
3294                      * 
3295                      *  - if we'd just tried a public key _offer_,
3296                      *    the message should be "Server refused our
3297                      *    key" (or no message at all if the key
3298                      *    came from Pageant)
3299                      * 
3300                      *  - if we'd just tried anything else, the
3301                      *    message really should be "Access denied".
3302                      * 
3303                      * Additionally, if we'd just tried password
3304                      * authentication, we should break out of this
3305                      * whole loop so as to go back to the username
3306                      * prompt.
3307                      */
3308                     if (type == AUTH_TYPE_NONE) {
3309                         /* do nothing */
3310                     } else if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD ||
3311                                type == AUTH_TYPE_PUBLICKEY_OFFER_QUIET) {
3312                         if (type == AUTH_TYPE_PUBLICKEY_OFFER_LOUD)
3313                             c_write_str("Server refused our key\r\n");
3314                         logevent("Server refused public key");
3315                     } else {
3316                         c_write_str("Access denied\r\n");
3317                         logevent("Access denied");
3318                         if (type == AUTH_TYPE_PASSWORD) {
3319                             we_are_in = FALSE;
3320                             break;
3321                         }
3322                     }
3323                 } else {
3324                     c_write_str("Further authentication required\r\n");
3325                     logevent("Further authentication required");
3326                 }
3327
3328                 can_pubkey =
3329                     in_commasep_string("publickey", methods, methlen);
3330                 can_passwd =
3331                     in_commasep_string("password", methods, methlen);
3332             }
3333
3334             method = 0;
3335
3336             if (!method && can_pubkey && agent_exists() && !tried_agent) {
3337                 /*
3338                  * Attempt public-key authentication using Pageant.
3339                  */
3340                 static unsigned char request[5], *response, *p;
3341                 static int responselen;
3342                 static int i, nkeys;
3343                 static int authed = FALSE;
3344                 void *r;
3345
3346                 tried_agent = TRUE;
3347
3348                 logevent("Pageant is running. Requesting keys.");
3349
3350                 /* Request the keys held by the agent. */
3351                 PUT_32BIT(request, 1);
3352                 request[4] = SSH2_AGENTC_REQUEST_IDENTITIES;
3353                 agent_query(request, 5, &r, &responselen);
3354                 response = (unsigned char *) r;
3355                 if (response && responselen >= 5 &&
3356                     response[4] == SSH2_AGENT_IDENTITIES_ANSWER) {
3357                     p = response + 5;
3358                     nkeys = GET_32BIT(p);
3359                     p += 4;
3360                     {
3361                         char buf[64];
3362                         sprintf(buf, "Pageant has %d SSH2 keys", nkeys);
3363                         logevent(buf);
3364                     }
3365                     for (i = 0; i < nkeys; i++) {
3366                         static char *pkblob, *alg, *commentp;
3367                         static int pklen, alglen, commentlen;
3368                         static int siglen, retlen, len;
3369                         static char *q, *agentreq, *ret;
3370                         void *vret;
3371
3372                         {
3373                             char buf[64];
3374                             sprintf(buf, "Trying Pageant key #%d", i);
3375                             logevent(buf);
3376                         }
3377                         pklen = GET_32BIT(p);
3378                         p += 4;
3379                         pkblob = p;
3380                         p += pklen;
3381                         alglen = GET_32BIT(pkblob);
3382                         alg = pkblob + 4;
3383                         commentlen = GET_32BIT(p);
3384                         p += 4;
3385                         commentp = p;
3386                         p += commentlen;
3387                         ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
3388                         ssh2_pkt_addstring(username);
3389                         ssh2_pkt_addstring("ssh-connection");   /* service requested */
3390                         ssh2_pkt_addstring("publickey");        /* method */
3391                         ssh2_pkt_addbool(FALSE);        /* no signature included */
3392                         ssh2_pkt_addstring_start();
3393                         ssh2_pkt_addstring_data(alg, alglen);
3394                         ssh2_pkt_addstring_start();
3395                         ssh2_pkt_addstring_data(pkblob, pklen);
3396                         ssh2_pkt_send();
3397
3398                         crWaitUntilV(ispkt);
3399                         if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) {
3400                             logevent("Key refused");
3401                             continue;
3402                         }
3403
3404                         if (flags & FLAG_VERBOSE) {
3405                             c_write_str
3406                                 ("Authenticating with public key \"");
3407                             c_write(commentp, commentlen);
3408                             c_write_str("\" from agent\r\n");
3409                         }
3410
3411                         /*
3412                          * Server is willing to accept the key.
3413                          * Construct a SIGN_REQUEST.
3414                          */
3415                         ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
3416                         ssh2_pkt_addstring(username);
3417                         ssh2_pkt_addstring("ssh-connection");   /* service requested */
3418                         ssh2_pkt_addstring("publickey");        /* method */
3419                         ssh2_pkt_addbool(TRUE);
3420                         ssh2_pkt_addstring_start();
3421                         ssh2_pkt_addstring_data(alg, alglen);
3422                         ssh2_pkt_addstring_start();
3423                         ssh2_pkt_addstring_data(pkblob, pklen);
3424
3425                         siglen = pktout.length - 5 + 4 + 20;
3426                         len = 1;       /* message type */
3427                         len += 4 + pklen;       /* key blob */
3428                         len += 4 + siglen;      /* data to sign */
3429                         len += 4;      /* flags */
3430                         agentreq = smalloc(4 + len);
3431                         PUT_32BIT(agentreq, len);
3432                         q = agentreq + 4;
3433                         *q++ = SSH2_AGENTC_SIGN_REQUEST;
3434                         PUT_32BIT(q, pklen);
3435                         q += 4;
3436                         memcpy(q, pkblob, pklen);
3437                         q += pklen;
3438                         PUT_32BIT(q, siglen);
3439                         q += 4;
3440                         /* Now the data to be signed... */
3441                         PUT_32BIT(q, 20);
3442                         q += 4;
3443                         memcpy(q, ssh2_session_id, 20);
3444                         q += 20;
3445                         memcpy(q, pktout.data + 5, pktout.length - 5);
3446                         q += pktout.length - 5;
3447                         /* And finally the (zero) flags word. */
3448                         PUT_32BIT(q, 0);
3449                         agent_query(agentreq, len + 4, &vret, &retlen);
3450                         ret = vret;
3451                         sfree(agentreq);
3452                         if (ret) {
3453                             if (ret[4] == SSH2_AGENT_SIGN_RESPONSE) {
3454                                 logevent("Sending Pageant's response");
3455                                 ssh2_pkt_addstring_start();
3456                                 ssh2_pkt_addstring_data(ret + 9,
3457                                                         GET_32BIT(ret +
3458                                                                   5));
3459                                 ssh2_pkt_send();
3460                                 authed = TRUE;
3461                                 break;
3462                             } else {
3463                                 logevent
3464                                     ("Pageant failed to answer challenge");
3465                                 sfree(ret);
3466                             }
3467                         }
3468                     }
3469                     if (authed)
3470                         continue;
3471                 }
3472             }
3473
3474             if (!method && can_pubkey && *cfg.keyfile
3475                 && !tried_pubkey_config) {
3476                 unsigned char *pub_blob;
3477                 char *algorithm, *comment;
3478                 int pub_blob_len;
3479
3480                 tried_pubkey_config = TRUE;
3481
3482                 /*
3483                  * Try the public key supplied in the configuration.
3484                  *
3485                  * First, offer the public blob to see if the server is
3486                  * willing to accept it.
3487                  */
3488                 pub_blob = ssh2_userkey_loadpub(cfg.keyfile, &algorithm,
3489                                                 &pub_blob_len);
3490                 if (pub_blob) {
3491                     ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
3492                     ssh2_pkt_addstring(username);
3493                     ssh2_pkt_addstring("ssh-connection");       /* service requested */
3494                     ssh2_pkt_addstring("publickey");    /* method */
3495                     ssh2_pkt_addbool(FALSE);    /* no signature included */
3496                     ssh2_pkt_addstring(algorithm);
3497                     ssh2_pkt_addstring_start();
3498                     ssh2_pkt_addstring_data(pub_blob, pub_blob_len);
3499                     ssh2_pkt_send();
3500                     logevent("Offered public key");     /* FIXME */
3501
3502                     crWaitUntilV(ispkt);
3503                     if (pktin.type != SSH2_MSG_USERAUTH_PK_OK) {
3504                         gotit = TRUE;
3505                         type = AUTH_TYPE_PUBLICKEY_OFFER_LOUD;
3506                         continue;      /* key refused; give up on it */
3507                     }
3508
3509                     logevent("Offer of public key accepted");
3510                     /*
3511                      * Actually attempt a serious authentication using
3512                      * the key.
3513                      */
3514                     if (ssh2_userkey_encrypted(cfg.keyfile, &comment)) {
3515                         sprintf(pwprompt,
3516                                 "Passphrase for key \"%.100s\": ",
3517                                 comment);
3518                         need_pw = TRUE;
3519                     } else {
3520                         need_pw = FALSE;
3521                     }
3522                     c_write_str("Authenticating with public key \"");
3523                     c_write_str(comment);
3524                     c_write_str("\"\r\n");
3525                     method = AUTH_PUBLICKEY_FILE;
3526                 }
3527             }
3528
3529             if (!method && can_passwd) {
3530                 method = AUTH_PASSWORD;
3531                 sprintf(pwprompt, "%.90s@%.90s's password: ", username,
3532                         savedhost);
3533                 need_pw = TRUE;
3534             }
3535
3536             if (need_pw) {
3537                 if (ssh_get_line) {
3538                     if (!ssh_get_line(pwprompt, password,
3539                                       sizeof(password), TRUE)) {
3540                         /*
3541                          * get_line failed to get a password (for
3542                          * example because one was supplied on the
3543                          * command line which has already failed to
3544                          * work). Terminate.
3545                          */
3546                         ssh2_pkt_init(SSH2_MSG_DISCONNECT);
3547                         ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION);
3548                         ssh2_pkt_addstring
3549                             ("No more passwords available to try");
3550                         ssh2_pkt_addstring("en");       /* language tag */
3551                         ssh2_pkt_send();
3552                         connection_fatal("Unable to authenticate");
3553                         ssh_state = SSH_STATE_CLOSED;
3554                         crReturnV;
3555                     }
3556                 } else {
3557                     static int pos = 0;
3558                     static char c;
3559
3560                     c_write_str(pwprompt);
3561                     ssh_send_ok = 1;
3562
3563                     pos = 0;
3564                     while (pos >= 0) {
3565                         crWaitUntilV(!ispkt);
3566                         while (inlen--)
3567                             switch (c = *in++) {
3568                               case 10:
3569                               case 13:
3570                                 password[pos] = 0;
3571                                 pos = -1;
3572                                 break;
3573                               case 8:
3574                               case 127:
3575                                 if (pos > 0)
3576                                     pos--;
3577                                 break;
3578                               case 21:
3579                               case 27:
3580                                 pos = 0;
3581                                 break;
3582                               case 3:
3583                               case 4:
3584                                 random_save_seed();
3585                                 exit(0);
3586                                 break;
3587                               default:
3588                                 if (pos < sizeof(password)-1)
3589                                     password[pos++] = c;
3590                                 break;
3591                             }
3592                     }
3593                     c_write_str("\r\n");
3594                 }
3595             }
3596
3597             if (method == AUTH_PUBLICKEY_FILE) {
3598                 /*
3599                  * We have our passphrase. Now try the actual authentication.
3600                  */
3601                 struct ssh2_userkey *key;
3602
3603                 key = ssh2_load_userkey(cfg.keyfile, password);
3604                 if (key == SSH2_WRONG_PASSPHRASE || key == NULL) {
3605                     if (key == SSH2_WRONG_PASSPHRASE) {
3606                         c_write_str("Wrong passphrase\r\n");
3607                         tried_pubkey_config = FALSE;
3608                     } else {
3609                         c_write_str("Unable to load private key\r\n");
3610                         tried_pubkey_config = TRUE;
3611                     }
3612                     /* Send a spurious AUTH_NONE to return to the top. */
3613                     ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
3614                     ssh2_pkt_addstring(username);
3615                     ssh2_pkt_addstring("ssh-connection");       /* service requested */
3616                     ssh2_pkt_addstring("none"); /* method */
3617                     ssh2_pkt_send();
3618                     type = AUTH_TYPE_NONE;
3619                 } else {
3620                     unsigned char *blob, *sigdata;
3621                     int blob_len, sigdata_len;
3622
3623                     /*
3624                      * We have loaded the private key and the server
3625                      * has announced that it's willing to accept it.
3626                      * Hallelujah. Generate a signature and send it.
3627                      */
3628                     ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
3629                     ssh2_pkt_addstring(username);
3630                     ssh2_pkt_addstring("ssh-connection");       /* service requested */
3631                     ssh2_pkt_addstring("publickey");    /* method */
3632                     ssh2_pkt_addbool(TRUE);
3633                     ssh2_pkt_addstring(key->alg->name);
3634                     blob = key->alg->public_blob(key->data, &blob_len);
3635                     ssh2_pkt_addstring_start();
3636                     ssh2_pkt_addstring_data(blob, blob_len);
3637                     sfree(blob);
3638
3639                     /*
3640                      * The data to be signed is:
3641                      *
3642                      *   string  session-id
3643                      *
3644                      * followed by everything so far placed in the
3645                      * outgoing packet.
3646                      */
3647                     sigdata_len = pktout.length - 5 + 4 + 20;
3648                     sigdata = smalloc(sigdata_len);
3649                     PUT_32BIT(sigdata, 20);
3650                     memcpy(sigdata + 4, ssh2_session_id, 20);
3651                     memcpy(sigdata + 24, pktout.data + 5,
3652                            pktout.length - 5);
3653                     blob =
3654                         key->alg->sign(key->data, sigdata, sigdata_len,
3655                                        &blob_len);
3656                     ssh2_pkt_addstring_start();
3657                     ssh2_pkt_addstring_data(blob, blob_len);
3658                     sfree(blob);
3659                     sfree(sigdata);
3660
3661                     ssh2_pkt_send();
3662                     type = AUTH_TYPE_PUBLICKEY;
3663                 }
3664             } else if (method == AUTH_PASSWORD) {
3665                 /*
3666                  * We send the password packet lumped tightly together with
3667                  * an SSH_MSG_IGNORE packet. The IGNORE packet contains a
3668                  * string long enough to make the total length of the two
3669                  * packets constant. This should ensure that a passive
3670                  * listener doing traffic analyis can't work out the length
3671                  * of the password.
3672                  *
3673                  * For this to work, we need an assumption about the
3674                  * maximum length of the password packet. I think 256 is
3675                  * pretty conservative. Anyone using a password longer than
3676                  * that probably doesn't have much to worry about from
3677                  * people who find out how long their password is!
3678                  */
3679                 ssh2_pkt_init(SSH2_MSG_USERAUTH_REQUEST);
3680                 ssh2_pkt_addstring(username);
3681                 ssh2_pkt_addstring("ssh-connection");   /* service requested */
3682                 ssh2_pkt_addstring("password");
3683                 ssh2_pkt_addbool(FALSE);
3684                 ssh2_pkt_addstring(password);
3685                 ssh2_pkt_defer();
3686                 /*
3687                  * We'll include a string that's an exact multiple of the
3688                  * cipher block size. If the cipher is NULL for some
3689                  * reason, we don't do this trick at all because we gain
3690                  * nothing by it.
3691                  */
3692                 if (cscipher) {
3693                     int stringlen, i;
3694
3695                     stringlen = (256 - deferred_len);
3696                     stringlen += cscipher->blksize - 1;
3697                     stringlen -= (stringlen % cscipher->blksize);
3698                     if (cscomp) {
3699                         /*
3700                          * Temporarily disable actual compression,
3701                          * so we can guarantee to get this string
3702                          * exactly the length we want it. The
3703                          * compression-disabling routine should
3704                          * return an integer indicating how many
3705                          * bytes we should adjust our string length
3706                          * by.
3707                          */
3708                         stringlen -= cscomp->disable_compression();
3709                     }
3710                     ssh2_pkt_init(SSH2_MSG_IGNORE);
3711                     ssh2_pkt_addstring_start();
3712                     for (i = 0; i < stringlen; i++) {
3713                         char c = (char) random_byte();
3714                         ssh2_pkt_addstring_data(&c, 1);
3715                     }
3716                     ssh2_pkt_defer();
3717                 }
3718                 ssh_pkt_defersend();
3719                 logevent("Sent password");
3720                 type = AUTH_TYPE_PASSWORD;
3721             } else {
3722                 c_write_str
3723                     ("No supported authentication methods left to try!\r\n");
3724                 logevent
3725                     ("No supported authentications offered. Disconnecting");
3726                 ssh2_pkt_init(SSH2_MSG_DISCONNECT);
3727                 ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION);
3728                 ssh2_pkt_addstring
3729                     ("No supported authentication methods available");
3730                 ssh2_pkt_addstring("en");       /* language tag */
3731                 ssh2_pkt_send();
3732                 ssh_state = SSH_STATE_CLOSED;
3733                 crReturnV;
3734             }
3735         }
3736     } while (!we_are_in);
3737
3738     /*
3739      * Now we're authenticated for the connection protocol. The
3740      * connection protocol will automatically have started at this
3741      * point; there's no need to send SERVICE_REQUEST.
3742      */
3743
3744     /*
3745      * So now create a channel with a session in it.
3746      */
3747     ssh_channels = newtree234(ssh_channelcmp);
3748     mainchan = smalloc(sizeof(struct ssh_channel));
3749     mainchan->localid = alloc_channel_id();
3750     ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN);
3751     ssh2_pkt_addstring("session");
3752     ssh2_pkt_adduint32(mainchan->localid);
3753     ssh2_pkt_adduint32(0x8000UL);      /* our window size */
3754     ssh2_pkt_adduint32(0x4000UL);      /* our max pkt size */
3755     ssh2_pkt_send();
3756     crWaitUntilV(ispkt);
3757     if (pktin.type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) {
3758         bombout(("Server refused to open a session"));
3759         crReturnV;
3760         /* FIXME: error data comes back in FAILURE packet */
3761     }
3762     if (ssh2_pkt_getuint32() != mainchan->localid) {
3763         bombout(("Server's channel confirmation cited wrong channel"));
3764         crReturnV;
3765     }
3766     mainchan->remoteid = ssh2_pkt_getuint32();
3767     mainchan->type = CHAN_MAINSESSION;
3768     mainchan->closes = 0;
3769     mainchan->v2.remwindow = ssh2_pkt_getuint32();
3770     mainchan->v2.remmaxpkt = ssh2_pkt_getuint32();
3771     mainchan->v2.outbuffer = NULL;
3772     mainchan->v2.outbuflen = mainchan->v2.outbufsize = 0;
3773     add234(ssh_channels, mainchan);
3774     logevent("Opened channel for session");
3775
3776     /*
3777      * Potentially enable X11 forwarding.
3778      */
3779     if (cfg.x11_forward) {
3780         char proto[20], data[64];
3781         logevent("Requesting X11 forwarding");
3782         x11_invent_auth(proto, sizeof(proto), data, sizeof(data));
3783         ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
3784         ssh2_pkt_adduint32(mainchan->remoteid);
3785         ssh2_pkt_addstring("x11-req");
3786         ssh2_pkt_addbool(1);           /* want reply */
3787         ssh2_pkt_addbool(0);           /* many connections */
3788         ssh2_pkt_addstring(proto);
3789         ssh2_pkt_addstring(data);
3790         ssh2_pkt_adduint32(0);         /* screen number */
3791         ssh2_pkt_send();
3792
3793         do {
3794             crWaitUntilV(ispkt);
3795             if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) {
3796                 unsigned i = ssh2_pkt_getuint32();
3797                 struct ssh_channel *c;
3798                 c = find234(ssh_channels, &i, ssh_channelfind);
3799                 if (!c)
3800                     continue;          /* nonexistent channel */
3801                 c->v2.remwindow += ssh2_pkt_getuint32();
3802             }
3803         } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST);
3804
3805         if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
3806             if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
3807                 bombout(("Server got confused by X11 forwarding request"));
3808                 crReturnV;
3809             }
3810             logevent("X11 forwarding refused");
3811         } else {
3812             logevent("X11 forwarding enabled");
3813             ssh_X11_fwd_enabled = TRUE;
3814         }
3815     }
3816
3817     /*
3818      * Potentially enable agent forwarding.
3819      */
3820     if (cfg.agentfwd && agent_exists()) {
3821         logevent("Requesting OpenSSH-style agent forwarding");
3822         ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
3823         ssh2_pkt_adduint32(mainchan->remoteid);
3824         ssh2_pkt_addstring("auth-agent-req@openssh.com");
3825         ssh2_pkt_addbool(1);           /* want reply */
3826         ssh2_pkt_send();
3827
3828         do {
3829             crWaitUntilV(ispkt);
3830             if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) {
3831                 unsigned i = ssh2_pkt_getuint32();
3832                 struct ssh_channel *c;
3833                 c = find234(ssh_channels, &i, ssh_channelfind);
3834                 if (!c)
3835                     continue;          /* nonexistent channel */
3836                 c->v2.remwindow += ssh2_pkt_getuint32();
3837             }
3838         } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST);
3839
3840         if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
3841             if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
3842                 bombout(
3843                         ("Server got confused by agent forwarding request"));
3844                 crReturnV;
3845             }
3846             logevent("Agent forwarding refused");
3847         } else {
3848             logevent("Agent forwarding enabled");
3849             ssh_agentfwd_enabled = TRUE;
3850         }
3851     }
3852
3853     /*
3854      * Now allocate a pty for the session.
3855      */
3856     if (!cfg.nopty) {
3857         ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
3858         ssh2_pkt_adduint32(mainchan->remoteid); /* recipient channel */
3859         ssh2_pkt_addstring("pty-req");
3860         ssh2_pkt_addbool(1);           /* want reply */
3861         ssh2_pkt_addstring(cfg.termtype);
3862         ssh2_pkt_adduint32(cols);
3863         ssh2_pkt_adduint32(rows);
3864         ssh2_pkt_adduint32(0);         /* pixel width */
3865         ssh2_pkt_adduint32(0);         /* pixel height */
3866         ssh2_pkt_addstring_start();
3867         ssh2_pkt_addstring_data("\0", 1);       /* TTY_OP_END, no special options */
3868         ssh2_pkt_send();
3869         ssh_state = SSH_STATE_INTERMED;
3870
3871         do {
3872             crWaitUntilV(ispkt);
3873             if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) {
3874                 unsigned i = ssh2_pkt_getuint32();
3875                 struct ssh_channel *c;
3876                 c = find234(ssh_channels, &i, ssh_channelfind);
3877                 if (!c)
3878                     continue;          /* nonexistent channel */
3879                 c->v2.remwindow += ssh2_pkt_getuint32();
3880             }
3881         } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST);
3882
3883         if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
3884             if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
3885                 bombout(("Server got confused by pty request"));
3886                 crReturnV;
3887             }
3888             c_write_str("Server refused to allocate pty\r\n");
3889             ssh_editing = ssh_echoing = 1;
3890         } else {
3891             logevent("Allocated pty");
3892         }
3893     } else {
3894         ssh_editing = ssh_echoing = 1;
3895     }
3896
3897     /*
3898      * Start a shell or a remote command.
3899      */
3900     ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
3901     ssh2_pkt_adduint32(mainchan->remoteid);     /* recipient channel */
3902     if (cfg.ssh_subsys) {
3903         ssh2_pkt_addstring("subsystem");
3904         ssh2_pkt_addbool(1);           /* want reply */
3905         ssh2_pkt_addstring(cfg.remote_cmd_ptr);
3906     } else if (*cfg.remote_cmd_ptr) {
3907         ssh2_pkt_addstring("exec");
3908         ssh2_pkt_addbool(1);           /* want reply */
3909         ssh2_pkt_addstring(cfg.remote_cmd_ptr);
3910     } else {
3911         ssh2_pkt_addstring("shell");
3912         ssh2_pkt_addbool(1);           /* want reply */
3913     }
3914     ssh2_pkt_send();
3915     do {
3916         crWaitUntilV(ispkt);
3917         if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) {
3918             unsigned i = ssh2_pkt_getuint32();
3919             struct ssh_channel *c;
3920             c = find234(ssh_channels, &i, ssh_channelfind);
3921             if (!c)
3922                 continue;              /* nonexistent channel */
3923             c->v2.remwindow += ssh2_pkt_getuint32();
3924         }
3925     } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST);
3926     if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
3927         if (pktin.type != SSH2_MSG_CHANNEL_FAILURE) {
3928             bombout(("Server got confused by shell/command request"));
3929             crReturnV;
3930         }
3931         bombout(("Server refused to start a shell/command"));
3932         crReturnV;
3933     } else {
3934         logevent("Started a shell/command");
3935     }
3936
3937     ssh_state = SSH_STATE_SESSION;
3938     if (size_needed)
3939         ssh_size();
3940     if (eof_needed)
3941         ssh_special(TS_EOF);
3942
3943     /*
3944      * Transfer data!
3945      */
3946     ldisc_send(NULL, 0);               /* cause ldisc to notice changes */
3947     ssh_send_ok = 1;
3948     while (1) {
3949         static int try_send;
3950         crReturnV;
3951         try_send = FALSE;
3952         if (ispkt) {
3953             if (pktin.type == SSH2_MSG_CHANNEL_DATA ||
3954                 pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA) {
3955                 char *data;
3956                 int length;
3957                 unsigned i = ssh2_pkt_getuint32();
3958                 struct ssh_channel *c;
3959                 c = find234(ssh_channels, &i, ssh_channelfind);
3960                 if (!c)
3961                     continue;          /* nonexistent channel */
3962                 if (pktin.type == SSH2_MSG_CHANNEL_EXTENDED_DATA &&
3963                     ssh2_pkt_getuint32() != SSH2_EXTENDED_DATA_STDERR)
3964                     continue;          /* extended but not stderr */
3965                 ssh2_pkt_getstring(&data, &length);
3966                 if (data) {
3967                     switch (c->type) {
3968                       case CHAN_MAINSESSION:
3969                         from_backend(pktin.type ==
3970                                      SSH2_MSG_CHANNEL_EXTENDED_DATA, data,
3971                                      length);
3972                         break;
3973                       case CHAN_X11:
3974                         x11_send(c->u.x11.s, data, length);
3975                         break;
3976                       case CHAN_AGENT:
3977                         while (length > 0) {
3978                             if (c->u.a.lensofar < 4) {
3979                                 int l = min(4 - c->u.a.lensofar, length);
3980                                 memcpy(c->u.a.msglen + c->u.a.lensofar,
3981                                        data, l);
3982                                 data += l;
3983                                 length -= l;
3984                                 c->u.a.lensofar += l;
3985                             }
3986                             if (c->u.a.lensofar == 4) {
3987                                 c->u.a.totallen =
3988                                     4 + GET_32BIT(c->u.a.msglen);
3989                                 c->u.a.message = smalloc(c->u.a.totallen);
3990                                 memcpy(c->u.a.message, c->u.a.msglen, 4);
3991                             }
3992                             if (c->u.a.lensofar >= 4 && length > 0) {
3993                                 int l =
3994                                     min(c->u.a.totallen - c->u.a.lensofar,
3995                                         length);
3996                                 memcpy(c->u.a.message + c->u.a.lensofar,
3997                                        data, l);
3998                                 data += l;
3999                                 length -= l;
4000                                 c->u.a.lensofar += l;
4001                             }
4002                             if (c->u.a.lensofar == c->u.a.totallen) {
4003                                 void *reply, *sentreply;
4004                                 int replylen;
4005                                 agent_query(c->u.a.message,
4006                                             c->u.a.totallen, &reply,
4007                                             &replylen);
4008                                 if (reply)
4009                                     sentreply = reply;
4010                                 else {
4011                                     /* Fake SSH_AGENT_FAILURE. */
4012                                     sentreply = "\0\0\0\1\5";
4013                                     replylen = 5;
4014                                 }
4015                                 ssh2_add_channel_data(c, sentreply,
4016                                                       replylen);
4017                                 try_send = TRUE;
4018                                 if (reply)
4019                                     sfree(reply);
4020                                 sfree(c->u.a.message);
4021                                 c->u.a.lensofar = 0;
4022                             }
4023                         }
4024                         break;
4025                     }
4026                     /*
4027                      * Enlarge the window again at the remote
4028                      * side, just in case it ever runs down and
4029                      * they fail to send us any more data.
4030                      */
4031                     ssh2_pkt_init(SSH2_MSG_CHANNEL_WINDOW_ADJUST);
4032                     ssh2_pkt_adduint32(c->remoteid);
4033                     ssh2_pkt_adduint32(length);
4034                     ssh2_pkt_send();
4035                 }
4036             } else if (pktin.type == SSH2_MSG_DISCONNECT) {
4037                 ssh_state = SSH_STATE_CLOSED;
4038                 logevent("Received disconnect message");
4039                 crReturnV;
4040             } else if (pktin.type == SSH2_MSG_CHANNEL_REQUEST) {
4041                 continue;              /* exit status et al; ignore (FIXME?) */
4042             } else if (pktin.type == SSH2_MSG_CHANNEL_EOF) {
4043                 unsigned i = ssh2_pkt_getuint32();
4044                 struct ssh_channel *c;
4045
4046                 c = find234(ssh_channels, &i, ssh_channelfind);
4047                 if (!c)
4048                     continue;          /* nonexistent channel */
4049
4050                 if (c->type == CHAN_X11) {
4051                     /*
4052                      * Remote EOF on an X11 channel means we should
4053                      * wrap up and close the channel ourselves.
4054                      */
4055                     x11_close(c->u.x11.s);
4056                     sshfwd_close(c);
4057                 } else if (c->type == CHAN_AGENT) {
4058                     sshfwd_close(c);
4059                 }
4060             } else if (pktin.type == SSH2_MSG_CHANNEL_CLOSE) {
4061                 unsigned i = ssh2_pkt_getuint32();
4062                 struct ssh_channel *c;
4063
4064                 c = find234(ssh_channels, &i, ssh_channelfind);
4065                 if (!c)
4066                     continue;          /* nonexistent channel */
4067                 if (c->closes == 0) {
4068                     ssh2_pkt_init(SSH2_MSG_CHANNEL_CLOSE);
4069                     ssh2_pkt_adduint32(c->remoteid);
4070                     ssh2_pkt_send();
4071                 }
4072                 /* Do pre-close processing on the channel. */
4073                 switch (c->type) {
4074                   case CHAN_MAINSESSION:
4075                     break;             /* nothing to see here, move along */
4076                   case CHAN_X11:
4077                     break;
4078                   case CHAN_AGENT:
4079                     break;
4080                 }
4081                 del234(ssh_channels, c);
4082                 sfree(c->v2.outbuffer);
4083                 sfree(c);
4084
4085                 /*
4086                  * See if that was the last channel left open.
4087                  */
4088                 if (count234(ssh_channels) == 0) {
4089                     logevent("All channels closed. Disconnecting");
4090                     ssh2_pkt_init(SSH2_MSG_DISCONNECT);
4091                     ssh2_pkt_adduint32(SSH2_DISCONNECT_BY_APPLICATION);
4092                     ssh2_pkt_addstring("All open channels closed");
4093                     ssh2_pkt_addstring("en");   /* language tag */
4094                     ssh2_pkt_send();
4095                     ssh_state = SSH_STATE_CLOSED;
4096                     crReturnV;
4097                 }
4098                 continue;              /* remote sends close; ignore (FIXME) */
4099             } else if (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST) {
4100                 unsigned i = ssh2_pkt_getuint32();
4101                 struct ssh_channel *c;
4102                 c = find234(ssh_channels, &i, ssh_channelfind);
4103                 if (!c)
4104                     continue;          /* nonexistent channel */
4105                 c->v2.remwindow += ssh2_pkt_getuint32();
4106                 try_send = TRUE;
4107             } else if (pktin.type == SSH2_MSG_CHANNEL_OPEN) {
4108                 char *type;
4109                 int typelen;
4110                 char *error = NULL;
4111                 struct ssh_channel *c;
4112                 ssh2_pkt_getstring(&type, &typelen);
4113                 c = smalloc(sizeof(struct ssh_channel));
4114
4115                 if (typelen == 3 && !memcmp(type, "x11", 3)) {
4116                     if (!ssh_X11_fwd_enabled)
4117                         error = "X11 forwarding is not enabled";
4118                     else if (x11_init(&c->u.x11.s, cfg.x11_display, c) !=
4119                              NULL) {
4120                         error = "Unable to open an X11 connection";
4121                     } else {
4122                         c->type = CHAN_X11;
4123                     }
4124                 } else if (typelen == 22 &&
4125                            !memcmp(type, "auth-agent@openssh.com", 3)) {
4126                     if (!ssh_agentfwd_enabled)
4127                         error = "Agent forwarding is not enabled";
4128                     else {
4129                         c->type = CHAN_AGENT;   /* identify channel type */
4130                         c->u.a.lensofar = 0;
4131                     }
4132                 } else {
4133                     error = "Unsupported channel type requested";
4134                 }
4135
4136                 c->remoteid = ssh2_pkt_getuint32();
4137                 if (error) {
4138                     ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_FAILURE);
4139                     ssh2_pkt_adduint32(c->remoteid);
4140                     ssh2_pkt_adduint32(SSH2_OPEN_CONNECT_FAILED);
4141                     ssh2_pkt_addstring(error);
4142                     ssh2_pkt_addstring("en");   /* language tag */
4143                     ssh2_pkt_send();
4144                     sfree(c);
4145                 } else {
4146                     c->localid = alloc_channel_id();
4147                     c->closes = 0;
4148                     c->v2.remwindow = ssh2_pkt_getuint32();
4149                     c->v2.remmaxpkt = ssh2_pkt_getuint32();
4150                     c->v2.outbuffer = NULL;
4151                     c->v2.outbuflen = c->v2.outbufsize = 0;
4152                     add234(ssh_channels, c);
4153                     ssh2_pkt_init(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
4154                     ssh2_pkt_adduint32(c->remoteid);
4155                     ssh2_pkt_adduint32(c->localid);
4156                     ssh2_pkt_adduint32(0x8000UL);       /* our window size */
4157                     ssh2_pkt_adduint32(0x4000UL);       /* our max pkt size */
4158                     ssh2_pkt_send();
4159                 }
4160             } else {
4161                 bombout(("Strange packet received: type %d", pktin.type));
4162                 crReturnV;
4163             }
4164         } else {
4165             /*
4166              * We have spare data. Add it to the channel buffer.
4167              */
4168             ssh2_add_channel_data(mainchan, in, inlen);
4169             try_send = TRUE;
4170         }
4171         if (try_send) {
4172             int i;
4173             struct ssh_channel *c;
4174             /*
4175              * Try to send data on all channels if we can.
4176              */
4177             for (i = 0; NULL != (c = index234(ssh_channels, i)); i++)
4178                 ssh2_try_send(c);
4179         }
4180     }
4181
4182     crFinishV;
4183 }
4184
4185 /*
4186  * Handle the top-level SSH2 protocol.
4187  */
4188 static void ssh2_protocol(unsigned char *in, int inlen, int ispkt)
4189 {
4190     if (do_ssh2_transport(in, inlen, ispkt) == 0)
4191         return;
4192     do_ssh2_authconn(in, inlen, ispkt);
4193 }
4194
4195 /*
4196  * Called to set up the connection.
4197  *
4198  * Returns an error message, or NULL on success.
4199  */
4200 static char *ssh_init(char *host, int port, char **realhost)
4201 {
4202     char *p;
4203
4204 #ifdef MSCRYPTOAPI
4205     if (crypto_startup() == 0)
4206         return "Microsoft high encryption pack not installed!";
4207 #endif
4208
4209     ssh_send_ok = 0;
4210     ssh_editing = 0;
4211     ssh_echoing = 0;
4212
4213     p = connect_to_host(host, port, realhost);
4214     if (p != NULL)
4215         return p;
4216
4217     return NULL;
4218 }
4219
4220 /*
4221  * Called to send data down the Telnet connection.
4222  */
4223 static void ssh_send(char *buf, int len)
4224 {
4225     if (s == NULL || ssh_protocol == NULL)
4226         return;
4227
4228     ssh_protocol(buf, len, 0);
4229 }
4230
4231 /*
4232  * Called to set the size of the window from SSH's POV.
4233  */
4234 static void ssh_size(void)
4235 {
4236     switch (ssh_state) {
4237       case SSH_STATE_BEFORE_SIZE:
4238       case SSH_STATE_PREPACKET:
4239       case SSH_STATE_CLOSED:
4240         break;                         /* do nothing */
4241       case SSH_STATE_INTERMED:
4242         size_needed = TRUE;            /* buffer for later */
4243         break;
4244       case SSH_STATE_SESSION:
4245         if (!cfg.nopty) {
4246             if (ssh_version == 1) {
4247                 send_packet(SSH1_CMSG_WINDOW_SIZE,
4248                             PKT_INT, rows, PKT_INT, cols,
4249                             PKT_INT, 0, PKT_INT, 0, PKT_END);
4250             } else {
4251                 ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
4252                 ssh2_pkt_adduint32(mainchan->remoteid);
4253                 ssh2_pkt_addstring("window-change");
4254                 ssh2_pkt_addbool(0);
4255                 ssh2_pkt_adduint32(cols);
4256                 ssh2_pkt_adduint32(rows);
4257                 ssh2_pkt_adduint32(0);
4258                 ssh2_pkt_adduint32(0);
4259                 ssh2_pkt_send();
4260             }
4261         }
4262         break;
4263     }
4264 }
4265
4266 /*
4267  * Send Telnet special codes. TS_EOF is useful for `plink', so you
4268  * can send an EOF and collect resulting output (e.g. `plink
4269  * hostname sort').
4270  */
4271 static void ssh_special(Telnet_Special code)
4272 {
4273     if (code == TS_EOF) {
4274         if (ssh_state != SSH_STATE_SESSION) {
4275             /*
4276              * Buffer the EOF in case we are pre-SESSION, so we can
4277              * send it as soon as we reach SESSION.
4278              */
4279             if (code == TS_EOF)
4280                 eof_needed = TRUE;
4281             return;
4282         }
4283         if (ssh_version == 1) {
4284             send_packet(SSH1_CMSG_EOF, PKT_END);
4285         } else {
4286             ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF);
4287             ssh2_pkt_adduint32(mainchan->remoteid);
4288             ssh2_pkt_send();
4289         }
4290         logevent("Sent EOF message");
4291     } else if (code == TS_PING) {
4292         if (ssh_state == SSH_STATE_CLOSED
4293             || ssh_state == SSH_STATE_PREPACKET) return;
4294         if (ssh_version == 1) {
4295             send_packet(SSH1_MSG_IGNORE, PKT_STR, "", PKT_END);
4296         } else {
4297             ssh2_pkt_init(SSH2_MSG_IGNORE);
4298             ssh2_pkt_addstring_start();
4299             ssh2_pkt_send();
4300         }
4301     } else {
4302         /* do nothing */
4303     }
4304 }
4305
4306 static Socket ssh_socket(void)
4307 {
4308     return s;
4309 }
4310
4311 static int ssh_sendok(void)
4312 {
4313     return ssh_send_ok;
4314 }
4315
4316 static int ssh_ldisc(int option)
4317 {
4318     if (option == LD_ECHO)
4319         return ssh_echoing;
4320     if (option == LD_EDIT)
4321         return ssh_editing;
4322     return FALSE;
4323 }
4324
4325 Backend ssh_backend = {
4326     ssh_init,
4327     ssh_send,
4328     ssh_size,
4329     ssh_special,
4330     ssh_socket,
4331     ssh_sendok,
4332     ssh_ldisc,
4333     22
4334 };