diff options
-rw-r--r-- | src/cli/asn1.cpp | 10 | ||||
-rw-r--r-- | src/cli/cc_enc.cpp | 20 | ||||
-rw-r--r-- | src/cli/cli.h | 13 | ||||
-rw-r--r-- | src/cli/compress.cpp | 20 | ||||
-rw-r--r-- | src/cli/encryption.cpp | 10 | ||||
-rw-r--r-- | src/cli/math.cpp | 40 | ||||
-rw-r--r-- | src/cli/psk.cpp | 20 | ||||
-rw-r--r-- | src/cli/pubkey.cpp | 80 | ||||
-rw-r--r-- | src/cli/speed.cpp | 10 | ||||
-rw-r--r-- | src/cli/timing_tests.cpp | 10 | ||||
-rw-r--r-- | src/cli/tls_client.cpp | 10 | ||||
-rw-r--r-- | src/cli/tls_http_server.cpp | 10 | ||||
-rw-r--r-- | src/cli/tls_proxy.cpp | 10 | ||||
-rw-r--r-- | src/cli/tls_server.cpp | 10 | ||||
-rw-r--r-- | src/cli/tls_utils.cpp | 20 | ||||
-rw-r--r-- | src/cli/utils.cpp | 202 | ||||
-rw-r--r-- | src/cli/x509.cpp | 60 |
17 files changed, 542 insertions, 13 deletions
diff --git a/src/cli/asn1.cpp b/src/cli/asn1.cpp index 938871253..3034eda35 100644 --- a/src/cli/asn1.cpp +++ b/src/cli/asn1.cpp @@ -21,6 +21,16 @@ class ASN1_Printer final : public Command public: ASN1_Printer() : Command("asn1print --pem file") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Decode and print file with ASN.1 Basic Encoding Rules (BER)"; + } + void go() override { const std::string input = get_arg("file"); diff --git a/src/cli/cc_enc.cpp b/src/cli/cc_enc.cpp index ec160c3ce..509b99601 100644 --- a/src/cli/cc_enc.cpp +++ b/src/cli/cc_enc.cpp @@ -119,6 +119,16 @@ class CC_Encrypt final : public Command public: CC_Encrypt() : Command("cc_encrypt CC passphrase --tweak=") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Encrypt the passed valid credit card number using FPE encryption"; + } + void go() override { const uint64_t cc_number = std::stoull(get_arg("CC")); @@ -144,6 +154,16 @@ class CC_Decrypt final : public Command public: CC_Decrypt() : Command("cc_decrypt CC passphrase --tweak=") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Decrypt the passed valid ciphertext credit card number using FPE decryption"; + } + void go() override { const uint64_t cc_number = std::stoull(get_arg("CC")); diff --git a/src/cli/cli.h b/src/cli/cli.h index 118d61cb6..7ba54d370 100644 --- a/src/cli/cli.h +++ b/src/cli/cli.h @@ -86,6 +86,10 @@ class Command int run(const std::vector<std::string>& params); + virtual std::string group() const = 0; + + virtual std::string description() const = 0; + virtual std::string help_text() const; const std::string& cmd_spec() const @@ -98,7 +102,7 @@ class Command protected: /* - * The actual functionality of the cli command implemented in subclas. + * The actual functionality of the cli command implemented in subclass. * The return value from main will be zero. */ virtual void go() = 0; @@ -156,13 +160,12 @@ class Command Botan::RandomNumberGenerator& rng(); - private: - void parse_spec(); - typedef std::function<Command* ()> cmd_maker_fn; - static std::map<std::string, cmd_maker_fn>& global_registry(); + private: + void parse_spec(); + // set in constructor std::string m_spec; diff --git a/src/cli/compress.cpp b/src/cli/compress.cpp index e9cd02290..3104607fc 100644 --- a/src/cli/compress.cpp +++ b/src/cli/compress.cpp @@ -39,6 +39,16 @@ class Compress final : public Command return input_fsname + "." + suffix_info->second; } + std::string group() const override + { + return "compression"; + } + + std::string description() const override + { + return "Compress a given file"; + } + void go() override { const std::string comp_type = get_arg("type"); @@ -112,6 +122,16 @@ class Decompress final : public Command suffix = in_file.substr(last_dot + 1, std::string::npos); } + std::string group() const override + { + return "compression"; + } + + std::string description() const override + { + return "Decompress a given compressed archive"; + } + void go() override { const size_t buf_size = get_arg_sz("buf-size"); diff --git a/src/cli/encryption.cpp b/src/cli/encryption.cpp index c041f78ee..533b3d9fb 100644 --- a/src/cli/encryption.cpp +++ b/src/cli/encryption.cpp @@ -75,6 +75,16 @@ class Encryption final : public Command public: Encryption() : Command("encryption --buf-size=4096 --decrypt --mode= --key= --iv= --ad=") {} + std::string group() const override + { + return "encryption"; + } + + std::string description() const override + { + return "Encrypt or decrypt a given file"; + } + void go() override { std::string mode = get_arg_or("mode", ""); diff --git a/src/cli/math.cpp b/src/cli/math.cpp index f01d9a1bd..2f3339898 100644 --- a/src/cli/math.cpp +++ b/src/cli/math.cpp @@ -19,6 +19,16 @@ class Modular_Inverse final : public Command public: Modular_Inverse() : Command("mod_inverse n mod") {} + std::string group() const override + { + return "numtheory"; + } + + std::string description() const override + { + return "Calculates a modular inverse"; + } + void go() override { const Botan::BigInt n(get_arg("n")); @@ -35,6 +45,16 @@ class Gen_Prime final : public Command public: Gen_Prime() : Command("gen_prime --count=1 bits") {} + std::string group() const override + { + return "numtheory"; + } + + std::string description() const override + { + return "Samples one or more primes"; + } + void go() override { const size_t bits = get_arg_sz("bits"); @@ -55,6 +75,16 @@ class Is_Prime final : public Command public: Is_Prime() : Command("is_prime --prob=56 n") {} + std::string group() const override + { + return "numtheory"; + } + + std::string description() const override + { + return "Test if the integer n is composite or prime"; + } + void go() override { Botan::BigInt n(get_arg("n")); @@ -76,6 +106,16 @@ class Factor final : public Command public: Factor() : Command("factor n") {} + std::string group() const override + { + return "numtheory"; + } + + std::string description() const override + { + return "Factor a given integer"; + } + void go() override { Botan::BigInt n(get_arg("n")); diff --git a/src/cli/psk.cpp b/src/cli/psk.cpp index d244acd8d..45a5918d8 100644 --- a/src/cli/psk.cpp +++ b/src/cli/psk.cpp @@ -19,6 +19,11 @@ class PSK_Tool_Base : public Command public: PSK_Tool_Base(const std::string& spec) : Command(spec) {} + std::string group() const override + { + return "psk"; + } + void go() override { const std::string db_filename = get_arg("db"); @@ -39,6 +44,11 @@ class PSK_Tool_Set final : public PSK_Tool_Base public: PSK_Tool_Set() : PSK_Tool_Base("psk_set db db_key name psk") {} + std::string description() const override + { + return "Save a PSK encrypted in the database"; + } + private: void psk_operation(Botan::PSK_Database& db) override { @@ -53,6 +63,11 @@ class PSK_Tool_Get final : public PSK_Tool_Base public: PSK_Tool_Get() : PSK_Tool_Base("psk_get db db_key name") {} + std::string description() const override + { + return "Read a value saved with psk_set"; + } + private: void psk_operation(Botan::PSK_Database& db) override { @@ -67,6 +82,11 @@ class PSK_Tool_List final : public PSK_Tool_Base public: PSK_Tool_List() : PSK_Tool_Base("psk_list db db_key") {} + std::string description() const override + { + return "List all values saved to the database"; + } + private: void psk_operation(Botan::PSK_Database& db) override { diff --git a/src/cli/pubkey.cpp b/src/cli/pubkey.cpp index 4e7439a9a..2c431c403 100644 --- a/src/cli/pubkey.cpp +++ b/src/cli/pubkey.cpp @@ -32,6 +32,16 @@ class PK_Fingerprint final : public Command public: PK_Fingerprint() : Command("fingerprint --algo=SHA-256 *keys") {} + std::string group() const override + { + return "pubkey"; + } + + std::string description() const override + { + return "Calculate a public key fingerprint"; + } + void go() override { const std::string hash_algo = get_arg("algo"); @@ -52,6 +62,16 @@ class PK_Keygen final : public Command public: PK_Keygen() : Command("keygen --algo=RSA --params= --passphrase= --pbe= --pbe-millis=300 --der-out") {} + std::string group() const override + { + return "pubkey"; + } + + std::string description() const override + { + return "Generate a PKCS #8 private key"; + } + void go() override { const std::string algo = get_arg("algo"); @@ -123,6 +143,16 @@ class PK_Sign final : public Command public: PK_Sign() : Command("sign --der-format --passphrase= --hash=SHA-256 --emsa= key file") {} + std::string group() const override + { + return "pubkey"; + } + + std::string description() const override + { + return "Sign arbitrary data"; + } + void go() override { std::unique_ptr<Botan::Private_Key> key( @@ -161,6 +191,16 @@ class PK_Verify final : public Command public: PK_Verify() : Command("verify --der-format --hash=SHA-256 --emsa= pubkey file signature") {} + std::string group() const override + { + return "pubkey"; + } + + std::string description() const override + { + return "Verify the authenticity of the given file with the provided signature"; + } + void go() override { std::unique_ptr<Botan::Public_Key> key(Botan::X509::load_key(get_arg("pubkey"))); @@ -200,6 +240,16 @@ class EC_Group_Info final : public Command public: EC_Group_Info() : Command("ec_group_info --pem name") {} + std::string group() const override + { + return "pubkey"; + } + + std::string description() const override + { + return "Print raw elliptic curve domain parameters of the standarized curve name"; + } + void go() override { Botan::EC_Group group(get_arg("name")); @@ -231,6 +281,16 @@ class DL_Group_Info final : public Command public: DL_Group_Info() : Command("dl_group_info --pem name") {} + std::string group() const override + { + return "pubkey"; + } + + std::string description() const override + { + return "Print raw Diffie-Hellman parameters (p,g) of the standarized DH group name"; + } + void go() override { Botan::DL_Group group(get_arg("name")); @@ -255,6 +315,16 @@ class Gen_DL_Group final : public Command public: Gen_DL_Group() : Command("gen_dl_group --pbits=1024 --qbits=0 --type=subgroup") {} + std::string group() const override + { + return "pubkey"; + } + + std::string description() const override + { + return "Generate ANSI X9.42 encoded Diffie-Hellman group parameters"; + } + void go() override { const size_t pbits = get_arg_sz("pbits"); @@ -287,6 +357,16 @@ class PKCS8_Tool final : public Command public: PKCS8_Tool() : Command("pkcs8 --pass-in= --pub-out --der-out --pass-out= --pbe= --pbe-millis=300 key") {} + std::string group() const override + { + return "pubkey"; + } + + std::string description() const override + { + return "Open a PKCS #8 formatted key"; + } + void go() override { std::unique_ptr<Botan::Private_Key> key; diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index d652b7a6d..b60e26ef1 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -664,6 +664,16 @@ class Speed final : public Command }; } + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Measures the speed of algorithms"; + } + void go() override { std::chrono::milliseconds msec(get_arg_sz("msec")); diff --git a/src/cli/timing_tests.cpp b/src/cli/timing_tests.cpp index d95df026c..86c1572ac 100644 --- a/src/cli/timing_tests.cpp +++ b/src/cli/timing_tests.cpp @@ -346,6 +346,16 @@ class Timing_Test_Command final : public Command : Command("timing_test test_type --test-data-file= --test-data-dir=src/tests/data/timing " "--warmup-runs=1000 --measurement-runs=10000") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Run various timing side channel tests"; + } + void go() override { const std::string test_type = get_arg("test_type"); diff --git a/src/cli/tls_client.cpp b/src/cli/tls_client.cpp index 7a9633fca..53e3926e0 100644 --- a/src/cli/tls_client.cpp +++ b/src/cli/tls_client.cpp @@ -46,6 +46,16 @@ class TLS_Client final : public Command, public Botan::TLS::Callbacks stop_sockets(); } + std::string group() const override + { + return "tls"; + } + + std::string description() const override + { + return "Connect to a host using TLS/DTLS"; + } + void go() override { // TODO client cert auth diff --git a/src/cli/tls_http_server.cpp b/src/cli/tls_http_server.cpp index 9669ee27c..339cd2a67 100644 --- a/src/cli/tls_http_server.cpp +++ b/src/cli/tls_http_server.cpp @@ -466,6 +466,16 @@ class TLS_HTTP_Server final : public Command "--port=443 --policy= --threads=0 " "--session-db= --session-db-pass=") {} + std::string group() const override + { + return "tls"; + } + + std::string description() const override + { + return "Provides a simple HTTP server"; + } + void go() override { const size_t listen_port = get_arg_sz("port"); diff --git a/src/cli/tls_proxy.cpp b/src/cli/tls_proxy.cpp index 2c5f6889d..d9540d9d3 100644 --- a/src/cli/tls_proxy.cpp +++ b/src/cli/tls_proxy.cpp @@ -411,6 +411,16 @@ class TLS_Proxy final : public Command TLS_Proxy() : Command("tls_proxy listen_port target_host target_port server_cert server_key " "--threads=0 --session-db= --session-db-pass=") {} + std::string group() const override + { + return "tls"; + } + + std::string description() const override + { + return "Proxies requests between a TLS client and a TLS server"; + } + void go() override { const size_t listen_port = get_arg_sz("listen_port"); diff --git a/src/cli/tls_server.cpp b/src/cli/tls_server.cpp index 7127b2020..b9cd0d029 100644 --- a/src/cli/tls_server.cpp +++ b/src/cli/tls_server.cpp @@ -36,6 +36,16 @@ class TLS_Server final : public Command, public Botan::TLS::Callbacks stop_sockets(); } + std::string group() const override + { + return "tls"; + } + + std::string description() const override + { + return "Accept TLS/DTLS connections from TLS/DTLS clients"; + } + void go() override { const std::string server_crt = get_arg("cert"); diff --git a/src/cli/tls_utils.cpp b/src/cli/tls_utils.cpp index 7b2474a69..cc5a8549c 100644 --- a/src/cli/tls_utils.cpp +++ b/src/cli/tls_utils.cpp @@ -88,6 +88,16 @@ class TLS_Ciphersuites final : public Command } } + std::string group() const override + { + return "tls"; + } + + std::string description() const override + { + return "Lists all ciphersuites for a policy and TLS version"; + } + void go() override { const std::string policy_type = get_arg("policy"); @@ -134,6 +144,16 @@ class TLS_Client_Hello_Reader final : public Command TLS_Client_Hello_Reader() : Command("tls_client_hello --hex input") {} + std::string group() const override + { + return "tls"; + } + + std::string description() const override + { + return "Parse a TLS client hello message"; + } + void go() override { const std::string input_file = get_arg("input"); diff --git a/src/cli/utils.cpp b/src/cli/utils.cpp index 91638bfea..47c716ed5 100644 --- a/src/cli/utils.cpp +++ b/src/cli/utils.cpp @@ -12,7 +12,11 @@ #include <botan/cpuid.h> #include <botan/hex.h> #include <botan/parsing.h> +#include <botan/internal/stl_util.h> #include <sstream> +#include <iostream> +#include <iterator> +#include <iomanip> #if defined(BOTAN_HAS_HASH) #include <botan/hash.h> @@ -43,19 +47,71 @@ class Print_Help final : public Command std::string help_text() const override { - std::ostringstream oss; + const std::set<std::string> avail_commands = + Botan::map_keys_as_set(Botan_CLI::Command::global_registry()); - oss << "Usage: botan <cmd> <cmd-options>\n\n"; - oss << "All commands support --verbose --help --output= --error-output= --rng-type= --drbg-seed=\n\n"; - oss << "Available commands:\n"; + const std::map<std::string, std::string> groups_description +#if defined(BOTAN_HAS_AES) && defined(BOTAN_HAS_AEAD_MODES) + { { "encryption", "Encryption" }, +#endif +#if defined(BOTAN_HAS_COMPRESSION) + { "compression", "Compression" }, +#endif + { "hash", "Hash Functions" }, +#if defined(BOTAN_HAS_HMAC) + { "hmac", "HMAC" }, +#endif + { "numtheory", "Number Theory" }, +#if defined(BOTAN_HAS_BCRYPT) + { "passhash", "Password Hashing" }, +#endif +#if defined(BOTAN_HAS_PSK_DB) && defined(BOTAN_HAS_SQLITE3) + { "psk", "PSK Database" }, +#endif + { "pubkey", "Public Key Cryptography" }, +#if defined(BOTAN_HAS_TLS) + { "tls", "TLS" }, +#endif +#if defined(BOTAN_HAS_X509_CERTIFICATES) + { "x509", "X.509" }, +#endif + { "misc", "Miscellaneous" } + }; + + const std::set<std::string> groups = + Botan::map_keys_as_set(groups_description); + + std::ostringstream oss; - for(const auto& cmd_name : Command::registered_cmds()) + oss << "Usage: botan <cmd> <cmd-options>\n"; + oss << "All commands support --verbose --help --output= --error-output= --rng-type= --drbg-seed=\n\n"; + oss << "Available commands:\n\n"; + + for(auto& cmd_group : groups) + { + oss << groups_description.at(cmd_group) << ":\n"; + for(auto& cmd_name : avail_commands) { - std::unique_ptr<Command> cmd = Command::get_cmd(cmd_name); - oss << " " << cmd->cmd_spec() << "\n"; + auto cmd = Botan_CLI::Command::get_cmd(cmd_name); + if(cmd->group() == cmd_group) + { + oss << " " << std::setw(16) << std::left << cmd->cmd_name() << " " << cmd->description() << "\n"; + } } + oss << "\n"; + } + + return oss.str(); + } + + std::string group() const override + { + return ""; + } - return oss.str(); + std::string description() const override + { + return "Prints a help string"; } void go() override @@ -81,6 +137,16 @@ class Config_Info final : public Command " libs: Print libraries\n"; } + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Print the used prefix, cflags, ldflags or libs"; + } + void go() override { const std::string arg = get_arg("info_type"); @@ -117,6 +183,16 @@ class Version_Info final : public Command public: Version_Info() : Command("version --full") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Print version info"; + } + void go() override { if(flag_set("full")) @@ -137,6 +213,16 @@ class Print_Cpuid final : public Command public: Print_Cpuid() : Command("cpuid") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "List available processor flags (aes_ni, SIMD extensions, ...)"; + } + void go() override { output() << "CPUID flags: " << Botan::CPUID::to_string() << "\n"; @@ -152,6 +238,16 @@ class Hash final : public Command public: Hash() : Command("hash --algo=SHA-256 --buf-size=4096 *files") {} + std::string group() const override + { + return "hash"; + } + + std::string description() const override + { + return "Compute the message digest of given file(s)"; + } + void go() override { const std::string hash_algo = get_arg("algo"); @@ -195,6 +291,16 @@ class RNG final : public Command public: RNG() : Command("rng --system --rdrand --auto --entropy --drbg --drbg-seed= *bytes") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Sample random bytes from the specified rng"; + } + void go() override { std::string type = get_arg("rng-type"); @@ -230,6 +336,16 @@ class HTTP_Get final : public Command public: HTTP_Get() : Command("http_get --redirects=1 --timeout=3000 url") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Retrieve resource from the passed http/https url"; + } + void go() override { const std::string url = get_arg("url"); @@ -251,6 +367,16 @@ class Hex_Encode final : public Command public: Hex_Encode() : Command("hex_enc file") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Hex encode a given file"; + } + void go() override { auto hex_enc_f = [&](const uint8_t b[], size_t l) { output() << Botan::hex_encode(b, l); }; @@ -265,6 +391,16 @@ class Hex_Decode final : public Command public: Hex_Decode() : Command("hex_dec file") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Hex decode a given file"; + } + void go() override { auto hex_dec_f = [&](const uint8_t b[], size_t l) @@ -288,6 +424,16 @@ class Base64_Encode final : public Command public: Base64_Encode() : Command("base64_enc file") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Encode given file to Base64"; + } + void go() override { auto onData = [&](const uint8_t b[], size_t l) @@ -305,6 +451,16 @@ class Base64_Decode final : public Command public: Base64_Decode() : Command("base64_dec file") {} + std::string group() const override + { + return "misc"; + } + + std::string description() const override + { + return "Decode Base64 encoded file"; + } + void go() override { auto write_bin = [&](const uint8_t b[], size_t l) @@ -328,6 +484,16 @@ class Generate_Bcrypt final : public Command public: Generate_Bcrypt() : Command("gen_bcrypt --work-factor=12 password") {} + std::string group() const override + { + return "passhash"; + } + + std::string description() const override + { + return "Calculate the bcrypt password digest of a given file"; + } + void go() override { const std::string password = get_arg("password"); @@ -352,6 +518,16 @@ class Check_Bcrypt final : public Command public: Check_Bcrypt() : Command("check_bcrypt password hash") {} + std::string group() const override + { + return "passhash"; + } + + std::string description() const override + { + return "Checks a given bcrypt hash against hash"; + } + void go() override { const std::string password = get_arg("password"); @@ -379,6 +555,16 @@ class HMAC final : public Command public: HMAC() : Command("hmac --hash=SHA-256 --buf-size=4096 key *files") {} + std::string group() const override + { + return "hmac"; + } + + std::string description() const override + { + return "Compute the HMAC tag of given file(s)"; + } + void go() override { const std::string hash_algo = get_arg("hash"); diff --git a/src/cli/x509.cpp b/src/cli/x509.cpp index 0feaad003..ed9eb3d4f 100644 --- a/src/cli/x509.cpp +++ b/src/cli/x509.cpp @@ -31,6 +31,16 @@ class Sign_Cert final : public Command : Command("sign_cert --ca-key-pass= --hash=SHA-256 " "--duration=365 --emsa= ca_cert ca_key pkcs10_req") {} + std::string group() const override + { + return "x509"; + } + + std::string description() const override + { + return "Create a CA-signed X.509 certificate from a PKCS #10 CSR"; + } + void go() override { Botan::X509_Certificate ca_cert(get_arg("ca_cert")); @@ -77,6 +87,16 @@ class Cert_Info final : public Command public: Cert_Info() : Command("cert_info --fingerprint --ber file") {} + std::string group() const override + { + return "x509"; + } + + std::string description() const override + { + return "Parse X.509 certificate and display data fields"; + } + void go() override { Botan::DataSource_Stream in(get_arg("file"), flag_set("ber")); @@ -120,6 +140,16 @@ class OCSP_Check final : public Command public: OCSP_Check() : Command("ocsp_check --timeout=3000 subject issuer") {} + std::string group() const override + { + return "x509"; + } + + std::string description() const override + { + return "Verify an X.509 certificate against the issuers OCSP responder"; + } + void go() override { Botan::X509_Certificate subject(get_arg("subject")); @@ -152,6 +182,16 @@ class Cert_Verify final : public Command public: Cert_Verify() : Command("cert_verify subject *ca_certs") {} + std::string group() const override + { + return "x509"; + } + + std::string description() const override + { + return "Verify if the passed X.509 certificate passes path validation"; + } + void go() override { Botan::X509_Certificate subject_cert(get_arg("subject")); @@ -189,6 +229,16 @@ class Gen_Self_Signed final : public Command : Command("gen_self_signed key CN --country= --dns= " "--organization= --email= --key-pass= --ca --hash=SHA-256 --emsa=") {} + std::string group() const override + { + return "x509"; + } + + std::string description() const override + { + return "Generate a self signed X.509 certificate"; + } + void go() override { std::unique_ptr<Botan::Private_Key> key(Botan::PKCS8::load_key(get_arg("key"), rng(), get_arg("key-pass"))); @@ -227,6 +277,16 @@ class Generate_PKCS10 final : public Command : Command("gen_pkcs10 key CN --country= --organization= " "--email= --key-pass= --hash=SHA-256 --emsa=") {} + std::string group() const override + { + return "x509"; + } + + std::string description() const override + { + return "Generate a PKCS #10 certificate signing request (CSR)"; + } + void go() override { std::unique_ptr<Botan::Private_Key> key(Botan::PKCS8::load_key(get_arg("key"), rng(), get_arg("key-pass"))); |