Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/passwd Add pwd_gensalt() - generates password salt/s...
details: https://anonhg.NetBSD.org/src/rev/d96a3cd4197c
branches: trunk
changeset: 494426:d96a3cd4197c
user: ad <ad%NetBSD.org@localhost>
date: Thu Jul 06 11:16:50 2000 +0000
description:
Add pwd_gensalt() - generates password salt/setting for crypt(), based upon
target user and information obtained from passwd.conf. From OpenBSD.
diffstat:
usr.bin/passwd/Makefile | 4 +-
usr.bin/passwd/pwd_gensalt.c | 142 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 144 insertions(+), 2 deletions(-)
diffs (162 lines):
diff -r 918d282fe268 -r d96a3cd4197c usr.bin/passwd/Makefile
--- a/usr.bin/passwd/Makefile Thu Jul 06 11:13:49 2000 +0000
+++ b/usr.bin/passwd/Makefile Thu Jul 06 11:16:50 2000 +0000
@@ -1,10 +1,10 @@
-# $NetBSD: Makefile,v 1.26 2000/06/24 06:52:10 veego Exp $
+# $NetBSD: Makefile,v 1.27 2000/07/06 11:16:50 ad Exp $
# from: @(#)Makefile 8.3 (Berkeley) 4/2/94
.include <bsd.own.mk>
PROG= passwd
-SRCS= local_passwd.c yp_passwd.c passwd.c
+SRCS= local_passwd.c passwd.c pwd_gensalt.c yp_passwd.c
DPADD+= ${LIBRPCSVC} ${LIBCRYPT} ${LIBUTIL}
LDADD+= -lrpcsvc -lcrypt -lutil
CPPFLAGS+=-I${.CURDIR} -DYP -DLOGIN_CAP
diff -r 918d282fe268 -r d96a3cd4197c usr.bin/passwd/pwd_gensalt.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/passwd/pwd_gensalt.c Thu Jul 06 11:16:50 2000 +0000
@@ -0,0 +1,142 @@
+/* $NetBSD: pwd_gensalt.c,v 1.1 2000/07/06 11:16:50 ad Exp $ */
+
+/*
+ * Copyright 1997 Niels Provos <provos%physnet.uni-hamburg.de@localhost>
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Niels Provos.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
+ *
+ * from OpenBSD: pwd_gensalt.c,v 1.9 1998/07/05 21:08:32 provos Exp
+ */
+
+#include <sys/syslimits.h>
+#include <sys/types.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+#include <grp.h>
+#include <pwd.h>
+#include <util.h>
+#include <time.h>
+#include <pwd.h>
+
+#include "extern.h"
+
+static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+static void to64(char *s, long v, int n);
+
+int
+pwd_gensalt(char *salt, int max, struct passwd *pwd, char type)
+{
+ char option[LINE_MAX], *next, *now, *cipher, grpkey[LINE_MAX];
+ int rounds;
+ struct group *grp;
+
+ *salt = '\0';
+
+ switch (type) {
+ case 'y':
+ cipher = "ypcipher";
+ break;
+ case 'l':
+ default:
+ cipher = "localcipher";
+ break;
+ }
+
+ pw_getconf(option, LINE_MAX, pwd->pw_name, cipher);
+
+ /* Try to find an entry for the group */
+ if (*option == 0) {
+ if ((grp = getgrgid(pwd->pw_gid)) != NULL) {
+ snprintf(grpkey, LINE_MAX - 1, ".%s", grp->gr_name);
+ grpkey[LINE_MAX-1] = 0;
+ pw_getconf(option, LINE_MAX, grpkey, cipher);
+ }
+ if (*option == 0)
+ pw_getconf(option, LINE_MAX, "default", cipher);
+ }
+
+ srandom((int)time((time_t *)NULL));
+ next = option;
+ now = strsep(&next, ",");
+ if (strcmp(now, "old") == 0) {
+ if (max < 3)
+ return (0);
+ to64(&salt[0], random(), 2);
+ salt[2] = '\0';
+ } else if (strcmp(now, "newsalt") == 0) {
+ rounds = atol(next);
+ if (max < 10)
+ return (0);
+ /* Check rounds, 24 bit is max */
+ if (rounds < 7250)
+ rounds = 7250;
+ else if (rounds > 0xffffff)
+ rounds = 0xffffff;
+ salt[0] = _PASSWORD_EFMT1;
+ to64(&salt[1], (u_int32_t) rounds, 4);
+ to64(&salt[5], random(), 4);
+ salt[9] = '\0';
+ } else if (strcmp(now, "md5") == 0) {
+ if (max < 13) /* $1$8salt$\0 */
+ return (0);
+ salt[0] = _PASSWORD_NONDES;
+ salt[1] = '1';
+ salt[2] = '$';
+ to64(&salt[3], random(), 4);
+ to64(&salt[7], random(), 4);
+ salt[11] = '$';
+ salt[12] = '\0';
+#if 0
+ } else if (strcmp(now, "blowfish")) {
+ rounds = atoi(next);
+ if (rounds < 4)
+ rounds = 4;
+ strncpy(salt, bcrypt_gensalt(rounds), max - 1);
+ salt[max - 1] = 0;
+#endif
+ } else {
+ strcpy(salt, ":");
+ warnx("Unkown option %s.", now);
+ }
+
+ return (1);
+}
+
+static void
+to64(char *s, long v, int n)
+{
+
+ while (--n >= 0) {
+ *s++ = itoa64[v & 0x3f];
+ v >>= 6;
+ }
+}
Home |
Main Index |
Thread Index |
Old Index