tool: add rand. The rand subcommand outputs entropy to stdout. Change-Id: I95c2769a1784a8dd4c21efc15009080006d51349 Reviewed-on: https://boringssl-review.googlesource.com/4325 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt index d542f26..67f59a7 100644 --- a/tool/CMakeLists.txt +++ b/tool/CMakeLists.txt
@@ -8,6 +8,7 @@ const.cc digest.cc pkcs12.cc + rand.cc server.cc speed.cc tool.cc
diff --git a/tool/rand.cc b/tool/rand.cc new file mode 100644 index 0000000..ea97bfa --- /dev/null +++ b/tool/rand.cc
@@ -0,0 +1,94 @@ +/* Copyright (c) 2015, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#include <string> +#include <vector> + +#include <stdint.h> + +#include <openssl/rand.h> + +#include "internal.h" + + +static const struct argument kArguments[] = { + { + "-hex", kBooleanArgument, + "Hex encoded output." + }, + { + "", kOptionalArgument, "", + }, +}; + +bool Rand(const std::vector<std::string> &args) { + bool forever = true, hex = false; + size_t len = 0; + + if (!args.empty()) { + std::vector<std::string> args_copy(args); + const std::string &last_arg = args.back(); + + if (last_arg.size() > 0 && last_arg[0] != '-') { + char *endptr; + unsigned long long num = strtoull(last_arg.c_str(), &endptr, 10); + if (*endptr == 0) { + len = num; + forever = false; + args_copy.pop_back(); + } + } + + std::map<std::string, std::string> args_map; + if (!ParseKeyValueArguments(&args_map, args_copy, kArguments)) { + PrintUsage(kArguments); + return false; + } + + hex = args_map.count("-hex") > 0; + } + + uint8_t buf[4096]; + uint8_t hex_buf[8192]; + + size_t done = 0; + while (forever || done < len) { + size_t todo = sizeof(buf); + if (!forever && todo > len - done) { + todo = len - done; + } + RAND_bytes(buf, todo); + if (hex) { + static const char hextable[] = "0123456789abdef"; + for (unsigned i = 0; i < todo; i++) { + hex_buf[i*2] = hextable[buf[i] >> 4]; + hex_buf[i*2 + 1] = hextable[buf[i] & 0xf]; + } + if (fwrite(hex_buf, todo*2, 1, stdout) != 1) { + return false; + } + } else { + if (fwrite(buf, todo, 1, stdout) != 1) { + return false; + } + } + done += todo; + } + + if (hex && fwrite("\n", 1, 1, stdout) != 1) { + return false; + } + + return true; +}
diff --git a/tool/tool.cc b/tool/tool.cc index 36e3de9..4bd7d1a 100644 --- a/tool/tool.cc +++ b/tool/tool.cc
@@ -36,6 +36,7 @@ bool SHA512Sum(const std::vector<std::string> &args); bool DoPKCS12(const std::vector<std::string> &args); bool Speed(const std::vector<std::string> &args); +bool Rand(const std::vector<std::string> &args); typedef bool (*tool_func_t)(const std::vector<std::string> &args); @@ -57,6 +58,7 @@ { "sha256sum", SHA256Sum }, { "sha384sum", SHA384Sum }, { "sha512sum", SHA512Sum }, + { "rand", Rand }, { "", nullptr }, };