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