SOURCES: pwdutils-crypt.patch (NEW) - crypt_gensalt functions, needed to re...

qboosh qboosh at pld-linux.org
Mon Sep 8 22:04:29 CEST 2008


Author: qboosh                       Date: Mon Sep  8 20:04:29 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- crypt_gensalt functions, needed to restore MD5(!) and add blowfish support in chpasswd(8)

---- Files affected:
SOURCES:
   pwdutils-crypt.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/pwdutils-crypt.patch
diff -u /dev/null SOURCES/pwdutils-crypt.patch:1.1
--- /dev/null	Mon Sep  8 22:04:29 2008
+++ SOURCES/pwdutils-crypt.patch	Mon Sep  8 22:04:23 2008
@@ -0,0 +1,310 @@
+--- pwdutils-3.1.3/lib/Makefile.am.orig	2005-08-17 16:43:31.000000000 +0200
++++ pwdutils-3.1.3/lib/Makefile.am	2008-09-08 20:15:07.320983956 +0200
+@@ -13,7 +13,7 @@
+ noinst_HEADERS = error_codes.h libldap.h logindefs.h nispasswd.h nsw.h \
+ 		public.h read-files.h yppasswd.h group.h use_slp.h \
+ 		dbg_log.h yesno.h parse_crypt_arg.h utf8conv.h logging.h \
+-		msg_table.h i18n.h
++		msg_table.h i18n.h crypt-gensalt.h
+ 
+ libpwdutils_a_SOURCES = authentication.c get_value.c libldap.c logindefs.c \
+ 			nsw.c passwd_nisplus.c read-files.c user.c \
+@@ -25,7 +25,7 @@ libpwdutils_a_SOURCES = authentication.c
+ 			chown_dir_rec.c check_home.c use_slp.c dbg_log.c \
+ 			parse_pwent.c yesno.c parse_grent.c strtoid.c \
+ 			parse_crypt_arg.c utf8conv.c get_ldap_password.c \
+-			get_caller_dn.c logging.c remove_gr_mem.c
++			get_caller_dn.c logging.c remove_gr_mem.c crypt-gensalt.c
+ 
+ localedir = $(datadir)/locale
+ plugindir = $(libdir)/pwdutils
+--- pwdutils-3.1.3/lib/parse_crypt_arg.c.orig	2005-08-16 13:53:34.000000000 +0200
++++ pwdutils-3.1.3/lib/parse_crypt_arg.c	2008-09-08 20:20:57.168985632 +0200
+@@ -33,6 +33,7 @@
+ 
+ #include "i18n.h"
+ #include "parse_crypt_arg.h"
++#include "crypt-gensalt.h"
+ 
+ #ifndef RANDOM_DEVICE
+ #define RANDOM_DEVICE "/dev/urandom"
+--- pwdutils-3.1.3/configure.in.orig	2008-09-08 20:01:26.988991499 +0200
++++ pwdutils-3.1.3/configure.in	2008-09-08 20:17:27.936994851 +0200
+@@ -185,7 +185,8 @@
+ BACKUP_LIBS=$LIBS
+ LIBS="$LIBS $CRYPT_LIB"
+ dnl Function check for blowfish crypt
+-AC_CHECK_FUNCS(crypt crypt_r crypt_rn crypt_gensalt_rn)
++AC_CHECK_FUNCS(crypt crypt_r)
++AC_DEFINE([HAVE_CRYPT_GENSALT_RN], [1], [We have crypt_gensalt_rn function])
+ dnl restore old LIBS variable
+ LIBS=$BACKUP_LIBS
+ 
+--- pwdutils-3.1.3/lib/crypt-gensalt.h.orig	1970-01-01 01:00:00.000000000 +0100
++++ pwdutils-3.1.3/lib/crypt-gensalt.h	2008-09-08 20:06:36.872989823 +0200
+@@ -0,0 +1,23 @@
++/*
++ * Written by Solar Designer and placed in the public domain.
++ * Ripped from crypt-blowfish.
++ */
++
++#ifndef _CRYPT_GENSALT_H
++#define _CRYPT_GENSALT_H
++
++#undef __CONST
++#ifdef __GNUC__
++#define __CONST __const
++#else
++#define __CONST
++#endif
++
++extern char *crypt_gensalt(__CONST char *prefix, unsigned long count,
++	__CONST char *input, int size);
++extern char *crypt_gensalt_rn(__CONST char *prefix, unsigned long count,
++	__CONST char *input, int size, char *output, int output_size);
++extern char *crypt_gensalt_ra(__CONST char *prefix, unsigned long count,
++	__CONST char *input, int size);
++
++#endif
+--- pwdutils-3.1.3/lib/crypt-gensalt.c.orig	1970-01-01 01:00:00.000000000 +0100
++++ pwdutils-3.1.3/lib/crypt-gensalt.c	2008-09-08 20:14:03.952983956 +0200
+@@ -0,0 +1,239 @@
++/*
++ * Written by Solar Designer and placed in the public domain.
++ * Ripped from crypt-blowfish.
++ */
++
++#include <string.h>
++
++#include <errno.h>
++#ifndef __set_errno
++#define __set_errno(val) errno = (val)
++#endif
++
++#include "crypt-gensalt.h"
++
++#define CRYPT_OUTPUT_SIZE		(7 + 22 + 31 + 1)
++#define CRYPT_GENSALT_OUTPUT_SIZE	(7 + 22 + 1)
++
++#undef __CONST
++#ifdef __GNUC__
++#define __CONST __const
++#else
++#define __CONST
++#endif
++
++static unsigned char _crypt_itoa64[64 + 1] =
++	"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
++
++static char *_crypt_gensalt_traditional_rn(unsigned long count,
++	__CONST char *input, int size, char *output, int output_size)
++{
++	if (size < 2 || output_size < 2 + 1 || (count && count != 25)) {
++		if (output_size > 0) output[0] = '\0';
++		__set_errno((output_size < 2 + 1) ? ERANGE : EINVAL);
++		return NULL;
++	}
++
++	output[0] = _crypt_itoa64[(unsigned int)input[0] & 0x3f];
++	output[1] = _crypt_itoa64[(unsigned int)input[1] & 0x3f];
++	output[2] = '\0';
++
++	return output;
++}
++
++static char *_crypt_gensalt_extended_rn(unsigned long count,
++	__CONST char *input, int size, char *output, int output_size)
++{
++	unsigned long value;
++
++/* Even iteration counts make it easier to detect weak DES keys from a look
++ * at the hash, so they should be avoided */
++	if (size < 3 || output_size < 1 + 4 + 4 + 1 ||
++	    (count && (count > 0xffffff || !(count & 1)))) {
++		if (output_size > 0) output[0] = '\0';
++		__set_errno((output_size < 1 + 4 + 4 + 1) ? ERANGE : EINVAL);
++		return NULL;
++	}
++
++	if (!count) count = 725;
++
++	output[0] = '_';
++	output[1] = _crypt_itoa64[count & 0x3f];
++	output[2] = _crypt_itoa64[(count >> 6) & 0x3f];
++	output[3] = _crypt_itoa64[(count >> 12) & 0x3f];
++	output[4] = _crypt_itoa64[(count >> 18) & 0x3f];
++	value = (unsigned long)(unsigned char)input[0] |
++		((unsigned long)(unsigned char)input[1] << 8) |
++		((unsigned long)(unsigned char)input[2] << 16);
++	output[5] = _crypt_itoa64[value & 0x3f];
++	output[6] = _crypt_itoa64[(value >> 6) & 0x3f];
++	output[7] = _crypt_itoa64[(value >> 12) & 0x3f];
++	output[8] = _crypt_itoa64[(value >> 18) & 0x3f];
++	output[9] = '\0';
++
++	return output;
++}
++
++static char *_crypt_gensalt_md5_rn(unsigned long count,
++	__CONST char *input, int size, char *output, int output_size)
++{
++	unsigned long value;
++
++	if (size < 3 || output_size < 3 + 4 + 1 || (count && count != 1000)) {
++		if (output_size > 0) output[0] = '\0';
++		__set_errno((output_size < 3 + 4 + 1) ? ERANGE : EINVAL);
++		return NULL;
++	}
++
++	output[0] = '$';
++	output[1] = '1';
++	output[2] = '$';
++	value = (unsigned long)(unsigned char)input[0] |
++		((unsigned long)(unsigned char)input[1] << 8) |
++		((unsigned long)(unsigned char)input[2] << 16);
++	output[3] = _crypt_itoa64[value & 0x3f];
++	output[4] = _crypt_itoa64[(value >> 6) & 0x3f];
++	output[5] = _crypt_itoa64[(value >> 12) & 0x3f];
++	output[6] = _crypt_itoa64[(value >> 18) & 0x3f];
++	output[7] = '\0';
++
++	if (size >= 6 && output_size >= 3 + 4 + 4 + 1) {
++		value = (unsigned long)(unsigned char)input[3] |
++			((unsigned long)(unsigned char)input[4] << 8) |
++			((unsigned long)(unsigned char)input[5] << 16);
++		output[7] = _crypt_itoa64[value & 0x3f];
++		output[8] = _crypt_itoa64[(value >> 6) & 0x3f];
++		output[9] = _crypt_itoa64[(value >> 12) & 0x3f];
++		output[10] = _crypt_itoa64[(value >> 18) & 0x3f];
++		output[11] = '\0';
++	}
++
++	return output;
++}
++
++typedef unsigned int BF_word;
++
++static unsigned char BF_itoa64[64 + 1] =
++	"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
++
++static void BF_encode(char *dst, __CONST BF_word *src, int size)
++{
++	unsigned char *sptr = (unsigned char *)src;
++	unsigned char *end = sptr + size;
++	unsigned char *dptr = (unsigned char *)dst;
++	unsigned int c1, c2;
++
++	do {
++		c1 = *sptr++;
++		*dptr++ = BF_itoa64[c1 >> 2];
++		c1 = (c1 & 0x03) << 4;
++		if (sptr >= end) {
++			*dptr++ = BF_itoa64[c1];
++			break;
++		}
++
++		c2 = *sptr++;
++		c1 |= c2 >> 4;
++		*dptr++ = BF_itoa64[c1];
++		c1 = (c2 & 0x0f) << 2;
++		if (sptr >= end) {
++			*dptr++ = BF_itoa64[c1];
++			break;
++		}
++
++		c2 = *sptr++;
++		c1 |= c2 >> 6;
++		*dptr++ = BF_itoa64[c1];
++		*dptr++ = BF_itoa64[c2 & 0x3f];
++	} while (sptr < end);
++}
++
++static char *_crypt_gensalt_blowfish_rn(unsigned long count,
++	__CONST char *input, int size, char *output, int output_size)
++{
++	if (size < 16 || output_size < 7 + 22 + 1 ||
++	    (count && (count < 4 || count > 31))) {
++		if (output_size > 0) output[0] = '\0';
++		__set_errno((output_size < 7 + 22 + 1) ? ERANGE : EINVAL);
++		return NULL;
++	}
++
++	if (!count) count = 5;
++
++	output[0] = '$';
++	output[1] = '2';
++	output[2] = 'a';
++	output[3] = '$';
++	output[4] = '0' + count / 10;
++	output[5] = '0' + count % 10;
++	output[6] = '$';
++
++	BF_encode(&output[7], (BF_word *)input, 16);
++	output[7 + 22] = '\0';
++
++	return output;
++}
++
++char *crypt_gensalt_rn(__CONST char *prefix, unsigned long count,
++	__CONST char *input, int size, char *output, int output_size)
++{
++	char *(*use)(unsigned long count,
++		__CONST char *input, int size, char *output, int output_size);
++
++	/* This may be supported on some platforms in the future */
++	if (!input) {
++		__set_errno(EINVAL);
++		return NULL;
++	}
++
++	if (!strncmp(prefix, "$2a$", 4))
++		use = _crypt_gensalt_blowfish_rn;
++	else
++	if (!strncmp(prefix, "$1$", 3))
++		use = _crypt_gensalt_md5_rn;
++	else
++	if (prefix[0] == '_')
++		use = _crypt_gensalt_extended_rn;
++	else
++	if (!prefix[0] ||
++	    (prefix[0] && prefix[1] &&
++	    memchr(_crypt_itoa64, prefix[0], 64) &&
++	    memchr(_crypt_itoa64, prefix[1], 64)))
++		use = _crypt_gensalt_traditional_rn;
++	else {
++		__set_errno(EINVAL);
++		return NULL;
++	}
++
++	return use(count, input, size, output, output_size);
++}
++
++char *crypt_gensalt_ra(__CONST char *prefix, unsigned long count,
++	__CONST char *input, int size)
++{
++	char output[CRYPT_GENSALT_OUTPUT_SIZE];
++	char *retval;
++
++	retval = crypt_gensalt_rn(prefix, count,
++		input, size, output, sizeof(output));
++
++	if (retval) {
++		retval = strdup(retval);
++#ifndef __GLIBC__
++		/* strdup(3) on glibc sets errno, so we don't need to bother */
++		if (!retval)
++			__set_errno(ENOMEM);
++#endif
++	}
++
++	return retval;
++}
++
++char *crypt_gensalt(__CONST char *prefix, unsigned long count,
++	__CONST char *input, int size)
++{
++	static char output[CRYPT_GENSALT_OUTPUT_SIZE];
++
++	return crypt_gensalt_rn(prefix, count,
++		input, size, output, sizeof(output));
++}
================================================================


More information about the pld-cvs-commit mailing list