Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jul 2001 18:50:01 -0700 (PDT)
From:      Dima Dorfman <dima@unixfreak.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/28885: [patch] enhance makekey to check/generate MD5 passwords 
Message-ID:  <200107110150.f6B1o1I72019@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/28885; it has been noted by GNATS.

From: Dima Dorfman <dima@unixfreak.org>
To: Gregory Bond <gnb@itga.com.au>
Cc: FreeBSD-gnats-submit@freebsd.org
Subject: Re: bin/28885: [patch] enhance makekey to check/generate MD5 passwords 
Date: Tue, 10 Jul 2001 18:40:32 -0700

 Gregory Bond <gnb@itga.com.au> writes:
 > >Description:
 > 
 > Makekey can be used from other programs to encrypt passwords.  But it is
 > very awkward to use from a script or the command line, and only produces
 > DES encryptions.
 > 
 > These patches extend makekey to handle MD5 passwords and make it much more
 > convenient to use from a script or the command line, for example when 
 > populating passwd-like files for WEB/IRC/whatever servers. It is now also
 > able to check passwords.
 
 I don't think this is desired.  makekey is a very simple program with
 a very simple purpose: to take a salt and a string and produce a DES
 hash.  You're not *supposed* to use it for MD5; you're not *supposed*
 to use it in a script; it isn't supposed to be used to check
 passwords.  For an example of how it's supposed to be used, see
 src/usr.bin/enigma/enigma.c (and I think your patch even breaks this
 case).
 
 What you're looking for is a command-line interface to crypt(3), and
 makekey isn't, and shouldn't be, it.  One is, however, quite trivial
 to write; I did so a few years ago and my version works great for me.
 (I've attached the source for anyone who wants it.)  I think that
 something along these lines, perhaps from the ports, is much better
 than screwing around with makekey's simple life.
 
 Regards,
 
 					Dima Dorfman
 					dima@unixfreak.org
 
 /*
  * Copyright (c) 1999, Dima Dorfman.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
 
 /*
  * Command line interface to the crypt(3) family of routines.
  */
 
 #include <err.h>
 #include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
 static char *mksalt(void);
 static void usage(void);
 
 /*
  * Returns pointer to static buffer.
  */
 static char *
 mksalt(void)
 {
 	static char output[33];
 	static const char range[] =
 	    "abcdefghijklmnopqrstuvwxyz"
 	    "0123456789"
 	    "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 	char *p;
 
 	for (p = output; p < output + sizeof(output) - 1; p++)
 		*p = range[arc4random() % (sizeof(range) - 1)];
 	output[sizeof(output) - 1] = '\0';
 	return (output);
 }
 
 static void
 usage(void)
 {
 
 	fprintf(stderr, "Usage: %s [-n] [-f type] [-s salt] [password ...]\n",
 	    getprogname());
 	exit(1);
 }
 
 int
 main(int ac, char **av)
 {
 	int newline, passfree;		/* Output trailing NL?  free() pass? */
 	char *salt, *pass;       	/* Arguments to crypt(3). */
 	char *sum;			/* crypt(3) result. */
 	char c;
 	char *p, **xp;
 	int passlen, rv;
 
 	newline = 1;
 	salt = NULL;
 	while ( (c = getopt(ac, av, "f:ns:")) != -1)
 		switch (c) {
 		case 'f':
 			rv = crypt_set_format(optarg);
 			if (rv == 0)
 				errx(1, "invalid format: %s", optarg);
 			break;
 		case 'n':
 			newline = 0;
 			break;
 		case 's':
 			salt = optarg;
 			break;
 		default:
 			usage();
 		}
 	ac -= optind;
 	av += optind;
 
 	if (salt == NULL)
 		salt = mksalt();
 
 	if (ac == 0) {
 		pass = getpass("Password: ");
 		passfree = 0;
 	} else {
 		passlen = 0;
 		for (xp = av; xp < &av[ac]; xp++)
 			passlen += strlen(*xp);
 		passlen += ac + 1; /* XXX is this right? */
 		pass = malloc(passlen);
 		pass[0] = '\0';
 		for (xp = av; xp < &av[ac]; xp++) {
 			strlcat(pass, *xp, passlen);
 			strlcat(pass, " ", passlen);
 		}
 		p = strchr(pass, '\0');
 		*--p = '\0';
 		passfree = 1;
 	}
 
 	sum = crypt(pass, salt);
 	printf("%s%s", sum, newline ? "\n" : "");
 
 	if (passfree)
 		free(pass);
 	return (0);
 }

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107110150.f6B1o1I72019>