1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Dropbear SSH
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2002,2003 Matt Johnston
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2004 by Mihnea Stoenescu
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * All rights reserved.
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * in the Software without restriction, including without limitation the rights
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * furnished to do so, subject to the following conditions:
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The above copyright notice and this permission notice shall be included in
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * all copies or substantial portions of the Software.
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SOFTWARE. */
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "includes.h"
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "session.h"
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "auth.h"
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "dbutil.h"
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "buffer.h"
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "ssh.h"
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "packet.h"
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "runopts.h"
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid cli_authinitialise() {
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	memset(&ses.authstate, 0, sizeof(ses.authstate));
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Send a "none" auth request to get available methods */
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid cli_auth_getmethods() {
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("enter cli_auth_getmethods"))
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	CHECKCLEARTOWRITE();
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	buf_putbyte(ses.writepayload, SSH_MSG_USERAUTH_REQUEST);
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	buf_putstring(ses.writepayload, cli_opts.username,
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			strlen(cli_opts.username));
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	buf_putstring(ses.writepayload, SSH_SERVICE_CONNECTION,
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			SSH_SERVICE_CONNECTION_LEN);
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	buf_putstring(ses.writepayload, "none", 4); /* 'none' method */
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	encrypt_packet();
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("leave cli_auth_getmethods"))
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid recv_msg_userauth_banner() {
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned char* banner = NULL;
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned int bannerlen;
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned int i, linecount;
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("enter recv_msg_userauth_banner"))
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (ses.authstate.authdone) {
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		TRACE(("leave recv_msg_userauth_banner: banner after auth done"))
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return;
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	banner = buf_getstring(ses.payload, &bannerlen);
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	buf_eatstring(ses.payload); /* The language string */
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (bannerlen > MAX_BANNER_SIZE) {
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		TRACE(("recv_msg_userauth_banner: bannerlen too long: %d", bannerlen))
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		goto out;
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	cleantext(banner);
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Limit to 25 lines */
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	linecount = 1;
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	for (i = 0; i < bannerlen; i++) {
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (banner[i] == '\n') {
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (linecount >= MAX_BANNER_LINES) {
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				banner[i] = '\0';
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				break;
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			}
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			linecount++;
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		}
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	printf("%s\n", banner);
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectout:
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	m_free(banner);
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("leave recv_msg_userauth_banner"))
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* This handles the message-specific types which
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * all have a value of 60. These are
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SSH_MSG_USERAUTH_PASSWD_CHANGEREQ,
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SSH_MSG_USERAUTH_PK_OK, &
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * SSH_MSG_USERAUTH_INFO_REQUEST. */
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid recv_msg_userauth_specific_60() {
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_PUBKEY_AUTH
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (cli_ses.lastauthtype == AUTH_TYPE_PUBKEY) {
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		recv_msg_userauth_pk_ok();
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return;
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_INTERACT_AUTH
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (cli_ses.lastauthtype == AUTH_TYPE_INTERACT) {
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		recv_msg_userauth_info_request();
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return;
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_PASSWORD_AUTH
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (cli_ses.lastauthtype == AUTH_TYPE_PASSWORD) {
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		/* Eventually there could be proper password-changing
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		 * support. However currently few servers seem to
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		 * implement it, and password auth is last-resort
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		 * regardless - keyboard-interactive is more likely
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		 * to be used anyway. */
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_close("Your password has expired.");
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	dropbear_exit("Unexpected userauth packet");
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid recv_msg_userauth_failure() {
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned char * methods = NULL;
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned char * tok = NULL;
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned int methlen = 0;
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned int partial = 0;
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned int i = 0;
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("<- MSG_USERAUTH_FAILURE"))
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("enter recv_msg_userauth_failure"))
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (cli_ses.state != USERAUTH_REQ_SENT) {
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		/* Perhaps we should be more fatal? */
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_exit("Unexpected userauth failure");
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_PUBKEY_AUTH
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* If it was a pubkey auth request, we should cross that key
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * off the list. */
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (cli_ses.lastauthtype == AUTH_TYPE_PUBKEY) {
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		cli_pubkeyfail();
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_INTERACT_AUTH
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* If we get a failure message for keyboard interactive without
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * receiving any request info packet, then we don't bother trying
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * keyboard interactive again */
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (cli_ses.lastauthtype == AUTH_TYPE_INTERACT
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			&& !cli_ses.interact_request_received) {
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		TRACE(("setting auth_interact_failed = 1"))
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		cli_ses.auth_interact_failed = 1;
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	cli_ses.lastauthtype = AUTH_TYPE_NONE;
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	methods = buf_getstring(ses.payload, &methlen);
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	partial = buf_getbool(ses.payload);
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (partial) {
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_log(LOG_INFO, "Authentication partially succeeded, more attempts required");
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	} else {
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		ses.authstate.failcount++;
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("Methods (len %d): '%s'", methlen, methods))
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.authstate.authdone=0;
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.authstate.authtypes=0;
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Split with nulls rather than commas */
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	for (i = 0; i < methlen; i++) {
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (methods[i] == ',') {
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			methods[i] = '\0';
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		}
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	tok = methods; /* tok stores the next method we'll compare */
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	for (i = 0; i <= methlen; i++) {
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (methods[i] == '\0') {
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			TRACE(("auth method '%s'", tok))
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_PUBKEY_AUTH
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (strncmp(AUTH_METHOD_PUBKEY, tok,
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				AUTH_METHOD_PUBKEY_LEN) == 0) {
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				ses.authstate.authtypes |= AUTH_TYPE_PUBKEY;
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			}
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_INTERACT_AUTH
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (strncmp(AUTH_METHOD_INTERACT, tok,
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				AUTH_METHOD_INTERACT_LEN) == 0) {
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				ses.authstate.authtypes |= AUTH_TYPE_INTERACT;
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			}
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_PASSWORD_AUTH
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (strncmp(AUTH_METHOD_PASSWORD, tok,
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				AUTH_METHOD_PASSWORD_LEN) == 0) {
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				ses.authstate.authtypes |= AUTH_TYPE_PASSWORD;
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			}
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			tok = &methods[i+1]; /* Must make sure we don't use it after the
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project									last loop, since it'll point to something
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project									undefined */
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		}
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	m_free(methods);
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	cli_ses.state = USERAUTH_FAIL_RCVD;
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("leave recv_msg_userauth_failure"))
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid recv_msg_userauth_success() {
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("received msg_userauth_success"))
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	ses.authstate.authdone = 1;
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	cli_ses.state = USERAUTH_SUCCESS_RCVD;
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	cli_ses.lastauthtype = AUTH_TYPE_NONE;
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid cli_auth_try() {
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	int finished = 0;
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("enter cli_auth_try"))
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	CHECKCLEARTOWRITE();
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Order to try is pubkey, interactive, password.
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * As soon as "finished" is set for one, we don't do any more. */
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_PUBKEY_AUTH
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (ses.authstate.authtypes & AUTH_TYPE_PUBKEY) {
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		finished = cli_auth_pubkey();
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		cli_ses.lastauthtype = AUTH_TYPE_PUBKEY;
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_INTERACT_AUTH
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (!finished && ses.authstate.authtypes & AUTH_TYPE_INTERACT) {
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		if (cli_ses.auth_interact_failed) {
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			finished = 0;
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		} else {
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			cli_auth_interactive();
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			cli_ses.lastauthtype = AUTH_TYPE_INTERACT;
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			finished = 1;
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		}
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_CLI_PASSWORD_AUTH
266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (!finished && ses.authstate.authtypes & AUTH_TYPE_PASSWORD) {
267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		cli_auth_password();
268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		finished = 1;
269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		cli_ses.lastauthtype = AUTH_TYPE_PASSWORD;
270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("cli_auth_try lastauthtype %d", cli_ses.lastauthtype))
274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (!finished) {
276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_exit("No auth methods could be used.");
277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("leave cli_auth_try"))
280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* A helper for getpass() that exits if the user cancels. The returned
283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * password is statically allocated by getpass() */
284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectchar* getpass_or_cancel(char* prompt)
285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char* password = NULL;
287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	password = getpass(prompt);
289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* 0x03 is a ctrl-c character in the buffer. */
291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (password == NULL || strchr(password, '\3') != NULL) {
292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_close("Interrupted.");
293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	return password;
295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
296