components/pwgen/patches/03-fix_CVEs-2013-4440-4443.patch
author Jiri Kukacka <jiri.kukacka@oracle.com>
Mon, 02 Dec 2013 05:58:52 -0800
changeset 1600 936fff797203
permissions -rw-r--r--
17454821 pwgen shall use existing approved library for SHA-1 17636356 problem in UTILITY/PWGEN
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1600
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     1
Developed by community.
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     2
http://marc.info/?l=oss-security&m=137049241132104&w=4
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     3
Fix following CVEs:
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     4
CVE-2013-4440, CVE-2013-4441, CVE-2013-4442, CVE-2013-4443
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     5
with an exception of number bias in short passwords (won't be fixed,
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     6
it's a feature)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     7
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     8
--- pwgen-2.06/configure.in	2007-07-05 09:42:19.000000000 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
     9
+++ pwgen-2.06-mik/configure.in	2013-05-27 16:48:46.399195554 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    10
@@ -6,7 +6,7 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    11
 AC_PATH_PROG(RM, rm, rm)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    12
 AC_PATH_PROG(SED, sed, sed)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    13
 AC_PATH_PROG(PERL, perl, perl)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    14
-AC_CHECK_FUNCS(drand48 getopt_long)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    15
+AC_CHECK_FUNCS(getopt_long)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    16
 AC_CHECK_HEADERS(getopt.h)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    17
 pwgen_sha="internal"
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    18
 SHA_OBJ=""
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    19
--- pwgen-2.06/debian/control	2013-06-06 09:57:01.000000000 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    20
+++ pwgen-2.06-mik/debian/control	2013-06-06 10:05:44.315608968 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    21
@@ -8,6 +8,7 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    22
 Package: pwgen
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    23
 Architecture: any
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    24
 Depends: ${shlibs:Depends}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    25
+Suggests: passwdqc
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    26
 Description: Automatic Password generation
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    27
  pwgen generates random, meaningless but pronounceable passwords.
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    28
  These passwords contain either only lowercase letters, or upper
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    29
--- pwgen-2.06/pwgen.c	2013-06-06 09:57:01.000000000 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    30
+++ pwgen-2.06-mik/pwgen.c	2013-06-06 13:50:19.541188659 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    31
@@ -25,7 +25,7 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    32
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    33
 int	pw_length = 8;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    34
 int	num_pw = -1;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    35
-int	pwgen_flags = 0;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    36
+int	pwgen_flags = PW_LOWERS | PW_UPPERS | PW_DIGITS;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    37
 int	do_columns = 0;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    38
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    39
 #ifdef HAVE_GETOPT_LONG
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    40
@@ -42,11 +42,12 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    41
 	{ "sha1", required_argument, 0, 'H' },
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    42
 	{ "ambiguous", no_argument, 0, 'B' },
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    43
 	{ "no-vowels", no_argument, 0, 'v' },
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    44
+	{ "insecure-phonemes", no_argument, 0, 'P' },
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    45
 	{ 0, 0, 0, 0}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    46
 };
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    47
 #endif
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    48
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    49
-const char *pw_options = "01AaBCcnN:shH:vy";
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    50
+const char *pw_options = "01AaBCcnN:shH:vyP";
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    51
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    52
 static void usage(void)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    53
 {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    54
@@ -82,6 +83,8 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    55
 	fputs("  -v or --no-vowels\n", stderr);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    56
 	fputs("\tDo not use any vowels so as to avoid accidental nasty words\n",
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    57
 	      stderr);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    58
+	fputs("  -P or --insecure-phonemes\n", stderr);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    59
+	fputs("\tGenerate insecure phonemes, as was previously the default\n", stderr);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    60
 	exit(1);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    61
 }
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    62
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    63
@@ -94,11 +97,10 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    64
 	char	*buf, *tmp;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    65
 	void	(*pwgen)(char *inbuf, int size, int pw_flags);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    66
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    67
-	pwgen = pw_phonemes;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    68
+	pwgen = pw_rand;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    69
 	pw_number = pw_random_number;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    70
 	if (isatty(1)) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    71
 		do_columns = 1;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    72
-		pwgen_flags |= PW_DIGITS | PW_UPPERS;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    73
 	}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    74
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    75
 	while (1) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    76
@@ -140,6 +144,9 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    77
 			pwgen = pw_rand;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    78
 			pwgen_flags = PW_DIGITS | PW_UPPERS;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    79
 			break;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    80
+		case 'P':
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    81
+			pwgen = pw_phonemes;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    82
+			break;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    83
 		case 'C':
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    84
 			do_columns = 1;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    85
 			break;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    86
--- pwgen-2.06/pwgen.h	2007-07-05 09:42:19.000000000 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    87
+++ pwgen-2.06-mik/pwgen.h	2013-06-06 10:08:42.186709620 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    88
@@ -28,6 +28,7 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    89
 #define PW_SYMBOLS	0x0004
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    90
 #define PW_AMBIGUOUS	0x0008
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    91
 #define PW_NO_VOWELS	0x0010
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    92
+#define PW_LOWERS	0x0020  /* At least one lowercase! */
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    93
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    94
 /* pointer to choose between random or sha1 pseudo random number generator */
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    95
 extern int (*pw_number)(int max_num);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    96
--- pwgen-2.06/pw_rand.c	2007-07-05 09:42:19.000000000 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    97
+++ pwgen-2.06-mik/pw_rand.c	2013-06-06 13:51:38.948600125 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    98
@@ -72,10 +72,12 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
    99
 			feature_flags &= ~PW_UPPERS;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   100
 		if (strchr(pw_symbols, ch))
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   101
 			feature_flags &= ~PW_SYMBOLS;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   102
