/* simple password generator by Nelson Minar (minar@reed.edu)
-** copyright 1991, all rights reserved.
-** You can use this code as long as my name stays with it.
-**
-** md5 patch by W. Campbell <wcampbel@botbay.net>
-** Modernization, getopt, etc for the Hybrid IRCD team
-** by W. Campbell
-**
-** /dev/random for salt generation added by
-** Aaron Sethman <androsyn@ratbox.org>
-**
-** $Id: mkpasswd.c 26439 2009-02-01 15:27:24Z jilles $
-*/
+ * copyright 1991, all rights reserved.
+ * You can use this code as long as my name stays with it.
+ *
+ * md5 patch by W. Campbell <wcampbel@botbay.net>
+ * Modernization, getopt, etc for the Hybrid IRCD team
+ * by W. Campbell
+ *
+ * /dev/random for salt generation added by
+ * Aaron Sethman <androsyn@ratbox.org>
+ */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
-#include "ratbox_lib.h"
+#include "rb_lib.h"
#ifndef __MINGW32__
#include <pwd.h>
#endif
#define FLAG_MD5 0x00000001
-#define FLAG_DES 0x00000002
-#define FLAG_SALT 0x00000004
-#define FLAG_PASS 0x00000008
-#define FLAG_LENGTH 0x00000010
-#define FLAG_BLOWFISH 0x00000020
-#define FLAG_ROUNDS 0x00000040
-#define FLAG_EXT 0x00000080
-#define FLAG_SHA256 0x00000100
-#define FLAG_SHA512 0x00000200
-
-
-static char *make_des_salt(void);
-static char *make_ext_salt(int);
-static char *make_ext_salt_para(int, char *);
+#define FLAG_SALT 0x00000002
+#define FLAG_PASS 0x00000004
+#define FLAG_LENGTH 0x00000008
+#define FLAG_BLOWFISH 0x00000010
+#define FLAG_ROUNDS 0x00000020
+#define FLAG_SHA256 0x00000040
+#define FLAG_SHA512 0x00000080
+
+
static char *make_md5_salt(int);
static char *make_md5_salt_para(char *);
static char *make_sha256_salt(int);
static char *make_sha512_salt_para(char *);
static char *make_bf_salt(int, int);
static char *make_bf_salt_para(int, char *);
-static char *int_to_base64(int);
static char *generate_random_salt(char *, int);
static char *generate_poor_salt(char *, int);
static char saltChars[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
/* 0 .. 63, ascii - 64 */
-extern char *optarg;
-
-
#ifdef __MINGW32__
#include <conio.h>
#ifdef PASS_MAX
int c;
int i = 0;
- memset(getpassbuf, sizeof(getpassbuf), 0);
+ memset(getpassbuf, 0, sizeof(getpassbuf));
fputs(prompt, stderr);
for(;;)
{
int c;
char *saltpara = NULL;
char *salt;
+ char *hashed;
int flag = 0;
int length = 0; /* Not Set */
- int rounds = 0; /* Not set, since extended DES needs 25 and blowfish needs
- ** 4 by default, a side effect of this being the encryption
- ** type parameter must be specified before the rounds
- ** parameter.
+ int rounds = 0; /* Not set, since blowfish needs 4 by default, a side effect
+ * of this being the encryption type parameter must be
+ * specified before the rounds parameter.
*/
- while((c = getopt(argc, argv, "xymdber:h?l:s:p:")) != -1)
+ while((c = getopt(argc, argv, "xymbr:h?l:s:p:")) != -1)
{
switch (c)
{
case 'm':
flag |= FLAG_MD5;
break;
- case 'd':
- flag |= FLAG_DES;
- break;
case 'b':
flag |= FLAG_BLOWFISH;
rounds = 4;
break;
- case 'e':
- flag |= FLAG_EXT;
- rounds = 25;
- break;
case 'l':
flag |= FLAG_LENGTH;
length = atoi(optarg);
else
salt = make_sha256_salt(length);
}
- else if(flag & FLAG_EXT)
- {
- /* XXX - rounds needs to be done */
- if(flag & FLAG_SALT)
- {
- if((strlen(saltpara) == 4))
- {
- salt = make_ext_salt_para(rounds, saltpara);
- }
- else
- {
- printf("Invalid salt, please enter 4 alphanumeric characters\n");
- exit(1);
- }
- }
- else
- {
- salt = make_ext_salt(rounds);
- }
- }
- else if (flag & FLAG_DES)
- {
- if(flag & FLAG_SALT)
- {
- if((strlen(saltpara) == 2))
- {
- salt = saltpara;
- }
- else
- {
- printf("Invalid salt, please enter 2 alphanumeric characters\n");
- exit(1);
- }
- }
- else
- {
- salt = make_des_salt();
- }
- }
else
{
if(length == 0)
if(flag & FLAG_PASS)
{
if(!plaintext)
- printf("Please enter a valid password\n");
+ {
+ fprintf(stderr, "Please enter a valid password\n");
+ return 1;
+ }
+
+ hashed = rb_crypt(plaintext, salt);
}
else
{
- plaintext = getpass("plaintext: ");
- }
+ hashed = strdup(rb_crypt(getpass("plaintext: "), salt));
+ plaintext = getpass("again: ");
- printf("%s\n", rb_crypt(plaintext, salt));
- return 0;
-}
-
-static char *
-make_des_salt()
-{
- static char salt[3];
- generate_random_salt(salt, 2);
- salt[2] = '\0';
- return salt;
-}
-
-char *
-int_to_base64(int value)
-{
- static char buf[5];
- int i;
-
- for(i = 0; i < 4; i++)
- {
- buf[i] = saltChars[value & 63];
- value >>= 6; /* Right shifting 6 places is the same as dividing by 64 */
+ if (strcmp(rb_crypt(plaintext, salt), hashed) != 0)
+ {
+ fprintf(stderr, "Passwords do not match\n");
+ return 1;
+ }
}
- buf[i] = '\0'; /* not REALLY needed as it's static, and thus initialized
- ** to \0.
- */
- return buf;
-}
-
-char *
-make_ext_salt(int rounds)
-{
- static char salt[10];
-
- sprintf(salt, "_%s", int_to_base64(rounds));
- generate_random_salt(&salt[5], 4);
- salt[9] = '\0';
- return salt;
-}
-
-char *
-make_ext_salt_para(int rounds, char *saltpara)
-{
- static char salt[10];
-
- sprintf(salt, "_%s%s", int_to_base64(rounds), saltpara);
- return salt;
+ printf("%s\n", hashed);
+ return 0;
}
char *
void
full_usage()
{
- printf("mkpasswd [-m|-d|-b|-e] [-l saltlength] [-r rounds] [-s salt] [-p plaintext]\n");
+ printf("mkpasswd [-m|-b|-x|-y] [-l saltlength] [-r rounds] [-s salt] [-p plaintext]\n");
printf("-x Generate a SHA256 password\n");
printf("-y Generate a SHA512 password\n");
printf("-m Generate an MD5 password\n");
- printf("-d Generate a DES password\n");
printf("-b Generate a Blowfish password\n");
- printf("-e Generate an Extended DES password\n");
printf("-l Specify a length for a random MD5 or Blowfish salt\n");
- printf("-r Specify a number of rounds for a Blowfish or Extended DES password\n");
- printf(" Blowfish: default 4, no more than 6 recommended\n");
- printf(" Extended DES: default 25\n");
- printf("-s Specify a salt, 2 alphanumeric characters for DES, up to 16 for MD5,\n");
- printf(" up to 22 for Blowfish, and 4 for Extended DES\n");
+ printf("-r Specify a number of rounds for a Blowfish password\n");
+ printf(" Default 4, no more than 6 recommended\n");
+ printf("-s Specify a salt, up to 16 for MD5, SHA256, and SHA512\n");
+ printf(" up to 22 for Blowfish\n");
printf("-p Specify a plaintext password to use\n");
printf("Example: mkpasswd -m -s 3dr -p test\n");
exit(0);
brief_usage()
{
printf("mkpasswd - password hash generator\n");
- printf("Standard DES: mkpasswd [-d] [-s salt] [-p plaintext]\n");
- printf("Extended DES: mkpasswd -e [-r rounds] [-s salt] [-p plaintext]\n");
- printf(" MD5: mkpasswd -m [-l saltlength] [-s salt] [-p plaintext]\n");
- printf(" Blowfish: mkpasswd -b [-r rounds] [-l saltlength] [-s salt]\n");
- printf(" [-p plaintext]\n");
+ printf(" SHA512: mkpasswd [-y] [-l saltlength] [-s salt] [-p plaintext]\n");
+ printf(" SHA256: mkpasswd -x [-l saltlength] [-s salt] [-p plaintext]\n");
+ printf(" MD5: mkpasswd -m [-l saltlength] [-s salt] [-p plaintext]\n");
+ printf("Blowfish: mkpasswd -b [-r rounds] [-l saltlength] [-s salt]\n");
+ printf(" [-p plaintext]\n");
printf("Use -h for full usage\n");
exit(0);
}