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 ## _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_name(c)) != 0))
76 BIO_printf(arg, " %s\n", EVP_CIPHER_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_number(*a) - EVP_CIPHER_number(*b);
94 ret = strcmp(OSSL_PROVIDER_name(EVP_CIPHER_provider(*a)),
95 OSSL_PROVIDER_name(EVP_CIPHER_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_provider(c)));
144 const char *desc = EVP_CIPHER_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_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_number(*a) - EVP_MD_number(*b);
183 ret = strcmp(OSSL_PROVIDER_name(EVP_MD_provider(*a)),
184 OSSL_PROVIDER_name(EVP_MD_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", OSSL_PROVIDER_name(EVP_MD_provider(m)));
232 const char *desc = EVP_MD_description(m);
235 BIO_printf(bio_out, " description: %s\n", desc);
236 print_param_types("retrievable algorithm parameters",
237 EVP_MD_gettable_params(m), 4);
238 print_param_types("retrievable operation parameters",
239 EVP_MD_gettable_ctx_params(m), 4);
240 print_param_types("settable operation parameters",
241 EVP_MD_settable_ctx_params(m), 4);
244 sk_OPENSSL_CSTRING_free(names);
246 sk_EVP_MD_pop_free(digests, EVP_MD_free);
249 DEFINE_STACK_OF(EVP_MAC)
250 static int mac_cmp(const EVP_MAC * const *a, const EVP_MAC * const *b)
252 int ret = EVP_MAC_number(*a) - EVP_MAC_number(*b);
255 ret = strcmp(OSSL_PROVIDER_name(EVP_MAC_provider(*a)),
256 OSSL_PROVIDER_name(EVP_MAC_provider(*b)));
261 static void collect_macs(EVP_MAC *mac, void *stack)
263 STACK_OF(EVP_MAC) *mac_stack = stack;
265 if (is_mac_fetchable(mac)
266 && sk_EVP_MAC_push(mac_stack, mac) > 0)
270 static void list_macs(void)
272 STACK_OF(EVP_MAC) *macs = sk_EVP_MAC_new(mac_cmp);
276 BIO_printf(bio_err, "ERROR: Memory allocation\n");
279 BIO_printf(bio_out, "Provided MACs:\n");
280 EVP_MAC_do_all_provided(NULL, collect_macs, macs);
281 sk_EVP_MAC_sort(macs);
282 for (i = 0; i < sk_EVP_MAC_num(macs); i++) {
283 const EVP_MAC *m = sk_EVP_MAC_value(macs, i);
284 STACK_OF(OPENSSL_CSTRING) *names = NULL;
286 if (select_name != NULL && !EVP_MAC_is_a(m, select_name))
289 names = sk_OPENSSL_CSTRING_new(name_cmp);
290 if (names != NULL && EVP_MAC_names_do_all(m, collect_names, names)) {
291 BIO_printf(bio_out, " ");
292 print_names(bio_out, names);
294 BIO_printf(bio_out, " @ %s\n", OSSL_PROVIDER_name(EVP_MAC_provider(m)));
297 const char *desc = EVP_MAC_description(m);
300 BIO_printf(bio_out, " description: %s\n", desc);
301 print_param_types("retrievable algorithm parameters",
302 EVP_MAC_gettable_params(m), 4);
303 print_param_types("retrievable operation parameters",
304 EVP_MAC_gettable_ctx_params(m), 4);
305 print_param_types("settable operation parameters",
306 EVP_MAC_settable_ctx_params(m), 4);
309 sk_OPENSSL_CSTRING_free(names);
311 sk_EVP_MAC_pop_free(macs, EVP_MAC_free);
317 DEFINE_STACK_OF(EVP_KDF)
318 static int kdf_cmp(const EVP_KDF * const *a, const EVP_KDF * const *b)
320 int ret = EVP_KDF_number(*a) - EVP_KDF_number(*b);
323 ret = strcmp(OSSL_PROVIDER_name(EVP_KDF_provider(*a)),
324 OSSL_PROVIDER_name(EVP_KDF_provider(*b)));
329 static void collect_kdfs(EVP_KDF *kdf, void *stack)
331 STACK_OF(EVP_KDF) *kdf_stack = stack;
333 if (is_kdf_fetchable(kdf)
334 && sk_EVP_KDF_push(kdf_stack, kdf) > 0)
338 static void list_kdfs(void)
340 STACK_OF(EVP_KDF) *kdfs = sk_EVP_KDF_new(kdf_cmp);
344 BIO_printf(bio_err, "ERROR: Memory allocation\n");
347 BIO_printf(bio_out, "Provided KDFs and PDFs:\n");
348 EVP_KDF_do_all_provided(NULL, collect_kdfs, kdfs);
349 sk_EVP_KDF_sort(kdfs);
350 for (i = 0; i < sk_EVP_KDF_num(kdfs); i++) {
351 const EVP_KDF *k = sk_EVP_KDF_value(kdfs, i);
352 STACK_OF(OPENSSL_CSTRING) *names = NULL;
354 if (select_name != NULL && !EVP_KDF_is_a(k, select_name))
357 names = sk_OPENSSL_CSTRING_new(name_cmp);
358 if (names != NULL && EVP_KDF_names_do_all(k, collect_names, names)) {
359 BIO_printf(bio_out, " ");
360 print_names(bio_out, names);
362 BIO_printf(bio_out, " @ %s\n", OSSL_PROVIDER_name(EVP_KDF_provider(k)));
365 const char *desc = EVP_KDF_description(k);
368 BIO_printf(bio_out, " description: %s\n", desc);
369 print_param_types("retrievable algorithm parameters",
370 EVP_KDF_gettable_params(k), 4);
371 print_param_types("retrievable operation parameters",
372 EVP_KDF_gettable_ctx_params(k), 4);
373 print_param_types("settable operation parameters",
374 EVP_KDF_settable_ctx_params(k), 4);
377 sk_OPENSSL_CSTRING_free(names);
379 sk_EVP_KDF_pop_free(kdfs, EVP_KDF_free);
385 DEFINE_STACK_OF(EVP_RAND)
387 static int rand_cmp(const EVP_RAND * const *a, const EVP_RAND * const *b)
389 int ret = strcasecmp(EVP_RAND_name(*a), EVP_RAND_name(*b));
392 ret = strcmp(OSSL_PROVIDER_name(EVP_RAND_provider(*a)),
393 OSSL_PROVIDER_name(EVP_RAND_provider(*b)));
398 static void collect_rands(EVP_RAND *rand, void *stack)
400 STACK_OF(EVP_RAND) *rand_stack = stack;
402 if (is_rand_fetchable(rand)
403 && sk_EVP_RAND_push(rand_stack, rand) > 0)
404 EVP_RAND_up_ref(rand);
407 static void list_random_generators(void)
409 STACK_OF(EVP_RAND) *rands = sk_EVP_RAND_new(rand_cmp);
413 BIO_printf(bio_err, "ERROR: Memory allocation\n");
416 BIO_printf(bio_out, "Provided RNGs and seed sources:\n");
417 EVP_RAND_do_all_provided(NULL, collect_rands, rands);
418 sk_EVP_RAND_sort(rands);
419 for (i = 0; i < sk_EVP_RAND_num(rands); i++) {
420 const EVP_RAND *m = sk_EVP_RAND_value(rands, i);
422 if (select_name != NULL
423 && strcasecmp(EVP_RAND_name(m), select_name) != 0)
425 BIO_printf(bio_out, " %s", EVP_RAND_name(m));
426 BIO_printf(bio_out, " @ %s\n", OSSL_PROVIDER_name(EVP_RAND_provider(m)));
429 const char *desc = EVP_RAND_description(m);
432 BIO_printf(bio_out, " description: %s\n", desc);
433 print_param_types("retrievable algorithm parameters",
434 EVP_RAND_gettable_params(m), 4);
435 print_param_types("retrievable operation parameters",
436 EVP_RAND_gettable_ctx_params(m), 4);
437 print_param_types("settable operation parameters",
438 EVP_RAND_settable_ctx_params(m), 4);
441 sk_EVP_RAND_pop_free(rands, EVP_RAND_free);
444 static void display_random(const char *name, EVP_RAND_CTX *drbg)
449 const OSSL_PARAM *gettables;
450 OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
451 unsigned char buf[1000];
453 BIO_printf(bio_out, "%s:\n", name);
455 rand = EVP_RAND_CTX_rand(drbg);
457 BIO_printf(bio_out, " %s", EVP_RAND_name(rand));
458 BIO_printf(bio_out, " @ %s\n",
459 OSSL_PROVIDER_name(EVP_RAND_provider(rand)));
461 switch (EVP_RAND_state(drbg)) {
462 case EVP_RAND_STATE_UNINITIALISED:
465 case EVP_RAND_STATE_READY:
468 case EVP_RAND_STATE_ERROR:
475 BIO_printf(bio_out, " state = %s\n", p);
477 gettables = EVP_RAND_gettable_ctx_params(rand);
478 if (gettables != NULL)
479 for (; gettables->key != NULL; gettables++) {
480 /* State has been dealt with already, so ignore */
481 if (strcasecmp(gettables->key, OSSL_RAND_PARAM_STATE) == 0)
483 /* Outside of verbose mode, we skip non-string values */
484 if (gettables->data_type != OSSL_PARAM_UTF8_STRING
485 && gettables->data_type != OSSL_PARAM_UTF8_PTR
488 params->key = gettables->key;
489 params->data_type = gettables->data_type;
490 if (gettables->data_type == OSSL_PARAM_UNSIGNED_INTEGER
491 || gettables->data_type == OSSL_PARAM_INTEGER) {
493 params->data_size = sizeof(u);
496 params->data_size = sizeof(buf);
498 params->return_size = 0;
499 if (EVP_RAND_CTX_get_params(drbg, params))
500 print_param_value(params, 2);
505 static void list_random_instances(void)
507 display_random("primary", RAND_get0_primary(NULL));
508 display_random("public", RAND_get0_public(NULL));
509 display_random("private", RAND_get0_private(NULL));
515 DEFINE_STACK_OF(OSSL_ENCODER)
516 static int encoder_cmp(const OSSL_ENCODER * const *a,
517 const OSSL_ENCODER * const *b)
519 int ret = OSSL_ENCODER_number(*a) - OSSL_ENCODER_number(*b);
522 ret = strcmp(OSSL_PROVIDER_name(OSSL_ENCODER_provider(*a)),
523 OSSL_PROVIDER_name(OSSL_ENCODER_provider(*b)));
527 static void collect_encoders(OSSL_ENCODER *encoder, void *stack)
529 STACK_OF(OSSL_ENCODER) *encoder_stack = stack;
531 if (is_encoder_fetchable(encoder)
532 && sk_OSSL_ENCODER_push(encoder_stack, encoder) > 0)
533 OSSL_ENCODER_up_ref(encoder);
536 static void list_encoders(void)
538 STACK_OF(OSSL_ENCODER) *encoders;
541 encoders = sk_OSSL_ENCODER_new(encoder_cmp);
542 if (encoders == NULL) {
543 BIO_printf(bio_err, "ERROR: Memory allocation\n");
546 BIO_printf(bio_out, "Provided ENCODERs:\n");
547 OSSL_ENCODER_do_all_provided(NULL, collect_encoders, encoders);
548 sk_OSSL_ENCODER_sort(encoders);
550 for (i = 0; i < sk_OSSL_ENCODER_num(encoders); i++) {
551 OSSL_ENCODER *k = sk_OSSL_ENCODER_value(encoders, i);
552 STACK_OF(OPENSSL_CSTRING) *names = NULL;
554 if (select_name != NULL && !OSSL_ENCODER_is_a(k, select_name))
557 names = sk_OPENSSL_CSTRING_new(name_cmp);
558 if (names != NULL && OSSL_ENCODER_names_do_all(k, collect_names, names)) {
559 BIO_printf(bio_out, " ");
560 print_names(bio_out, names);
562 BIO_printf(bio_out, " @ %s (%s)\n",
563 OSSL_PROVIDER_name(OSSL_ENCODER_provider(k)),
564 OSSL_ENCODER_properties(k));
567 const char *desc = OSSL_ENCODER_description(k);
570 BIO_printf(bio_out, " description: %s\n", desc);
571 print_param_types("settable operation parameters",
572 OSSL_ENCODER_settable_ctx_params(k), 4);
575 sk_OPENSSL_CSTRING_free(names);
577 sk_OSSL_ENCODER_pop_free(encoders, OSSL_ENCODER_free);
583 DEFINE_STACK_OF(OSSL_DECODER)
584 static int decoder_cmp(const OSSL_DECODER * const *a,
585 const OSSL_DECODER * const *b)
587 int ret = OSSL_DECODER_number(*a) - OSSL_DECODER_number(*b);
590 ret = strcmp(OSSL_PROVIDER_name(OSSL_DECODER_provider(*a)),
591 OSSL_PROVIDER_name(OSSL_DECODER_provider(*b)));
595 static void collect_decoders(OSSL_DECODER *decoder, void *stack)
597 STACK_OF(OSSL_DECODER) *decoder_stack = stack;
599 if (is_decoder_fetchable(decoder)
600 && sk_OSSL_DECODER_push(decoder_stack, decoder) > 0)
601 OSSL_DECODER_up_ref(decoder);
604 static void list_decoders(void)
606 STACK_OF(OSSL_DECODER) *decoders;
609 decoders = sk_OSSL_DECODER_new(decoder_cmp);
610 if (decoders == NULL) {
611 BIO_printf(bio_err, "ERROR: Memory allocation\n");
614 BIO_printf(bio_out, "Provided DECODERs:\n");
615 OSSL_DECODER_do_all_provided(NULL, collect_decoders,
617 sk_OSSL_DECODER_sort(decoders);
619 for (i = 0; i < sk_OSSL_DECODER_num(decoders); i++) {
620 OSSL_DECODER *k = sk_OSSL_DECODER_value(decoders, i);
621 STACK_OF(OPENSSL_CSTRING) *names = NULL;
623 if (select_name != NULL && !OSSL_DECODER_is_a(k, select_name))
626 names = sk_OPENSSL_CSTRING_new(name_cmp);
627 if (names != NULL && OSSL_DECODER_names_do_all(k, collect_names, names)) {
628 BIO_printf(bio_out, " ");
629 print_names(bio_out, names);
631 BIO_printf(bio_out, " @ %s (%s)\n",
632 OSSL_PROVIDER_name(OSSL_DECODER_provider(k)),
633 OSSL_DECODER_properties(k));
636 const char *desc = OSSL_DECODER_description(k);
639 BIO_printf(bio_out, " description: %s\n", desc);
640 print_param_types("settable operation parameters",
641 OSSL_DECODER_settable_ctx_params(k), 4);
644 sk_OPENSSL_CSTRING_free(names);
646 sk_OSSL_DECODER_pop_free(decoders, OSSL_DECODER_free);
649 DEFINE_STACK_OF(EVP_KEYMGMT)
650 static int keymanager_cmp(const EVP_KEYMGMT * const *a,
651 const EVP_KEYMGMT * const *b)
653 int ret = EVP_KEYMGMT_number(*a) - EVP_KEYMGMT_number(*b);
656 ret = strcmp(OSSL_PROVIDER_name(EVP_KEYMGMT_provider(*a)),
657 OSSL_PROVIDER_name(EVP_KEYMGMT_provider(*b)));
661 static void collect_keymanagers(EVP_KEYMGMT *km, void *stack)
663 STACK_OF(EVP_KEYMGMT) *km_stack = stack;
665 if (is_keymgmt_fetchable(km)
666 && sk_EVP_KEYMGMT_push(km_stack, km) > 0)
667 EVP_KEYMGMT_up_ref(km);
670 static void list_keymanagers(void)
673 STACK_OF(EVP_KEYMGMT) *km_stack = sk_EVP_KEYMGMT_new(keymanager_cmp);
675 EVP_KEYMGMT_do_all_provided(NULL, collect_keymanagers, km_stack);
676 sk_EVP_KEYMGMT_sort(km_stack);
678 for (i = 0; i < sk_EVP_KEYMGMT_num(km_stack); i++) {
679 EVP_KEYMGMT *k = sk_EVP_KEYMGMT_value(km_stack, i);
680 STACK_OF(OPENSSL_CSTRING) *names = NULL;
682 if (select_name != NULL && !EVP_KEYMGMT_is_a(k, select_name))
685 names = sk_OPENSSL_CSTRING_new(name_cmp);
686 if (names != NULL && EVP_KEYMGMT_names_do_all(k, collect_names, names)) {
687 const char *desc = EVP_KEYMGMT_description(k);
689 BIO_printf(bio_out, " Name: ");
691 BIO_printf(bio_out, "%s", desc);
693 BIO_printf(bio_out, "%s", sk_OPENSSL_CSTRING_value(names, 0));
694 BIO_printf(bio_out, "\n");
695 BIO_printf(bio_out, " Type: Provider Algorithm\n");
696 BIO_printf(bio_out, " IDs: ");
697 print_names(bio_out, names);
698 BIO_printf(bio_out, " @ %s\n",
699 OSSL_PROVIDER_name(EVP_KEYMGMT_provider(k)));
702 print_param_types("settable key generation parameters",
703 EVP_KEYMGMT_gen_settable_params(k), 4);
704 print_param_types("settable operation parameters",
705 EVP_KEYMGMT_settable_params(k), 4);
706 print_param_types("retrievable operation parameters",
707 EVP_KEYMGMT_gettable_params(k), 4);
710 sk_OPENSSL_CSTRING_free(names);
712 sk_EVP_KEYMGMT_pop_free(km_stack, EVP_KEYMGMT_free);
715 DEFINE_STACK_OF(EVP_SIGNATURE)
716 static int signature_cmp(const EVP_SIGNATURE * const *a,
717 const EVP_SIGNATURE * const *b)
719 int ret = EVP_SIGNATURE_number(*a) - EVP_SIGNATURE_number(*b);
722 ret = strcmp(OSSL_PROVIDER_name(EVP_SIGNATURE_provider(*a)),
723 OSSL_PROVIDER_name(EVP_SIGNATURE_provider(*b)));
727 static void collect_signatures(EVP_SIGNATURE *sig, void *stack)
729 STACK_OF(EVP_SIGNATURE) *sig_stack = stack;
731 if (is_signature_fetchable(sig)
732 && sk_EVP_SIGNATURE_push(sig_stack, sig) > 0)
733 EVP_SIGNATURE_up_ref(sig);
736 static void list_signatures(void)
739 STACK_OF(EVP_SIGNATURE) *sig_stack = sk_EVP_SIGNATURE_new(signature_cmp);
741 EVP_SIGNATURE_do_all_provided(NULL, collect_signatures, sig_stack);
742 sk_EVP_SIGNATURE_sort(sig_stack);
744 for (i = 0; i < sk_EVP_SIGNATURE_num(sig_stack); i++) {
745 EVP_SIGNATURE *k = sk_EVP_SIGNATURE_value(sig_stack, i);
746 STACK_OF(OPENSSL_CSTRING) *names = NULL;
748 if (select_name != NULL && !EVP_SIGNATURE_is_a(k, select_name))
751 names = sk_OPENSSL_CSTRING_new(name_cmp);
752 if (names != NULL && EVP_SIGNATURE_names_do_all(k, collect_names, names)) {
754 BIO_printf(bio_out, " ");
755 print_names(bio_out, names);
757 BIO_printf(bio_out, " @ %s\n",
758 OSSL_PROVIDER_name(EVP_SIGNATURE_provider(k)));
761 const char *desc = EVP_SIGNATURE_description(k);
764 BIO_printf(bio_out, " description: %s\n", desc);
765 print_param_types("settable operation parameters",
766 EVP_SIGNATURE_settable_ctx_params(k), 4);
767 print_param_types("retrievable operation parameters",
768 EVP_SIGNATURE_gettable_ctx_params(k), 4);
771 sk_OPENSSL_CSTRING_free(names);
773 sk_EVP_SIGNATURE_pop_free(sig_stack, EVP_SIGNATURE_free);
775 BIO_printf(bio_out, " -\n");
778 DEFINE_STACK_OF(EVP_KEM)
779 static int kem_cmp(const EVP_KEM * const *a,
780 const EVP_KEM * const *b)
782 int ret = EVP_KEM_number(*a) - EVP_KEM_number(*b);
785 ret = strcmp(OSSL_PROVIDER_name(EVP_KEM_provider(*a)),
786 OSSL_PROVIDER_name(EVP_KEM_provider(*b)));
790 static void collect_kem(EVP_KEM *kem, void *stack)
792 STACK_OF(EVP_KEM) *kem_stack = stack;
794 if (is_kem_fetchable(kem)
795 && sk_EVP_KEM_push(kem_stack, kem) > 0)
799 static void list_kems(void)
802 STACK_OF(EVP_KEM) *kem_stack = sk_EVP_KEM_new(kem_cmp);
804 EVP_KEM_do_all_provided(NULL, collect_kem, kem_stack);
805 sk_EVP_KEM_sort(kem_stack);
807 for (i = 0; i < sk_EVP_KEM_num(kem_stack); i++) {
808 EVP_KEM *k = sk_EVP_KEM_value(kem_stack, i);
809 STACK_OF(OPENSSL_CSTRING) *names = NULL;
811 if (select_name != NULL && !EVP_KEM_is_a(k, select_name))
814 names = sk_OPENSSL_CSTRING_new(name_cmp);
815 if (names != NULL && EVP_KEM_names_do_all(k, collect_names, names)) {
817 BIO_printf(bio_out, " ");
818 print_names(bio_out, names);
820 BIO_printf(bio_out, " @ %s\n", OSSL_PROVIDER_name(EVP_KEM_provider(k)));
823 const char *desc = EVP_KEM_description(k);
826 BIO_printf(bio_out, " description: %s\n", desc);
827 print_param_types("settable operation parameters",
828 EVP_KEM_settable_ctx_params(k), 4);
829 print_param_types("retrievable operation parameters",
830 EVP_KEM_gettable_ctx_params(k), 4);
833 sk_OPENSSL_CSTRING_free(names);
835 sk_EVP_KEM_pop_free(kem_stack, EVP_KEM_free);
837 BIO_printf(bio_out, " -\n");
840 DEFINE_STACK_OF(EVP_ASYM_CIPHER)
841 static int asymcipher_cmp(const EVP_ASYM_CIPHER * const *a,
842 const EVP_ASYM_CIPHER * const *b)
844 int ret = EVP_ASYM_CIPHER_number(*a) - EVP_ASYM_CIPHER_number(*b);
847 ret = strcmp(OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(*a)),
848 OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(*b)));
852 static void collect_asymciph(EVP_ASYM_CIPHER *asym_cipher, void *stack)
854 STACK_OF(EVP_ASYM_CIPHER) *asym_cipher_stack = stack;
856 if (is_asym_cipher_fetchable(asym_cipher)
857 && sk_EVP_ASYM_CIPHER_push(asym_cipher_stack, asym_cipher) > 0)
858 EVP_ASYM_CIPHER_up_ref(asym_cipher);
861 static void list_asymciphers(void)
864 STACK_OF(EVP_ASYM_CIPHER) *asymciph_stack =
865 sk_EVP_ASYM_CIPHER_new(asymcipher_cmp);
867 EVP_ASYM_CIPHER_do_all_provided(NULL, collect_asymciph, asymciph_stack);
868 sk_EVP_ASYM_CIPHER_sort(asymciph_stack);
870 for (i = 0; i < sk_EVP_ASYM_CIPHER_num(asymciph_stack); i++) {
871 EVP_ASYM_CIPHER *k = sk_EVP_ASYM_CIPHER_value(asymciph_stack, i);
872 STACK_OF(OPENSSL_CSTRING) *names = NULL;
874 if (select_name != NULL && !EVP_ASYM_CIPHER_is_a(k, select_name))
877 names = sk_OPENSSL_CSTRING_new(name_cmp);
879 && EVP_ASYM_CIPHER_names_do_all(k, collect_names, names)) {
881 BIO_printf(bio_out, " ");
882 print_names(bio_out, names);
884 BIO_printf(bio_out, " @ %s\n",
885 OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(k)));
888 const char *desc = EVP_ASYM_CIPHER_description(k);
891 BIO_printf(bio_out, " description: %s\n", desc);
892 print_param_types("settable operation parameters",
893 EVP_ASYM_CIPHER_settable_ctx_params(k), 4);
894 print_param_types("retrievable operation parameters",
895 EVP_ASYM_CIPHER_gettable_ctx_params(k), 4);
898 sk_OPENSSL_CSTRING_free(names);
900 sk_EVP_ASYM_CIPHER_pop_free(asymciph_stack, EVP_ASYM_CIPHER_free);
902 BIO_printf(bio_out, " -\n");
905 DEFINE_STACK_OF(EVP_KEYEXCH)
906 static int kex_cmp(const EVP_KEYEXCH * const *a,
907 const EVP_KEYEXCH * const *b)
909 int ret = EVP_KEYEXCH_number(*a) - EVP_KEYEXCH_number(*b);
912 ret = strcmp(OSSL_PROVIDER_name(EVP_KEYEXCH_provider(*a)),
913 OSSL_PROVIDER_name(EVP_KEYEXCH_provider(*b)));
917 static void collect_kex(EVP_KEYEXCH *kex, void *stack)
919 STACK_OF(EVP_KEYEXCH) *kex_stack = stack;
921 if (is_keyexch_fetchable(kex)
922 && sk_EVP_KEYEXCH_push(kex_stack, kex) > 0)
923 EVP_KEYEXCH_up_ref(kex);
926 static void list_keyexchanges(void)
929 STACK_OF(EVP_KEYEXCH) *kex_stack = sk_EVP_KEYEXCH_new(kex_cmp);
931 EVP_KEYEXCH_do_all_provided(NULL, collect_kex, kex_stack);
932 sk_EVP_KEYEXCH_sort(kex_stack);
934 for (i = 0; i < sk_EVP_KEYEXCH_num(kex_stack); i++) {
935 EVP_KEYEXCH *k = sk_EVP_KEYEXCH_value(kex_stack, i);
936 STACK_OF(OPENSSL_CSTRING) *names = NULL;
938 if (select_name != NULL && !EVP_KEYEXCH_is_a(k, select_name))
941 names = sk_OPENSSL_CSTRING_new(name_cmp);
942 if (names != NULL && EVP_KEYEXCH_names_do_all(k, collect_names, names)) {
944 BIO_printf(bio_out, " ");
945 print_names(bio_out, names);
947 BIO_printf(bio_out, " @ %s\n",
948 OSSL_PROVIDER_name(EVP_KEYEXCH_provider(k)));
951 const char *desc = EVP_KEYEXCH_description(k);
954 BIO_printf(bio_out, " description: %s\n", desc);
955 print_param_types("settable operation parameters",
956 EVP_KEYEXCH_settable_ctx_params(k), 4);
957 print_param_types("retrievable operation parameters",
958 EVP_KEYEXCH_gettable_ctx_params(k), 4);
961 sk_OPENSSL_CSTRING_free(names);
963 sk_EVP_KEYEXCH_pop_free(kex_stack, EVP_KEYEXCH_free);
965 BIO_printf(bio_out, " -\n");
968 static void list_objects(void)
970 int max_nid = OBJ_new_nid(0);
972 char *oid_buf = NULL;
975 /* Skip 0, since that's NID_undef */
976 for (i = 1; i < max_nid; i++) {
977 const ASN1_OBJECT *obj = OBJ_nid2obj(i);
978 const char *sn = OBJ_nid2sn(i);
979 const char *ln = OBJ_nid2ln(i);
983 * If one of the retrieved objects somehow generated an error,
984 * we ignore it. The check for NID_undef below will detect the
985 * error and simply skip to the next NID.
989 if (OBJ_obj2nid(obj) == NID_undef)
992 if ((n = OBJ_obj2txt(NULL, 0, obj, 1)) == 0) {
993 BIO_printf(bio_out, "# None-OID object: %s, %s\n", sn, ln);
1000 oid_buf = OPENSSL_realloc(oid_buf, n + 1);
1001 if (oid_buf == NULL) {
1002 BIO_printf(bio_err, "ERROR: Memory allocation\n");
1007 if (OBJ_obj2txt(oid_buf, oid_size, obj, 1) < 0)
1009 if (ln == NULL || strcmp(sn, ln) == 0)
1010 BIO_printf(bio_out, "%s = %s\n", sn, oid_buf);
1012 BIO_printf(bio_out, "%s = %s, %s\n", sn, ln, oid_buf);
1015 OPENSSL_free(oid_buf);
1018 static void list_options_for_command(const char *command)
1023 for (fp = functions; fp->name != NULL; fp++)
1024 if (strcmp(fp->name, command) == 0)
1026 if (fp->name == NULL) {
1027 BIO_printf(bio_err, "Invalid command '%s'; type \"help\" for a list.\n",
1032 if ((o = fp->help) == NULL)
1035 for ( ; o->name != NULL; o++) {
1036 char c = o->valtype;
1038 if (o->name == OPT_PARAM_STR)
1041 if (o->name == OPT_HELP_STR
1042 || o->name == OPT_MORE_STR
1043 || o->name == OPT_SECTION_STR
1044 || o->name[0] == '\0')
1046 BIO_printf(bio_out, "%s %c\n", o->name, c == '\0' ? '-' : c);
1048 /* Always output the -- marker since it is sometimes documented. */
1049 BIO_printf(bio_out, "- -\n");
1052 static int is_md_available(const char *name)
1055 const char *propq = app_get0_propq();
1057 /* Look through providers' digests */
1059 md = EVP_MD_fetch(NULL, name, propq);
1066 return propq != NULL || get_digest_from_engine(name) == NULL ? 0 : 1;
1069 static int is_cipher_available(const char *name)
1072 const char *propq = app_get0_propq();
1074 /* Look through providers' ciphers */
1076 cipher = EVP_CIPHER_fetch(NULL, name, propq);
1078 if (cipher != NULL) {
1079 EVP_CIPHER_free(cipher);
1083 return propq != NULL || get_cipher_from_engine(name) == NULL ? 0 : 1;
1086 static void list_type(FUNC_TYPE ft, int one)
1092 memset(&dc, 0, sizeof(dc));
1094 calculate_columns(functions, &dc);
1096 for (fp = functions; fp->name != NULL; fp++) {
1101 if (!is_cipher_available(fp->name))
1105 if (!is_md_available(fp->name))
1112 BIO_printf(bio_out, "%s\n", fp->name);
1114 if (i % dc.columns == 0 && i > 0)
1115 BIO_printf(bio_out, "\n");
1116 BIO_printf(bio_out, "%-*s", dc.width, fp->name);
1121 BIO_printf(bio_out, "\n\n");
1124 static void list_pkey(void)
1126 #ifndef OPENSSL_NO_DEPRECATED_3_0
1129 if (select_name == NULL && include_legacy()) {
1130 BIO_printf(bio_out, "Legacy:\n");
1131 for (i = 0; i < EVP_PKEY_asn1_get_count(); i++) {
1132 const EVP_PKEY_ASN1_METHOD *ameth;
1133 int pkey_id, pkey_base_id, pkey_flags;
1134 const char *pinfo, *pem_str;
1135 ameth = EVP_PKEY_asn1_get0(i);
1136 EVP_PKEY_asn1_get0_info(&pkey_id, &pkey_base_id, &pkey_flags,
1137 &pinfo, &pem_str, ameth);
1138 if (pkey_flags & ASN1_PKEY_ALIAS) {
1139 BIO_printf(bio_out, " Name: %s\n", OBJ_nid2ln(pkey_id));
1140 BIO_printf(bio_out, "\tAlias for: %s\n",
1141 OBJ_nid2ln(pkey_base_id));
1143 BIO_printf(bio_out, " Name: %s\n", pinfo);
1144 BIO_printf(bio_out, "\tType: %s Algorithm\n",
1145 pkey_flags & ASN1_PKEY_DYNAMIC ?
1146 "External" : "Builtin");
1147 BIO_printf(bio_out, "\tOID: %s\n", OBJ_nid2ln(pkey_id));
1148 if (pem_str == NULL)
1150 BIO_printf(bio_out, "\tPEM string: %s\n", pem_str);
1155 BIO_printf(bio_out, "Provided:\n");
1156 BIO_printf(bio_out, " Key Managers:\n");
1160 static void list_pkey_meth(void)
1162 #ifndef OPENSSL_NO_DEPRECATED_3_0
1164 size_t meth_count = EVP_PKEY_meth_get_count();
1166 if (select_name == NULL && include_legacy()) {
1167 BIO_printf(bio_out, "Legacy:\n");
1168 for (i = 0; i < meth_count; i++) {
1169 const EVP_PKEY_METHOD *pmeth = EVP_PKEY_meth_get0(i);
1170 int pkey_id, pkey_flags;
1172 EVP_PKEY_meth_get0_info(&pkey_id, &pkey_flags, pmeth);
1173 BIO_printf(bio_out, " %s\n", OBJ_nid2ln(pkey_id));
1174 BIO_printf(bio_out, "\tType: %s Algorithm\n",
1175 pkey_flags & ASN1_PKEY_DYNAMIC ? "External" : "Builtin");
1179 BIO_printf(bio_out, "Provided:\n");
1180 BIO_printf(bio_out, " Encryption:\n");
1182 BIO_printf(bio_out, " Key Exchange:\n");
1183 list_keyexchanges();
1184 BIO_printf(bio_out, " Signatures:\n");
1186 BIO_printf(bio_out, " Key encapsulation:\n");
1190 DEFINE_STACK_OF(OSSL_STORE_LOADER)
1191 static int store_cmp(const OSSL_STORE_LOADER * const *a,
1192 const OSSL_STORE_LOADER * const *b)
1194 int ret = OSSL_STORE_LOADER_number(*a) - OSSL_STORE_LOADER_number(*b);
1197 ret = strcmp(OSSL_PROVIDER_name(OSSL_STORE_LOADER_provider(*a)),
1198 OSSL_PROVIDER_name(OSSL_STORE_LOADER_provider(*b)));
1203 static void collect_store_loaders(OSSL_STORE_LOADER *store, void *stack)
1205 STACK_OF(OSSL_STORE_LOADER) *store_stack = stack;
1207 if (sk_OSSL_STORE_LOADER_push(store_stack, store) > 0)
1208 OSSL_STORE_LOADER_up_ref(store);
1211 static void list_store_loaders(void)
1213 STACK_OF(OSSL_STORE_LOADER) *stores = sk_OSSL_STORE_LOADER_new(store_cmp);
1216 if (stores == NULL) {
1217 BIO_printf(bio_err, "ERROR: Memory allocation\n");
1220 BIO_printf(bio_out, "Provided STORE LOADERs:\n");
1221 OSSL_STORE_LOADER_do_all_provided(NULL, collect_store_loaders, stores);
1222 sk_OSSL_STORE_LOADER_sort(stores);
1223 for (i = 0; i < sk_OSSL_STORE_LOADER_num(stores); i++) {
1224 const OSSL_STORE_LOADER *m = sk_OSSL_STORE_LOADER_value(stores, i);
1225 STACK_OF(OPENSSL_CSTRING) *names = NULL;
1227 if (select_name != NULL && !OSSL_STORE_LOADER_is_a(m, select_name))
1230 names = sk_OPENSSL_CSTRING_new(name_cmp);
1231 if (names != NULL && OSSL_STORE_LOADER_names_do_all(m, collect_names,
1233 BIO_printf(bio_out, " ");
1234 print_names(bio_out, names);
1236 BIO_printf(bio_out, " @ %s\n",
1237 OSSL_PROVIDER_name(OSSL_STORE_LOADER_provider(m)));
1239 sk_OPENSSL_CSTRING_free(names);
1241 sk_OSSL_STORE_LOADER_pop_free(stores, OSSL_STORE_LOADER_free);
1244 DEFINE_STACK_OF(OSSL_PROVIDER)
1245 static int provider_cmp(const OSSL_PROVIDER * const *a,
1246 const OSSL_PROVIDER * const *b)
1248 return strcmp(OSSL_PROVIDER_name(*a), OSSL_PROVIDER_name(*b));
1251 static int collect_providers(OSSL_PROVIDER *provider, void *stack)
1253 STACK_OF(OSSL_PROVIDER) *provider_stack = stack;
1255 sk_OSSL_PROVIDER_push(provider_stack, provider);
1259 static void list_provider_info(void)
1261 STACK_OF(OSSL_PROVIDER) *providers = sk_OSSL_PROVIDER_new(provider_cmp);
1262 OSSL_PARAM params[5];
1263 char *name, *version, *buildinfo;
1267 if (providers == NULL) {
1268 BIO_printf(bio_err, "ERROR: Memory allocation\n");
1271 BIO_printf(bio_out, "Providers:\n");
1272 OSSL_PROVIDER_do_all(NULL, &collect_providers, providers);
1273 sk_OSSL_PROVIDER_sort(providers);
1274 for (i = 0; i < sk_OSSL_PROVIDER_num(providers); i++) {
1275 const OSSL_PROVIDER *prov = sk_OSSL_PROVIDER_value(providers, i);
1277 /* Query the "known" information parameters, the order matches below */
1278 params[0] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_NAME,
1280 params[1] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_VERSION,
1282 params[2] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_STATUS, &status);
1283 params[3] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_BUILDINFO,
1285 params[4] = OSSL_PARAM_construct_end();
1286 OSSL_PARAM_set_all_unmodified(params);
1287 if (!OSSL_PROVIDER_get_params(prov, params)) {
1288 BIO_printf(bio_err, "ERROR: Unable to query provider parameters\n");
1292 /* Print out the provider information, the params order matches above */
1293 BIO_printf(bio_out, " %s\n", OSSL_PROVIDER_name(prov));
1294 if (OSSL_PARAM_modified(params))
1295 BIO_printf(bio_out, " name: %s\n", name);
1296 if (OSSL_PARAM_modified(params + 1))
1297 BIO_printf(bio_out, " version: %s\n", version);
1298 if (OSSL_PARAM_modified(params + 2))
1299 BIO_printf(bio_out, " status: %sactive\n", status ? "" : "in");
1301 if (OSSL_PARAM_modified(params + 3))
1302 BIO_printf(bio_out, " build info: %s\n", buildinfo);
1303 print_param_types("gettable provider parameters",
1304 OSSL_PROVIDER_gettable_params(prov), 4);
1307 sk_OSSL_PROVIDER_free(providers);
1310 #ifndef OPENSSL_NO_DEPRECATED_3_0
1311 static void list_engines(void)
1313 # ifndef OPENSSL_NO_ENGINE
1316 BIO_puts(bio_out, "Engines:\n");
1317 e = ENGINE_get_first();
1319 BIO_printf(bio_out, "%s\n", ENGINE_get_id(e));
1320 e = ENGINE_get_next(e);
1323 BIO_puts(bio_out, "Engine support is disabled.\n");
1328 static void list_disabled(void)
1330 BIO_puts(bio_out, "Disabled algorithms:\n");
1331 #ifdef OPENSSL_NO_ARIA
1332 BIO_puts(bio_out, "ARIA\n");
1334 #ifdef OPENSSL_NO_BF
1335 BIO_puts(bio_out, "BF\n");
1337 #ifdef OPENSSL_NO_BLAKE2
1338 BIO_puts(bio_out, "BLAKE2\n");
1340 #ifdef OPENSSL_NO_CAMELLIA
1341 BIO_puts(bio_out, "CAMELLIA\n");
1343 #ifdef OPENSSL_NO_CAST
1344 BIO_puts(bio_out, "CAST\n");
1346 #ifdef OPENSSL_NO_CMAC
1347 BIO_puts(bio_out, "CMAC\n");
1349 #ifdef OPENSSL_NO_CMS
1350 BIO_puts(bio_out, "CMS\n");
1352 #ifdef OPENSSL_NO_COMP
1353 BIO_puts(bio_out, "COMP\n");
1355 #ifdef OPENSSL_NO_DES
1356 BIO_puts(bio_out, "DES\n");
1358 #ifdef OPENSSL_NO_DGRAM
1359 BIO_puts(bio_out, "DGRAM\n");
1361 #ifdef OPENSSL_NO_DH
1362 BIO_puts(bio_out, "DH\n");
1364 #ifdef OPENSSL_NO_DSA
1365 BIO_puts(bio_out, "DSA\n");
1367 #if defined(OPENSSL_NO_DTLS)
1368 BIO_puts(bio_out, "DTLS\n");
1370 #if defined(OPENSSL_NO_DTLS1)
1371 BIO_puts(bio_out, "DTLS1\n");
1373 #if defined(OPENSSL_NO_DTLS1_2)
1374 BIO_puts(bio_out, "DTLS1_2\n");
1376 #ifdef OPENSSL_NO_EC
1377 BIO_puts(bio_out, "EC\n");
1379 #ifdef OPENSSL_NO_EC2M
1380 BIO_puts(bio_out, "EC2M\n");
1382 #if defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
1383 BIO_puts(bio_out, "ENGINE\n");
1385 #ifdef OPENSSL_NO_GOST
1386 BIO_puts(bio_out, "GOST\n");
1388 #ifdef OPENSSL_NO_IDEA
1389 BIO_puts(bio_out, "IDEA\n");
1391 #ifdef OPENSSL_NO_MD2
1392 BIO_puts(bio_out, "MD2\n");
1394 #ifdef OPENSSL_NO_MD4
1395 BIO_puts(bio_out, "MD4\n");
1397 #ifdef OPENSSL_NO_MD5
1398 BIO_puts(bio_out, "MD5\n");
1400 #ifdef OPENSSL_NO_MDC2
1401 BIO_puts(bio_out, "MDC2\n");
1403 #ifdef OPENSSL_NO_OCB
1404 BIO_puts(bio_out, "OCB\n");
1406 #ifdef OPENSSL_NO_OCSP
1407 BIO_puts(bio_out, "OCSP\n");
1409 #ifdef OPENSSL_NO_PSK
1410 BIO_puts(bio_out, "PSK\n");
1412 #ifdef OPENSSL_NO_RC2
1413 BIO_puts(bio_out, "RC2\n");
1415 #ifdef OPENSSL_NO_RC4
1416 BIO_puts(bio_out, "RC4\n");
1418 #ifdef OPENSSL_NO_RC5
1419 BIO_puts(bio_out, "RC5\n");
1421 #ifdef OPENSSL_NO_RMD160
1422 BIO_puts(bio_out, "RMD160\n");
1424 #ifdef OPENSSL_NO_SCRYPT
1425 BIO_puts(bio_out, "SCRYPT\n");
1427 #ifdef OPENSSL_NO_SCTP
1428 BIO_puts(bio_out, "SCTP\n");
1430 #ifdef OPENSSL_NO_SEED
1431 BIO_puts(bio_out, "SEED\n");
1433 #ifdef OPENSSL_NO_SM2
1434 BIO_puts(bio_out, "SM2\n");
1436 #ifdef OPENSSL_NO_SM3
1437 BIO_puts(bio_out, "SM3\n");
1439 #ifdef OPENSSL_NO_SM4
1440 BIO_puts(bio_out, "SM4\n");
1442 #ifdef OPENSSL_NO_SOCK
1443 BIO_puts(bio_out, "SOCK\n");
1445 #ifdef OPENSSL_NO_SRP
1446 BIO_puts(bio_out, "SRP\n");
1448 #ifdef OPENSSL_NO_SRTP
1449 BIO_puts(bio_out, "SRTP\n");
1451 #ifdef OPENSSL_NO_SSL3
1452 BIO_puts(bio_out, "SSL3\n");
1454 #ifdef OPENSSL_NO_TLS1
1455 BIO_puts(bio_out, "TLS1\n");
1457 #ifdef OPENSSL_NO_TLS1_1
1458 BIO_puts(bio_out, "TLS1_1\n");
1460 #ifdef OPENSSL_NO_TLS1_2
1461 BIO_puts(bio_out, "TLS1_2\n");
1463 #ifdef OPENSSL_NO_WHIRLPOOL
1464 BIO_puts(bio_out, "WHIRLPOOL\n");
1467 BIO_puts(bio_out, "ZLIB\n");
1471 /* Unified enum for help and list commands. */
1472 typedef enum HELPLIST_CHOICE {
1474 OPT_ONE, OPT_VERBOSE,
1475 OPT_COMMANDS, OPT_DIGEST_COMMANDS, OPT_MAC_ALGORITHMS, OPT_OPTIONS,
1476 OPT_DIGEST_ALGORITHMS, OPT_CIPHER_COMMANDS, OPT_CIPHER_ALGORITHMS,
1477 OPT_PK_ALGORITHMS, OPT_PK_METHOD, OPT_DISABLED,
1478 OPT_KDF_ALGORITHMS, OPT_RANDOM_INSTANCES, OPT_RANDOM_GENERATORS,
1479 OPT_ENCODERS, OPT_DECODERS, OPT_KEYMANAGERS, OPT_KEYEXCHANGE_ALGORITHMS,
1480 OPT_KEM_ALGORITHMS, OPT_SIGNATURE_ALGORITHMS, OPT_ASYM_CIPHER_ALGORITHMS,
1481 OPT_STORE_LOADERS, OPT_PROVIDER_INFO,
1482 OPT_OBJECTS, OPT_SELECT_NAME,
1483 #ifndef OPENSSL_NO_DEPRECATED_3_0
1489 const OPTIONS list_options[] = {
1491 OPT_SECTION("General"),
1492 {"help", OPT_HELP, '-', "Display this summary"},
1494 OPT_SECTION("Output"),
1495 {"1", OPT_ONE, '-', "List in one column"},
1496 {"verbose", OPT_VERBOSE, '-', "Verbose listing"},
1497 {"select", OPT_SELECT_NAME, 's', "Select a single algorithm"},
1498 {"commands", OPT_COMMANDS, '-', "List of standard commands"},
1499 {"standard-commands", OPT_COMMANDS, '-', "List of standard commands"},
1500 #ifndef OPENSSL_NO_DEPRECATED_3_0
1501 {"digest-commands", OPT_DIGEST_COMMANDS, '-',
1502 "List of message digest commands (deprecated)"},
1504 {"digest-algorithms", OPT_DIGEST_ALGORITHMS, '-',
1505 "List of message digest algorithms"},
1506 {"kdf-algorithms", OPT_KDF_ALGORITHMS, '-',
1507 "List of key derivation and pseudo random function algorithms"},
1508 {"random-instances", OPT_RANDOM_INSTANCES, '-',
1509 "List the primary, public and private random number generator details"},
1510 {"random-generators", OPT_RANDOM_GENERATORS, '-',
1511 "List of random number generators"},
1512 {"mac-algorithms", OPT_MAC_ALGORITHMS, '-',
1513 "List of message authentication code algorithms"},
1514 #ifndef OPENSSL_NO_DEPRECATED_3_0
1515 {"cipher-commands", OPT_CIPHER_COMMANDS, '-',
1516 "List of cipher commands (deprecated)"},
1518 {"cipher-algorithms", OPT_CIPHER_ALGORITHMS, '-',
1519 "List of cipher algorithms"},
1520 {"encoders", OPT_ENCODERS, '-', "List of encoding methods" },
1521 {"decoders", OPT_DECODERS, '-', "List of decoding methods" },
1522 {"key-managers", OPT_KEYMANAGERS, '-', "List of key managers" },
1523 {"key-exchange-algorithms", OPT_KEYEXCHANGE_ALGORITHMS, '-',
1524 "List of key exchange algorithms" },
1525 {"kem-algorithms", OPT_KEM_ALGORITHMS, '-',
1526 "List of key encapsulation mechanism algorithms" },
1527 {"signature-algorithms", OPT_SIGNATURE_ALGORITHMS, '-',
1528 "List of signature algorithms" },
1529 {"asymcipher-algorithms", OPT_ASYM_CIPHER_ALGORITHMS, '-',
1530 "List of asymmetric cipher algorithms" },
1531 {"public-key-algorithms", OPT_PK_ALGORITHMS, '-',
1532 "List of public key algorithms"},
1533 {"public-key-methods", OPT_PK_METHOD, '-',
1534 "List of public key methods"},
1535 {"store-loaders", OPT_STORE_LOADERS, '-',
1536 "List of store loaders"},
1537 {"providers", OPT_PROVIDER_INFO, '-',
1538 "List of provider information"},
1539 #ifndef OPENSSL_NO_DEPRECATED_3_0
1540 {"engines", OPT_ENGINES, '-',
1541 "List of loaded engines"},
1543 {"disabled", OPT_DISABLED, '-', "List of disabled features"},
1544 {"options", OPT_OPTIONS, 's',
1545 "List options for specified command"},
1546 {"objects", OPT_OBJECTS, '-',
1547 "List built in objects (OID<->name mappings)"},
1553 int list_main(int argc, char **argv)
1557 int one = 0, done = 0;
1559 unsigned int commands:1;
1560 unsigned int random_instances:1;
1561 unsigned int random_generators:1;
1562 unsigned int digest_commands:1;
1563 unsigned int digest_algorithms:1;
1564 unsigned int kdf_algorithms:1;
1565 unsigned int mac_algorithms:1;
1566 unsigned int cipher_commands:1;
1567 unsigned int cipher_algorithms:1;
1568 unsigned int encoder_algorithms:1;
1569 unsigned int decoder_algorithms:1;
1570 unsigned int keymanager_algorithms:1;
1571 unsigned int signature_algorithms:1;
1572 unsigned int keyexchange_algorithms:1;
1573 unsigned int kem_algorithms:1;
1574 unsigned int asym_cipher_algorithms:1;
1575 unsigned int pk_algorithms:1;
1576 unsigned int pk_method:1;
1577 unsigned int store_loaders:1;
1578 unsigned int provider_info:1;
1579 #ifndef OPENSSL_NO_DEPRECATED_3_0
1580 unsigned int engines:1;
1582 unsigned int disabled:1;
1583 unsigned int objects:1;
1584 unsigned int options:1;
1587 verbose = 0; /* Clear a possible previous call */
1589 prog = opt_init(argc, argv, list_options);
1590 while ((o = opt_next()) != OPT_EOF) {
1592 case OPT_EOF: /* Never hit, but suppresses warning */
1595 BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
1598 opt_help(list_options);
1606 case OPT_DIGEST_COMMANDS:
1607 todo.digest_commands = 1;
1609 case OPT_DIGEST_ALGORITHMS:
1610 todo.digest_algorithms = 1;
1612 case OPT_KDF_ALGORITHMS:
1613 todo.kdf_algorithms = 1;
1615 case OPT_RANDOM_INSTANCES:
1616 todo.random_instances = 1;
1618 case OPT_RANDOM_GENERATORS:
1619 todo.random_generators = 1;
1621 case OPT_MAC_ALGORITHMS:
1622 todo.mac_algorithms = 1;
1624 case OPT_CIPHER_COMMANDS:
1625 todo.cipher_commands = 1;
1627 case OPT_CIPHER_ALGORITHMS:
1628 todo.cipher_algorithms = 1;
1631 todo.encoder_algorithms = 1;
1634 todo.decoder_algorithms = 1;
1636 case OPT_KEYMANAGERS:
1637 todo.keymanager_algorithms = 1;
1639 case OPT_SIGNATURE_ALGORITHMS:
1640 todo.signature_algorithms = 1;
1642 case OPT_KEYEXCHANGE_ALGORITHMS:
1643 todo.keyexchange_algorithms = 1;
1645 case OPT_KEM_ALGORITHMS:
1646 todo.kem_algorithms = 1;
1648 case OPT_ASYM_CIPHER_ALGORITHMS:
1649 todo.asym_cipher_algorithms = 1;
1651 case OPT_PK_ALGORITHMS:
1652 todo.pk_algorithms = 1;
1657 case OPT_STORE_LOADERS:
1658 todo.store_loaders = 1;
1660 case OPT_PROVIDER_INFO:
1661 todo.provider_info = 1;
1663 #ifndef OPENSSL_NO_DEPRECATED_3_0
1675 list_options_for_command(opt_arg());
1680 case OPT_SELECT_NAME:
1681 select_name = opt_arg();
1683 case OPT_PROV_CASES:
1684 if (!opt_provider(o))
1691 /* No extra arguments. */
1692 if (opt_num_rest() != 0)
1696 list_type(FT_general, one);
1697 if (todo.random_instances)
1698 list_random_instances();
1699 if (todo.random_generators)
1700 list_random_generators();
1701 if (todo.digest_commands)
1702 list_type(FT_md, one);
1703 if (todo.digest_algorithms)
1705 if (todo.kdf_algorithms)
1707 if (todo.mac_algorithms)
1709 if (todo.cipher_commands)
1710 list_type(FT_cipher, one);
1711 if (todo.cipher_algorithms)
1713 if (todo.encoder_algorithms)
1715 if (todo.decoder_algorithms)
1717 if (todo.keymanager_algorithms)
1719 if (todo.signature_algorithms)
1721 if (todo.asym_cipher_algorithms)
1723 if (todo.keyexchange_algorithms)
1724 list_keyexchanges();
1725 if (todo.kem_algorithms)
1727 if (todo.pk_algorithms)
1731 if (todo.store_loaders)
1732 list_store_loaders();
1733 if (todo.provider_info)
1734 list_provider_info();
1735 #ifndef OPENSSL_NO_DEPRECATED_3_0