diff options
author | Jack Lloyd <[email protected]> | 2015-12-30 23:35:16 -0500 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2015-12-30 23:35:16 -0500 |
commit | d4915aa4cd9c11879780267413f2980d0014240e (patch) | |
tree | 8663a7cde0ad9f7fc632c6c2f5ce33a733f8ed26 | |
parent | d27416e791c9aed684efe0d6071fe66a43cf7af0 (diff) |
Avoid having Command* objects be created until requested.
Avoids various static init and destruction hassles.
-rw-r--r-- | src/cli/asn1.cpp | 2 | ||||
-rw-r--r-- | src/cli/bench.cpp | 2 | ||||
-rw-r--r-- | src/cli/cc_enc.cpp | 4 | ||||
-rw-r--r-- | src/cli/cli.h | 56 | ||||
-rw-r--r-- | src/cli/compress.cpp | 4 | ||||
-rw-r--r-- | src/cli/main.cpp | 4 | ||||
-rw-r--r-- | src/cli/math.cpp | 6 | ||||
-rw-r--r-- | src/cli/pubkey.cpp | 22 | ||||
-rw-r--r-- | src/cli/tls_client.cpp | 2 | ||||
-rw-r--r-- | src/cli/tls_proxy.cpp | 2 | ||||
-rw-r--r-- | src/cli/tls_server.cpp | 2 | ||||
-rw-r--r-- | src/cli/utils.cpp | 33 | ||||
-rw-r--r-- | src/cli/x509.cpp | 12 | ||||
-rw-r--r-- | src/tests/main.cpp | 4 |
14 files changed, 94 insertions, 61 deletions
diff --git a/src/cli/asn1.cpp b/src/cli/asn1.cpp index 957fa1f24..3af2be97d 100644 --- a/src/cli/asn1.cpp +++ b/src/cli/asn1.cpp @@ -379,7 +379,7 @@ class ASN1_Printer : public Command } }; -BOTAN_REGISTER_COMMAND(ASN1_Printer); +BOTAN_REGISTER_COMMAND("asn1print", ASN1_Printer); } diff --git a/src/cli/bench.cpp b/src/cli/bench.cpp index 0d77ac2ec..82d04b139 100644 --- a/src/cli/bench.cpp +++ b/src/cli/bench.cpp @@ -747,6 +747,6 @@ class Benchmark : public Command }; -BOTAN_REGISTER_COMMAND(Benchmark); +BOTAN_REGISTER_COMMAND("bench", Benchmark); } diff --git a/src/cli/cc_enc.cpp b/src/cli/cc_enc.cpp index 35932b487..2e2f9c12a 100644 --- a/src/cli/cc_enc.cpp +++ b/src/cli/cc_enc.cpp @@ -128,7 +128,7 @@ class CC_Encrypt : public Command } }; -BOTAN_REGISTER_COMMAND(CC_Encrypt); +BOTAN_REGISTER_COMMAND("cc_encrypt", CC_Encrypt); class CC_Decrypt : public Command { @@ -154,7 +154,7 @@ class CC_Decrypt : public Command } }; -BOTAN_REGISTER_COMMAND(CC_Decrypt); +BOTAN_REGISTER_COMMAND("cc_decrypt", CC_Decrypt); } diff --git a/src/cli/cli.h b/src/cli/cli.h index f55316b9d..49167b2ad 100644 --- a/src/cli/cli.h +++ b/src/cli/cli.h @@ -201,7 +201,7 @@ class Command if(flag_set("help")) { output() << help_text() << "\n"; - return 1; + return 2; } if(m_user_args.count("output")) @@ -314,6 +314,7 @@ class Command m_spec_flags.insert("help"); m_spec_opts.insert(std::make_pair("output", "")); m_spec_opts.insert(std::make_pair("error-output", "")); + m_spec_opts.insert(std::make_pair("rng-type", "auto")); } /* @@ -426,6 +427,8 @@ class Command else { std::ifstream in(input_file, std::ios::binary); + if(!in) + throw CLI_IO_Error("reading file", input_file); do_read_file(in, consumer_fn, buf_size); } } @@ -454,10 +457,30 @@ class Command { if(m_rng == nullptr) { - m_rng.reset(new Botan::AutoSeeded_RNG); + const std::string rng_type = get_arg("rng-type"); + + if(rng_type == "system") + { +#if defined(BOTAN_HAS_SYSTEM_RNG) + m_rng.reset(new Botan::System_RNG); +#endif + } + + // TODO --rng-type=drbg + // TODO --drbg-seed=hexstr + + if(rng_type == "auto") + { + m_rng.reset(new Botan::AutoSeeded_RNG); + } + + if(!m_rng) + { + throw CLI_Error_Unsupported("rng", rng_type); + } } - return *m_rng; + return *m_rng.get(); } private: @@ -483,30 +506,33 @@ class Command public: // the registry interface: - static std::map<std::string, std::unique_ptr<Command>>& global_registry() + typedef std::function<Command* ()> cmd_maker_fn; + + static std::map<std::string, cmd_maker_fn>& global_registry() { - static std::map<std::string, std::unique_ptr<Command>> g_cmds; + static std::map<std::string, cmd_maker_fn> g_cmds; return g_cmds; } - static Command* get_cmd(const std::string& name) + static std::unique_ptr<Command> get_cmd(const std::string& name) { auto& reg = Command::global_registry(); + + std::unique_ptr<Command> r; auto i = reg.find(name); - if(i == reg.end()) + if(i != reg.end()) { - return nullptr; + r.reset(i->second()); } - return i->second.get(); + return r; } class Registration { public: - Registration(Command* cmd) + Registration(const std::string& name, cmd_maker_fn maker_fn) { - const std::string name = cmd->cmd_name(); auto& reg = Command::global_registry(); if(reg.count(name) > 0) @@ -514,14 +540,14 @@ class Command throw CLI_Error("Duplicated registration of command " + name); } - Command::global_registry().insert( - std::make_pair(name, std::unique_ptr<Command>(cmd))); + Command::global_registry().insert(std::make_pair(name, maker_fn)); } }; }; -#define BOTAN_REGISTER_COMMAND(CLI_Class) \ - namespace { Botan_CLI::Command::Registration reg_cmd_ ## CLI_Class(new CLI_Class); } +#define BOTAN_REGISTER_COMMAND(name, CLI_Class) \ + namespace { Botan_CLI::Command::Registration \ + reg_cmd_ ## CLI_Class(name, []() -> Botan_CLI::Command* { return new CLI_Class; }); } } diff --git a/src/cli/compress.cpp b/src/cli/compress.cpp index 5d32267ce..1b7d67e57 100644 --- a/src/cli/compress.cpp +++ b/src/cli/compress.cpp @@ -101,7 +101,7 @@ class Compress : public Command } }; -BOTAN_REGISTER_COMMAND(Compress); +BOTAN_REGISTER_COMMAND("compress", Compress); class Decompress : public Command { @@ -149,6 +149,6 @@ class Decompress : public Command } }; -BOTAN_REGISTER_COMMAND(Decompress); +BOTAN_REGISTER_COMMAND("decompress", Decompress); } diff --git a/src/cli/main.cpp b/src/cli/main.cpp index f054e6005..f6bbcc30e 100644 --- a/src/cli/main.cpp +++ b/src/cli/main.cpp @@ -40,13 +40,13 @@ int main(int argc, char* argv[]) const std::string cmd_name = (argc <= 1) ? "help" : argv[1]; - if(cmd_name == "help" || cmd_name == "--help") + if(cmd_name == "help" || cmd_name == "--help" || cmd_name == "-h") { std::cout << main_help(); return 1; } - Botan_CLI::Command* cmd = Botan_CLI::Command::get_cmd(cmd_name); + std::unique_ptr<Botan_CLI::Command> cmd(Botan_CLI::Command::get_cmd(cmd_name)); if(!cmd) { diff --git a/src/cli/math.cpp b/src/cli/math.cpp index 07b809d19..27f3660d1 100644 --- a/src/cli/math.cpp +++ b/src/cli/math.cpp @@ -32,7 +32,7 @@ class Gen_Prime : public Command } }; -BOTAN_REGISTER_COMMAND(Gen_Prime); +BOTAN_REGISTER_COMMAND("gen_prime", Gen_Prime); class Is_Prime : public Command { @@ -49,7 +49,7 @@ class Is_Prime : public Command } }; -BOTAN_REGISTER_COMMAND(Is_Prime); +BOTAN_REGISTER_COMMAND("is_prime", Is_Prime); /* * Factor integers using a combination of trial division by small @@ -175,7 +175,7 @@ class Factor : public Command } }; -BOTAN_REGISTER_COMMAND(Factor); +BOTAN_REGISTER_COMMAND("factor", Factor); } diff --git a/src/cli/pubkey.cpp b/src/cli/pubkey.cpp index fcda6d21e..93a36a9cc 100644 --- a/src/cli/pubkey.cpp +++ b/src/cli/pubkey.cpp @@ -46,9 +46,9 @@ class PK_Keygen : public Command public: PK_Keygen() : Command("keygen --algo=RSA --params= --passphrase= --pbe= --pbe-millis=300 --der-out") {} - std::unique_ptr<Botan::Private_Key> do_keygen(const std::string& algo, - const std::string& params, - Botan::RandomNumberGenerator& rng) + static std::unique_ptr<Botan::Private_Key> do_keygen(const std::string& algo, + const std::string& params, + Botan::RandomNumberGenerator& rng) { typedef std::function<std::unique_ptr<Botan::Private_Key> (std::string)> gen_fn; std::map<std::string, gen_fn> generators; @@ -129,7 +129,7 @@ class PK_Keygen : public Command } else { - write_output(Botan::PKCS8::BER_encode(*key, rng, pass, pbe_millis, pbe)); + write_output(Botan::PKCS8::BER_encode(*key, rng(), pass, pbe_millis, pbe)); } } else @@ -140,13 +140,13 @@ class PK_Keygen : public Command } else { - output() << Botan::PKCS8::PEM_encode(*key, rng, pass, pbe_millis, pbe); + output() << Botan::PKCS8::PEM_encode(*key, rng(), pass, pbe_millis, pbe); } } } }; -BOTAN_REGISTER_COMMAND(PK_Keygen); +BOTAN_REGISTER_COMMAND("keygen", PK_Keygen); namespace { @@ -186,11 +186,11 @@ class PK_Sign : public Command this->read_file(get_arg("file"), [&signer](const uint8_t b[], size_t l) { signer.update(b, l); }); - output() << Botan::base64_encode(signer.signature(rng)) << "\n"; + output() << Botan::base64_encode(signer.signature(rng())) << "\n"; } }; -BOTAN_REGISTER_COMMAND(PK_Sign); +BOTAN_REGISTER_COMMAND("sign", PK_Sign); class PK_Verify : public Command { @@ -219,7 +219,7 @@ class PK_Verify : public Command } }; -BOTAN_REGISTER_COMMAND(PK_Verify); +BOTAN_REGISTER_COMMAND("verify", PK_Verify); #if defined(BOTAN_HAS_DL_GROUP) @@ -249,7 +249,7 @@ class Gen_DL_Group : public Command } }; -BOTAN_REGISTER_COMMAND(Gen_DL_Group); +BOTAN_REGISTER_COMMAND("gen_dl_group", Gen_DL_Group); #endif @@ -310,7 +310,7 @@ class PKCS8_Tool : public Command } }; -BOTAN_REGISTER_COMMAND(PKCS8_Tool); +BOTAN_REGISTER_COMMAND("pkcs8", PKCS8_Tool); } diff --git a/src/cli/tls_client.cpp b/src/cli/tls_client.cpp index 0d584dee0..bf1c3a57c 100644 --- a/src/cli/tls_client.cpp +++ b/src/cli/tls_client.cpp @@ -283,7 +283,7 @@ class TLS_Client : public Command } }; -BOTAN_REGISTER_COMMAND(TLS_Client); +BOTAN_REGISTER_COMMAND("tls_client", TLS_Client); } diff --git a/src/cli/tls_proxy.cpp b/src/cli/tls_proxy.cpp index 1457700cf..83332bb49 100644 --- a/src/cli/tls_proxy.cpp +++ b/src/cli/tls_proxy.cpp @@ -441,7 +441,7 @@ class TLS_Proxy : public Command } }; -BOTAN_REGISTER_COMMAND(TLS_Proxy); +BOTAN_REGISTER_COMMAND("tls_proxy", TLS_Proxy); } diff --git a/src/cli/tls_server.cpp b/src/cli/tls_server.cpp index f83f008f7..ccf8f40ac 100644 --- a/src/cli/tls_server.cpp +++ b/src/cli/tls_server.cpp @@ -236,7 +236,7 @@ class TLS_Server : public Command }; -BOTAN_REGISTER_COMMAND(TLS_Server); +BOTAN_REGISTER_COMMAND("tls_server", TLS_Server); } diff --git a/src/cli/utils.cpp b/src/cli/utils.cpp index ac2d62396..526b59aba 100644 --- a/src/cli/utils.cpp +++ b/src/cli/utils.cpp @@ -72,7 +72,7 @@ class Config_Info : public Command } }; -BOTAN_REGISTER_COMMAND(Config_Info); +BOTAN_REGISTER_COMMAND("config", Config_Info); class Version_Info : public Command { @@ -94,7 +94,7 @@ class Version_Info : public Command } }; -BOTAN_REGISTER_COMMAND(Version_Info); +BOTAN_REGISTER_COMMAND("version", Version_Info); class Print_Cpuid : public Command { @@ -107,7 +107,7 @@ class Print_Cpuid : public Command } }; -BOTAN_REGISTER_COMMAND(Print_Cpuid); +BOTAN_REGISTER_COMMAND("cpuid", Print_Cpuid); class Hash : public Command { @@ -130,14 +130,21 @@ class Hash : public Command for(auto fsname : files) { - auto update_hash = [&](const uint8_t b[], size_t l) { hash_fn->update(b, l); }; - read_file(fsname, update_hash, buf_size); - output() << Botan::hex_encode(hash_fn->final()) << " " << fsname << "\n"; + try + { + auto update_hash = [&](const uint8_t b[], size_t l) { hash_fn->update(b, l); }; + read_file(fsname, update_hash, buf_size); + output() << Botan::hex_encode(hash_fn->final()) << " " << fsname << "\n"; + } + catch(CLI_IO_Error& e) + { + error_output() << e.what() << "\n"; + } } } }; -BOTAN_REGISTER_COMMAND(Hash); +BOTAN_REGISTER_COMMAND("hash", Hash); class RNG : public Command { @@ -164,7 +171,7 @@ class RNG : public Command } }; -BOTAN_REGISTER_COMMAND(RNG); +BOTAN_REGISTER_COMMAND("rng", RNG); #if defined(BOTAN_HAS_HTTP_UTIL) @@ -179,7 +186,7 @@ class HTTP_Get : public Command } }; -BOTAN_REGISTER_COMMAND(HTTP_Get); +BOTAN_REGISTER_COMMAND("http_get", HTTP_Get); #endif // http_util @@ -198,7 +205,7 @@ class Base64_Encode : public Command } }; -BOTAN_REGISTER_COMMAND(Base64_Encode); +BOTAN_REGISTER_COMMAND("base64_enc", Base64_Encode); class Base64_Decode : public Command { @@ -219,7 +226,7 @@ class Base64_Decode : public Command } }; -BOTAN_REGISTER_COMMAND(Base64_Decode); +BOTAN_REGISTER_COMMAND("base64_dec", Base64_Decode); #endif // base64 @@ -239,7 +246,7 @@ class Generate_Bcrypt : public Command } }; -BOTAN_REGISTER_COMMAND(Generate_Bcrypt); +BOTAN_REGISTER_COMMAND("gen_bcrypt", Generate_Bcrypt); class Check_Bcrypt : public Command { @@ -262,7 +269,7 @@ class Check_Bcrypt : public Command } }; -BOTAN_REGISTER_COMMAND(Check_Bcrypt); +BOTAN_REGISTER_COMMAND("check_bcrypt", Check_Bcrypt); #endif // bcrypt diff --git a/src/cli/x509.cpp b/src/cli/x509.cpp index 7cac858a7..886b57259 100644 --- a/src/cli/x509.cpp +++ b/src/cli/x509.cpp @@ -58,7 +58,7 @@ class Sign_Cert : public Command } }; -BOTAN_REGISTER_COMMAND(Sign_Cert); +BOTAN_REGISTER_COMMAND("sign_cert", Sign_Cert); class Cert_Info : public Command { @@ -72,7 +72,7 @@ class Cert_Info : public Command } }; -BOTAN_REGISTER_COMMAND(Cert_Info); +BOTAN_REGISTER_COMMAND("cert_info", Cert_Info); #if defined(BOTAN_HAS_OCSP) class OCSP_Check : public Command @@ -103,7 +103,7 @@ class OCSP_Check : public Command } }; -BOTAN_REGISTER_COMMAND(OCSP_Check); +BOTAN_REGISTER_COMMAND("ocsp_check", OCSP_Check); #endif // OCSP @@ -140,7 +140,7 @@ class Cert_Verify : public Command } }; -BOTAN_REGISTER_COMMAND(Cert_Verify); +BOTAN_REGISTER_COMMAND("cert_verify", Cert_Verify); class Gen_Self_Signed : public Command { @@ -176,7 +176,7 @@ class Gen_Self_Signed : public Command } }; -BOTAN_REGISTER_COMMAND(Gen_Self_Signed); +BOTAN_REGISTER_COMMAND("gen_self_signed", Gen_Self_Signed); class Generate_PKCS10 : public Command { @@ -210,7 +210,7 @@ class Generate_PKCS10 : public Command } }; -BOTAN_REGISTER_COMMAND(Generate_PKCS10); +BOTAN_REGISTER_COMMAND("gen_pkcs10", Generate_PKCS10); } diff --git a/src/tests/main.cpp b/src/tests/main.cpp index 57a525dbd..c15fab438 100644 --- a/src/tests/main.cpp +++ b/src/tests/main.cpp @@ -249,7 +249,7 @@ class Test_Runner : public Botan_CLI::Command }; -BOTAN_REGISTER_COMMAND(Test_Runner); +BOTAN_REGISTER_COMMAND("test", Test_Runner); } @@ -259,7 +259,7 @@ int main(int argc, char* argv[]) BOTAN_VERSION_MINOR, BOTAN_VERSION_PATCH); - Botan_CLI::Command* cmd = Botan_CLI::Command::get_cmd("test"); + std::unique_ptr<Botan_CLI::Command> cmd(Botan_CLI::Command::get_cmd("test")); if(!cmd) { |