auth-passwd.c revision 65674
1/*
2 * Author: Tatu Ylonen <ylo@cs.hut.fi>
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4 *                    All rights reserved
5 * Password authentication.  This file contains the functions to check whether
6 * the password is valid for the user.
7 *
8 * As far as I am concerned, the code I have written for this software
9 * can be used freely for any purpose.  Any derived versions of this
10 * software must be clearly marked as such, and if the derived work is
11 * incompatible with the protocol description in the RFC file, it must be
12 * called by a name other than "ssh" or "Secure Shell".
13 *
14 *
15 * Copyright (c) 1999 Dug Song.  All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 *
38 * Copyright (c) 2000 Markus Friedl.  All rights reserved.
39 *
40 * Redistribution and use in source and binary forms, with or without
41 * modification, are permitted provided that the following conditions
42 * are met:
43 * 1. Redistributions of source code must retain the above copyright
44 *    notice, this list of conditions and the following disclaimer.
45 * 2. Redistributions in binary form must reproduce the above copyright
46 *    notice, this list of conditions and the following disclaimer in the
47 *    documentation and/or other materials provided with the distribution.
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
50 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
51 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
52 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
53 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
54 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
55 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
56 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
58 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59 */
60
61#include "includes.h"
62RCSID("$OpenBSD: auth-passwd.c,v 1.17 2000/09/07 20:27:49 deraadt Exp $");
63RCSID("$FreeBSD: head/crypto/openssh/auth-passwd.c 65674 2000-09-10 09:35:38Z kris $");
64
65#include "packet.h"
66#include "ssh.h"
67#include "servconf.h"
68#include "xmalloc.h"
69
70/*
71 * Tries to authenticate the user using password.  Returns true if
72 * authentication succeeds.
73 */
74int
75auth_password(struct passwd * pw, const char *password)
76{
77	extern ServerOptions options;
78	char *encrypted_password;
79
80	/* deny if no user. */
81	if (pw == NULL)
82		return 0;
83	if (pw->pw_uid == 0 && options.permit_root_login == 2)
84		return 0;
85	if (*password == '\0' && options.permit_empty_passwd == 0)
86		return 0;
87
88#ifdef SKEY
89	if (options.skey_authentication == 1) {
90		int ret = auth_skey_password(pw, password);
91		if (ret == 1 || ret == 0)
92			return ret;
93		/* Fall back to ordinary passwd authentication. */
94	}
95#endif
96#ifdef KRB5
97	if (options.krb5_authentication == 1) {
98	  	if (auth_krb5_password(pw, password))
99		  	return 1;
100		/* Fall back to ordinary passwd authentication. */
101	}
102
103#endif /* KRB5 */
104#ifdef KRB4
105	if (options.krb4_authentication == 1) {
106		int ret = auth_krb4_password(pw, password);
107		if (ret == 1 || ret == 0)
108			return ret;
109		/* Fall back to ordinary passwd authentication. */
110	}
111#endif
112
113	/* Check for users with no password. */
114	if (strcmp(password, "") == 0 && strcmp(pw->pw_passwd, "") == 0)
115		return 1;
116	/* Encrypt the candidate password using the proper salt. */
117	encrypted_password = crypt(password,
118	    (pw->pw_passwd[0] && pw->pw_passwd[1]) ? pw->pw_passwd : "xx");
119
120	/* Authentication is accepted if the encrypted passwords are identical. */
121	return (strcmp(encrypted_password, pw->pw_passwd) == 0);
122}
123