1 | /*
|
---|
2 | * Copyright (c) 2007 Kungliga Tekniska Högskolan
|
---|
3 | * (Royal Institute of Technology, Stockholm, Sweden).
|
---|
4 | * All rights reserved.
|
---|
5 | *
|
---|
6 | * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
|
---|
7 | *
|
---|
8 | * Redistribution and use in source and binary forms, with or without
|
---|
9 | * modification, are permitted provided that the following conditions
|
---|
10 | * are met:
|
---|
11 | *
|
---|
12 | * 1. Redistributions of source code must retain the above copyright
|
---|
13 | * notice, this list of conditions and the following disclaimer.
|
---|
14 | *
|
---|
15 | * 2. Redistributions in binary form must reproduce the above copyright
|
---|
16 | * notice, this list of conditions and the following disclaimer in the
|
---|
17 | * documentation and/or other materials provided with the distribution.
|
---|
18 | *
|
---|
19 | * 3. Neither the name of the Institute nor the names of its contributors
|
---|
20 | * may be used to endorse or promote products derived from this software
|
---|
21 | * without specific prior written permission.
|
---|
22 | *
|
---|
23 | * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
---|
24 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
---|
25 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
---|
26 | * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
---|
27 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
---|
28 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
---|
29 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
---|
30 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
---|
31 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
---|
32 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
---|
33 | * SUCH DAMAGE.
|
---|
34 | */
|
---|
35 |
|
---|
36 | #include <config.h>
|
---|
37 |
|
---|
38 | #include <stdio.h>
|
---|
39 |
|
---|
40 | #include <roken.h>
|
---|
41 | #include <getarg.h>
|
---|
42 |
|
---|
43 | #include "rand.h"
|
---|
44 |
|
---|
45 |
|
---|
46 | /*
|
---|
47 | *
|
---|
48 | */
|
---|
49 |
|
---|
50 | static int version_flag;
|
---|
51 | static int help_flag;
|
---|
52 | static int len = 1024 * 1024;
|
---|
53 | static char *rand_method;
|
---|
54 | static char *filename;
|
---|
55 |
|
---|
56 | static struct getargs args[] = {
|
---|
57 | { "length", 0, arg_integer, &len,
|
---|
58 | "length", NULL },
|
---|
59 | { "file", 0, arg_string, &filename,
|
---|
60 | "file name", NULL },
|
---|
61 | { "method", 0, arg_string, &rand_method,
|
---|
62 | "method", NULL },
|
---|
63 | { "version", 0, arg_flag, &version_flag,
|
---|
64 | "print version", NULL },
|
---|
65 | { "help", 0, arg_flag, &help_flag,
|
---|
66 | NULL, NULL }
|
---|
67 | };
|
---|
68 |
|
---|
69 | /*
|
---|
70 | *
|
---|
71 | */
|
---|
72 |
|
---|
73 | /*
|
---|
74 | *
|
---|
75 | */
|
---|
76 |
|
---|
77 | static void
|
---|
78 | usage (int ret)
|
---|
79 | {
|
---|
80 | arg_printusage (args,
|
---|
81 | sizeof(args)/sizeof(args[0]),
|
---|
82 | NULL,
|
---|
83 | "");
|
---|
84 | exit (ret);
|
---|
85 | }
|
---|
86 |
|
---|
87 | int
|
---|
88 | main(int argc, char **argv)
|
---|
89 | {
|
---|
90 | int idx = 0;
|
---|
91 | char *buffer;
|
---|
92 | char path[MAXPATHLEN];
|
---|
93 |
|
---|
94 | setprogname(argv[0]);
|
---|
95 |
|
---|
96 | if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx))
|
---|
97 | usage(1);
|
---|
98 |
|
---|
99 | if (help_flag)
|
---|
100 | usage(0);
|
---|
101 |
|
---|
102 | if(version_flag){
|
---|
103 | print_version(NULL);
|
---|
104 | exit(0);
|
---|
105 | }
|
---|
106 |
|
---|
107 | argc -= idx;
|
---|
108 | argv += idx;
|
---|
109 |
|
---|
110 | if (argc != 0)
|
---|
111 | usage(1);
|
---|
112 |
|
---|
113 | buffer = emalloc(len);
|
---|
114 |
|
---|
115 | if (rand_method) {
|
---|
116 | if (0) {
|
---|
117 | }
|
---|
118 | #ifndef NO_RAND_FORTUNA_METHOD
|
---|
119 | else if (strcasecmp(rand_method, "fortuna") == 0)
|
---|
120 | RAND_set_rand_method(RAND_fortuna_method());
|
---|
121 | #endif
|
---|
122 | #ifndef NO_RAND_UNIX_METHOD
|
---|
123 | else if (strcasecmp(rand_method, "unix") == 0)
|
---|
124 | RAND_set_rand_method(RAND_unix_method());
|
---|
125 | #endif
|
---|
126 | #ifndef NO_RAND_EGD_METHOD
|
---|
127 | else if (strcasecmp(rand_method, "egd") == 0)
|
---|
128 | RAND_set_rand_method(RAND_egd_method());
|
---|
129 | #endif
|
---|
130 | #ifdef WIN32
|
---|
131 | else if (strcasecmp(rand_method, "w32crypto") == 0)
|
---|
132 | RAND_set_rand_method(RAND_w32crypto_method());
|
---|
133 | #endif
|
---|
134 | else
|
---|
135 | errx(1, "unknown method %s", rand_method);
|
---|
136 | }
|
---|
137 |
|
---|
138 | if (RAND_file_name(path, sizeof(path)) == NULL)
|
---|
139 | errx(1, "RAND_file_name failed");
|
---|
140 |
|
---|
141 | if (RAND_status() != 1)
|
---|
142 | errx(1, "random not ready yet");
|
---|
143 |
|
---|
144 | if (RAND_bytes(buffer, len) != 1)
|
---|
145 | errx(1, "RAND_bytes");
|
---|
146 |
|
---|
147 | if (filename)
|
---|
148 | rk_dumpdata(filename, buffer, len);
|
---|
149 |
|
---|
150 | /* head vs tail */
|
---|
151 | if (len >= 100000) {
|
---|
152 | int bit, i;
|
---|
153 | double res;
|
---|
154 | int bits[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
---|
155 |
|
---|
156 | for (i = 0; i < len; i++) {
|
---|
157 | unsigned char c = ((unsigned char *)buffer)[i];
|
---|
158 | for (bit = 0; bit < 8 && c; bit++) {
|
---|
159 | if (c & 1)
|
---|
160 | bits[bit]++;
|
---|
161 | c = c >> 1;
|
---|
162 | }
|
---|
163 | }
|
---|
164 |
|
---|
165 | for (bit = 0; bit < 8; bit++) {
|
---|
166 |
|
---|
167 | res = ((double)abs(len - bits[bit] * 2)) / (double)len;
|
---|
168 | if (res > 0.005)
|
---|
169 | errx(1, "head%d vs tail%d > 0.5%%%% %lf == %d vs %d",
|
---|
170 | bit, bit, res, len, bits[bit]);
|
---|
171 |
|
---|
172 | printf("head vs tails bit%d: %lf\n", bit, res);
|
---|
173 | }
|
---|
174 | }
|
---|
175 |
|
---|
176 | free(buffer);
|
---|
177 |
|
---|
178 | /* test write random file */
|
---|
179 | {
|
---|
180 | static const char *file = "test.file";
|
---|
181 | if (RAND_write_file(file) != 1)
|
---|
182 | errx(1, "RAND_write_file");
|
---|
183 | if (RAND_load_file(file, 1024) != 1)
|
---|
184 | errx(1, "RAND_load_file");
|
---|
185 | unlink(file);
|
---|
186 | }
|
---|
187 |
|
---|
188 | return 0;
|
---|
189 | }
|
---|