diff options
author | Pauli <paul.dale@oracle.com> | 2020-02-25 14:29:30 +1000 |
---|---|---|
committer | Pauli <paul.dale@oracle.com> | 2020-03-07 11:46:48 +1000 |
commit | 6bd4e3f231d74578b97821d981d42583fec5c2f3 (patch) | |
tree | d255cb0db84ccb5bf71fed8e62f4bb310933b5a5 /apps | |
parent | 5e98904c231f5a40c6ce291df85799cca7c8d125 (diff) |
cmdline app: add provider commandline options.
Add a -provider option to allow providers to be loaded. This option can be
specified multiple times.
Add a -provider_path option to allow the path to providers to be specified.
Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/11167)
Diffstat (limited to 'apps')
47 files changed, 369 insertions, 44 deletions
@@ -148,7 +148,7 @@ typedef enum OPTION_choice { OPT_INFILES, OPT_SS_CERT, OPT_SPKAC, OPT_REVOKE, OPT_VALID, OPT_EXTENSIONS, OPT_EXTFILE, OPT_STATUS, OPT_UPDATEDB, OPT_CRLEXTS, OPT_RAND_SERIAL, - OPT_R_ENUM, OPT_SM2ID, OPT_SM2HEXID, + OPT_R_ENUM, OPT_SM2ID, OPT_SM2HEXID, OPT_PROV_ENUM, /* Do not change the order here; see related case statements below */ OPT_CRL_REASON, OPT_CRL_HOLD, OPT_CRL_COMPROMISE, OPT_CRL_CA_COMPROMISE } OPTION_CHOICE; @@ -237,6 +237,7 @@ const OPTIONS ca_options[] = { {"revoke", OPT_REVOKE, '<', "Revoke a cert (given in file)"}, OPT_R_OPTIONS, + OPT_PROV_OPTIONS, OPT_PARAMETERS(), {"certreq", 0, 0, "Certificate requests to be signed (optional)"}, @@ -361,6 +362,10 @@ opthelp: if (!opt_rand(o)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; case OPT_KEY: key = opt_arg(); break; diff --git a/apps/ciphers.c b/apps/ciphers.c index 280a5ab477..9bbc12aeec 100644 --- a/apps/ciphers.c +++ b/apps/ciphers.c @@ -27,7 +27,7 @@ typedef enum OPTION_choice { OPT_PSK, OPT_SRP, OPT_CIPHERSUITES, - OPT_V, OPT_UPPER_V, OPT_S + OPT_V, OPT_UPPER_V, OPT_S, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS ciphers_options[] = { @@ -67,6 +67,7 @@ const OPTIONS ciphers_options[] = { #endif {"ciphersuites", OPT_CIPHERSUITES, 's', "Configure the TLSv1.3 ciphersuites to use"}, + OPT_PROV_OPTIONS, OPT_PARAMETERS(), {"cipher", 0, 0, "Cipher string to decode (optional)"}, @@ -169,6 +170,10 @@ int ciphers_main(int argc, char **argv) case OPT_CIPHERSUITES: ciphersuites = opt_arg(); break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } argv = opt_rest(); diff --git a/apps/cms.c b/apps/cms.c index 9c92e79658..c8c303ea37 100644 --- a/apps/cms.c +++ b/apps/cms.c @@ -83,6 +83,7 @@ typedef enum OPTION_choice { OPT_RR_TO, OPT_AES128_WRAP, OPT_AES192_WRAP, OPT_AES256_WRAP, OPT_3DES_WRAP, OPT_WRAP, OPT_ENGINE, OPT_R_ENUM, + OPT_PROV_ENUM, OPT_V_ENUM, OPT_CIPHER, OPT_ORIGINATOR @@ -220,6 +221,7 @@ const OPTIONS cms_options[] = { OPT_R_OPTIONS, OPT_V_OPTIONS, + OPT_PROV_OPTIONS, OPT_PARAMETERS(), {"cert", 0, 0, "Recipient certs (optional; used only when encrypting)"}, @@ -621,6 +623,10 @@ int cms_main(int argc, char **argv) if (!opt_rand(o)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; case OPT_3DES_WRAP: # ifndef OPENSSL_NO_DES wrap_cipher = EVP_des_ede3_wrap(); diff --git a/apps/crl.c b/apps/crl.c index 14410f3512..5e0a517a1b 100644 --- a/apps/crl.c +++ b/apps/crl.c @@ -24,7 +24,7 @@ typedef enum OPTION_choice { OPT_ISSUER, OPT_LASTUPDATE, OPT_NEXTUPDATE, OPT_FINGERPRINT, OPT_CRLNUMBER, OPT_BADSIG, OPT_GENDELTA, OPT_CAPATH, OPT_CAFILE, OPT_CASTORE, OPT_NOCAPATH, OPT_NOCAFILE, OPT_NOCASTORE, OPT_VERIFY, OPT_TEXT, OPT_HASH, - OPT_HASH_OLD, OPT_NOOUT, OPT_NAMEOPT, OPT_MD + OPT_HASH_OLD, OPT_NOOUT, OPT_NAMEOPT, OPT_MD, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS crl_options[] = { @@ -69,6 +69,7 @@ const OPTIONS crl_options[] = { "Do not load certificates from the default certificates directory"}, {"no-CAstore", OPT_NOCASTORE, '-', "Do not load certificates from the default certificates store"}, + OPT_PROV_OPTIONS, {NULL} }; @@ -193,6 +194,11 @@ int crl_main(int argc, char **argv) case OPT_MD: if (!opt_md(opt_unknown(), &digest)) goto opthelp; + break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } argc = opt_num_rest(); diff --git a/apps/crl2p7.c b/apps/crl2p7.c index ffbee4cbff..53bc88f750 100644 --- a/apps/crl2p7.c +++ b/apps/crl2p7.c @@ -23,7 +23,8 @@ static int add_certs_from_file(STACK_OF(X509) *stack, char *certfile); typedef enum OPTION_choice { OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_NOCRL, OPT_CERTFILE + OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_NOCRL, OPT_CERTFILE, + OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS crl2pkcs7_options[] = { @@ -40,6 +41,8 @@ const OPTIONS crl2pkcs7_options[] = { OPT_SECTION("Output"), {"out", OPT_OUT, '>', "Output file"}, {"outform", OPT_OUTFORM, 'F', "Output format - DER or PEM"}, + + OPT_PROV_OPTIONS, {NULL} }; @@ -93,6 +96,10 @@ int crl2pkcs7_main(int argc, char **argv) if (!sk_OPENSSL_STRING_push(certflst, opt_arg())) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } argc = opt_num_rest(); diff --git a/apps/dgst.c b/apps/dgst.c index 7a81cb28dc..dcb4c094c7 100644 --- a/apps/dgst.c +++ b/apps/dgst.c @@ -42,7 +42,7 @@ typedef enum OPTION_choice { OPT_HEX, OPT_BINARY, OPT_DEBUG, OPT_FIPS_FINGERPRINT, OPT_HMAC, OPT_MAC, OPT_SIGOPT, OPT_MACOPT, OPT_DIGEST, - OPT_R_ENUM + OPT_R_ENUM, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS dgst_options[] = { @@ -82,6 +82,7 @@ const OPTIONS dgst_options[] = { "Compute HMAC with the key used in OpenSSL-FIPS fingerprint"}, OPT_R_OPTIONS, + OPT_PROV_OPTIONS, OPT_PARAMETERS(), {"file", 0, 0, "Files to digest (optional; default is stdin)"}, @@ -208,6 +209,10 @@ int dgst_main(int argc, char **argv) goto opthelp; md = m; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } argc = opt_num_rest(); diff --git a/apps/dhparam.c b/apps/dhparam.c index acff366158..3f694c5a35 100644 --- a/apps/dhparam.c +++ b/apps/dhparam.c @@ -41,7 +41,7 @@ typedef enum OPTION_choice { OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_ENGINE, OPT_CHECK, OPT_TEXT, OPT_NOOUT, OPT_DSAPARAM, OPT_C, OPT_2, OPT_3, OPT_5, - OPT_R_ENUM + OPT_R_ENUM, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS dhparam_options[] = { @@ -73,6 +73,7 @@ const OPTIONS dhparam_options[] = { {"5", OPT_5, '-', "Generate parameters using 5 as the generator value"}, OPT_R_OPTIONS, + OPT_PROV_OPTIONS, OPT_PARAMETERS(), {"numbits", 0, 0, "Number of bits if generating parameters (optional)"}, @@ -151,6 +152,10 @@ int dhparam_main(int argc, char **argv) if (!opt_rand(o)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } argc = opt_num_rest(); diff --git a/apps/dsa.c b/apps/dsa.c index 9704a34c39..082aa96476 100644 --- a/apps/dsa.c +++ b/apps/dsa.c @@ -35,7 +35,8 @@ typedef enum OPTION_choice { /* Do not change the order here; see case statements below */ OPT_PVK_NONE, OPT_PVK_WEAK, OPT_PVK_STRONG, OPT_NOOUT, OPT_TEXT, OPT_MODULUS, OPT_PUBIN, - OPT_PUBOUT, OPT_CIPHER, OPT_PASSIN, OPT_PASSOUT + OPT_PUBOUT, OPT_CIPHER, OPT_PASSIN, OPT_PASSOUT, + OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS dsa_options[] = { @@ -66,6 +67,7 @@ const OPTIONS dsa_options[] = { {"pubout", OPT_PUBOUT, '-', "Output public key, not private"}, {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, + OPT_PROV_OPTIONS, {NULL} }; @@ -147,6 +149,10 @@ int dsa_main(int argc, char **argv) if (!opt_cipher(opt_unknown(), &enc)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } argc = opt_num_rest(); diff --git a/apps/dsaparam.c b/apps/dsaparam.c index eebffa0ee5..04e09e7950 100644 --- a/apps/dsaparam.c +++ b/apps/dsaparam.c @@ -36,7 +36,7 @@ typedef enum OPTION_choice { OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_TEXT, OPT_C, OPT_NOOUT, OPT_GENKEY, OPT_ENGINE, OPT_VERBOSE, - OPT_R_ENUM + OPT_R_ENUM, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS dsaparam_options[] = { @@ -62,6 +62,7 @@ const OPTIONS dsaparam_options[] = { {"genkey", OPT_GENKEY, '-', "Generate a DSA key"}, OPT_R_OPTIONS, + OPT_PROV_OPTIONS, OPT_PARAMETERS(), {"numbits", 0, 0, "Number of bits if generating parameters (optional)"}, @@ -122,6 +123,10 @@ int dsaparam_main(int argc, char **argv) if (!opt_rand(o)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; case OPT_NOOUT: noout = 1; break; @@ -40,7 +40,7 @@ typedef enum OPTION_choice { OPT_INFORM, OPT_OUTFORM, OPT_ENGINE, OPT_IN, OPT_OUT, OPT_NOOUT, OPT_TEXT, OPT_PARAM_OUT, OPT_PUBIN, OPT_PUBOUT, OPT_PASSIN, OPT_PASSOUT, OPT_PARAM_ENC, OPT_CONV_FORM, OPT_CIPHER, - OPT_NO_PUBLIC, OPT_CHECK + OPT_NO_PUBLIC, OPT_CHECK, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS ec_options[] = { @@ -70,6 +70,8 @@ const OPTIONS ec_options[] = { {"pubout", OPT_PUBOUT, '-', "Output public key, not private"}, {"no_public", OPT_NO_PUBLIC, '-', "exclude public key from private key"}, {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, + + OPT_PROV_OPTIONS, {NULL} }; @@ -161,6 +163,10 @@ int ec_main(int argc, char **argv) case OPT_CHECK: check = 1; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } argc = opt_num_rest(); diff --git a/apps/ecparam.c b/apps/ecparam.c index 307eb1f37e..ed4f4f1fd8 100644 --- a/apps/ecparam.c +++ b/apps/ecparam.c @@ -31,7 +31,7 @@ typedef enum OPTION_choice { OPT_INFORM, OPT_OUTFORM, OPT_IN, OPT_OUT, OPT_TEXT, OPT_C, OPT_CHECK, OPT_LIST_CURVES, OPT_NO_SEED, OPT_NOOUT, OPT_NAME, OPT_CONV_FORM, OPT_PARAM_ENC, OPT_GENKEY, OPT_ENGINE, OPT_CHECK_NAMED, - OPT_R_ENUM + OPT_R_ENUM, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS ecparam_options[] = { @@ -67,6 +67,7 @@ const OPTIONS ecparam_options[] = { {"conv_form", OPT_CONV_FORM, 's', "Specifies the point conversion form "}, OPT_R_OPTIONS, + OPT_PROV_OPTIONS, {NULL} }; @@ -169,6 +170,10 @@ int ecparam_main(int argc, char **argv) if (!opt_rand(o)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; case OPT_ENGINE: e = setup_engine(opt_arg(), 0); break; diff --git a/apps/enc.c b/apps/enc.c index 2b23564fab..74fd6f8469 100644 --- a/apps/enc.c +++ b/apps/enc.c @@ -45,7 +45,7 @@ typedef enum OPTION_choice { OPT_NOPAD, OPT_SALT, OPT_NOSALT, OPT_DEBUG, OPT_UPPER_P, OPT_UPPER_A, OPT_A, OPT_Z, OPT_BUFSIZE, OPT_K, OPT_KFILE, OPT_UPPER_K, OPT_NONE, OPT_UPPER_S, OPT_IV, OPT_MD, OPT_ITER, OPT_PBKDF2, OPT_CIPHER, - OPT_R_ENUM + OPT_R_ENUM, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS enc_options[] = { @@ -97,6 +97,7 @@ const OPTIONS enc_options[] = { {"", OPT_CIPHER, '-', "Any supported cipher"}, OPT_R_OPTIONS, + OPT_PROV_OPTIONS, {NULL} }; @@ -288,6 +289,10 @@ int enc_main(int argc, char **argv) if (!opt_rand(o)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } if (opt_num_rest() != 0) { diff --git a/apps/gendsa.c b/apps/gendsa.c index a64ac16a97..cf24416bd7 100644 --- a/apps/gendsa.c +++ b/apps/gendsa.c @@ -31,7 +31,7 @@ NON_EMPTY_TRANSLATION_UNIT typedef enum OPTION_choice { OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_OUT, OPT_PASSOUT, OPT_ENGINE, OPT_CIPHER, OPT_VERBOSE, - OPT_R_ENUM + OPT_R_ENUM, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS gendsa_options[] = { @@ -47,6 +47,7 @@ const OPTIONS gendsa_options[] = { {"out", OPT_OUT, '>', "Output the key to the specified file"}, {"passout", OPT_PASSOUT, 's', "Output file pass phrase source"}, OPT_R_OPTIONS, + OPT_PROV_OPTIONS, {"", OPT_CIPHER, '-', "Encrypt the output with any supported cipher"}, {"verbose", OPT_VERBOSE, '-', "Verbose output"}, @@ -92,6 +93,10 @@ int gendsa_main(int argc, char **argv) if (!opt_rand(o)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; case OPT_CIPHER: if (!opt_cipher(opt_unknown(), &enc)) goto end; diff --git a/apps/genpkey.c b/apps/genpkey.c index 3ae508c1c8..ef2979dd55 100644 --- a/apps/genpkey.c +++ b/apps/genpkey.c @@ -24,7 +24,8 @@ static int genpkey_cb(EVP_PKEY_CTX *ctx); typedef enum OPTION_choice { OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_ENGINE, OPT_OUTFORM, OPT_OUT, OPT_PASS, OPT_PARAMFILE, - OPT_ALGORITHM, OPT_PKEYOPT, OPT_GENPARAM, OPT_TEXT, OPT_CIPHER + OPT_ALGORITHM, OPT_PKEYOPT, OPT_GENPARAM, OPT_TEXT, OPT_CIPHER, + OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS genpkey_options[] = { @@ -46,6 +47,8 @@ const OPTIONS genpkey_options[] = { {"text", OPT_TEXT, '-', "Print the in text"}, {"", OPT_CIPHER, '-', "Cipher to use to encrypt the key"}, + OPT_PROV_OPTIONS, + /* This is deliberately last. */ {OPT_HELP_STR, 1, 1, "Order of options may be important! See the documentation.\n"}, @@ -131,6 +134,11 @@ int genpkey_main(int argc, char **argv) BIO_printf(bio_err, "%s: cipher mode not supported\n", prog); goto end; } + break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; } } argc = opt_num_rest(); diff --git a/apps/genrsa.c b/apps/genrsa.c index c45fe19b12..3f76d9bada 100644 --- a/apps/genrsa.c +++ b/apps/genrsa.c @@ -41,7 +41,7 @@ typedef enum OPTION_choice { OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, OPT_3, OPT_F4, OPT_ENGINE, OPT_OUT, OPT_PASSOUT, OPT_CIPHER, OPT_PRIMES, OPT_VERBOSE, - OPT_R_ENUM + OPT_R_ENUM, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS genrsa_options[] = { @@ -66,6 +66,7 @@ const OPTIONS genrsa_options[] = { {"", OPT_CIPHER, '-', "Encrypt the output with any supported cipher"}, OPT_R_OPTIONS, + OPT_PROV_OPTIONS, OPT_PARAMETERS(), {"numbits", 0, 0, "Size of key in bits"}, @@ -121,6 +122,10 @@ opthelp: if (!opt_rand(o)) goto end; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto end; + break; case OPT_PASSOUT: passoutarg = opt_arg(); break; diff --git a/apps/include/opt.h b/apps/include/opt.h index ac2c236024..b4257cca7d 100644 --- a/apps/include/opt.h +++ b/apps/include/opt.h @@ -266,6 +266,24 @@ case OPT_R_RAND: case OPT_R_WRITERAND /* + * Provider options. + */ +# define OPT_PROV_ENUM \ + OPT_PROV__FIRST=1600, \ + OPT_PROV_PROVIDER, OPT_PROV_PROVIDER_PATH, \ + OPT_PROV__LAST + +# define OPT_PROV_OPTIONS \ + OPT_SECTION("Provider"), \ + { "provider", OPT_PROV_PROVIDER, 's', "Provder to load (can be specified multiple times)" }, \ + { "provider_path", OPT_PROV_PROVIDER_PATH, 's', "Provider load path" } + +# define OPT_PROV_CASES \ + OPT_PROV__FIRST: case OPT_PROV__LAST: break; \ + case OPT_PROV_PROVIDER: \ + case OPT_PROV_PROVIDER_PATH + +/* * Option parsing. */ extern const char OPT_HELP_STR[]; @@ -348,6 +366,7 @@ char **opt_rest(void); int opt_num_rest(void); int opt_verify(int i, X509_VERIFY_PARAM *vpm); int opt_rand(int i); +int opt_provider(int i); void opt_help(const OPTIONS * list); void opt_print(const OPTIONS * opt, int doingparams, int width); int opt_format_error(const char *s, unsigned long flags); diff --git a/apps/kdf.c b/apps/kdf.c index 82818f1ff3..0162ac899a 100644 --- a/apps/kdf.c +++ b/apps/kdf.c @@ -19,7 +19,8 @@ typedef enum OPTION_choice { OPT_ERR = -1, OPT_EOF = 0, OPT_HELP, - OPT_KDFOPT, OPT_BIN, OPT_KEYLEN, OPT_OUT + OPT_KDFOPT, OPT_BIN, OPT_KEYLEN, OPT_OUT, + OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS kdf_options[] = { @@ -36,6 +37,8 @@ const OPTIONS kdf_options[] = { {"binary", OPT_BIN, '-', "Output in binary format (default is hexadecimal)"}, + OPT_PROV_OPTIONS, + OPT_PARAMETERS(), {"kdf_name", 0, 0, "Name of the KDF algorithm"}, {NULL} @@ -80,6 +83,10 @@ opthelp: if (opts == NULL || !sk_OPENSSL_STRING_push(opts, opt_arg())) goto opthelp; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + goto err; + break; } } argc = opt_num_rest(); diff --git a/apps/lib/app_provider.c b/apps/lib/app_provider.c new file mode 100644 index 0000000000..ac01e8826b --- /dev/null +++ b/apps/lib/app_provider.c @@ -0,0 +1,51 @@ +/* + * Copyright 2020 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "apps.h" +#include <openssl/err.h> +#include <openssl/provider.h> + +/* + * See comments in opt_verify for explanation of this. + */ +enum prov_range { OPT_PROV_ENUM }; + +static int opt_provider_load(const char *provider) +{ + OSSL_PROVIDER *prov; + + prov = OSSL_PROVIDER_load(NULL, provider); + if (prov == NULL) { + opt_printf_stderr("%s: unable to load provider %s\n", + opt_getprog(), provider); + return 0; + } + return 1; +} + +static int opt_provider_path(const char *path) +{ + if (path != NULL && *path == '\0') + path = NULL; + return OSSL_PROVIDER_set_default_search_path(NULL, path); +} + +int opt_provider(int opt) +{ + switch ((enum prov_range)opt) { + case OPT_PROV__FIRST: + case OPT_PROV__LAST: + return 1; + case OPT_PROV_PROVIDER: + return opt_provider_load(opt_arg()); + case OPT_PROV_PROVIDER_PATH: + return opt_provider_path(opt_arg()); + } + return 0; +} diff --git a/apps/lib/build.info b/apps/lib/build.info index 3f68a2ed35..a7be58b101 100644 --- a/apps/lib/build.info +++ b/apps/lib/build.info @@ -9,7 +9,7 @@ ENDIF # Source for libapps $LIBAPPSSRC=apps.c apps_ui.c opt.c fmt.c s_cb.c s_socket.c app_rand.c \ - columns.c app_params.c names.c + columns.c app_params.c names.c app_provider.c IF[{- !$disabled{apps} -}] LIBS{noinst}=../libapps.a diff --git a/apps/list.c b/apps/list.c index e8bb8533bb..28fd5c800e 100644 --- a/apps/list.c +++ b/apps/list.c @@ -617,7 +617,8 @@ typedef enum HELPLIST_CHOICE { OPT_COMMANDS, OPT_DIGEST_COMMANDS, OPT_MAC_ALGORITHMS, OPT_OPTIONS, OPT_DIGEST_ALGORITHMS, OPT_CIPHER_COMMANDS, OPT_CIPHER_ALGORITHMS, OPT_PK_ALGORITHMS, OPT_PK_METHOD, OPT_ENGINES, OPT_DISABLED, - OPT_KDF_ALGORITHMS, OPT_MISSING_HELP, OPT_OBJECTS + OPT_KDF_ALGORITHMS, OPT_MISSING_HELP, OPT_OBJECTS, + OPT_PROV_ENUM } HELPLIST_CHOICE; const OPTIONS list_options[] = { @@ -655,6 +656,8 @@ const OPTIONS list_options[] = { "List options for specified command"}, {"objects", OPT_OBJECTS, '-', "List built in objects (OID<->name mappings)"}, + + OPT_PROV_OPTIONS, {NULL} }; @@ -741,6 +744,10 @@ opthelp: case OPT_VERBOSE: verbose = 1; break; + case OPT_PROV_CASES: + if (!opt_provider(o)) + return 1; + break; } done = 1; } |