Skip to content

Commit 06c1b14

Browse files
esyrSashan
authored andcommitted
evp_fetch: add an option to specify the algorithm to fetch in addition to the envvar
Signed-off-by: Eugene Syromiatnikov <[email protected]> Reviewed-by: Saša Nedvědický <[email protected]> (Merged from #62)
1 parent 3eb9e61 commit 06c1b14

File tree

1 file changed

+50
-36
lines changed

1 file changed

+50
-36
lines changed

source/evp_fetch.c

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@
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
@@ -37,19 +44,19 @@
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

101103
fetch_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+
287310
int 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

Comments
 (0)