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/core_names.h>
22 #include <openssl/rand.h>
24 #include "app_params.h"
29 static int verbose
= 0;
30 static const char *select_name
= NULL
;
32 static void legacy_cipher_fn(const EVP_CIPHER
*c
,
33 const char *from
, const char *to
, void *arg
)
35 if (select_name
!= NULL
37 || strcasecmp(select_name
, EVP_CIPHER_name(c
)) != 0))
40 BIO_printf(arg
, " %s\n", EVP_CIPHER_name(c
));
46 BIO_printf(arg
, " %s => %s\n", from
, to
);
50 DEFINE_STACK_OF(EVP_CIPHER
)
51 static int cipher_cmp(const EVP_CIPHER
* const *a
,
52 const EVP_CIPHER
* const *b
)
54 int ret
= EVP_CIPHER_number(*a
) - EVP_CIPHER_number(*b
);
57 ret
= strcmp(OSSL_PROVIDER_name(EVP_CIPHER_provider(*a
)),
58 OSSL_PROVIDER_name(EVP_CIPHER_provider(*b
)));
63 static void collect_ciphers(EVP_CIPHER
*cipher
, void *stack
)
65 STACK_OF(EVP_CIPHER
) *cipher_stack
= stack
;
67 if (sk_EVP_CIPHER_push(cipher_stack
, cipher
) > 0)
68 EVP_CIPHER_up_ref(cipher
);
71 static void list_ciphers(void)
73 STACK_OF(EVP_CIPHER
) *ciphers
= sk_EVP_CIPHER_new(cipher_cmp
);
76 if (ciphers
== NULL
) {
77 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
80 BIO_printf(bio_out
, "Legacy:\n");
81 EVP_CIPHER_do_all_sorted(legacy_cipher_fn
, bio_out
);
83 BIO_printf(bio_out
, "Provided:\n");
84 EVP_CIPHER_do_all_provided(NULL
, collect_ciphers
, ciphers
);
85 sk_EVP_CIPHER_sort(ciphers
);
86 for (i
= 0; i
< sk_EVP_CIPHER_num(ciphers
); i
++) {
87 const EVP_CIPHER
*c
= sk_EVP_CIPHER_value(ciphers
, i
);
88 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
90 if (select_name
!= NULL
&& !EVP_CIPHER_is_a(c
, select_name
))
93 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
94 if (names
!= NULL
&& EVP_CIPHER_names_do_all(c
, collect_names
, names
)) {
95 BIO_printf(bio_out
, " ");
96 print_names(bio_out
, names
);
98 BIO_printf(bio_out
, " @ %s\n",
99 OSSL_PROVIDER_name(EVP_CIPHER_provider(c
)));
102 const char *desc
= EVP_CIPHER_description(c
);
105 BIO_printf(bio_out
, " description: %s\n", desc
);
106 print_param_types("retrievable algorithm parameters",
107 EVP_CIPHER_gettable_params(c
), 4);
108 print_param_types("retrievable operation parameters",
109 EVP_CIPHER_gettable_ctx_params(c
), 4);
110 print_param_types("settable operation parameters",
111 EVP_CIPHER_settable_ctx_params(c
), 4);
114 sk_OPENSSL_CSTRING_free(names
);
116 sk_EVP_CIPHER_pop_free(ciphers
, EVP_CIPHER_free
);
119 static void list_md_fn(const EVP_MD
*m
,
120 const char *from
, const char *to
, void *arg
)
123 BIO_printf(arg
, " %s\n", EVP_MD_name(m
));
126 from
= "<undefined>";
129 BIO_printf((BIO
*)arg
, " %s => %s\n", from
, to
);
133 DEFINE_STACK_OF(EVP_MD
)
134 static int md_cmp(const EVP_MD
* const *a
, const EVP_MD
* const *b
)
136 int ret
= EVP_MD_number(*a
) - EVP_MD_number(*b
);
139 ret
= strcmp(OSSL_PROVIDER_name(EVP_MD_provider(*a
)),
140 OSSL_PROVIDER_name(EVP_MD_provider(*b
)));
145 static void collect_digests(EVP_MD
*md
, void *stack
)
147 STACK_OF(EVP_MD
) *digest_stack
= stack
;
149 if (sk_EVP_MD_push(digest_stack
, md
) > 0)
153 static void list_digests(void)
155 STACK_OF(EVP_MD
) *digests
= sk_EVP_MD_new(md_cmp
);
158 if (digests
== NULL
) {
159 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
162 BIO_printf(bio_out
, "Legacy:\n");
163 EVP_MD_do_all_sorted(list_md_fn
, bio_out
);
165 BIO_printf(bio_out
, "Provided:\n");
166 EVP_MD_do_all_provided(NULL
, collect_digests
, digests
);
167 sk_EVP_MD_sort(digests
);
168 for (i
= 0; i
< sk_EVP_MD_num(digests
); i
++) {
169 const EVP_MD
*m
= sk_EVP_MD_value(digests
, i
);
170 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
172 if (select_name
!= NULL
&& !EVP_MD_is_a(m
, select_name
))
175 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
176 if (names
!= NULL
&& EVP_MD_names_do_all(m
, collect_names
, names
)) {
177 BIO_printf(bio_out
, " ");
178 print_names(bio_out
, names
);
180 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_MD_provider(m
)));
183 const char *desc
= EVP_MD_description(m
);
186 BIO_printf(bio_out
, " description: %s\n", desc
);
187 print_param_types("retrievable algorithm parameters",
188 EVP_MD_gettable_params(m
), 4);
189 print_param_types("retrievable operation parameters",
190 EVP_MD_gettable_ctx_params(m
), 4);
191 print_param_types("settable operation parameters",
192 EVP_MD_settable_ctx_params(m
), 4);
195 sk_OPENSSL_CSTRING_free(names
);
197 sk_EVP_MD_pop_free(digests
, EVP_MD_free
);
200 DEFINE_STACK_OF(EVP_MAC
)
201 static int mac_cmp(const EVP_MAC
* const *a
, const EVP_MAC
* const *b
)
203 int ret
= EVP_MAC_number(*a
) - EVP_MAC_number(*b
);
206 ret
= strcmp(OSSL_PROVIDER_name(EVP_MAC_provider(*a
)),
207 OSSL_PROVIDER_name(EVP_MAC_provider(*b
)));
212 static void collect_macs(EVP_MAC
*mac
, void *stack
)
214 STACK_OF(EVP_MAC
) *mac_stack
= stack
;
216 if (sk_EVP_MAC_push(mac_stack
, mac
) > 0)
220 static void list_macs(void)
222 STACK_OF(EVP_MAC
) *macs
= sk_EVP_MAC_new(mac_cmp
);
226 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
229 BIO_printf(bio_out
, "Provided MACs:\n");
230 EVP_MAC_do_all_provided(NULL
, collect_macs
, macs
);
231 sk_EVP_MAC_sort(macs
);
232 for (i
= 0; i
< sk_EVP_MAC_num(macs
); i
++) {
233 const EVP_MAC
*m
= sk_EVP_MAC_value(macs
, i
);
234 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
236 if (select_name
!= NULL
&& !EVP_MAC_is_a(m
, select_name
))
239 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
240 if (names
!= NULL
&& EVP_MAC_names_do_all(m
, collect_names
, names
)) {
241 BIO_printf(bio_out
, " ");
242 print_names(bio_out
, names
);
244 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_MAC_provider(m
)));
247 const char *desc
= EVP_MAC_description(m
);
250 BIO_printf(bio_out
, " description: %s\n", desc
);
251 print_param_types("retrievable algorithm parameters",
252 EVP_MAC_gettable_params(m
), 4);
253 print_param_types("retrievable operation parameters",
254 EVP_MAC_gettable_ctx_params(m
), 4);
255 print_param_types("settable operation parameters",
256 EVP_MAC_settable_ctx_params(m
), 4);
259 sk_OPENSSL_CSTRING_free(names
);
261 sk_EVP_MAC_pop_free(macs
, EVP_MAC_free
);
267 DEFINE_STACK_OF(EVP_KDF
)
268 static int kdf_cmp(const EVP_KDF
* const *a
, const EVP_KDF
* const *b
)
270 int ret
= EVP_KDF_number(*a
) - EVP_KDF_number(*b
);
273 ret
= strcmp(OSSL_PROVIDER_name(EVP_KDF_provider(*a
)),
274 OSSL_PROVIDER_name(EVP_KDF_provider(*b
)));
279 static void collect_kdfs(EVP_KDF
*kdf
, void *stack
)
281 STACK_OF(EVP_KDF
) *kdf_stack
= stack
;
283 sk_EVP_KDF_push(kdf_stack
, kdf
);
287 static void list_kdfs(void)
289 STACK_OF(EVP_KDF
) *kdfs
= sk_EVP_KDF_new(kdf_cmp
);
293 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
296 BIO_printf(bio_out
, "Provided KDFs and PDFs:\n");
297 EVP_KDF_do_all_provided(NULL
, collect_kdfs
, kdfs
);
298 sk_EVP_KDF_sort(kdfs
);
299 for (i
= 0; i
< sk_EVP_KDF_num(kdfs
); i
++) {
300 const EVP_KDF
*k
= sk_EVP_KDF_value(kdfs
, i
);
301 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
303 if (select_name
!= NULL
&& !EVP_KDF_is_a(k
, select_name
))
306 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
307 if (names
!= NULL
&& EVP_KDF_names_do_all(k
, collect_names
, names
)) {
308 BIO_printf(bio_out
, " ");
309 print_names(bio_out
, names
);
311 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_KDF_provider(k
)));
314 const char *desc
= EVP_KDF_description(k
);
317 BIO_printf(bio_out
, " description: %s\n", desc
);
318 print_param_types("retrievable algorithm parameters",
319 EVP_KDF_gettable_params(k
), 4);
320 print_param_types("retrievable operation parameters",
321 EVP_KDF_gettable_ctx_params(k
), 4);
322 print_param_types("settable operation parameters",
323 EVP_KDF_settable_ctx_params(k
), 4);
326 sk_OPENSSL_CSTRING_free(names
);
328 sk_EVP_KDF_pop_free(kdfs
, EVP_KDF_free
);
334 DEFINE_STACK_OF(EVP_RAND
)
336 static int rand_cmp(const EVP_RAND
* const *a
, const EVP_RAND
* const *b
)
338 int ret
= strcasecmp(EVP_RAND_name(*a
), EVP_RAND_name(*b
));
341 ret
= strcmp(OSSL_PROVIDER_name(EVP_RAND_provider(*a
)),
342 OSSL_PROVIDER_name(EVP_RAND_provider(*b
)));
347 static void collect_rands(EVP_RAND
*rand
, void *stack
)
349 STACK_OF(EVP_RAND
) *rand_stack
= stack
;
351 sk_EVP_RAND_push(rand_stack
, rand
);
352 EVP_RAND_up_ref(rand
);
355 static void list_random_generators(void)
357 STACK_OF(EVP_RAND
) *rands
= sk_EVP_RAND_new(rand_cmp
);
361 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
364 BIO_printf(bio_out
, "Provided RNGs and seed sources:\n");
365 EVP_RAND_do_all_provided(NULL
, collect_rands
, rands
);
366 sk_EVP_RAND_sort(rands
);
367 for (i
= 0; i
< sk_EVP_RAND_num(rands
); i
++) {
368 const EVP_RAND
*m
= sk_EVP_RAND_value(rands
, i
);
370 if (select_name
!= NULL
371 && strcasecmp(EVP_RAND_name(m
), select_name
) != 0)
373 BIO_printf(bio_out
, " %s", EVP_RAND_name(m
));
374 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_RAND_provider(m
)));
377 const char *desc
= EVP_RAND_description(m
);
380 BIO_printf(bio_out
, " description: %s\n", desc
);
381 print_param_types("retrievable algorithm parameters",
382 EVP_RAND_gettable_params(m
), 4);
383 print_param_types("retrievable operation parameters",
384 EVP_RAND_gettable_ctx_params(m
), 4);
385 print_param_types("settable operation parameters",
386 EVP_RAND_settable_ctx_params(m
), 4);
389 sk_EVP_RAND_pop_free(rands
, EVP_RAND_free
);
392 static void display_random(const char *name
, EVP_RAND_CTX
*drbg
)
397 const OSSL_PARAM
*gettables
;
398 OSSL_PARAM params
[2] = { OSSL_PARAM_END
, OSSL_PARAM_END
};
399 unsigned char buf
[1000];
401 BIO_printf(bio_out
, "%s:\n", name
);
403 rand
= EVP_RAND_CTX_rand(drbg
);
405 BIO_printf(bio_out
, " %s", EVP_RAND_name(rand
));
406 BIO_printf(bio_out
, " @ %s\n",
407 OSSL_PROVIDER_name(EVP_RAND_provider(rand
)));
409 switch (EVP_RAND_state(drbg
)) {
410 case EVP_RAND_STATE_UNINITIALISED
:
413 case EVP_RAND_STATE_READY
:
416 case EVP_RAND_STATE_ERROR
:
423 BIO_printf(bio_out
, " state = %s\n", p
);
425 gettables
= EVP_RAND_gettable_ctx_params(rand
);
426 if (gettables
!= NULL
)
427 for (; gettables
->key
!= NULL
; gettables
++) {
428 /* State has been dealt with already, so ignore */
429 if (strcasecmp(gettables
->key
, OSSL_RAND_PARAM_STATE
) == 0)
431 /* Outside of verbose mode, we skip non-string values */
432 if (gettables
->data_type
!= OSSL_PARAM_UTF8_STRING
433 && gettables
->data_type
!= OSSL_PARAM_UTF8_PTR
436 params
->key
= gettables
->key
;
437 params
->data_type
= gettables
->data_type
;
438 if (gettables
->data_type
== OSSL_PARAM_UNSIGNED_INTEGER
439 || gettables
->data_type
== OSSL_PARAM_INTEGER
) {
441 params
->data_size
= sizeof(u
);
444 params
->data_size
= sizeof(buf
);
446 params
->return_size
= 0;
447 if (EVP_RAND_CTX_get_params(drbg
, params
))
448 print_param_value(params
, 2);
453 static void list_random_instances(void)
455 display_random("primary", RAND_get0_primary(NULL
));
456 display_random("public", RAND_get0_public(NULL
));
457 display_random("private", RAND_get0_private(NULL
));
463 DEFINE_STACK_OF(OSSL_ENCODER
)
464 static int encoder_cmp(const OSSL_ENCODER
* const *a
,
465 const OSSL_ENCODER
* const *b
)
467 int ret
= OSSL_ENCODER_number(*a
) - OSSL_ENCODER_number(*b
);
470 ret
= strcmp(OSSL_PROVIDER_name(OSSL_ENCODER_provider(*a
)),
471 OSSL_PROVIDER_name(OSSL_ENCODER_provider(*b
)));
475 static void collect_encoders(OSSL_ENCODER
*encoder
, void *stack
)
477 STACK_OF(OSSL_ENCODER
) *encoder_stack
= stack
;
479 sk_OSSL_ENCODER_push(encoder_stack
, encoder
);
480 OSSL_ENCODER_up_ref(encoder
);
483 static void list_encoders(void)
485 STACK_OF(OSSL_ENCODER
) *encoders
;
488 encoders
= sk_OSSL_ENCODER_new(encoder_cmp
);
489 if (encoders
== NULL
) {
490 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
493 BIO_printf(bio_out
, "Provided ENCODERs:\n");
494 OSSL_ENCODER_do_all_provided(NULL
, collect_encoders
, encoders
);
495 sk_OSSL_ENCODER_sort(encoders
);
497 for (i
= 0; i
< sk_OSSL_ENCODER_num(encoders
); i
++) {
498 OSSL_ENCODER
*k
= sk_OSSL_ENCODER_value(encoders
, i
);
499 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
501 if (select_name
!= NULL
&& !OSSL_ENCODER_is_a(k
, select_name
))
504 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
505 if (names
!= NULL
&& OSSL_ENCODER_names_do_all(k
, collect_names
, names
)) {
506 BIO_printf(bio_out
, " ");
507 print_names(bio_out
, names
);
509 BIO_printf(bio_out
, " @ %s (%s)\n",
510 OSSL_PROVIDER_name(OSSL_ENCODER_provider(k
)),
511 OSSL_ENCODER_properties(k
));
514 const char *desc
= OSSL_ENCODER_description(k
);
517 BIO_printf(bio_out
, " description: %s\n", desc
);
518 print_param_types("settable operation parameters",
519 OSSL_ENCODER_settable_ctx_params(k
), 4);
522 sk_OPENSSL_CSTRING_free(names
);
524 sk_OSSL_ENCODER_pop_free(encoders
, OSSL_ENCODER_free
);
530 DEFINE_STACK_OF(OSSL_DECODER
)
531 static int decoder_cmp(const OSSL_DECODER
* const *a
,
532 const OSSL_DECODER
* const *b
)
534 int ret
= OSSL_DECODER_number(*a
) - OSSL_DECODER_number(*b
);
537 ret
= strcmp(OSSL_PROVIDER_name(OSSL_DECODER_provider(*a
)),
538 OSSL_PROVIDER_name(OSSL_DECODER_provider(*b
)));
542 static void collect_decoders(OSSL_DECODER
*decoder
, void *stack
)
544 STACK_OF(OSSL_DECODER
) *decoder_stack
= stack
;
546 sk_OSSL_DECODER_push(decoder_stack
, decoder
);
547 OSSL_DECODER_up_ref(decoder
);
550 static void list_decoders(void)
552 STACK_OF(OSSL_DECODER
) *decoders
;
555 decoders
= sk_OSSL_DECODER_new(decoder_cmp
);
556 if (decoders
== NULL
) {
557 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
560 BIO_printf(bio_out
, "Provided DECODERs:\n");
561 OSSL_DECODER_do_all_provided(NULL
, collect_decoders
,
563 sk_OSSL_DECODER_sort(decoders
);
565 for (i
= 0; i
< sk_OSSL_DECODER_num(decoders
); i
++) {
566 OSSL_DECODER
*k
= sk_OSSL_DECODER_value(decoders
, i
);
567 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
569 if (select_name
!= NULL
&& !OSSL_DECODER_is_a(k
, select_name
))
572 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
573 if (names
!= NULL
&& OSSL_DECODER_names_do_all(k
, collect_names
, names
)) {
574 BIO_printf(bio_out
, " ");
575 print_names(bio_out
, names
);
577 BIO_printf(bio_out
, " @ %s (%s)\n",
578 OSSL_PROVIDER_name(OSSL_DECODER_provider(k
)),
579 OSSL_DECODER_properties(k
));
582 const char *desc
= OSSL_DECODER_description(k
);
585 BIO_printf(bio_out
, " description: %s\n", desc
);
586 print_param_types("settable operation parameters",
587 OSSL_DECODER_settable_ctx_params(k
), 4);
590 sk_OPENSSL_CSTRING_free(names
);
592 sk_OSSL_DECODER_pop_free(decoders
, OSSL_DECODER_free
);
595 DEFINE_STACK_OF(EVP_KEYMGMT
)
596 static int keymanager_cmp(const EVP_KEYMGMT
* const *a
,
597 const EVP_KEYMGMT
* const *b
)
599 int ret
= EVP_KEYMGMT_number(*a
) - EVP_KEYMGMT_number(*b
);
602 ret
= strcmp(OSSL_PROVIDER_name(EVP_KEYMGMT_provider(*a
)),
603 OSSL_PROVIDER_name(EVP_KEYMGMT_provider(*b
)));
607 static void collect_keymanagers(EVP_KEYMGMT
*km
, void *stack
)
609 STACK_OF(EVP_KEYMGMT
) *km_stack
= stack
;
611 sk_EVP_KEYMGMT_push(km_stack
, km
);
612 EVP_KEYMGMT_up_ref(km
);
615 static void list_keymanagers(void)
618 STACK_OF(EVP_KEYMGMT
) *km_stack
= sk_EVP_KEYMGMT_new(keymanager_cmp
);
620 EVP_KEYMGMT_do_all_provided(NULL
, collect_keymanagers
, km_stack
);
621 sk_EVP_KEYMGMT_sort(km_stack
);
623 for (i
= 0; i
< sk_EVP_KEYMGMT_num(km_stack
); i
++) {
624 EVP_KEYMGMT
*k
= sk_EVP_KEYMGMT_value(km_stack
, i
);
625 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
627 if (select_name
!= NULL
&& !EVP_KEYMGMT_is_a(k
, select_name
))
630 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
631 if (names
!= NULL
&& EVP_KEYMGMT_names_do_all(k
, collect_names
, names
)) {
632 const char *desc
= EVP_KEYMGMT_description(k
);
634 BIO_printf(bio_out
, " Name: ");
636 BIO_printf(bio_out
, "%s", desc
);
638 BIO_printf(bio_out
, "%s", sk_OPENSSL_CSTRING_value(names
, 0));
639 BIO_printf(bio_out
, "\n");
640 BIO_printf(bio_out
, " Type: Provider Algorithm\n");
641 BIO_printf(bio_out
, " IDs: ");
642 print_names(bio_out
, names
);
643 BIO_printf(bio_out
, " @ %s\n",
644 OSSL_PROVIDER_name(EVP_KEYMGMT_provider(k
)));
647 print_param_types("settable key generation parameters",
648 EVP_KEYMGMT_gen_settable_params(k
), 4);
649 print_param_types("settable operation parameters",
650 EVP_KEYMGMT_settable_params(k
), 4);
651 print_param_types("retrievable operation parameters",
652 EVP_KEYMGMT_gettable_params(k
), 4);
655 sk_OPENSSL_CSTRING_free(names
);
657 sk_EVP_KEYMGMT_pop_free(km_stack
, EVP_KEYMGMT_free
);
660 DEFINE_STACK_OF(EVP_SIGNATURE
)
661 static int signature_cmp(const EVP_SIGNATURE
* const *a
,
662 const EVP_SIGNATURE
* const *b
)
664 int ret
= EVP_SIGNATURE_number(*a
) - EVP_SIGNATURE_number(*b
);
667 ret
= strcmp(OSSL_PROVIDER_name(EVP_SIGNATURE_provider(*a
)),
668 OSSL_PROVIDER_name(EVP_SIGNATURE_provider(*b
)));
672 static void collect_signatures(EVP_SIGNATURE
*km
, void *stack
)
674 STACK_OF(EVP_SIGNATURE
) *km_stack
= stack
;
676 sk_EVP_SIGNATURE_push(km_stack
, km
);
677 EVP_SIGNATURE_up_ref(km
);
680 static void list_signatures(void)
683 STACK_OF(EVP_SIGNATURE
) *sig_stack
= sk_EVP_SIGNATURE_new(signature_cmp
);
685 EVP_SIGNATURE_do_all_provided(NULL
, collect_signatures
, sig_stack
);
686 sk_EVP_SIGNATURE_sort(sig_stack
);
688 for (i
= 0; i
< sk_EVP_SIGNATURE_num(sig_stack
); i
++) {
689 EVP_SIGNATURE
*k
= sk_EVP_SIGNATURE_value(sig_stack
, i
);
690 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
692 if (select_name
!= NULL
&& !EVP_SIGNATURE_is_a(k
, select_name
))
695 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
696 if (names
!= NULL
&& EVP_SIGNATURE_names_do_all(k
, collect_names
, names
)) {
698 BIO_printf(bio_out
, " ");
699 print_names(bio_out
, names
);
701 BIO_printf(bio_out
, " @ %s\n",
702 OSSL_PROVIDER_name(EVP_SIGNATURE_provider(k
)));
705 const char *desc
= EVP_SIGNATURE_description(k
);
708 BIO_printf(bio_out
, " description: %s\n", desc
);
709 print_param_types("settable operation parameters",
710 EVP_SIGNATURE_settable_ctx_params(k
), 4);
711 print_param_types("retrievable operation parameters",
712 EVP_SIGNATURE_gettable_ctx_params(k
), 4);
715 sk_OPENSSL_CSTRING_free(names
);
717 sk_EVP_SIGNATURE_pop_free(sig_stack
, EVP_SIGNATURE_free
);
719 BIO_printf(bio_out
, " -\n");
722 DEFINE_STACK_OF(EVP_KEM
)
723 static int kem_cmp(const EVP_KEM
* const *a
,
724 const EVP_KEM
* const *b
)
726 int ret
= EVP_KEM_number(*a
) - EVP_KEM_number(*b
);
729 ret
= strcmp(OSSL_PROVIDER_name(EVP_KEM_provider(*a
)),
730 OSSL_PROVIDER_name(EVP_KEM_provider(*b
)));
734 static void collect_kem(EVP_KEM
*km
, void *stack
)
736 STACK_OF(EVP_KEM
) *km_stack
= stack
;
738 sk_EVP_KEM_push(km_stack
, km
);
742 static void list_kems(void)
745 STACK_OF(EVP_KEM
) *kem_stack
= sk_EVP_KEM_new(kem_cmp
);
747 EVP_KEM_do_all_provided(NULL
, collect_kem
, kem_stack
);
748 sk_EVP_KEM_sort(kem_stack
);
750 for (i
= 0; i
< sk_EVP_KEM_num(kem_stack
); i
++) {
751 EVP_KEM
*k
= sk_EVP_KEM_value(kem_stack
, i
);
752 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
754 if (select_name
!= NULL
&& !EVP_KEM_is_a(k
, select_name
))
757 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
758 if (names
!= NULL
&& EVP_KEM_names_do_all(k
, collect_names
, names
)) {
760 BIO_printf(bio_out
, " ");
761 print_names(bio_out
, names
);
763 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_KEM_provider(k
)));
766 const char *desc
= EVP_KEM_description(k
);
769 BIO_printf(bio_out
, " description: %s\n", desc
);
770 print_param_types("settable operation parameters",
771 EVP_KEM_settable_ctx_params(k
), 4);
772 print_param_types("retrievable operation parameters",
773 EVP_KEM_gettable_ctx_params(k
), 4);
776 sk_OPENSSL_CSTRING_free(names
);
778 sk_EVP_KEM_pop_free(kem_stack
, EVP_KEM_free
);
780 BIO_printf(bio_out
, " -\n");
783 DEFINE_STACK_OF(EVP_ASYM_CIPHER
)
784 static int asymcipher_cmp(const EVP_ASYM_CIPHER
* const *a
,
785 const EVP_ASYM_CIPHER
* const *b
)
787 int ret
= EVP_ASYM_CIPHER_number(*a
) - EVP_ASYM_CIPHER_number(*b
);
790 ret
= strcmp(OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(*a
)),
791 OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(*b
)));
795 static void collect_asymciph(EVP_ASYM_CIPHER
*km
, void *stack
)
797 STACK_OF(EVP_ASYM_CIPHER
) *km_stack
= stack
;
799 sk_EVP_ASYM_CIPHER_push(km_stack
, km
);
800 EVP_ASYM_CIPHER_up_ref(km
);
803 static void list_asymciphers(void)
806 STACK_OF(EVP_ASYM_CIPHER
) *asymciph_stack
=
807 sk_EVP_ASYM_CIPHER_new(asymcipher_cmp
);
809 EVP_ASYM_CIPHER_do_all_provided(NULL
, collect_asymciph
, asymciph_stack
);
810 sk_EVP_ASYM_CIPHER_sort(asymciph_stack
);
812 for (i
= 0; i
< sk_EVP_ASYM_CIPHER_num(asymciph_stack
); i
++) {
813 EVP_ASYM_CIPHER
*k
= sk_EVP_ASYM_CIPHER_value(asymciph_stack
, i
);
814 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
816 if (select_name
!= NULL
&& !EVP_ASYM_CIPHER_is_a(k
, select_name
))
819 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
821 && EVP_ASYM_CIPHER_names_do_all(k
, collect_names
, names
)) {
823 BIO_printf(bio_out
, " ");
824 print_names(bio_out
, names
);
826 BIO_printf(bio_out
, " @ %s\n",
827 OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(k
)));
830 const char *desc
= EVP_ASYM_CIPHER_description(k
);
833 BIO_printf(bio_out
, " description: %s\n", desc
);
834 print_param_types("settable operation parameters",
835 EVP_ASYM_CIPHER_settable_ctx_params(k
), 4);
836 print_param_types("retrievable operation parameters",
837 EVP_ASYM_CIPHER_gettable_ctx_params(k
), 4);
840 sk_OPENSSL_CSTRING_free(names
);
842 sk_EVP_ASYM_CIPHER_pop_free(asymciph_stack
, EVP_ASYM_CIPHER_free
);
844 BIO_printf(bio_out
, " -\n");
847 DEFINE_STACK_OF(EVP_KEYEXCH
)
848 static int kex_cmp(const EVP_KEYEXCH
* const *a
,
849 const EVP_KEYEXCH
* const *b
)
851 int ret
= EVP_KEYEXCH_number(*a
) - EVP_KEYEXCH_number(*b
);
854 ret
= strcmp(OSSL_PROVIDER_name(EVP_KEYEXCH_provider(*a
)),
855 OSSL_PROVIDER_name(EVP_KEYEXCH_provider(*b
)));
859 static void collect_kex(EVP_KEYEXCH
*ke
, void *stack
)
861 STACK_OF(EVP_KEYEXCH
) *kex_stack
= stack
;
863 sk_EVP_KEYEXCH_push(kex_stack
, ke
);
864 EVP_KEYEXCH_up_ref(ke
);
867 static void list_keyexchanges(void)
870 STACK_OF(EVP_KEYEXCH
) *kex_stack
= sk_EVP_KEYEXCH_new(kex_cmp
);
872 EVP_KEYEXCH_do_all_provided(NULL
, collect_kex
, kex_stack
);
873 sk_EVP_KEYEXCH_sort(kex_stack
);
875 for (i
= 0; i
< sk_EVP_KEYEXCH_num(kex_stack
); i
++) {
876 EVP_KEYEXCH
*k
= sk_EVP_KEYEXCH_value(kex_stack
, i
);
877 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
879 if (select_name
!= NULL
&& !EVP_KEYEXCH_is_a(k
, select_name
))
882 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
883 if (names
!= NULL
&& EVP_KEYEXCH_names_do_all(k
, collect_names
, names
)) {
885 BIO_printf(bio_out
, " ");
886 print_names(bio_out
, names
);
888 BIO_printf(bio_out
, " @ %s\n",
889 OSSL_PROVIDER_name(EVP_KEYEXCH_provider(k
)));
892 const char *desc
= EVP_KEYEXCH_description(k
);
895 BIO_printf(bio_out
, " description: %s\n", desc
);
896 print_param_types("settable operation parameters",
897 EVP_KEYEXCH_settable_ctx_params(k
), 4);
898 print_param_types("retrievable operation parameters",
899 EVP_KEYEXCH_gettable_ctx_params(k
), 4);
902 sk_OPENSSL_CSTRING_free(names
);
904 sk_EVP_KEYEXCH_pop_free(kex_stack
, EVP_KEYEXCH_free
);
906 BIO_printf(bio_out
, " -\n");
909 static void list_missing_help(void)
914 for (fp
= functions
; fp
->name
!= NULL
; fp
++) {
915 if ((o
= fp
->help
) != NULL
) {
916 /* If there is help, list what flags are not documented. */
917 for ( ; o
->name
!= NULL
; o
++) {
918 if (o
->helpstr
== NULL
)
919 BIO_printf(bio_out
, "%s %s\n", fp
->name
, o
->name
);
921 } else if (fp
->func
!= dgst_main
) {
922 /* If not aliased to the dgst command, */
923 BIO_printf(bio_out
, "%s *\n", fp
->name
);
928 static void list_objects(void)
930 int max_nid
= OBJ_new_nid(0);
932 char *oid_buf
= NULL
;
935 /* Skip 0, since that's NID_undef */
936 for (i
= 1; i
< max_nid
; i
++) {
937 const ASN1_OBJECT
*obj
= OBJ_nid2obj(i
);
938 const char *sn
= OBJ_nid2sn(i
);
939 const char *ln
= OBJ_nid2ln(i
);
943 * If one of the retrieved objects somehow generated an error,
944 * we ignore it. The check for NID_undef below will detect the
945 * error and simply skip to the next NID.
949 if (OBJ_obj2nid(obj
) == NID_undef
)
952 if ((n
= OBJ_obj2txt(NULL
, 0, obj
, 1)) == 0) {
953 BIO_printf(bio_out
, "# None-OID object: %s, %s\n", sn
, ln
);
960 oid_buf
= OPENSSL_realloc(oid_buf
, n
+ 1);
961 if (oid_buf
== NULL
) {
962 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
967 if (OBJ_obj2txt(oid_buf
, oid_size
, obj
, 1) < 0)
969 if (ln
== NULL
|| strcmp(sn
, ln
) == 0)
970 BIO_printf(bio_out
, "%s = %s\n", sn
, oid_buf
);
972 BIO_printf(bio_out
, "%s = %s, %s\n", sn
, ln
, oid_buf
);
975 OPENSSL_free(oid_buf
);
978 static void list_options_for_command(const char *command
)
983 for (fp
= functions
; fp
->name
!= NULL
; fp
++)
984 if (strcmp(fp
->name
, command
) == 0)
986 if (fp
->name
== NULL
) {
987 BIO_printf(bio_err
, "Invalid command '%s'; type \"help\" for a list.\n",
992 if ((o
= fp
->help
) == NULL
)
995 for ( ; o
->name
!= NULL
; o
++) {
998 if (o
->name
== OPT_PARAM_STR
)
1001 if (o
->name
== OPT_HELP_STR
1002 || o
->name
== OPT_MORE_STR
1003 || o
->name
== OPT_SECTION_STR
1004 || o
->name
[0] == '\0')
1006 BIO_printf(bio_out
, "%s %c\n", o
->name
, c
== '\0' ? '-' : c
);
1008 /* Always output the -- marker since it is sometimes documented. */
1009 BIO_printf(bio_out
, "- -\n");
1012 static int is_md_available(const char *name
)
1016 /* Look through providers' digests */
1018 md
= EVP_MD_fetch(NULL
, name
, NULL
);
1025 return (get_digest_from_engine(name
) == NULL
) ? 0 : 1;
1028 static int is_cipher_available(const char *name
)
1032 /* Look through providers' ciphers */
1034 cipher
= EVP_CIPHER_fetch(NULL
, name
, NULL
);
1036 if (cipher
!= NULL
) {
1037 EVP_CIPHER_free(cipher
);
1041 return (get_cipher_from_engine(name
) == NULL
) ? 0 : 1;
1044 static void list_type(FUNC_TYPE ft
, int one
)
1050 memset(&dc
, 0, sizeof(dc
));
1052 calculate_columns(functions
, &dc
);
1054 for (fp
= functions
; fp
->name
!= NULL
; fp
++) {
1059 if (!is_cipher_available(fp
->name
))
1063 if (!is_md_available(fp
->name
))
1070 BIO_printf(bio_out
, "%s\n", fp
->name
);
1072 if (i
% dc
.columns
== 0 && i
> 0)
1073 BIO_printf(bio_out
, "\n");
1074 BIO_printf(bio_out
, "%-*s", dc
.width
, fp
->name
);
1079 BIO_printf(bio_out
, "\n\n");
1082 static void list_pkey(void)
1084 #ifndef OPENSSL_NO_DEPRECATED_3_0
1087 if (select_name
== NULL
) {
1088 BIO_printf(bio_out
, "Legacy:\n");
1089 for (i
= 0; i
< EVP_PKEY_asn1_get_count(); i
++) {
1090 const EVP_PKEY_ASN1_METHOD
*ameth
;
1091 int pkey_id
, pkey_base_id
, pkey_flags
;
1092 const char *pinfo
, *pem_str
;
1093 ameth
= EVP_PKEY_asn1_get0(i
);
1094 EVP_PKEY_asn1_get0_info(&pkey_id
, &pkey_base_id
, &pkey_flags
,
1095 &pinfo
, &pem_str
, ameth
);
1096 if (pkey_flags
& ASN1_PKEY_ALIAS
) {
1097 BIO_printf(bio_out
, " Name: %s\n", OBJ_nid2ln(pkey_id
));
1098 BIO_printf(bio_out
, "\tAlias for: %s\n",
1099 OBJ_nid2ln(pkey_base_id
));
1101 BIO_printf(bio_out
, " Name: %s\n", pinfo
);
1102 BIO_printf(bio_out
, "\tType: %s Algorithm\n",
1103 pkey_flags
& ASN1_PKEY_DYNAMIC
?
1104 "External" : "Builtin");
1105 BIO_printf(bio_out
, "\tOID: %s\n", OBJ_nid2ln(pkey_id
));
1106 if (pem_str
== NULL
)
1108 BIO_printf(bio_out
, "\tPEM string: %s\n", pem_str
);
1113 BIO_printf(bio_out
, "Provided:\n");
1114 BIO_printf(bio_out
, " Key Managers:\n");
1118 static void list_pkey_meth(void)
1120 #ifndef OPENSSL_NO_DEPRECATED_3_0
1122 size_t meth_count
= EVP_PKEY_meth_get_count();
1124 if (select_name
== NULL
) {
1125 BIO_printf(bio_out
, "Legacy:\n");
1126 for (i
= 0; i
< meth_count
; i
++) {
1127 const EVP_PKEY_METHOD
*pmeth
= EVP_PKEY_meth_get0(i
);
1128 int pkey_id
, pkey_flags
;
1130 EVP_PKEY_meth_get0_info(&pkey_id
, &pkey_flags
, pmeth
);
1131 BIO_printf(bio_out
, " %s\n", OBJ_nid2ln(pkey_id
));
1132 BIO_printf(bio_out
, "\tType: %s Algorithm\n",
1133 pkey_flags
& ASN1_PKEY_DYNAMIC
? "External" : "Builtin");
1137 BIO_printf(bio_out
, "Provided:\n");
1138 BIO_printf(bio_out
, " Encryption:\n");
1140 BIO_printf(bio_out
, " Key Exchange:\n");
1141 list_keyexchanges();
1142 BIO_printf(bio_out
, " Signatures:\n");
1144 BIO_printf(bio_out
, " Key encapsulation:\n");
1148 DEFINE_STACK_OF(OSSL_PROVIDER
)
1149 static int provider_cmp(const OSSL_PROVIDER
* const *a
,
1150 const OSSL_PROVIDER
* const *b
)
1152 return strcmp(OSSL_PROVIDER_name(*a
), OSSL_PROVIDER_name(*b
));
1155 static int collect_providers(OSSL_PROVIDER
*provider
, void *stack
)
1157 STACK_OF(OSSL_PROVIDER
) *provider_stack
= stack
;
1159 sk_OSSL_PROVIDER_push(provider_stack
, provider
);
1163 static void list_provider_info(void)
1165 STACK_OF(OSSL_PROVIDER
) *providers
= sk_OSSL_PROVIDER_new(provider_cmp
);
1166 OSSL_PARAM params
[5];
1167 char *name
, *version
, *buildinfo
;
1171 if (providers
== NULL
) {
1172 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
1175 BIO_printf(bio_out
, "Providers:\n");
1176 OSSL_PROVIDER_do_all(NULL
, &collect_providers
, providers
);
1177 sk_OSSL_PROVIDER_sort(providers
);
1178 for (i
= 0; i
< sk_OSSL_PROVIDER_num(providers
); i
++) {
1179 const OSSL_PROVIDER
*prov
= sk_OSSL_PROVIDER_value(providers
, i
);
1181 /* Query the "known" information parameters, the order matches below */
1182 params
[0] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_NAME
,
1184 params
[1] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_VERSION
,
1186 params
[2] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_STATUS
, &status
);
1187 params
[3] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_BUILDINFO
,
1189 params
[4] = OSSL_PARAM_construct_end();
1190 OSSL_PARAM_set_all_unmodified(params
);
1191 if (!OSSL_PROVIDER_get_params(prov
, params
)) {
1192 BIO_printf(bio_err
, "ERROR: Unable to query provider parameters\n");
1196 /* Print out the provider information, the params order matches above */
1197 BIO_printf(bio_out
, " %s\n", OSSL_PROVIDER_name(prov
));
1198 if (OSSL_PARAM_modified(params
))
1199 BIO_printf(bio_out
, " name: %s\n", name
);
1200 if (OSSL_PARAM_modified(params
+ 1))
1201 BIO_printf(bio_out
, " version: %s\n", version
);
1202 if (OSSL_PARAM_modified(params
+ 2))
1203 BIO_printf(bio_out
, " status: %sactive\n", status
? "" : "in");
1205 if (OSSL_PARAM_modified(params
+ 3))
1206 BIO_printf(bio_out
, " build info: %s\n", buildinfo
);
1207 print_param_types("gettable provider parameters",
1208 OSSL_PROVIDER_gettable_params(prov
), 4);
1211 sk_OSSL_PROVIDER_free(providers
);
1214 #ifndef OPENSSL_NO_DEPRECATED_3_0
1215 static void list_engines(void)
1217 # ifndef OPENSSL_NO_ENGINE
1220 BIO_puts(bio_out
, "Engines:\n");
1221 e
= ENGINE_get_first();
1223 BIO_printf(bio_out
, "%s\n", ENGINE_get_id(e
));
1224 e
= ENGINE_get_next(e
);
1227 BIO_puts(bio_out
, "Engine support is disabled.\n");
1232 static void list_disabled(void)
1234 BIO_puts(bio_out
, "Disabled algorithms:\n");
1235 #ifdef OPENSSL_NO_ARIA
1236 BIO_puts(bio_out
, "ARIA\n");
1238 #ifdef OPENSSL_NO_BF
1239 BIO_puts(bio_out
, "BF\n");
1241 #ifdef OPENSSL_NO_BLAKE2
1242 BIO_puts(bio_out
, "BLAKE2\n");
1244 #ifdef OPENSSL_NO_CAMELLIA
1245 BIO_puts(bio_out
, "CAMELLIA\n");
1247 #ifdef OPENSSL_NO_CAST
1248 BIO_puts(bio_out
, "CAST\n");
1250 #ifdef OPENSSL_NO_CMAC
1251 BIO_puts(bio_out
, "CMAC\n");
1253 #ifdef OPENSSL_NO_CMS
1254 BIO_puts(bio_out
, "CMS\n");
1256 #ifdef OPENSSL_NO_COMP
1257 BIO_puts(bio_out
, "COMP\n");
1259 #ifdef OPENSSL_NO_DES
1260 BIO_puts(bio_out
, "DES\n");
1262 #ifdef OPENSSL_NO_DGRAM
1263 BIO_puts(bio_out
, "DGRAM\n");
1265 #ifdef OPENSSL_NO_DH
1266 BIO_puts(bio_out
, "DH\n");
1268 #ifdef OPENSSL_NO_DSA
1269 BIO_puts(bio_out
, "DSA\n");
1271 #if defined(OPENSSL_NO_DTLS)
1272 BIO_puts(bio_out
, "DTLS\n");
1274 #if defined(OPENSSL_NO_DTLS1)
1275 BIO_puts(bio_out
, "DTLS1\n");
1277 #if defined(OPENSSL_NO_DTLS1_2)
1278 BIO_puts(bio_out
, "DTLS1_2\n");
1280 #ifdef OPENSSL_NO_EC
1281 BIO_puts(bio_out
, "EC\n");
1283 #ifdef OPENSSL_NO_EC2M
1284 BIO_puts(bio_out
, "EC2M\n");
1286 #if defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
1287 BIO_puts(bio_out
, "ENGINE\n");
1289 #ifdef OPENSSL_NO_GOST
1290 BIO_puts(bio_out
, "GOST\n");
1292 #ifdef OPENSSL_NO_IDEA
1293 BIO_puts(bio_out
, "IDEA\n");
1295 #ifdef OPENSSL_NO_MD2
1296 BIO_puts(bio_out
, "MD2\n");
1298 #ifdef OPENSSL_NO_MD4
1299 BIO_puts(bio_out
, "MD4\n");
1301 #ifdef OPENSSL_NO_MD5
1302 BIO_puts(bio_out
, "MD5\n");
1304 #ifdef OPENSSL_NO_MDC2
1305 BIO_puts(bio_out
, "MDC2\n");
1307 #ifdef OPENSSL_NO_OCB
1308 BIO_puts(bio_out
, "OCB\n");
1310 #ifdef OPENSSL_NO_OCSP
1311 BIO_puts(bio_out
, "OCSP\n");
1313 #ifdef OPENSSL_NO_PSK
1314 BIO_puts(bio_out
, "PSK\n");
1316 #ifdef OPENSSL_NO_RC2
1317 BIO_puts(bio_out
, "RC2\n");
1319 #ifdef OPENSSL_NO_RC4
1320 BIO_puts(bio_out
, "RC4\n");
1322 #ifdef OPENSSL_NO_RC5
1323 BIO_puts(bio_out
, "RC5\n");
1325 #ifdef OPENSSL_NO_RMD160
1326 BIO_puts(bio_out
, "RMD160\n");
1328 #ifdef OPENSSL_NO_SCRYPT
1329 BIO_puts(bio_out
, "SCRYPT\n");
1331 #ifdef OPENSSL_NO_SCTP
1332 BIO_puts(bio_out
, "SCTP\n");
1334 #ifdef OPENSSL_NO_SEED
1335 BIO_puts(bio_out
, "SEED\n");
1337 #ifdef OPENSSL_NO_SM2
1338 BIO_puts(bio_out
, "SM2\n");
1340 #ifdef OPENSSL_NO_SM3
1341 BIO_puts(bio_out
, "SM3\n");
1343 #ifdef OPENSSL_NO_SM4
1344 BIO_puts(bio_out
, "SM4\n");
1346 #ifdef OPENSSL_NO_SOCK
1347 BIO_puts(bio_out
, "SOCK\n");
1349 #ifdef OPENSSL_NO_SRP
1350 BIO_puts(bio_out
, "SRP\n");
1352 #ifdef OPENSSL_NO_SRTP
1353 BIO_puts(bio_out
, "SRTP\n");
1355 #ifdef OPENSSL_NO_SSL3
1356 BIO_puts(bio_out
, "SSL3\n");
1358 #ifdef OPENSSL_NO_TLS1
1359 BIO_puts(bio_out
, "TLS1\n");
1361 #ifdef OPENSSL_NO_TLS1_1
1362 BIO_puts(bio_out
, "TLS1_1\n");
1364 #ifdef OPENSSL_NO_TLS1_2
1365 BIO_puts(bio_out
, "TLS1_2\n");
1367 #ifdef OPENSSL_NO_WHIRLPOOL
1368 BIO_puts(bio_out
, "WHIRLPOOL\n");
1371 BIO_puts(bio_out
, "ZLIB\n");
1375 /* Unified enum for help and list commands. */
1376 typedef enum HELPLIST_CHOICE
{
1377 OPT_ERR
= -1, OPT_EOF
= 0, OPT_HELP
, OPT_ONE
, OPT_VERBOSE
,
1378 OPT_COMMANDS
, OPT_DIGEST_COMMANDS
, OPT_MAC_ALGORITHMS
, OPT_OPTIONS
,
1379 OPT_DIGEST_ALGORITHMS
, OPT_CIPHER_COMMANDS
, OPT_CIPHER_ALGORITHMS
,
1380 OPT_PK_ALGORITHMS
, OPT_PK_METHOD
, OPT_DISABLED
,
1381 OPT_KDF_ALGORITHMS
, OPT_RANDOM_INSTANCES
, OPT_RANDOM_GENERATORS
,
1382 OPT_ENCODERS
, OPT_DECODERS
, OPT_KEYMANAGERS
, OPT_KEYEXCHANGE_ALGORITHMS
,
1383 OPT_KEM_ALGORITHMS
, OPT_SIGNATURE_ALGORITHMS
, OPT_ASYM_CIPHER_ALGORITHMS
,
1385 OPT_MISSING_HELP
, OPT_OBJECTS
, OPT_SELECT_NAME
,
1386 #ifndef OPENSSL_NO_DEPRECATED_3_0
1392 const OPTIONS list_options
[] = {
1394 OPT_SECTION("General"),
1395 {"help", OPT_HELP
, '-', "Display this summary"},
1397 OPT_SECTION("Output"),
1398 {"1", OPT_ONE
, '-', "List in one column"},
1399 {"verbose", OPT_VERBOSE
, '-', "Verbose listing"},
1400 {"select", OPT_SELECT_NAME
, 's', "Select a single algorithm"},
1401 {"commands", OPT_COMMANDS
, '-', "List of standard commands"},
1402 {"standard-commands", OPT_COMMANDS
, '-', "List of standard commands"},
1403 #ifndef OPENSSL_NO_DEPRECATED_3_0
1404 {"digest-commands", OPT_DIGEST_COMMANDS
, '-',
1405 "List of message digest commands (deprecated)"},
1407 {"digest-algorithms", OPT_DIGEST_ALGORITHMS
, '-',
1408 "List of message digest algorithms"},
1409 {"kdf-algorithms", OPT_KDF_ALGORITHMS
, '-',
1410 "List of key derivation and pseudo random function algorithms"},
1411 {"random-instances", OPT_RANDOM_INSTANCES
, '-',
1412 "List the primary, pubic and private random number generator details"},
1413 {"random-generators", OPT_RANDOM_GENERATORS
, '-',
1414 "List of random number generators"},
1415 {"mac-algorithms", OPT_MAC_ALGORITHMS
, '-',
1416 "List of message authentication code algorithms"},
1417 #ifndef OPENSSL_NO_DEPRECATED_3_0
1418 {"cipher-commands", OPT_CIPHER_COMMANDS
, '-',
1419 "List of cipher commands (deprecated)"},
1421 {"cipher-algorithms", OPT_CIPHER_ALGORITHMS
, '-',
1422 "List of cipher algorithms"},
1423 {"encoders", OPT_ENCODERS
, '-', "List of encoding methods" },
1424 {"decoders", OPT_DECODERS
, '-', "List of decoding methods" },
1425 {"key-managers", OPT_KEYMANAGERS
, '-', "List of key managers" },
1426 {"key-exchange-algorithms", OPT_KEYEXCHANGE_ALGORITHMS
, '-',
1427 "List of key exchange algorithms" },
1428 {"kem-algorithms", OPT_KEM_ALGORITHMS
, '-',
1429 "List of key encapsulation mechanism algorithms" },
1430 {"signature-algorithms", OPT_SIGNATURE_ALGORITHMS
, '-',
1431 "List of signature algorithms" },
1432 { "asymcipher-algorithms", OPT_ASYM_CIPHER_ALGORITHMS
, '-',
1433 "List of asymmetric cipher algorithms" },
1434 {"public-key-algorithms", OPT_PK_ALGORITHMS
, '-',
1435 "List of public key algorithms"},
1436 {"public-key-methods", OPT_PK_METHOD
, '-',
1437 "List of public key methods"},
1438 {"providers", OPT_PROVIDER_INFO
, '-',
1439 "List of provider information"},
1440 #ifndef OPENSSL_NO_DEPRECATED_3_0
1441 {"engines", OPT_ENGINES
, '-',
1442 "List of loaded engines"},
1444 {"disabled", OPT_DISABLED
, '-', "List of disabled features"},
1445 {"missing-help", OPT_MISSING_HELP
, '-',
1446 "List missing detailed help strings"},
1447 {"options", OPT_OPTIONS
, 's',
1448 "List options for specified command"},
1449 {"objects", OPT_OBJECTS
, '-',
1450 "List built in objects (OID<->name mappings)"},
1456 int list_main(int argc
, char **argv
)
1460 int one
= 0, done
= 0;
1462 unsigned int commands
:1;
1463 unsigned int random_instances
:1;
1464 unsigned int random_generators
:1;
1465 unsigned int digest_commands
:1;
1466 unsigned int digest_algorithms
:1;
1467 unsigned int kdf_algorithms
:1;
1468 unsigned int mac_algorithms
:1;
1469 unsigned int cipher_commands
:1;
1470 unsigned int cipher_algorithms
:1;
1471 unsigned int encoder_algorithms
:1;
1472 unsigned int decoder_algorithms
:1;
1473 unsigned int keymanager_algorithms
:1;
1474 unsigned int signature_algorithms
:1;
1475 unsigned int keyexchange_algorithms
:1;
1476 unsigned int kem_algorithms
:1;
1477 unsigned int asym_cipher_algorithms
:1;
1478 unsigned int pk_algorithms
:1;
1479 unsigned int pk_method
:1;
1480 unsigned int provider_info
:1;
1481 #ifndef OPENSSL_NO_DEPRECATED_3_0
1482 unsigned int engines
:1;
1484 unsigned int disabled
:1;
1485 unsigned int missing_help
:1;
1486 unsigned int objects
:1;
1487 unsigned int options
:1;
1490 verbose
= 0; /* Clear a possible previous call */
1492 prog
= opt_init(argc
, argv
, list_options
);
1493 while ((o
= opt_next()) != OPT_EOF
) {
1495 case OPT_EOF
: /* Never hit, but suppresses warning */
1498 BIO_printf(bio_err
, "%s: Use -help for summary.\n", prog
);
1501 opt_help(list_options
);
1509 case OPT_DIGEST_COMMANDS
:
1510 todo
.digest_commands
= 1;
1512 case OPT_DIGEST_ALGORITHMS
:
1513 todo
.digest_algorithms
= 1;
1515 case OPT_KDF_ALGORITHMS
:
1516 todo
.kdf_algorithms
= 1;
1518 case OPT_RANDOM_INSTANCES
:
1519 todo
.random_instances
= 1;
1521 case OPT_RANDOM_GENERATORS
:
1522 todo
.random_generators
= 1;
1524 case OPT_MAC_ALGORITHMS
:
1525 todo
.mac_algorithms
= 1;
1527 case OPT_CIPHER_COMMANDS
:
1528 todo
.cipher_commands
= 1;
1530 case OPT_CIPHER_ALGORITHMS
:
1531 todo
.cipher_algorithms
= 1;
1534 todo
.encoder_algorithms
= 1;
1537 todo
.decoder_algorithms
= 1;
1539 case OPT_KEYMANAGERS
:
1540 todo
.keymanager_algorithms
= 1;
1542 case OPT_SIGNATURE_ALGORITHMS
:
1543 todo
.signature_algorithms
= 1;
1545 case OPT_KEYEXCHANGE_ALGORITHMS
:
1546 todo
.keyexchange_algorithms
= 1;
1548 case OPT_KEM_ALGORITHMS
:
1549 todo
.kem_algorithms
= 1;
1551 case OPT_ASYM_CIPHER_ALGORITHMS
:
1552 todo
.asym_cipher_algorithms
= 1;
1554 case OPT_PK_ALGORITHMS
:
1555 todo
.pk_algorithms
= 1;
1560 case OPT_PROVIDER_INFO
:
1561 todo
.provider_info
= 1;
1563 #ifndef OPENSSL_NO_DEPRECATED_3_0
1571 case OPT_MISSING_HELP
:
1572 todo
.missing_help
= 1;
1578 list_options_for_command(opt_arg());
1583 case OPT_SELECT_NAME
:
1584 select_name
= opt_arg();
1586 case OPT_PROV_CASES
:
1587 if (!opt_provider(o
))
1594 /* No extra arguments. */
1595 if (opt_num_rest() != 0)
1599 list_type(FT_general
, one
);
1600 if (todo
.random_instances
)
1601 list_random_instances();
1602 if (todo
.random_generators
)
1603 list_random_generators();
1604 if (todo
.digest_commands
)
1605 list_type(FT_md
, one
);
1606 if (todo
.digest_algorithms
)
1608 if (todo
.kdf_algorithms
)
1610 if (todo
.mac_algorithms
)
1612 if (todo
.cipher_commands
)
1613 list_type(FT_cipher
, one
);
1614 if (todo
.cipher_algorithms
)
1616 if (todo
.encoder_algorithms
)
1618 if (todo
.decoder_algorithms
)
1620 if (todo
.keymanager_algorithms
)
1622 if (todo
.signature_algorithms
)
1624 if (todo
.asym_cipher_algorithms
)
1626 if (todo
.keyexchange_algorithms
)
1627 list_keyexchanges();
1628 if (todo
.kem_algorithms
)
1630 if (todo
.pk_algorithms
)
1634 if (todo
.provider_info
)
1635 list_provider_info();
1636 #ifndef OPENSSL_NO_DEPRECATED_3_0
1642 if (todo
.missing_help
)
1643 list_missing_help();