1*b077aed3SPierre Pronchery /* 2*b077aed3SPierre Pronchery * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved. 3*b077aed3SPierre Pronchery * 4*b077aed3SPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use 5*b077aed3SPierre Pronchery * this file except in compliance with the License. You can obtain a copy 6*b077aed3SPierre Pronchery * in the file LICENSE in the source distribution or at 7*b077aed3SPierre Pronchery * https://www.openssl.org/source/license.html 8*b077aed3SPierre Pronchery */ 9*b077aed3SPierre Pronchery 10*b077aed3SPierre Pronchery /* We need to use some deprecated APIs */ 11*b077aed3SPierre Pronchery #define OPENSSL_SUPPRESS_DEPRECATED 12*b077aed3SPierre Pronchery 13*b077aed3SPierre Pronchery #include <string.h> 14*b077aed3SPierre Pronchery #include <openssl/evp.h> 15*b077aed3SPierre Pronchery #include <openssl/err.h> 16*b077aed3SPierre Pronchery #include <openssl/provider.h> 17*b077aed3SPierre Pronchery #include <openssl/safestack.h> 18*b077aed3SPierre Pronchery #include <openssl/kdf.h> 19*b077aed3SPierre Pronchery #include <openssl/encoder.h> 20*b077aed3SPierre Pronchery #include <openssl/decoder.h> 21*b077aed3SPierre Pronchery #include <openssl/store.h> 22*b077aed3SPierre Pronchery #include <openssl/core_names.h> 23*b077aed3SPierre Pronchery #include <openssl/rand.h> 24*b077aed3SPierre Pronchery #include "apps.h" 25*b077aed3SPierre Pronchery #include "app_params.h" 26*b077aed3SPierre Pronchery #include "progs.h" 27*b077aed3SPierre Pronchery #include "opt.h" 28*b077aed3SPierre Pronchery #include "names.h" 29*b077aed3SPierre Pronchery 30*b077aed3SPierre Pronchery static int verbose = 0; 31*b077aed3SPierre Pronchery static const char *select_name = NULL; 32*b077aed3SPierre Pronchery 33*b077aed3SPierre Pronchery /* Checks to see if algorithms are fetchable */ 34*b077aed3SPierre Pronchery #define IS_FETCHABLE(type, TYPE) \ 35*b077aed3SPierre Pronchery static int is_ ## type ## _fetchable(const TYPE *alg) \ 36*b077aed3SPierre Pronchery { \ 37*b077aed3SPierre Pronchery TYPE *impl; \ 38*b077aed3SPierre Pronchery const char *propq = app_get0_propq(); \ 39*b077aed3SPierre Pronchery OSSL_LIB_CTX *libctx = app_get0_libctx(); \ 40*b077aed3SPierre Pronchery const char *name = TYPE ## _get0_name(alg); \ 41*b077aed3SPierre Pronchery \ 42*b077aed3SPierre Pronchery ERR_set_mark(); \ 43*b077aed3SPierre Pronchery impl = TYPE ## _fetch(libctx, name, propq); \ 44*b077aed3SPierre Pronchery ERR_pop_to_mark(); \ 45*b077aed3SPierre Pronchery if (impl == NULL) \ 46*b077aed3SPierre Pronchery return 0; \ 47*b077aed3SPierre Pronchery TYPE ## _free(impl); \ 48*b077aed3SPierre Pronchery return 1; \ 49*b077aed3SPierre Pronchery } 50*b077aed3SPierre Pronchery IS_FETCHABLE(cipher, EVP_CIPHER) 51*b077aed3SPierre Pronchery IS_FETCHABLE(digest, EVP_MD) 52*b077aed3SPierre Pronchery IS_FETCHABLE(mac, EVP_MAC) 53*b077aed3SPierre Pronchery IS_FETCHABLE(kdf, EVP_KDF) 54*b077aed3SPierre Pronchery IS_FETCHABLE(rand, EVP_RAND) 55*b077aed3SPierre Pronchery IS_FETCHABLE(keymgmt, EVP_KEYMGMT) 56*b077aed3SPierre Pronchery IS_FETCHABLE(signature, EVP_SIGNATURE) 57*b077aed3SPierre Pronchery IS_FETCHABLE(kem, EVP_KEM) 58*b077aed3SPierre Pronchery IS_FETCHABLE(asym_cipher, EVP_ASYM_CIPHER) 59*b077aed3SPierre Pronchery IS_FETCHABLE(keyexch, EVP_KEYEXCH) 60*b077aed3SPierre Pronchery IS_FETCHABLE(decoder, OSSL_DECODER) 61*b077aed3SPierre Pronchery IS_FETCHABLE(encoder, OSSL_ENCODER) 62*b077aed3SPierre Pronchery 63*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 64*b077aed3SPierre Pronchery static int include_legacy(void) 65*b077aed3SPierre Pronchery { 66*b077aed3SPierre Pronchery return app_get0_propq() == NULL; 67*b077aed3SPierre Pronchery } 68*b077aed3SPierre Pronchery 69*b077aed3SPierre Pronchery static void legacy_cipher_fn(const EVP_CIPHER *c, 70*b077aed3SPierre Pronchery const char *from, const char *to, void *arg) 71*b077aed3SPierre Pronchery { 72*b077aed3SPierre Pronchery if (select_name != NULL 73*b077aed3SPierre Pronchery && (c == NULL 74*b077aed3SPierre Pronchery || OPENSSL_strcasecmp(select_name, EVP_CIPHER_get0_name(c)) != 0)) 75*b077aed3SPierre Pronchery return; 76*b077aed3SPierre Pronchery if (c != NULL) { 77*b077aed3SPierre Pronchery BIO_printf(arg, " %s\n", EVP_CIPHER_get0_name(c)); 78*b077aed3SPierre Pronchery } else { 79*b077aed3SPierre Pronchery if (from == NULL) 80*b077aed3SPierre Pronchery from = "<undefined>"; 81*b077aed3SPierre Pronchery if (to == NULL) 82*b077aed3SPierre Pronchery to = "<undefined>"; 83*b077aed3SPierre Pronchery BIO_printf(arg, " %s => %s\n", from, to); 84*b077aed3SPierre Pronchery } 85*b077aed3SPierre Pronchery } 86*b077aed3SPierre Pronchery #endif 87*b077aed3SPierre Pronchery 88*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_CIPHER) 89*b077aed3SPierre Pronchery static int cipher_cmp(const EVP_CIPHER * const *a, 90*b077aed3SPierre Pronchery const EVP_CIPHER * const *b) 91*b077aed3SPierre Pronchery { 92*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_CIPHER_get0_provider(*a)), 93*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_CIPHER_get0_provider(*b))); 94*b077aed3SPierre Pronchery } 95*b077aed3SPierre Pronchery 96*b077aed3SPierre Pronchery static void collect_ciphers(EVP_CIPHER *cipher, void *stack) 97*b077aed3SPierre Pronchery { 98*b077aed3SPierre Pronchery STACK_OF(EVP_CIPHER) *cipher_stack = stack; 99*b077aed3SPierre Pronchery 100*b077aed3SPierre Pronchery if (is_cipher_fetchable(cipher) 101*b077aed3SPierre Pronchery && sk_EVP_CIPHER_push(cipher_stack, cipher) > 0) 102*b077aed3SPierre Pronchery EVP_CIPHER_up_ref(cipher); 103*b077aed3SPierre Pronchery } 104*b077aed3SPierre Pronchery 105*b077aed3SPierre Pronchery static void list_ciphers(void) 106*b077aed3SPierre Pronchery { 107*b077aed3SPierre Pronchery STACK_OF(EVP_CIPHER) *ciphers = sk_EVP_CIPHER_new(cipher_cmp); 108*b077aed3SPierre Pronchery int i; 109*b077aed3SPierre Pronchery 110*b077aed3SPierre Pronchery if (ciphers == NULL) { 111*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 112*b077aed3SPierre Pronchery return; 113*b077aed3SPierre Pronchery } 114*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 115*b077aed3SPierre Pronchery if (include_legacy()) { 116*b077aed3SPierre Pronchery BIO_printf(bio_out, "Legacy:\n"); 117*b077aed3SPierre Pronchery EVP_CIPHER_do_all_sorted(legacy_cipher_fn, bio_out); 118*b077aed3SPierre Pronchery } 119*b077aed3SPierre Pronchery #endif 120*b077aed3SPierre Pronchery 121*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided:\n"); 122*b077aed3SPierre Pronchery EVP_CIPHER_do_all_provided(app_get0_libctx(), collect_ciphers, ciphers); 123*b077aed3SPierre Pronchery sk_EVP_CIPHER_sort(ciphers); 124*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_CIPHER_num(ciphers); i++) { 125*b077aed3SPierre Pronchery const EVP_CIPHER *c = sk_EVP_CIPHER_value(ciphers, i); 126*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 127*b077aed3SPierre Pronchery 128*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_CIPHER_is_a(c, select_name)) 129*b077aed3SPierre Pronchery continue; 130*b077aed3SPierre Pronchery 131*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 132*b077aed3SPierre Pronchery if (names != NULL && EVP_CIPHER_names_do_all(c, collect_names, names)) { 133*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 134*b077aed3SPierre Pronchery print_names(bio_out, names); 135*b077aed3SPierre Pronchery 136*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 137*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_CIPHER_get0_provider(c))); 138*b077aed3SPierre Pronchery 139*b077aed3SPierre Pronchery if (verbose) { 140*b077aed3SPierre Pronchery const char *desc = EVP_CIPHER_get0_description(c); 141*b077aed3SPierre Pronchery 142*b077aed3SPierre Pronchery if (desc != NULL) 143*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 144*b077aed3SPierre Pronchery print_param_types("retrievable algorithm parameters", 145*b077aed3SPierre Pronchery EVP_CIPHER_gettable_params(c), 4); 146*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 147*b077aed3SPierre Pronchery EVP_CIPHER_gettable_ctx_params(c), 4); 148*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 149*b077aed3SPierre Pronchery EVP_CIPHER_settable_ctx_params(c), 4); 150*b077aed3SPierre Pronchery } 151*b077aed3SPierre Pronchery } 152*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 153*b077aed3SPierre Pronchery } 154*b077aed3SPierre Pronchery sk_EVP_CIPHER_pop_free(ciphers, EVP_CIPHER_free); 155*b077aed3SPierre Pronchery } 156*b077aed3SPierre Pronchery 157*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 158*b077aed3SPierre Pronchery static void legacy_md_fn(const EVP_MD *m, 159*b077aed3SPierre Pronchery const char *from, const char *to, void *arg) 160*b077aed3SPierre Pronchery { 161*b077aed3SPierre Pronchery if (m != NULL) { 162*b077aed3SPierre Pronchery BIO_printf(arg, " %s\n", EVP_MD_get0_name(m)); 163*b077aed3SPierre Pronchery } else { 164*b077aed3SPierre Pronchery if (from == NULL) 165*b077aed3SPierre Pronchery from = "<undefined>"; 166*b077aed3SPierre Pronchery if (to == NULL) 167*b077aed3SPierre Pronchery to = "<undefined>"; 168*b077aed3SPierre Pronchery BIO_printf((BIO *)arg, " %s => %s\n", from, to); 169*b077aed3SPierre Pronchery } 170*b077aed3SPierre Pronchery } 171*b077aed3SPierre Pronchery #endif 172*b077aed3SPierre Pronchery 173*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_MD) 174*b077aed3SPierre Pronchery static int md_cmp(const EVP_MD * const *a, const EVP_MD * const *b) 175*b077aed3SPierre Pronchery { 176*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_MD_get0_provider(*a)), 177*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_MD_get0_provider(*b))); 178*b077aed3SPierre Pronchery } 179*b077aed3SPierre Pronchery 180*b077aed3SPierre Pronchery static void collect_digests(EVP_MD *digest, void *stack) 181*b077aed3SPierre Pronchery { 182*b077aed3SPierre Pronchery STACK_OF(EVP_MD) *digest_stack = stack; 183*b077aed3SPierre Pronchery 184*b077aed3SPierre Pronchery if (is_digest_fetchable(digest) 185*b077aed3SPierre Pronchery && sk_EVP_MD_push(digest_stack, digest) > 0) 186*b077aed3SPierre Pronchery EVP_MD_up_ref(digest); 187*b077aed3SPierre Pronchery } 188*b077aed3SPierre Pronchery 189*b077aed3SPierre Pronchery static void list_digests(void) 190*b077aed3SPierre Pronchery { 191*b077aed3SPierre Pronchery STACK_OF(EVP_MD) *digests = sk_EVP_MD_new(md_cmp); 192*b077aed3SPierre Pronchery int i; 193*b077aed3SPierre Pronchery 194*b077aed3SPierre Pronchery if (digests == NULL) { 195*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 196*b077aed3SPierre Pronchery return; 197*b077aed3SPierre Pronchery } 198*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 199*b077aed3SPierre Pronchery if (include_legacy()) { 200*b077aed3SPierre Pronchery BIO_printf(bio_out, "Legacy:\n"); 201*b077aed3SPierre Pronchery EVP_MD_do_all_sorted(legacy_md_fn, bio_out); 202*b077aed3SPierre Pronchery } 203*b077aed3SPierre Pronchery #endif 204*b077aed3SPierre Pronchery 205*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided:\n"); 206*b077aed3SPierre Pronchery EVP_MD_do_all_provided(app_get0_libctx(), collect_digests, digests); 207*b077aed3SPierre Pronchery sk_EVP_MD_sort(digests); 208*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_MD_num(digests); i++) { 209*b077aed3SPierre Pronchery const EVP_MD *m = sk_EVP_MD_value(digests, i); 210*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 211*b077aed3SPierre Pronchery 212*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_MD_is_a(m, select_name)) 213*b077aed3SPierre Pronchery continue; 214*b077aed3SPierre Pronchery 215*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 216*b077aed3SPierre Pronchery if (names != NULL && EVP_MD_names_do_all(m, collect_names, names)) { 217*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 218*b077aed3SPierre Pronchery print_names(bio_out, names); 219*b077aed3SPierre Pronchery 220*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 221*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_MD_get0_provider(m))); 222*b077aed3SPierre Pronchery 223*b077aed3SPierre Pronchery if (verbose) { 224*b077aed3SPierre Pronchery const char *desc = EVP_MD_get0_description(m); 225*b077aed3SPierre Pronchery 226*b077aed3SPierre Pronchery if (desc != NULL) 227*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 228*b077aed3SPierre Pronchery print_param_types("retrievable algorithm parameters", 229*b077aed3SPierre Pronchery EVP_MD_gettable_params(m), 4); 230*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 231*b077aed3SPierre Pronchery EVP_MD_gettable_ctx_params(m), 4); 232*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 233*b077aed3SPierre Pronchery EVP_MD_settable_ctx_params(m), 4); 234*b077aed3SPierre Pronchery } 235*b077aed3SPierre Pronchery } 236*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 237*b077aed3SPierre Pronchery } 238*b077aed3SPierre Pronchery sk_EVP_MD_pop_free(digests, EVP_MD_free); 239*b077aed3SPierre Pronchery } 240*b077aed3SPierre Pronchery 241*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_MAC) 242*b077aed3SPierre Pronchery static int mac_cmp(const EVP_MAC * const *a, const EVP_MAC * const *b) 243*b077aed3SPierre Pronchery { 244*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_MAC_get0_provider(*a)), 245*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_MAC_get0_provider(*b))); 246*b077aed3SPierre Pronchery } 247*b077aed3SPierre Pronchery 248*b077aed3SPierre Pronchery static void collect_macs(EVP_MAC *mac, void *stack) 249*b077aed3SPierre Pronchery { 250*b077aed3SPierre Pronchery STACK_OF(EVP_MAC) *mac_stack = stack; 251*b077aed3SPierre Pronchery 252*b077aed3SPierre Pronchery if (is_mac_fetchable(mac) 253*b077aed3SPierre Pronchery && sk_EVP_MAC_push(mac_stack, mac) > 0) 254*b077aed3SPierre Pronchery EVP_MAC_up_ref(mac); 255*b077aed3SPierre Pronchery } 256*b077aed3SPierre Pronchery 257*b077aed3SPierre Pronchery static void list_macs(void) 258*b077aed3SPierre Pronchery { 259*b077aed3SPierre Pronchery STACK_OF(EVP_MAC) *macs = sk_EVP_MAC_new(mac_cmp); 260*b077aed3SPierre Pronchery int i; 261*b077aed3SPierre Pronchery 262*b077aed3SPierre Pronchery if (macs == NULL) { 263*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 264*b077aed3SPierre Pronchery return; 265*b077aed3SPierre Pronchery } 266*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided MACs:\n"); 267*b077aed3SPierre Pronchery EVP_MAC_do_all_provided(app_get0_libctx(), collect_macs, macs); 268*b077aed3SPierre Pronchery sk_EVP_MAC_sort(macs); 269*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_MAC_num(macs); i++) { 270*b077aed3SPierre Pronchery const EVP_MAC *m = sk_EVP_MAC_value(macs, i); 271*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 272*b077aed3SPierre Pronchery 273*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_MAC_is_a(m, select_name)) 274*b077aed3SPierre Pronchery continue; 275*b077aed3SPierre Pronchery 276*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 277*b077aed3SPierre Pronchery if (names != NULL && EVP_MAC_names_do_all(m, collect_names, names)) { 278*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 279*b077aed3SPierre Pronchery print_names(bio_out, names); 280*b077aed3SPierre Pronchery 281*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 282*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_MAC_get0_provider(m))); 283*b077aed3SPierre Pronchery 284*b077aed3SPierre Pronchery if (verbose) { 285*b077aed3SPierre Pronchery const char *desc = EVP_MAC_get0_description(m); 286*b077aed3SPierre Pronchery 287*b077aed3SPierre Pronchery if (desc != NULL) 288*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 289*b077aed3SPierre Pronchery print_param_types("retrievable algorithm parameters", 290*b077aed3SPierre Pronchery EVP_MAC_gettable_params(m), 4); 291*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 292*b077aed3SPierre Pronchery EVP_MAC_gettable_ctx_params(m), 4); 293*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 294*b077aed3SPierre Pronchery EVP_MAC_settable_ctx_params(m), 4); 295*b077aed3SPierre Pronchery } 296*b077aed3SPierre Pronchery } 297*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 298*b077aed3SPierre Pronchery } 299*b077aed3SPierre Pronchery sk_EVP_MAC_pop_free(macs, EVP_MAC_free); 300*b077aed3SPierre Pronchery } 301*b077aed3SPierre Pronchery 302*b077aed3SPierre Pronchery /* 303*b077aed3SPierre Pronchery * KDFs and PRFs 304*b077aed3SPierre Pronchery */ 305*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_KDF) 306*b077aed3SPierre Pronchery static int kdf_cmp(const EVP_KDF * const *a, const EVP_KDF * const *b) 307*b077aed3SPierre Pronchery { 308*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_KDF_get0_provider(*a)), 309*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_KDF_get0_provider(*b))); 310*b077aed3SPierre Pronchery } 311*b077aed3SPierre Pronchery 312*b077aed3SPierre Pronchery static void collect_kdfs(EVP_KDF *kdf, void *stack) 313*b077aed3SPierre Pronchery { 314*b077aed3SPierre Pronchery STACK_OF(EVP_KDF) *kdf_stack = stack; 315*b077aed3SPierre Pronchery 316*b077aed3SPierre Pronchery if (is_kdf_fetchable(kdf) 317*b077aed3SPierre Pronchery && sk_EVP_KDF_push(kdf_stack, kdf) > 0) 318*b077aed3SPierre Pronchery EVP_KDF_up_ref(kdf); 319*b077aed3SPierre Pronchery } 320*b077aed3SPierre Pronchery 321*b077aed3SPierre Pronchery static void list_kdfs(void) 322*b077aed3SPierre Pronchery { 323*b077aed3SPierre Pronchery STACK_OF(EVP_KDF) *kdfs = sk_EVP_KDF_new(kdf_cmp); 324*b077aed3SPierre Pronchery int i; 325*b077aed3SPierre Pronchery 326*b077aed3SPierre Pronchery if (kdfs == NULL) { 327*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 328*b077aed3SPierre Pronchery return; 329*b077aed3SPierre Pronchery } 330*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided KDFs and PDFs:\n"); 331*b077aed3SPierre Pronchery EVP_KDF_do_all_provided(app_get0_libctx(), collect_kdfs, kdfs); 332*b077aed3SPierre Pronchery sk_EVP_KDF_sort(kdfs); 333*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_KDF_num(kdfs); i++) { 334*b077aed3SPierre Pronchery const EVP_KDF *k = sk_EVP_KDF_value(kdfs, i); 335*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 336*b077aed3SPierre Pronchery 337*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_KDF_is_a(k, select_name)) 338*b077aed3SPierre Pronchery continue; 339*b077aed3SPierre Pronchery 340*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 341*b077aed3SPierre Pronchery if (names != NULL && EVP_KDF_names_do_all(k, collect_names, names)) { 342*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 343*b077aed3SPierre Pronchery print_names(bio_out, names); 344*b077aed3SPierre Pronchery 345*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 346*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_KDF_get0_provider(k))); 347*b077aed3SPierre Pronchery 348*b077aed3SPierre Pronchery if (verbose) { 349*b077aed3SPierre Pronchery const char *desc = EVP_KDF_get0_description(k); 350*b077aed3SPierre Pronchery 351*b077aed3SPierre Pronchery if (desc != NULL) 352*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 353*b077aed3SPierre Pronchery print_param_types("retrievable algorithm parameters", 354*b077aed3SPierre Pronchery EVP_KDF_gettable_params(k), 4); 355*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 356*b077aed3SPierre Pronchery EVP_KDF_gettable_ctx_params(k), 4); 357*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 358*b077aed3SPierre Pronchery EVP_KDF_settable_ctx_params(k), 4); 359*b077aed3SPierre Pronchery } 360*b077aed3SPierre Pronchery } 361*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 362*b077aed3SPierre Pronchery } 363*b077aed3SPierre Pronchery sk_EVP_KDF_pop_free(kdfs, EVP_KDF_free); 364*b077aed3SPierre Pronchery } 365*b077aed3SPierre Pronchery 366*b077aed3SPierre Pronchery /* 367*b077aed3SPierre Pronchery * RANDs 368*b077aed3SPierre Pronchery */ 369*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_RAND) 370*b077aed3SPierre Pronchery 371*b077aed3SPierre Pronchery static int rand_cmp(const EVP_RAND * const *a, const EVP_RAND * const *b) 372*b077aed3SPierre Pronchery { 373*b077aed3SPierre Pronchery int ret = OPENSSL_strcasecmp(EVP_RAND_get0_name(*a), EVP_RAND_get0_name(*b)); 374*b077aed3SPierre Pronchery 375*b077aed3SPierre Pronchery if (ret == 0) 376*b077aed3SPierre Pronchery ret = strcmp(OSSL_PROVIDER_get0_name(EVP_RAND_get0_provider(*a)), 377*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_RAND_get0_provider(*b))); 378*b077aed3SPierre Pronchery 379*b077aed3SPierre Pronchery return ret; 380*b077aed3SPierre Pronchery } 381*b077aed3SPierre Pronchery 382*b077aed3SPierre Pronchery static void collect_rands(EVP_RAND *rand, void *stack) 383*b077aed3SPierre Pronchery { 384*b077aed3SPierre Pronchery STACK_OF(EVP_RAND) *rand_stack = stack; 385*b077aed3SPierre Pronchery 386*b077aed3SPierre Pronchery if (is_rand_fetchable(rand) 387*b077aed3SPierre Pronchery && sk_EVP_RAND_push(rand_stack, rand) > 0) 388*b077aed3SPierre Pronchery EVP_RAND_up_ref(rand); 389*b077aed3SPierre Pronchery } 390*b077aed3SPierre Pronchery 391*b077aed3SPierre Pronchery static void list_random_generators(void) 392*b077aed3SPierre Pronchery { 393*b077aed3SPierre Pronchery STACK_OF(EVP_RAND) *rands = sk_EVP_RAND_new(rand_cmp); 394*b077aed3SPierre Pronchery int i; 395*b077aed3SPierre Pronchery 396*b077aed3SPierre Pronchery if (rands == NULL) { 397*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 398*b077aed3SPierre Pronchery return; 399*b077aed3SPierre Pronchery } 400*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided RNGs and seed sources:\n"); 401*b077aed3SPierre Pronchery EVP_RAND_do_all_provided(app_get0_libctx(), collect_rands, rands); 402*b077aed3SPierre Pronchery sk_EVP_RAND_sort(rands); 403*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_RAND_num(rands); i++) { 404*b077aed3SPierre Pronchery const EVP_RAND *m = sk_EVP_RAND_value(rands, i); 405*b077aed3SPierre Pronchery 406*b077aed3SPierre Pronchery if (select_name != NULL 407*b077aed3SPierre Pronchery && OPENSSL_strcasecmp(EVP_RAND_get0_name(m), select_name) != 0) 408*b077aed3SPierre Pronchery continue; 409*b077aed3SPierre Pronchery BIO_printf(bio_out, " %s", EVP_RAND_get0_name(m)); 410*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 411*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_RAND_get0_provider(m))); 412*b077aed3SPierre Pronchery 413*b077aed3SPierre Pronchery if (verbose) { 414*b077aed3SPierre Pronchery const char *desc = EVP_RAND_get0_description(m); 415*b077aed3SPierre Pronchery 416*b077aed3SPierre Pronchery if (desc != NULL) 417*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 418*b077aed3SPierre Pronchery print_param_types("retrievable algorithm parameters", 419*b077aed3SPierre Pronchery EVP_RAND_gettable_params(m), 4); 420*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 421*b077aed3SPierre Pronchery EVP_RAND_gettable_ctx_params(m), 4); 422*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 423*b077aed3SPierre Pronchery EVP_RAND_settable_ctx_params(m), 4); 424*b077aed3SPierre Pronchery } 425*b077aed3SPierre Pronchery } 426*b077aed3SPierre Pronchery sk_EVP_RAND_pop_free(rands, EVP_RAND_free); 427*b077aed3SPierre Pronchery } 428*b077aed3SPierre Pronchery 429*b077aed3SPierre Pronchery static void display_random(const char *name, EVP_RAND_CTX *drbg) 430*b077aed3SPierre Pronchery { 431*b077aed3SPierre Pronchery EVP_RAND *rand; 432*b077aed3SPierre Pronchery uint64_t u; 433*b077aed3SPierre Pronchery const char *p; 434*b077aed3SPierre Pronchery const OSSL_PARAM *gettables; 435*b077aed3SPierre Pronchery OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END }; 436*b077aed3SPierre Pronchery unsigned char buf[1000]; 437*b077aed3SPierre Pronchery 438*b077aed3SPierre Pronchery BIO_printf(bio_out, "%s:\n", name); 439*b077aed3SPierre Pronchery if (drbg != NULL) { 440*b077aed3SPierre Pronchery rand = EVP_RAND_CTX_get0_rand(drbg); 441*b077aed3SPierre Pronchery 442*b077aed3SPierre Pronchery BIO_printf(bio_out, " %s", EVP_RAND_get0_name(rand)); 443*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 444*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_RAND_get0_provider(rand))); 445*b077aed3SPierre Pronchery 446*b077aed3SPierre Pronchery switch (EVP_RAND_get_state(drbg)) { 447*b077aed3SPierre Pronchery case EVP_RAND_STATE_UNINITIALISED: 448*b077aed3SPierre Pronchery p = "uninitialised"; 449*b077aed3SPierre Pronchery break; 450*b077aed3SPierre Pronchery case EVP_RAND_STATE_READY: 451*b077aed3SPierre Pronchery p = "ready"; 452*b077aed3SPierre Pronchery break; 453*b077aed3SPierre Pronchery case EVP_RAND_STATE_ERROR: 454*b077aed3SPierre Pronchery p = "error"; 455*b077aed3SPierre Pronchery break; 456*b077aed3SPierre Pronchery default: 457*b077aed3SPierre Pronchery p = "unknown"; 458*b077aed3SPierre Pronchery break; 459*b077aed3SPierre Pronchery } 460*b077aed3SPierre Pronchery BIO_printf(bio_out, " state = %s\n", p); 461*b077aed3SPierre Pronchery 462*b077aed3SPierre Pronchery gettables = EVP_RAND_gettable_ctx_params(rand); 463*b077aed3SPierre Pronchery if (gettables != NULL) 464*b077aed3SPierre Pronchery for (; gettables->key != NULL; gettables++) { 465*b077aed3SPierre Pronchery /* State has been dealt with already, so ignore */ 466*b077aed3SPierre Pronchery if (OPENSSL_strcasecmp(gettables->key, OSSL_RAND_PARAM_STATE) == 0) 467*b077aed3SPierre Pronchery continue; 468*b077aed3SPierre Pronchery /* Outside of verbose mode, we skip non-string values */ 469*b077aed3SPierre Pronchery if (gettables->data_type != OSSL_PARAM_UTF8_STRING 470*b077aed3SPierre Pronchery && gettables->data_type != OSSL_PARAM_UTF8_PTR 471*b077aed3SPierre Pronchery && !verbose) 472*b077aed3SPierre Pronchery continue; 473*b077aed3SPierre Pronchery params->key = gettables->key; 474*b077aed3SPierre Pronchery params->data_type = gettables->data_type; 475*b077aed3SPierre Pronchery if (gettables->data_type == OSSL_PARAM_UNSIGNED_INTEGER 476*b077aed3SPierre Pronchery || gettables->data_type == OSSL_PARAM_INTEGER) { 477*b077aed3SPierre Pronchery params->data = &u; 478*b077aed3SPierre Pronchery params->data_size = sizeof(u); 479*b077aed3SPierre Pronchery } else { 480*b077aed3SPierre Pronchery params->data = buf; 481*b077aed3SPierre Pronchery params->data_size = sizeof(buf); 482*b077aed3SPierre Pronchery } 483*b077aed3SPierre Pronchery params->return_size = 0; 484*b077aed3SPierre Pronchery if (EVP_RAND_CTX_get_params(drbg, params)) 485*b077aed3SPierre Pronchery print_param_value(params, 2); 486*b077aed3SPierre Pronchery } 487*b077aed3SPierre Pronchery } 488*b077aed3SPierre Pronchery } 489*b077aed3SPierre Pronchery 490*b077aed3SPierre Pronchery static void list_random_instances(void) 491*b077aed3SPierre Pronchery { 492*b077aed3SPierre Pronchery display_random("primary", RAND_get0_primary(NULL)); 493*b077aed3SPierre Pronchery display_random("public", RAND_get0_public(NULL)); 494*b077aed3SPierre Pronchery display_random("private", RAND_get0_private(NULL)); 495*b077aed3SPierre Pronchery } 496*b077aed3SPierre Pronchery 497*b077aed3SPierre Pronchery /* 498*b077aed3SPierre Pronchery * Encoders 499*b077aed3SPierre Pronchery */ 500*b077aed3SPierre Pronchery DEFINE_STACK_OF(OSSL_ENCODER) 501*b077aed3SPierre Pronchery static int encoder_cmp(const OSSL_ENCODER * const *a, 502*b077aed3SPierre Pronchery const OSSL_ENCODER * const *b) 503*b077aed3SPierre Pronchery { 504*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(OSSL_ENCODER_get0_provider(*a)), 505*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(OSSL_ENCODER_get0_provider(*b))); 506*b077aed3SPierre Pronchery } 507*b077aed3SPierre Pronchery 508*b077aed3SPierre Pronchery static void collect_encoders(OSSL_ENCODER *encoder, void *stack) 509*b077aed3SPierre Pronchery { 510*b077aed3SPierre Pronchery STACK_OF(OSSL_ENCODER) *encoder_stack = stack; 511*b077aed3SPierre Pronchery 512*b077aed3SPierre Pronchery if (is_encoder_fetchable(encoder) 513*b077aed3SPierre Pronchery && sk_OSSL_ENCODER_push(encoder_stack, encoder) > 0) 514*b077aed3SPierre Pronchery OSSL_ENCODER_up_ref(encoder); 515*b077aed3SPierre Pronchery } 516*b077aed3SPierre Pronchery 517*b077aed3SPierre Pronchery static void list_encoders(void) 518*b077aed3SPierre Pronchery { 519*b077aed3SPierre Pronchery STACK_OF(OSSL_ENCODER) *encoders; 520*b077aed3SPierre Pronchery int i; 521*b077aed3SPierre Pronchery 522*b077aed3SPierre Pronchery encoders = sk_OSSL_ENCODER_new(encoder_cmp); 523*b077aed3SPierre Pronchery if (encoders == NULL) { 524*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 525*b077aed3SPierre Pronchery return; 526*b077aed3SPierre Pronchery } 527*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided ENCODERs:\n"); 528*b077aed3SPierre Pronchery OSSL_ENCODER_do_all_provided(app_get0_libctx(), collect_encoders, 529*b077aed3SPierre Pronchery encoders); 530*b077aed3SPierre Pronchery sk_OSSL_ENCODER_sort(encoders); 531*b077aed3SPierre Pronchery 532*b077aed3SPierre Pronchery for (i = 0; i < sk_OSSL_ENCODER_num(encoders); i++) { 533*b077aed3SPierre Pronchery OSSL_ENCODER *k = sk_OSSL_ENCODER_value(encoders, i); 534*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 535*b077aed3SPierre Pronchery 536*b077aed3SPierre Pronchery if (select_name != NULL && !OSSL_ENCODER_is_a(k, select_name)) 537*b077aed3SPierre Pronchery continue; 538*b077aed3SPierre Pronchery 539*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 540*b077aed3SPierre Pronchery if (names != NULL && OSSL_ENCODER_names_do_all(k, collect_names, names)) { 541*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 542*b077aed3SPierre Pronchery print_names(bio_out, names); 543*b077aed3SPierre Pronchery 544*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s (%s)\n", 545*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(OSSL_ENCODER_get0_provider(k)), 546*b077aed3SPierre Pronchery OSSL_ENCODER_get0_properties(k)); 547*b077aed3SPierre Pronchery 548*b077aed3SPierre Pronchery if (verbose) { 549*b077aed3SPierre Pronchery const char *desc = OSSL_ENCODER_get0_description(k); 550*b077aed3SPierre Pronchery 551*b077aed3SPierre Pronchery if (desc != NULL) 552*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 553*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 554*b077aed3SPierre Pronchery OSSL_ENCODER_settable_ctx_params(k), 4); 555*b077aed3SPierre Pronchery } 556*b077aed3SPierre Pronchery } 557*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 558*b077aed3SPierre Pronchery } 559*b077aed3SPierre Pronchery sk_OSSL_ENCODER_pop_free(encoders, OSSL_ENCODER_free); 560*b077aed3SPierre Pronchery } 561*b077aed3SPierre Pronchery 562*b077aed3SPierre Pronchery /* 563*b077aed3SPierre Pronchery * Decoders 564*b077aed3SPierre Pronchery */ 565*b077aed3SPierre Pronchery DEFINE_STACK_OF(OSSL_DECODER) 566*b077aed3SPierre Pronchery static int decoder_cmp(const OSSL_DECODER * const *a, 567*b077aed3SPierre Pronchery const OSSL_DECODER * const *b) 568*b077aed3SPierre Pronchery { 569*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(OSSL_DECODER_get0_provider(*a)), 570*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(OSSL_DECODER_get0_provider(*b))); 571*b077aed3SPierre Pronchery } 572*b077aed3SPierre Pronchery 573*b077aed3SPierre Pronchery static void collect_decoders(OSSL_DECODER *decoder, void *stack) 574*b077aed3SPierre Pronchery { 575*b077aed3SPierre Pronchery STACK_OF(OSSL_DECODER) *decoder_stack = stack; 576*b077aed3SPierre Pronchery 577*b077aed3SPierre Pronchery if (is_decoder_fetchable(decoder) 578*b077aed3SPierre Pronchery && sk_OSSL_DECODER_push(decoder_stack, decoder) > 0) 579*b077aed3SPierre Pronchery OSSL_DECODER_up_ref(decoder); 580*b077aed3SPierre Pronchery } 581*b077aed3SPierre Pronchery 582*b077aed3SPierre Pronchery static void list_decoders(void) 583*b077aed3SPierre Pronchery { 584*b077aed3SPierre Pronchery STACK_OF(OSSL_DECODER) *decoders; 585*b077aed3SPierre Pronchery int i; 586*b077aed3SPierre Pronchery 587*b077aed3SPierre Pronchery decoders = sk_OSSL_DECODER_new(decoder_cmp); 588*b077aed3SPierre Pronchery if (decoders == NULL) { 589*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 590*b077aed3SPierre Pronchery return; 591*b077aed3SPierre Pronchery } 592*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided DECODERs:\n"); 593*b077aed3SPierre Pronchery OSSL_DECODER_do_all_provided(app_get0_libctx(), collect_decoders, 594*b077aed3SPierre Pronchery decoders); 595*b077aed3SPierre Pronchery sk_OSSL_DECODER_sort(decoders); 596*b077aed3SPierre Pronchery 597*b077aed3SPierre Pronchery for (i = 0; i < sk_OSSL_DECODER_num(decoders); i++) { 598*b077aed3SPierre Pronchery OSSL_DECODER *k = sk_OSSL_DECODER_value(decoders, i); 599*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 600*b077aed3SPierre Pronchery 601*b077aed3SPierre Pronchery if (select_name != NULL && !OSSL_DECODER_is_a(k, select_name)) 602*b077aed3SPierre Pronchery continue; 603*b077aed3SPierre Pronchery 604*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 605*b077aed3SPierre Pronchery if (names != NULL && OSSL_DECODER_names_do_all(k, collect_names, names)) { 606*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 607*b077aed3SPierre Pronchery print_names(bio_out, names); 608*b077aed3SPierre Pronchery 609*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s (%s)\n", 610*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(OSSL_DECODER_get0_provider(k)), 611*b077aed3SPierre Pronchery OSSL_DECODER_get0_properties(k)); 612*b077aed3SPierre Pronchery 613*b077aed3SPierre Pronchery if (verbose) { 614*b077aed3SPierre Pronchery const char *desc = OSSL_DECODER_get0_description(k); 615*b077aed3SPierre Pronchery 616*b077aed3SPierre Pronchery if (desc != NULL) 617*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 618*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 619*b077aed3SPierre Pronchery OSSL_DECODER_settable_ctx_params(k), 4); 620*b077aed3SPierre Pronchery } 621*b077aed3SPierre Pronchery } 622*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 623*b077aed3SPierre Pronchery } 624*b077aed3SPierre Pronchery sk_OSSL_DECODER_pop_free(decoders, OSSL_DECODER_free); 625*b077aed3SPierre Pronchery } 626*b077aed3SPierre Pronchery 627*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_KEYMGMT) 628*b077aed3SPierre Pronchery static int keymanager_cmp(const EVP_KEYMGMT * const *a, 629*b077aed3SPierre Pronchery const EVP_KEYMGMT * const *b) 630*b077aed3SPierre Pronchery { 631*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_KEYMGMT_get0_provider(*a)), 632*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_KEYMGMT_get0_provider(*b))); 633*b077aed3SPierre Pronchery } 634*b077aed3SPierre Pronchery 635*b077aed3SPierre Pronchery static void collect_keymanagers(EVP_KEYMGMT *km, void *stack) 636*b077aed3SPierre Pronchery { 637*b077aed3SPierre Pronchery STACK_OF(EVP_KEYMGMT) *km_stack = stack; 638*b077aed3SPierre Pronchery 639*b077aed3SPierre Pronchery if (is_keymgmt_fetchable(km) 640*b077aed3SPierre Pronchery && sk_EVP_KEYMGMT_push(km_stack, km) > 0) 641*b077aed3SPierre Pronchery EVP_KEYMGMT_up_ref(km); 642*b077aed3SPierre Pronchery } 643*b077aed3SPierre Pronchery 644*b077aed3SPierre Pronchery static void list_keymanagers(void) 645*b077aed3SPierre Pronchery { 646*b077aed3SPierre Pronchery int i; 647*b077aed3SPierre Pronchery STACK_OF(EVP_KEYMGMT) *km_stack = sk_EVP_KEYMGMT_new(keymanager_cmp); 648*b077aed3SPierre Pronchery 649*b077aed3SPierre Pronchery EVP_KEYMGMT_do_all_provided(app_get0_libctx(), collect_keymanagers, 650*b077aed3SPierre Pronchery km_stack); 651*b077aed3SPierre Pronchery sk_EVP_KEYMGMT_sort(km_stack); 652*b077aed3SPierre Pronchery 653*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_KEYMGMT_num(km_stack); i++) { 654*b077aed3SPierre Pronchery EVP_KEYMGMT *k = sk_EVP_KEYMGMT_value(km_stack, i); 655*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 656*b077aed3SPierre Pronchery 657*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_KEYMGMT_is_a(k, select_name)) 658*b077aed3SPierre Pronchery continue; 659*b077aed3SPierre Pronchery 660*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 661*b077aed3SPierre Pronchery if (names != NULL && EVP_KEYMGMT_names_do_all(k, collect_names, names)) { 662*b077aed3SPierre Pronchery const char *desc = EVP_KEYMGMT_get0_description(k); 663*b077aed3SPierre Pronchery 664*b077aed3SPierre Pronchery BIO_printf(bio_out, " Name: "); 665*b077aed3SPierre Pronchery if (desc != NULL) 666*b077aed3SPierre Pronchery BIO_printf(bio_out, "%s", desc); 667*b077aed3SPierre Pronchery else 668*b077aed3SPierre Pronchery BIO_printf(bio_out, "%s", sk_OPENSSL_CSTRING_value(names, 0)); 669*b077aed3SPierre Pronchery BIO_printf(bio_out, "\n"); 670*b077aed3SPierre Pronchery BIO_printf(bio_out, " Type: Provider Algorithm\n"); 671*b077aed3SPierre Pronchery BIO_printf(bio_out, " IDs: "); 672*b077aed3SPierre Pronchery print_names(bio_out, names); 673*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 674*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_KEYMGMT_get0_provider(k))); 675*b077aed3SPierre Pronchery 676*b077aed3SPierre Pronchery if (verbose) { 677*b077aed3SPierre Pronchery print_param_types("settable key generation parameters", 678*b077aed3SPierre Pronchery EVP_KEYMGMT_gen_settable_params(k), 4); 679*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 680*b077aed3SPierre Pronchery EVP_KEYMGMT_settable_params(k), 4); 681*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 682*b077aed3SPierre Pronchery EVP_KEYMGMT_gettable_params(k), 4); 683*b077aed3SPierre Pronchery } 684*b077aed3SPierre Pronchery } 685*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 686*b077aed3SPierre Pronchery } 687*b077aed3SPierre Pronchery sk_EVP_KEYMGMT_pop_free(km_stack, EVP_KEYMGMT_free); 688*b077aed3SPierre Pronchery } 689*b077aed3SPierre Pronchery 690*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_SIGNATURE) 691*b077aed3SPierre Pronchery static int signature_cmp(const EVP_SIGNATURE * const *a, 692*b077aed3SPierre Pronchery const EVP_SIGNATURE * const *b) 693*b077aed3SPierre Pronchery { 694*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_SIGNATURE_get0_provider(*a)), 695*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_SIGNATURE_get0_provider(*b))); 696*b077aed3SPierre Pronchery } 697*b077aed3SPierre Pronchery 698*b077aed3SPierre Pronchery static void collect_signatures(EVP_SIGNATURE *sig, void *stack) 699*b077aed3SPierre Pronchery { 700*b077aed3SPierre Pronchery STACK_OF(EVP_SIGNATURE) *sig_stack = stack; 701*b077aed3SPierre Pronchery 702*b077aed3SPierre Pronchery if (is_signature_fetchable(sig) 703*b077aed3SPierre Pronchery && sk_EVP_SIGNATURE_push(sig_stack, sig) > 0) 704*b077aed3SPierre Pronchery EVP_SIGNATURE_up_ref(sig); 705*b077aed3SPierre Pronchery } 706*b077aed3SPierre Pronchery 707*b077aed3SPierre Pronchery static void list_signatures(void) 708*b077aed3SPierre Pronchery { 709*b077aed3SPierre Pronchery int i, count = 0; 710*b077aed3SPierre Pronchery STACK_OF(EVP_SIGNATURE) *sig_stack = sk_EVP_SIGNATURE_new(signature_cmp); 711*b077aed3SPierre Pronchery 712*b077aed3SPierre Pronchery EVP_SIGNATURE_do_all_provided(app_get0_libctx(), collect_signatures, 713*b077aed3SPierre Pronchery sig_stack); 714*b077aed3SPierre Pronchery sk_EVP_SIGNATURE_sort(sig_stack); 715*b077aed3SPierre Pronchery 716*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_SIGNATURE_num(sig_stack); i++) { 717*b077aed3SPierre Pronchery EVP_SIGNATURE *k = sk_EVP_SIGNATURE_value(sig_stack, i); 718*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 719*b077aed3SPierre Pronchery 720*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_SIGNATURE_is_a(k, select_name)) 721*b077aed3SPierre Pronchery continue; 722*b077aed3SPierre Pronchery 723*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 724*b077aed3SPierre Pronchery if (names != NULL && EVP_SIGNATURE_names_do_all(k, collect_names, names)) { 725*b077aed3SPierre Pronchery count++; 726*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 727*b077aed3SPierre Pronchery print_names(bio_out, names); 728*b077aed3SPierre Pronchery 729*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 730*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_SIGNATURE_get0_provider(k))); 731*b077aed3SPierre Pronchery 732*b077aed3SPierre Pronchery if (verbose) { 733*b077aed3SPierre Pronchery const char *desc = EVP_SIGNATURE_get0_description(k); 734*b077aed3SPierre Pronchery 735*b077aed3SPierre Pronchery if (desc != NULL) 736*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 737*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 738*b077aed3SPierre Pronchery EVP_SIGNATURE_settable_ctx_params(k), 4); 739*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 740*b077aed3SPierre Pronchery EVP_SIGNATURE_gettable_ctx_params(k), 4); 741*b077aed3SPierre Pronchery } 742*b077aed3SPierre Pronchery } 743*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 744*b077aed3SPierre Pronchery } 745*b077aed3SPierre Pronchery sk_EVP_SIGNATURE_pop_free(sig_stack, EVP_SIGNATURE_free); 746*b077aed3SPierre Pronchery if (count == 0) 747*b077aed3SPierre Pronchery BIO_printf(bio_out, " -\n"); 748*b077aed3SPierre Pronchery } 749*b077aed3SPierre Pronchery 750*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_KEM) 751*b077aed3SPierre Pronchery static int kem_cmp(const EVP_KEM * const *a, 752*b077aed3SPierre Pronchery const EVP_KEM * const *b) 753*b077aed3SPierre Pronchery { 754*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_KEM_get0_provider(*a)), 755*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_KEM_get0_provider(*b))); 756*b077aed3SPierre Pronchery } 757*b077aed3SPierre Pronchery 758*b077aed3SPierre Pronchery static void collect_kem(EVP_KEM *kem, void *stack) 759*b077aed3SPierre Pronchery { 760*b077aed3SPierre Pronchery STACK_OF(EVP_KEM) *kem_stack = stack; 761*b077aed3SPierre Pronchery 762*b077aed3SPierre Pronchery if (is_kem_fetchable(kem) 763*b077aed3SPierre Pronchery && sk_EVP_KEM_push(kem_stack, kem) > 0) 764*b077aed3SPierre Pronchery EVP_KEM_up_ref(kem); 765*b077aed3SPierre Pronchery } 766*b077aed3SPierre Pronchery 767*b077aed3SPierre Pronchery static void list_kems(void) 768*b077aed3SPierre Pronchery { 769*b077aed3SPierre Pronchery int i, count = 0; 770*b077aed3SPierre Pronchery STACK_OF(EVP_KEM) *kem_stack = sk_EVP_KEM_new(kem_cmp); 771*b077aed3SPierre Pronchery 772*b077aed3SPierre Pronchery EVP_KEM_do_all_provided(app_get0_libctx(), collect_kem, kem_stack); 773*b077aed3SPierre Pronchery sk_EVP_KEM_sort(kem_stack); 774*b077aed3SPierre Pronchery 775*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_KEM_num(kem_stack); i++) { 776*b077aed3SPierre Pronchery EVP_KEM *k = sk_EVP_KEM_value(kem_stack, i); 777*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 778*b077aed3SPierre Pronchery 779*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_KEM_is_a(k, select_name)) 780*b077aed3SPierre Pronchery continue; 781*b077aed3SPierre Pronchery 782*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 783*b077aed3SPierre Pronchery if (names != NULL && EVP_KEM_names_do_all(k, collect_names, names)) { 784*b077aed3SPierre Pronchery count++; 785*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 786*b077aed3SPierre Pronchery print_names(bio_out, names); 787*b077aed3SPierre Pronchery 788*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 789*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_KEM_get0_provider(k))); 790*b077aed3SPierre Pronchery 791*b077aed3SPierre Pronchery if (verbose) { 792*b077aed3SPierre Pronchery const char *desc = EVP_KEM_get0_description(k); 793*b077aed3SPierre Pronchery 794*b077aed3SPierre Pronchery if (desc != NULL) 795*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 796*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 797*b077aed3SPierre Pronchery EVP_KEM_settable_ctx_params(k), 4); 798*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 799*b077aed3SPierre Pronchery EVP_KEM_gettable_ctx_params(k), 4); 800*b077aed3SPierre Pronchery } 801*b077aed3SPierre Pronchery } 802*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 803*b077aed3SPierre Pronchery } 804*b077aed3SPierre Pronchery sk_EVP_KEM_pop_free(kem_stack, EVP_KEM_free); 805*b077aed3SPierre Pronchery if (count == 0) 806*b077aed3SPierre Pronchery BIO_printf(bio_out, " -\n"); 807*b077aed3SPierre Pronchery } 808*b077aed3SPierre Pronchery 809*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_ASYM_CIPHER) 810*b077aed3SPierre Pronchery static int asymcipher_cmp(const EVP_ASYM_CIPHER * const *a, 811*b077aed3SPierre Pronchery const EVP_ASYM_CIPHER * const *b) 812*b077aed3SPierre Pronchery { 813*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_ASYM_CIPHER_get0_provider(*a)), 814*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_ASYM_CIPHER_get0_provider(*b))); 815*b077aed3SPierre Pronchery } 816*b077aed3SPierre Pronchery 817*b077aed3SPierre Pronchery static void collect_asymciph(EVP_ASYM_CIPHER *asym_cipher, void *stack) 818*b077aed3SPierre Pronchery { 819*b077aed3SPierre Pronchery STACK_OF(EVP_ASYM_CIPHER) *asym_cipher_stack = stack; 820*b077aed3SPierre Pronchery 821*b077aed3SPierre Pronchery if (is_asym_cipher_fetchable(asym_cipher) 822*b077aed3SPierre Pronchery && sk_EVP_ASYM_CIPHER_push(asym_cipher_stack, asym_cipher) > 0) 823*b077aed3SPierre Pronchery EVP_ASYM_CIPHER_up_ref(asym_cipher); 824*b077aed3SPierre Pronchery } 825*b077aed3SPierre Pronchery 826*b077aed3SPierre Pronchery static void list_asymciphers(void) 827*b077aed3SPierre Pronchery { 828*b077aed3SPierre Pronchery int i, count = 0; 829*b077aed3SPierre Pronchery STACK_OF(EVP_ASYM_CIPHER) *asymciph_stack = 830*b077aed3SPierre Pronchery sk_EVP_ASYM_CIPHER_new(asymcipher_cmp); 831*b077aed3SPierre Pronchery 832*b077aed3SPierre Pronchery EVP_ASYM_CIPHER_do_all_provided(app_get0_libctx(), collect_asymciph, 833*b077aed3SPierre Pronchery asymciph_stack); 834*b077aed3SPierre Pronchery sk_EVP_ASYM_CIPHER_sort(asymciph_stack); 835*b077aed3SPierre Pronchery 836*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_ASYM_CIPHER_num(asymciph_stack); i++) { 837*b077aed3SPierre Pronchery EVP_ASYM_CIPHER *k = sk_EVP_ASYM_CIPHER_value(asymciph_stack, i); 838*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 839*b077aed3SPierre Pronchery 840*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_ASYM_CIPHER_is_a(k, select_name)) 841*b077aed3SPierre Pronchery continue; 842*b077aed3SPierre Pronchery 843*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 844*b077aed3SPierre Pronchery if (names != NULL 845*b077aed3SPierre Pronchery && EVP_ASYM_CIPHER_names_do_all(k, collect_names, names)) { 846*b077aed3SPierre Pronchery count++; 847*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 848*b077aed3SPierre Pronchery print_names(bio_out, names); 849*b077aed3SPierre Pronchery 850*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 851*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_ASYM_CIPHER_get0_provider(k))); 852*b077aed3SPierre Pronchery 853*b077aed3SPierre Pronchery if (verbose) { 854*b077aed3SPierre Pronchery const char *desc = EVP_ASYM_CIPHER_get0_description(k); 855*b077aed3SPierre Pronchery 856*b077aed3SPierre Pronchery if (desc != NULL) 857*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 858*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 859*b077aed3SPierre Pronchery EVP_ASYM_CIPHER_settable_ctx_params(k), 4); 860*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 861*b077aed3SPierre Pronchery EVP_ASYM_CIPHER_gettable_ctx_params(k), 4); 862*b077aed3SPierre Pronchery } 863*b077aed3SPierre Pronchery } 864*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 865*b077aed3SPierre Pronchery } 866*b077aed3SPierre Pronchery sk_EVP_ASYM_CIPHER_pop_free(asymciph_stack, EVP_ASYM_CIPHER_free); 867*b077aed3SPierre Pronchery if (count == 0) 868*b077aed3SPierre Pronchery BIO_printf(bio_out, " -\n"); 869*b077aed3SPierre Pronchery } 870*b077aed3SPierre Pronchery 871*b077aed3SPierre Pronchery DEFINE_STACK_OF(EVP_KEYEXCH) 872*b077aed3SPierre Pronchery static int kex_cmp(const EVP_KEYEXCH * const *a, 873*b077aed3SPierre Pronchery const EVP_KEYEXCH * const *b) 874*b077aed3SPierre Pronchery { 875*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(EVP_KEYEXCH_get0_provider(*a)), 876*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_KEYEXCH_get0_provider(*b))); 877*b077aed3SPierre Pronchery } 878*b077aed3SPierre Pronchery 879*b077aed3SPierre Pronchery static void collect_kex(EVP_KEYEXCH *kex, void *stack) 880*b077aed3SPierre Pronchery { 881*b077aed3SPierre Pronchery STACK_OF(EVP_KEYEXCH) *kex_stack = stack; 882*b077aed3SPierre Pronchery 883*b077aed3SPierre Pronchery if (is_keyexch_fetchable(kex) 884*b077aed3SPierre Pronchery && sk_EVP_KEYEXCH_push(kex_stack, kex) > 0) 885*b077aed3SPierre Pronchery EVP_KEYEXCH_up_ref(kex); 886*b077aed3SPierre Pronchery } 887*b077aed3SPierre Pronchery 888*b077aed3SPierre Pronchery static void list_keyexchanges(void) 889*b077aed3SPierre Pronchery { 890*b077aed3SPierre Pronchery int i, count = 0; 891*b077aed3SPierre Pronchery STACK_OF(EVP_KEYEXCH) *kex_stack = sk_EVP_KEYEXCH_new(kex_cmp); 892*b077aed3SPierre Pronchery 893*b077aed3SPierre Pronchery EVP_KEYEXCH_do_all_provided(app_get0_libctx(), collect_kex, kex_stack); 894*b077aed3SPierre Pronchery sk_EVP_KEYEXCH_sort(kex_stack); 895*b077aed3SPierre Pronchery 896*b077aed3SPierre Pronchery for (i = 0; i < sk_EVP_KEYEXCH_num(kex_stack); i++) { 897*b077aed3SPierre Pronchery EVP_KEYEXCH *k = sk_EVP_KEYEXCH_value(kex_stack, i); 898*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 899*b077aed3SPierre Pronchery 900*b077aed3SPierre Pronchery if (select_name != NULL && !EVP_KEYEXCH_is_a(k, select_name)) 901*b077aed3SPierre Pronchery continue; 902*b077aed3SPierre Pronchery 903*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 904*b077aed3SPierre Pronchery if (names != NULL && EVP_KEYEXCH_names_do_all(k, collect_names, names)) { 905*b077aed3SPierre Pronchery count++; 906*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 907*b077aed3SPierre Pronchery print_names(bio_out, names); 908*b077aed3SPierre Pronchery 909*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 910*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(EVP_KEYEXCH_get0_provider(k))); 911*b077aed3SPierre Pronchery 912*b077aed3SPierre Pronchery if (verbose) { 913*b077aed3SPierre Pronchery const char *desc = EVP_KEYEXCH_get0_description(k); 914*b077aed3SPierre Pronchery 915*b077aed3SPierre Pronchery if (desc != NULL) 916*b077aed3SPierre Pronchery BIO_printf(bio_out, " description: %s\n", desc); 917*b077aed3SPierre Pronchery print_param_types("settable operation parameters", 918*b077aed3SPierre Pronchery EVP_KEYEXCH_settable_ctx_params(k), 4); 919*b077aed3SPierre Pronchery print_param_types("retrievable operation parameters", 920*b077aed3SPierre Pronchery EVP_KEYEXCH_gettable_ctx_params(k), 4); 921*b077aed3SPierre Pronchery } 922*b077aed3SPierre Pronchery } 923*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 924*b077aed3SPierre Pronchery } 925*b077aed3SPierre Pronchery sk_EVP_KEYEXCH_pop_free(kex_stack, EVP_KEYEXCH_free); 926*b077aed3SPierre Pronchery if (count == 0) 927*b077aed3SPierre Pronchery BIO_printf(bio_out, " -\n"); 928*b077aed3SPierre Pronchery } 929*b077aed3SPierre Pronchery 930*b077aed3SPierre Pronchery static void list_objects(void) 931*b077aed3SPierre Pronchery { 932*b077aed3SPierre Pronchery int max_nid = OBJ_new_nid(0); 933*b077aed3SPierre Pronchery int i; 934*b077aed3SPierre Pronchery char *oid_buf = NULL; 935*b077aed3SPierre Pronchery int oid_size = 0; 936*b077aed3SPierre Pronchery 937*b077aed3SPierre Pronchery /* Skip 0, since that's NID_undef */ 938*b077aed3SPierre Pronchery for (i = 1; i < max_nid; i++) { 939*b077aed3SPierre Pronchery const ASN1_OBJECT *obj = OBJ_nid2obj(i); 940*b077aed3SPierre Pronchery const char *sn = OBJ_nid2sn(i); 941*b077aed3SPierre Pronchery const char *ln = OBJ_nid2ln(i); 942*b077aed3SPierre Pronchery int n = 0; 943*b077aed3SPierre Pronchery 944*b077aed3SPierre Pronchery /* 945*b077aed3SPierre Pronchery * If one of the retrieved objects somehow generated an error, 946*b077aed3SPierre Pronchery * we ignore it. The check for NID_undef below will detect the 947*b077aed3SPierre Pronchery * error and simply skip to the next NID. 948*b077aed3SPierre Pronchery */ 949*b077aed3SPierre Pronchery ERR_clear_error(); 950*b077aed3SPierre Pronchery 951*b077aed3SPierre Pronchery if (OBJ_obj2nid(obj) == NID_undef) 952*b077aed3SPierre Pronchery continue; 953*b077aed3SPierre Pronchery 954*b077aed3SPierre Pronchery if ((n = OBJ_obj2txt(NULL, 0, obj, 1)) == 0) { 955*b077aed3SPierre Pronchery BIO_printf(bio_out, "# None-OID object: %s, %s\n", sn, ln); 956*b077aed3SPierre Pronchery continue; 957*b077aed3SPierre Pronchery } 958*b077aed3SPierre Pronchery if (n < 0) 959*b077aed3SPierre Pronchery break; /* Error */ 960*b077aed3SPierre Pronchery 961*b077aed3SPierre Pronchery if (n > oid_size) { 962*b077aed3SPierre Pronchery oid_buf = OPENSSL_realloc(oid_buf, n + 1); 963*b077aed3SPierre Pronchery if (oid_buf == NULL) { 964*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 965*b077aed3SPierre Pronchery break; /* Error */ 966*b077aed3SPierre Pronchery } 967*b077aed3SPierre Pronchery oid_size = n + 1; 968*b077aed3SPierre Pronchery } 969*b077aed3SPierre Pronchery if (OBJ_obj2txt(oid_buf, oid_size, obj, 1) < 0) 970*b077aed3SPierre Pronchery break; /* Error */ 971*b077aed3SPierre Pronchery if (ln == NULL || strcmp(sn, ln) == 0) 972*b077aed3SPierre Pronchery BIO_printf(bio_out, "%s = %s\n", sn, oid_buf); 973*b077aed3SPierre Pronchery else 974*b077aed3SPierre Pronchery BIO_printf(bio_out, "%s = %s, %s\n", sn, ln, oid_buf); 975*b077aed3SPierre Pronchery } 976*b077aed3SPierre Pronchery 977*b077aed3SPierre Pronchery OPENSSL_free(oid_buf); 978*b077aed3SPierre Pronchery } 979*b077aed3SPierre Pronchery 980*b077aed3SPierre Pronchery static void list_options_for_command(const char *command) 981*b077aed3SPierre Pronchery { 982*b077aed3SPierre Pronchery const FUNCTION *fp; 983*b077aed3SPierre Pronchery const OPTIONS *o; 984*b077aed3SPierre Pronchery 985*b077aed3SPierre Pronchery for (fp = functions; fp->name != NULL; fp++) 986*b077aed3SPierre Pronchery if (strcmp(fp->name, command) == 0) 987*b077aed3SPierre Pronchery break; 988*b077aed3SPierre Pronchery if (fp->name == NULL) { 989*b077aed3SPierre Pronchery BIO_printf(bio_err, "Invalid command '%s'; type \"help\" for a list.\n", 990*b077aed3SPierre Pronchery command); 991*b077aed3SPierre Pronchery return; 992*b077aed3SPierre Pronchery } 993*b077aed3SPierre Pronchery 994*b077aed3SPierre Pronchery if ((o = fp->help) == NULL) 995*b077aed3SPierre Pronchery return; 996*b077aed3SPierre Pronchery 997*b077aed3SPierre Pronchery for ( ; o->name != NULL; o++) { 998*b077aed3SPierre Pronchery char c = o->valtype; 999*b077aed3SPierre Pronchery 1000*b077aed3SPierre Pronchery if (o->name == OPT_PARAM_STR) 1001*b077aed3SPierre Pronchery break; 1002*b077aed3SPierre Pronchery 1003*b077aed3SPierre Pronchery if (o->name == OPT_HELP_STR 1004*b077aed3SPierre Pronchery || o->name == OPT_MORE_STR 1005*b077aed3SPierre Pronchery || o->name == OPT_SECTION_STR 1006*b077aed3SPierre Pronchery || o->name[0] == '\0') 1007*b077aed3SPierre Pronchery continue; 1008*b077aed3SPierre Pronchery BIO_printf(bio_out, "%s %c\n", o->name, c == '\0' ? '-' : c); 1009*b077aed3SPierre Pronchery } 1010*b077aed3SPierre Pronchery /* Always output the -- marker since it is sometimes documented. */ 1011*b077aed3SPierre Pronchery BIO_printf(bio_out, "- -\n"); 1012*b077aed3SPierre Pronchery } 1013*b077aed3SPierre Pronchery 1014*b077aed3SPierre Pronchery static int is_md_available(const char *name) 1015*b077aed3SPierre Pronchery { 1016*b077aed3SPierre Pronchery EVP_MD *md; 1017*b077aed3SPierre Pronchery const char *propq = app_get0_propq(); 1018*b077aed3SPierre Pronchery 1019*b077aed3SPierre Pronchery /* Look through providers' digests */ 1020*b077aed3SPierre Pronchery ERR_set_mark(); 1021*b077aed3SPierre Pronchery md = EVP_MD_fetch(app_get0_libctx(), name, propq); 1022*b077aed3SPierre Pronchery ERR_pop_to_mark(); 1023*b077aed3SPierre Pronchery if (md != NULL) { 1024*b077aed3SPierre Pronchery EVP_MD_free(md); 1025*b077aed3SPierre Pronchery return 1; 1026*b077aed3SPierre Pronchery } 1027*b077aed3SPierre Pronchery 1028*b077aed3SPierre Pronchery return propq != NULL || get_digest_from_engine(name) == NULL ? 0 : 1; 1029*b077aed3SPierre Pronchery } 1030*b077aed3SPierre Pronchery 1031*b077aed3SPierre Pronchery static int is_cipher_available(const char *name) 1032*b077aed3SPierre Pronchery { 1033*b077aed3SPierre Pronchery EVP_CIPHER *cipher; 1034*b077aed3SPierre Pronchery const char *propq = app_get0_propq(); 1035*b077aed3SPierre Pronchery 1036*b077aed3SPierre Pronchery /* Look through providers' ciphers */ 1037*b077aed3SPierre Pronchery ERR_set_mark(); 1038*b077aed3SPierre Pronchery cipher = EVP_CIPHER_fetch(app_get0_libctx(), name, propq); 1039*b077aed3SPierre Pronchery ERR_pop_to_mark(); 1040*b077aed3SPierre Pronchery if (cipher != NULL) { 1041*b077aed3SPierre Pronchery EVP_CIPHER_free(cipher); 1042*b077aed3SPierre Pronchery return 1; 1043*b077aed3SPierre Pronchery } 1044*b077aed3SPierre Pronchery 1045*b077aed3SPierre Pronchery return propq != NULL || get_cipher_from_engine(name) == NULL ? 0 : 1; 1046*b077aed3SPierre Pronchery } 1047*b077aed3SPierre Pronchery 1048*b077aed3SPierre Pronchery static void list_type(FUNC_TYPE ft, int one) 1049*b077aed3SPierre Pronchery { 1050*b077aed3SPierre Pronchery FUNCTION *fp; 1051*b077aed3SPierre Pronchery int i = 0; 1052*b077aed3SPierre Pronchery DISPLAY_COLUMNS dc; 1053*b077aed3SPierre Pronchery 1054*b077aed3SPierre Pronchery memset(&dc, 0, sizeof(dc)); 1055*b077aed3SPierre Pronchery if (!one) 1056*b077aed3SPierre Pronchery calculate_columns(functions, &dc); 1057*b077aed3SPierre Pronchery 1058*b077aed3SPierre Pronchery for (fp = functions; fp->name != NULL; fp++) { 1059*b077aed3SPierre Pronchery if (fp->type != ft) 1060*b077aed3SPierre Pronchery continue; 1061*b077aed3SPierre Pronchery switch (ft) { 1062*b077aed3SPierre Pronchery case FT_cipher: 1063*b077aed3SPierre Pronchery if (!is_cipher_available(fp->name)) 1064*b077aed3SPierre Pronchery continue; 1065*b077aed3SPierre Pronchery break; 1066*b077aed3SPierre Pronchery case FT_md: 1067*b077aed3SPierre Pronchery if (!is_md_available(fp->name)) 1068*b077aed3SPierre Pronchery continue; 1069*b077aed3SPierre Pronchery break; 1070*b077aed3SPierre Pronchery default: 1071*b077aed3SPierre Pronchery break; 1072*b077aed3SPierre Pronchery } 1073*b077aed3SPierre Pronchery if (one) { 1074*b077aed3SPierre Pronchery BIO_printf(bio_out, "%s\n", fp->name); 1075*b077aed3SPierre Pronchery } else { 1076*b077aed3SPierre Pronchery if (i % dc.columns == 0 && i > 0) 1077*b077aed3SPierre Pronchery BIO_printf(bio_out, "\n"); 1078*b077aed3SPierre Pronchery BIO_printf(bio_out, "%-*s", dc.width, fp->name); 1079*b077aed3SPierre Pronchery i++; 1080*b077aed3SPierre Pronchery } 1081*b077aed3SPierre Pronchery } 1082*b077aed3SPierre Pronchery if (!one) 1083*b077aed3SPierre Pronchery BIO_printf(bio_out, "\n\n"); 1084*b077aed3SPierre Pronchery } 1085*b077aed3SPierre Pronchery 1086*b077aed3SPierre Pronchery static void list_pkey(void) 1087*b077aed3SPierre Pronchery { 1088*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1089*b077aed3SPierre Pronchery int i; 1090*b077aed3SPierre Pronchery 1091*b077aed3SPierre Pronchery if (select_name == NULL && include_legacy()) { 1092*b077aed3SPierre Pronchery BIO_printf(bio_out, "Legacy:\n"); 1093*b077aed3SPierre Pronchery for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) { 1094*b077aed3SPierre Pronchery const EVP_PKEY_ASN1_METHOD *ameth; 1095*b077aed3SPierre Pronchery int pkey_id, pkey_base_id, pkey_flags; 1096*b077aed3SPierre Pronchery const char *pinfo, *pem_str; 1097*b077aed3SPierre Pronchery ameth = EVP_PKEY_asn1_get0(i); 1098*b077aed3SPierre Pronchery EVP_PKEY_asn1_get0_info(&pkey_id, &pkey_base_id, &pkey_flags, 1099*b077aed3SPierre Pronchery &pinfo, &pem_str, ameth); 1100*b077aed3SPierre Pronchery if (pkey_flags & ASN1_PKEY_ALIAS) { 1101*b077aed3SPierre Pronchery BIO_printf(bio_out, " Name: %s\n", OBJ_nid2ln(pkey_id)); 1102*b077aed3SPierre Pronchery BIO_printf(bio_out, "\tAlias for: %s\n", 1103*b077aed3SPierre Pronchery OBJ_nid2ln(pkey_base_id)); 1104*b077aed3SPierre Pronchery } else { 1105*b077aed3SPierre Pronchery BIO_printf(bio_out, " Name: %s\n", pinfo); 1106*b077aed3SPierre Pronchery BIO_printf(bio_out, "\tType: %s Algorithm\n", 1107*b077aed3SPierre Pronchery pkey_flags & ASN1_PKEY_DYNAMIC ? 1108*b077aed3SPierre Pronchery "External" : "Builtin"); 1109*b077aed3SPierre Pronchery BIO_printf(bio_out, "\tOID: %s\n", OBJ_nid2ln(pkey_id)); 1110*b077aed3SPierre Pronchery if (pem_str == NULL) 1111*b077aed3SPierre Pronchery pem_str = "(none)"; 1112*b077aed3SPierre Pronchery BIO_printf(bio_out, "\tPEM string: %s\n", pem_str); 1113*b077aed3SPierre Pronchery } 1114*b077aed3SPierre Pronchery } 1115*b077aed3SPierre Pronchery } 1116*b077aed3SPierre Pronchery #endif 1117*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided:\n"); 1118*b077aed3SPierre Pronchery BIO_printf(bio_out, " Key Managers:\n"); 1119*b077aed3SPierre Pronchery list_keymanagers(); 1120*b077aed3SPierre Pronchery } 1121*b077aed3SPierre Pronchery 1122*b077aed3SPierre Pronchery static void list_pkey_meth(void) 1123*b077aed3SPierre Pronchery { 1124*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1125*b077aed3SPierre Pronchery size_t i; 1126*b077aed3SPierre Pronchery size_t meth_count = EVP_PKEY_meth_get_count(); 1127*b077aed3SPierre Pronchery 1128*b077aed3SPierre Pronchery if (select_name == NULL && include_legacy()) { 1129*b077aed3SPierre Pronchery BIO_printf(bio_out, "Legacy:\n"); 1130*b077aed3SPierre Pronchery for (i = 0; i < meth_count; i++) { 1131*b077aed3SPierre Pronchery const EVP_PKEY_METHOD *pmeth = EVP_PKEY_meth_get0(i); 1132*b077aed3SPierre Pronchery int pkey_id, pkey_flags; 1133*b077aed3SPierre Pronchery 1134*b077aed3SPierre Pronchery EVP_PKEY_meth_get0_info(&pkey_id, &pkey_flags, pmeth); 1135*b077aed3SPierre Pronchery BIO_printf(bio_out, " %s\n", OBJ_nid2ln(pkey_id)); 1136*b077aed3SPierre Pronchery BIO_printf(bio_out, "\tType: %s Algorithm\n", 1137*b077aed3SPierre Pronchery pkey_flags & ASN1_PKEY_DYNAMIC ? "External" : "Builtin"); 1138*b077aed3SPierre Pronchery } 1139*b077aed3SPierre Pronchery } 1140*b077aed3SPierre Pronchery #endif 1141*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided:\n"); 1142*b077aed3SPierre Pronchery BIO_printf(bio_out, " Encryption:\n"); 1143*b077aed3SPierre Pronchery list_asymciphers(); 1144*b077aed3SPierre Pronchery BIO_printf(bio_out, " Key Exchange:\n"); 1145*b077aed3SPierre Pronchery list_keyexchanges(); 1146*b077aed3SPierre Pronchery BIO_printf(bio_out, " Signatures:\n"); 1147*b077aed3SPierre Pronchery list_signatures(); 1148*b077aed3SPierre Pronchery BIO_printf(bio_out, " Key encapsulation:\n"); 1149*b077aed3SPierre Pronchery list_kems(); 1150*b077aed3SPierre Pronchery } 1151*b077aed3SPierre Pronchery 1152*b077aed3SPierre Pronchery DEFINE_STACK_OF(OSSL_STORE_LOADER) 1153*b077aed3SPierre Pronchery static int store_cmp(const OSSL_STORE_LOADER * const *a, 1154*b077aed3SPierre Pronchery const OSSL_STORE_LOADER * const *b) 1155*b077aed3SPierre Pronchery { 1156*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(OSSL_STORE_LOADER_get0_provider(*a)), 1157*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(OSSL_STORE_LOADER_get0_provider(*b))); 1158*b077aed3SPierre Pronchery } 1159*b077aed3SPierre Pronchery 1160*b077aed3SPierre Pronchery static void collect_store_loaders(OSSL_STORE_LOADER *store, void *stack) 1161*b077aed3SPierre Pronchery { 1162*b077aed3SPierre Pronchery STACK_OF(OSSL_STORE_LOADER) *store_stack = stack; 1163*b077aed3SPierre Pronchery 1164*b077aed3SPierre Pronchery if (sk_OSSL_STORE_LOADER_push(store_stack, store) > 0) 1165*b077aed3SPierre Pronchery OSSL_STORE_LOADER_up_ref(store); 1166*b077aed3SPierre Pronchery } 1167*b077aed3SPierre Pronchery 1168*b077aed3SPierre Pronchery static void list_store_loaders(void) 1169*b077aed3SPierre Pronchery { 1170*b077aed3SPierre Pronchery STACK_OF(OSSL_STORE_LOADER) *stores = sk_OSSL_STORE_LOADER_new(store_cmp); 1171*b077aed3SPierre Pronchery int i; 1172*b077aed3SPierre Pronchery 1173*b077aed3SPierre Pronchery if (stores == NULL) { 1174*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 1175*b077aed3SPierre Pronchery return; 1176*b077aed3SPierre Pronchery } 1177*b077aed3SPierre Pronchery BIO_printf(bio_out, "Provided STORE LOADERs:\n"); 1178*b077aed3SPierre Pronchery OSSL_STORE_LOADER_do_all_provided(app_get0_libctx(), collect_store_loaders, 1179*b077aed3SPierre Pronchery stores); 1180*b077aed3SPierre Pronchery sk_OSSL_STORE_LOADER_sort(stores); 1181*b077aed3SPierre Pronchery for (i = 0; i < sk_OSSL_STORE_LOADER_num(stores); i++) { 1182*b077aed3SPierre Pronchery const OSSL_STORE_LOADER *m = sk_OSSL_STORE_LOADER_value(stores, i); 1183*b077aed3SPierre Pronchery STACK_OF(OPENSSL_CSTRING) *names = NULL; 1184*b077aed3SPierre Pronchery 1185*b077aed3SPierre Pronchery if (select_name != NULL && !OSSL_STORE_LOADER_is_a(m, select_name)) 1186*b077aed3SPierre Pronchery continue; 1187*b077aed3SPierre Pronchery 1188*b077aed3SPierre Pronchery names = sk_OPENSSL_CSTRING_new(name_cmp); 1189*b077aed3SPierre Pronchery if (names != NULL && OSSL_STORE_LOADER_names_do_all(m, collect_names, 1190*b077aed3SPierre Pronchery names)) { 1191*b077aed3SPierre Pronchery BIO_printf(bio_out, " "); 1192*b077aed3SPierre Pronchery print_names(bio_out, names); 1193*b077aed3SPierre Pronchery 1194*b077aed3SPierre Pronchery BIO_printf(bio_out, " @ %s\n", 1195*b077aed3SPierre Pronchery OSSL_PROVIDER_get0_name(OSSL_STORE_LOADER_get0_provider(m))); 1196*b077aed3SPierre Pronchery } 1197*b077aed3SPierre Pronchery sk_OPENSSL_CSTRING_free(names); 1198*b077aed3SPierre Pronchery } 1199*b077aed3SPierre Pronchery sk_OSSL_STORE_LOADER_pop_free(stores, OSSL_STORE_LOADER_free); 1200*b077aed3SPierre Pronchery } 1201*b077aed3SPierre Pronchery 1202*b077aed3SPierre Pronchery DEFINE_STACK_OF(OSSL_PROVIDER) 1203*b077aed3SPierre Pronchery static int provider_cmp(const OSSL_PROVIDER * const *a, 1204*b077aed3SPierre Pronchery const OSSL_PROVIDER * const *b) 1205*b077aed3SPierre Pronchery { 1206*b077aed3SPierre Pronchery return strcmp(OSSL_PROVIDER_get0_name(*a), OSSL_PROVIDER_get0_name(*b)); 1207*b077aed3SPierre Pronchery } 1208*b077aed3SPierre Pronchery 1209*b077aed3SPierre Pronchery static int collect_providers(OSSL_PROVIDER *provider, void *stack) 1210*b077aed3SPierre Pronchery { 1211*b077aed3SPierre Pronchery STACK_OF(OSSL_PROVIDER) *provider_stack = stack; 1212*b077aed3SPierre Pronchery 1213*b077aed3SPierre Pronchery sk_OSSL_PROVIDER_push(provider_stack, provider); 1214*b077aed3SPierre Pronchery return 1; 1215*b077aed3SPierre Pronchery } 1216*b077aed3SPierre Pronchery 1217*b077aed3SPierre Pronchery static void list_provider_info(void) 1218*b077aed3SPierre Pronchery { 1219*b077aed3SPierre Pronchery STACK_OF(OSSL_PROVIDER) *providers = sk_OSSL_PROVIDER_new(provider_cmp); 1220*b077aed3SPierre Pronchery OSSL_PARAM params[5]; 1221*b077aed3SPierre Pronchery char *name, *version, *buildinfo; 1222*b077aed3SPierre Pronchery int status; 1223*b077aed3SPierre Pronchery int i; 1224*b077aed3SPierre Pronchery 1225*b077aed3SPierre Pronchery if (providers == NULL) { 1226*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Memory allocation\n"); 1227*b077aed3SPierre Pronchery return; 1228*b077aed3SPierre Pronchery } 1229*b077aed3SPierre Pronchery BIO_printf(bio_out, "Providers:\n"); 1230*b077aed3SPierre Pronchery OSSL_PROVIDER_do_all(NULL, &collect_providers, providers); 1231*b077aed3SPierre Pronchery sk_OSSL_PROVIDER_sort(providers); 1232*b077aed3SPierre Pronchery for (i = 0; i < sk_OSSL_PROVIDER_num(providers); i++) { 1233*b077aed3SPierre Pronchery const OSSL_PROVIDER *prov = sk_OSSL_PROVIDER_value(providers, i); 1234*b077aed3SPierre Pronchery 1235*b077aed3SPierre Pronchery /* Query the "known" information parameters, the order matches below */ 1236*b077aed3SPierre Pronchery params[0] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_NAME, 1237*b077aed3SPierre Pronchery &name, 0); 1238*b077aed3SPierre Pronchery params[1] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_VERSION, 1239*b077aed3SPierre Pronchery &version, 0); 1240*b077aed3SPierre Pronchery params[2] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_STATUS, &status); 1241*b077aed3SPierre Pronchery params[3] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_BUILDINFO, 1242*b077aed3SPierre Pronchery &buildinfo, 0); 1243*b077aed3SPierre Pronchery params[4] = OSSL_PARAM_construct_end(); 1244*b077aed3SPierre Pronchery OSSL_PARAM_set_all_unmodified(params); 1245*b077aed3SPierre Pronchery if (!OSSL_PROVIDER_get_params(prov, params)) { 1246*b077aed3SPierre Pronchery BIO_printf(bio_err, "ERROR: Unable to query provider parameters\n"); 1247*b077aed3SPierre Pronchery return; 1248*b077aed3SPierre Pronchery } 1249*b077aed3SPierre Pronchery 1250*b077aed3SPierre Pronchery /* Print out the provider information, the params order matches above */ 1251*b077aed3SPierre Pronchery BIO_printf(bio_out, " %s\n", OSSL_PROVIDER_get0_name(prov)); 1252*b077aed3SPierre Pronchery if (OSSL_PARAM_modified(params)) 1253*b077aed3SPierre Pronchery BIO_printf(bio_out, " name: %s\n", name); 1254*b077aed3SPierre Pronchery if (OSSL_PARAM_modified(params + 1)) 1255*b077aed3SPierre Pronchery BIO_printf(bio_out, " version: %s\n", version); 1256*b077aed3SPierre Pronchery if (OSSL_PARAM_modified(params + 2)) 1257*b077aed3SPierre Pronchery BIO_printf(bio_out, " status: %sactive\n", status ? "" : "in"); 1258*b077aed3SPierre Pronchery if (verbose) { 1259*b077aed3SPierre Pronchery if (OSSL_PARAM_modified(params + 3)) 1260*b077aed3SPierre Pronchery BIO_printf(bio_out, " build info: %s\n", buildinfo); 1261*b077aed3SPierre Pronchery print_param_types("gettable provider parameters", 1262*b077aed3SPierre Pronchery OSSL_PROVIDER_gettable_params(prov), 4); 1263*b077aed3SPierre Pronchery } 1264*b077aed3SPierre Pronchery } 1265*b077aed3SPierre Pronchery sk_OSSL_PROVIDER_free(providers); 1266*b077aed3SPierre Pronchery } 1267*b077aed3SPierre Pronchery 1268*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1269*b077aed3SPierre Pronchery static void list_engines(void) 1270*b077aed3SPierre Pronchery { 1271*b077aed3SPierre Pronchery # ifndef OPENSSL_NO_ENGINE 1272*b077aed3SPierre Pronchery ENGINE *e; 1273*b077aed3SPierre Pronchery 1274*b077aed3SPierre Pronchery BIO_puts(bio_out, "Engines:\n"); 1275*b077aed3SPierre Pronchery e = ENGINE_get_first(); 1276*b077aed3SPierre Pronchery while (e) { 1277*b077aed3SPierre Pronchery BIO_printf(bio_out, "%s\n", ENGINE_get_id(e)); 1278*b077aed3SPierre Pronchery e = ENGINE_get_next(e); 1279*b077aed3SPierre Pronchery } 1280*b077aed3SPierre Pronchery # else 1281*b077aed3SPierre Pronchery BIO_puts(bio_out, "Engine support is disabled.\n"); 1282*b077aed3SPierre Pronchery # endif 1283*b077aed3SPierre Pronchery } 1284*b077aed3SPierre Pronchery #endif 1285*b077aed3SPierre Pronchery 1286*b077aed3SPierre Pronchery static void list_disabled(void) 1287*b077aed3SPierre Pronchery { 1288*b077aed3SPierre Pronchery BIO_puts(bio_out, "Disabled algorithms:\n"); 1289*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_ARIA 1290*b077aed3SPierre Pronchery BIO_puts(bio_out, "ARIA\n"); 1291*b077aed3SPierre Pronchery #endif 1292*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_BF 1293*b077aed3SPierre Pronchery BIO_puts(bio_out, "BF\n"); 1294*b077aed3SPierre Pronchery #endif 1295*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_BLAKE2 1296*b077aed3SPierre Pronchery BIO_puts(bio_out, "BLAKE2\n"); 1297*b077aed3SPierre Pronchery #endif 1298*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_CAMELLIA 1299*b077aed3SPierre Pronchery BIO_puts(bio_out, "CAMELLIA\n"); 1300*b077aed3SPierre Pronchery #endif 1301*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_CAST 1302*b077aed3SPierre Pronchery BIO_puts(bio_out, "CAST\n"); 1303*b077aed3SPierre Pronchery #endif 1304*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_CMAC 1305*b077aed3SPierre Pronchery BIO_puts(bio_out, "CMAC\n"); 1306*b077aed3SPierre Pronchery #endif 1307*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_CMS 1308*b077aed3SPierre Pronchery BIO_puts(bio_out, "CMS\n"); 1309*b077aed3SPierre Pronchery #endif 1310*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_COMP 1311*b077aed3SPierre Pronchery BIO_puts(bio_out, "COMP\n"); 1312*b077aed3SPierre Pronchery #endif 1313*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_DES 1314*b077aed3SPierre Pronchery BIO_puts(bio_out, "DES\n"); 1315*b077aed3SPierre Pronchery #endif 1316*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_DGRAM 1317*b077aed3SPierre Pronchery BIO_puts(bio_out, "DGRAM\n"); 1318*b077aed3SPierre Pronchery #endif 1319*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_DH 1320*b077aed3SPierre Pronchery BIO_puts(bio_out, "DH\n"); 1321*b077aed3SPierre Pronchery #endif 1322*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_DSA 1323*b077aed3SPierre Pronchery BIO_puts(bio_out, "DSA\n"); 1324*b077aed3SPierre Pronchery #endif 1325*b077aed3SPierre Pronchery #if defined(OPENSSL_NO_DTLS) 1326*b077aed3SPierre Pronchery BIO_puts(bio_out, "DTLS\n"); 1327*b077aed3SPierre Pronchery #endif 1328*b077aed3SPierre Pronchery #if defined(OPENSSL_NO_DTLS1) 1329*b077aed3SPierre Pronchery BIO_puts(bio_out, "DTLS1\n"); 1330*b077aed3SPierre Pronchery #endif 1331*b077aed3SPierre Pronchery #if defined(OPENSSL_NO_DTLS1_2) 1332*b077aed3SPierre Pronchery BIO_puts(bio_out, "DTLS1_2\n"); 1333*b077aed3SPierre Pronchery #endif 1334*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_EC 1335*b077aed3SPierre Pronchery BIO_puts(bio_out, "EC\n"); 1336*b077aed3SPierre Pronchery #endif 1337*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_EC2M 1338*b077aed3SPierre Pronchery BIO_puts(bio_out, "EC2M\n"); 1339*b077aed3SPierre Pronchery #endif 1340*b077aed3SPierre Pronchery #if defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0) 1341*b077aed3SPierre Pronchery BIO_puts(bio_out, "ENGINE\n"); 1342*b077aed3SPierre Pronchery #endif 1343*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_GOST 1344*b077aed3SPierre Pronchery BIO_puts(bio_out, "GOST\n"); 1345*b077aed3SPierre Pronchery #endif 1346*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_IDEA 1347*b077aed3SPierre Pronchery BIO_puts(bio_out, "IDEA\n"); 1348*b077aed3SPierre Pronchery #endif 1349*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_MD2 1350*b077aed3SPierre Pronchery BIO_puts(bio_out, "MD2\n"); 1351*b077aed3SPierre Pronchery #endif 1352*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_MD4 1353*b077aed3SPierre Pronchery BIO_puts(bio_out, "MD4\n"); 1354*b077aed3SPierre Pronchery #endif 1355*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_MD5 1356*b077aed3SPierre Pronchery BIO_puts(bio_out, "MD5\n"); 1357*b077aed3SPierre Pronchery #endif 1358*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_MDC2 1359*b077aed3SPierre Pronchery BIO_puts(bio_out, "MDC2\n"); 1360*b077aed3SPierre Pronchery #endif 1361*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_OCB 1362*b077aed3SPierre Pronchery BIO_puts(bio_out, "OCB\n"); 1363*b077aed3SPierre Pronchery #endif 1364*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_OCSP 1365*b077aed3SPierre Pronchery BIO_puts(bio_out, "OCSP\n"); 1366*b077aed3SPierre Pronchery #endif 1367*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_PSK 1368*b077aed3SPierre Pronchery BIO_puts(bio_out, "PSK\n"); 1369*b077aed3SPierre Pronchery #endif 1370*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_RC2 1371*b077aed3SPierre Pronchery BIO_puts(bio_out, "RC2\n"); 1372*b077aed3SPierre Pronchery #endif 1373*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_RC4 1374*b077aed3SPierre Pronchery BIO_puts(bio_out, "RC4\n"); 1375*b077aed3SPierre Pronchery #endif 1376*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_RC5 1377*b077aed3SPierre Pronchery BIO_puts(bio_out, "RC5\n"); 1378*b077aed3SPierre Pronchery #endif 1379*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_RMD160 1380*b077aed3SPierre Pronchery BIO_puts(bio_out, "RMD160\n"); 1381*b077aed3SPierre Pronchery #endif 1382*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SCRYPT 1383*b077aed3SPierre Pronchery BIO_puts(bio_out, "SCRYPT\n"); 1384*b077aed3SPierre Pronchery #endif 1385*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SCTP 1386*b077aed3SPierre Pronchery BIO_puts(bio_out, "SCTP\n"); 1387*b077aed3SPierre Pronchery #endif 1388*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SEED 1389*b077aed3SPierre Pronchery BIO_puts(bio_out, "SEED\n"); 1390*b077aed3SPierre Pronchery #endif 1391*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SM2 1392*b077aed3SPierre Pronchery BIO_puts(bio_out, "SM2\n"); 1393*b077aed3SPierre Pronchery #endif 1394*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SM3 1395*b077aed3SPierre Pronchery BIO_puts(bio_out, "SM3\n"); 1396*b077aed3SPierre Pronchery #endif 1397*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SM4 1398*b077aed3SPierre Pronchery BIO_puts(bio_out, "SM4\n"); 1399*b077aed3SPierre Pronchery #endif 1400*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SOCK 1401*b077aed3SPierre Pronchery BIO_puts(bio_out, "SOCK\n"); 1402*b077aed3SPierre Pronchery #endif 1403*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SRP 1404*b077aed3SPierre Pronchery BIO_puts(bio_out, "SRP\n"); 1405*b077aed3SPierre Pronchery #endif 1406*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SRTP 1407*b077aed3SPierre Pronchery BIO_puts(bio_out, "SRTP\n"); 1408*b077aed3SPierre Pronchery #endif 1409*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_SSL3 1410*b077aed3SPierre Pronchery BIO_puts(bio_out, "SSL3\n"); 1411*b077aed3SPierre Pronchery #endif 1412*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_TLS1 1413*b077aed3SPierre Pronchery BIO_puts(bio_out, "TLS1\n"); 1414*b077aed3SPierre Pronchery #endif 1415*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_TLS1_1 1416*b077aed3SPierre Pronchery BIO_puts(bio_out, "TLS1_1\n"); 1417*b077aed3SPierre Pronchery #endif 1418*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_TLS1_2 1419*b077aed3SPierre Pronchery BIO_puts(bio_out, "TLS1_2\n"); 1420*b077aed3SPierre Pronchery #endif 1421*b077aed3SPierre Pronchery #ifdef OPENSSL_NO_WHIRLPOOL 1422*b077aed3SPierre Pronchery BIO_puts(bio_out, "WHIRLPOOL\n"); 1423*b077aed3SPierre Pronchery #endif 1424*b077aed3SPierre Pronchery #ifndef ZLIB 1425*b077aed3SPierre Pronchery BIO_puts(bio_out, "ZLIB\n"); 1426*b077aed3SPierre Pronchery #endif 1427*b077aed3SPierre Pronchery } 1428*b077aed3SPierre Pronchery 1429*b077aed3SPierre Pronchery /* Unified enum for help and list commands. */ 1430*b077aed3SPierre Pronchery typedef enum HELPLIST_CHOICE { 1431*b077aed3SPierre Pronchery OPT_COMMON, 1432*b077aed3SPierre Pronchery OPT_ONE, OPT_VERBOSE, 1433*b077aed3SPierre Pronchery OPT_COMMANDS, OPT_DIGEST_COMMANDS, OPT_MAC_ALGORITHMS, OPT_OPTIONS, 1434*b077aed3SPierre Pronchery OPT_DIGEST_ALGORITHMS, OPT_CIPHER_COMMANDS, OPT_CIPHER_ALGORITHMS, 1435*b077aed3SPierre Pronchery OPT_PK_ALGORITHMS, OPT_PK_METHOD, OPT_DISABLED, 1436*b077aed3SPierre Pronchery OPT_KDF_ALGORITHMS, OPT_RANDOM_INSTANCES, OPT_RANDOM_GENERATORS, 1437*b077aed3SPierre Pronchery OPT_ENCODERS, OPT_DECODERS, OPT_KEYMANAGERS, OPT_KEYEXCHANGE_ALGORITHMS, 1438*b077aed3SPierre Pronchery OPT_KEM_ALGORITHMS, OPT_SIGNATURE_ALGORITHMS, OPT_ASYM_CIPHER_ALGORITHMS, 1439*b077aed3SPierre Pronchery OPT_STORE_LOADERS, OPT_PROVIDER_INFO, 1440*b077aed3SPierre Pronchery OPT_OBJECTS, OPT_SELECT_NAME, 1441*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1442*b077aed3SPierre Pronchery OPT_ENGINES, 1443*b077aed3SPierre Pronchery #endif 1444*b077aed3SPierre Pronchery OPT_PROV_ENUM 1445*b077aed3SPierre Pronchery } HELPLIST_CHOICE; 1446*b077aed3SPierre Pronchery 1447*b077aed3SPierre Pronchery const OPTIONS list_options[] = { 1448*b077aed3SPierre Pronchery 1449*b077aed3SPierre Pronchery OPT_SECTION("General"), 1450*b077aed3SPierre Pronchery {"help", OPT_HELP, '-', "Display this summary"}, 1451*b077aed3SPierre Pronchery 1452*b077aed3SPierre Pronchery OPT_SECTION("Output"), 1453*b077aed3SPierre Pronchery {"1", OPT_ONE, '-', "List in one column"}, 1454*b077aed3SPierre Pronchery {"verbose", OPT_VERBOSE, '-', "Verbose listing"}, 1455*b077aed3SPierre Pronchery {"select", OPT_SELECT_NAME, 's', "Select a single algorithm"}, 1456*b077aed3SPierre Pronchery {"commands", OPT_COMMANDS, '-', "List of standard commands"}, 1457*b077aed3SPierre Pronchery {"standard-commands", OPT_COMMANDS, '-', "List of standard commands"}, 1458*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1459*b077aed3SPierre Pronchery {"digest-commands", OPT_DIGEST_COMMANDS, '-', 1460*b077aed3SPierre Pronchery "List of message digest commands (deprecated)"}, 1461*b077aed3SPierre Pronchery #endif 1462*b077aed3SPierre Pronchery {"digest-algorithms", OPT_DIGEST_ALGORITHMS, '-', 1463*b077aed3SPierre Pronchery "List of message digest algorithms"}, 1464*b077aed3SPierre Pronchery {"kdf-algorithms", OPT_KDF_ALGORITHMS, '-', 1465*b077aed3SPierre Pronchery "List of key derivation and pseudo random function algorithms"}, 1466*b077aed3SPierre Pronchery {"random-instances", OPT_RANDOM_INSTANCES, '-', 1467*b077aed3SPierre Pronchery "List the primary, public and private random number generator details"}, 1468*b077aed3SPierre Pronchery {"random-generators", OPT_RANDOM_GENERATORS, '-', 1469*b077aed3SPierre Pronchery "List of random number generators"}, 1470*b077aed3SPierre Pronchery {"mac-algorithms", OPT_MAC_ALGORITHMS, '-', 1471*b077aed3SPierre Pronchery "List of message authentication code algorithms"}, 1472*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1473*b077aed3SPierre Pronchery {"cipher-commands", OPT_CIPHER_COMMANDS, '-', 1474*b077aed3SPierre Pronchery "List of cipher commands (deprecated)"}, 1475*b077aed3SPierre Pronchery #endif 1476*b077aed3SPierre Pronchery {"cipher-algorithms", OPT_CIPHER_ALGORITHMS, '-', 1477*b077aed3SPierre Pronchery "List of symmetric cipher algorithms"}, 1478*b077aed3SPierre Pronchery {"encoders", OPT_ENCODERS, '-', "List of encoding methods" }, 1479*b077aed3SPierre Pronchery {"decoders", OPT_DECODERS, '-', "List of decoding methods" }, 1480*b077aed3SPierre Pronchery {"key-managers", OPT_KEYMANAGERS, '-', "List of key managers" }, 1481*b077aed3SPierre Pronchery {"key-exchange-algorithms", OPT_KEYEXCHANGE_ALGORITHMS, '-', 1482*b077aed3SPierre Pronchery "List of key exchange algorithms" }, 1483*b077aed3SPierre Pronchery {"kem-algorithms", OPT_KEM_ALGORITHMS, '-', 1484*b077aed3SPierre Pronchery "List of key encapsulation mechanism algorithms" }, 1485*b077aed3SPierre Pronchery {"signature-algorithms", OPT_SIGNATURE_ALGORITHMS, '-', 1486*b077aed3SPierre Pronchery "List of signature algorithms" }, 1487*b077aed3SPierre Pronchery {"asymcipher-algorithms", OPT_ASYM_CIPHER_ALGORITHMS, '-', 1488*b077aed3SPierre Pronchery "List of asymmetric cipher algorithms" }, 1489*b077aed3SPierre Pronchery {"public-key-algorithms", OPT_PK_ALGORITHMS, '-', 1490*b077aed3SPierre Pronchery "List of public key algorithms"}, 1491*b077aed3SPierre Pronchery {"public-key-methods", OPT_PK_METHOD, '-', 1492*b077aed3SPierre Pronchery "List of public key methods"}, 1493*b077aed3SPierre Pronchery {"store-loaders", OPT_STORE_LOADERS, '-', 1494*b077aed3SPierre Pronchery "List of store loaders"}, 1495*b077aed3SPierre Pronchery {"providers", OPT_PROVIDER_INFO, '-', 1496*b077aed3SPierre Pronchery "List of provider information"}, 1497*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1498*b077aed3SPierre Pronchery {"engines", OPT_ENGINES, '-', 1499*b077aed3SPierre Pronchery "List of loaded engines"}, 1500*b077aed3SPierre Pronchery #endif 1501*b077aed3SPierre Pronchery {"disabled", OPT_DISABLED, '-', "List of disabled features"}, 1502*b077aed3SPierre Pronchery {"options", OPT_OPTIONS, 's', 1503*b077aed3SPierre Pronchery "List options for specified command"}, 1504*b077aed3SPierre Pronchery {"objects", OPT_OBJECTS, '-', 1505*b077aed3SPierre Pronchery "List built in objects (OID<->name mappings)"}, 1506*b077aed3SPierre Pronchery 1507*b077aed3SPierre Pronchery OPT_PROV_OPTIONS, 1508*b077aed3SPierre Pronchery {NULL} 1509*b077aed3SPierre Pronchery }; 1510*b077aed3SPierre Pronchery 1511*b077aed3SPierre Pronchery int list_main(int argc, char **argv) 1512*b077aed3SPierre Pronchery { 1513*b077aed3SPierre Pronchery char *prog; 1514*b077aed3SPierre Pronchery HELPLIST_CHOICE o; 1515*b077aed3SPierre Pronchery int one = 0, done = 0; 1516*b077aed3SPierre Pronchery struct { 1517*b077aed3SPierre Pronchery unsigned int commands:1; 1518*b077aed3SPierre Pronchery unsigned int random_instances:1; 1519*b077aed3SPierre Pronchery unsigned int random_generators:1; 1520*b077aed3SPierre Pronchery unsigned int digest_commands:1; 1521*b077aed3SPierre Pronchery unsigned int digest_algorithms:1; 1522*b077aed3SPierre Pronchery unsigned int kdf_algorithms:1; 1523*b077aed3SPierre Pronchery unsigned int mac_algorithms:1; 1524*b077aed3SPierre Pronchery unsigned int cipher_commands:1; 1525*b077aed3SPierre Pronchery unsigned int cipher_algorithms:1; 1526*b077aed3SPierre Pronchery unsigned int encoder_algorithms:1; 1527*b077aed3SPierre Pronchery unsigned int decoder_algorithms:1; 1528*b077aed3SPierre Pronchery unsigned int keymanager_algorithms:1; 1529*b077aed3SPierre Pronchery unsigned int signature_algorithms:1; 1530*b077aed3SPierre Pronchery unsigned int keyexchange_algorithms:1; 1531*b077aed3SPierre Pronchery unsigned int kem_algorithms:1; 1532*b077aed3SPierre Pronchery unsigned int asym_cipher_algorithms:1; 1533*b077aed3SPierre Pronchery unsigned int pk_algorithms:1; 1534*b077aed3SPierre Pronchery unsigned int pk_method:1; 1535*b077aed3SPierre Pronchery unsigned int store_loaders:1; 1536*b077aed3SPierre Pronchery unsigned int provider_info:1; 1537*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1538*b077aed3SPierre Pronchery unsigned int engines:1; 1539*b077aed3SPierre Pronchery #endif 1540*b077aed3SPierre Pronchery unsigned int disabled:1; 1541*b077aed3SPierre Pronchery unsigned int objects:1; 1542*b077aed3SPierre Pronchery unsigned int options:1; 1543*b077aed3SPierre Pronchery } todo = { 0, }; 1544*b077aed3SPierre Pronchery 1545*b077aed3SPierre Pronchery verbose = 0; /* Clear a possible previous call */ 1546*b077aed3SPierre Pronchery 1547*b077aed3SPierre Pronchery prog = opt_init(argc, argv, list_options); 1548*b077aed3SPierre Pronchery while ((o = opt_next()) != OPT_EOF) { 1549*b077aed3SPierre Pronchery switch (o) { 1550*b077aed3SPierre Pronchery case OPT_EOF: /* Never hit, but suppresses warning */ 1551*b077aed3SPierre Pronchery case OPT_ERR: 1552*b077aed3SPierre Pronchery opthelp: 1553*b077aed3SPierre Pronchery BIO_printf(bio_err, "%s: Use -help for summary.\n", prog); 1554*b077aed3SPierre Pronchery return 1; 1555*b077aed3SPierre Pronchery case OPT_HELP: 1556*b077aed3SPierre Pronchery opt_help(list_options); 1557*b077aed3SPierre Pronchery return 0; 1558*b077aed3SPierre Pronchery case OPT_ONE: 1559*b077aed3SPierre Pronchery one = 1; 1560*b077aed3SPierre Pronchery break; 1561*b077aed3SPierre Pronchery case OPT_COMMANDS: 1562*b077aed3SPierre Pronchery todo.commands = 1; 1563*b077aed3SPierre Pronchery break; 1564*b077aed3SPierre Pronchery case OPT_DIGEST_COMMANDS: 1565*b077aed3SPierre Pronchery todo.digest_commands = 1; 1566*b077aed3SPierre Pronchery break; 1567*b077aed3SPierre Pronchery case OPT_DIGEST_ALGORITHMS: 1568*b077aed3SPierre Pronchery todo.digest_algorithms = 1; 1569*b077aed3SPierre Pronchery break; 1570*b077aed3SPierre Pronchery case OPT_KDF_ALGORITHMS: 1571*b077aed3SPierre Pronchery todo.kdf_algorithms = 1; 1572*b077aed3SPierre Pronchery break; 1573*b077aed3SPierre Pronchery case OPT_RANDOM_INSTANCES: 1574*b077aed3SPierre Pronchery todo.random_instances = 1; 1575*b077aed3SPierre Pronchery break; 1576*b077aed3SPierre Pronchery case OPT_RANDOM_GENERATORS: 1577*b077aed3SPierre Pronchery todo.random_generators = 1; 1578*b077aed3SPierre Pronchery break; 1579*b077aed3SPierre Pronchery case OPT_MAC_ALGORITHMS: 1580*b077aed3SPierre Pronchery todo.mac_algorithms = 1; 1581*b077aed3SPierre Pronchery break; 1582*b077aed3SPierre Pronchery case OPT_CIPHER_COMMANDS: 1583*b077aed3SPierre Pronchery todo.cipher_commands = 1; 1584*b077aed3SPierre Pronchery break; 1585*b077aed3SPierre Pronchery case OPT_CIPHER_ALGORITHMS: 1586*b077aed3SPierre Pronchery todo.cipher_algorithms = 1; 1587*b077aed3SPierre Pronchery break; 1588*b077aed3SPierre Pronchery case OPT_ENCODERS: 1589*b077aed3SPierre Pronchery todo.encoder_algorithms = 1; 1590*b077aed3SPierre Pronchery break; 1591*b077aed3SPierre Pronchery case OPT_DECODERS: 1592*b077aed3SPierre Pronchery todo.decoder_algorithms = 1; 1593*b077aed3SPierre Pronchery break; 1594*b077aed3SPierre Pronchery case OPT_KEYMANAGERS: 1595*b077aed3SPierre Pronchery todo.keymanager_algorithms = 1; 1596*b077aed3SPierre Pronchery break; 1597*b077aed3SPierre Pronchery case OPT_SIGNATURE_ALGORITHMS: 1598*b077aed3SPierre Pronchery todo.signature_algorithms = 1; 1599*b077aed3SPierre Pronchery break; 1600*b077aed3SPierre Pronchery case OPT_KEYEXCHANGE_ALGORITHMS: 1601*b077aed3SPierre Pronchery todo.keyexchange_algorithms = 1; 1602*b077aed3SPierre Pronchery break; 1603*b077aed3SPierre Pronchery case OPT_KEM_ALGORITHMS: 1604*b077aed3SPierre Pronchery todo.kem_algorithms = 1; 1605*b077aed3SPierre Pronchery break; 1606*b077aed3SPierre Pronchery case OPT_ASYM_CIPHER_ALGORITHMS: 1607*b077aed3SPierre Pronchery todo.asym_cipher_algorithms = 1; 1608*b077aed3SPierre Pronchery break; 1609*b077aed3SPierre Pronchery case OPT_PK_ALGORITHMS: 1610*b077aed3SPierre Pronchery todo.pk_algorithms = 1; 1611*b077aed3SPierre Pronchery break; 1612*b077aed3SPierre Pronchery case OPT_PK_METHOD: 1613*b077aed3SPierre Pronchery todo.pk_method = 1; 1614*b077aed3SPierre Pronchery break; 1615*b077aed3SPierre Pronchery case OPT_STORE_LOADERS: 1616*b077aed3SPierre Pronchery todo.store_loaders = 1; 1617*b077aed3SPierre Pronchery break; 1618*b077aed3SPierre Pronchery case OPT_PROVIDER_INFO: 1619*b077aed3SPierre Pronchery todo.provider_info = 1; 1620*b077aed3SPierre Pronchery break; 1621*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1622*b077aed3SPierre Pronchery case OPT_ENGINES: 1623*b077aed3SPierre Pronchery todo.engines = 1; 1624*b077aed3SPierre Pronchery break; 1625*b077aed3SPierre Pronchery #endif 1626*b077aed3SPierre Pronchery case OPT_DISABLED: 1627*b077aed3SPierre Pronchery todo.disabled = 1; 1628*b077aed3SPierre Pronchery break; 1629*b077aed3SPierre Pronchery case OPT_OBJECTS: 1630*b077aed3SPierre Pronchery todo.objects = 1; 1631*b077aed3SPierre Pronchery break; 1632*b077aed3SPierre Pronchery case OPT_OPTIONS: 1633*b077aed3SPierre Pronchery list_options_for_command(opt_arg()); 1634*b077aed3SPierre Pronchery break; 1635*b077aed3SPierre Pronchery case OPT_VERBOSE: 1636*b077aed3SPierre Pronchery verbose = 1; 1637*b077aed3SPierre Pronchery break; 1638*b077aed3SPierre Pronchery case OPT_SELECT_NAME: 1639*b077aed3SPierre Pronchery select_name = opt_arg(); 1640*b077aed3SPierre Pronchery break; 1641*b077aed3SPierre Pronchery case OPT_PROV_CASES: 1642*b077aed3SPierre Pronchery if (!opt_provider(o)) 1643*b077aed3SPierre Pronchery return 1; 1644*b077aed3SPierre Pronchery break; 1645*b077aed3SPierre Pronchery } 1646*b077aed3SPierre Pronchery done = 1; 1647*b077aed3SPierre Pronchery } 1648*b077aed3SPierre Pronchery 1649*b077aed3SPierre Pronchery /* No extra arguments. */ 1650*b077aed3SPierre Pronchery if (opt_num_rest() != 0) 1651*b077aed3SPierre Pronchery goto opthelp; 1652*b077aed3SPierre Pronchery 1653*b077aed3SPierre Pronchery if (todo.commands) 1654*b077aed3SPierre Pronchery list_type(FT_general, one); 1655*b077aed3SPierre Pronchery if (todo.random_instances) 1656*b077aed3SPierre Pronchery list_random_instances(); 1657*b077aed3SPierre Pronchery if (todo.random_generators) 1658*b077aed3SPierre Pronchery list_random_generators(); 1659*b077aed3SPierre Pronchery if (todo.digest_commands) 1660*b077aed3SPierre Pronchery list_type(FT_md, one); 1661*b077aed3SPierre Pronchery if (todo.digest_algorithms) 1662*b077aed3SPierre Pronchery list_digests(); 1663*b077aed3SPierre Pronchery if (todo.kdf_algorithms) 1664*b077aed3SPierre Pronchery list_kdfs(); 1665*b077aed3SPierre Pronchery if (todo.mac_algorithms) 1666*b077aed3SPierre Pronchery list_macs(); 1667*b077aed3SPierre Pronchery if (todo.cipher_commands) 1668*b077aed3SPierre Pronchery list_type(FT_cipher, one); 1669*b077aed3SPierre Pronchery if (todo.cipher_algorithms) 1670*b077aed3SPierre Pronchery list_ciphers(); 1671*b077aed3SPierre Pronchery if (todo.encoder_algorithms) 1672*b077aed3SPierre Pronchery list_encoders(); 1673*b077aed3SPierre Pronchery if (todo.decoder_algorithms) 1674*b077aed3SPierre Pronchery list_decoders(); 1675*b077aed3SPierre Pronchery if (todo.keymanager_algorithms) 1676*b077aed3SPierre Pronchery list_keymanagers(); 1677*b077aed3SPierre Pronchery if (todo.signature_algorithms) 1678*b077aed3SPierre Pronchery list_signatures(); 1679*b077aed3SPierre Pronchery if (todo.asym_cipher_algorithms) 1680*b077aed3SPierre Pronchery list_asymciphers(); 1681*b077aed3SPierre Pronchery if (todo.keyexchange_algorithms) 1682*b077aed3SPierre Pronchery list_keyexchanges(); 1683*b077aed3SPierre Pronchery if (todo.kem_algorithms) 1684*b077aed3SPierre Pronchery list_kems(); 1685*b077aed3SPierre Pronchery if (todo.pk_algorithms) 1686*b077aed3SPierre Pronchery list_pkey(); 1687*b077aed3SPierre Pronchery if (todo.pk_method) 1688*b077aed3SPierre Pronchery list_pkey_meth(); 1689*b077aed3SPierre Pronchery if (todo.store_loaders) 1690*b077aed3SPierre Pronchery list_store_loaders(); 1691*b077aed3SPierre Pronchery if (todo.provider_info) 1692*b077aed3SPierre Pronchery list_provider_info(); 1693*b077aed3SPierre Pronchery #ifndef OPENSSL_NO_DEPRECATED_3_0 1694*b077aed3SPierre Pronchery if (todo.engines) 1695*b077aed3SPierre Pronchery list_engines(); 1696*b077aed3SPierre Pronchery #endif 1697*b077aed3SPierre Pronchery if (todo.disabled) 1698*b077aed3SPierre Pronchery list_disabled(); 1699*b077aed3SPierre Pronchery if (todo.objects) 1700*b077aed3SPierre Pronchery list_objects(); 1701*b077aed3SPierre Pronchery 1702*b077aed3SPierre Pronchery if (!done) 1703*b077aed3SPierre Pronchery goto opthelp; 1704*b077aed3SPierre Pronchery 1705*b077aed3SPierre Pronchery return 0; 1706*b077aed3SPierre Pronchery } 1707