Date: Wed, 11 Jul 2001 10:24:08 +1000 (EST) From: Gregory Bond <gnb@itga.com.au> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/28885: [patch] enhance makekey to check/generate MD5 passwords Message-ID: <200107110024.f6B0O8P03091@hellcat.itga.com.au>
next in thread | raw e-mail | index | archive | help
>Number: 28885
>Category: bin
>Synopsis: [patch] enhance makekey to check/generate MD5 passwords
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Tue Jul 10 17:30:02 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Gregory Bond
>Release: FreeBSD 4.3-STABLE i386
>Organization:
ITG Australia Limited
>Environment:
System: FreeBSD hellcat.itga.com.au 4.3-STABLE FreeBSD 4.3-STABLE #21: Mon Jun 18 13:41:36 EST 2001 toor@hellcat.itga.com.au:/usr/obj/usr/src/sys/Hellcat i386
>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.
>How-To-Repeat:
Examine makekey manual page. Attempt to use it from a shell script!
>Fix:
Index: makekey/makekey.8
===================================================================
RCS file: /usr/ncvs/src/libexec/makekey/makekey.8,v
retrieving revision 1.9.2.1
diff -u -r1.9.2.1 makekey.8
--- makekey/makekey.8 2000/12/08 13:52:29 1.9.2.1
+++ makekey/makekey.8 2001/07/11 00:09:05
@@ -37,24 +37,97 @@
.Os
.Sh NAME
.Nm makekey
-.Nd make encrypted keys or passwords
+.Nd make and check encrypted keys or passwords
.Sh SYNOPSIS
.Nm
+.Op Fl m | Fl d | Fl u
+.Op Fl p Ar password
+.Op Fl s Ar salt
+.Op Fl n
.Sh DESCRIPTION
-.Nm Makekey
-encrypts a key and salt which it reads from the standard input
-and writes the result to the standard output.
-The key is expected to be
-eight bytes; the salt is expected to be two bytes.
+When called with no arguments,
+.Nm
+runs in compatibility mode. It reads exactly 8 bytes of key and 2
+bytes of salt from standard input, and produces exactly 13 bytes of
+DES encrypted password on standard out (with no trailing newline).
+.Pp
+When called with arguments,
+.Nm
+encrypts a password and prints it on standard
+output, followed by a newline.
+.Pp
See
.Xr crypt 3
for more information on what characters the key and salt can contain
and how the encrypted value is calculated.
+.Sh OPTIONS
+.Bl -tag -width indent
+.It Fl m
+Encrypt the password using the MD5 password algorithm.
+.Pp
+.It Fl d
+Encrypt the password using the DES password algorithm (if available).
+.Pp
+.It Fl u
+Encrypt the password using the default algorithm as specified by the
+.Cm crypt_default
+entry in the
+.Pa /etc/auth.conf
+file. This is the default if neither
+.Fl m
+nor
+.Fl d
+are specified.
+.Pp
+.It Fl s Ar salt
+Use the supplied salt rather than a new randomly-generated salt.
+.Pp
+.It Fl n
+Rather than print the encrypted password on standard out, compare it
+to the version passed in via the
+.Fl s Ar salt
+argument, and exit with return status of 0 if they compare equal, else
+1.
+.Pp
+.It Fl p Ar password
+Use
+.Ar password
+as the plaintext password. If
+.Fl p
+is not specified,
+.Nm
+will prompt for a passord using the
+.Xr getpass 3
+function.
+.Sh EXAMPLES
+.Bd -literal -offset indent
+$ makekey -p secret -m
+$1$V6VfDBZZ$GM2ZBo0c5bh1HG0etveAq.
+$ makekey -p secret -d -s 3D
+3DzkIA460ybsA
+$ makekey -p secret -s 3DzkIA460ybsA -n
+$ echo $?
+0
+$ makekey -p wrong -s 3DzkIA460ybsA -n
+$ echo $?
+1
+$ makekey -u
+Enter password: <password>
+l9hDu91z3G1rY
+$
+.Ed
+.Sh FILES
+.Bl -tag -compact
+.It Pa /etc/auth.conf
.Sh SEE ALSO
.Xr login 1 ,
-.Xr crypt 3
+.Xr crypt 3 ,
+.Xr getpass 3 ,
+.Xr auth.conf 5
.Sh HISTORY
A
.Nm
command appeared in
.At v7 .
+The handling of arguments was added in
+.Fx 4.4 .
Index: makekey/makekey.c
===================================================================
RCS file: /usr/ncvs/src/libexec/makekey/makekey.c,v
retrieving revision 1.8
diff -u -r1.8 makekey.c
--- makekey/makekey.c 1999/08/28 00:09:39 1.8
+++ makekey/makekey.c 2001/07/10 23:31:33
@@ -55,9 +55,111 @@
#include <unistd.h>
static void get __P((char *, int));
+static void olddes __P((void));
+static void usage __P((void));
+static char const saltchars[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.";
+
int
-main()
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ int c;
+ int opt_d = 0;
+ int opt_m = 0;
+ int opt_n = 0;
+ int opt_u = 0;
+ char *sp = 0;
+ char *pass = 0;
+ char salt[256];
+
+ if (argc == 1)
+ olddes();
+
+ while ((c = getopt(argc, argv, "dmnp:s:u")) != -1) {
+ switch (c) {
+ case 'd':
+ opt_d = 1;
+ break;
+ case 'm':
+ opt_m = 1;
+ break;
+ case 'n':
+ opt_n = 1;
+ break;
+ case 'p':
+ pass = optarg;
+ break;
+ case 's':
+ sp = optarg;
+ break;
+ case 'u':
+ opt_u = 1;
+ break;
+ case '?':
+ default:
+ warn("Unrecognised option %c\n", c);
+ usage();
+ }
+ }
+ if (optind != argc)
+ usage();
+ if (opt_m + opt_d + opt_u > 1)
+ usage();
+
+ if (sp) {
+ char *p, *q;
+
+ for (p = sp, q = salt; *p; p++, q++) {
+ if (*p != '$' && strchr(saltchars, *p) == NULL)
+ errx(2, "Illegal character in salt");
+ if (q >= salt + sizeof(salt))
+ errx(2, "Salt too long");
+ *q = *p;
+ }
+ *q = 0;
+ } else {
+ int i;
+
+ srandomdev();
+
+ for (i = 0; i < 8; i++)
+ salt[i] = saltchars[random() % 64];
+ salt[8] = 0;
+ }
+
+ if (pass == 0)
+ pass = getpass("Enter password:");
+
+ if (opt_d || opt_m)
+ if (!crypt_set_format(opt_m ? "md5" : "des"))
+ warn("setting crypt(3) format");
+
+ if (opt_n) {
+ if (!sp)
+ errx(2, "No salt provided with -n");
+ exit(strcmp(salt, crypt(pass, salt)) != 0);
+ } else {
+ printf("%s\n", crypt(pass, salt));
+ exit(0);
+ }
+}
+
+static void
+usage()
+{
+ fprintf(stderr, "usage: makekey [-m|-d|-u] [-s salt] [-p passwd] [-n]\n");
+ exit(1);
+}
+
+/*
+ * Old behaviour for DES passwords
+ * read exactly 8 bytes of passwd and 2 bytes of salt and print the crypt
+ * output
+ */
+static void
+olddes()
{
int len;
char *r, key[9], salt[3];
>Release-Note:
>Audit-Trail:
>Unformatted:
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?200107110024.f6B0O8P03091>
