]> andersk Git - gssapi-openssh.git/blob - openssh/auth-passwd.c
The man2html from jbasney on pkilab2 works whereas the standard one doesn't.
[gssapi-openssh.git] / openssh / auth-passwd.c
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  * Copyright (c) 1999 Dug Song.  All rights reserved.
15  * Copyright (c) 2000 Markus Friedl.  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 #include "includes.h"
39 RCSID("$OpenBSD: auth-passwd.c,v 1.23 2001/06/26 16:15:23 dugsong Exp $");
40
41 #if !defined(USE_PAM) && !defined(HAVE_OSF_SIA)
42
43 #include "packet.h"
44 #include "xmalloc.h"
45 #include "log.h"
46 #include "servconf.h"
47 #include "auth.h"
48
49 #ifdef HAVE_CRYPT_H
50 # include <crypt.h>
51 #endif
52 #ifdef WITH_AIXAUTHENTICATE
53 # include <login.h>
54 #endif
55 #ifdef __hpux
56 # include <hpsecurity.h>
57 # include <prot.h>
58 #endif
59 #ifdef HAVE_SCO_PROTECTED_PW
60 # include <sys/security.h>
61 # include <sys/audit.h>
62 # include <prot.h>
63 #endif /* HAVE_SCO_PROTECTED_PW */
64 #if defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW)
65 # include <shadow.h>
66 #endif
67 #if defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW)
68 # include <sys/label.h>
69 # include <sys/audit.h>
70 # include <pwdadj.h>
71 #endif
72 #if defined(HAVE_MD5_PASSWORDS) && !defined(HAVE_MD5_CRYPT)
73 # include "md5crypt.h"
74 #endif /* defined(HAVE_MD5_PASSWORDS) && !defined(HAVE_MD5_CRYPT) */
75
76 #ifdef HAVE_CYGWIN
77 #undef ERROR
78 #include <windows.h>
79 #include <sys/cygwin.h>
80 #define is_winnt       (GetVersion() < 0x80000000)
81 #endif
82
83
84 extern ServerOptions options;
85
86 /*
87  * Tries to authenticate the user using password.  Returns true if
88  * authentication succeeds.
89  */
90 int
91 auth_password(Authctxt *authctxt, const char *password)
92 {
93         struct passwd * pw = authctxt->pw;
94         char *encrypted_password;
95         char *pw_password;
96         char *salt;
97 #ifdef __hpux
98         struct pr_passwd *spw;
99 #endif
100 #ifdef HAVE_SCO_PROTECTED_PW
101         struct pr_passwd *spw;
102 #endif /* HAVE_SCO_PROTECTED_PW */
103 #if defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW)
104         struct spwd *spw;
105 #endif
106 #if defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW)
107         struct passwd_adjunct *spw;
108 #endif
109 #ifdef WITH_AIXAUTHENTICATE
110         char *authmsg;
111         char *loginmsg;
112         int reenter = 1;
113 #endif
114
115         /* deny if no user. */
116         if (pw == NULL)
117                 return 0;
118 #ifndef HAVE_CYGWIN
119        if (pw->pw_uid == 0 && options.permit_root_login != PERMIT_YES)
120                 return 0;
121 #endif
122 #ifdef HAVE_CYGWIN
123         /*
124          * Empty password is only possible on NT if the user has _really_
125          * an empty password and authentication is done, though.
126          */
127         if (!is_winnt)
128 #endif
129         if (*password == '\0' && options.permit_empty_passwd == 0)
130                 return 0;
131 #ifdef KRB5
132         if (options.kerberos_authentication == 1) {
133                 int ret = auth_krb5_password(authctxt, password);
134                 if (ret == 1 || ret == 0)
135                         return ret;
136                 /* Fall back to ordinary passwd authentication. */
137         }
138 #endif
139 #ifdef HAVE_CYGWIN
140         if (is_winnt) {
141                 HANDLE hToken = cygwin_logon_user(pw, password);
142
143                 if (hToken == INVALID_HANDLE_VALUE)
144                         return 0;
145                 cygwin_set_impersonation_token(hToken);
146                 return 1;
147         }
148 #endif
149 #ifdef WITH_AIXAUTHENTICATE
150         return (authenticate(pw->pw_name,password,&reenter,&authmsg) == 0);
151 #endif
152 #ifdef KRB4
153         if (options.kerberos_authentication == 1) {
154                 int ret = auth_krb4_password(authctxt, password);
155                 if (ret == 1 || ret == 0)
156                         return ret;
157                 /* Fall back to ordinary passwd authentication. */
158         }
159 #endif
160 #ifdef BSD_AUTH
161         if (auth_userokay(pw->pw_name, authctxt->style, "auth-ssh",
162             (char *)password) == 0)
163                 return 0;
164         else
165                 return 1;
166 #endif
167         pw_password = pw->pw_passwd;
168
169         /*
170          * Various interfaces to shadow or protected password data
171          */
172 #if defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW)
173         spw = getspnam(pw->pw_name);
174         if (spw != NULL)
175                 pw_password = spw->sp_pwdp;
176 #endif /* defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW) */
177
178 #ifdef HAVE_SCO_PROTECTED_PW
179         spw = getprpwnam(pw->pw_name);
180         if (spw != NULL)
181                 pw_password = spw->ufld.fd_encrypt;
182 #endif /* HAVE_SCO_PROTECTED_PW */
183
184 #if defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW)
185         if (issecure() && (spw = getpwanam(pw->pw_name)) != NULL)
186                 pw_password = spw->pwa_passwd;
187 #endif /* defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW) */
188
189 #if defined(__hpux)
190         if (iscomsec() && (spw = getprpwnam(pw->pw_name)) != NULL)
191                 pw_password = spw->ufld.fd_encrypt;
192 #endif /* defined(__hpux) */
193
194         /* Check for users with no password. */
195         if ((password[0] == '\0') && (pw_password[0] == '\0'))
196                 return 1;
197
198         if (pw_password[0] != '\0')
199                 salt = pw_password;
200         else
201                 salt = "xx";
202
203 #ifdef HAVE_MD5_PASSWORDS
204         if (is_md5_salt(salt))
205                 encrypted_password = md5_crypt(password, salt);
206         else
207                 encrypted_password = crypt(password, salt);
208 #else /* HAVE_MD5_PASSWORDS */
209 # ifdef __hpux
210         if (iscomsec())
211                 encrypted_password = bigcrypt(password, salt);
212         else
213                 encrypted_password = crypt(password, salt);
214 # else
215         encrypted_password = crypt(password, salt);
216 # endif /* __hpux */
217 #endif /* HAVE_MD5_PASSWORDS */
218
219         /* Authentication is accepted if the encrypted passwords are identical. */
220         return (strcmp(encrypted_password, pw_password) == 0);
221 }
222 #endif /* !USE_PAM && !HAVE_OSF_SIA */
This page took 0.053533 seconds and 5 git commands to generate.