2 * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 /* We need to use some deprecated APIs */
11 #define OPENSSL_SUPPRESS_DEPRECATED
14 #include <openssl/evp.h>
15 #include <openssl/err.h>
16 #include <openssl/provider.h>
17 #include <openssl/safestack.h>
18 #include <openssl/kdf.h>
19 #include <openssl/encoder.h>
20 #include <openssl/decoder.h>
21 #include <openssl/store.h>
22 #include <openssl/core_names.h>
23 #include <openssl/rand.h>
25 #include "app_params.h"
30 static int verbose = 0;
31 static const char *select_name = NULL;
33 /* Checks to see if algorithms are fetchable */
34 #define IS_FETCHABLE(type, TYPE) \
35 static int is_ ## type ## _fetchable(const TYPE *alg) \
38 const char *propq = app_get0_propq(); \
39 const char *name = TYPE ## _get0_name(alg); \
42 impl = TYPE ## _fetch(NULL, name, propq); \
46 TYPE ## _free(impl); \
49 IS_FETCHABLE(cipher, EVP_CIPHER)
50 IS_FETCHABLE(digest, EVP_MD)
51 IS_FETCHABLE(mac, EVP_MAC)
52 IS_FETCHABLE(kdf, EVP_KDF)
53 IS_FETCHABLE(rand, EVP_RAND)
54 IS_FETCHABLE(keymgmt, EVP_KEYMGMT)
55 IS_FETCHABLE(signature, EVP_SIGNATURE)
56 IS_FETCHABLE(kem, EVP_KEM)
57 IS_FETCHABLE(asym_cipher, EVP_ASYM_CIPHER)
58 IS_FETCHABLE(keyexch, EVP_KEYEXCH)
59 IS_FETCHABLE(decoder, OSSL_DECODER)
60 IS_FETCHABLE(encoder, OSSL_ENCODER)
62 #ifndef OPENSSL_NO_DEPRECATED_3_0
63 static int include_legacy(void)
65 return app_get0_propq() == NULL;
68 static void legacy_cipher_fn(const EVP_CIPHER *c,
69 const char *from, const char *to, void *arg)
71 if (select_name != NULL
73 || strcasecmp(select_name, EVP_CIPHER_get0_name(c)) != 0))
76 BIO_printf(arg, " %s\n", EVP_CIPHER_get0_name(c));
82 BIO_printf(arg, " %s => %s\n", from, to);
87 DEFINE_STACK_OF(EVP_CIPHER)
88 static int cipher_cmp(const EVP_CIPHER * const *a,
89 const EVP_CIPHER * const *b)
91 int ret = EVP_CIPHER_get_number(*a) - EVP_CIPHER_get_number(*b);
94 ret = strcmp(OSSL_PROVIDER_name(EVP_CIPHER_get0_provider(*a)),
95 OSSL_PROVIDER_name(EVP_CIPHER_get0_provider(*b)));
100 static void collect_ciphers(EVP_CIPHER *cipher, void *stack)
102 STACK_OF(EVP_CIPHER) *cipher_stack = stack;
104 if (is_cipher_fetchable(cipher)
105 && sk_EVP_CIPHER_push(cipher_stack, cipher) > 0)
106 EVP_CIPHER_up_ref(cipher);
109 static void list_ciphers(void)
111 STACK_OF(EVP_CIPHER) *ciphers = sk_EVP_CIPHER_new(cipher_cmp);
114 if (ciphers == NULL) {
115 BIO_printf(bio_err, "ERROR: Memory allocation\n");
118 #ifndef OPENSSL_NO_DEPRECATED_3_0
119 if (include_legacy()) {
120 BIO_printf(bio_out, "Legacy:\n");
121 EVP_CIPHER_do_all_sorted(legacy_cipher_fn, bio_out);
125 BIO_printf(bio_out, "Provided:\n");
126 EVP_CIPHER_do_all_provided(NULL, collect_ciphers, ciphers);
127 sk_EVP_CIPHER_sort(ciphers);
128 for (i = 0; i < sk_EVP_CIPHER_num(ciphers); i++) {
129 const EVP_CIPHER *c = sk_EVP_CIPHER_value(ciphers, i);
130 STACK_OF(OPENSSL_CSTRING) *names = NULL;
132 if (select_name != NULL && !EVP_CIPHER_is_a(c, select_name))
135 names = sk_OPENSSL_CSTRING_new(name_cmp);
136 if (names != NULL && EVP_CIPHER_names_do_all(c, collect_names, names)) {
137 BIO_printf(bio_out, " ");
138 print_names(bio_out, names);
140 BIO_printf(bio_out, " @ %s\n",
141 OSSL_PROVIDER_name(EVP_CIPHER_get0_provider(c)));
144 const char *desc = EVP_CIPHER_get0_description(c);
147 BIO_printf(bio_out, " description: %s\n", desc);
148 print_param_types("retrievable algorithm parameters",
149 EVP_CIPHER_gettable_params(c), 4);
150 print_param_types("retrievable operation parameters",
151 EVP_CIPHER_gettable_ctx_params(c), 4);
152 print_param_types("settable operation parameters",
153 EVP_CIPHER_settable_ctx_params(c), 4);
156 sk_OPENSSL_CSTRING_free(names);
158 sk_EVP_CIPHER_pop_free(ciphers, EVP_CIPHER_free);
161 #ifndef OPENSSL_NO_DEPRECATED_3_0
162 static void legacy_md_fn(const EVP_MD *m,
163 const char *from, const char *to, void *arg)
166 BIO_printf(arg, " %s\n", EVP_MD_get0_name(m));
169 from = "<undefined>";
172 BIO_printf((BIO *)arg, " %s => %s\n", from, to);
177 DEFINE_STACK_OF(EVP_MD)
178 static int md_cmp(const EVP_MD * const *a, const EVP_MD * const *b)
180 int ret = EVP_MD_get_number(*a) - EVP_MD_get_number(*b);
183 ret = strcmp(OSSL_PROVIDER_name(EVP_MD_get0_provider(*a)),
184 OSSL_PROVIDER_name(EVP_MD_get0_provider(*b)));
189 static void collect_digests(EVP_MD *digest, void *stack)
191 STACK_OF(EVP_MD) *digest_stack = stack;
193 if (is_digest_fetchable(digest)
194 && sk_EVP_MD_push(digest_stack, digest) > 0)
195 EVP_MD_up_ref(digest);
198 static void list_digests(void)
200 STACK_OF(EVP_MD) *digests = sk_EVP_MD_new(md_cmp);
203 if (digests == NULL) {
204 BIO_printf(bio_err, "ERROR: Memory allocation\n");
207 #ifndef OPENSSL_NO_DEPRECATED_3_0
208 if (include_legacy()) {
209 BIO_printf(bio_out, "Legacy:\n");
210 EVP_MD_do_all_sorted(legacy_md_fn, bio_out);
214 BIO_printf(bio_out, "Provided:\n");
215 EVP_MD_do_all_provided(NULL, collect_digests, digests);
216 sk_EVP_MD_sort(digests);
217 for (i = 0; i < sk_EVP_MD_num(digests); i++) {
218 const EVP_MD *m = sk_EVP_MD_value(digests, i);
219 STACK_OF(OPENSSL_CSTRING) *names = NULL;
221 if (select_name != NULL && !EVP_MD_is_a(m, select_name))
224 names = sk_OPENSSL_CSTRING_new(name_cmp);
225 if (names != NULL && EVP_MD_names_do_all(m, collect_names, names)) {
226 BIO_printf(bio_out, " ");
227 print_names(bio_out, names);
229 BIO_printf(bio_out, " @ %s\n",
230 OSSL_PROVIDER_name(EVP_MD_get0_provider(m)));
233 const char *desc = EVP_MD_get0_description(m);
236 BIO_printf(bio_out, " description: %s\n", desc);
237 print_param_types("retrievable algorithm parameters",
238 EVP_MD_gettable_params(m), 4);
239 print_param_types("retrievable operation parameters",
240 EVP_MD_gettable_ctx_params(m), 4);
241 print_param_types("settable operation parameters",
242 EVP_MD_settable_ctx_params(m), 4);
245 sk_OPENSSL_CSTRING_free(names);
247 sk_EVP_MD_pop_free(digests, EVP_MD_free);
250 DEFINE_STACK_OF(EVP_MAC)
251 static int mac_cmp(const EVP_MAC * const *a, const EVP_MAC * const *b)
253 int ret = EVP_MAC_get_number(*a) - EVP_MAC_get_number(*b);
256 ret = strcmp(OSSL_PROVIDER_name(EVP_MAC_get0_provider(*a)),
257 OSSL_PROVIDER_name(EVP_MAC_get0_provider(*b)));
262 static void collect_macs(EVP_MAC *mac, void *stack)
264 STACK_OF(EVP_MAC) *mac_stack = stack;
266 if (is_mac_fetchable(mac)
267 && sk_EVP_MAC_push(mac_stack, mac) > 0)
271 static void list_macs(void)
273 STACK_OF(EVP_MAC) *macs = sk_EVP_MAC_new(mac_cmp);
277 BIO_printf(bio_err, "ERROR: Memory allocation\n");
280 BIO_printf(bio_out, "Provided MACs:\n");
281 EVP_MAC_do_all_provided(NULL, collect_macs, macs);
282 sk_EVP_MAC_sort(macs);
283 for (i = 0; i < sk_EVP_MAC_num(macs); i++) {
284 const EVP_MAC *m = sk_EVP_MAC_value(macs, i);
285 STACK_OF(OPENSSL_CSTRING) *names = NULL;
287 if (select_name != NULL && !EVP_MAC_is_a(m, select_name))
290 names = sk_OPENSSL_CSTRING_new(name_cmp);
291 if (names != NULL && EVP_MAC_names_do_all(m, collect_names, names)) {
292 BIO_printf(bio_out, " ");
293 print_names(bio_out, names);
295 BIO_printf(bio_out, " @ %s\n",
296 OSSL_PROVIDER_name(EVP_MAC_get0_provider(m)));
299 const char *desc = EVP_MAC_get0_description(m);
302 BIO_printf(bio_out, " description: %s\n", desc);
303 print_param_types("retrievable algorithm parameters",
304 EVP_MAC_gettable_params(m), 4);
305 print_param_types("retrievable operation parameters",
306 EVP_MAC_gettable_ctx_params(m), 4);
307 print_param_types("settable operation parameters",
308 EVP_MAC_settable_ctx_params(m), 4);
311 sk_OPENSSL_CSTRING_free(names);
313 sk_EVP_MAC_pop_free(macs, EVP_MAC_free);
319 DEFINE_STACK_OF(EVP_KDF)
320 static int kdf_cmp(const EVP_KDF * const *a, const EVP_KDF * const *b)
322 int ret = EVP_KDF_get_number(*a) - EVP_KDF_get_number(*b);
325 ret = strcmp(OSSL_PROVIDER_name(EVP_KDF_get0_provider(*a)),
326 OSSL_PROVIDER_name(EVP_KDF_get0_provider(*b)));
331 static void collect_kdfs(EVP_KDF *kdf, void *stack)
333 STACK_OF(EVP_KDF) *kdf_stack = stack;
335 if (is_kdf_fetchable(kdf)
336 && sk_EVP_KDF_push(kdf_stack, kdf) > 0)
340 static void list_kdfs(void)
342 STACK_OF(EVP_KDF) *kdfs = sk_EVP_KDF_new(kdf_cmp);
346 BIO_printf(bio_err, "ERROR: Memory allocation\n");
349 BIO_printf(bio_out, "Provided KDFs and PDFs:\n");
350 EVP_KDF_do_all_provided(NULL, collect_kdfs, kdfs);
351 sk_EVP_KDF_sort(kdfs);
352 for (i = 0; i < sk_EVP_KDF_num(kdfs); i++) {
353 const EVP_KDF *k = sk_EVP_KDF_value(kdfs, i);
354 STACK_OF(OPENSSL_CSTRING) *names = NULL;
356 if (select_name != NULL && !EVP_KDF_is_a(k, select_name))
359 names = sk_OPENSSL_CSTRING_new(name_cmp);
360 if (names != NULL && EVP_KDF_names_do_all(k, collect_names, names)) {
361 BIO_printf(bio_out, " ");
362 print_names(bio_out, names);
364 BIO_printf(bio_out, " @ %s\n",
365 OSSL_PROVIDER_name(EVP_KDF_get0_provider(k)));
368 const char *desc = EVP_KDF_get0_description(k);
371 BIO_printf(bio_out, " description: %s\n", desc);
372 print_param_types("retrievable algorithm parameters",
373 EVP_KDF_gettable_params(k), 4);
374 print_param_types("retrievable operation parameters",
375 EVP_KDF_gettable_ctx_params(k), 4);
376 print_param_types("settable operation parameters",
377 EVP_KDF_settable_ctx_params(k), 4);
380 sk_OPENSSL_CSTRING_free(names);
382 sk_EVP_KDF_pop_free(kdfs, EVP_KDF_free);
388 DEFINE_STACK_OF(EVP_RAND)
390 static int rand_cmp(const EVP_RAND * const *a, const EVP_RAND * const *b)
392 int ret = strcasecmp(EVP_RAND_get0_name(*a), EVP_RAND_get0_name(*b));
395 ret = strcmp(OSSL_PROVIDER_name(EVP_RAND_get0_provider(*a)),
396 OSSL_PROVIDER_name(EVP_RAND_get0_provider(*b)));
401 static void collect_rands(EVP_RAND *rand, void *stack)
403 STACK_OF(EVP_RAND) *rand_stack = stack;
405 if (is_rand_fetchable(rand)
406 && sk_EVP_RAND_push(rand_stack, rand) > 0)
407 EVP_RAND_up_ref(rand);
410 static void list_random_generators(void)
412 STACK_OF(EVP_RAND) *rands = sk_EVP_RAND_new(rand_cmp);
416 BIO_printf(bio_err, "ERROR: Memory allocation\n");
419 BIO_printf(bio_out, "Provided RNGs and seed sources:\n");
420 EVP_RAND_do_all_provided(NULL, collect_rands, rands);
421 sk_EVP_RAND_sort(rands);
422 for (i = 0; i < sk_EVP_RAND_num(rands); i++) {
423 const EVP_RAND *m = sk_EVP_RAND_value(rands, i);
425 if (select_name != NULL
426 && strcasecmp(EVP_RAND_get0_name(m), select_name) != 0)
428 BIO_printf(bio_out, " %s", EVP_RAND_get0_name(m));
429 BIO_printf(bio_out, " @ %s\n",
430 OSSL_PROVIDER_name(EVP_RAND_get0_provider(m)));
433 const char *desc = EVP_RAND_get0_description(m);
436 BIO_printf(bio_out, " description: %s\n", desc);
437 print_param_types("retrievable algorithm parameters",
438 EVP_RAND_gettable_params(m), 4);
439 print_param_types("retrievable operation parameters",
440 EVP_RAND_gettable_ctx_params(m), 4);
441 print_param_types("settable operation parameters",
442 EVP_RAND_settable_ctx_params(m), 4);
445 sk_EVP_RAND_pop_free(rands, EVP_RAND_free);
448 static void display_random(const char *name, EVP_RAND_CTX *drbg)
453 const OSSL_PARAM *gettables;
454 OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
455 unsigned char buf[1000];
457 BIO_printf(bio_out, "%s:\n", name);
459 rand = EVP_RAND_CTX_get0_rand(drbg);
461 BIO_printf(bio_out, " %s", EVP_RAND_get0_name(rand));
462 BIO_printf(bio_out, " @ %s\n",
463 OSSL_PROVIDER_name(EVP_RAND_get0_provider(rand)));
465 switch (EVP_RAND_get_state(drbg)) {
466 case EVP_RAND_STATE_UNINITIALISED:
469 case EVP_RAND_STATE_READY:
472 case EVP_RAND_STATE_ERROR:
479 BIO_printf(bio_out, " state = %s\n", p);
481 gettables = EVP_RAND_gettable_ctx_params(rand);
482 if (gettables != NULL)
483 for (; gettables->key != NULL; gettables++) {
484 /* State has been dealt with already, so ignore */
485 if (strcasecmp(gettables->key, OSSL_RAND_PARAM_STATE) == 0)
487 /* Outside of verbose mode, we skip non-string values */
488 if (gettables->data_type != OSSL_PARAM_UTF8_STRING
489 && gettables->data_type != OSSL_PARAM_UTF8_PTR
492 params->key = gettables->key;
493 params->data_type = gettables->data_type;
494 if (gettables->data_type == OSSL_PARAM_UNSIGNED_INTEGER
495 || gettables->data_type == OSSL_PARAM_INTEGER) {
497 params->data_size = sizeof(u);
500 params->data_size = sizeof(buf);
502 params->return_size = 0;
503 if (EVP_RAND_CTX_get_params(drbg, params))
504 print_param_value(params, 2);
509 static void list_random_instances(void)
511 display_random("primary", RAND_get0_primary(NULL));
512 display_random("public", RAND_get0_public(NULL));
513 display_random("private", RAND_get0_private(NULL));
519 DEFINE_STACK_OF(OSSL_ENCODER)
520 static int encoder_cmp(const OSSL_ENCODER * const *a,
521 const OSSL_ENCODER * const *b)
523 int ret = OSSL_ENCODER_get_number(*a) - OSSL_ENCODER_get_number(*b);
526 ret = strcmp(OSSL_PROVIDER_name(OSSL_ENCODER_get0_provider(*a)),
527 OSSL_PROVIDER_name(OSSL_ENCODER_get0_provider(*b)));
531 static void collect_encoders(OSSL_ENCODER *encoder, void *stack)
533 STACK_OF(OSSL_ENCODER) *encoder_stack = stack;
535 if (is_encoder_fetchable(encoder)
536 && sk_OSSL_ENCODER_push(encoder_stack, encoder) > 0)
537 OSSL_ENCODER_up_ref(encoder);
540 static void list_encoders(void)
542 STACK_OF(OSSL_ENCODER) *encoders;
545 encoders = sk_OSSL_ENCODER_new(encoder_cmp);
546 if (encoders == NULL) {
547 BIO_printf(bio_err, "ERROR: Memory allocation\n");
550 BIO_printf(bio_out, "Provided ENCODERs:\n");
551 OSSL_ENCODER_do_all_provided(NULL, collect_encoders, encoders);
552 sk_OSSL_ENCODER_sort(encoders);
554 for (i = 0; i < sk_OSSL_ENCODER_num(encoders); i++) {
555 OSSL_ENCODER *k = sk_OSSL_ENCODER_value(encoders, i);
556 STACK_OF(OPENSSL_CSTRING) *names = NULL;
558 if (select_name != NULL && !OSSL_ENCODER_is_a(k, select_name))
561 names = sk_OPENSSL_CSTRING_new(name_cmp);
562 if (names != NULL && OSSL_ENCODER_names_do_all(k, collect_names, names)) {
563 BIO_printf(bio_out, " ");
564 print_names(bio_out, names);
566 BIO_printf(bio_out, " @ %s (%s)\n",
567 OSSL_PROVIDER_name(OSSL_ENCODER_get0_provider(k)),
568 OSSL_ENCODER_get0_properties(k));
571 const char *desc = OSSL_ENCODER_get0_description(k);
574 BIO_printf(bio_out, " description: %s\n", desc);
575 print_param_types("settable operation parameters",
576 OSSL_ENCODER_settable_ctx_params(k), 4);
579 sk_OPENSSL_CSTRING_free(names);
581 sk_OSSL_ENCODER_pop_free(encoders, OSSL_ENCODER_free);
587 DEFINE_STACK_OF(OSSL_DECODER)
588 static int decoder_cmp(const OSSL_DECODER * const *a,
589 const OSSL_DECODER * const *b)
591 int ret = OSSL_DECODER_get_number(*a) - OSSL_DECODER_get_number(*b);
594 ret = strcmp(OSSL_PROVIDER_name(OSSL_DECODER_get0_provider(*a)),
595 OSSL_PROVIDER_name(OSSL_DECODER_get0_provider(*b)));
599 static void collect_decoders(OSSL_DECODER *decoder, void *stack)
601 STACK_OF(OSSL_DECODER) *decoder_stack = stack;
603 if (is_decoder_fetchable(decoder)
604 && sk_OSSL_DECODER_push(decoder_stack, decoder) > 0)
605 OSSL_DECODER_up_ref(decoder);
608 static void list_decoders(void)
610 STACK_OF(OSSL_DECODER) *decoders;
613 decoders = sk_OSSL_DECODER_new(decoder_cmp);
614 if (decoders == NULL) {
615 BIO_printf(bio_err, "ERROR: Memory allocation\n");
618 BIO_printf(bio_out, "Provided DECODERs:\n");
619 OSSL_DECODER_do_all_provided(NULL, collect_decoders,
621 sk_OSSL_DECODER_sort(decoders);
623 for (i = 0; i < sk_OSSL_DECODER_num(decoders); i++) {
624 OSSL_DECODER *k = sk_OSSL_DECODER_value(decoders, i);
625 STACK_OF(OPENSSL_CSTRING) *names = NULL;
627 if (select_name != NULL && !OSSL_DECODER_is_a(k, select_name))
630 names = sk_OPENSSL_CSTRING_new(name_cmp);
631 if (names != NULL && OSSL_DECODER_names_do_all(k, collect_names, names)) {
632 BIO_printf(bio_out, " ");
633 print_names(bio_out, names);
635 BIO_printf(bio_out, " @ %s (%s)\n",
636 OSSL_PROVIDER_name(OSSL_DECODER_get0_provider(k)),
637 OSSL_DECODER_get0_properties(k));
640 const char *desc = OSSL_DECODER_get0_description(k);
643 BIO_printf(bio_out, " description: %s\n", desc);
644 print_param_types("settable operation parameters",
645 OSSL_DECODER_settable_ctx_params(k), 4);
648 sk_OPENSSL_CSTRING_free(names);
650 sk_OSSL_DECODER_pop_free(decoders, OSSL_DECODER_free);
653 DEFINE_STACK_OF(EVP_KEYMGMT)
654 static int keymanager_cmp(const EVP_KEYMGMT * const *a,
655 const EVP_KEYMGMT * const *b)
657 int ret = EVP_KEYMGMT_get_number(*a) - EVP_KEYMGMT_get_number(*b);
660 ret = strcmp(OSSL_PROVIDER_name(EVP_KEYMGMT_get0_provider(*a)),
661 OSSL_PROVIDER_name(EVP_KEYMGMT_get0_provider(*b)));
665 static void collect_keymanagers(EVP_KEYMGMT *km, void *stack)
667 STACK_OF(EVP_KEYMGMT) *km_stack = stack;
669 if (is_keymgmt_fetchable(km)
670 && sk_EVP_KEYMGMT_push(km_stack, km) > 0)
671 EVP_KEYMGMT_up_ref(km);
674 static void list_keymanagers(void)
677 STACK_OF(EVP_KEYMGMT) *km_stack = sk_EVP_KEYMGMT_new(keymanager_cmp);
679 EVP_KEYMGMT_do_all_provided(NULL, collect_keymanagers, km_stack);
680 sk_EVP_KEYMGMT_sort(km_stack);
682 for (i = 0; i < sk_EVP_KEYMGMT_num(km_stack); i++) {
683 EVP_KEYMGMT *k = sk_EVP_KEYMGMT_value(km_stack, i);
684 STACK_OF(OPENSSL_CSTRING) *names = NULL;
686 if (select_name != NULL && !EVP_KEYMGMT_is_a(k, select_name))
689 names = sk_OPENSSL_CSTRING_new(name_cmp);
690 if (names != NULL && EVP_KEYMGMT_names_do_all(k, collect_names, names)) {
691 const char *desc = EVP_KEYMGMT_get0_description(k);
693 BIO_printf(bio_out, " Name: ");
695 BIO_printf(bio_out, "%s", desc);
697 BIO_printf(bio_out, "%s", sk_OPENSSL_CSTRING_value(names, 0));
698 BIO_printf(bio_out, "\n");
699 BIO_printf(bio_out, " Type: Provider Algorithm\n");
700 BIO_printf(bio_out, " IDs: ");
701 print_names(bio_out, names);
702 BIO_printf(bio_out, " @ %s\n",
703 OSSL_PROVIDER_name(EVP_KEYMGMT_get0_provider(k)));
706 print_param_types("settable key generation parameters",
707 EVP_KEYMGMT_gen_settable_params(k), 4);
708 print_param_types("settable operation parameters",
709 EVP_KEYMGMT_settable_params(k), 4);
710 print_param_types("retrievable operation parameters",
711 EVP_KEYMGMT_gettable_params(k), 4);
714 sk_OPENSSL_CSTRING_free(names);
716 sk_EVP_KEYMGMT_pop_free(km_stack, EVP_KEYMGMT_free);
719 DEFINE_STACK_OF(EVP_SIGNATURE)
720 static int signature_cmp(const EVP_SIGNATURE * const *a,
721 const EVP_SIGNATURE * const *b)
723 int ret = EVP_SIGNATURE_get_number(*a) - EVP_SIGNATURE_get_number(*b);
726 ret = strcmp(OSSL_PROVIDER_name(EVP_SIGNATURE_get0_provider(*a)),
727 OSSL_PROVIDER_name(EVP_SIGNATURE_get0_provider(*b)));
731 static void collect_signatures(EVP_SIGNATURE *sig, void *stack)
733 STACK_OF(EVP_SIGNATURE) *sig_stack = stack;
735 if (is_signature_fetchable(sig)
736 && sk_EVP_SIGNATURE_push(sig_stack, sig) > 0)
737 EVP_SIGNATURE_up_ref(sig);
740 static void list_signatures(void)
743 STACK_OF(EVP_SIGNATURE) *sig_stack = sk_EVP_SIGNATURE_new(signature_cmp);
745 EVP_SIGNATURE_do_all_provided(NULL, collect_signatures, sig_stack);
746 sk_EVP_SIGNATURE_sort(sig_stack);
748 for (i = 0; i < sk_EVP_SIGNATURE_num(sig_stack); i++) {
749 EVP_SIGNATURE *k = sk_EVP_SIGNATURE_value(sig_stack, i);
750 STACK_OF(OPENSSL_CSTRING) *names = NULL;
752 if (select_name != NULL && !EVP_SIGNATURE_is_a(k, select_name))
755 names = sk_OPENSSL_CSTRING_new(name_cmp);
756 if (names != NULL && EVP_SIGNATURE_names_do_all(k, collect_names, names)) {
758 BIO_printf(bio_out, " ");
759 print_names(bio_out, names);
761 BIO_printf(bio_out, " @ %s\n",
762 OSSL_PROVIDER_name(EVP_SIGNATURE_get0_provider(k)));
765 const char *desc = EVP_SIGNATURE_get0_description(k);
768 BIO_printf(bio_out, " description: %s\n", desc);
769 print_param_types("settable operation parameters",
770 EVP_SIGNATURE_settable_ctx_params(k), 4);
771 print_param_types("retrievable operation parameters",
772 EVP_SIGNATURE_gettable_ctx_params(k), 4);
775 sk_OPENSSL_CSTRING_free(names);
777 sk_EVP_SIGNATURE_pop_free(sig_stack, EVP_SIGNATURE_free);
779 BIO_printf(bio_out, " -\n");
782 DEFINE_STACK_OF(EVP_KEM)
783 static int kem_cmp(const EVP_KEM * const *a,
784 const EVP_KEM * const *b)
786 int ret = EVP_KEM_get_number(*a) - EVP_KEM_get_number(*b);
789 ret = strcmp(OSSL_PROVIDER_name(EVP_KEM_get0_provider(*a)),
790 OSSL_PROVIDER_name(EVP_KEM_get0_provider(*b)));
794 static void collect_kem(EVP_KEM *kem, void *stack)
796 STACK_OF(EVP_KEM) *kem_stack = stack;
798 if (is_kem_fetchable(kem)
799 && sk_EVP_KEM_push(kem_stack, kem) > 0)
803 static void list_kems(void)
806 STACK_OF(EVP_KEM) *kem_stack = sk_EVP_KEM_new(kem_cmp);
808 EVP_KEM_do_all_provided(NULL, collect_kem, kem_stack);
809 sk_EVP_KEM_sort(kem_stack);
811 for (i = 0; i < sk_EVP_KEM_num(kem_stack); i++) {
812 EVP_KEM *k = sk_EVP_KEM_value(kem_stack, i);
813 STACK_OF(OPENSSL_CSTRING) *names = NULL;
815 if (select_name != NULL && !EVP_KEM_is_a(k, select_name))
818 names = sk_OPENSSL_CSTRING_new(name_cmp);
819 if (names != NULL && EVP_KEM_names_do_all(k, collect_names, names)) {
821 BIO_printf(bio_out, " ");
822 print_names(bio_out, names);
824 BIO_printf(bio_out, " @ %s\n",
825 OSSL_PROVIDER_name(EVP_KEM_get0_provider(k)));
828 const char *desc = EVP_KEM_get0_description(k);
831 BIO_printf(bio_out, " description: %s\n", desc);
832 print_param_types("settable operation parameters",
833 EVP_KEM_settable_ctx_params(k), 4);
834 print_param_types("retrievable operation parameters",
835 EVP_KEM_gettable_ctx_params(k), 4);
838 sk_OPENSSL_CSTRING_free(names);
840 sk_EVP_KEM_pop_free(kem_stack, EVP_KEM_free);
842 BIO_printf(bio_out, " -\n");
845 DEFINE_STACK_OF(EVP_ASYM_CIPHER)
846 static int asymcipher_cmp(const EVP_ASYM_CIPHER * const *a,
847 const EVP_ASYM_CIPHER * const *b)
849 int ret = EVP_ASYM_CIPHER_get_number(*a) - EVP_ASYM_CIPHER_get_number(*b);
852 ret = strcmp(OSSL_PROVIDER_name(EVP_ASYM_CIPHER_get0_provider(*a)),
853 OSSL_PROVIDER_name(EVP_ASYM_CIPHER_get0_provider(*b)));
857 static void collect_asymciph(EVP_ASYM_CIPHER *asym_cipher, void *stack)
859 STACK_OF(EVP_ASYM_CIPHER) *asym_cipher_stack = stack;
861 if (is_asym_cipher_fetchable(asym_cipher)
862 && sk_EVP_ASYM_CIPHER_push(asym_cipher_stack, asym_cipher) > 0)
863 EVP_ASYM_CIPHER_up_ref(asym_cipher);
866 static void list_asymciphers(void)
869 STACK_OF(EVP_ASYM_CIPHER) *asymciph_stack =
870 sk_EVP_ASYM_CIPHER_new(asymcipher_cmp);
872 EVP_ASYM_CIPHER_do_all_provided(NULL, collect_asymciph, asymciph_stack);
873 sk_EVP_ASYM_CIPHER_sort(asymciph_stack);
875 for (i = 0; i < sk_EVP_ASYM_CIPHER_num(asymciph_stack); i++) {
876 EVP_ASYM_CIPHER *k = sk_EVP_ASYM_CIPHER_value(asymciph_stack, i);
877 STACK_OF(OPENSSL_CSTRING) *names = NULL;
879 if (select_name != NULL && !EVP_ASYM_CIPHER_is_a(k, select_name))
882 names = sk_OPENSSL_CSTRING_new(name_cmp);
884 && EVP_ASYM_CIPHER_names_do_all(k, collect_names, names)) {
886 BIO_printf(bio_out, " ");
887 print_names(bio_out, names);
889 BIO_printf(bio_out, " @ %s\n",
890 OSSL_PROVIDER_name(EVP_ASYM_CIPHER_get0_provider(k)));
893 const char *desc = EVP_ASYM_CIPHER_get0_description(k);
896 BIO_printf(bio_out, " description: %s\n", desc);
897 print_param_types("settable operation parameters",
898 EVP_ASYM_CIPHER_settable_ctx_params(k), 4);
899 print_param_types("retrievable operation parameters",
900 EVP_ASYM_CIPHER_gettable_ctx_params(k), 4);
903 sk_OPENSSL_CSTRING_free(names);
905 sk_EVP_ASYM_CIPHER_pop_free(asymciph_stack, EVP_ASYM_CIPHER_free);
907 BIO_printf(bio_out, " -\n");
910 DEFINE_STACK_OF(EVP_KEYEXCH)
911 static int kex_cmp(const EVP_KEYEXCH * const *a,
912 const EVP_KEYEXCH * const *b)
914 int ret = EVP_KEYEXCH_get_number(*a) - EVP_KEYEXCH_get_number(*b);
917 ret = strcmp(OSSL_PROVIDER_name(EVP_KEYEXCH_get0_provider(*a)),
918 OSSL_PROVIDER_name(EVP_KEYEXCH_get0_provider(*b)));
922 static void collect_kex(EVP_KEYEXCH *kex, void *stack)
924 STACK_OF(EVP_KEYEXCH) *kex_stack = stack;
926 if (is_keyexch_fetchable(kex)
927 && sk_EVP_KEYEXCH_push(kex_stack, kex) > 0)
928 EVP_KEYEXCH_up_ref(kex);
931 static void list_keyexchanges(void)
934 STACK_OF(EVP_KEYEXCH) *kex_stack = sk_EVP_KEYEXCH_new(kex_cmp);
936 EVP_KEYEXCH_do_all_provided(NULL, collect_kex, kex_stack);
937 sk_EVP_KEYEXCH_sort(kex_stack);
939 for (i = 0; i < sk_EVP_KEYEXCH_num(kex_stack); i++) {
940 EVP_KEYEXCH *k = sk_EVP_KEYEXCH_value(kex_stack, i);
941 STACK_OF(OPENSSL_CSTRING) *names = NULL;
943 if (select_name != NULL && !EVP_KEYEXCH_is_a(k, select_name))
946 names = sk_OPENSSL_CSTRING_new(name_cmp);
947 if (names != NULL && EVP_KEYEXCH_names_do_all(k, collect_names, names)) {
949 BIO_printf(bio_out, " ");
950 print_names(bio_out, names);
952 BIO_printf(bio_out, " @ %s\n",
953 OSSL_PROVIDER_name(EVP_KEYEXCH_get0_provider(k)));
956 const char *desc = EVP_KEYEXCH_get0_description(k);
959 BIO_printf(bio_out, " description: %s\n", desc);
960 print_param_types("settable operation parameters",
961 EVP_KEYEXCH_settable_ctx_params(k), 4);
962 print_param_types("retrievable operation parameters",
963 EVP_KEYEXCH_gettable_ctx_params(k), 4);
966 sk_OPENSSL_CSTRING_free(names);
968 sk_EVP_KEYEXCH_pop_free(kex_stack, EVP_KEYEXCH_free);
970 BIO_printf(bio_out, " -\n");
973 static void list_objects(void)
975 int max_nid = OBJ_new_nid(0);
977 char *oid_buf = NULL;
980 /* Skip 0, since that's NID_undef */
981 for (i = 1; i < max_nid; i++) {
982 const ASN1_OBJECT *obj = OBJ_nid2obj(i);
983 const char *sn = OBJ_nid2sn(i);
984 const char *ln = OBJ_nid2ln(i);
988 * If one of the retrieved objects somehow generated an error,
989 * we ignore it. The check for NID_undef below will detect the
990 * error and simply skip to the next NID.
994 if (OBJ_obj2nid(obj) == NID_undef)
997 if ((n = OBJ_obj2txt(NULL, 0, obj, 1)) == 0) {
998 BIO_printf(bio_out, "# None-OID object: %s, %s\n", sn, ln);
1005 oid_buf = OPENSSL_realloc(oid_buf, n + 1);
1006 if (oid_buf == NULL) {
1007 BIO_printf(bio_err, "ERROR: Memory allocation\n");
1012 if (OBJ_obj2txt(oid_buf, oid_size, obj, 1) < 0)
1014 if (ln == NULL || strcmp(sn, ln) == 0)
1015 BIO_printf(bio_out, "%s = %s\n", sn, oid_buf);
1017 BIO_printf(bio_out, "%s = %s, %s\n", sn, ln, oid_buf);
1020 OPENSSL_free(oid_buf);
1023 static void list_options_for_command(const char *command)
1028 for (fp = functions; fp->name != NULL; fp++)
1029 if (strcmp(fp->name, command) == 0)
1031 if (fp->name == NULL) {
1032 BIO_printf(bio_err, "Invalid command '%s'; type \"help\" for a list.\n",
1037 if ((o = fp->help) == NULL)
1040 for ( ; o->name != NULL; o++) {
1041 char c = o->valtype;
1043 if (o->name == OPT_PARAM_STR)
1046 if (o->name == OPT_HELP_STR
1047 || o->name == OPT_MORE_STR
1048 || o->name == OPT_SECTION_STR
1049 || o->name[0] == '\0')
1051 BIO_printf(bio_out, "%s %c\n", o->name, c == '\0' ? '-' : c);
1053 /* Always output the -- marker since it is sometimes documented. */
1054 BIO_printf(bio_out, "- -\n");
1057 static int is_md_available(const char *name)
1060 const char *propq = app_get0_propq();
1062 /* Look through providers' digests */
1064 md = EVP_MD_fetch(NULL, name, propq);
1071 return propq != NULL || get_digest_from_engine(name) == NULL ? 0 : 1;
1074 static int is_cipher_available(const char *name)
1077 const char *propq = app_get0_propq();
1079 /* Look through providers' ciphers */
1081 cipher = EVP_CIPHER_fetch(NULL, name, propq);
1083 if (cipher != NULL) {
1084 EVP_CIPHER_free(cipher);
1088 return propq != NULL || get_cipher_from_engine(name) == NULL ? 0 : 1;
1091 static void list_type(FUNC_TYPE ft, int one)
1097 memset(&dc, 0, sizeof(dc));
1099 calculate_columns(functions, &dc);
1101 for (fp = functions; fp->name != NULL; fp++) {
1106 if (!is_cipher_available(fp->name))
1110 if (!is_md_available(fp->name))
1117 BIO_printf(bio_out, "%s\n", fp->name);
1119 if (i % dc.columns == 0 && i > 0)
1120 BIO_printf(bio_out, "\n");
1121 BIO_printf(bio_out, "%-*s", dc.width, fp->name);
1126 BIO_printf(bio_out, "\n\n");
1129 static void list_pkey(void)
1131 #ifndef OPENSSL_NO_DEPRECATED_3_0
1134 if (select_name == NULL && include_legacy()) {
1135 BIO_printf(bio_out, "Legacy:\n");
1136 for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) {
1137 const EVP_PKEY_ASN1_METHOD *ameth;
1138 int pkey_id, pkey_base_id, pkey_flags;
1139 const char *pinfo, *pem_str;
1140 ameth = EVP_PKEY_asn1_get0(i);
1141 EVP_PKEY_asn1_get0_info(&pkey_id, &pkey_base_id, &pkey_flags,
1142 &pinfo, &pem_str, ameth);
1143 if (pkey_flags & ASN1_PKEY_ALIAS) {
1144 BIO_printf(bio_out, " Name: %s\n", OBJ_nid2ln(pkey_id));
1145 BIO_printf(bio_out, "\tAlias for: %s\n",
1146 OBJ_nid2ln(pkey_base_id));
1148 BIO_printf(bio_out, " Name: %s\n", pinfo);
1149 BIO_printf(bio_out, "\tType: %s Algorithm\n",
1150 pkey_flags & ASN1_PKEY_DYNAMIC ?
1151 "External" : "Builtin");
1152 BIO_printf(bio_out, "\tOID: %s\n", OBJ_nid2ln(pkey_id));
1153 if (pem_str == NULL)
1155 BIO_printf(bio_out, "\tPEM string: %s\n", pem_str);
1160 BIO_printf(bio_out, "Provided:\n");
1161 BIO_printf(bio_out, " Key Managers:\n");
1165 static void list_pkey_meth(void)
1167 #ifndef OPENSSL_NO_DEPRECATED_3_0
1169 size_t meth_count = EVP_PKEY_meth_get_count();
1171 if (select_name == NULL && include_legacy()) {
1172 BIO_printf(bio_out, "Legacy:\n");
1173 for (i = 0; i < meth_count; i++) {
1174 const EVP_PKEY_METHOD *pmeth = EVP_PKEY_meth_get0(i);
1175 int pkey_id, pkey_flags;
1177 EVP_PKEY_meth_get0_info(&pkey_id, &pkey_flags, pmeth);
1178 BIO_printf(bio_out, " %s\n", OBJ_nid2ln(pkey_id));
1179 BIO_printf(bio_out, "\tType: %s Algorithm\n",
1180 pkey_flags & ASN1_PKEY_DYNAMIC ? "External" : "Builtin");
1184 BIO_printf(bio_out, "Provided:\n");
1185 BIO_printf(bio_out, " Encryption:\n");
1187 BIO_printf(bio_out, " Key Exchange:\n");
1188 list_keyexchanges();
1189 BIO_printf(bio_out, " Signatures:\n");
1191 BIO_printf(bio_out, " Key encapsulation:\n");
1195 DEFINE_STACK_OF(OSSL_STORE_LOADER)
1196 static int store_cmp(const OSSL_STORE_LOADER * const *a,
1197 const OSSL_STORE_LOADER * const *b)
1199 int ret = OSSL_STORE_LOADER_get_number(*a) - OSSL_STORE_LOADER_get_number(*b);
1202 ret = strcmp(OSSL_PROVIDER_name(OSSL_STORE_LOADER_get0_provider(*a)),
1203 OSSL_PROVIDER_name(OSSL_STORE_LOADER_get0_provider(*b)));
1208 static void collect_store_loaders(OSSL_STORE_LOADER *store, void *stack)
1210 STACK_OF(OSSL_STORE_LOADER) *store_stack = stack;
1212 if (sk_OSSL_STORE_LOADER_push(store_stack, store) > 0)
1213 OSSL_STORE_LOADER_up_ref(store);
1216 static void list_store_loaders(void)
1218 STACK_OF(OSSL_STORE_LOADER) *stores = sk_OSSL_STORE_LOADER_new(store_cmp);
1221 if (stores == NULL) {
1222 BIO_printf(bio_err, "ERROR: Memory allocation\n");
1225 BIO_printf(bio_out, "Provided STORE LOADERs:\n");
1226 OSSL_STORE_LOADER_do_all_provided(NULL, collect_store_loaders, stores);
1227 sk_OSSL_STORE_LOADER_sort(stores);
1228 for (i = 0; i < sk_OSSL_STORE_LOADER_num(stores); i++) {
1229 const OSSL_STORE_LOADER *m = sk_OSSL_STORE_LOADER_value(stores, i);
1230 STACK_OF(OPENSSL_CSTRING) *names = NULL;
1232 if (select_name != NULL && !OSSL_STORE_LOADER_is_a(m, select_name))
1235 names = sk_OPENSSL_CSTRING_new(name_cmp);
1236 if (names != NULL && OSSL_STORE_LOADER_names_do_all(m, collect_names,
1238 BIO_printf(bio_out, " ");
1239 print_names(bio_out, names);
1241 BIO_printf(bio_out, " @ %s\n",
1242 OSSL_PROVIDER_name(OSSL_STORE_LOADER_get0_provider(m)));
1244 sk_OPENSSL_CSTRING_free(names);
1246 sk_OSSL_STORE_LOADER_pop_free(stores, OSSL_STORE_LOADER_free);
1249 DEFINE_STACK_OF(OSSL_PROVIDER)
1250 static int provider_cmp(const OSSL_PROVIDER * const *a,
1251 const OSSL_PROVIDER * const *b)
1253 return strcmp(OSSL_PROVIDER_name(*a), OSSL_PROVIDER_name(*b));
1256 static int collect_providers(OSSL_PROVIDER *provider, void *stack)
1258 STACK_OF(OSSL_PROVIDER) *provider_stack = stack;
1260 sk_OSSL_PROVIDER_push(provider_stack, provider);
1264 static void list_provider_info(void)
1266 STACK_OF(OSSL_PROVIDER) *providers = sk_OSSL_PROVIDER_new(provider_cmp);
1267 OSSL_PARAM params[5];
1268 char *name, *version, *buildinfo;
1272 if (providers == NULL) {
1273 BIO_printf(bio_err, "ERROR: Memory allocation\n");
1276 BIO_printf(bio_out, "Providers:\n");
1277 OSSL_PROVIDER_do_all(NULL, &collect_providers, providers);
1278 sk_OSSL_PROVIDER_sort(providers);
1279 for (i = 0; i < sk_OSSL_PROVIDER_num(providers); i++) {
1280 const OSSL_PROVIDER *prov = sk_OSSL_PROVIDER_value(providers, i);
1282 /* Query the "known" information parameters, the order matches below */
1283 params[0] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_NAME,
1285 params[1] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_VERSION,
1287 params[2] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_STATUS, &status);
1288 params[3] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_BUILDINFO,
1290 params[4] = OSSL_PARAM_construct_end();
1291 OSSL_PARAM_set_all_unmodified(params);
1292 if (!OSSL_PROVIDER_get_params(prov, params)) {
1293 BIO_printf(bio_err, "ERROR: Unable to query provider parameters\n");
1297 /* Print out the provider information, the params order matches above */
1298 BIO_printf(bio_out, " %s\n", OSSL_PROVIDER_name(prov));
1299 if (OSSL_PARAM_modified(params))
1300 BIO_printf(bio_out, " name: %s\n", name);
1301 if (OSSL_PARAM_modified(params + 1))
1302 BIO_printf(bio_out, " version: %s\n", version);
1303 if (OSSL_PARAM_modified(params + 2))
1304 BIO_printf(bio_out, " status: %sactive\n", status ? "" : "in");
1306 if (OSSL_PARAM_modified(params + 3))
1307 BIO_printf(bio_out, " build info: %s\n", buildinfo);
1308 print_param_types("gettable provider parameters",
1309 OSSL_PROVIDER_gettable_params(prov), 4);
1312 sk_OSSL_PROVIDER_free(providers);
1315 #ifndef OPENSSL_NO_DEPRECATED_3_0
1316 static void list_engines(void)
1318 # ifndef OPENSSL_NO_ENGINE
1321 BIO_puts(bio_out, "Engines:\n");
1322 e = ENGINE_get_first();
1324 BIO_printf(bio_out, "%s\n", ENGINE_get_id(e));
1325 e = ENGINE_get_next(e);
1328 BIO_puts(bio_out, "Engine support is disabled.\n");
1333 static void list_disabled(void)
1335 BIO_puts(bio_out, "Disabled algorithms:\n");
1336 #ifdef OPENSSL_NO_ARIA
1337 BIO_puts(bio_out, "ARIA\n");
1339 #ifdef OPENSSL_NO_BF
1340 BIO_puts(bio_out, "BF\n");
1342 #ifdef OPENSSL_NO_BLAKE2
1343 BIO_puts(bio_out, "BLAKE2\n");
1345 #ifdef OPENSSL_NO_CAMELLIA
1346 BIO_puts(bio_out, "CAMELLIA\n");
1348 #ifdef OPENSSL_NO_CAST
1349 BIO_puts(bio_out, "CAST\n");
1351 #ifdef OPENSSL_NO_CMAC
1352 BIO_puts(bio_out, "CMAC\n");
1354 #ifdef OPENSSL_NO_CMS
1355 BIO_puts(bio_out, "CMS\n");
1357 #ifdef OPENSSL_NO_COMP
1358 BIO_puts(bio_out, "COMP\n");
1360 #ifdef OPENSSL_NO_DES
1361 BIO_puts(bio_out, "DES\n");
1363 #ifdef OPENSSL_NO_DGRAM
1364 BIO_puts(bio_out, "DGRAM\n");
1366 #ifdef OPENSSL_NO_DH
1367 BIO_puts(bio_out, "DH\n");
1369 #ifdef OPENSSL_NO_DSA
1370 BIO_puts(bio_out, "DSA\n");
1372 #if defined(OPENSSL_NO_DTLS)
1373 BIO_puts(bio_out, "DTLS\n");
1375 #if defined(OPENSSL_NO_DTLS1)
1376 BIO_puts(bio_out, "DTLS1\n");
1378 #if defined(OPENSSL_NO_DTLS1_2)
1379 BIO_puts(bio_out, "DTLS1_2\n");
1381 #ifdef OPENSSL_NO_EC
1382 BIO_puts(bio_out, "EC\n");
1384 #ifdef OPENSSL_NO_EC2M
1385 BIO_puts(bio_out, "EC2M\n");
1387 #if defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
1388 BIO_puts(bio_out, "ENGINE\n");
1390 #ifdef OPENSSL_NO_GOST
1391 BIO_puts(bio_out, "GOST\n");
1393 #ifdef OPENSSL_NO_IDEA
1394 BIO_puts(bio_out, "IDEA\n");
1396 #ifdef OPENSSL_NO_MD2
1397 BIO_puts(bio_out, "MD2\n");
1399 #ifdef OPENSSL_NO_MD4
1400 BIO_puts(bio_out, "MD4\n");
1402 #ifdef OPENSSL_NO_MD5
1403 BIO_puts(bio_out, "MD5\n");
1405 #ifdef OPENSSL_NO_MDC2
1406 BIO_puts(bio_out, "MDC2\n");
1408 #ifdef OPENSSL_NO_OCB
1409 BIO_puts(bio_out, "OCB\n");
1411 #ifdef OPENSSL_NO_OCSP
1412 BIO_puts(bio_out, "OCSP\n");
1414 #ifdef OPENSSL_NO_PSK
1415 BIO_puts(bio_out, "PSK\n");
1417 #ifdef OPENSSL_NO_RC2
1418 BIO_puts(bio_out, "RC2\n");
1420 #ifdef OPENSSL_NO_RC4
1421 BIO_puts(bio_out, "RC4\n");
1423 #ifdef OPENSSL_NO_RC5
1424 BIO_puts(bio_out, "RC5\n");
1426 #ifdef OPENSSL_NO_RMD160
1427 BIO_puts(bio_out, "RMD160\n");
1429 #ifdef OPENSSL_NO_SCRYPT
1430 BIO_puts(bio_out, "SCRYPT\n");
1432 #ifdef OPENSSL_NO_SCTP
1433 BIO_puts(bio_out, "SCTP\n");
1435 #ifdef OPENSSL_NO_SEED
1436 BIO_puts(bio_out, "SEED\n");
1438 #ifdef OPENSSL_NO_SM2
1439 BIO_puts(bio_out, "SM2\n");
1441 #ifdef OPENSSL_NO_SM3
1442 BIO_puts(bio_out, "SM3\n");
1444 #ifdef OPENSSL_NO_SM4
1445 BIO_puts(bio_out, "SM4\n");
1447 #ifdef OPENSSL_NO_SOCK
1448 BIO_puts(bio_out, "SOCK\n");
1450 #ifdef OPENSSL_NO_SRP
1451 BIO_puts(bio_out, "SRP\n");
1453 #ifdef OPENSSL_NO_SRTP
1454 BIO_puts(bio_out, "SRTP\n");
1456 #ifdef OPENSSL_NO_SSL3
1457 BIO_puts(bio_out, "SSL3\n");
1459 #ifdef OPENSSL_NO_TLS1
1460 BIO_puts(bio_out, "TLS1\n");
1462 #ifdef OPENSSL_NO_TLS1_1
1463 BIO_puts(bio_out, "TLS1_1\n");
1465 #ifdef OPENSSL_NO_TLS1_2
1466 BIO_puts(bio_out, "TLS1_2\n");
1468 #ifdef OPENSSL_NO_WHIRLPOOL
1469 BIO_puts(bio_out, "WHIRLPOOL\n");
1472 BIO_puts(bio_out, "ZLIB\n");
1476 /* Unified enum for help and list commands. */
1477 typedef enum HELPLIST_CHOICE {
1479 OPT_ONE, OPT_VERBOSE,
1480 OPT_COMMANDS, OPT_DIGEST_COMMANDS, OPT_MAC_ALGORITHMS, OPT_OPTIONS,
1481 OPT_DIGEST_ALGORITHMS, OPT_CIPHER_COMMANDS, OPT_CIPHER_ALGORITHMS,
1482 OPT_PK_ALGORITHMS, OPT_PK_METHOD, OPT_DISABLED,
1483 OPT_KDF_ALGORITHMS, OPT_RANDOM_INSTANCES, OPT_RANDOM_GENERATORS,
1484 OPT_ENCODERS, OPT_DECODERS, OPT_KEYMANAGERS, OPT_KEYEXCHANGE_ALGORITHMS,
1485 OPT_KEM_ALGORITHMS, OPT_SIGNATURE_ALGORITHMS, OPT_ASYM_CIPHER_ALGORITHMS,
1486 OPT_STORE_LOADERS, OPT_PROVIDER_INFO,
1487 OPT_OBJECTS, OPT_SELECT_NAME,
1488 #ifndef OPENSSL_NO_DEPRECATED_3_0
1494 const OPTIONS list_options[] = {
1496 OPT_SECTION("General"),
1497 {"help", OPT_HELP, '-', "Display this summary"},
1499 OPT_SECTION("Output"),
1500 {"1", OPT_ONE, '-', "List in one column"},
1501 {"verbose", OPT_VERBOSE, '-', "Verbose listing"},
1502 {"select", OPT_SELECT_NAME, 's', "Select a single algorithm"},
1503 {"commands", OPT_COMMANDS, '-', "List of standard commands"},
1504 {"standard-commands", OPT_COMMANDS, '-', "List of standard commands"},
1505 #ifndef OPENSSL_NO_DEPRECATED_3_0
1506 {"digest-commands", OPT_DIGEST_COMMANDS, '-',
1507 "List of message digest commands (deprecated)"},
1509 {"digest-algorithms", OPT_DIGEST_ALGORITHMS, '-',
1510 "List of message digest algorithms"},
1511 {"kdf-algorithms", OPT_KDF_ALGORITHMS, '-',
1512 "List of key derivation and pseudo random function algorithms"},
1513 {"random-instances", OPT_RANDOM_INSTANCES, '-',
1514 "List the primary, public and private random number generator details"},
1515 {"random-generators", OPT_RANDOM_GENERATORS, '-',
1516 "List of random number generators"},
1517 {"mac-algorithms", OPT_MAC_ALGORITHMS, '-',
1518 "List of message authentication code algorithms"},
1519 #ifndef OPENSSL_NO_DEPRECATED_3_0
1520 {"cipher-commands", OPT_CIPHER_COMMANDS, '-',
1521 "List of cipher commands (deprecated)"},
1523 {"cipher-algorithms", OPT_CIPHER_ALGORITHMS, '-',
1524 "List of cipher algorithms"},
1525 {"encoders", OPT_ENCODERS, '-', "List of encoding methods" },
1526 {"decoders", OPT_DECODERS, '-', "List of decoding methods" },
1527 {"key-managers", OPT_KEYMANAGERS, '-', "List of key managers" },
1528 {"key-exchange-algorithms", OPT_KEYEXCHANGE_ALGORITHMS, '-',
1529 "List of key exchange algorithms" },
1530 {"kem-algorithms", OPT_KEM_ALGORITHMS, '-',
1531 "List of key encapsulation mechanism algorithms" },
1532 {"signature-algorithms", OPT_SIGNATURE_ALGORITHMS, '-',
1533 "List of signature algorithms" },
1534 {"asymcipher-algorithms", OPT_ASYM_CIPHER_ALGORITHMS, '-',
1535 "List of asymmetric cipher algorithms" },
1536 {"public-key-algorithms", OPT_PK_ALGORITHMS, '-',
1537 "List of public key algorithms"},
1538 {"public-key-methods", OPT_PK_METHOD, '-',
1539 "List of public key methods"},
1540 {"store-loaders", OPT_STORE_LOADERS, '-',
1541 "List of store loaders"},
1542 {"providers", OPT_PROVIDER_INFO, '-',
1543 "List of provider information"},
1544 #ifndef OPENSSL_NO_DEPRECATED_3_0
1545 {"engines", OPT_ENGINES, '-',
1546 "List of loaded engines"},
1548 {"disabled", OPT_DISABLED, '-', "List of disabled features"},
1549 {"options", OPT_OPTIONS, 's',
1550 "List options for specified command"},
1551 {"objects", OPT_OBJECTS, '-',
1552 "List built in objects (OID<->name mappings)"},
1558 int list_main(int argc, char **argv)
1562 int one = 0, done = 0;
1564 unsigned int commands:1;
1565 unsigned int random_instances:1;
1566 unsigned int random_generators:1;
1567 unsigned int digest_commands:1;
1568 unsigned int digest_algorithms:1;
1569 unsigned int kdf_algorithms:1;
1570 unsigned int mac_algorithms:1;
1571 unsigned int cipher_commands:1;
1572 unsigned int cipher_algorithms:1;
1573 unsigned int encoder_algorithms:1;
1574 unsigned int decoder_algorithms:1;
1575 unsigned int keymanager_algorithms:1;
1576 unsigned int signature_algorithms:1;
1577 unsigned int keyexchange_algorithms:1;
1578 unsigned int kem_algorithms:1;
1579 unsigned int asym_cipher_algorithms:1;
1580 unsigned int pk_algorithms:1;
1581 unsigned int pk_method:1;
1582 unsigned int store_loaders:1;
1583 unsigned int provider_info:1;
1584 #ifndef OPENSSL_NO_DEPRECATED_3_0
1585 unsigned int engines:1;
1587 unsigned int disabled:1;
1588 unsigned int objects:1;
1589 unsigned int options:1;
1592 verbose = 0; /* Clear a possible previous call */
1594 prog = opt_init(argc, argv, list_options);
1595 while ((o = opt_next()) != OPT_EOF) {
1597 case OPT_EOF: /* Never hit, but suppresses warning */
1600 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1603 opt_help(list_options);
1611 case OPT_DIGEST_COMMANDS:
1612 todo.digest_commands = 1;
1614 case OPT_DIGEST_ALGORITHMS:
1615 todo.digest_algorithms = 1;
1617 case OPT_KDF_ALGORITHMS:
1618 todo.kdf_algorithms = 1;
1620 case OPT_RANDOM_INSTANCES:
1621 todo.random_instances = 1;
1623 case OPT_RANDOM_GENERATORS:
1624 todo.random_generators = 1;
1626 case OPT_MAC_ALGORITHMS:
1627 todo.mac_algorithms = 1;
1629 case OPT_CIPHER_COMMANDS:
1630 todo.cipher_commands = 1;
1632 case OPT_CIPHER_ALGORITHMS:
1633 todo.cipher_algorithms = 1;
1636 todo.encoder_algorithms = 1;
1639 todo.decoder_algorithms = 1;
1641 case OPT_KEYMANAGERS:
1642 todo.keymanager_algorithms = 1;
1644 case OPT_SIGNATURE_ALGORITHMS:
1645 todo.signature_algorithms = 1;
1647 case OPT_KEYEXCHANGE_ALGORITHMS:
1648 todo.keyexchange_algorithms = 1;
1650 case OPT_KEM_ALGORITHMS:
1651 todo.kem_algorithms = 1;
1653 case OPT_ASYM_CIPHER_ALGORITHMS:
1654 todo.asym_cipher_algorithms = 1;
1656 case OPT_PK_ALGORITHMS:
1657 todo.pk_algorithms = 1;
1662 case OPT_STORE_LOADERS:
1663 todo.store_loaders = 1;
1665 case OPT_PROVIDER_INFO:
1666 todo.provider_info = 1;
1668 #ifndef OPENSSL_NO_DEPRECATED_3_0
1680 list_options_for_command(opt_arg());
1685 case OPT_SELECT_NAME:
1686 select_name = opt_arg();
1688 case OPT_PROV_CASES:
1689 if (!opt_provider(o))
1696 /* No extra arguments. */
1697 if (opt_num_rest() != 0)
1701 list_type(FT_general, one);
1702 if (todo.random_instances)
1703 list_random_instances();
1704 if (todo.random_generators)
1705 list_random_generators();
1706 if (todo.digest_commands)
1707 list_type(FT_md, one);
1708 if (todo.digest_algorithms)
1710 if (todo.kdf_algorithms)
1712 if (todo.mac_algorithms)
1714 if (todo.cipher_commands)
1715 list_type(FT_cipher, one);
1716 if (todo.cipher_algorithms)
1718 if (todo.encoder_algorithms)
1720 if (todo.decoder_algorithms)
1722 if (todo.keymanager_algorithms)
1724 if (todo.signature_algorithms)
1726 if (todo.asym_cipher_algorithms)
1728 if (todo.keyexchange_algorithms)
1729 list_keyexchanges();
1730 if (todo.kem_algorithms)
1732 if (todo.pk_algorithms)
1736 if (todo.store_loaders)
1737 list_store_loaders();
1738 if (todo.provider_info)
1739 list_provider_info();
1740 #ifndef OPENSSL_NO_DEPRECATED_3_0