2929#if OPENSSL_VERSION_MAJOR > 3 || \
3030 (OPENSSL_VERSION_MAJOR == 3 && OPENSSL_VERSION_MINOR >= 5 )
3131# define OPENSSL_DO_PQ
32+ # define PQ_GETOPT "q"
33+ # define PQ_USAGE_OPT " [-q]"
34+ # define PQ_USAGE_DESC "-q - include post-quantum algorithms\n"
35+ #else
36+ # define PQ_GETOPT ""
37+ # define PQ_USAGE_OPT ""
38+ # define PQ_USAGE_DESC ""
3239#endif
3340
3441#define RUN_TIME 5
3744 * Update the constant numbers below if you add or remove
3845 * post-quantum algorithms from the fetch list.
3946 */
40- #ifndef OPENSSL_NO_ML_KEM
47+ #if defined( OPENSSL_DO_PQ ) && !defined( OPENSSL_NO_ML_KEM )
4148#define FETCH_ENTRY_ML_KEM_N 3
4249#else
4350#define FETCH_ENTRY_ML_KEM_N 0
4451#endif
4552
46- #ifndef OPENSSL_NO_ML_DSA
53+ #if defined( OPENSSL_DO_PQ ) && !defined( OPENSSL_NO_ML_DSA )
4754#define FETCH_ENTRY_ML_DSA_N 3
4855#else
4956#define FETCH_ENTRY_ML_DSA_N 0
5057#endif
5158
52- #ifndef OPENSSL_NO_SLH_DSA
59+ #if defined( OPENSSL_DO_PQ ) && !defined( OPENSSL_NO_SLH_DSA )
5360#define FETCH_ENTRY_SLH_DSA_N 6
5461#else
5562#define FETCH_ENTRY_SLH_DSA_N 0
@@ -83,19 +90,14 @@ typedef enum {
8390 FETCH_END
8491} fetch_type_t ;
8592
86- struct fetch_type_map {
87- char * name ;
88- fetch_type_t id ;
89- };
90-
91- struct fetch_type_map type_map [] = {
92- { "MD" , FETCH_MD },
93- { "CIPHER" , FETCH_CIPHER },
94- { "KDF" , FETCH_KDF },
95- { "MAC" , FETCH_MAC },
96- { "RAND" , FETCH_RAND },
97- { "KEM" , FETCH_PQ_KEM },
98- { "SIGNATURE" , FETCH_PQ_SIGNATURE },
93+ static const char * type_map [] = {
94+ [FETCH_MD ] = "MD" ,
95+ [FETCH_CIPHER ] = "CIPHER" ,
96+ [FETCH_KDF ] = "KDF" ,
97+ [FETCH_MAC ] = "MAC" ,
98+ [FETCH_RAND ] = "RAND" ,
99+ [FETCH_PQ_KEM ] = "KEM" ,
100+ [FETCH_PQ_SIGNATURE ] = "SIGNATURE" ,
99101};
100102
101103fetch_type_t exclusive_fetch_type = FETCH_END ;
@@ -111,7 +113,7 @@ struct fetch_data_entry {
111113 * The post quantum algorithms must be the last entries in the
112114 * list, so we can easily skip them if we don't want them.
113115 */
114- static struct fetch_data_entry fetch_entries [] = {
116+ static const struct fetch_data_entry fetch_entries [] = {
115117 {FETCH_MD , OSSL_DIGEST_NAME_SHA2_224 , NULL },
116118 {FETCH_MD , OSSL_DIGEST_NAME_SHA2_256 , NULL },
117119 {FETCH_MD , OSSL_DIGEST_NAME_SHA3_224 , NULL },
@@ -137,17 +139,17 @@ static struct fetch_data_entry fetch_entries[] = {
137139#ifndef OPENSSL_NO_POLY1305
138140 {FETCH_MAC , OSSL_MAC_NAME_POLY1305 , NULL },
139141#endif
140- #ifndef OPENSSL_NO_ML_KEM
142+ #if defined( OPENSSL_DO_PQ ) && ! defined ( OPENSSL_NO_ML_KEM )
141143 {FETCH_PQ_KEM , "ML-KEM-512" , NULL },
142144 {FETCH_PQ_KEM , "ML-KEM-768" , NULL },
143145 {FETCH_PQ_KEM , "ML-KEM-1024" , NULL },
144146#endif
145- #ifndef OPENSSL_NO_ML_DSA
147+ #if defined( OPENSSL_DO_PQ ) && ! defined ( OPENSSL_NO_ML_DSA )
146148 {FETCH_PQ_SIGNATURE , "ML-DSA-44" , NULL },
147149 {FETCH_PQ_SIGNATURE , "ML-DSA-65" , NULL },
148150 {FETCH_PQ_SIGNATURE , "ML-DSA-87" , NULL },
149151#endif
150- #ifndef OPENSSL_NO_SLH_DSA
152+ #if defined( OPENSSL_DO_PQ ) && ! defined ( OPENSSL_NO_SLH_DSA )
151153 {FETCH_PQ_SIGNATURE , "SLH-DSA-SHA2-128s" , NULL },
152154 {FETCH_PQ_SIGNATURE , "SLH-DSA-SHA2-192s" , NULL },
153155 {FETCH_PQ_SIGNATURE , "SLH-DSA-SHA2-256s" , NULL },
@@ -284,6 +286,27 @@ void do_fetch(size_t num)
284286 } while (time .t < max_time .t );
285287}
286288
289+ static void
290+ usage (const char * progname )
291+ {
292+ printf ("Usage: %s [-t] [-f TYPE:ALGORITHM]" PQ_USAGE_OPT " threadcount\n"
293+ "-t - terse output\n"
294+ "-f - fetch only the specified algorithm\n"
295+ PQ_USAGE_DESC
296+ "\nEnvironment variables:\n"
297+ " EVP_FETCH_TYPE - if no -f option is provided, fetch only\n"
298+ " the specified TYPE:ALGORITHM\n" ,
299+ progname );
300+
301+ printf ("\nAvailable TYPE:ALGORITHM combinations:\n" );
302+ for (size_t i = 0 ; i < ARRAY_SIZE (fetch_entries ); i ++ ) {
303+ const fetch_type_t ft = fetch_entries [i ].ftype ;
304+
305+ if (ft >= 0 && ft < ARRAY_SIZE (type_map ) && type_map [ft ] != NULL )
306+ printf (" %s:%s\n" , type_map [ft ], fetch_entries [i ].alg );
307+ }
308+ }
309+
287310int main (int argc , char * argv [])
288311{
289312 OSSL_TIME duration ;
@@ -296,30 +319,21 @@ int main(int argc, char *argv[])
296319 char * fetch_type = getenv ("EVP_FETCH_TYPE" );
297320 int opt ;
298321
299- #ifdef OPENSSL_DO_PQ
300- while ((opt = getopt (argc , argv , "tq" )) != -1 ) {
301- #else
302- while ((opt = getopt (argc , argv , "t" )) != -1 ) {
303- #endif
322+ while ((opt = getopt (argc , argv , "tf:" PQ_GETOPT )) != -1 ) {
304323 switch (opt ) {
305324 case 't' :
306325 terse = 1 ;
307326 break ;
327+ case 'f' :
328+ fetch_type = optarg ;
329+ break ;
308330#ifdef OPENSSL_DO_PQ
309331 case 'q' :
310332 pq = 1 ;
311333 break ;
312334#endif
313335 default :
314- #ifdef OPENSSL_DO_PQ
315- printf ("Usage: %s [-t] [-q] threadcount\n" , basename (argv [0 ]));
316- #else
317- printf ("Usage: %s [-t] threadcount\n" , basename (argv [0 ]));
318- #endif
319- printf ("-t - terse output\n" );
320- #ifdef OPENSSL_DO_PQ
321- printf ("-q - include post-quantum algorithms\n" );
322- #endif
336+ usage (basename (argv [0 ]));
323337 return EXIT_FAILURE ;
324338 }
325339 }
@@ -334,8 +348,8 @@ int main(int argc, char *argv[])
334348 * exclusive_fetch_alg = '\0' ;
335349 exclusive_fetch_alg ++ ;
336350 for (i = 0 ; i < ARRAY_SIZE (type_map ); i ++ ) {
337- if (! strcmp (fetch_type , type_map [i ]. name )) {
338- exclusive_fetch_type = type_map [ i ]. id ;
351+ if (type_map [ i ] != NULL && ! strcmp (fetch_type , type_map [i ])) {
352+ exclusive_fetch_type = i ;
339353 break ;
340354 }
341355 }
0 commit comments