sshconnect2.c revision 294693
1/* $OpenBSD: sshconnect2.c,v 1.204 2014/02/02 03:44:32 djm Exp $ */
2/*
3 * Copyright (c) 2000 Markus Friedl.  All rights reserved.
4 * Copyright (c) 2008 Damien Miller.  All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include "includes.h"
28
29#include <sys/types.h>
30#include <sys/socket.h>
31#include <sys/wait.h>
32#include <sys/stat.h>
33
34#include <errno.h>
35#include <fcntl.h>
36#include <netdb.h>
37#include <pwd.h>
38#include <signal.h>
39#include <stdarg.h>
40#include <stdio.h>
41#include <string.h>
42#include <unistd.h>
43#if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H) && !defined(BROKEN_STRNVIS)
44#include <vis.h>
45#endif
46
47#include "openbsd-compat/sys-queue.h"
48
49#include "xmalloc.h"
50#include "ssh.h"
51#include "ssh2.h"
52#include "buffer.h"
53#include "packet.h"
54#include "compat.h"
55#include "cipher.h"
56#include "key.h"
57#include "kex.h"
58#include "myproposal.h"
59#include "sshconnect.h"
60#include "authfile.h"
61#include "dh.h"
62#include "authfd.h"
63#include "log.h"
64#include "readconf.h"
65#include "misc.h"
66#include "match.h"
67#include "dispatch.h"
68#include "canohost.h"
69#include "msg.h"
70#include "pathnames.h"
71#include "uidswap.h"
72#include "hostfile.h"
73
74#ifdef GSSAPI
75#include "ssh-gss.h"
76#endif
77
78/* import */
79extern char *client_version_string;
80extern char *server_version_string;
81extern Options options;
82
83/*
84 * SSH2 key exchange
85 */
86
87u_char *session_id2 = NULL;
88u_int session_id2_len = 0;
89
90char *xxx_host;
91struct sockaddr *xxx_hostaddr;
92
93Kex *xxx_kex = NULL;
94
95static int
96verify_host_key_callback(Key *hostkey)
97{
98	if (verify_host_key(xxx_host, xxx_hostaddr, hostkey) == -1)
99		fatal("Host key verification failed.");
100	return 0;
101}
102
103static char *
104order_hostkeyalgs(char *host, struct sockaddr *hostaddr, u_short port)
105{
106	char *oavail, *avail, *first, *last, *alg, *hostname, *ret;
107	size_t maxlen;
108	struct hostkeys *hostkeys;
109	int ktype;
110	u_int i;
111
112	/* Find all hostkeys for this hostname */
113	get_hostfile_hostname_ipaddr(host, hostaddr, port, &hostname, NULL);
114	hostkeys = init_hostkeys();
115	for (i = 0; i < options.num_user_hostfiles; i++)
116		load_hostkeys(hostkeys, hostname, options.user_hostfiles[i]);
117	for (i = 0; i < options.num_system_hostfiles; i++)
118		load_hostkeys(hostkeys, hostname, options.system_hostfiles[i]);
119
120	oavail = avail = xstrdup(KEX_DEFAULT_PK_ALG);
121	maxlen = strlen(avail) + 1;
122	first = xmalloc(maxlen);
123	last = xmalloc(maxlen);
124	*first = *last = '\0';
125
126#define ALG_APPEND(to, from) \
127	do { \
128		if (*to != '\0') \
129			strlcat(to, ",", maxlen); \
130		strlcat(to, from, maxlen); \
131	} while (0)
132
133	while ((alg = strsep(&avail, ",")) && *alg != '\0') {
134		if ((ktype = key_type_from_name(alg)) == KEY_UNSPEC)
135			fatal("%s: unknown alg %s", __func__, alg);
136		if (lookup_key_in_hostkeys_by_type(hostkeys,
137		    key_type_plain(ktype), NULL))
138			ALG_APPEND(first, alg);
139		else
140			ALG_APPEND(last, alg);
141	}
142#undef ALG_APPEND
143	xasprintf(&ret, "%s%s%s", first, *first == '\0' ? "" : ",", last);
144	if (*first != '\0')
145		debug3("%s: prefer hostkeyalgs: %s", __func__, first);
146
147	free(first);
148	free(last);
149	free(hostname);
150	free(oavail);
151	free_hostkeys(hostkeys);
152
153	return ret;
154}
155
156void
157ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
158{
159	Kex *kex;
160
161	xxx_host = host;
162	xxx_hostaddr = hostaddr;
163
164	if (options.ciphers == (char *)-1) {
165		logit("No valid ciphers for protocol version 2 given, using defaults.");
166		options.ciphers = NULL;
167	}
168	if (options.ciphers != NULL) {
169		myproposal[PROPOSAL_ENC_ALGS_CTOS] =
170		myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers;
171	}
172	myproposal[PROPOSAL_ENC_ALGS_CTOS] =
173	    compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_CTOS]);
174	myproposal[PROPOSAL_ENC_ALGS_STOC] =
175	    compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_STOC]);
176	if (options.compression) {
177		myproposal[PROPOSAL_COMP_ALGS_CTOS] =
178		myproposal[PROPOSAL_COMP_ALGS_STOC] = "zlib@openssh.com,zlib,none";
179	} else {
180		myproposal[PROPOSAL_COMP_ALGS_CTOS] =
181		myproposal[PROPOSAL_COMP_ALGS_STOC] = "none,zlib@openssh.com,zlib";
182	}
183	if (options.macs != NULL) {
184		myproposal[PROPOSAL_MAC_ALGS_CTOS] =
185		myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs;
186	}
187	if (options.hostkeyalgorithms != NULL)
188		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] =
189		    compat_pkalg_proposal(options.hostkeyalgorithms);
190	else {
191		/* Prefer algorithms that we already have keys for */
192		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] =
193		    compat_pkalg_proposal(
194		    order_hostkeyalgs(host, hostaddr, port));
195	}
196	if (options.kex_algorithms != NULL)
197		myproposal[PROPOSAL_KEX_ALGS] = options.kex_algorithms;
198	myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal(
199	    myproposal[PROPOSAL_KEX_ALGS]);
200
201	if (options.rekey_limit || options.rekey_interval)
202		packet_set_rekey_limits((u_int32_t)options.rekey_limit,
203		    (time_t)options.rekey_interval);
204
205	/* start key exchange */
206	kex = kex_setup(myproposal);
207	kex->kex[KEX_DH_GRP1_SHA1] = kexdh_client;
208	kex->kex[KEX_DH_GRP14_SHA1] = kexdh_client;
209	kex->kex[KEX_DH_GEX_SHA1] = kexgex_client;
210	kex->kex[KEX_DH_GEX_SHA256] = kexgex_client;
211	kex->kex[KEX_ECDH_SHA2] = kexecdh_client;
212	kex->kex[KEX_C25519_SHA256] = kexc25519_client;
213	kex->client_version_string=client_version_string;
214	kex->server_version_string=server_version_string;
215	kex->verify_host_key=&verify_host_key_callback;
216
217	xxx_kex = kex;
218
219	dispatch_run(DISPATCH_BLOCK, &kex->done, kex);
220
221	if (options.use_roaming && !kex->roaming) {
222		debug("Roaming not allowed by server");
223		options.use_roaming = 0;
224	}
225
226	session_id2 = kex->session_id;
227	session_id2_len = kex->session_id_len;
228
229#ifdef DEBUG_KEXDH
230	/* send 1st encrypted/maced/compressed message */
231	packet_start(SSH2_MSG_IGNORE);
232	packet_put_cstring("markus");
233	packet_send();
234	packet_write_wait();
235#endif
236}
237
238/*
239 * Authenticate user
240 */
241
242typedef struct Authctxt Authctxt;
243typedef struct Authmethod Authmethod;
244typedef struct identity Identity;
245typedef struct idlist Idlist;
246
247struct identity {
248	TAILQ_ENTRY(identity) next;
249	AuthenticationConnection *ac;	/* set if agent supports key */
250	Key	*key;			/* public/private key */
251	char	*filename;		/* comment for agent-only keys */
252	int	tried;
253	int	isprivate;		/* key points to the private key */
254	int	userprovided;
255};
256TAILQ_HEAD(idlist, identity);
257
258struct Authctxt {
259	const char *server_user;
260	const char *local_user;
261	const char *host;
262	const char *service;
263	Authmethod *method;
264	sig_atomic_t success;
265	char *authlist;
266	/* pubkey */
267	Idlist keys;
268	AuthenticationConnection *agent;
269	/* hostbased */
270	Sensitive *sensitive;
271	/* kbd-interactive */
272	int info_req_seen;
273	/* generic */
274	void *methoddata;
275};
276struct Authmethod {
277	char	*name;		/* string to compare against server's list */
278	int	(*userauth)(Authctxt *authctxt);
279	void	(*cleanup)(Authctxt *authctxt);
280	int	*enabled;	/* flag in option struct that enables method */
281	int	*batch_flag;	/* flag in option struct that disables method */
282};
283
284void	input_userauth_success(int, u_int32_t, void *);
285void	input_userauth_success_unexpected(int, u_int32_t, void *);
286void	input_userauth_failure(int, u_int32_t, void *);
287void	input_userauth_banner(int, u_int32_t, void *);
288void	input_userauth_error(int, u_int32_t, void *);
289void	input_userauth_info_req(int, u_int32_t, void *);
290void	input_userauth_pk_ok(int, u_int32_t, void *);
291void	input_userauth_passwd_changereq(int, u_int32_t, void *);
292
293int	userauth_none(Authctxt *);
294int	userauth_pubkey(Authctxt *);
295int	userauth_passwd(Authctxt *);
296int	userauth_kbdint(Authctxt *);
297int	userauth_hostbased(Authctxt *);
298
299#ifdef GSSAPI
300int	userauth_gssapi(Authctxt *authctxt);
301void	input_gssapi_response(int type, u_int32_t, void *);
302void	input_gssapi_token(int type, u_int32_t, void *);
303void	input_gssapi_hash(int type, u_int32_t, void *);
304void	input_gssapi_error(int, u_int32_t, void *);
305void	input_gssapi_errtok(int, u_int32_t, void *);
306#endif
307
308void	userauth(Authctxt *, char *);
309
310static int sign_and_send_pubkey(Authctxt *, Identity *);
311static void pubkey_prepare(Authctxt *);
312static void pubkey_cleanup(Authctxt *);
313static Key *load_identity_file(char *, int);
314
315static Authmethod *authmethod_get(char *authlist);
316static Authmethod *authmethod_lookup(const char *name);
317static char *authmethods_get(void);
318
319Authmethod authmethods[] = {
320#ifdef GSSAPI
321	{"gssapi-with-mic",
322		userauth_gssapi,
323		NULL,
324		&options.gss_authentication,
325		NULL},
326#endif
327	{"hostbased",
328		userauth_hostbased,
329		NULL,
330		&options.hostbased_authentication,
331		NULL},
332	{"publickey",
333		userauth_pubkey,
334		NULL,
335		&options.pubkey_authentication,
336		NULL},
337	{"keyboard-interactive",
338		userauth_kbdint,
339		NULL,
340		&options.kbd_interactive_authentication,
341		&options.batch_mode},
342	{"password",
343		userauth_passwd,
344		NULL,
345		&options.password_authentication,
346		&options.batch_mode},
347	{"none",
348		userauth_none,
349		NULL,
350		NULL,
351		NULL},
352	{NULL, NULL, NULL, NULL, NULL}
353};
354
355void
356ssh_userauth2(const char *local_user, const char *server_user, char *host,
357    Sensitive *sensitive)
358{
359	Authctxt authctxt;
360	int type;
361
362	if (options.challenge_response_authentication)
363		options.kbd_interactive_authentication = 1;
364
365	packet_start(SSH2_MSG_SERVICE_REQUEST);
366	packet_put_cstring("ssh-userauth");
367	packet_send();
368	debug("SSH2_MSG_SERVICE_REQUEST sent");
369	packet_write_wait();
370	type = packet_read();
371	if (type != SSH2_MSG_SERVICE_ACCEPT)
372		fatal("Server denied authentication request: %d", type);
373	if (packet_remaining() > 0) {
374		char *reply = packet_get_string(NULL);
375		debug2("service_accept: %s", reply);
376		free(reply);
377	} else {
378		debug2("buggy server: service_accept w/o service");
379	}
380	packet_check_eom();
381	debug("SSH2_MSG_SERVICE_ACCEPT received");
382
383	if (options.preferred_authentications == NULL)
384		options.preferred_authentications = authmethods_get();
385
386	/* setup authentication context */
387	memset(&authctxt, 0, sizeof(authctxt));
388	pubkey_prepare(&authctxt);
389	authctxt.server_user = server_user;
390	authctxt.local_user = local_user;
391	authctxt.host = host;
392	authctxt.service = "ssh-connection";		/* service name */
393	authctxt.success = 0;
394	authctxt.method = authmethod_lookup("none");
395	authctxt.authlist = NULL;
396	authctxt.methoddata = NULL;
397	authctxt.sensitive = sensitive;
398	authctxt.info_req_seen = 0;
399	if (authctxt.method == NULL)
400		fatal("ssh_userauth2: internal error: cannot send userauth none request");
401
402	/* initial userauth request */
403	userauth_none(&authctxt);
404
405	dispatch_init(&input_userauth_error);
406	dispatch_set(SSH2_MSG_USERAUTH_SUCCESS, &input_userauth_success);
407	dispatch_set(SSH2_MSG_USERAUTH_FAILURE, &input_userauth_failure);
408	dispatch_set(SSH2_MSG_USERAUTH_BANNER, &input_userauth_banner);
409	dispatch_run(DISPATCH_BLOCK, &authctxt.success, &authctxt);	/* loop until success */
410
411	pubkey_cleanup(&authctxt);
412	dispatch_range(SSH2_MSG_USERAUTH_MIN, SSH2_MSG_USERAUTH_MAX, NULL);
413
414	debug("Authentication succeeded (%s).", authctxt.method->name);
415}
416
417void
418userauth(Authctxt *authctxt, char *authlist)
419{
420	if (authctxt->method != NULL && authctxt->method->cleanup != NULL)
421		authctxt->method->cleanup(authctxt);
422
423	free(authctxt->methoddata);
424	authctxt->methoddata = NULL;
425	if (authlist == NULL) {
426		authlist = authctxt->authlist;
427	} else {
428		free(authctxt->authlist);
429		authctxt->authlist = authlist;
430	}
431	for (;;) {
432		Authmethod *method = authmethod_get(authlist);
433		if (method == NULL)
434			fatal("Permission denied (%s).", authlist);
435		authctxt->method = method;
436
437		/* reset the per method handler */
438		dispatch_range(SSH2_MSG_USERAUTH_PER_METHOD_MIN,
439		    SSH2_MSG_USERAUTH_PER_METHOD_MAX, NULL);
440
441		/* and try new method */
442		if (method->userauth(authctxt) != 0) {
443			debug2("we sent a %s packet, wait for reply", method->name);
444			break;
445		} else {
446			debug2("we did not send a packet, disable method");
447			method->enabled = NULL;
448		}
449	}
450}
451
452/* ARGSUSED */
453void
454input_userauth_error(int type, u_int32_t seq, void *ctxt)
455{
456	fatal("input_userauth_error: bad message during authentication: "
457	    "type %d", type);
458}
459
460/* ARGSUSED */
461void
462input_userauth_banner(int type, u_int32_t seq, void *ctxt)
463{
464	char *msg, *raw, *lang;
465	u_int len;
466
467	debug3("input_userauth_banner");
468	raw = packet_get_string(&len);
469	lang = packet_get_string(NULL);
470	if (len > 0 && options.log_level >= SYSLOG_LEVEL_INFO) {
471		if (len > 65536)
472			len = 65536;
473		msg = xmalloc(len * 4 + 1); /* max expansion from strnvis() */
474		strnvis(msg, raw, len * 4 + 1, VIS_SAFE|VIS_OCTAL|VIS_NOSLASH);
475		fprintf(stderr, "%s", msg);
476		free(msg);
477	}
478	free(raw);
479	free(lang);
480}
481
482/* ARGSUSED */
483void
484input_userauth_success(int type, u_int32_t seq, void *ctxt)
485{
486	Authctxt *authctxt = ctxt;
487
488	if (authctxt == NULL)
489		fatal("input_userauth_success: no authentication context");
490	free(authctxt->authlist);
491	authctxt->authlist = NULL;
492	if (authctxt->method != NULL && authctxt->method->cleanup != NULL)
493		authctxt->method->cleanup(authctxt);
494	free(authctxt->methoddata);
495	authctxt->methoddata = NULL;
496	authctxt->success = 1;			/* break out */
497}
498
499void
500input_userauth_success_unexpected(int type, u_int32_t seq, void *ctxt)
501{
502	Authctxt *authctxt = ctxt;
503
504	if (authctxt == NULL)
505		fatal("%s: no authentication context", __func__);
506
507	fatal("Unexpected authentication success during %s.",
508	    authctxt->method->name);
509}
510
511/* ARGSUSED */
512void
513input_userauth_failure(int type, u_int32_t seq, void *ctxt)
514{
515	Authctxt *authctxt = ctxt;
516	char *authlist = NULL;
517	int partial;
518
519	if (authctxt == NULL)
520		fatal("input_userauth_failure: no authentication context");
521
522	authlist = packet_get_string(NULL);
523	partial = packet_get_char();
524	packet_check_eom();
525
526	if (partial != 0) {
527		logit("Authenticated with partial success.");
528		/* reset state */
529		pubkey_cleanup(authctxt);
530		pubkey_prepare(authctxt);
531	}
532	debug("Authentications that can continue: %s", authlist);
533
534	userauth(authctxt, authlist);
535}
536
537/* ARGSUSED */
538void
539input_userauth_pk_ok(int type, u_int32_t seq, void *ctxt)
540{
541	Authctxt *authctxt = ctxt;
542	Key *key = NULL;
543	Identity *id = NULL;
544	Buffer b;
545	int pktype, sent = 0;
546	u_int alen, blen;
547	char *pkalg, *fp;
548	u_char *pkblob;
549
550	if (authctxt == NULL)
551		fatal("input_userauth_pk_ok: no authentication context");
552	if (datafellows & SSH_BUG_PKOK) {
553		/* this is similar to SSH_BUG_PKAUTH */
554		debug2("input_userauth_pk_ok: SSH_BUG_PKOK");
555		pkblob = packet_get_string(&blen);
556		buffer_init(&b);
557		buffer_append(&b, pkblob, blen);
558		pkalg = buffer_get_string(&b, &alen);
559		buffer_free(&b);
560	} else {
561		pkalg = packet_get_string(&alen);
562		pkblob = packet_get_string(&blen);
563	}
564	packet_check_eom();
565
566	debug("Server accepts key: pkalg %s blen %u", pkalg, blen);
567
568	if ((pktype = key_type_from_name(pkalg)) == KEY_UNSPEC) {
569		debug("unknown pkalg %s", pkalg);
570		goto done;
571	}
572	if ((key = key_from_blob(pkblob, blen)) == NULL) {
573		debug("no key from blob. pkalg %s", pkalg);
574		goto done;
575	}
576	if (key->type != pktype) {
577		error("input_userauth_pk_ok: type mismatch "
578		    "for decoded key (received %d, expected %d)",
579		    key->type, pktype);
580		goto done;
581	}
582	fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
583	debug2("input_userauth_pk_ok: fp %s", fp);
584	free(fp);
585
586	/*
587	 * search keys in the reverse order, because last candidate has been
588	 * moved to the end of the queue.  this also avoids confusion by
589	 * duplicate keys
590	 */
591	TAILQ_FOREACH_REVERSE(id, &authctxt->keys, idlist, next) {
592		if (key_equal(key, id->key)) {
593			sent = sign_and_send_pubkey(authctxt, id);
594			break;
595		}
596	}
597done:
598	if (key != NULL)
599		key_free(key);
600	free(pkalg);
601	free(pkblob);
602
603	/* try another method if we did not send a packet */
604	if (sent == 0)
605		userauth(authctxt, NULL);
606}
607
608#ifdef GSSAPI
609int
610userauth_gssapi(Authctxt *authctxt)
611{
612	Gssctxt *gssctxt = NULL;
613	static gss_OID_set gss_supported = NULL;
614	static u_int mech = 0;
615	OM_uint32 min;
616	int ok = 0;
617
618	/* Try one GSSAPI method at a time, rather than sending them all at
619	 * once. */
620
621	if (gss_supported == NULL)
622		gss_indicate_mechs(&min, &gss_supported);
623
624	/* Check to see if the mechanism is usable before we offer it */
625	while (mech < gss_supported->count && !ok) {
626		/* My DER encoding requires length<128 */
627		if (gss_supported->elements[mech].length < 128 &&
628		    ssh_gssapi_check_mechanism(&gssctxt,
629		    &gss_supported->elements[mech], authctxt->host)) {
630			ok = 1; /* Mechanism works */
631		} else {
632			mech++;
633		}
634	}
635
636	if (!ok)
637		return 0;
638
639	authctxt->methoddata=(void *)gssctxt;
640
641	packet_start(SSH2_MSG_USERAUTH_REQUEST);
642	packet_put_cstring(authctxt->server_user);
643	packet_put_cstring(authctxt->service);
644	packet_put_cstring(authctxt->method->name);
645
646	packet_put_int(1);
647
648	packet_put_int((gss_supported->elements[mech].length) + 2);
649	packet_put_char(SSH_GSS_OIDTYPE);
650	packet_put_char(gss_supported->elements[mech].length);
651	packet_put_raw(gss_supported->elements[mech].elements,
652	    gss_supported->elements[mech].length);
653
654	packet_send();
655
656	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_RESPONSE, &input_gssapi_response);
657	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, &input_gssapi_token);
658	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERROR, &input_gssapi_error);
659	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, &input_gssapi_errtok);
660
661	mech++; /* Move along to next candidate */
662
663	return 1;
664}
665
666static OM_uint32
667process_gssapi_token(void *ctxt, gss_buffer_t recv_tok)
668{
669	Authctxt *authctxt = ctxt;
670	Gssctxt *gssctxt = authctxt->methoddata;
671	gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
672	gss_buffer_desc mic = GSS_C_EMPTY_BUFFER;
673	gss_buffer_desc gssbuf;
674	OM_uint32 status, ms, flags;
675	Buffer b;
676
677	status = ssh_gssapi_init_ctx(gssctxt, options.gss_deleg_creds,
678	    recv_tok, &send_tok, &flags);
679
680	if (send_tok.length > 0) {
681		if (GSS_ERROR(status))
682			packet_start(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK);
683		else
684			packet_start(SSH2_MSG_USERAUTH_GSSAPI_TOKEN);
685
686		packet_put_string(send_tok.value, send_tok.length);
687		packet_send();
688		gss_release_buffer(&ms, &send_tok);
689	}
690
691	if (status == GSS_S_COMPLETE) {
692		/* send either complete or MIC, depending on mechanism */
693		if (!(flags & GSS_C_INTEG_FLAG)) {
694			packet_start(SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE);
695			packet_send();
696		} else {
697			ssh_gssapi_buildmic(&b, authctxt->server_user,
698			    authctxt->service, "gssapi-with-mic");
699
700			gssbuf.value = buffer_ptr(&b);
701			gssbuf.length = buffer_len(&b);
702
703			status = ssh_gssapi_sign(gssctxt, &gssbuf, &mic);
704
705			if (!GSS_ERROR(status)) {
706				packet_start(SSH2_MSG_USERAUTH_GSSAPI_MIC);
707				packet_put_string(mic.value, mic.length);
708
709				packet_send();
710			}
711
712			buffer_free(&b);
713			gss_release_buffer(&ms, &mic);
714		}
715	}
716
717	return status;
718}
719
720/* ARGSUSED */
721void
722input_gssapi_response(int type, u_int32_t plen, void *ctxt)
723{
724	Authctxt *authctxt = ctxt;
725	Gssctxt *gssctxt;
726	int oidlen;
727	char *oidv;
728
729	if (authctxt == NULL)
730		fatal("input_gssapi_response: no authentication context");
731	gssctxt = authctxt->methoddata;
732
733	/* Setup our OID */
734	oidv = packet_get_string(&oidlen);
735
736	if (oidlen <= 2 ||
737	    oidv[0] != SSH_GSS_OIDTYPE ||
738	    oidv[1] != oidlen - 2) {
739		free(oidv);
740		debug("Badly encoded mechanism OID received");
741		userauth(authctxt, NULL);
742		return;
743	}
744
745	if (!ssh_gssapi_check_oid(gssctxt, oidv + 2, oidlen - 2))
746		fatal("Server returned different OID than expected");
747
748	packet_check_eom();
749
750	free(oidv);
751
752	if (GSS_ERROR(process_gssapi_token(ctxt, GSS_C_NO_BUFFER))) {
753		/* Start again with next method on list */
754		debug("Trying to start again");
755		userauth(authctxt, NULL);
756		return;
757	}
758}
759
760/* ARGSUSED */
761void
762input_gssapi_token(int type, u_int32_t plen, void *ctxt)
763{
764	Authctxt *authctxt = ctxt;
765	gss_buffer_desc recv_tok;
766	OM_uint32 status;
767	u_int slen;
768
769	if (authctxt == NULL)
770		fatal("input_gssapi_response: no authentication context");
771
772	recv_tok.value = packet_get_string(&slen);
773	recv_tok.length = slen;	/* safe typecast */
774
775	packet_check_eom();
776
777	status = process_gssapi_token(ctxt, &recv_tok);
778
779	free(recv_tok.value);
780
781	if (GSS_ERROR(status)) {
782		/* Start again with the next method in the list */
783		userauth(authctxt, NULL);
784		return;
785	}
786}
787
788/* ARGSUSED */
789void
790input_gssapi_errtok(int type, u_int32_t plen, void *ctxt)
791{
792	Authctxt *authctxt = ctxt;
793	Gssctxt *gssctxt;
794	gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
795	gss_buffer_desc recv_tok;
796	OM_uint32 ms;
797	u_int len;
798
799	if (authctxt == NULL)
800		fatal("input_gssapi_response: no authentication context");
801	gssctxt = authctxt->methoddata;
802
803	recv_tok.value = packet_get_string(&len);
804	recv_tok.length = len;
805
806	packet_check_eom();
807
808	/* Stick it into GSSAPI and see what it says */
809	(void)ssh_gssapi_init_ctx(gssctxt, options.gss_deleg_creds,
810	    &recv_tok, &send_tok, NULL);
811
812	free(recv_tok.value);
813	gss_release_buffer(&ms, &send_tok);
814
815	/* Server will be returning a failed packet after this one */
816}
817
818/* ARGSUSED */
819void
820input_gssapi_error(int type, u_int32_t plen, void *ctxt)
821{
822	char *msg;
823	char *lang;
824
825	/* maj */(void)packet_get_int();
826	/* min */(void)packet_get_int();
827	msg=packet_get_string(NULL);
828	lang=packet_get_string(NULL);
829
830	packet_check_eom();
831
832	debug("Server GSSAPI Error:\n%s", msg);
833	free(msg);
834	free(lang);
835}
836#endif /* GSSAPI */
837
838int
839userauth_none(Authctxt *authctxt)
840{
841	/* initial userauth request */
842	packet_start(SSH2_MSG_USERAUTH_REQUEST);
843	packet_put_cstring(authctxt->server_user);
844	packet_put_cstring(authctxt->service);
845	packet_put_cstring(authctxt->method->name);
846	packet_send();
847	return 1;
848}
849
850int
851userauth_passwd(Authctxt *authctxt)
852{
853	static int attempt = 0;
854	char prompt[150];
855	char *password;
856	const char *host = options.host_key_alias ?  options.host_key_alias :
857	    authctxt->host;
858
859	if (attempt++ >= options.number_of_password_prompts)
860		return 0;
861
862	if (attempt != 1)
863		error("Permission denied, please try again.");
864
865	snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",
866	    authctxt->server_user, host);
867	password = read_passphrase(prompt, 0);
868	packet_start(SSH2_MSG_USERAUTH_REQUEST);
869	packet_put_cstring(authctxt->server_user);
870	packet_put_cstring(authctxt->service);
871	packet_put_cstring(authctxt->method->name);
872	packet_put_char(0);
873	packet_put_cstring(password);
874	explicit_bzero(password, strlen(password));
875	free(password);
876	packet_add_padding(64);
877	packet_send();
878
879	dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,
880	    &input_userauth_passwd_changereq);
881
882	return 1;
883}
884
885/*
886 * parse PASSWD_CHANGEREQ, prompt user and send SSH2_MSG_USERAUTH_REQUEST
887 */
888/* ARGSUSED */
889void
890input_userauth_passwd_changereq(int type, u_int32_t seqnr, void *ctxt)
891{
892	Authctxt *authctxt = ctxt;
893	char *info, *lang, *password = NULL, *retype = NULL;
894	char prompt[150];
895	const char *host = options.host_key_alias ? options.host_key_alias :
896	    authctxt->host;
897
898	debug2("input_userauth_passwd_changereq");
899
900	if (authctxt == NULL)
901		fatal("input_userauth_passwd_changereq: "
902		    "no authentication context");
903
904	info = packet_get_string(NULL);
905	lang = packet_get_string(NULL);
906	if (strlen(info) > 0)
907		logit("%s", info);
908	free(info);
909	free(lang);
910	packet_start(SSH2_MSG_USERAUTH_REQUEST);
911	packet_put_cstring(authctxt->server_user);
912	packet_put_cstring(authctxt->service);
913	packet_put_cstring(authctxt->method->name);
914	packet_put_char(1);			/* additional info */
915	snprintf(prompt, sizeof(prompt),
916	    "Enter %.30s@%.128s's old password: ",
917	    authctxt->server_user, host);
918	password = read_passphrase(prompt, 0);
919	packet_put_cstring(password);
920	explicit_bzero(password, strlen(password));
921	free(password);
922	password = NULL;
923	while (password == NULL) {
924		snprintf(prompt, sizeof(prompt),
925		    "Enter %.30s@%.128s's new password: ",
926		    authctxt->server_user, host);
927		password = read_passphrase(prompt, RP_ALLOW_EOF);
928		if (password == NULL) {
929			/* bail out */
930			return;
931		}
932		snprintf(prompt, sizeof(prompt),
933		    "Retype %.30s@%.128s's new password: ",
934		    authctxt->server_user, host);
935		retype = read_passphrase(prompt, 0);
936		if (strcmp(password, retype) != 0) {
937			explicit_bzero(password, strlen(password));
938			free(password);
939			logit("Mismatch; try again, EOF to quit.");
940			password = NULL;
941		}
942		explicit_bzero(retype, strlen(retype));
943		free(retype);
944	}
945	packet_put_cstring(password);
946	explicit_bzero(password, strlen(password));
947	free(password);
948	packet_add_padding(64);
949	packet_send();
950
951	dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,
952	    &input_userauth_passwd_changereq);
953}
954
955static int
956identity_sign(Identity *id, u_char **sigp, u_int *lenp,
957    u_char *data, u_int datalen)
958{
959	Key *prv;
960	int ret;
961
962	/* the agent supports this key */
963	if (id->ac)
964		return (ssh_agent_sign(id->ac, id->key, sigp, lenp,
965		    data, datalen));
966	/*
967	 * we have already loaded the private key or
968	 * the private key is stored in external hardware
969	 */
970	if (id->isprivate || (id->key->flags & KEY_FLAG_EXT))
971		return (key_sign(id->key, sigp, lenp, data, datalen));
972	/* load the private key from the file */
973	if ((prv = load_identity_file(id->filename, id->userprovided)) == NULL)
974		return (-1);
975	ret = key_sign(prv, sigp, lenp, data, datalen);
976	key_free(prv);
977	return (ret);
978}
979
980static int
981sign_and_send_pubkey(Authctxt *authctxt, Identity *id)
982{
983	Buffer b;
984	u_char *blob, *signature;
985	u_int bloblen, slen;
986	u_int skip = 0;
987	int ret = -1;
988	int have_sig = 1;
989	char *fp;
990
991	fp = key_fingerprint(id->key, SSH_FP_MD5, SSH_FP_HEX);
992	debug3("sign_and_send_pubkey: %s %s", key_type(id->key), fp);
993	free(fp);
994
995	if (key_to_blob(id->key, &blob, &bloblen) == 0) {
996		/* we cannot handle this key */
997		debug3("sign_and_send_pubkey: cannot handle key");
998		return 0;
999	}
1000	/* data to be signed */
1001	buffer_init(&b);
1002	if (datafellows & SSH_OLD_SESSIONID) {
1003		buffer_append(&b, session_id2, session_id2_len);
1004		skip = session_id2_len;
1005	} else {
1006		buffer_put_string(&b, session_id2, session_id2_len);
1007		skip = buffer_len(&b);
1008	}
1009	buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
1010	buffer_put_cstring(&b, authctxt->server_user);
1011	buffer_put_cstring(&b,
1012	    datafellows & SSH_BUG_PKSERVICE ?
1013	    "ssh-userauth" :
1014	    authctxt->service);
1015	if (datafellows & SSH_BUG_PKAUTH) {
1016		buffer_put_char(&b, have_sig);
1017	} else {
1018		buffer_put_cstring(&b, authctxt->method->name);
1019		buffer_put_char(&b, have_sig);
1020		buffer_put_cstring(&b, key_ssh_name(id->key));
1021	}
1022	buffer_put_string(&b, blob, bloblen);
1023
1024	/* generate signature */
1025	ret = identity_sign(id, &signature, &slen,
1026	    buffer_ptr(&b), buffer_len(&b));
1027	if (ret == -1) {
1028		free(blob);
1029		buffer_free(&b);
1030		return 0;
1031	}
1032#ifdef DEBUG_PK
1033	buffer_dump(&b);
1034#endif
1035	if (datafellows & SSH_BUG_PKSERVICE) {
1036		buffer_clear(&b);
1037		buffer_append(&b, session_id2, session_id2_len);
1038		skip = session_id2_len;
1039		buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
1040		buffer_put_cstring(&b, authctxt->server_user);
1041		buffer_put_cstring(&b, authctxt->service);
1042		buffer_put_cstring(&b, authctxt->method->name);
1043		buffer_put_char(&b, have_sig);
1044		if (!(datafellows & SSH_BUG_PKAUTH))
1045			buffer_put_cstring(&b, key_ssh_name(id->key));
1046		buffer_put_string(&b, blob, bloblen);
1047	}
1048	free(blob);
1049
1050	/* append signature */
1051	buffer_put_string(&b, signature, slen);
1052	free(signature);
1053
1054	/* skip session id and packet type */
1055	if (buffer_len(&b) < skip + 1)
1056		fatal("userauth_pubkey: internal error");
1057	buffer_consume(&b, skip + 1);
1058
1059	/* put remaining data from buffer into packet */
1060	packet_start(SSH2_MSG_USERAUTH_REQUEST);
1061	packet_put_raw(buffer_ptr(&b), buffer_len(&b));
1062	buffer_free(&b);
1063	packet_send();
1064
1065	return 1;
1066}
1067
1068static int
1069send_pubkey_test(Authctxt *authctxt, Identity *id)
1070{
1071	u_char *blob;
1072	u_int bloblen, have_sig = 0;
1073
1074	debug3("send_pubkey_test");
1075
1076	if (key_to_blob(id->key, &blob, &bloblen) == 0) {
1077		/* we cannot handle this key */
1078		debug3("send_pubkey_test: cannot handle key");
1079		return 0;
1080	}
1081	/* register callback for USERAUTH_PK_OK message */
1082	dispatch_set(SSH2_MSG_USERAUTH_PK_OK, &input_userauth_pk_ok);
1083
1084	packet_start(SSH2_MSG_USERAUTH_REQUEST);
1085	packet_put_cstring(authctxt->server_user);
1086	packet_put_cstring(authctxt->service);
1087	packet_put_cstring(authctxt->method->name);
1088	packet_put_char(have_sig);
1089	if (!(datafellows & SSH_BUG_PKAUTH))
1090		packet_put_cstring(key_ssh_name(id->key));
1091	packet_put_string(blob, bloblen);
1092	free(blob);
1093	packet_send();
1094	return 1;
1095}
1096
1097static Key *
1098load_identity_file(char *filename, int userprovided)
1099{
1100	Key *private;
1101	char prompt[300], *passphrase;
1102	int perm_ok = 0, quit, i;
1103	struct stat st;
1104
1105	if (stat(filename, &st) < 0) {
1106		(userprovided ? logit : debug3)("no such identity: %s: %s",
1107		    filename, strerror(errno));
1108		return NULL;
1109	}
1110	private = key_load_private_type(KEY_UNSPEC, filename, "", NULL, &perm_ok);
1111	if (!perm_ok) {
1112		if (private != NULL)
1113			key_free(private);
1114		return NULL;
1115	}
1116	if (private == NULL) {
1117		if (options.batch_mode)
1118			return NULL;
1119		snprintf(prompt, sizeof prompt,
1120		    "Enter passphrase for key '%.100s': ", filename);
1121		for (i = 0; i < options.number_of_password_prompts; i++) {
1122			passphrase = read_passphrase(prompt, 0);
1123			if (strcmp(passphrase, "") != 0) {
1124				private = key_load_private_type(KEY_UNSPEC,
1125				    filename, passphrase, NULL, NULL);
1126				quit = 0;
1127			} else {
1128				debug2("no passphrase given, try next key");
1129				quit = 1;
1130			}
1131			explicit_bzero(passphrase, strlen(passphrase));
1132			free(passphrase);
1133			if (private != NULL || quit)
1134				break;
1135			debug2("bad passphrase given, try again...");
1136		}
1137	}
1138	return private;
1139}
1140
1141/*
1142 * try keys in the following order:
1143 *	1. agent keys that are found in the config file
1144 *	2. other agent keys
1145 *	3. keys that are only listed in the config file
1146 */
1147static void
1148pubkey_prepare(Authctxt *authctxt)
1149{
1150	Identity *id, *id2, *tmp;
1151	Idlist agent, files, *preferred;
1152	Key *key;
1153	AuthenticationConnection *ac;
1154	char *comment;
1155	int i, found;
1156
1157	TAILQ_INIT(&agent);	/* keys from the agent */
1158	TAILQ_INIT(&files);	/* keys from the config file */
1159	preferred = &authctxt->keys;
1160	TAILQ_INIT(preferred);	/* preferred order of keys */
1161
1162	/* list of keys stored in the filesystem and PKCS#11 */
1163	for (i = 0; i < options.num_identity_files; i++) {
1164		key = options.identity_keys[i];
1165		if (key && key->type == KEY_RSA1)
1166			continue;
1167		if (key && key->cert && key->cert->type != SSH2_CERT_TYPE_USER)
1168			continue;
1169		options.identity_keys[i] = NULL;
1170		id = xcalloc(1, sizeof(*id));
1171		id->key = key;
1172		id->filename = xstrdup(options.identity_files[i]);
1173		id->userprovided = options.identity_file_userprovided[i];
1174		TAILQ_INSERT_TAIL(&files, id, next);
1175	}
1176	/* Prefer PKCS11 keys that are explicitly listed */
1177	TAILQ_FOREACH_SAFE(id, &files, next, tmp) {
1178		if (id->key == NULL || (id->key->flags & KEY_FLAG_EXT) == 0)
1179			continue;
1180		found = 0;
1181		TAILQ_FOREACH(id2, &files, next) {
1182			if (id2->key == NULL ||
1183			    (id2->key->flags & KEY_FLAG_EXT) != 0)
1184				continue;
1185			if (key_equal(id->key, id2->key)) {
1186				TAILQ_REMOVE(&files, id, next);
1187				TAILQ_INSERT_TAIL(preferred, id, next);
1188				found = 1;
1189				break;
1190			}
1191		}
1192		/* If IdentitiesOnly set and key not found then don't use it */
1193		if (!found && options.identities_only) {
1194			TAILQ_REMOVE(&files, id, next);
1195			explicit_bzero(id, sizeof(*id));
1196			free(id);
1197		}
1198	}
1199	/* list of keys supported by the agent */
1200	if ((ac = ssh_get_authentication_connection())) {
1201		for (key = ssh_get_first_identity(ac, &comment, 2);
1202		    key != NULL;
1203		    key = ssh_get_next_identity(ac, &comment, 2)) {
1204			found = 0;
1205			TAILQ_FOREACH(id, &files, next) {
1206				/* agent keys from the config file are preferred */
1207				if (key_equal(key, id->key)) {
1208					key_free(key);
1209					free(comment);
1210					TAILQ_REMOVE(&files, id, next);
1211					TAILQ_INSERT_TAIL(preferred, id, next);
1212					id->ac = ac;
1213					found = 1;
1214					break;
1215				}
1216			}
1217			if (!found && !options.identities_only) {
1218				id = xcalloc(1, sizeof(*id));
1219				id->key = key;
1220				id->filename = comment;
1221				id->ac = ac;
1222				TAILQ_INSERT_TAIL(&agent, id, next);
1223			}
1224		}
1225		/* append remaining agent keys */
1226		for (id = TAILQ_FIRST(&agent); id; id = TAILQ_FIRST(&agent)) {
1227			TAILQ_REMOVE(&agent, id, next);
1228			TAILQ_INSERT_TAIL(preferred, id, next);
1229		}
1230		authctxt->agent = ac;
1231	}
1232	/* append remaining keys from the config file */
1233	for (id = TAILQ_FIRST(&files); id; id = TAILQ_FIRST(&files)) {
1234		TAILQ_REMOVE(&files, id, next);
1235		TAILQ_INSERT_TAIL(preferred, id, next);
1236	}
1237	TAILQ_FOREACH(id, preferred, next) {
1238		debug2("key: %s (%p),%s", id->filename, id->key,
1239		    id->userprovided ? " explicit" : "");
1240	}
1241}
1242
1243static void
1244pubkey_cleanup(Authctxt *authctxt)
1245{
1246	Identity *id;
1247
1248	if (authctxt->agent != NULL)
1249		ssh_close_authentication_connection(authctxt->agent);
1250	for (id = TAILQ_FIRST(&authctxt->keys); id;
1251	    id = TAILQ_FIRST(&authctxt->keys)) {
1252		TAILQ_REMOVE(&authctxt->keys, id, next);
1253		if (id->key)
1254			key_free(id->key);
1255		free(id->filename);
1256		free(id);
1257	}
1258}
1259
1260int
1261userauth_pubkey(Authctxt *authctxt)
1262{
1263	Identity *id;
1264	int sent = 0;
1265
1266	while ((id = TAILQ_FIRST(&authctxt->keys))) {
1267		if (id->tried++)
1268			return (0);
1269		/* move key to the end of the queue */
1270		TAILQ_REMOVE(&authctxt->keys, id, next);
1271		TAILQ_INSERT_TAIL(&authctxt->keys, id, next);
1272		/*
1273		 * send a test message if we have the public key. for
1274		 * encrypted keys we cannot do this and have to load the
1275		 * private key instead
1276		 */
1277		if (id->key != NULL) {
1278			if (key_type_plain(id->key->type) == KEY_RSA &&
1279			    (datafellows & SSH_BUG_RSASIGMD5) != 0) {
1280				debug("Skipped %s key %s for RSA/MD5 server",
1281				    key_type(id->key), id->filename);
1282			} else if (id->key->type != KEY_RSA1) {
1283				debug("Offering %s public key: %s",
1284				    key_type(id->key), id->filename);
1285				sent = send_pubkey_test(authctxt, id);
1286			}
1287		} else {
1288			debug("Trying private key: %s", id->filename);
1289			id->key = load_identity_file(id->filename,
1290			    id->userprovided);
1291			if (id->key != NULL) {
1292				id->isprivate = 1;
1293				if (key_type_plain(id->key->type) == KEY_RSA &&
1294				    (datafellows & SSH_BUG_RSASIGMD5) != 0) {
1295					debug("Skipped %s key %s for RSA/MD5 "
1296					    "server", key_type(id->key),
1297					    id->filename);
1298				} else {
1299					sent = sign_and_send_pubkey(
1300					    authctxt, id);
1301				}
1302				key_free(id->key);
1303				id->key = NULL;
1304			}
1305		}
1306		if (sent)
1307			return (sent);
1308	}
1309	return (0);
1310}
1311
1312/*
1313 * Send userauth request message specifying keyboard-interactive method.
1314 */
1315int
1316userauth_kbdint(Authctxt *authctxt)
1317{
1318	static int attempt = 0;
1319
1320	if (attempt++ >= options.number_of_password_prompts)
1321		return 0;
1322	/* disable if no SSH2_MSG_USERAUTH_INFO_REQUEST has been seen */
1323	if (attempt > 1 && !authctxt->info_req_seen) {
1324		debug3("userauth_kbdint: disable: no info_req_seen");
1325		dispatch_set(SSH2_MSG_USERAUTH_INFO_REQUEST, NULL);
1326		return 0;
1327	}
1328
1329	debug2("userauth_kbdint");
1330	packet_start(SSH2_MSG_USERAUTH_REQUEST);
1331	packet_put_cstring(authctxt->server_user);
1332	packet_put_cstring(authctxt->service);
1333	packet_put_cstring(authctxt->method->name);
1334	packet_put_cstring("");					/* lang */
1335	packet_put_cstring(options.kbd_interactive_devices ?
1336	    options.kbd_interactive_devices : "");
1337	packet_send();
1338
1339	dispatch_set(SSH2_MSG_USERAUTH_INFO_REQUEST, &input_userauth_info_req);
1340	return 1;
1341}
1342
1343/*
1344 * parse INFO_REQUEST, prompt user and send INFO_RESPONSE
1345 */
1346void
1347input_userauth_info_req(int type, u_int32_t seq, void *ctxt)
1348{
1349	Authctxt *authctxt = ctxt;
1350	char *name, *inst, *lang, *prompt, *response;
1351	u_int num_prompts, i;
1352	int echo = 0;
1353
1354	debug2("input_userauth_info_req");
1355
1356	if (authctxt == NULL)
1357		fatal("input_userauth_info_req: no authentication context");
1358
1359	authctxt->info_req_seen = 1;
1360
1361	name = packet_get_string(NULL);
1362	inst = packet_get_string(NULL);
1363	lang = packet_get_string(NULL);
1364	if (strlen(name) > 0)
1365		logit("%s", name);
1366	if (strlen(inst) > 0)
1367		logit("%s", inst);
1368	free(name);
1369	free(inst);
1370	free(lang);
1371
1372	num_prompts = packet_get_int();
1373	/*
1374	 * Begin to build info response packet based on prompts requested.
1375	 * We commit to providing the correct number of responses, so if
1376	 * further on we run into a problem that prevents this, we have to
1377	 * be sure and clean this up and send a correct error response.
1378	 */
1379	packet_start(SSH2_MSG_USERAUTH_INFO_RESPONSE);
1380	packet_put_int(num_prompts);
1381
1382	debug2("input_userauth_info_req: num_prompts %d", num_prompts);
1383	for (i = 0; i < num_prompts; i++) {
1384		prompt = packet_get_string(NULL);
1385		echo = packet_get_char();
1386
1387		response = read_passphrase(prompt, echo ? RP_ECHO : 0);
1388
1389		packet_put_cstring(response);
1390		explicit_bzero(response, strlen(response));
1391		free(response);
1392		free(prompt);
1393	}
1394	packet_check_eom(); /* done with parsing incoming message. */
1395
1396	packet_add_padding(64);
1397	packet_send();
1398}
1399
1400static int
1401ssh_keysign(Key *key, u_char **sigp, u_int *lenp,
1402    u_char *data, u_int datalen)
1403{
1404	Buffer b;
1405	struct stat st;
1406	pid_t pid;
1407	int to[2], from[2], status, version = 2;
1408
1409	debug2("ssh_keysign called");
1410
1411	if (stat(_PATH_SSH_KEY_SIGN, &st) < 0) {
1412		error("ssh_keysign: not installed: %s", strerror(errno));
1413		return -1;
1414	}
1415	if (fflush(stdout) != 0)
1416		error("ssh_keysign: fflush: %s", strerror(errno));
1417	if (pipe(to) < 0) {
1418		error("ssh_keysign: pipe: %s", strerror(errno));
1419		return -1;
1420	}
1421	if (pipe(from) < 0) {
1422		error("ssh_keysign: pipe: %s", strerror(errno));
1423		return -1;
1424	}
1425	if ((pid = fork()) < 0) {
1426		error("ssh_keysign: fork: %s", strerror(errno));
1427		return -1;
1428	}
1429	if (pid == 0) {
1430		/* keep the socket on exec */
1431		fcntl(packet_get_connection_in(), F_SETFD, 0);
1432		permanently_drop_suid(getuid());
1433		close(from[0]);
1434		if (dup2(from[1], STDOUT_FILENO) < 0)
1435			fatal("ssh_keysign: dup2: %s", strerror(errno));
1436		close(to[1]);
1437		if (dup2(to[0], STDIN_FILENO) < 0)
1438			fatal("ssh_keysign: dup2: %s", strerror(errno));
1439		close(from[1]);
1440		close(to[0]);
1441		execl(_PATH_SSH_KEY_SIGN, _PATH_SSH_KEY_SIGN, (char *) 0);
1442		fatal("ssh_keysign: exec(%s): %s", _PATH_SSH_KEY_SIGN,
1443		    strerror(errno));
1444	}
1445	close(from[1]);
1446	close(to[0]);
1447
1448	buffer_init(&b);
1449	buffer_put_int(&b, packet_get_connection_in()); /* send # of socket */
1450	buffer_put_string(&b, data, datalen);
1451	if (ssh_msg_send(to[1], version, &b) == -1)
1452		fatal("ssh_keysign: couldn't send request");
1453
1454	if (ssh_msg_recv(from[0], &b) < 0) {
1455		error("ssh_keysign: no reply");
1456		buffer_free(&b);
1457		return -1;
1458	}
1459	close(from[0]);
1460	close(to[1]);
1461
1462	while (waitpid(pid, &status, 0) < 0)
1463		if (errno != EINTR)
1464			break;
1465
1466	if (buffer_get_char(&b) != version) {
1467		error("ssh_keysign: bad version");
1468		buffer_free(&b);
1469		return -1;
1470	}
1471	*sigp = buffer_get_string(&b, lenp);
1472	buffer_free(&b);
1473
1474	return 0;
1475}
1476
1477int
1478userauth_hostbased(Authctxt *authctxt)
1479{
1480	Key *private = NULL;
1481	Sensitive *sensitive = authctxt->sensitive;
1482	Buffer b;
1483	u_char *signature, *blob;
1484	char *chost, *pkalg, *p;
1485	const char *service;
1486	u_int blen, slen;
1487	int ok, i, found = 0;
1488
1489	/* check for a useful key */
1490	for (i = 0; i < sensitive->nkeys; i++) {
1491		private = sensitive->keys[i];
1492		if (private && private->type != KEY_RSA1) {
1493			found = 1;
1494			/* we take and free the key */
1495			sensitive->keys[i] = NULL;
1496			break;
1497		}
1498	}
1499	if (!found) {
1500		debug("No more client hostkeys for hostbased authentication.");
1501		return 0;
1502	}
1503	if (key_to_blob(private, &blob, &blen) == 0) {
1504		key_free(private);
1505		return 0;
1506	}
1507	/* figure out a name for the client host */
1508	p = get_local_name(packet_get_connection_in());
1509	if (p == NULL) {
1510		error("userauth_hostbased: cannot get local ipaddr/name");
1511		key_free(private);
1512		free(blob);
1513		return 0;
1514	}
1515	xasprintf(&chost, "%s.", p);
1516	debug2("userauth_hostbased: chost %s", chost);
1517	free(p);
1518
1519	service = datafellows & SSH_BUG_HBSERVICE ? "ssh-userauth" :
1520	    authctxt->service;
1521	pkalg = xstrdup(key_ssh_name(private));
1522	buffer_init(&b);
1523	/* construct data */
1524	buffer_put_string(&b, session_id2, session_id2_len);
1525	buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST);
1526	buffer_put_cstring(&b, authctxt->server_user);
1527	buffer_put_cstring(&b, service);
1528	buffer_put_cstring(&b, authctxt->method->name);
1529	buffer_put_cstring(&b, pkalg);
1530	buffer_put_string(&b, blob, blen);
1531	buffer_put_cstring(&b, chost);
1532	buffer_put_cstring(&b, authctxt->local_user);
1533#ifdef DEBUG_PK
1534	buffer_dump(&b);
1535#endif
1536	if (sensitive->external_keysign)
1537		ok = ssh_keysign(private, &signature, &slen,
1538		    buffer_ptr(&b), buffer_len(&b));
1539	else
1540		ok = key_sign(private, &signature, &slen,
1541		    buffer_ptr(&b), buffer_len(&b));
1542	key_free(private);
1543	buffer_free(&b);
1544	if (ok != 0) {
1545		error("key_sign failed");
1546		free(chost);
1547		free(pkalg);
1548		free(blob);
1549		return 0;
1550	}
1551	packet_start(SSH2_MSG_USERAUTH_REQUEST);
1552	packet_put_cstring(authctxt->server_user);
1553	packet_put_cstring(authctxt->service);
1554	packet_put_cstring(authctxt->method->name);
1555	packet_put_cstring(pkalg);
1556	packet_put_string(blob, blen);
1557	packet_put_cstring(chost);
1558	packet_put_cstring(authctxt->local_user);
1559	packet_put_string(signature, slen);
1560	explicit_bzero(signature, slen);
1561	free(signature);
1562	free(chost);
1563	free(pkalg);
1564	free(blob);
1565
1566	packet_send();
1567	return 1;
1568}
1569
1570/* find auth method */
1571
1572/*
1573 * given auth method name, if configurable options permit this method fill
1574 * in auth_ident field and return true, otherwise return false.
1575 */
1576static int
1577authmethod_is_enabled(Authmethod *method)
1578{
1579	if (method == NULL)
1580		return 0;
1581	/* return false if options indicate this method is disabled */
1582	if  (method->enabled == NULL || *method->enabled == 0)
1583		return 0;
1584	/* return false if batch mode is enabled but method needs interactive mode */
1585	if  (method->batch_flag != NULL && *method->batch_flag != 0)
1586		return 0;
1587	return 1;
1588}
1589
1590static Authmethod *
1591authmethod_lookup(const char *name)
1592{
1593	Authmethod *method = NULL;
1594	if (name != NULL)
1595		for (method = authmethods; method->name != NULL; method++)
1596			if (strcmp(name, method->name) == 0)
1597				return method;
1598	debug2("Unrecognized authentication method name: %s", name ? name : "NULL");
1599	return NULL;
1600}
1601
1602/* XXX internal state */
1603static Authmethod *current = NULL;
1604static char *supported = NULL;
1605static char *preferred = NULL;
1606
1607/*
1608 * Given the authentication method list sent by the server, return the
1609 * next method we should try.  If the server initially sends a nil list,
1610 * use a built-in default list.
1611 */
1612static Authmethod *
1613authmethod_get(char *authlist)
1614{
1615	char *name = NULL;
1616	u_int next;
1617
1618	/* Use a suitable default if we're passed a nil list.  */
1619	if (authlist == NULL || strlen(authlist) == 0)
1620		authlist = options.preferred_authentications;
1621
1622	if (supported == NULL || strcmp(authlist, supported) != 0) {
1623		debug3("start over, passed a different list %s", authlist);
1624		free(supported);
1625		supported = xstrdup(authlist);
1626		preferred = options.preferred_authentications;
1627		debug3("preferred %s", preferred);
1628		current = NULL;
1629	} else if (current != NULL && authmethod_is_enabled(current))
1630		return current;
1631
1632	for (;;) {
1633		if ((name = match_list(preferred, supported, &next)) == NULL) {
1634			debug("No more authentication methods to try.");
1635			current = NULL;
1636			return NULL;
1637		}
1638		preferred += next;
1639		debug3("authmethod_lookup %s", name);
1640		debug3("remaining preferred: %s", preferred);
1641		if ((current = authmethod_lookup(name)) != NULL &&
1642		    authmethod_is_enabled(current)) {
1643			debug3("authmethod_is_enabled %s", name);
1644			debug("Next authentication method: %s", name);
1645			free(name);
1646			return current;
1647		}
1648		free(name);
1649	}
1650}
1651
1652static char *
1653authmethods_get(void)
1654{
1655	Authmethod *method = NULL;
1656	Buffer b;
1657	char *list;
1658
1659	buffer_init(&b);
1660	for (method = authmethods; method->name != NULL; method++) {
1661		if (authmethod_is_enabled(method)) {
1662			if (buffer_len(&b) > 0)
1663				buffer_append(&b, ",", 1);
1664			buffer_append(&b, method->name, strlen(method->name));
1665		}
1666	}
1667	buffer_append(&b, "\0", 1);
1668	list = xstrdup(buffer_ptr(&b));
1669	buffer_free(&b);
1670	return list;
1671}
1672
1673