source: trunk/third/openssl/apps/rand.c @ 18442

Revision 18442, 5.7 KB checked in by zacheiss, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18441, which included commits to RCS files with non-trunk default branches.
Line 
1/* apps/rand.c */
2/* ====================================================================
3 * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in
14 *    the documentation and/or other materials provided with the
15 *    distribution.
16 *
17 * 3. All advertising materials mentioning features or use of this
18 *    software must display the following acknowledgment:
19 *    "This product includes software developed by the OpenSSL Project
20 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21 *
22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23 *    endorse or promote products derived from this software without
24 *    prior written permission. For written permission, please contact
25 *    openssl-core@openssl.org.
26 *
27 * 5. Products derived from this software may not be called "OpenSSL"
28 *    nor may "OpenSSL" appear in their names without prior written
29 *    permission of the OpenSSL Project.
30 *
31 * 6. Redistributions of any form whatsoever must retain the following
32 *    acknowledgment:
33 *    "This product includes software developed by the OpenSSL Project
34 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35 *
36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47 * OF THE POSSIBILITY OF SUCH DAMAGE.
48 * ====================================================================
49 *
50 * This product includes cryptographic software written by Eric Young
51 * (eay@cryptsoft.com).  This product includes software written by Tim
52 * Hudson (tjh@cryptsoft.com).
53 *
54 */
55
56#include "apps.h"
57
58#include <ctype.h>
59#include <stdio.h>
60#include <string.h>
61
62#include <openssl/bio.h>
63#include <openssl/err.h>
64#include <openssl/rand.h>
65
66#undef PROG
67#define PROG rand_main
68
69/* -out file         - write to file
70 * -rand file:file   - PRNG seed files
71 * -base64           - encode output
72 * num               - write 'num' bytes
73 */
74
75int MAIN(int, char **);
76
77int MAIN(int argc, char **argv)
78        {
79        ENGINE *e = NULL;
80        int i, r, ret = 1;
81        int badopt;
82        char *outfile = NULL;
83        char *inrand = NULL;
84        int base64 = 0;
85        BIO *out = NULL;
86        int num = -1;
87        char *engine=NULL;
88
89        apps_startup();
90
91        if (bio_err == NULL)
92                if ((bio_err = BIO_new(BIO_s_file())) != NULL)
93                        BIO_set_fp(bio_err, stderr, BIO_NOCLOSE|BIO_FP_TEXT);
94
95        if (!load_config(bio_err, NULL))
96                goto err;
97
98        badopt = 0;
99        i = 0;
100        while (!badopt && argv[++i] != NULL)
101                {
102                if (strcmp(argv[i], "-out") == 0)
103                        {
104                        if ((argv[i+1] != NULL) && (outfile == NULL))
105                                outfile = argv[++i];
106                        else
107                                badopt = 1;
108                        }
109                else if (strcmp(argv[i], "-engine") == 0)
110                        {
111                        if ((argv[i+1] != NULL) && (engine == NULL))
112                                engine = argv[++i];
113                        else
114                                badopt = 1;
115                        }
116                else if (strcmp(argv[i], "-rand") == 0)
117                        {
118                        if ((argv[i+1] != NULL) && (inrand == NULL))
119                                inrand = argv[++i];
120                        else
121                                badopt = 1;
122                        }
123                else if (strcmp(argv[i], "-base64") == 0)
124                        {
125                        if (!base64)
126                                base64 = 1;
127                        else
128                                badopt = 1;
129                        }
130                else if (isdigit((unsigned char)argv[i][0]))
131                        {
132                        if (num < 0)
133                                {
134                                r = sscanf(argv[i], "%d", &num);
135                                if (r == 0 || num < 0)
136                                        badopt = 1;
137                                }
138                        else
139                                badopt = 1;
140                        }
141                else
142                        badopt = 1;
143                }
144
145        if (num < 0)
146                badopt = 1;
147       
148        if (badopt)
149                {
150                BIO_printf(bio_err, "Usage: rand [options] num\n");
151                BIO_printf(bio_err, "where options are\n");
152                BIO_printf(bio_err, "-out file             - write to file\n");
153                BIO_printf(bio_err, "-engine e             - use engine e, possibly a hardware device.\n");
154                BIO_printf(bio_err, "-rand file%cfile%c... - seed PRNG from files\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
155                BIO_printf(bio_err, "-base64               - encode output\n");
156                goto err;
157                }
158
159        e = setup_engine(bio_err, engine, 0);
160
161        app_RAND_load_file(NULL, bio_err, (inrand != NULL));
162        if (inrand != NULL)
163                BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
164                        app_RAND_load_files(inrand));
165
166        out = BIO_new(BIO_s_file());
167        if (out == NULL)
168                goto err;
169        if (outfile != NULL)
170                r = BIO_write_filename(out, outfile);
171        else
172                {
173                r = BIO_set_fp(out, stdout, BIO_NOCLOSE | BIO_FP_TEXT);
174#ifdef OPENSSL_SYS_VMS
175                {
176                BIO *tmpbio = BIO_new(BIO_f_linebuffer());
177                out = BIO_push(tmpbio, out);
178                }
179#endif
180                }
181        if (r <= 0)
182                goto err;
183
184        if (base64)
185                {
186                BIO *b64 = BIO_new(BIO_f_base64());
187                if (b64 == NULL)
188                        goto err;
189                out = BIO_push(b64, out);
190                }
191       
192        while (num > 0)
193                {
194                unsigned char buf[4096];
195                int chunk;
196
197                chunk = num;
198                if (chunk > sizeof buf)
199                        chunk = sizeof buf;
200                r = RAND_bytes(buf, chunk);
201                if (r <= 0)
202                        goto err;
203                BIO_write(out, buf, chunk);
204                num -= chunk;
205                }
206        BIO_flush(out);
207
208        app_RAND_write_file(NULL, bio_err);
209        ret = 0;
210       
211err:
212        ERR_print_errors(bio_err);
213        if (out)
214                BIO_free_all(out);
215        apps_shutdown();
216        OPENSSL_EXIT(ret);
217        }
Note: See TracBrowser for help on using the repository browser.