+		if (strchr(pw_lowers, ch))
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   103
+			feature_flags &= ~PW_LOWERS;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   104
 	}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   105
-	if (feature_flags & (PW_UPPERS | PW_DIGITS | PW_SYMBOLS))
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   106
+	if (feature_flags & (PW_UPPERS | PW_DIGITS | PW_SYMBOLS | PW_LOWERS))
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   107
 		goto try_again;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   108
 	buf[size] = 0;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   109
 	free(chars);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   110
 	return;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   111
-}	
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   112
+}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   113
--- pwgen-2.06/randnum.c	2007-07-05 09:42:19.000000000 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   114
+++ pwgen-2.06-mik/randnum.c	2013-06-06 10:00:23.149212710 +1000
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   115
@@ -7,53 +7,45 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   116
  * License.
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   117
  */
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   118
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   119
+#include <stdio.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   120
+#include <string.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   121
 #include <unistd.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   122
 #include <stdlib.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   123
 #include <sys/types.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   124
-#include <sys/time.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   125
 #include <sys/stat.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   126
 #include <fcntl.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   127
 #include <errno.h>
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   128
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   129
 #include "pwgen.h"
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   130
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   131
-#ifdef HAVE_DRAND48
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   132
-extern double drand48(void);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   133
-#endif
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   134
-
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   135
 static int get_random_fd(void);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   136
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   137
 /* Borrowed/adapted from e2fsprogs's UUID generation code */
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   138
 static int get_random_fd()
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   139
 {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   140
-	struct timeval	tv;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   141
-	static int	fd = -2;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   142
-	int		i;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   143
+	static int fd = -2;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   144
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   145
-	if (fd == -2) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   146
-		gettimeofday(&tv, 0);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   147
+	if(fd == -2) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   148
 		fd = open("/dev/urandom", O_RDONLY);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   149
-		if (fd == -1)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   150
-			fd = open("/dev/random", O_RDONLY | O_NONBLOCK);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   151
-#ifdef HAVE_DRAND48
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   152
-		srand48((tv.tv_sec<<9) ^ (getpgrp()<<15) ^
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   153
-			(getpid()) ^ (tv.tv_usec>>11));
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   154
-#else
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   155
-		srandom((getpid() << 16) ^ (getpgrp() << 8) ^ getuid() 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   156
-		      ^ tv.tv_sec ^ tv.tv_usec);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   157
-#endif
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   158
+		if (fd == -1) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   159
+			fprintf(stderr, "Unable to open /dev/urandom: %s\n", strerror(errno));
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   160
+			abort();
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   161
+		}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   162
 	}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   163
-	/* Crank the random number generator a few times */
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   164
-	gettimeofday(&tv, 0);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   165
-	for (i = (tv.tv_sec ^ tv.tv_usec) & 0x1F; i > 0; i--)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   166
-#ifdef HAVE_DRAND48
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   167
-		drand48();
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   168
-#else
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   169
-		random();
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   170
-#endif
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   171
 	return fd;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   172
 }
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   173
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   174
+static unsigned int get_mask(int max_num)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   175
+{
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   176
+	unsigned int numBits = 0;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   177
+	while(max_num > 0)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   178
+	{
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   179
+		numBits++;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   180
+		max_num >>= 1;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   181
+	}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   182
+	return (1<<numBits) - 1;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   183
+}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   184
+
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   185
 /*
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   186
  * Generate a random number n, where 0 <= n < max_num, using
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   187
  * /dev/urandom if possible.
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   188
@@ -62,34 +54,20 @@
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   189
 	int max_num;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   190
 {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   191
 	int i, fd = get_random_fd();
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   192
-	int lose_counter = 0, nbytes=4;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   193
 	unsigned int rand_num;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   194
-	char *cp = (char *) &rand_num;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   195
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   196
-	if (fd >= 0) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   197
-		while (nbytes > 0) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   198
-			i = read(fd, cp, nbytes);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   199
-			if ((i < 0) &&
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   200
-			    ((errno == EINTR) || (errno == EAGAIN)))
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   201
-				continue;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   202
-			if (i <= 0) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   203
-				if (lose_counter++ == 8)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   204
-					break;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   205
-				continue;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   206
-			}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   207
-			nbytes -= i;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   208
-			cp += i;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   209
-			lose_counter = 0;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   210
-		}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   211
+	i = read(fd, (void *)&rand_num, sizeof(rand_num));
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   212
+	if(i < 0) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   213
+		fprintf(stderr, "Error reading from /dev/urandom: %s\n", strerror(errno));
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   214
+		abort();
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   215
 	}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   216
-	if (nbytes == 0)
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   217
-		return (rand_num % max_num);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   218
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   219
-	/* OK, we weren't able to use /dev/random, fall back to rand/rand48 */
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   220
+        rand_num &= get_mask(max_num);
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   221
 
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   222
-#ifdef HAVE_DRAND48
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   223
-	return ((int) ((drand48() * max_num)));
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   224
-#else
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   225
-	return ((int) (random() / ((float) RAND_MAX) * max_num));
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   226
-#endif
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   227
+	if(rand_num < max_num) {
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   228
+		return rand_num;
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   229
+	}
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   230
+
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   231
+	return pw_random_number(max_num); /* tail-recurse */
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   232
 }
936fff797203 17454821 pwgen shall use existing approved library for SHA-1
Jiri Kukacka <jiri.kukacka@oracle.com>
parents:
diff changeset
   233
+