1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/*
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Dropbear SSH
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Copyright (c) 2004 Martin Carlsson
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Portions (c) 2004 Matt Johnston
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/* Validates a user password using PAM */
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "includes.h"
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "session.h"
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "buffer.h"
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "dbutil.h"
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "auth.h"
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ENABLE_SVR_PAM_AUTH
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if defined(HAVE_SECURITY_PAM_APPL_H)
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <security/pam_appl.h>
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#elif defined (HAVE_PAM_PAM_APPL_H)
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <pam/pam_appl.h>
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstruct UserDataS {
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char* user;
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char* passwd;
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project};
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* PAM conversation function - for now we only handle one message */
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectpamConvFunc(int num_msg,
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		const struct pam_message **msg,
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		struct pam_response **respp,
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		void *appdata_ptr) {
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	int rc = PAM_SUCCESS;
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct pam_response* resp = NULL;
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct UserDataS* userDatap = (struct UserDataS*) appdata_ptr;
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned int msg_len = 0;
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned int i = 0;
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	const char* message = (*msg)->msg;
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* make a copy we can strip */
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	char * compare_message = m_strdup(message);
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("enter pamConvFunc"))
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (num_msg != 1) {
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		/* If you're getting here - Dropbear probably can't support your pam
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		 * modules. This whole file is a bit of a hack around lack of
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		 * asynchronocity in PAM anyway. */
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_log(LOG_INFO, "pamConvFunc() called with >1 messages: not supported.");
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		return PAM_CONV_ERR;
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("msg_style is %d", (*msg)->msg_style))
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (compare_message) {
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		TRACE(("message is '%s'", compare_message))
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	} else {
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		TRACE(("null message"))
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Make the string lowercase. */
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	msg_len = strlen(compare_message);
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	for (i = 0; i < msg_len; i++) {
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		compare_message[i] = tolower(compare_message[i]);
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* If the string ends with ": ", remove the space.
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	   ie "login: " vs "login:" */
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (msg_len > 2
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			&& compare_message[msg_len-2] == ':'
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			&& compare_message[msg_len-1] == ' ') {
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		compare_message[msg_len-1] = '\0';
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	switch((*msg)->msg_style) {
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		case PAM_PROMPT_ECHO_OFF:
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (!(strcmp(compare_message, "password:") == 0)) {
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				/* We don't recognise the prompt as asking for a password,
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				   so can't handle it. Add more above as required for
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				   different pam modules/implementations */
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				dropbear_log(LOG_NOTICE, "PAM unknown prompt %s (no echo)",
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project						compare_message);
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				rc = PAM_CONV_ERR;
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				break;
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			}
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			/* You have to read the PAM module-writers' docs (do we look like
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			 * module writers? no.) to find out that the module will
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			 * free the pam_response and its resp element - ie we _must_ malloc
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			 * it here */
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			resp = (struct pam_response*) m_malloc(sizeof(struct pam_response));
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			memset(resp, 0, sizeof(struct pam_response));
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			resp->resp = m_strdup(userDatap->passwd);
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			m_burn(userDatap->passwd, strlen(userDatap->passwd));
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			(*respp) = resp;
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			break;
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		case PAM_PROMPT_ECHO_ON:
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			if (!((strcmp(compare_message, "login:" ) == 0)
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				|| (strcmp(compare_message, "please enter username:") == 0))) {
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				/* We don't recognise the prompt as asking for a username,
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				   so can't handle it. Add more above as required for
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				   different pam modules/implementations */
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				dropbear_log(LOG_NOTICE, "PAM unknown prompt %s (with echo)",
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project						compare_message);
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				rc = PAM_CONV_ERR;
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				break;
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			}
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			/* You have to read the PAM module-writers' docs (do we look like
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			 * module writers? no.) to find out that the module will
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			 * free the pam_response and its resp element - ie we _must_ malloc
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			 * it here */
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			resp = (struct pam_response*) m_malloc(sizeof(struct pam_response));
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			memset(resp, 0, sizeof(struct pam_response));
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			resp->resp = m_strdup(userDatap->user);
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			TRACE(("userDatap->user='%s'", userDatap->user))
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			(*respp) = resp;
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			break;
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		default:
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			TRACE(("Unknown message type"))
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			rc = PAM_CONV_ERR;
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			break;
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	m_free(compare_message);
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	TRACE(("leave pamConvFunc, rc %d", rc))
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	return rc;
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Process a password auth request, sending success or failure messages as
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * appropriate. To the client it looks like it's doing normal password auth (as
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * opposed to keyboard-interactive or something), so the pam module has to be
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * fairly standard (ie just "what's your username, what's your password, OK").
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Keyboard interactive would be a lot nicer, but since PAM is synchronous, it
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * gets very messy trying to send the interactive challenges, and read the
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * interactive responses, over the network. */
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid svr_auth_pam() {
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct UserDataS userData = {NULL, NULL};
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	struct pam_conv pamConv = {
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		pamConvFunc,
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		&userData /* submitted to pamvConvFunc as appdata_ptr */
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	};
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	pam_handle_t* pamHandlep = NULL;
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned char * password = NULL;
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned int passwordlen;
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	int rc = PAM_SUCCESS;
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	unsigned char changepw;
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* check if client wants to change password */
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	changepw = buf_getbool(ses.payload);
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (changepw) {
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		/* not implemented by this server */
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		send_msg_userauth_failure(0, 1);
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		goto cleanup;
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	password = buf_getstring(ses.payload, &passwordlen);
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* used to pass data to the PAM conversation function - don't bother with
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * strdup() etc since these are touched only by our own conversation
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	 * function (above) which takes care of it */
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	userData.user = ses.authstate.printableuser;
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	userData.passwd = password;
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* Init pam */
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if ((rc = pam_start("sshd", NULL, &pamConv, &pamHandlep)) != PAM_SUCCESS) {
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_log(LOG_WARNING, "pam_start() failed, rc=%d, %s\n",
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				rc, pam_strerror(pamHandlep, rc));
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		goto cleanup;
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* just to set it to something */
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if ((rc = pam_set_item(pamHandlep, PAM_TTY, "ssh") != PAM_SUCCESS)) {
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_log(LOG_WARNING, "pam_set_item() failed, rc=%d, %s\n",
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				rc, pam_strerror(pamHandlep, rc));
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		goto cleanup;
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	(void) pam_fail_delay(pamHandlep, 0 /* musec_delay */);
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* (void) pam_set_item(pamHandlep, PAM_FAIL_DELAY, (void*) pamDelayFunc); */
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if ((rc = pam_authenticate(pamHandlep, 0)) != PAM_SUCCESS) {
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_log(LOG_WARNING, "pam_authenticate() failed, rc=%d, %s\n",
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				rc, pam_strerror(pamHandlep, rc));
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_log(LOG_WARNING,
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				"bad PAM password attempt for '%s' from %s",
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				ses.authstate.printableuser,
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				svr_ses.addrstring);
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		send_msg_userauth_failure(0, 1);
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		goto cleanup;
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if ((rc = pam_acct_mgmt(pamHandlep, 0)) != PAM_SUCCESS) {
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_log(LOG_WARNING, "pam_acct_mgmt() failed, rc=%d, %s\n",
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				rc, pam_strerror(pamHandlep, rc));
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		dropbear_log(LOG_WARNING,
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				"bad PAM password attempt for '%s' from %s",
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				ses.authstate.printableuser,
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project				svr_ses.addrstring);
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		send_msg_userauth_failure(0, 1);
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		goto cleanup;
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	/* successful authentication */
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	dropbear_log(LOG_NOTICE, "PAM password auth succeeded for '%s' from %s",
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			ses.authstate.printableuser,
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project			svr_ses.addrstring);
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	send_msg_userauth_success();
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectcleanup:
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (password != NULL) {
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		m_burn(password, passwordlen);
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		m_free(password);
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	if (pamHandlep != NULL) {
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		TRACE(("pam_end"))
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project		(void) pam_end(pamHandlep, 0 /* pam_status */);
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project	}
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif /* ENABLE_SVR_PAM_AUTH */
259