author | Jiri Kukacka <jiri.kukacka@oracle.com> |
Mon, 02 Dec 2013 05:58:52 -0800 | |
changeset 1600 | 936fff797203 |
permissions | -rw-r--r-- |
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 |
+ |