Remove apps cache for gethostbyname
[openssl.git] / apps / rand.c
1 /* ====================================================================
2  * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * 3. All advertising materials mentioning features or use of this
17  *    software must display the following acknowledgment:
18  *    "This product includes software developed by the OpenSSL Project
19  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20  *
21  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22  *    endorse or promote products derived from this software without
23  *    prior written permission. For written permission, please contact
24  *    openssl-core@openssl.org.
25  *
26  * 5. Products derived from this software may not be called "OpenSSL"
27  *    nor may "OpenSSL" appear in their names without prior written
28  *    permission of the OpenSSL Project.
29  *
30  * 6. Redistributions of any form whatsoever must retain the following
31  *    acknowledgment:
32  *    "This product includes software developed by the OpenSSL Project
33  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46  * OF THE POSSIBILITY OF SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This product includes cryptographic software written by Eric Young
50  * (eay@cryptsoft.com).  This product includes software written by Tim
51  * Hudson (tjh@cryptsoft.com).
52  *
53  */
54
55 #include "apps.h"
56
57 #include <ctype.h>
58 #include <stdio.h>
59 #include <string.h>
60
61 #include <openssl/bio.h>
62 #include <openssl/err.h>
63 #include <openssl/rand.h>
64
65 typedef enum OPTION_choice {
66     OPT_ERR = -1, OPT_EOF = 0, OPT_HELP,
67     OPT_OUT, OPT_ENGINE, OPT_RAND, OPT_BASE64, OPT_HEX
68 } OPTION_CHOICE;
69
70 OPTIONS rand_options[] = {
71     {OPT_HELP_STR, 1, '-', "Usage: %s [flags] num\n"},
72     {OPT_HELP_STR, 1, '-', "Valid options are:\n"},
73     {"help", OPT_HELP, '-', "Display this summary"},
74     {"out", OPT_OUT, '>', "Output file"},
75     {"rand", OPT_RAND, 's',
76      "Load the file(s) into the random number generator"},
77     {"base64", OPT_BASE64, '-', "Base64 encode output"},
78     {"hex", OPT_HEX, '-', "Hex encode output"},
79 #ifndef OPENSSL_NO_ENGINE
80     {"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
81 #endif
82     {NULL}
83 };
84
85 int rand_main(int argc, char **argv)
86 {
87     BIO *out = NULL;
88     char *inrand = NULL, *outfile = NULL, *prog;
89     OPTION_CHOICE o;
90     int base64 = 0, hex = 0, i, num = -1, r, ret = 1;
91
92     prog = opt_init(argc, argv, rand_options);
93     while ((o = opt_next()) != OPT_EOF) {
94         switch (o) {
95         case OPT_EOF:
96         case OPT_ERR:
97  opthelp:
98             BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
99             goto end;
100         case OPT_HELP:
101             opt_help(rand_options);
102             ret = 0;
103             goto end;
104         case OPT_OUT:
105             outfile = opt_arg();
106             break;
107         case OPT_ENGINE:
108             (void)setup_engine(opt_arg(), 0);
109             break;
110         case OPT_RAND:
111             inrand = opt_arg();
112             break;
113         case OPT_BASE64:
114             base64 = 1;
115             break;
116         case OPT_HEX:
117             hex = 1;
118             break;
119         }
120     }
121     argc = opt_num_rest();
122     argv = opt_rest();
123
124     if (argc != 1 || (hex && base64))
125         goto opthelp;
126     if (sscanf(argv[0], "%d", &num) != 1 || num < 0)
127         goto opthelp;
128
129     app_RAND_load_file(NULL, (inrand != NULL));
130     if (inrand != NULL)
131         BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
132                    app_RAND_load_files(inrand));
133
134     out = bio_open_default(outfile, "w");
135     if (out == NULL)
136         goto end;
137
138     if (base64) {
139         BIO *b64 = BIO_new(BIO_f_base64());
140         if (b64 == NULL)
141             goto end;
142         out = BIO_push(b64, out);
143     }
144
145     while (num > 0) {
146         unsigned char buf[4096];
147         int chunk;
148
149         chunk = num;
150         if (chunk > (int)sizeof(buf))
151             chunk = sizeof buf;
152         r = RAND_bytes(buf, chunk);
153         if (r <= 0)
154             goto end;
155         if (!hex)
156             BIO_write(out, buf, chunk);
157         else {
158             for (i = 0; i < chunk; i++)
159                 BIO_printf(out, "%02x", buf[i]);
160         }
161         num -= chunk;
162     }
163     if (hex)
164         BIO_puts(out, "\n");
165     (void)BIO_flush(out);
166
167     app_RAND_write_file(NULL);
168     ret = 0;
169
170  end:
171     BIO_free_all(out);
172     return (ret);
173 }