]>
git.ipfire.org Git - thirdparty/openssl.git/blob - apps/rand.c
89a23a293a93c5ee7f0d746af8f73a7a6cba25c7
2 * Copyright 1998-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
16 #include <openssl/bio.h>
17 #include <openssl/err.h>
18 #include <openssl/rand.h>
20 typedef enum OPTION_choice
{
21 OPT_ERR
= -1, OPT_EOF
= 0, OPT_HELP
,
22 OPT_OUT
, OPT_ENGINE
, OPT_RAND
, OPT_BASE64
, OPT_HEX
25 OPTIONS rand_options
[] = {
26 {OPT_HELP_STR
, 1, '-', "Usage: %s [flags] num\n"},
27 {OPT_HELP_STR
, 1, '-', "Valid options are:\n"},
28 {"help", OPT_HELP
, '-', "Display this summary"},
29 {"out", OPT_OUT
, '>', "Output file"},
30 {"rand", OPT_RAND
, 's',
31 "Load the file(s) into the random number generator"},
32 {"base64", OPT_BASE64
, '-', "Base64 encode output"},
33 {"hex", OPT_HEX
, '-', "Hex encode output"},
34 #ifndef OPENSSL_NO_ENGINE
35 {"engine", OPT_ENGINE
, 's', "Use engine, possibly a hardware device"},
40 int rand_main(int argc
, char **argv
)
43 char *inrand
= NULL
, *outfile
= NULL
, *prog
;
45 int format
= FORMAT_BINARY
, i
, num
= -1, r
, ret
= 1;
47 prog
= opt_init(argc
, argv
, rand_options
);
48 while ((o
= opt_next()) != OPT_EOF
) {
53 BIO_printf(bio_err
, "%s: Use -help for summary.\n", prog
);
56 opt_help(rand_options
);
63 (void)setup_engine(opt_arg(), 0);
69 format
= FORMAT_BASE64
;
76 argc
= opt_num_rest();
79 if (argc
!= 1 || !opt_int(argv
[0], &num
) || num
< 0)
82 app_RAND_load_file(NULL
, (inrand
!= NULL
));
84 BIO_printf(bio_err
, "%ld semi-random bytes loaded\n",
85 app_RAND_load_files(inrand
));
87 out
= bio_open_default(outfile
, 'w', format
);
91 if (format
== FORMAT_BASE64
) {
92 BIO
*b64
= BIO_new(BIO_f_base64());
95 out
= BIO_push(b64
, out
);
99 unsigned char buf
[4096];
103 if (chunk
> (int)sizeof(buf
))
105 r
= RAND_bytes(buf
, chunk
);
108 if (format
!= FORMAT_TEXT
) /* hex */
109 BIO_write(out
, buf
, chunk
);
111 for (i
= 0; i
< chunk
; i
++)
112 BIO_printf(out
, "%02x", buf
[i
]);
116 if (format
== FORMAT_TEXT
)
118 (void)BIO_flush(out
);
120 app_RAND_write_file(NULL
);