/***************************************************************************** * * $Id$ * Purpose ...............: MBSE BBS Shadow Password Suite * Original Source .......: Shadow Password Suite * Original Copyrioght ...: Julianne Frances Haugh and others. * ***************************************************************************** * Copyright (C) 1997-2001 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 * 1971 BV IJmuiden * the Netherlands * * This file is part of MBSE BBS. * * This BBS is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2, or (at your option) any * later version. * * MBSE BBS is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MBSE BBS; see the file COPYING. If not, write to the Free * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. *****************************************************************************/ /* * salt.c - generate a random salt string for crypt() * * Written by Marek Michalkiewicz , * public domain. */ #include "../config.h" #include #include #include #ifdef TIME_WITH_SYS_TIME #include #endif #include #include "rad64.h" #if 1 #include "getdef.h" /* * Generate 8 base64 ASCII characters of random salt. If MD5_CRYPT_ENAB * in /etc/login.defs is "yes", the salt string will be prefixed by "$1$" * (magic) and pw_encrypt() will execute the MD5-based FreeBSD-compatible * version of crypt() instead of the standard one. */ char *crypt_make_salt(void) { struct timeval tv; static char result[40]; result[0] = '\0'; #ifndef __FreeBSD__ if (getdef_bool("MD5_CRYPT_ENAB")) { strcpy(result, "$1$"); /* magic for the new MD5 crypt() */ } #endif /* * Generate 8 chars of salt, the old crypt() will use only first 2. */ gettimeofday(&tv, (struct timezone *) 0); strcat(result, l64a(tv.tv_usec)); strcat(result, l64a(tv.tv_sec + getpid() + clock())); if (strlen(result) > 3 + 8) /* magic+salt */ result[11] = '\0'; return result; } #else /* * This is the old style random salt generator... */ char *crypt_make_salt(void) { time_t now; static unsigned long x; static char result[3]; now = time(NULL); x += now + getpid() + clock(); result[0] = i64c(((x >> 18) ^ (x >> 6)) & 077); result[1] = i64c(((x >> 12) ^ x) & 077); result[2] = '\0'; return result; } #endif