Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-5]: src/usr.bin/passwd Pull up revisions 1.1-1.5 (requested by ...
details: https://anonhg.NetBSD.org/src/rev/dd0a186e6e7a
branches: netbsd-1-5
changeset: 492901:dd0a186e6e7a
user: he <he%NetBSD.org@localhost>
date: Tue Feb 26 22:09:42 2002 +0000
description:
Pull up revisions 1.1-1.5 (requested by jonathan):
Add support for local MD5-encrypted passwords.
diffstat:
usr.bin/passwd/pwd_gensalt.c | 146 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 146 insertions(+), 0 deletions(-)
diffs (150 lines):
diff -r 8015e1c88f2c -r dd0a186e6e7a usr.bin/passwd/pwd_gensalt.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/passwd/pwd_gensalt.c Tue Feb 26 22:09:42 2002 +0000
@@ -0,0 +1,146 @@
+/* $NetBSD: pwd_gensalt.c,v 1.5.2.2 2002/02/26 22:09:42 he 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/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: pwd_gensalt.c,v 1.5.2.2 2002/02/26 22:09:42 he Exp $");
+#endif /* not lint */
+
+#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, sizeof(option), pwd->pw_name, cipher);
+
+ /* Try to find an entry for the group */
+ if (*option == 0) {
+ if ((grp = getgrgid(pwd->pw_gid)) != NULL) {
+ snprintf(grpkey, sizeof(grpkey), ":%s", grp->gr_name);
+ pw_getconf(option, sizeof(option), grpkey, cipher);
+ }
+ if (*option == 0)
+ pw_getconf(option, sizeof(option), "default", cipher);
+ }
+
+ srandom((int)time(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("Unknown 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