xref: /freebsd/lib/libcrypt/crypt.c (revision f2ac424af7b980ba4d858ecfd1644ce197d6869d)
10e27b8d5SGeoff Rehmet /*
2e9a56ad5SMark Murray  * Copyright (c) 1999
3e9a56ad5SMark Murray  *      Mark Murray.  All rights reserved.
4e9a56ad5SMark Murray  *
5e9a56ad5SMark Murray  * Redistribution and use in source and binary forms, with or without
6e9a56ad5SMark Murray  * modification, are permitted provided that the following conditions
7e9a56ad5SMark Murray  * are met:
8e9a56ad5SMark Murray  * 1. Redistributions of source code must retain the above copyright
9e9a56ad5SMark Murray  *    notice, this list of conditions and the following disclaimer.
10e9a56ad5SMark Murray  * 2. Redistributions in binary form must reproduce the above copyright
11e9a56ad5SMark Murray  *    notice, this list of conditions and the following disclaimer in the
12e9a56ad5SMark Murray  *    documentation and/or other materials provided with the distribution.
13e9a56ad5SMark Murray  *
14e9a56ad5SMark Murray  * THIS SOFTWARE IS PROVIDED BY MARK MURRAY AND CONTRIBUTORS ``AS IS'' AND
15e9a56ad5SMark Murray  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16e9a56ad5SMark Murray  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17e9a56ad5SMark Murray  * ARE DISCLAIMED.  IN NO EVENT SHALL MARK MURRAY OR CONTRIBUTORS BE LIABLE
18e9a56ad5SMark Murray  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19e9a56ad5SMark Murray  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20e9a56ad5SMark Murray  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21e9a56ad5SMark Murray  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22e9a56ad5SMark Murray  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23e9a56ad5SMark Murray  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24e9a56ad5SMark Murray  * SUCH DAMAGE.
25da5c7089SBrandon Gillespie  */
260e27b8d5SGeoff Rehmet 
27e67f5b9fSMatthew Dillon #include <sys/cdefs.h>
28e67f5b9fSMatthew Dillon __FBSDID("$FreeBSD$");
294fdd3d54SMark Murray 
309886bcdfSPeter Wemm #include <sys/types.h>
3151295a4dSJordan K. Hubbard #include <string.h>
329886bcdfSPeter Wemm #include <libutil.h>
33f2ac424aSMark Murray #include <unistd.h>
34e9a56ad5SMark Murray #include "crypt.h"
354fdd3d54SMark Murray 
3604c9749fSBrian Feldman static const struct {
3704c9749fSBrian Feldman 	const char *const name;
3804c9749fSBrian Feldman 	char *(*const func)(const char *, const char *);
3904c9749fSBrian Feldman 	const char *const magic;
4004c9749fSBrian Feldman } crypt_types[] = {
419886bcdfSPeter Wemm #ifdef HAS_DES
4204c9749fSBrian Feldman 	{
4304c9749fSBrian Feldman 		"des",
4404c9749fSBrian Feldman 		crypt_des,
4504c9749fSBrian Feldman 		NULL
4604c9749fSBrian Feldman 	},
47da140a05SBrian Feldman #endif
4804c9749fSBrian Feldman 	{
4965c10f6dSPeter Wemm 		"md5",
5065c10f6dSPeter Wemm 		crypt_md5,
5165c10f6dSPeter Wemm 		"$1$"
5265c10f6dSPeter Wemm 	},
535c129616SMark Murray #ifdef HAS_BLOWFISH
545c129616SMark Murray 	{
555c129616SMark Murray 		"blf",
565c129616SMark Murray 		crypt_blowfish,
575c129616SMark Murray 		"$2"
585c129616SMark Murray 	},
595c129616SMark Murray #endif
6065c10f6dSPeter Wemm 	{
6104c9749fSBrian Feldman 		NULL,
62f2ac424aSMark Murray 		NULL,
6304c9749fSBrian Feldman 		NULL
6404c9749fSBrian Feldman 	}
6504c9749fSBrian Feldman };
6604c9749fSBrian Feldman 
679886bcdfSPeter Wemm static int crypt_type = -1;
689886bcdfSPeter Wemm 
699886bcdfSPeter Wemm static void
709886bcdfSPeter Wemm crypt_setdefault(void)
719886bcdfSPeter Wemm {
729886bcdfSPeter Wemm 	char *def;
73f2ac424aSMark Murray 	size_t i;
749886bcdfSPeter Wemm 
759886bcdfSPeter Wemm 	if (crypt_type != -1)
769886bcdfSPeter Wemm 		return;
779886bcdfSPeter Wemm 	def = auth_getval("crypt_default");
789886bcdfSPeter Wemm 	if (def == NULL) {
799886bcdfSPeter Wemm 		crypt_type = 0;
809886bcdfSPeter Wemm 		return;
819886bcdfSPeter Wemm 	}
829886bcdfSPeter Wemm 	for (i = 0; i < sizeof(crypt_types) / sizeof(crypt_types[0]) - 1; i++) {
839886bcdfSPeter Wemm 		if (strcmp(def, crypt_types[i].name) == 0) {
84f2ac424aSMark Murray 			crypt_type = (int)i;
859886bcdfSPeter Wemm 			return;
869886bcdfSPeter Wemm 		}
879886bcdfSPeter Wemm 	}
889886bcdfSPeter Wemm 	crypt_type = 0;
899886bcdfSPeter Wemm }
9004c9749fSBrian Feldman 
9104c9749fSBrian Feldman const char *
929886bcdfSPeter Wemm crypt_get_format(void)
939886bcdfSPeter Wemm {
9404c9749fSBrian Feldman 
959886bcdfSPeter Wemm 	crypt_setdefault();
9604c9749fSBrian Feldman 	return (crypt_types[crypt_type].name);
9704c9749fSBrian Feldman }
9804c9749fSBrian Feldman 
9904c9749fSBrian Feldman int
100f2ac424aSMark Murray crypt_set_format(const char *type)
1019886bcdfSPeter Wemm {
102f2ac424aSMark Murray 	size_t i;
10304c9749fSBrian Feldman 
1049886bcdfSPeter Wemm 	crypt_setdefault();
10504c9749fSBrian Feldman 	for (i = 0; i < sizeof(crypt_types) / sizeof(crypt_types[0]) - 1; i++) {
10604c9749fSBrian Feldman 		if (strcmp(type, crypt_types[i].name) == 0) {
107f2ac424aSMark Murray 			crypt_type = (int)i;
10804c9749fSBrian Feldman 			return (1);
10904c9749fSBrian Feldman 		}
11004c9749fSBrian Feldman 	}
11104c9749fSBrian Feldman 	return (0);
11204c9749fSBrian Feldman }
11304c9749fSBrian Feldman 
1144fdd3d54SMark Murray char *
115f2ac424aSMark Murray crypt(const char *passwd, const char *salt)
1160e27b8d5SGeoff Rehmet {
117f2ac424aSMark Murray 	size_t i;
11804c9749fSBrian Feldman 
1199886bcdfSPeter Wemm 	crypt_setdefault();
12004c9749fSBrian Feldman 	for (i = 0; i < sizeof(crypt_types) / sizeof(crypt_types[0]) - 1; i++) {
12104c9749fSBrian Feldman 		if (crypt_types[i].magic != NULL && strncmp(salt,
12204c9749fSBrian Feldman 		    crypt_types[i].magic, strlen(crypt_types[i].magic)) == 0)
12304c9749fSBrian Feldman 			return (crypt_types[i].func(passwd, salt));
12404c9749fSBrian Feldman 	}
12504c9749fSBrian Feldman 	return (crypt_types[crypt_type].func(passwd, salt));
1260e27b8d5SGeoff Rehmet }
127