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