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