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