xref: /freebsd/crypto/openssh/openbsd-compat/xcrypt.c (revision e4a9863fb76a1f6b16ecbcbd31e88f4ad9a9565e)
1d95e11bfSDag-Erling Smørgrav /*
2d95e11bfSDag-Erling Smørgrav  * Copyright (c) 2003 Ben Lindstrom.  All rights reserved.
3d95e11bfSDag-Erling Smørgrav  *
4d95e11bfSDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
5d95e11bfSDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
6d95e11bfSDag-Erling Smørgrav  * are met:
7d95e11bfSDag-Erling Smørgrav  * 1. Redistributions of source code must retain the above copyright
8d95e11bfSDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer.
9d95e11bfSDag-Erling Smørgrav  * 2. Redistributions in binary form must reproduce the above copyright
10d95e11bfSDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer in the
11d95e11bfSDag-Erling Smørgrav  *    documentation and/or other materials provided with the distribution.
12d95e11bfSDag-Erling Smørgrav  *
13d95e11bfSDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14d95e11bfSDag-Erling Smørgrav  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15d95e11bfSDag-Erling Smørgrav  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16d95e11bfSDag-Erling Smørgrav  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17d95e11bfSDag-Erling Smørgrav  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18d95e11bfSDag-Erling Smørgrav  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19d95e11bfSDag-Erling Smørgrav  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20d95e11bfSDag-Erling Smørgrav  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21d95e11bfSDag-Erling Smørgrav  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22d95e11bfSDag-Erling Smørgrav  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23d95e11bfSDag-Erling Smørgrav  */
24d95e11bfSDag-Erling Smørgrav 
25d95e11bfSDag-Erling Smørgrav #include "includes.h"
26d95e11bfSDag-Erling Smørgrav 
27761efaa7SDag-Erling Smørgrav #include <sys/types.h>
28761efaa7SDag-Erling Smørgrav #include <unistd.h>
29761efaa7SDag-Erling Smørgrav #include <pwd.h>
30761efaa7SDag-Erling Smørgrav 
31cce7d346SDag-Erling Smørgrav # if defined(HAVE_CRYPT_H) && !defined(HAVE_SECUREWARE)
32d95e11bfSDag-Erling Smørgrav #  include <crypt.h>
33d95e11bfSDag-Erling Smørgrav # endif
34d95e11bfSDag-Erling Smørgrav 
35d95e11bfSDag-Erling Smørgrav # ifdef __hpux
36d95e11bfSDag-Erling Smørgrav #  include <hpsecurity.h>
37d95e11bfSDag-Erling Smørgrav #  include <prot.h>
38d95e11bfSDag-Erling Smørgrav # endif
39d95e11bfSDag-Erling Smørgrav 
40d95e11bfSDag-Erling Smørgrav # ifdef HAVE_SECUREWARE
41d95e11bfSDag-Erling Smørgrav #  include <sys/security.h>
42d95e11bfSDag-Erling Smørgrav #  include <sys/audit.h>
43d95e11bfSDag-Erling Smørgrav #  include <prot.h>
44d95e11bfSDag-Erling Smørgrav # endif
45d95e11bfSDag-Erling Smørgrav 
46d95e11bfSDag-Erling Smørgrav # if defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW)
47d95e11bfSDag-Erling Smørgrav #  include <shadow.h>
48d95e11bfSDag-Erling Smørgrav # endif
49d95e11bfSDag-Erling Smørgrav 
50d95e11bfSDag-Erling Smørgrav # if defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW)
51d95e11bfSDag-Erling Smørgrav #  include <sys/label.h>
52d95e11bfSDag-Erling Smørgrav #  include <sys/audit.h>
53d95e11bfSDag-Erling Smørgrav #  include <pwdadj.h>
54d95e11bfSDag-Erling Smørgrav # endif
55d95e11bfSDag-Erling Smørgrav 
56d95e11bfSDag-Erling Smørgrav # if defined(HAVE_MD5_PASSWORDS) && !defined(HAVE_MD5_CRYPT)
57d95e11bfSDag-Erling Smørgrav #  include "md5crypt.h"
58d95e11bfSDag-Erling Smørgrav # endif
59*e4a9863fSDag-Erling Smørgrav 
60*e4a9863fSDag-Erling Smørgrav # if !defined(HAVE_CRYPT) && defined(HAVE_DES_CRYPT)
61*e4a9863fSDag-Erling Smørgrav #  include <openssl/des.h>
62*e4a9863fSDag-Erling Smørgrav #  define crypt DES_crypt
63*e4a9863fSDag-Erling Smørgrav # endif
64d95e11bfSDag-Erling Smørgrav 
65d95e11bfSDag-Erling Smørgrav char *
66d95e11bfSDag-Erling Smørgrav xcrypt(const char *password, const char *salt)
67d95e11bfSDag-Erling Smørgrav {
68d95e11bfSDag-Erling Smørgrav 	char *crypted;
69d95e11bfSDag-Erling Smørgrav 
70d95e11bfSDag-Erling Smørgrav # ifdef HAVE_MD5_PASSWORDS
71d95e11bfSDag-Erling Smørgrav         if (is_md5_salt(salt))
72d95e11bfSDag-Erling Smørgrav                 crypted = md5_crypt(password, salt);
73d95e11bfSDag-Erling Smørgrav         else
74d95e11bfSDag-Erling Smørgrav                 crypted = crypt(password, salt);
75d95e11bfSDag-Erling Smørgrav # elif defined(__hpux) && !defined(HAVE_SECUREWARE)
76d95e11bfSDag-Erling Smørgrav 	if (iscomsec())
77d95e11bfSDag-Erling Smørgrav                 crypted = bigcrypt(password, salt);
78d95e11bfSDag-Erling Smørgrav         else
79d95e11bfSDag-Erling Smørgrav                 crypted = crypt(password, salt);
80d95e11bfSDag-Erling Smørgrav # elif defined(HAVE_SECUREWARE)
81d95e11bfSDag-Erling Smørgrav         crypted = bigcrypt(password, salt);
82d95e11bfSDag-Erling Smørgrav # else
83d95e11bfSDag-Erling Smørgrav         crypted = crypt(password, salt);
84d95e11bfSDag-Erling Smørgrav # endif
85d95e11bfSDag-Erling Smørgrav 
86d95e11bfSDag-Erling Smørgrav 	return crypted;
87d95e11bfSDag-Erling Smørgrav }
88d95e11bfSDag-Erling Smørgrav 
89d95e11bfSDag-Erling Smørgrav /*
90d95e11bfSDag-Erling Smørgrav  * Handle shadowed password systems in a cleaner way for portable
91d95e11bfSDag-Erling Smørgrav  * version.
92d95e11bfSDag-Erling Smørgrav  */
93d95e11bfSDag-Erling Smørgrav 
94d95e11bfSDag-Erling Smørgrav char *
95d95e11bfSDag-Erling Smørgrav shadow_pw(struct passwd *pw)
96d95e11bfSDag-Erling Smørgrav {
97d95e11bfSDag-Erling Smørgrav 	char *pw_password = pw->pw_passwd;
98d95e11bfSDag-Erling Smørgrav 
99d95e11bfSDag-Erling Smørgrav # if defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW)
100d95e11bfSDag-Erling Smørgrav 	struct spwd *spw = getspnam(pw->pw_name);
101d95e11bfSDag-Erling Smørgrav 
102d95e11bfSDag-Erling Smørgrav 	if (spw != NULL)
103d95e11bfSDag-Erling Smørgrav 		pw_password = spw->sp_pwdp;
104d95e11bfSDag-Erling Smørgrav # endif
105043840dfSDag-Erling Smørgrav 
106d4af9e69SDag-Erling Smørgrav #ifdef USE_LIBIAF
107043840dfSDag-Erling Smørgrav 	return(get_iaf_password(pw));
108043840dfSDag-Erling Smørgrav #endif
109043840dfSDag-Erling Smørgrav 
110d95e11bfSDag-Erling Smørgrav # if defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW)
111d95e11bfSDag-Erling Smørgrav 	struct passwd_adjunct *spw;
112d95e11bfSDag-Erling Smørgrav 	if (issecure() && (spw = getpwanam(pw->pw_name)) != NULL)
113d95e11bfSDag-Erling Smørgrav 		pw_password = spw->pwa_passwd;
114d95e11bfSDag-Erling Smørgrav # elif defined(HAVE_SECUREWARE)
115d95e11bfSDag-Erling Smørgrav 	struct pr_passwd *spw = getprpwnam(pw->pw_name);
116d95e11bfSDag-Erling Smørgrav 
117d95e11bfSDag-Erling Smørgrav 	if (spw != NULL)
118d95e11bfSDag-Erling Smørgrav 		pw_password = spw->ufld.fd_encrypt;
119d95e11bfSDag-Erling Smørgrav # endif
120d95e11bfSDag-Erling Smørgrav 
121d95e11bfSDag-Erling Smørgrav 	return pw_password;
122d95e11bfSDag-Erling Smørgrav }
123