2 * Copyright 1995-2020 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 print_param_types("retrievable algorithm parameters",
103 EVP_CIPHER_gettable_params(c
), 4);
104 print_param_types("retrievable operation parameters",
105 EVP_CIPHER_gettable_ctx_params(c
), 4);
106 print_param_types("settable operation parameters",
107 EVP_CIPHER_settable_ctx_params(c
), 4);
110 sk_OPENSSL_CSTRING_free(names
);
112 sk_EVP_CIPHER_pop_free(ciphers
, EVP_CIPHER_free
);
115 static void list_md_fn(const EVP_MD
*m
,
116 const char *from
, const char *to
, void *arg
)
119 BIO_printf(arg
, " %s\n", EVP_MD_name(m
));
122 from
= "<undefined>";
125 BIO_printf((BIO
*)arg
, " %s => %s\n", from
, to
);
129 DEFINE_STACK_OF(EVP_MD
)
130 static int md_cmp(const EVP_MD
* const *a
, const EVP_MD
* const *b
)
132 int ret
= EVP_MD_number(*a
) - EVP_MD_number(*b
);
135 ret
= strcmp(OSSL_PROVIDER_name(EVP_MD_provider(*a
)),
136 OSSL_PROVIDER_name(EVP_MD_provider(*b
)));
141 static void collect_digests(EVP_MD
*md
, void *stack
)
143 STACK_OF(EVP_MD
) *digest_stack
= stack
;
145 if (sk_EVP_MD_push(digest_stack
, md
) > 0)
149 static void list_digests(void)
151 STACK_OF(EVP_MD
) *digests
= sk_EVP_MD_new(md_cmp
);
154 if (digests
== NULL
) {
155 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
158 BIO_printf(bio_out
, "Legacy:\n");
159 EVP_MD_do_all_sorted(list_md_fn
, bio_out
);
161 BIO_printf(bio_out
, "Provided:\n");
162 EVP_MD_do_all_provided(NULL
, collect_digests
, digests
);
163 sk_EVP_MD_sort(digests
);
164 for (i
= 0; i
< sk_EVP_MD_num(digests
); i
++) {
165 const EVP_MD
*m
= sk_EVP_MD_value(digests
, i
);
166 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
168 if (select_name
!= NULL
&& !EVP_MD_is_a(m
, select_name
))
171 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
172 if (names
!= NULL
&& EVP_MD_names_do_all(m
, collect_names
, names
)) {
173 BIO_printf(bio_out
, " ");
174 print_names(bio_out
, names
);
176 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_MD_provider(m
)));
179 print_param_types("retrievable algorithm parameters",
180 EVP_MD_gettable_params(m
), 4);
181 print_param_types("retrievable operation parameters",
182 EVP_MD_gettable_ctx_params(m
), 4);
183 print_param_types("settable operation parameters",
184 EVP_MD_settable_ctx_params(m
), 4);
187 sk_OPENSSL_CSTRING_free(names
);
189 sk_EVP_MD_pop_free(digests
, EVP_MD_free
);
192 DEFINE_STACK_OF(EVP_MAC
)
193 static int mac_cmp(const EVP_MAC
* const *a
, const EVP_MAC
* const *b
)
195 int ret
= EVP_MAC_number(*a
) - EVP_MAC_number(*b
);
198 ret
= strcmp(OSSL_PROVIDER_name(EVP_MAC_provider(*a
)),
199 OSSL_PROVIDER_name(EVP_MAC_provider(*b
)));
204 static void collect_macs(EVP_MAC
*mac
, void *stack
)
206 STACK_OF(EVP_MAC
) *mac_stack
= stack
;
208 if (sk_EVP_MAC_push(mac_stack
, mac
) > 0)
212 static void list_macs(void)
214 STACK_OF(EVP_MAC
) *macs
= sk_EVP_MAC_new(mac_cmp
);
218 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
221 BIO_printf(bio_out
, "Provided MACs:\n");
222 EVP_MAC_do_all_provided(NULL
, collect_macs
, macs
);
223 sk_EVP_MAC_sort(macs
);
224 for (i
= 0; i
< sk_EVP_MAC_num(macs
); i
++) {
225 const EVP_MAC
*m
= sk_EVP_MAC_value(macs
, i
);
226 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
228 if (select_name
!= NULL
&& !EVP_MAC_is_a(m
, select_name
))
231 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
232 if (names
!= NULL
&& EVP_MAC_names_do_all(m
, collect_names
, names
)) {
233 BIO_printf(bio_out
, " ");
234 print_names(bio_out
, names
);
236 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_MAC_provider(m
)));
239 print_param_types("retrievable algorithm parameters",
240 EVP_MAC_gettable_params(m
), 4);
241 print_param_types("retrievable operation parameters",
242 EVP_MAC_gettable_ctx_params(m
), 4);
243 print_param_types("settable operation parameters",
244 EVP_MAC_settable_ctx_params(m
), 4);
247 sk_OPENSSL_CSTRING_free(names
);
249 sk_EVP_MAC_pop_free(macs
, EVP_MAC_free
);
255 DEFINE_STACK_OF(EVP_KDF
)
256 static int kdf_cmp(const EVP_KDF
* const *a
, const EVP_KDF
* const *b
)
258 int ret
= EVP_KDF_number(*a
) - EVP_KDF_number(*b
);
261 ret
= strcmp(OSSL_PROVIDER_name(EVP_KDF_provider(*a
)),
262 OSSL_PROVIDER_name(EVP_KDF_provider(*b
)));
267 static void collect_kdfs(EVP_KDF
*kdf
, void *stack
)
269 STACK_OF(EVP_KDF
) *kdf_stack
= stack
;
271 sk_EVP_KDF_push(kdf_stack
, kdf
);
275 static void list_kdfs(void)
277 STACK_OF(EVP_KDF
) *kdfs
= sk_EVP_KDF_new(kdf_cmp
);
281 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
284 BIO_printf(bio_out
, "Provided KDFs and PDFs:\n");
285 EVP_KDF_do_all_provided(NULL
, collect_kdfs
, kdfs
);
286 sk_EVP_KDF_sort(kdfs
);
287 for (i
= 0; i
< sk_EVP_KDF_num(kdfs
); i
++) {
288 const EVP_KDF
*k
= sk_EVP_KDF_value(kdfs
, i
);
289 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
291 if (select_name
!= NULL
&& !EVP_KDF_is_a(k
, select_name
))
294 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
295 if (names
!= NULL
&& EVP_KDF_names_do_all(k
, collect_names
, names
)) {
296 BIO_printf(bio_out
, " ");
297 print_names(bio_out
, names
);
299 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_KDF_provider(k
)));
302 print_param_types("retrievable algorithm parameters",
303 EVP_KDF_gettable_params(k
), 4);
304 print_param_types("retrievable operation parameters",
305 EVP_KDF_gettable_ctx_params(k
), 4);
306 print_param_types("settable operation parameters",
307 EVP_KDF_settable_ctx_params(k
), 4);
310 sk_OPENSSL_CSTRING_free(names
);
312 sk_EVP_KDF_pop_free(kdfs
, EVP_KDF_free
);
318 DEFINE_STACK_OF(EVP_RAND
)
320 static int rand_cmp(const EVP_RAND
* const *a
, const EVP_RAND
* const *b
)
322 int ret
= strcasecmp(EVP_RAND_name(*a
), EVP_RAND_name(*b
));
325 ret
= strcmp(OSSL_PROVIDER_name(EVP_RAND_provider(*a
)),
326 OSSL_PROVIDER_name(EVP_RAND_provider(*b
)));
331 static void collect_rands(EVP_RAND
*rand
, void *stack
)
333 STACK_OF(EVP_RAND
) *rand_stack
= stack
;
335 sk_EVP_RAND_push(rand_stack
, rand
);
336 EVP_RAND_up_ref(rand
);
339 static void list_random_generators(void)
341 STACK_OF(EVP_RAND
) *rands
= sk_EVP_RAND_new(rand_cmp
);
345 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
348 BIO_printf(bio_out
, "Provided RNGs and seed sources:\n");
349 EVP_RAND_do_all_provided(NULL
, collect_rands
, rands
);
350 sk_EVP_RAND_sort(rands
);
351 for (i
= 0; i
< sk_EVP_RAND_num(rands
); i
++) {
352 const EVP_RAND
*m
= sk_EVP_RAND_value(rands
, i
);
354 if (select_name
!= NULL
355 && strcasecmp(EVP_RAND_name(m
), select_name
) != 0)
357 BIO_printf(bio_out
, " %s", EVP_RAND_name(m
));
358 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_RAND_provider(m
)));
361 print_param_types("retrievable algorithm parameters",
362 EVP_RAND_gettable_params(m
), 4);
363 print_param_types("retrievable operation parameters",
364 EVP_RAND_gettable_ctx_params(m
), 4);
365 print_param_types("settable operation parameters",
366 EVP_RAND_settable_ctx_params(m
), 4);
369 sk_EVP_RAND_pop_free(rands
, EVP_RAND_free
);
372 static void display_random(const char *name
, EVP_RAND_CTX
*drbg
)
377 const OSSL_PARAM
*gettables
;
378 OSSL_PARAM params
[2] = { OSSL_PARAM_END
, OSSL_PARAM_END
};
379 unsigned char buf
[1000];
381 BIO_printf(bio_out
, "%s:\n", name
);
383 rand
= EVP_RAND_CTX_rand(drbg
);
385 BIO_printf(bio_out
, " %s", EVP_RAND_name(rand
));
386 BIO_printf(bio_out
, " @ %s\n",
387 OSSL_PROVIDER_name(EVP_RAND_provider(rand
)));
389 switch (EVP_RAND_state(drbg
)) {
390 case EVP_RAND_STATE_UNINITIALISED
:
393 case EVP_RAND_STATE_READY
:
396 case EVP_RAND_STATE_ERROR
:
403 BIO_printf(bio_out
, " state = %s\n", p
);
405 gettables
= EVP_RAND_gettable_ctx_params(rand
);
406 if (gettables
!= NULL
)
407 for (; gettables
->key
!= NULL
; gettables
++) {
408 /* State has been dealt with already, so ignore */
409 if (strcasecmp(gettables
->key
, OSSL_RAND_PARAM_STATE
) == 0)
411 /* Outside of verbose mode, we skip non-string values */
412 if (gettables
->data_type
!= OSSL_PARAM_UTF8_STRING
413 && gettables
->data_type
!= OSSL_PARAM_UTF8_PTR
416 params
->key
= gettables
->key
;
417 params
->data_type
= gettables
->data_type
;
418 if (gettables
->data_type
== OSSL_PARAM_UNSIGNED_INTEGER
419 || gettables
->data_type
== OSSL_PARAM_INTEGER
) {
421 params
->data_size
= sizeof(u
);
424 params
->data_size
= sizeof(buf
);
426 params
->return_size
= 0;
427 if (EVP_RAND_get_ctx_params(drbg
, params
))
428 print_param_value(params
, 2);
433 static void list_random_instances(void)
435 display_random("primary", RAND_get0_primary(NULL
));
436 display_random("public", RAND_get0_public(NULL
));
437 display_random("private", RAND_get0_private(NULL
));
443 DEFINE_STACK_OF(OSSL_ENCODER
)
444 static int encoder_cmp(const OSSL_ENCODER
* const *a
,
445 const OSSL_ENCODER
* const *b
)
447 int ret
= OSSL_ENCODER_number(*a
) - OSSL_ENCODER_number(*b
);
450 ret
= strcmp(OSSL_PROVIDER_name(OSSL_ENCODER_provider(*a
)),
451 OSSL_PROVIDER_name(OSSL_ENCODER_provider(*b
)));
455 static void collect_encoders(OSSL_ENCODER
*encoder
, void *stack
)
457 STACK_OF(OSSL_ENCODER
) *encoder_stack
= stack
;
459 sk_OSSL_ENCODER_push(encoder_stack
, encoder
);
460 OSSL_ENCODER_up_ref(encoder
);
463 static void list_encoders(void)
465 STACK_OF(OSSL_ENCODER
) *encoders
;
468 encoders
= sk_OSSL_ENCODER_new(encoder_cmp
);
469 if (encoders
== NULL
) {
470 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
473 BIO_printf(bio_out
, "Provided ENCODERs:\n");
474 OSSL_ENCODER_do_all_provided(NULL
, collect_encoders
, encoders
);
475 sk_OSSL_ENCODER_sort(encoders
);
477 for (i
= 0; i
< sk_OSSL_ENCODER_num(encoders
); i
++) {
478 OSSL_ENCODER
*k
= sk_OSSL_ENCODER_value(encoders
, i
);
479 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
481 if (select_name
!= NULL
&& !OSSL_ENCODER_is_a(k
, select_name
))
484 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
485 if (names
!= NULL
&& OSSL_ENCODER_names_do_all(k
, collect_names
, names
)) {
486 BIO_printf(bio_out
, " ");
487 print_names(bio_out
, names
);
489 BIO_printf(bio_out
, " @ %s (%s)\n",
490 OSSL_PROVIDER_name(OSSL_ENCODER_provider(k
)),
491 OSSL_ENCODER_properties(k
));
494 print_param_types("settable operation parameters",
495 OSSL_ENCODER_settable_ctx_params(k
), 4);
498 sk_OPENSSL_CSTRING_free(names
);
500 sk_OSSL_ENCODER_pop_free(encoders
, OSSL_ENCODER_free
);
506 DEFINE_STACK_OF(OSSL_DECODER
)
507 static int decoder_cmp(const OSSL_DECODER
* const *a
,
508 const OSSL_DECODER
* const *b
)
510 int ret
= OSSL_DECODER_number(*a
) - OSSL_DECODER_number(*b
);
513 ret
= strcmp(OSSL_PROVIDER_name(OSSL_DECODER_provider(*a
)),
514 OSSL_PROVIDER_name(OSSL_DECODER_provider(*b
)));
518 static void collect_decoders(OSSL_DECODER
*decoder
, void *stack
)
520 STACK_OF(OSSL_DECODER
) *decoder_stack
= stack
;
522 sk_OSSL_DECODER_push(decoder_stack
, decoder
);
523 OSSL_DECODER_up_ref(decoder
);
526 static void list_decoders(void)
528 STACK_OF(OSSL_DECODER
) *decoders
;
531 decoders
= sk_OSSL_DECODER_new(decoder_cmp
);
532 if (decoders
== NULL
) {
533 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
536 BIO_printf(bio_out
, "Provided DECODERs:\n");
537 OSSL_DECODER_do_all_provided(NULL
, collect_decoders
,
539 sk_OSSL_DECODER_sort(decoders
);
541 for (i
= 0; i
< sk_OSSL_DECODER_num(decoders
); i
++) {
542 OSSL_DECODER
*k
= sk_OSSL_DECODER_value(decoders
, i
);
543 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
545 if (select_name
!= NULL
&& !OSSL_DECODER_is_a(k
, select_name
))
548 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
549 if (names
!= NULL
&& OSSL_DECODER_names_do_all(k
, collect_names
, names
)) {
550 BIO_printf(bio_out
, " ");
551 print_names(bio_out
, names
);
553 BIO_printf(bio_out
, " @ %s (%s)\n",
554 OSSL_PROVIDER_name(OSSL_DECODER_provider(k
)),
555 OSSL_DECODER_properties(k
));
558 print_param_types("settable operation parameters",
559 OSSL_DECODER_settable_ctx_params(k
), 4);
562 sk_OPENSSL_CSTRING_free(names
);
564 sk_OSSL_DECODER_pop_free(decoders
, OSSL_DECODER_free
);
567 DEFINE_STACK_OF(EVP_KEYMGMT
)
568 static int keymanager_cmp(const EVP_KEYMGMT
* const *a
,
569 const EVP_KEYMGMT
* const *b
)
571 int ret
= EVP_KEYMGMT_number(*a
) - EVP_KEYMGMT_number(*b
);
574 ret
= strcmp(OSSL_PROVIDER_name(EVP_KEYMGMT_provider(*a
)),
575 OSSL_PROVIDER_name(EVP_KEYMGMT_provider(*b
)));
579 static void collect_keymanagers(EVP_KEYMGMT
*km
, void *stack
)
581 STACK_OF(EVP_KEYMGMT
) *km_stack
= stack
;
583 sk_EVP_KEYMGMT_push(km_stack
, km
);
584 EVP_KEYMGMT_up_ref(km
);
587 static void list_keymanagers(void)
590 STACK_OF(EVP_KEYMGMT
) *km_stack
= sk_EVP_KEYMGMT_new(keymanager_cmp
);
592 EVP_KEYMGMT_do_all_provided(NULL
, collect_keymanagers
, km_stack
);
593 sk_EVP_KEYMGMT_sort(km_stack
);
595 for (i
= 0; i
< sk_EVP_KEYMGMT_num(km_stack
); i
++) {
596 EVP_KEYMGMT
*k
= sk_EVP_KEYMGMT_value(km_stack
, i
);
597 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
599 if (select_name
!= NULL
&& !EVP_KEYMGMT_is_a(k
, select_name
))
602 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
603 if (names
!= NULL
&& EVP_KEYMGMT_names_do_all(k
, collect_names
, names
)) {
604 BIO_printf(bio_out
, " ");
605 print_names(bio_out
, names
);
607 BIO_printf(bio_out
, " @ %s\n",
608 OSSL_PROVIDER_name(EVP_KEYMGMT_provider(k
)));
611 print_param_types("settable key generation parameters",
612 EVP_KEYMGMT_gen_settable_params(k
), 4);
613 print_param_types("settable operation parameters",
614 EVP_KEYMGMT_settable_params(k
), 4);
615 print_param_types("retrievable operation parameters",
616 EVP_KEYMGMT_gettable_params(k
), 4);
619 sk_OPENSSL_CSTRING_free(names
);
621 sk_EVP_KEYMGMT_pop_free(km_stack
, EVP_KEYMGMT_free
);
624 DEFINE_STACK_OF(EVP_SIGNATURE
)
625 static int signature_cmp(const EVP_SIGNATURE
* const *a
,
626 const EVP_SIGNATURE
* const *b
)
628 int ret
= EVP_SIGNATURE_number(*a
) - EVP_SIGNATURE_number(*b
);
631 ret
= strcmp(OSSL_PROVIDER_name(EVP_SIGNATURE_provider(*a
)),
632 OSSL_PROVIDER_name(EVP_SIGNATURE_provider(*b
)));
636 static void collect_signatures(EVP_SIGNATURE
*km
, void *stack
)
638 STACK_OF(EVP_SIGNATURE
) *km_stack
= stack
;
640 sk_EVP_SIGNATURE_push(km_stack
, km
);
641 EVP_SIGNATURE_up_ref(km
);
644 static void list_signatures(void)
647 STACK_OF(EVP_SIGNATURE
) *sig_stack
= sk_EVP_SIGNATURE_new(signature_cmp
);
649 EVP_SIGNATURE_do_all_provided(NULL
, collect_signatures
, sig_stack
);
650 sk_EVP_SIGNATURE_sort(sig_stack
);
652 for (i
= 0; i
< sk_EVP_SIGNATURE_num(sig_stack
); i
++) {
653 EVP_SIGNATURE
*k
= sk_EVP_SIGNATURE_value(sig_stack
, i
);
654 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
656 if (select_name
!= NULL
&& !EVP_SIGNATURE_is_a(k
, select_name
))
659 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
660 if (names
!= NULL
&& EVP_SIGNATURE_names_do_all(k
, collect_names
, names
)) {
662 BIO_printf(bio_out
, " ");
663 print_names(bio_out
, names
);
665 BIO_printf(bio_out
, " @ %s\n",
666 OSSL_PROVIDER_name(EVP_SIGNATURE_provider(k
)));
669 print_param_types("settable operation parameters",
670 EVP_SIGNATURE_settable_ctx_params(k
), 4);
671 print_param_types("retrievable operation parameters",
672 EVP_SIGNATURE_gettable_ctx_params(k
), 4);
675 sk_OPENSSL_CSTRING_free(names
);
677 sk_EVP_SIGNATURE_pop_free(sig_stack
, EVP_SIGNATURE_free
);
679 BIO_printf(bio_out
, " -\n");
682 DEFINE_STACK_OF(EVP_KEM
)
683 static int kem_cmp(const EVP_KEM
* const *a
,
684 const EVP_KEM
* const *b
)
686 int ret
= EVP_KEM_number(*a
) - EVP_KEM_number(*b
);
689 ret
= strcmp(OSSL_PROVIDER_name(EVP_KEM_provider(*a
)),
690 OSSL_PROVIDER_name(EVP_KEM_provider(*b
)));
694 static void collect_kem(EVP_KEM
*km
, void *stack
)
696 STACK_OF(EVP_KEM
) *km_stack
= stack
;
698 sk_EVP_KEM_push(km_stack
, km
);
702 static void list_kems(void)
705 STACK_OF(EVP_KEM
) *kem_stack
= sk_EVP_KEM_new(kem_cmp
);
707 EVP_KEM_do_all_provided(NULL
, collect_kem
, kem_stack
);
708 sk_EVP_KEM_sort(kem_stack
);
710 for (i
= 0; i
< sk_EVP_KEM_num(kem_stack
); i
++) {
711 EVP_KEM
*k
= sk_EVP_KEM_value(kem_stack
, i
);
712 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
714 if (select_name
!= NULL
&& !EVP_KEM_is_a(k
, select_name
))
717 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
718 if (names
!= NULL
&& EVP_KEM_names_do_all(k
, collect_names
, names
)) {
720 BIO_printf(bio_out
, " ");
721 print_names(bio_out
, names
);
723 BIO_printf(bio_out
, " @ %s\n", OSSL_PROVIDER_name(EVP_KEM_provider(k
)));
726 print_param_types("settable operation parameters",
727 EVP_KEM_settable_ctx_params(k
), 4);
728 print_param_types("retrievable operation parameters",
729 EVP_KEM_gettable_ctx_params(k
), 4);
732 sk_OPENSSL_CSTRING_free(names
);
734 sk_EVP_KEM_pop_free(kem_stack
, EVP_KEM_free
);
736 BIO_printf(bio_out
, " -\n");
739 DEFINE_STACK_OF(EVP_ASYM_CIPHER
)
740 static int asymcipher_cmp(const EVP_ASYM_CIPHER
* const *a
,
741 const EVP_ASYM_CIPHER
* const *b
)
743 int ret
= EVP_ASYM_CIPHER_number(*a
) - EVP_ASYM_CIPHER_number(*b
);
746 ret
= strcmp(OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(*a
)),
747 OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(*b
)));
751 static void collect_asymciph(EVP_ASYM_CIPHER
*km
, void *stack
)
753 STACK_OF(EVP_ASYM_CIPHER
) *km_stack
= stack
;
755 sk_EVP_ASYM_CIPHER_push(km_stack
, km
);
756 EVP_ASYM_CIPHER_up_ref(km
);
759 static void list_asymciphers(void)
762 STACK_OF(EVP_ASYM_CIPHER
) *asymciph_stack
=
763 sk_EVP_ASYM_CIPHER_new(asymcipher_cmp
);
765 EVP_ASYM_CIPHER_do_all_provided(NULL
, collect_asymciph
, asymciph_stack
);
766 sk_EVP_ASYM_CIPHER_sort(asymciph_stack
);
768 for (i
= 0; i
< sk_EVP_ASYM_CIPHER_num(asymciph_stack
); i
++) {
769 EVP_ASYM_CIPHER
*k
= sk_EVP_ASYM_CIPHER_value(asymciph_stack
, i
);
770 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
772 if (select_name
!= NULL
&& !EVP_ASYM_CIPHER_is_a(k
, select_name
))
775 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
777 && EVP_ASYM_CIPHER_names_do_all(k
, collect_names
, names
)) {
779 BIO_printf(bio_out
, " ");
780 print_names(bio_out
, names
);
782 BIO_printf(bio_out
, " @ %s\n",
783 OSSL_PROVIDER_name(EVP_ASYM_CIPHER_provider(k
)));
786 print_param_types("settable operation parameters",
787 EVP_ASYM_CIPHER_settable_ctx_params(k
), 4);
788 print_param_types("retrievable operation parameters",
789 EVP_ASYM_CIPHER_gettable_ctx_params(k
), 4);
792 sk_OPENSSL_CSTRING_free(names
);
794 sk_EVP_ASYM_CIPHER_pop_free(asymciph_stack
, EVP_ASYM_CIPHER_free
);
796 BIO_printf(bio_out
, " -\n");
799 DEFINE_STACK_OF(EVP_KEYEXCH
)
800 static int kex_cmp(const EVP_KEYEXCH
* const *a
,
801 const EVP_KEYEXCH
* const *b
)
803 int ret
= EVP_KEYEXCH_number(*a
) - EVP_KEYEXCH_number(*b
);
806 ret
= strcmp(OSSL_PROVIDER_name(EVP_KEYEXCH_provider(*a
)),
807 OSSL_PROVIDER_name(EVP_KEYEXCH_provider(*b
)));
811 static void collect_kex(EVP_KEYEXCH
*ke
, void *stack
)
813 STACK_OF(EVP_KEYEXCH
) *kex_stack
= stack
;
815 sk_EVP_KEYEXCH_push(kex_stack
, ke
);
816 EVP_KEYEXCH_up_ref(ke
);
819 static void list_keyexchanges(void)
822 STACK_OF(EVP_KEYEXCH
) *kex_stack
= sk_EVP_KEYEXCH_new(kex_cmp
);
824 EVP_KEYEXCH_do_all_provided(NULL
, collect_kex
, kex_stack
);
825 sk_EVP_KEYEXCH_sort(kex_stack
);
827 for (i
= 0; i
< sk_EVP_KEYEXCH_num(kex_stack
); i
++) {
828 EVP_KEYEXCH
*k
= sk_EVP_KEYEXCH_value(kex_stack
, i
);
829 STACK_OF(OPENSSL_CSTRING
) *names
= NULL
;
831 if (select_name
!= NULL
&& !EVP_KEYEXCH_is_a(k
, select_name
))
834 names
= sk_OPENSSL_CSTRING_new(name_cmp
);
835 if (names
!= NULL
&& EVP_KEYEXCH_names_do_all(k
, collect_names
, names
)) {
837 BIO_printf(bio_out
, " ");
838 print_names(bio_out
, names
);
840 BIO_printf(bio_out
, " @ %s\n",
841 OSSL_PROVIDER_name(EVP_KEYEXCH_provider(k
)));
844 print_param_types("settable operation parameters",
845 EVP_KEYEXCH_settable_ctx_params(k
), 4);
846 print_param_types("retrievable operation parameters",
847 EVP_KEYEXCH_gettable_ctx_params(k
), 4);
850 sk_OPENSSL_CSTRING_free(names
);
852 sk_EVP_KEYEXCH_pop_free(kex_stack
, EVP_KEYEXCH_free
);
854 BIO_printf(bio_out
, " -\n");
857 static void list_missing_help(void)
862 for (fp
= functions
; fp
->name
!= NULL
; fp
++) {
863 if ((o
= fp
->help
) != NULL
) {
864 /* If there is help, list what flags are not documented. */
865 for ( ; o
->name
!= NULL
; o
++) {
866 if (o
->helpstr
== NULL
)
867 BIO_printf(bio_out
, "%s %s\n", fp
->name
, o
->name
);
869 } else if (fp
->func
!= dgst_main
) {
870 /* If not aliased to the dgst command, */
871 BIO_printf(bio_out
, "%s *\n", fp
->name
);
876 static void list_objects(void)
878 int max_nid
= OBJ_new_nid(0);
880 char *oid_buf
= NULL
;
883 /* Skip 0, since that's NID_undef */
884 for (i
= 1; i
< max_nid
; i
++) {
885 const ASN1_OBJECT
*obj
= OBJ_nid2obj(i
);
886 const char *sn
= OBJ_nid2sn(i
);
887 const char *ln
= OBJ_nid2ln(i
);
891 * If one of the retrieved objects somehow generated an error,
892 * we ignore it. The check for NID_undef below will detect the
893 * error and simply skip to the next NID.
897 if (OBJ_obj2nid(obj
) == NID_undef
)
900 if ((n
= OBJ_obj2txt(NULL
, 0, obj
, 1)) == 0) {
901 BIO_printf(bio_out
, "# None-OID object: %s, %s\n", sn
, ln
);
908 oid_buf
= OPENSSL_realloc(oid_buf
, n
+ 1);
909 if (oid_buf
== NULL
) {
910 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
915 if (OBJ_obj2txt(oid_buf
, oid_size
, obj
, 1) < 0)
917 if (ln
== NULL
|| strcmp(sn
, ln
) == 0)
918 BIO_printf(bio_out
, "%s = %s\n", sn
, oid_buf
);
920 BIO_printf(bio_out
, "%s = %s, %s\n", sn
, ln
, oid_buf
);
923 OPENSSL_free(oid_buf
);
926 static void list_options_for_command(const char *command
)
931 for (fp
= functions
; fp
->name
!= NULL
; fp
++)
932 if (strcmp(fp
->name
, command
) == 0)
934 if (fp
->name
== NULL
) {
935 BIO_printf(bio_err
, "Invalid command '%s'; type \"help\" for a list.\n",
940 if ((o
= fp
->help
) == NULL
)
943 for ( ; o
->name
!= NULL
; o
++) {
946 if (o
->name
== OPT_PARAM_STR
)
949 if (o
->name
== OPT_HELP_STR
950 || o
->name
== OPT_MORE_STR
951 || o
->name
== OPT_SECTION_STR
952 || o
->name
[0] == '\0')
954 BIO_printf(bio_out
, "%s %c\n", o
->name
, c
== '\0' ? '-' : c
);
956 /* Always output the -- marker since it is sometimes documented. */
957 BIO_printf(bio_out
, "- -\n");
960 static int is_md_available(const char *name
)
964 /* Look through providers' digests */
966 md
= EVP_MD_fetch(NULL
, name
, NULL
);
973 return (get_digest_from_engine(name
) == NULL
) ? 0 : 1;
976 static int is_cipher_available(const char *name
)
980 /* Look through providers' ciphers */
982 cipher
= EVP_CIPHER_fetch(NULL
, name
, NULL
);
984 if (cipher
!= NULL
) {
985 EVP_CIPHER_free(cipher
);
989 return (get_cipher_from_engine(name
) == NULL
) ? 0 : 1;
992 static void list_type(FUNC_TYPE ft
, int one
)
998 memset(&dc
, 0, sizeof(dc
));
1000 calculate_columns(functions
, &dc
);
1002 for (fp
= functions
; fp
->name
!= NULL
; fp
++) {
1007 if (!is_cipher_available(fp
->name
))
1011 if (!is_md_available(fp
->name
))
1018 BIO_printf(bio_out
, "%s\n", fp
->name
);
1020 if (i
% dc
.columns
== 0 && i
> 0)
1021 BIO_printf(bio_out
, "\n");
1022 BIO_printf(bio_out
, "%-*s", dc
.width
, fp
->name
);
1027 BIO_printf(bio_out
, "\n\n");
1030 static void list_pkey(void)
1032 #ifndef OPENSSL_NO_DEPRECATED_3_0
1035 if (select_name
== NULL
) {
1036 BIO_printf(bio_out
, "Legacy:\n");
1037 for (i
= 0; i
< EVP_PKEY_asn1_get_count(); i
++) {
1038 const EVP_PKEY_ASN1_METHOD
*ameth
;
1039 int pkey_id
, pkey_base_id
, pkey_flags
;
1040 const char *pinfo
, *pem_str
;
1041 ameth
= EVP_PKEY_asn1_get0(i
);
1042 EVP_PKEY_asn1_get0_info(&pkey_id
, &pkey_base_id
, &pkey_flags
,
1043 &pinfo
, &pem_str
, ameth
);
1044 if (pkey_flags
& ASN1_PKEY_ALIAS
) {
1045 BIO_printf(bio_out
, " Name: %s\n", OBJ_nid2ln(pkey_id
));
1046 BIO_printf(bio_out
, "\tAlias for: %s\n",
1047 OBJ_nid2ln(pkey_base_id
));
1049 BIO_printf(bio_out
, " Name: %s\n", pinfo
);
1050 BIO_printf(bio_out
, "\tType: %s Algorithm\n",
1051 pkey_flags
& ASN1_PKEY_DYNAMIC
?
1052 "External" : "Builtin");
1053 BIO_printf(bio_out
, "\tOID: %s\n", OBJ_nid2ln(pkey_id
));
1054 if (pem_str
== NULL
)
1056 BIO_printf(bio_out
, "\tPEM string: %s\n", pem_str
);
1061 BIO_printf(bio_out
, "Provided:\n");
1062 BIO_printf(bio_out
, " Key Managers:\n");
1066 static void list_pkey_meth(void)
1068 #ifndef OPENSSL_NO_DEPRECATED_3_0
1070 size_t meth_count
= EVP_PKEY_meth_get_count();
1072 if (select_name
== NULL
) {
1073 BIO_printf(bio_out
, "Legacy:\n");
1074 for (i
= 0; i
< meth_count
; i
++) {
1075 const EVP_PKEY_METHOD
*pmeth
= EVP_PKEY_meth_get0(i
);
1076 int pkey_id
, pkey_flags
;
1078 EVP_PKEY_meth_get0_info(&pkey_id
, &pkey_flags
, pmeth
);
1079 BIO_printf(bio_out
, " %s\n", OBJ_nid2ln(pkey_id
));
1080 BIO_printf(bio_out
, "\tType: %s Algorithm\n",
1081 pkey_flags
& ASN1_PKEY_DYNAMIC
? "External" : "Builtin");
1085 BIO_printf(bio_out
, "Provided:\n");
1086 BIO_printf(bio_out
, " Encryption:\n");
1088 BIO_printf(bio_out
, " Key Exchange:\n");
1089 list_keyexchanges();
1090 BIO_printf(bio_out
, " Signatures:\n");
1092 BIO_printf(bio_out
, " Key encapsulation:\n");
1096 DEFINE_STACK_OF(OSSL_PROVIDER
)
1097 static int provider_cmp(const OSSL_PROVIDER
* const *a
,
1098 const OSSL_PROVIDER
* const *b
)
1100 return strcmp(OSSL_PROVIDER_name(*a
), OSSL_PROVIDER_name(*b
));
1103 static int collect_providers(OSSL_PROVIDER
*provider
, void *stack
)
1105 STACK_OF(OSSL_PROVIDER
) *provider_stack
= stack
;
1107 sk_OSSL_PROVIDER_push(provider_stack
, provider
);
1111 static void list_provider_info(void)
1113 STACK_OF(OSSL_PROVIDER
) *providers
= sk_OSSL_PROVIDER_new(provider_cmp
);
1114 OSSL_PARAM params
[5];
1115 char *name
, *version
, *buildinfo
;
1119 if (providers
== NULL
) {
1120 BIO_printf(bio_err
, "ERROR: Memory allocation\n");
1123 BIO_printf(bio_out
, "Providers:\n");
1124 OSSL_PROVIDER_do_all(NULL
, &collect_providers
, providers
);
1125 sk_OSSL_PROVIDER_sort(providers
);
1126 for (i
= 0; i
< sk_OSSL_PROVIDER_num(providers
); i
++) {
1127 const OSSL_PROVIDER
*prov
= sk_OSSL_PROVIDER_value(providers
, i
);
1129 /* Query the "known" information parameters, the order matches below */
1130 params
[0] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_NAME
,
1132 params
[1] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_VERSION
,
1134 params
[2] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_STATUS
, &status
);
1135 params
[3] = OSSL_PARAM_construct_utf8_ptr(OSSL_PROV_PARAM_BUILDINFO
,
1137 params
[4] = OSSL_PARAM_construct_end();
1138 OSSL_PARAM_set_all_unmodified(params
);
1139 if (!OSSL_PROVIDER_get_params(prov
, params
)) {
1140 BIO_printf(bio_err
, "ERROR: Unable to query provider parameters\n");
1144 /* Print out the provider information, the params order matches above */
1145 BIO_printf(bio_out
, " %s\n", OSSL_PROVIDER_name(prov
));
1146 if (OSSL_PARAM_modified(params
))
1147 BIO_printf(bio_out
, " name: %s\n", name
);
1148 if (OSSL_PARAM_modified(params
+ 1))
1149 BIO_printf(bio_out
, " version: %s\n", version
);
1150 if (OSSL_PARAM_modified(params
+ 2))
1151 BIO_printf(bio_out
, " status: %sactive\n", status
? "" : "in");
1153 if (OSSL_PARAM_modified(params
+ 3))
1154 BIO_printf(bio_out
, " build info: %s\n", buildinfo
);
1155 print_param_types("gettable provider parameters",
1156 OSSL_PROVIDER_gettable_params(prov
), 4);
1159 sk_OSSL_PROVIDER_free(providers
);
1162 #ifndef OPENSSL_NO_DEPRECATED_3_0
1163 static void list_engines(void)
1165 # ifndef OPENSSL_NO_ENGINE
1168 BIO_puts(bio_out
, "Engines:\n");
1169 e
= ENGINE_get_first();
1171 BIO_printf(bio_out
, "%s\n", ENGINE_get_id(e
));
1172 e
= ENGINE_get_next(e
);
1175 BIO_puts(bio_out
, "Engine support is disabled.\n");
1180 static void list_disabled(void)
1182 BIO_puts(bio_out
, "Disabled algorithms:\n");
1183 #ifdef OPENSSL_NO_ARIA
1184 BIO_puts(bio_out
, "ARIA\n");
1186 #ifdef OPENSSL_NO_BF
1187 BIO_puts(bio_out
, "BF\n");
1189 #ifdef OPENSSL_NO_BLAKE2
1190 BIO_puts(bio_out
, "BLAKE2\n");
1192 #ifdef OPENSSL_NO_CAMELLIA
1193 BIO_puts(bio_out
, "CAMELLIA\n");
1195 #ifdef OPENSSL_NO_CAST
1196 BIO_puts(bio_out
, "CAST\n");
1198 #ifdef OPENSSL_NO_CMAC
1199 BIO_puts(bio_out
, "CMAC\n");
1201 #ifdef OPENSSL_NO_CMS
1202 BIO_puts(bio_out
, "CMS\n");
1204 #ifdef OPENSSL_NO_COMP
1205 BIO_puts(bio_out
, "COMP\n");
1207 #ifdef OPENSSL_NO_DES
1208 BIO_puts(bio_out
, "DES\n");
1210 #ifdef OPENSSL_NO_DGRAM
1211 BIO_puts(bio_out
, "DGRAM\n");
1213 #ifdef OPENSSL_NO_DH
1214 BIO_puts(bio_out
, "DH\n");
1216 #ifdef OPENSSL_NO_DSA
1217 BIO_puts(bio_out
, "DSA\n");
1219 #if defined(OPENSSL_NO_DTLS)
1220 BIO_puts(bio_out
, "DTLS\n");
1222 #if defined(OPENSSL_NO_DTLS1)
1223 BIO_puts(bio_out
, "DTLS1\n");
1225 #if defined(OPENSSL_NO_DTLS1_2)
1226 BIO_puts(bio_out
, "DTLS1_2\n");
1228 #ifdef OPENSSL_NO_EC
1229 BIO_puts(bio_out
, "EC\n");
1231 #ifdef OPENSSL_NO_EC2M
1232 BIO_puts(bio_out
, "EC2M\n");
1234 #if defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
1235 BIO_puts(bio_out
, "ENGINE\n");
1237 #ifdef OPENSSL_NO_GOST
1238 BIO_puts(bio_out
, "GOST\n");
1240 #ifdef OPENSSL_NO_IDEA
1241 BIO_puts(bio_out
, "IDEA\n");
1243 #ifdef OPENSSL_NO_MD2
1244 BIO_puts(bio_out
, "MD2\n");
1246 #ifdef OPENSSL_NO_MD4
1247 BIO_puts(bio_out
, "MD4\n");
1249 #ifdef OPENSSL_NO_MD5
1250 BIO_puts(bio_out
, "MD5\n");
1252 #ifdef OPENSSL_NO_MDC2
1253 BIO_puts(bio_out
, "MDC2\n");
1255 #ifdef OPENSSL_NO_OCB
1256 BIO_puts(bio_out
, "OCB\n");
1258 #ifdef OPENSSL_NO_OCSP
1259 BIO_puts(bio_out
, "OCSP\n");
1261 #ifdef OPENSSL_NO_PSK
1262 BIO_puts(bio_out
, "PSK\n");
1264 #ifdef OPENSSL_NO_RC2
1265 BIO_puts(bio_out
, "RC2\n");
1267 #ifdef OPENSSL_NO_RC4
1268 BIO_puts(bio_out
, "RC4\n");
1270 #ifdef OPENSSL_NO_RC5
1271 BIO_puts(bio_out
, "RC5\n");
1273 #ifdef OPENSSL_NO_RMD160
1274 BIO_puts(bio_out
, "RMD160\n");
1276 #ifdef OPENSSL_NO_SCRYPT
1277 BIO_puts(bio_out
, "SCRYPT\n");
1279 #ifdef OPENSSL_NO_SCTP
1280 BIO_puts(bio_out
, "SCTP\n");
1282 #ifdef OPENSSL_NO_SEED
1283 BIO_puts(bio_out
, "SEED\n");
1285 #ifdef OPENSSL_NO_SM2
1286 BIO_puts(bio_out
, "SM2\n");
1288 #ifdef OPENSSL_NO_SM3
1289 BIO_puts(bio_out
, "SM3\n");
1291 #ifdef OPENSSL_NO_SM4
1292 BIO_puts(bio_out
, "SM4\n");
1294 #ifdef OPENSSL_NO_SOCK
1295 BIO_puts(bio_out
, "SOCK\n");
1297 #ifdef OPENSSL_NO_SRP
1298 BIO_puts(bio_out
, "SRP\n");
1300 #ifdef OPENSSL_NO_SRTP
1301 BIO_puts(bio_out
, "SRTP\n");
1303 #ifdef OPENSSL_NO_SSL3
1304 BIO_puts(bio_out
, "SSL3\n");
1306 #ifdef OPENSSL_NO_TLS1
1307 BIO_puts(bio_out
, "TLS1\n");
1309 #ifdef OPENSSL_NO_TLS1_1
1310 BIO_puts(bio_out
, "TLS1_1\n");
1312 #ifdef OPENSSL_NO_TLS1_2
1313 BIO_puts(bio_out
, "TLS1_2\n");
1315 #ifdef OPENSSL_NO_WHIRLPOOL
1316 BIO_puts(bio_out
, "WHIRLPOOL\n");
1319 BIO_puts(bio_out
, "ZLIB\n");
1323 /* Unified enum for help and list commands. */
1324 typedef enum HELPLIST_CHOICE
{
1325 OPT_ERR
= -1, OPT_EOF
= 0, OPT_HELP
, OPT_ONE
, OPT_VERBOSE
,
1326 OPT_COMMANDS
, OPT_DIGEST_COMMANDS
, OPT_MAC_ALGORITHMS
, OPT_OPTIONS
,
1327 OPT_DIGEST_ALGORITHMS
, OPT_CIPHER_COMMANDS
, OPT_CIPHER_ALGORITHMS
,
1328 OPT_PK_ALGORITHMS
, OPT_PK_METHOD
, OPT_DISABLED
,
1329 OPT_KDF_ALGORITHMS
, OPT_RANDOM_INSTANCES
, OPT_RANDOM_GENERATORS
,
1330 OPT_ENCODERS
, OPT_DECODERS
, OPT_KEYMANAGERS
, OPT_KEYEXCHANGE_ALGORITHMS
,
1331 OPT_KEM_ALGORITHMS
, OPT_SIGNATURE_ALGORITHMS
, OPT_ASYM_CIPHER_ALGORITHMS
,
1333 OPT_MISSING_HELP
, OPT_OBJECTS
, OPT_SELECT_NAME
,
1334 #ifndef OPENSSL_NO_DEPRECATED_3_0
1340 const OPTIONS list_options
[] = {
1342 OPT_SECTION("General"),
1343 {"help", OPT_HELP
, '-', "Display this summary"},
1345 OPT_SECTION("Output"),
1346 {"1", OPT_ONE
, '-', "List in one column"},
1347 {"verbose", OPT_VERBOSE
, '-', "Verbose listing"},
1348 {"select", OPT_SELECT_NAME
, 's', "Select a single algorithm"},
1349 {"commands", OPT_COMMANDS
, '-', "List of standard commands"},
1350 {"standard-commands", OPT_COMMANDS
, '-', "List of standard commands"},
1351 #ifndef OPENSSL_NO_DEPRECATED_3_0
1352 {"digest-commands", OPT_DIGEST_COMMANDS
, '-',
1353 "List of message digest commands (deprecated)"},
1355 {"digest-algorithms", OPT_DIGEST_ALGORITHMS
, '-',
1356 "List of message digest algorithms"},
1357 {"kdf-algorithms", OPT_KDF_ALGORITHMS
, '-',
1358 "List of key derivation and pseudo random function algorithms"},
1359 {"random-instances", OPT_RANDOM_INSTANCES
, '-',
1360 "List the primary, pubic and private random number generator details"},
1361 {"random-generators", OPT_RANDOM_GENERATORS
, '-',
1362 "List of random number generators"},
1363 {"mac-algorithms", OPT_MAC_ALGORITHMS
, '-',
1364 "List of message authentication code algorithms"},
1365 #ifndef OPENSSL_NO_DEPRECATED_3_0
1366 {"cipher-commands", OPT_CIPHER_COMMANDS
, '-',
1367 "List of cipher commands (deprecated)"},
1369 {"cipher-algorithms", OPT_CIPHER_ALGORITHMS
, '-',
1370 "List of cipher algorithms"},
1371 {"encoders", OPT_ENCODERS
, '-', "List of encoding methods" },
1372 {"decoders", OPT_DECODERS
, '-', "List of decoding methods" },
1373 {"key-managers", OPT_KEYMANAGERS
, '-', "List of key managers" },
1374 {"key-exchange-algorithms", OPT_KEYEXCHANGE_ALGORITHMS
, '-',
1375 "List of key exchange algorithms" },
1376 {"kem-algorithms", OPT_KEM_ALGORITHMS
, '-',
1377 "List of key encapsulation mechanism algorithms" },
1378 {"signature-algorithms", OPT_SIGNATURE_ALGORITHMS
, '-',
1379 "List of signature algorithms" },
1380 { "asymcipher-algorithms", OPT_ASYM_CIPHER_ALGORITHMS
, '-',
1381 "List of asymmetric cipher algorithms" },
1382 {"public-key-algorithms", OPT_PK_ALGORITHMS
, '-',
1383 "List of public key algorithms"},
1384 {"public-key-methods", OPT_PK_METHOD
, '-',
1385 "List of public key methods"},
1386 {"providers", OPT_PROVIDER_INFO
, '-',
1387 "List of provider information"},
1388 #ifndef OPENSSL_NO_DEPRECATED_3_0
1389 {"engines", OPT_ENGINES
, '-',
1390 "List of loaded engines"},
1392 {"disabled", OPT_DISABLED
, '-', "List of disabled features"},
1393 {"missing-help", OPT_MISSING_HELP
, '-',
1394 "List missing detailed help strings"},
1395 {"options", OPT_OPTIONS
, 's',
1396 "List options for specified command"},
1397 {"objects", OPT_OBJECTS
, '-',
1398 "List built in objects (OID<->name mappings)"},
1404 int list_main(int argc
, char **argv
)
1408 int one
= 0, done
= 0;
1410 unsigned int commands
:1;
1411 unsigned int random_instances
:1;
1412 unsigned int random_generators
:1;
1413 unsigned int digest_commands
:1;
1414 unsigned int digest_algorithms
:1;
1415 unsigned int kdf_algorithms
:1;
1416 unsigned int mac_algorithms
:1;
1417 unsigned int cipher_commands
:1;
1418 unsigned int cipher_algorithms
:1;
1419 unsigned int encoder_algorithms
:1;
1420 unsigned int decoder_algorithms
:1;
1421 unsigned int keymanager_algorithms
:1;
1422 unsigned int signature_algorithms
:1;
1423 unsigned int keyexchange_algorithms
:1;
1424 unsigned int kem_algorithms
:1;
1425 unsigned int asym_cipher_algorithms
:1;
1426 unsigned int pk_algorithms
:1;
1427 unsigned int pk_method
:1;
1428 unsigned int provider_info
:1;
1429 #ifndef OPENSSL_NO_DEPRECATED_3_0
1430 unsigned int engines
:1;
1432 unsigned int disabled
:1;
1433 unsigned int missing_help
:1;
1434 unsigned int objects
:1;
1435 unsigned int options
:1;
1438 verbose
= 0; /* Clear a possible previous call */
1440 prog
= opt_init(argc
, argv
, list_options
);
1441 while ((o
= opt_next()) != OPT_EOF
) {
1443 case OPT_EOF
: /* Never hit, but suppresses warning */
1446 BIO_printf(bio_err
, "%s: Use -help for summary.\n", prog
);
1449 opt_help(list_options
);
1457 case OPT_DIGEST_COMMANDS
:
1458 todo
.digest_commands
= 1;
1460 case OPT_DIGEST_ALGORITHMS
:
1461 todo
.digest_algorithms
= 1;
1463 case OPT_KDF_ALGORITHMS
:
1464 todo
.kdf_algorithms
= 1;
1466 case OPT_RANDOM_INSTANCES
:
1467 todo
.random_instances
= 1;
1469 case OPT_RANDOM_GENERATORS
:
1470 todo
.random_generators
= 1;
1472 case OPT_MAC_ALGORITHMS
:
1473 todo
.mac_algorithms
= 1;
1475 case OPT_CIPHER_COMMANDS
:
1476 todo
.cipher_commands
= 1;
1478 case OPT_CIPHER_ALGORITHMS
:
1479 todo
.cipher_algorithms
= 1;
1482 todo
.encoder_algorithms
= 1;
1485 todo
.decoder_algorithms
= 1;
1487 case OPT_KEYMANAGERS
:
1488 todo
.keymanager_algorithms
= 1;
1490 case OPT_SIGNATURE_ALGORITHMS
:
1491 todo
.signature_algorithms
= 1;
1493 case OPT_KEYEXCHANGE_ALGORITHMS
:
1494 todo
.keyexchange_algorithms
= 1;
1496 case OPT_KEM_ALGORITHMS
:
1497 todo
.kem_algorithms
= 1;
1499 case OPT_ASYM_CIPHER_ALGORITHMS
:
1500 todo
.asym_cipher_algorithms
= 1;
1502 case OPT_PK_ALGORITHMS
:
1503 todo
.pk_algorithms
= 1;
1508 case OPT_PROVIDER_INFO
:
1509 todo
.provider_info
= 1;
1511 #ifndef OPENSSL_NO_DEPRECATED_3_0
1519 case OPT_MISSING_HELP
:
1520 todo
.missing_help
= 1;
1526 list_options_for_command(opt_arg());
1531 case OPT_SELECT_NAME
:
1532 select_name
= opt_arg();
1534 case OPT_PROV_CASES
:
1535 if (!opt_provider(o
))
1542 /* No extra arguments. */
1543 if (opt_num_rest() != 0)
1547 list_type(FT_general
, one
);
1548 if (todo
.random_instances
)
1549 list_random_instances();
1550 if (todo
.random_generators
)
1551 list_random_generators();
1552 if (todo
.digest_commands
)
1553 list_type(FT_md
, one
);
1554 if (todo
.digest_algorithms
)
1556 if (todo
.kdf_algorithms
)
1558 if (todo
.mac_algorithms
)
1560 if (todo
.cipher_commands
)
1561 list_type(FT_cipher
, one
);
1562 if (todo
.cipher_algorithms
)
1564 if (todo
.encoder_algorithms
)
1566 if (todo
.decoder_algorithms
)
1568 if (todo
.keymanager_algorithms
)
1570 if (todo
.signature_algorithms
)
1572 if (todo
.asym_cipher_algorithms
)
1574 if (todo
.keyexchange_algorithms
)
1575 list_keyexchanges();
1576 if (todo
.kem_algorithms
)
1578 if (todo
.pk_algorithms
)
1582 if (todo
.provider_info
)
1583 list_provider_info();
1584 #ifndef OPENSSL_NO_DEPRECATED_3_0
1590 if (todo
.missing_help
)
1591 list_missing_help();