]>
git.ipfire.org Git - thirdparty/openssl.git/blob - apps/rand.c
2 * Copyright 1998-2021 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (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
17 #include <openssl/bio.h>
18 #include <openssl/err.h>
19 #include <openssl/rand.h>
21 typedef enum OPTION_choice
{
23 OPT_OUT
, OPT_ENGINE
, OPT_BASE64
, OPT_HEX
,
24 OPT_R_ENUM
, OPT_PROV_ENUM
27 const OPTIONS rand_options
[] = {
28 {OPT_HELP_STR
, 1, '-', "Usage: %s [options] num\n"},
30 OPT_SECTION("General"),
31 {"help", OPT_HELP
, '-', "Display this summary"},
32 #ifndef OPENSSL_NO_ENGINE
33 {"engine", OPT_ENGINE
, 's', "Use engine, possibly a hardware device"},
36 OPT_SECTION("Output"),
37 {"out", OPT_OUT
, '>', "Output file"},
38 {"base64", OPT_BASE64
, '-', "Base64 encode output"},
39 {"hex", OPT_HEX
, '-', "Hex encode output"},
45 {"num", 0, 0, "Number of bytes to generate"},
49 int rand_main(int argc
, char **argv
)
53 char *outfile
= NULL
, *prog
;
55 int format
= FORMAT_BINARY
, i
, num
= -1, r
, ret
= 1;
57 prog
= opt_init(argc
, argv
, rand_options
);
58 while ((o
= opt_next()) != OPT_EOF
) {
63 BIO_printf(bio_err
, "%s: Use -help for summary.\n", prog
);
66 opt_help(rand_options
);
73 e
= setup_engine(opt_arg(), 0);
80 format
= FORMAT_BASE64
;
92 /* Optional argument is number of bytes to generate. */
93 argc
= opt_num_rest();
96 if (!opt_int(argv
[0], &num
) || num
<= 0)
98 } else if (argc
!= 0) {
102 if (!app_RAND_load())
105 out
= bio_open_default(outfile
, 'w', format
);
109 if (format
== FORMAT_BASE64
) {
110 BIO
*b64
= BIO_new(BIO_f_base64());
113 out
= BIO_push(b64
, out
);
117 unsigned char buf
[4096];
121 if (chunk
> (int)sizeof(buf
))
123 r
= RAND_bytes(buf
, chunk
);
126 if (format
!= FORMAT_TEXT
) {
127 if (BIO_write(out
, buf
, chunk
) != chunk
)
130 for (i
= 0; i
< chunk
; i
++)
131 if (BIO_printf(out
, "%02x", buf
[i
]) != 2)
136 if (format
== FORMAT_TEXT
)
138 if (BIO_flush(out
) <= 0)
145 ERR_print_errors(bio_err
);