Home | History | Annotate | Line # | Download | only in test
      1 /*
      2  * Copyright 2015-2025 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 #define OPENSSL_SUPPRESS_DEPRECATED /* EVP_PKEY_new_CMAC_key */
     11 #include <stdio.h>
     12 #include <string.h>
     13 #include <stdlib.h>
     14 #include <ctype.h>
     15 #include <openssl/evp.h>
     16 #include <openssl/pem.h>
     17 #include <openssl/err.h>
     18 #include <openssl/provider.h>
     19 #include <openssl/x509v3.h>
     20 #include <openssl/pkcs12.h>
     21 #include <openssl/kdf.h>
     22 #include <openssl/params.h>
     23 #include <openssl/param_build.h>
     24 #include <openssl/core_names.h>
     25 #include <openssl/fips_names.h>
     26 #include <openssl/thread.h>
     27 #include "internal/numbers.h"
     28 #include "internal/nelem.h"
     29 #include "internal/sizes.h"
     30 #include "crypto/evp.h"
     31 #include "testutil.h"
     32 
     33 typedef struct evp_test_buffer_st EVP_TEST_BUFFER;
     34 DEFINE_STACK_OF(EVP_TEST_BUFFER)
     35 
     36 #define AAD_NUM 4
     37 
     38 typedef struct evp_test_method_st EVP_TEST_METHOD;
     39 
     40 /* Structure holding test information */
     41 typedef struct evp_test_st {
     42     STANZA s; /* Common test stanza */
     43     char *name;
     44     int skip; /* Current test should be skipped */
     45     const EVP_TEST_METHOD *meth; /* method for this test */
     46     const char *err, *aux_err; /* Error string for test */
     47     char *expected_err; /* Expected error value of test */
     48     char *reason; /* Expected error reason string */
     49     void *data; /* test specific data */
     50     int expect_unapproved;
     51 } EVP_TEST;
     52 
     53 /* Test method structure */
     54 struct evp_test_method_st {
     55     /* Name of test as it appears in file */
     56     const char *name;
     57     /* Initialise test for "alg" */
     58     int (*init)(EVP_TEST *t, const char *alg);
     59     /* Clean up method */
     60     void (*cleanup)(EVP_TEST *t);
     61     /* Test specific name value pair processing */
     62     int (*parse)(EVP_TEST *t, const char *name, const char *value);
     63     /* Run the test itself */
     64     int (*run_test)(EVP_TEST *t);
     65 };
     66 
     67 /* Linked list of named keys. */
     68 typedef struct key_list_st {
     69     char *name;
     70     EVP_PKEY *key;
     71     struct key_list_st *next;
     72 } KEY_LIST;
     73 
     74 typedef enum OPTION_choice {
     75     OPT_ERR = -1,
     76     OPT_EOF = 0,
     77     OPT_CONFIG_FILE,
     78     OPT_IN_PLACE,
     79     OPT_PROVIDER_NAME,
     80     OPT_PROV_PROPQUERY,
     81     OPT_DATA_CHUNK,
     82     OPT_TEST_ENUM
     83 } OPTION_CHOICE;
     84 
     85 static OSSL_PROVIDER *prov_null = NULL;
     86 static OSSL_PROVIDER *libprov = NULL;
     87 static OSSL_LIB_CTX *libctx = NULL;
     88 static int fips_indicator_callback_unapproved_count = 0;
     89 static int extended_tests = 0;
     90 
     91 /* List of public and private keys */
     92 static KEY_LIST *private_keys;
     93 static KEY_LIST *public_keys;
     94 
     95 static int find_key(EVP_PKEY **ppk, const char *name, KEY_LIST *lst);
     96 static int parse_bin(const char *value, unsigned char **buf, size_t *buflen);
     97 static int parse_bin_chunk(const char *value, size_t offset, size_t max,
     98     unsigned char **buf, size_t *buflen, size_t *out_offset);
     99 static int is_digest_disabled(const char *name);
    100 static int is_pkey_disabled(const char *name);
    101 static int is_mac_disabled(const char *name);
    102 static int is_cipher_disabled(const char *name);
    103 static int is_kdf_disabled(const char *name);
    104 
    105 /* A callback that is triggered if fips unapproved mode is detected */
    106 static int fips_indicator_cb(const char *type, const char *desc,
    107     const OSSL_PARAM params[])
    108 {
    109     fips_indicator_callback_unapproved_count++;
    110     TEST_info("(Indicator Callback received %s : %s is not approved)", type, desc);
    111     return 1;
    112 }
    113 
    114 static int check_fips_approved(EVP_TEST *t, int approved)
    115 {
    116     /*
    117      * If the expected result is approved
    118      * then it is expected that approved will be 1
    119      * and the fips indicator callback has not been triggered, otherwise
    120      * approved should be 0 and the fips indicator callback should be triggered.
    121      */
    122     if (t->expect_unapproved) {
    123         if (approved == 1 || fips_indicator_callback_unapproved_count == 0) {
    124             TEST_error("Test is not expected to be FIPS approved");
    125             return 0;
    126         }
    127     } else {
    128         if (approved == 0 || fips_indicator_callback_unapproved_count > 0) {
    129             TEST_error("Test is expected to be FIPS approved");
    130             return 0;
    131         }
    132     }
    133     return 1;
    134 }
    135 
    136 static int mac_check_fips_approved(EVP_MAC_CTX *ctx, EVP_TEST *t)
    137 {
    138     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
    139     /*
    140      * For any getters that do not handle the FIPS indicator assume a default
    141      * value of approved.
    142      */
    143     int approved = 1;
    144 
    145     if (EVP_MAC_CTX_gettable_params(ctx) == NULL)
    146         return 1;
    147 
    148     params[0] = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_FIPS_APPROVED_INDICATOR,
    149         &approved);
    150     if (!EVP_MAC_CTX_get_params(ctx, params))
    151         return 0;
    152     return check_fips_approved(t, approved);
    153 }
    154 
    155 static int pkey_check_fips_approved(EVP_PKEY_CTX *ctx, EVP_TEST *t)
    156 {
    157     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
    158     /*
    159      * For any getters that do not handle the FIPS indicator assume a default
    160      * value of approved.
    161      */
    162     int approved = 1;
    163     const OSSL_PARAM *gettables = EVP_PKEY_CTX_gettable_params(ctx);
    164 
    165     if (gettables == NULL
    166         || OSSL_PARAM_locate_const(gettables,
    167                OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR)
    168             == NULL)
    169         return 1;
    170 
    171     /* Older providers dont have a gettable */
    172     if (EVP_PKEY_CTX_gettable_params(ctx) == NULL)
    173         return 1;
    174 
    175     params[0] = OSSL_PARAM_construct_int(OSSL_ALG_PARAM_FIPS_APPROVED_INDICATOR,
    176         &approved);
    177     if (!EVP_PKEY_CTX_get_params(ctx, params))
    178         return 0;
    179     return check_fips_approved(t, approved);
    180 }
    181 
    182 static int rand_check_fips_approved(EVP_RAND_CTX *ctx, EVP_TEST *t)
    183 {
    184     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
    185     /*
    186      * For any getters that do not handle the FIPS indicator assume a default
    187      * value of approved.
    188      */
    189     int approved = 1;
    190 
    191     if (EVP_RAND_CTX_gettable_params(ctx) == NULL)
    192         return 1;
    193 
    194     params[0] = OSSL_PARAM_construct_int(OSSL_DRBG_PARAM_FIPS_APPROVED_INDICATOR,
    195         &approved);
    196     if (!EVP_RAND_CTX_get_params(ctx, params))
    197         return 0;
    198     return check_fips_approved(t, approved);
    199 }
    200 
    201 static int ctrladd(STACK_OF(OPENSSL_STRING) *controls, const char *value)
    202 {
    203     char *data = OPENSSL_strdup(value);
    204 
    205     if (data == NULL)
    206         return -1;
    207 
    208     if (sk_OPENSSL_STRING_push(controls, data) <= 0) {
    209         OPENSSL_free(data);
    210         return -1;
    211     }
    212 
    213     return 1;
    214 }
    215 
    216 /* Because OPENSSL_free is a macro, it can't be passed as a function pointer */
    217 static void openssl_free(char *m)
    218 {
    219     OPENSSL_free(m);
    220 }
    221 
    222 static void ctrlfree(STACK_OF(OPENSSL_STRING) *controls)
    223 {
    224     sk_OPENSSL_STRING_pop_free(controls, openssl_free);
    225 }
    226 
    227 /*
    228  * This is used if ctrl2params() passes settables as NULL.
    229  * A default list of settable OSSL_PARAM that may be set during an operations
    230  * init().
    231  * Using the algorithms settable list is problematic since it requires that the
    232  * init() has already run.
    233  */
    234 static const OSSL_PARAM settable_ctx_params[] = {
    235     OSSL_PARAM_int("key-check", NULL),
    236     OSSL_PARAM_int("digest-check", NULL),
    237     OSSL_PARAM_int("ems_check", NULL),
    238     OSSL_PARAM_int("sign-check", NULL),
    239     OSSL_PARAM_int("encrypt-check", NULL),
    240     OSSL_PARAM_int("rsa-pss-saltlen-check", NULL),
    241     OSSL_PARAM_int("sign-x931-pad-check", NULL),
    242     OSSL_PARAM_END
    243 };
    244 
    245 static int ctrl2params(EVP_TEST *t, STACK_OF(OPENSSL_STRING) *controls,
    246     const OSSL_PARAM *settables,
    247     OSSL_PARAM params[], size_t params_sz, size_t *params_n)
    248 {
    249     int i;
    250 
    251     if (settables == NULL)
    252         settables = settable_ctx_params;
    253     /* check bounds */
    254     if (*params_n + sk_OPENSSL_STRING_num(controls) >= params_sz) {
    255         t->err = "ERR_TOO_MANY_PARAMETERS";
    256         goto err;
    257     }
    258     for (i = 0; i < sk_OPENSSL_STRING_num(controls); i++) {
    259         char *tmpkey, *tmpval;
    260         char *value = sk_OPENSSL_STRING_value(controls, i);
    261 
    262         if (!TEST_ptr(tmpkey = OPENSSL_strdup(value))) {
    263             t->err = "ERR_PARAM_ERROR";
    264             goto err;
    265         }
    266         tmpval = strchr(tmpkey, ':');
    267         if (tmpval != NULL)
    268             *tmpval++ = '\0';
    269 
    270         if (tmpval == NULL
    271             || !OSSL_PARAM_allocate_from_text(&params[*params_n],
    272                 settables,
    273                 tmpkey, tmpval,
    274                 strlen(tmpval), NULL)) {
    275             OPENSSL_free(tmpkey);
    276             t->err = "ERR_PARAM_ERROR";
    277             goto err;
    278         }
    279         *params_n += 1;
    280         OPENSSL_free(tmpkey);
    281     }
    282     params[*params_n] = OSSL_PARAM_construct_end();
    283     return 1;
    284 err:
    285     return 0;
    286 }
    287 
    288 static void ctrl2params_free(OSSL_PARAM params[],
    289     size_t params_n, size_t params_n_allocstart)
    290 {
    291     while (params_n-- > params_n_allocstart) {
    292         OPENSSL_free(params[params_n].data);
    293     }
    294 }
    295 
    296 static int kdf_check_fips_approved(EVP_KDF_CTX *ctx, EVP_TEST *t)
    297 {
    298     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
    299     int approved = 1;
    300 
    301     params[0] = OSSL_PARAM_construct_int(OSSL_KDF_PARAM_FIPS_APPROVED_INDICATOR,
    302         &approved);
    303     if (!EVP_KDF_CTX_get_params(ctx, params))
    304         return 0;
    305     return check_fips_approved(t, approved);
    306 }
    307 
    308 static int cipher_check_fips_approved(EVP_CIPHER_CTX *ctx, EVP_TEST *t)
    309 {
    310     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
    311     int approved = 1;
    312 
    313     params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_FIPS_APPROVED_INDICATOR,
    314         &approved);
    315     if (!EVP_CIPHER_CTX_get_params(ctx, params))
    316         return 0;
    317     return check_fips_approved(t, approved);
    318 }
    319 
    320 /*
    321  * Compare two memory regions for equality, returning zero if they differ.
    322  * However, if there is expected to be an error and the actual error
    323  * matches then the memory is expected to be different so handle this
    324  * case without producing unnecessary test framework output.
    325  */
    326 static int memory_err_compare(EVP_TEST *t, const char *err,
    327     const void *expected, size_t expected_len,
    328     const void *got, size_t got_len)
    329 {
    330     int r;
    331 
    332     if (t->expected_err != NULL && strcmp(t->expected_err, err) == 0)
    333         r = !TEST_mem_ne(expected, expected_len, got, got_len);
    334     else
    335         r = TEST_mem_eq(expected, expected_len, got, got_len);
    336     if (!r)
    337         t->err = err;
    338     return r;
    339 }
    340 
    341 /* Option specific for evp test */
    342 static int process_mode_in_place;
    343 static const char *propquery = NULL;
    344 static int data_chunk_size;
    345 
    346 static int evp_test_process_mode(char *mode)
    347 {
    348     if (strcmp(mode, "in_place") == 0)
    349         return 1;
    350     else if (strcmp(mode, "both") == 0)
    351         return 0;
    352     return -1;
    353 }
    354 
    355 /*
    356  * Structure used to hold a list of blocks of memory to test
    357  * calls to "update" like functions.
    358  */
    359 struct evp_test_buffer_st {
    360     unsigned char *buf;
    361     size_t buflen;
    362     size_t count;
    363     int count_set;
    364 };
    365 
    366 static void evp_test_buffer_free(EVP_TEST_BUFFER *db)
    367 {
    368     if (db != NULL) {
    369         OPENSSL_free(db->buf);
    370         OPENSSL_free(db);
    371     }
    372 }
    373 
    374 /* append buffer to a list */
    375 static int evp_test_buffer_append(const char *value, size_t max_len,
    376     STACK_OF(EVP_TEST_BUFFER) **sk)
    377 {
    378     EVP_TEST_BUFFER *db = NULL;
    379     int rv = 0;
    380     size_t offset = 0;
    381 
    382     if (*sk == NULL && !TEST_ptr(*sk = sk_EVP_TEST_BUFFER_new_null()))
    383         goto err;
    384 
    385     do {
    386         if (!TEST_ptr(db = OPENSSL_zalloc(sizeof(*db))))
    387             goto err;
    388         if (max_len == 0) {
    389             /* parse all in one shot */
    390             if ((rv = parse_bin(value, &db->buf, &db->buflen)) != 1)
    391                 goto err;
    392         } else {
    393             /* parse in chunks */
    394             size_t new_offset = 0;
    395 
    396             if ((rv = parse_bin_chunk(value, offset, max_len, &db->buf,
    397                      &db->buflen, &new_offset))
    398                 == -1)
    399                 goto err;
    400             offset = new_offset;
    401         }
    402 
    403         db->count = 1;
    404         db->count_set = 0;
    405 
    406         if (db->buf == NULL)
    407             evp_test_buffer_free(db);
    408         else if (db->buf != NULL && !sk_EVP_TEST_BUFFER_push(*sk, db))
    409             goto err;
    410         /* if processing by chunks, continue until the whole value is parsed */
    411     } while (rv == 1 && max_len != 0);
    412 
    413     return 1;
    414 
    415 err:
    416     evp_test_buffer_free(db);
    417     return 0;
    418 }
    419 
    420 /* replace last buffer in list with copies of itself */
    421 static int evp_test_buffer_ncopy(const char *value,
    422     STACK_OF(EVP_TEST_BUFFER) *sk)
    423 {
    424     EVP_TEST_BUFFER *db;
    425     unsigned char *tbuf, *p;
    426     size_t tbuflen;
    427     int ncopy = atoi(value);
    428     int i;
    429 
    430     if (ncopy <= 0)
    431         return 0;
    432     if (sk == NULL || sk_EVP_TEST_BUFFER_num(sk) == 0)
    433         return 0;
    434     db = sk_EVP_TEST_BUFFER_value(sk, sk_EVP_TEST_BUFFER_num(sk) - 1);
    435 
    436     tbuflen = db->buflen * ncopy;
    437     if (!TEST_ptr(tbuf = OPENSSL_malloc(tbuflen)))
    438         return 0;
    439     for (i = 0, p = tbuf; i < ncopy; i++, p += db->buflen)
    440         memcpy(p, db->buf, db->buflen);
    441 
    442     OPENSSL_free(db->buf);
    443     db->buf = tbuf;
    444     db->buflen = tbuflen;
    445     return 1;
    446 }
    447 
    448 /* set repeat count for last buffer in list */
    449 static int evp_test_buffer_set_count(const char *value,
    450     STACK_OF(EVP_TEST_BUFFER) *sk)
    451 {
    452     EVP_TEST_BUFFER *db;
    453     int count = atoi(value);
    454 
    455     if (count <= 0)
    456         return 0;
    457 
    458     if (sk == NULL || sk_EVP_TEST_BUFFER_num(sk) == 0)
    459         return 0;
    460 
    461     db = sk_EVP_TEST_BUFFER_value(sk, sk_EVP_TEST_BUFFER_num(sk) - 1);
    462     if (db->count_set != 0)
    463         return 0;
    464 
    465     db->count = (size_t)count;
    466     db->count_set = 1;
    467     return 1;
    468 }
    469 
    470 /* call "fn" with each element of the list in turn */
    471 static int evp_test_buffer_do(STACK_OF(EVP_TEST_BUFFER) *sk,
    472     int (*fn)(void *ctx,
    473         const unsigned char *buf,
    474         size_t buflen),
    475     void *ctx)
    476 {
    477     int i;
    478 
    479     for (i = 0; i < sk_EVP_TEST_BUFFER_num(sk); i++) {
    480         EVP_TEST_BUFFER *tb = sk_EVP_TEST_BUFFER_value(sk, i);
    481         size_t j;
    482 
    483         for (j = 0; j < tb->count; j++) {
    484             if (fn(ctx, tb->buf, tb->buflen) <= 0)
    485                 return 0;
    486         }
    487     }
    488     return 1;
    489 }
    490 
    491 /*
    492  * Unescape some sequences in string literals (only \n for now).
    493  * Return an allocated buffer, set |out_len|.  If |input_len|
    494  * is zero, get an empty buffer but set length to zero.
    495  */
    496 static unsigned char *unescape(const char *input, size_t input_len,
    497     size_t *out_len)
    498 {
    499     unsigned char *ret, *p;
    500     size_t i;
    501 
    502     if (input_len == 0) {
    503         *out_len = 0;
    504         return OPENSSL_zalloc(1);
    505     }
    506 
    507     /* Escaping is non-expanding; over-allocate original size for simplicity. */
    508     if (!TEST_ptr(ret = p = OPENSSL_malloc(input_len)))
    509         return NULL;
    510 
    511     for (i = 0; i < input_len; i++) {
    512         if (*input == '\\') {
    513             if (i == input_len - 1 || *++input != 'n') {
    514                 TEST_error("Bad escape sequence in file");
    515                 goto err;
    516             }
    517             *p++ = '\n';
    518             i++;
    519             input++;
    520         } else {
    521             *p++ = *input++;
    522         }
    523     }
    524 
    525     *out_len = p - ret;
    526     return ret;
    527 
    528 err:
    529     OPENSSL_free(ret);
    530     return NULL;
    531 }
    532 
    533 /*
    534  * For a hex string "value" convert to a binary allocated buffer.
    535  * Return 1 on success or 0 on failure.
    536  */
    537 static int parse_bin(const char *value, unsigned char **buf, size_t *buflen)
    538 {
    539     long len;
    540 
    541     /* Check for NULL literal */
    542     if (strcmp(value, "NULL") == 0) {
    543         *buf = NULL;
    544         *buflen = 0;
    545         return 1;
    546     }
    547 
    548     /* Check for empty value */
    549     if (*value == '\0') {
    550         /*
    551          * Don't return NULL for zero length buffer. This is needed for
    552          * some tests with empty keys: HMAC_Init_ex() expects a non-NULL key
    553          * buffer even if the key length is 0, in order to detect key reset.
    554          */
    555         *buf = OPENSSL_malloc(1);
    556         if (*buf == NULL)
    557             return 0;
    558         **buf = 0;
    559         *buflen = 0;
    560         return 1;
    561     }
    562 
    563     /* Check for string literal */
    564     if (value[0] == '"') {
    565         size_t vlen = strlen(++value);
    566 
    567         if (vlen == 0 || value[vlen - 1] != '"')
    568             return 0;
    569         vlen--;
    570         *buf = unescape(value, vlen, buflen);
    571         return *buf == NULL ? 0 : 1;
    572     }
    573 
    574     /* Otherwise assume as hex literal and convert it to binary buffer */
    575     if (!TEST_ptr(*buf = OPENSSL_hexstr2buf(value, &len))) {
    576         TEST_info("Can't convert %s", value);
    577         TEST_openssl_errors();
    578         return -1;
    579     }
    580     /* Size of input buffer means we'll never overflow */
    581     *buflen = len;
    582     return 1;
    583 }
    584 
    585 /*
    586  * Convert at maximum "max" bytes to a binary allocated buffer.
    587  * Return 1 on success, -1 on failure or 0 for end of value string.
    588  */
    589 static int parse_bin_chunk(const char *value, size_t offset, size_t max,
    590     unsigned char **buf, size_t *buflen, size_t *out_offset)
    591 {
    592     size_t vlen;
    593     size_t chunk_len;
    594     const char *value_str = value[0] == '"' ? value + offset + 1 : value + offset;
    595 
    596     if (max < 1)
    597         return -1;
    598 
    599     if (*value == '\0' || strcmp(value, "\"\"") == 0) {
    600         *buf = OPENSSL_malloc(1);
    601         if (*buf == NULL)
    602             return 0;
    603         **buf = 0;
    604         *buflen = 0;
    605         return 0;
    606     }
    607 
    608     if (*value_str == '\0')
    609         return 0;
    610 
    611     vlen = strlen(value_str);
    612     if (value[0] == '"') {
    613         /* Parse string literal */
    614         if (vlen == 1 && value_str[0] != '"')
    615             /* Missing ending quotation mark */
    616             return -1;
    617         if (vlen == 1 && value_str[0] == '"')
    618             /* End of value */
    619             return 0;
    620         vlen--;
    621         chunk_len = max > vlen ? vlen : max;
    622         if ((*buf = unescape(value_str, chunk_len, buflen)) == NULL)
    623             return -1;
    624     } else {
    625         /* Parse hex string chunk */
    626         long len;
    627         char *chunk = NULL;
    628 
    629         chunk_len = 2 * max > vlen ? vlen : 2 * max;
    630         chunk = OPENSSL_strndup(value_str, chunk_len);
    631         if (chunk == NULL)
    632             return -1;
    633         if (!TEST_ptr(*buf = OPENSSL_hexstr2buf(chunk, &len))) {
    634             OPENSSL_free(chunk);
    635             TEST_openssl_errors();
    636             return -1;
    637         }
    638         OPENSSL_free(chunk);
    639         *buflen = len;
    640     }
    641     *out_offset = value[0] == '"' ? offset + (*buflen) : offset + 2 * (*buflen);
    642     return 1;
    643 }
    644 
    645 /**
    646  **  MESSAGE DIGEST TESTS
    647  **/
    648 
    649 typedef struct digest_data_st {
    650     /* Digest this test is for */
    651     const EVP_MD *digest;
    652     EVP_MD *fetched_digest;
    653     /* Input to digest */
    654     STACK_OF(EVP_TEST_BUFFER) *input;
    655     /* Expected output */
    656     unsigned char *output;
    657     size_t output_len;
    658     /* Padding type */
    659     int pad_type;
    660     /* XOF mode? */
    661     int xof;
    662     /* Size for variable output length but non-XOF */
    663     size_t digest_size;
    664 } DIGEST_DATA;
    665 
    666 static int digest_test_init(EVP_TEST *t, const char *alg)
    667 {
    668     DIGEST_DATA *mdat;
    669     const EVP_MD *digest;
    670     EVP_MD *fetched_digest;
    671 
    672     if (is_digest_disabled(alg)) {
    673         TEST_info("skipping, '%s' is disabled", alg);
    674         t->skip = 1;
    675         return 1;
    676     }
    677 
    678     if ((digest = fetched_digest = EVP_MD_fetch(libctx, alg, propquery)) == NULL
    679         && (digest = EVP_get_digestbyname(alg)) == NULL)
    680         return 0;
    681     if (!TEST_ptr(mdat = OPENSSL_zalloc(sizeof(*mdat)))) {
    682         EVP_MD_free(fetched_digest);
    683         return 0;
    684     }
    685     t->data = mdat;
    686     mdat->digest = digest;
    687     mdat->fetched_digest = fetched_digest;
    688     mdat->pad_type = 0;
    689     mdat->xof = 0;
    690     if (fetched_digest != NULL)
    691         TEST_info("%s is fetched", alg);
    692     return 1;
    693 }
    694 
    695 static void digest_test_cleanup(EVP_TEST *t)
    696 {
    697     DIGEST_DATA *mdat = t->data;
    698 
    699     sk_EVP_TEST_BUFFER_pop_free(mdat->input, evp_test_buffer_free);
    700     OPENSSL_free(mdat->output);
    701     EVP_MD_free(mdat->fetched_digest);
    702 }
    703 
    704 static int digest_test_parse(EVP_TEST *t,
    705     const char *keyword, const char *value)
    706 {
    707     DIGEST_DATA *mdata = t->data;
    708 
    709     if (strcmp(keyword, "Input") == 0)
    710         return evp_test_buffer_append(value, data_chunk_size, &mdata->input);
    711     if (strcmp(keyword, "Output") == 0)
    712         return parse_bin(value, &mdata->output, &mdata->output_len);
    713     if (strcmp(keyword, "Count") == 0)
    714         return evp_test_buffer_set_count(value, mdata->input);
    715     if (strcmp(keyword, "Ncopy") == 0)
    716         return evp_test_buffer_ncopy(value, mdata->input);
    717     if (strcmp(keyword, "Padding") == 0)
    718         return (mdata->pad_type = atoi(value)) > 0;
    719     if (strcmp(keyword, "XOF") == 0)
    720         return (mdata->xof = atoi(value)) > 0;
    721     if (strcmp(keyword, "OutputSize") == 0) {
    722         int sz;
    723 
    724         sz = atoi(value);
    725         if (sz < 0)
    726             return -1;
    727         mdata->digest_size = sz;
    728         return 1;
    729     }
    730     return 0;
    731 }
    732 
    733 static int digest_update_fn(void *ctx, const unsigned char *buf, size_t buflen)
    734 {
    735     return EVP_DigestUpdate(ctx, buf, buflen);
    736 }
    737 
    738 static int test_duplicate_md_ctx(EVP_TEST *t, EVP_MD_CTX *mctx)
    739 {
    740     char dont[] = "touch";
    741 
    742     if (!TEST_ptr(mctx))
    743         return 0;
    744     if (!EVP_DigestFinalXOF(mctx, (unsigned char *)dont, 0)) {
    745         EVP_MD_CTX_free(mctx);
    746         t->err = "DIGESTFINALXOF_ERROR";
    747         return 0;
    748     }
    749     if (!TEST_str_eq(dont, "touch")) {
    750         EVP_MD_CTX_free(mctx);
    751         t->err = "DIGESTFINALXOF_ERROR";
    752         return 0;
    753     }
    754     EVP_MD_CTX_free(mctx);
    755     return 1;
    756 }
    757 
    758 static int digest_test_run(EVP_TEST *t)
    759 {
    760     DIGEST_DATA *expected = t->data;
    761     EVP_TEST_BUFFER *inbuf;
    762     EVP_MD_CTX *mctx;
    763     unsigned char *got = NULL;
    764     unsigned int got_len;
    765     size_t size = 0;
    766     int xof = 0;
    767     OSSL_PARAM params[4], *p = &params[0];
    768 
    769     t->err = "TEST_FAILURE";
    770     if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
    771         goto err;
    772 
    773     got = OPENSSL_malloc(expected->output_len > EVP_MAX_MD_SIZE ? expected->output_len : EVP_MAX_MD_SIZE);
    774     if (!TEST_ptr(got))
    775         goto err;
    776 
    777     if (expected->xof > 0) {
    778         xof |= 1;
    779         *p++ = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_XOFLEN,
    780             &expected->output_len);
    781     }
    782     if (expected->digest_size > 0) {
    783         *p++ = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_SIZE,
    784             &expected->digest_size);
    785     }
    786     if (expected->pad_type > 0)
    787         *p++ = OSSL_PARAM_construct_int(OSSL_DIGEST_PARAM_PAD_TYPE,
    788             &expected->pad_type);
    789     *p++ = OSSL_PARAM_construct_end();
    790 
    791     if (!EVP_DigestInit_ex2(mctx, expected->digest, params)) {
    792         t->err = "DIGESTINIT_ERROR";
    793         goto err;
    794     }
    795 
    796     if (!evp_test_buffer_do(expected->input, digest_update_fn, mctx)) {
    797         t->err = "DIGESTUPDATE_ERROR";
    798         goto err;
    799     }
    800 
    801     xof |= EVP_MD_xof(expected->digest);
    802     if (xof) {
    803         EVP_MD_CTX *mctx_cpy;
    804 
    805         if (!TEST_ptr(mctx_cpy = EVP_MD_CTX_new())) {
    806             goto err;
    807         }
    808         if (!TEST_true(EVP_MD_CTX_copy(mctx_cpy, mctx))) {
    809             EVP_MD_CTX_free(mctx_cpy);
    810             goto err;
    811         } else if (!test_duplicate_md_ctx(t, mctx_cpy)) {
    812             goto err;
    813         }
    814 
    815         if (!test_duplicate_md_ctx(t, EVP_MD_CTX_dup(mctx)))
    816             goto err;
    817 
    818         got_len = expected->output_len;
    819         if (!EVP_DigestFinalXOF(mctx, got, got_len)) {
    820             t->err = "DIGESTFINALXOF_ERROR";
    821             goto err;
    822         }
    823     } else {
    824         if (!EVP_DigestFinal(mctx, got, &got_len)) {
    825             t->err = "DIGESTFINAL_ERROR";
    826             goto err;
    827         }
    828     }
    829     if (!TEST_int_eq(expected->output_len, got_len)) {
    830         t->err = "DIGEST_LENGTH_MISMATCH";
    831         goto err;
    832     }
    833     if (!memory_err_compare(t, "DIGEST_MISMATCH",
    834             expected->output, expected->output_len,
    835             got, got_len))
    836         goto err;
    837 
    838     t->err = NULL;
    839 
    840     /* Test the EVP_Q_digest interface as well */
    841     if (sk_EVP_TEST_BUFFER_num(expected->input) == 1
    842         && !xof
    843         /* This should never fail but we need the returned pointer now */
    844         && !TEST_ptr(inbuf = sk_EVP_TEST_BUFFER_value(expected->input, 0))
    845         && !inbuf->count_set) {
    846         OPENSSL_cleanse(got, got_len);
    847         if (!TEST_true(EVP_Q_digest(libctx,
    848                 EVP_MD_get0_name(expected->fetched_digest),
    849                 NULL, inbuf->buf, inbuf->buflen,
    850                 got, &size))
    851             || !TEST_mem_eq(got, size,
    852                 expected->output, expected->output_len)) {
    853             t->err = "EVP_Q_digest failed";
    854             goto err;
    855         }
    856     }
    857 
    858 err:
    859     OPENSSL_free(got);
    860     EVP_MD_CTX_free(mctx);
    861     return 1;
    862 }
    863 
    864 static const EVP_TEST_METHOD digest_test_method = {
    865     "Digest",
    866     digest_test_init,
    867     digest_test_cleanup,
    868     digest_test_parse,
    869     digest_test_run
    870 };
    871 
    872 /**
    873 ***  CIPHER TESTS
    874 **/
    875 
    876 typedef struct cipher_data_st {
    877     const EVP_CIPHER *cipher;
    878     EVP_CIPHER *fetched_cipher;
    879     int enc;
    880     /* EVP_CIPH_GCM_MODE, EVP_CIPH_CCM_MODE or EVP_CIPH_OCB_MODE if AEAD */
    881     int aead;
    882     unsigned char *key;
    883     size_t key_len;
    884     size_t key_bits; /* Used by RC2 */
    885     unsigned char *iv;
    886     unsigned char *next_iv; /* Expected IV state after operation */
    887     unsigned int rounds;
    888     size_t iv_len;
    889     unsigned char *plaintext;
    890     size_t plaintext_len;
    891     unsigned char *ciphertext;
    892     size_t ciphertext_len;
    893     /* AEAD ciphers only */
    894     unsigned char *aad[AAD_NUM];
    895     size_t aad_len[AAD_NUM];
    896     int tls_aad;
    897     int tls_version;
    898     unsigned char *tag;
    899     const char *cts_mode;
    900     size_t tag_len;
    901     int tag_late;
    902     unsigned char *mac_key;
    903     size_t mac_key_len;
    904     const char *xts_standard;
    905     STACK_OF(OPENSSL_STRING) *init_controls; /* collection of controls */
    906 } CIPHER_DATA;
    907 
    908 /*
    909  * XTS, SIV, CCM, stitched ciphers and Wrap modes have special
    910  * requirements about input lengths so we don't fragment for those
    911  */
    912 static int cipher_test_valid_fragmentation(CIPHER_DATA *cdat)
    913 {
    914     return (cdat->aead == EVP_CIPH_CCM_MODE
    915                || cdat->aead == EVP_CIPH_CBC_MODE
    916                || (cdat->aead == -1
    917                    && EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_STREAM_CIPHER)
    918                || ((EVP_CIPHER_get_flags(cdat->cipher) & EVP_CIPH_FLAG_CTS) != 0)
    919                || EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_SIV_MODE
    920                || EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_GCM_SIV_MODE
    921                || EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_XTS_MODE
    922                || EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_WRAP_MODE)
    923         ? 0
    924         : 1;
    925 }
    926 
    927 static int cipher_test_init(EVP_TEST *t, const char *alg)
    928 {
    929     const EVP_CIPHER *cipher;
    930     EVP_CIPHER *fetched_cipher;
    931     CIPHER_DATA *cdat;
    932     int m;
    933 
    934     if (is_cipher_disabled(alg)) {
    935         t->skip = 1;
    936         TEST_info("skipping, '%s' is disabled", alg);
    937         return 1;
    938     }
    939 
    940     ERR_set_mark();
    941     if ((cipher = fetched_cipher = EVP_CIPHER_fetch(libctx, alg, propquery)) == NULL
    942         && (cipher = EVP_get_cipherbyname(alg)) == NULL) {
    943         /* a stitched cipher might not be available */
    944         if (strstr(alg, "HMAC") != NULL) {
    945             ERR_pop_to_mark();
    946             t->skip = 1;
    947             TEST_info("skipping, '%s' is not available", alg);
    948             return 1;
    949         }
    950         ERR_clear_last_mark();
    951         return 0;
    952     }
    953     ERR_clear_last_mark();
    954 
    955     if (!TEST_ptr(cdat = OPENSSL_zalloc(sizeof(*cdat))))
    956         return 0;
    957 
    958     cdat->init_controls = sk_OPENSSL_STRING_new_null();
    959     cdat->cipher = cipher;
    960     cdat->fetched_cipher = fetched_cipher;
    961     cdat->enc = -1;
    962     m = EVP_CIPHER_get_mode(cipher);
    963     if (EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER)
    964         cdat->aead = m != 0 ? m : -1;
    965     else
    966         cdat->aead = 0;
    967 
    968     if (data_chunk_size != 0 && !cipher_test_valid_fragmentation(cdat)) {
    969         ERR_pop_to_mark();
    970         EVP_CIPHER_free(fetched_cipher);
    971         OPENSSL_free(cdat);
    972         t->skip = 1;
    973         TEST_info("skipping, '%s' does not support fragmentation", alg);
    974         return 1;
    975     }
    976 
    977     t->data = cdat;
    978     if (fetched_cipher != NULL)
    979         TEST_info("%s is fetched", alg);
    980     return 1;
    981 }
    982 
    983 static void cipher_test_cleanup(EVP_TEST *t)
    984 {
    985     int i;
    986     CIPHER_DATA *cdat = t->data;
    987 
    988     OPENSSL_free(cdat->key);
    989     OPENSSL_free(cdat->iv);
    990     OPENSSL_free(cdat->next_iv);
    991     OPENSSL_free(cdat->ciphertext);
    992     OPENSSL_free(cdat->plaintext);
    993     for (i = 0; i < AAD_NUM; i++)
    994         OPENSSL_free(cdat->aad[i]);
    995     OPENSSL_free(cdat->tag);
    996     OPENSSL_free(cdat->mac_key);
    997     EVP_CIPHER_free(cdat->fetched_cipher);
    998     ctrlfree(cdat->init_controls);
    999 }
   1000 
   1001 static int cipher_test_parse(EVP_TEST *t, const char *keyword,
   1002     const char *value)
   1003 {
   1004     CIPHER_DATA *cdat = t->data;
   1005     int i;
   1006 
   1007     if (strcmp(keyword, "Key") == 0)
   1008         return parse_bin(value, &cdat->key, &cdat->key_len);
   1009     if (strcmp(keyword, "Rounds") == 0) {
   1010         i = atoi(value);
   1011         if (i < 0)
   1012             return -1;
   1013         cdat->rounds = (unsigned int)i;
   1014         return 1;
   1015     }
   1016     if (strcmp(keyword, "IV") == 0)
   1017         return parse_bin(value, &cdat->iv, &cdat->iv_len);
   1018     if (strcmp(keyword, "NextIV") == 0)
   1019         return parse_bin(value, &cdat->next_iv, &cdat->iv_len);
   1020     if (strcmp(keyword, "Plaintext") == 0)
   1021         return parse_bin(value, &cdat->plaintext, &cdat->plaintext_len);
   1022     if (strcmp(keyword, "Ciphertext") == 0)
   1023         return parse_bin(value, &cdat->ciphertext, &cdat->ciphertext_len);
   1024     if (strcmp(keyword, "KeyBits") == 0) {
   1025         i = atoi(value);
   1026         if (i < 0)
   1027             return -1;
   1028         cdat->key_bits = (size_t)i;
   1029         return 1;
   1030     }
   1031     if (cdat->aead) {
   1032         int tls_aad = 0;
   1033 
   1034         if (strcmp(keyword, "TLSAAD") == 0)
   1035             cdat->tls_aad = tls_aad = 1;
   1036         if (strcmp(keyword, "AAD") == 0 || tls_aad) {
   1037             for (i = 0; i < AAD_NUM; i++) {
   1038                 if (cdat->aad[i] == NULL)
   1039                     return parse_bin(value, &cdat->aad[i], &cdat->aad_len[i]);
   1040             }
   1041             return -1;
   1042         }
   1043         if (strcmp(keyword, "Tag") == 0)
   1044             return parse_bin(value, &cdat->tag, &cdat->tag_len);
   1045         if (strcmp(keyword, "SetTagLate") == 0) {
   1046             if (strcmp(value, "TRUE") == 0)
   1047                 cdat->tag_late = 1;
   1048             else if (strcmp(value, "FALSE") == 0)
   1049                 cdat->tag_late = 0;
   1050             else
   1051                 return -1;
   1052             return 1;
   1053         }
   1054         if (strcmp(keyword, "MACKey") == 0)
   1055             return parse_bin(value, &cdat->mac_key, &cdat->mac_key_len);
   1056         if (strcmp(keyword, "TLSVersion") == 0) {
   1057             char *endptr;
   1058 
   1059             cdat->tls_version = (int)strtol(value, &endptr, 0);
   1060             return value[0] != '\0' && endptr[0] == '\0';
   1061         }
   1062     }
   1063 
   1064     if (strcmp(keyword, "Operation") == 0) {
   1065         if (strcmp(value, "ENCRYPT") == 0)
   1066             cdat->enc = 1;
   1067         else if (strcmp(value, "DECRYPT") == 0)
   1068             cdat->enc = 0;
   1069         else
   1070             return -1;
   1071         return 1;
   1072     }
   1073     if (strcmp(keyword, "CTSMode") == 0) {
   1074         cdat->cts_mode = value;
   1075         return 1;
   1076     }
   1077     if (strcmp(keyword, "XTSStandard") == 0) {
   1078         cdat->xts_standard = value;
   1079         return 1;
   1080     }
   1081     if (strcmp(keyword, "CtrlInit") == 0)
   1082         return ctrladd(cdat->init_controls, value);
   1083     return 0;
   1084 }
   1085 
   1086 static int cipher_test_enc(EVP_TEST *t, int enc, size_t out_misalign,
   1087     size_t inp_misalign, int frag, int in_place,
   1088     const OSSL_PARAM initparams[])
   1089 {
   1090     CIPHER_DATA *expected = t->data;
   1091     unsigned char *in, *expected_out, *tmp = NULL;
   1092     size_t in_len, out_len, donelen = 0;
   1093     int ok = 0, tmplen, chunklen, tmpflen, i;
   1094     EVP_CIPHER_CTX *ctx_base = NULL;
   1095     EVP_CIPHER_CTX *ctx = NULL, *duped;
   1096     int fips_dupctx_supported = fips_provider_version_ge(libctx, 3, 2, 0);
   1097 
   1098     t->err = "TEST_FAILURE";
   1099     if (!TEST_ptr(ctx_base = EVP_CIPHER_CTX_new()))
   1100         goto err;
   1101     if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new()))
   1102         goto err;
   1103     EVP_CIPHER_CTX_set_flags(ctx_base, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
   1104     if (enc) {
   1105         in = expected->plaintext;
   1106         in_len = expected->plaintext_len;
   1107         expected_out = expected->ciphertext;
   1108         out_len = expected->ciphertext_len;
   1109     } else {
   1110         in = expected->ciphertext;
   1111         in_len = expected->ciphertext_len;
   1112         expected_out = expected->plaintext;
   1113         out_len = expected->plaintext_len;
   1114     }
   1115     if (in_place == 1) {
   1116         /* Exercise in-place encryption */
   1117         tmp = OPENSSL_malloc(out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH);
   1118         if (!tmp)
   1119             goto err;
   1120         in = memcpy(tmp + out_misalign, in, in_len);
   1121     } else {
   1122         inp_misalign += 16 - ((out_misalign + in_len) & 15);
   1123         /*
   1124          * 'tmp' will store both output and copy of input. We make the copy
   1125          * of input to specifically aligned part of 'tmp'. So we just
   1126          * figured out how much padding would ensure the required alignment,
   1127          * now we allocate extended buffer and finally copy the input just
   1128          * past inp_misalign in expression below. Output will be written
   1129          * past out_misalign...
   1130          */
   1131         tmp = OPENSSL_malloc(out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH + inp_misalign + in_len);
   1132         if (!tmp)
   1133             goto err;
   1134         in = memcpy(tmp + out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH + inp_misalign, in, in_len);
   1135     }
   1136     if (!EVP_CipherInit_ex2(ctx_base, expected->cipher, NULL, NULL, enc,
   1137             initparams)) {
   1138         t->err = "CIPHERINIT_ERROR";
   1139         goto err;
   1140     }
   1141     if (expected->cts_mode != NULL) {
   1142         OSSL_PARAM params[2];
   1143 
   1144         params[0] = OSSL_PARAM_construct_utf8_string(OSSL_CIPHER_PARAM_CTS_MODE,
   1145             (char *)(intptr_t)expected->cts_mode,
   1146             0);
   1147         params[1] = OSSL_PARAM_construct_end();
   1148         if (!EVP_CIPHER_CTX_set_params(ctx_base, params)) {
   1149             t->err = "INVALID_CTS_MODE";
   1150             goto err;
   1151         }
   1152     }
   1153     if (expected->iv) {
   1154         if (expected->aead) {
   1155             if (EVP_CIPHER_CTX_ctrl(ctx_base, EVP_CTRL_AEAD_SET_IVLEN,
   1156                     expected->iv_len, 0)
   1157                 <= 0) {
   1158                 t->err = "INVALID_IV_LENGTH";
   1159                 goto err;
   1160             }
   1161         } else if (expected->iv_len != (size_t)EVP_CIPHER_CTX_get_iv_length(ctx_base)) {
   1162             t->err = "INVALID_IV_LENGTH";
   1163             goto err;
   1164         }
   1165     }
   1166     if (expected->aead && !expected->tls_aad) {
   1167         unsigned char *tag;
   1168         /*
   1169          * If encrypting or OCB just set tag length initially, otherwise
   1170          * set tag length and value.
   1171          */
   1172         if (enc || expected->aead == EVP_CIPH_OCB_MODE || expected->tag_late) {
   1173             t->err = "TAG_LENGTH_SET_ERROR";
   1174             tag = NULL;
   1175         } else {
   1176             t->err = "TAG_SET_ERROR";
   1177             tag = expected->tag;
   1178         }
   1179         if (tag || expected->aead != EVP_CIPH_GCM_MODE) {
   1180             if (EVP_CIPHER_CTX_ctrl(ctx_base, EVP_CTRL_AEAD_SET_TAG,
   1181                     expected->tag_len, tag)
   1182                 <= 0)
   1183                 goto err;
   1184         }
   1185     }
   1186 
   1187     if (expected->rounds > 0) {
   1188         int rounds = (int)expected->rounds;
   1189 
   1190         if (EVP_CIPHER_CTX_ctrl(ctx_base, EVP_CTRL_SET_RC5_ROUNDS, rounds, NULL) <= 0) {
   1191             t->err = "INVALID_ROUNDS";
   1192             goto err;
   1193         }
   1194     }
   1195 
   1196     if (!EVP_CIPHER_CTX_set_key_length(ctx_base, expected->key_len)) {
   1197         t->err = "INVALID_KEY_LENGTH";
   1198         goto err;
   1199     }
   1200     if (expected->key_bits > 0) {
   1201         int bits = (int)expected->key_bits;
   1202 
   1203         if (EVP_CIPHER_CTX_ctrl(ctx_base, EVP_CTRL_SET_RC2_KEY_BITS, bits, NULL) <= 0) {
   1204             t->err = "INVALID KEY BITS";
   1205             goto err;
   1206         }
   1207     }
   1208     if (!EVP_CipherInit_ex(ctx_base, NULL, NULL, expected->key, expected->iv, -1)) {
   1209         t->err = "KEY_SET_ERROR";
   1210         goto err;
   1211     }
   1212 
   1213     /* Check that we get the same IV back */
   1214     if (expected->iv != NULL) {
   1215         /* Some (e.g., GCM) tests use IVs longer than EVP_MAX_IV_LENGTH. */
   1216         unsigned char iv[128];
   1217         if (!TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx_base, iv, sizeof(iv)))
   1218             || ((EVP_CIPHER_get_flags(expected->cipher) & EVP_CIPH_CUSTOM_IV) == 0
   1219                 && !TEST_mem_eq(expected->iv, expected->iv_len, iv,
   1220                     expected->iv_len))) {
   1221             t->err = "INVALID_IV";
   1222             goto err;
   1223         }
   1224     }
   1225 
   1226     /* Test that the cipher dup functions correctly if it is supported */
   1227     ERR_set_mark();
   1228     if (!EVP_CIPHER_CTX_copy(ctx, ctx_base)) {
   1229         if (fips_dupctx_supported) {
   1230             TEST_info("Doing a copy of Cipher %s Fails!\n",
   1231                 EVP_CIPHER_get0_name(expected->cipher));
   1232             ERR_print_errors_fp(stderr);
   1233             goto err;
   1234         } else {
   1235             TEST_info("Allowing copy fail as an old fips provider is in use.");
   1236         }
   1237         EVP_CIPHER_CTX_free(ctx);
   1238         ctx = ctx_base;
   1239     } else {
   1240         EVP_CIPHER_CTX_free(ctx_base);
   1241         ctx_base = NULL;
   1242     }
   1243     /* Likewise for dup */
   1244     duped = EVP_CIPHER_CTX_dup(ctx);
   1245     if (duped != NULL) {
   1246         EVP_CIPHER_CTX_free(ctx);
   1247         ctx = duped;
   1248     } else {
   1249         if (fips_dupctx_supported) {
   1250             TEST_info("Doing a dup of Cipher %s Fails!\n",
   1251                 EVP_CIPHER_get0_name(expected->cipher));
   1252             ERR_print_errors_fp(stderr);
   1253             goto err;
   1254         } else {
   1255             TEST_info("Allowing dup fail as an old fips provider is in use.");
   1256         }
   1257     }
   1258     ERR_pop_to_mark();
   1259 
   1260     if (expected->mac_key != NULL
   1261         && EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY,
   1262                (int)expected->mac_key_len,
   1263                (void *)expected->mac_key)
   1264             <= 0) {
   1265         t->err = "SET_MAC_KEY_ERROR";
   1266         goto err;
   1267     }
   1268 
   1269     if (expected->tls_version) {
   1270         OSSL_PARAM params[2];
   1271 
   1272         params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_TLS_VERSION,
   1273             &expected->tls_version);
   1274         params[1] = OSSL_PARAM_construct_end();
   1275         if (!EVP_CIPHER_CTX_set_params(ctx, params)) {
   1276             t->err = "SET_TLS_VERSION_ERROR";
   1277             goto err;
   1278         }
   1279     }
   1280 
   1281     if (expected->aead == EVP_CIPH_CCM_MODE) {
   1282         if (!EVP_CipherUpdate(ctx, NULL, &tmplen, NULL, out_len)) {
   1283             t->err = "CCM_PLAINTEXT_LENGTH_SET_ERROR";
   1284             goto err;
   1285         }
   1286     }
   1287     if (expected->aad[0] != NULL && !expected->tls_aad) {
   1288         t->err = "AAD_SET_ERROR";
   1289         if (!frag) {
   1290             /* Supply the data all in one go or according to data_chunk_size */
   1291             for (i = 0; expected->aad[i] != NULL; i++) {
   1292                 size_t aad_len = expected->aad_len[i];
   1293                 donelen = 0;
   1294 
   1295                 do {
   1296                     size_t current_aad_len = (size_t)data_chunk_size;
   1297 
   1298                     if (data_chunk_size == 0 || (size_t)data_chunk_size > aad_len)
   1299                         current_aad_len = aad_len;
   1300                     if (!EVP_CipherUpdate(ctx, NULL, &chunklen,
   1301                             expected->aad[i] + donelen,
   1302                             current_aad_len))
   1303                         goto err;
   1304                     donelen += current_aad_len;
   1305                     aad_len -= current_aad_len;
   1306                 } while (aad_len > 0);
   1307             }
   1308         } else {
   1309             /* Supply the AAD in chunks less than the block size where possible */
   1310             for (i = 0; expected->aad[i] != NULL; i++) {
   1311                 if (expected->aad_len[i] > 0) {
   1312                     if (!EVP_CipherUpdate(ctx, NULL, &chunklen, expected->aad[i], 1))
   1313                         goto err;
   1314                     donelen++;
   1315                 }
   1316                 if (expected->aad_len[i] > 2) {
   1317                     if (!EVP_CipherUpdate(ctx, NULL, &chunklen,
   1318                             expected->aad[i] + donelen,
   1319                             expected->aad_len[i] - 2))
   1320                         goto err;
   1321                     donelen += expected->aad_len[i] - 2;
   1322                 }
   1323                 if (expected->aad_len[i] > 1
   1324                     && !EVP_CipherUpdate(ctx, NULL, &chunklen,
   1325                         expected->aad[i] + donelen, 1))
   1326                     goto err;
   1327             }
   1328         }
   1329     }
   1330 
   1331     if (expected->tls_aad) {
   1332         OSSL_PARAM params[2];
   1333         char *tls_aad;
   1334 
   1335         /* duplicate the aad as the implementation might modify it */
   1336         if ((tls_aad = OPENSSL_memdup(expected->aad[0],
   1337                  expected->aad_len[0]))
   1338             == NULL)
   1339             goto err;
   1340         params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD,
   1341             tls_aad,
   1342             expected->aad_len[0]);
   1343         params[1] = OSSL_PARAM_construct_end();
   1344         if (!EVP_CIPHER_CTX_set_params(ctx, params)) {
   1345             OPENSSL_free(tls_aad);
   1346             t->err = "TLS1_AAD_ERROR";
   1347             goto err;
   1348         }
   1349         OPENSSL_free(tls_aad);
   1350     } else if (!enc && (expected->aead == EVP_CIPH_OCB_MODE || expected->tag_late)) {
   1351         if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
   1352                 expected->tag_len, expected->tag)
   1353             <= 0) {
   1354             t->err = "TAG_SET_ERROR";
   1355             goto err;
   1356         }
   1357     }
   1358     if (expected->xts_standard != NULL) {
   1359         OSSL_PARAM params[2];
   1360 
   1361         params[0] = OSSL_PARAM_construct_utf8_string(OSSL_CIPHER_PARAM_XTS_STANDARD,
   1362             (char *)expected->xts_standard, 0);
   1363         params[1] = OSSL_PARAM_construct_end();
   1364         if (!EVP_CIPHER_CTX_set_params(ctx, params)) {
   1365             t->err = "SET_XTS_STANDARD_ERROR";
   1366             goto err;
   1367         }
   1368     }
   1369     EVP_CIPHER_CTX_set_padding(ctx, 0);
   1370     t->err = "CIPHERUPDATE_ERROR";
   1371     tmplen = 0;
   1372     if (!frag) {
   1373         do {
   1374             /* Supply the data all in one go or according to data_chunk_size */
   1375             size_t current_in_len = (size_t)data_chunk_size;
   1376 
   1377             if (data_chunk_size == 0 || (size_t)data_chunk_size > in_len)
   1378                 current_in_len = in_len;
   1379             if (!EVP_CipherUpdate(ctx, tmp + out_misalign + tmplen, &chunklen,
   1380                     in, current_in_len))
   1381                 goto err;
   1382             tmplen += chunklen;
   1383             in += current_in_len;
   1384             in_len -= current_in_len;
   1385         } while (in_len > 0);
   1386     } else {
   1387         /* Supply the data in chunks less than the block size where possible */
   1388         if (in_len > 0) {
   1389             if (!EVP_CipherUpdate(ctx, tmp + out_misalign, &chunklen, in, 1))
   1390                 goto err;
   1391             tmplen += chunklen;
   1392             in++;
   1393             in_len--;
   1394         }
   1395         if (in_len > 1) {
   1396             if (!EVP_CipherUpdate(ctx, tmp + out_misalign + tmplen, &chunklen,
   1397                     in, in_len - 1))
   1398                 goto err;
   1399             tmplen += chunklen;
   1400             in += in_len - 1;
   1401             in_len = 1;
   1402         }
   1403         if (in_len > 0) {
   1404             if (!EVP_CipherUpdate(ctx, tmp + out_misalign + tmplen, &chunklen,
   1405                     in, 1))
   1406                 goto err;
   1407             tmplen += chunklen;
   1408         }
   1409     }
   1410     if (!EVP_CipherFinal_ex(ctx, tmp + out_misalign + tmplen, &tmpflen)) {
   1411         t->err = "CIPHERFINAL_ERROR";
   1412         goto err;
   1413     }
   1414     if (!cipher_check_fips_approved(ctx, t)) {
   1415         t->err = "FIPSAPPROVED_ERROR";
   1416         goto err;
   1417     }
   1418 
   1419     if (!enc && expected->tls_aad) {
   1420         if (expected->tls_version >= TLS1_1_VERSION
   1421             && (EVP_CIPHER_is_a(expected->cipher, "AES-128-CBC-HMAC-SHA1")
   1422                 || EVP_CIPHER_is_a(expected->cipher, "AES-256-CBC-HMAC-SHA1"))) {
   1423             tmplen -= expected->iv_len;
   1424             expected_out += expected->iv_len;
   1425             out_misalign += expected->iv_len;
   1426         }
   1427         if ((int)out_len > tmplen + tmpflen)
   1428             out_len = tmplen + tmpflen;
   1429     }
   1430     if (!memory_err_compare(t, "VALUE_MISMATCH", expected_out, out_len,
   1431             tmp + out_misalign, tmplen + tmpflen))
   1432         goto err;
   1433     if (enc && expected->aead && !expected->tls_aad) {
   1434         unsigned char rtag[48]; /* longest known for TLS_SHA384_SHA384 */
   1435 
   1436         if (!TEST_size_t_le(expected->tag_len, sizeof(rtag))) {
   1437             t->err = "TAG_LENGTH_INTERNAL_ERROR";
   1438             goto err;
   1439         }
   1440         if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG,
   1441                 expected->tag_len, rtag)
   1442             <= 0) {
   1443             t->err = "TAG_RETRIEVE_ERROR";
   1444             goto err;
   1445         }
   1446         if (!memory_err_compare(t, "TAG_VALUE_MISMATCH",
   1447                 expected->tag, expected->tag_len,
   1448                 rtag, expected->tag_len))
   1449             goto err;
   1450     }
   1451     /* Check the updated IV */
   1452     if (expected->next_iv != NULL) {
   1453         /* Some (e.g., GCM) tests use IVs longer than EVP_MAX_IV_LENGTH. */
   1454         unsigned char iv[128];
   1455         if (!TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
   1456             || ((EVP_CIPHER_get_flags(expected->cipher) & EVP_CIPH_CUSTOM_IV) == 0
   1457                 && !TEST_mem_eq(expected->next_iv, expected->iv_len, iv,
   1458                     expected->iv_len))) {
   1459             t->err = "INVALID_NEXT_IV";
   1460             goto err;
   1461         }
   1462     }
   1463 
   1464     t->err = NULL;
   1465     ok = 1;
   1466 err:
   1467     OPENSSL_free(tmp);
   1468     if (ctx != ctx_base)
   1469         EVP_CIPHER_CTX_free(ctx_base);
   1470     EVP_CIPHER_CTX_free(ctx);
   1471     return ok;
   1472 }
   1473 
   1474 static int cipher_test_run(EVP_TEST *t)
   1475 {
   1476     CIPHER_DATA *cdat = t->data;
   1477     int rv, frag, fragmax, in_place;
   1478     size_t out_misalign, inp_misalign;
   1479     OSSL_PARAM initparams[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
   1480     size_t params_n = 0;
   1481 
   1482     TEST_info("RUNNING TEST FOR CIPHER %s\n", EVP_CIPHER_get0_name(cdat->cipher));
   1483     if (!cdat->key) {
   1484         t->err = "NO_KEY";
   1485         return 0;
   1486     }
   1487     if (!cdat->iv && EVP_CIPHER_get_iv_length(cdat->cipher) > 0) {
   1488         /* IV is optional and usually omitted in wrap mode */
   1489         if (EVP_CIPHER_get_mode(cdat->cipher) != EVP_CIPH_WRAP_MODE) {
   1490             t->err = "NO_IV";
   1491             return 0;
   1492         }
   1493     }
   1494     if (cdat->aead && cdat->tag == NULL && !cdat->tls_aad) {
   1495         t->err = "NO_TAG";
   1496         return 0;
   1497     }
   1498 
   1499     if (sk_OPENSSL_STRING_num(cdat->init_controls) > 0) {
   1500         if (!ctrl2params(t, cdat->init_controls, NULL,
   1501                 initparams, OSSL_NELEM(initparams), &params_n))
   1502             return 0;
   1503     }
   1504 
   1505     fragmax = (cipher_test_valid_fragmentation(cdat) == 0) ? 0 : 1;
   1506     for (in_place = 1; in_place >= 0; in_place--) {
   1507         static char aux_err[64];
   1508 
   1509         t->aux_err = aux_err;
   1510         /* Test only in-place data processing */
   1511         if (process_mode_in_place == 1 && in_place == 0)
   1512             break;
   1513 
   1514         for (frag = 0; frag <= fragmax; frag++) {
   1515             if (frag == 1 && data_chunk_size != 0)
   1516                 break;
   1517             for (out_misalign = 0; out_misalign <= 1; out_misalign++) {
   1518                 for (inp_misalign = 0; inp_misalign <= 1; inp_misalign++) {
   1519                     /* Skip input misalign tests for in-place processing */
   1520                     if (inp_misalign == 1 && in_place == 1)
   1521                         break;
   1522                     if (in_place == 1) {
   1523                         BIO_snprintf(aux_err, sizeof(aux_err),
   1524                             "%s in-place, %sfragmented",
   1525                             out_misalign ? "misaligned" : "aligned",
   1526                             frag ? "" : "not ");
   1527                     } else {
   1528                         BIO_snprintf(aux_err, sizeof(aux_err),
   1529                             "%s output and %s input, %sfragmented",
   1530                             out_misalign ? "misaligned" : "aligned",
   1531                             inp_misalign ? "misaligned" : "aligned",
   1532                             frag ? "" : "not ");
   1533                     }
   1534                     if (cdat->enc) {
   1535                         rv = cipher_test_enc(t, 1, out_misalign, inp_misalign,
   1536                             frag, in_place, initparams);
   1537                         if (rv != 1)
   1538                             goto end;
   1539                     }
   1540                     if (cdat->enc != 1) {
   1541                         rv = cipher_test_enc(t, 0, out_misalign, inp_misalign,
   1542                             frag, in_place, initparams);
   1543                         if (rv != 1)
   1544                             goto end;
   1545                     }
   1546                 }
   1547             }
   1548         }
   1549     }
   1550     ctrl2params_free(initparams, params_n, 0);
   1551     t->aux_err = NULL;
   1552     return 1;
   1553 end:
   1554     ctrl2params_free(initparams, params_n, 0);
   1555     return (rv < 0 ? 0 : 1);
   1556 }
   1557 
   1558 static const EVP_TEST_METHOD cipher_test_method = {
   1559     "Cipher",
   1560     cipher_test_init,
   1561     cipher_test_cleanup,
   1562     cipher_test_parse,
   1563     cipher_test_run
   1564 };
   1565 
   1566 /**
   1567  **  MAC TESTS
   1568  **/
   1569 
   1570 typedef struct mac_data_st {
   1571     /* MAC type in one form or another */
   1572     char *mac_name;
   1573     EVP_MAC *mac; /* for mac_test_run_mac */
   1574     int type; /* for mac_test_run_pkey */
   1575     /* Algorithm string for this MAC */
   1576     char *alg;
   1577     /* MAC key */
   1578     unsigned char *key;
   1579     size_t key_len;
   1580     /* MAC IV (GMAC) */
   1581     unsigned char *iv;
   1582     size_t iv_len;
   1583     /* Input to MAC */
   1584     unsigned char *input;
   1585     size_t input_len;
   1586     /* Expected output */
   1587     unsigned char *output;
   1588     size_t output_len;
   1589     unsigned char *custom;
   1590     size_t custom_len;
   1591     /* MAC salt (blake2) */
   1592     unsigned char *salt;
   1593     size_t salt_len;
   1594     /* XOF mode? */
   1595     int xof;
   1596     /* Reinitialization fails */
   1597     int no_reinit;
   1598     /* Collection of controls */
   1599     STACK_OF(OPENSSL_STRING) *controls;
   1600     /* Output size */
   1601     int output_size;
   1602     /* Block size */
   1603     int block_size;
   1604 } MAC_DATA;
   1605 
   1606 static int mac_test_init(EVP_TEST *t, const char *alg)
   1607 {
   1608     EVP_MAC *mac = NULL;
   1609     int type = NID_undef;
   1610     MAC_DATA *mdat;
   1611 
   1612     if (is_mac_disabled(alg)) {
   1613         TEST_info("skipping, '%s' is disabled", alg);
   1614         t->skip = 1;
   1615         return 1;
   1616     }
   1617     if ((mac = EVP_MAC_fetch(libctx, alg, propquery)) == NULL) {
   1618         /*
   1619          * Since we didn't find an EVP_MAC, we check for known EVP_PKEY methods
   1620          * For debugging purposes, we allow 'NNNN by EVP_PKEY' to force running
   1621          * the EVP_PKEY method.
   1622          */
   1623         size_t sz = strlen(alg);
   1624         static const char epilogue[] = " by EVP_PKEY";
   1625 
   1626         if (sz >= sizeof(epilogue)
   1627             && strcmp(alg + sz - (sizeof(epilogue) - 1), epilogue) == 0)
   1628             sz -= sizeof(epilogue) - 1;
   1629 
   1630         if (strncmp(alg, "HMAC", sz) == 0)
   1631             type = EVP_PKEY_HMAC;
   1632         else if (strncmp(alg, "CMAC", sz) == 0)
   1633             type = EVP_PKEY_CMAC;
   1634         else if (strncmp(alg, "Poly1305", sz) == 0)
   1635             type = EVP_PKEY_POLY1305;
   1636         else if (strncmp(alg, "SipHash", sz) == 0)
   1637             type = EVP_PKEY_SIPHASH;
   1638         else
   1639             return 0;
   1640     }
   1641 
   1642     if (!TEST_ptr(mdat = OPENSSL_zalloc(sizeof(*mdat))))
   1643         return 0;
   1644 
   1645     mdat->type = type;
   1646     if (!TEST_ptr(mdat->mac_name = OPENSSL_strdup(alg))) {
   1647         OPENSSL_free(mdat);
   1648         return 0;
   1649     }
   1650 
   1651     mdat->mac = mac;
   1652     if (!TEST_ptr(mdat->controls = sk_OPENSSL_STRING_new_null())) {
   1653         OPENSSL_free(mdat->mac_name);
   1654         OPENSSL_free(mdat);
   1655         return 0;
   1656     }
   1657 
   1658     mdat->output_size = mdat->block_size = -1;
   1659     t->data = mdat;
   1660     return 1;
   1661 }
   1662 
   1663 static void mac_test_cleanup(EVP_TEST *t)
   1664 {
   1665     MAC_DATA *mdat = t->data;
   1666 
   1667     EVP_MAC_free(mdat->mac);
   1668     OPENSSL_free(mdat->mac_name);
   1669     sk_OPENSSL_STRING_pop_free(mdat->controls, openssl_free);
   1670     OPENSSL_free(mdat->alg);
   1671     OPENSSL_free(mdat->key);
   1672     OPENSSL_free(mdat->iv);
   1673     OPENSSL_free(mdat->custom);
   1674     OPENSSL_free(mdat->salt);
   1675     OPENSSL_free(mdat->input);
   1676     OPENSSL_free(mdat->output);
   1677 }
   1678 
   1679 static int mac_test_parse(EVP_TEST *t,
   1680     const char *keyword, const char *value)
   1681 {
   1682     MAC_DATA *mdata = t->data;
   1683 
   1684     if (strcmp(keyword, "Key") == 0)
   1685         return parse_bin(value, &mdata->key, &mdata->key_len);
   1686     if (strcmp(keyword, "IV") == 0)
   1687         return parse_bin(value, &mdata->iv, &mdata->iv_len);
   1688     if (strcmp(keyword, "Custom") == 0)
   1689         return parse_bin(value, &mdata->custom, &mdata->custom_len);
   1690     if (strcmp(keyword, "Salt") == 0)
   1691         return parse_bin(value, &mdata->salt, &mdata->salt_len);
   1692     if (strcmp(keyword, "Algorithm") == 0) {
   1693         mdata->alg = OPENSSL_strdup(value);
   1694         if (mdata->alg == NULL)
   1695             return -1;
   1696         return 1;
   1697     }
   1698     if (strcmp(keyword, "Input") == 0)
   1699         return parse_bin(value, &mdata->input, &mdata->input_len);
   1700     if (strcmp(keyword, "Output") == 0)
   1701         return parse_bin(value, &mdata->output, &mdata->output_len);
   1702     if (strcmp(keyword, "XOF") == 0)
   1703         return mdata->xof = 1;
   1704     if (strcmp(keyword, "NoReinit") == 0)
   1705         return mdata->no_reinit = 1;
   1706     if (strcmp(keyword, "Ctrl") == 0)
   1707         return ctrladd(mdata->controls, value);
   1708     if (strcmp(keyword, "OutputSize") == 0) {
   1709         mdata->output_size = atoi(value);
   1710         if (mdata->output_size < 0)
   1711             return -1;
   1712         return 1;
   1713     }
   1714     if (strcmp(keyword, "BlockSize") == 0) {
   1715         mdata->block_size = atoi(value);
   1716         if (mdata->block_size < 0)
   1717             return -1;
   1718         return 1;
   1719     }
   1720     return 0;
   1721 }
   1722 
   1723 static int mac_test_ctrl_pkey(EVP_TEST *t, EVP_PKEY_CTX *pctx,
   1724     const char *value)
   1725 {
   1726     int rv = 0;
   1727     char *p, *tmpval;
   1728 
   1729     if (!TEST_ptr(tmpval = OPENSSL_strdup(value)))
   1730         return 0;
   1731     p = strchr(tmpval, ':');
   1732     if (p != NULL) {
   1733         *p++ = '\0';
   1734         rv = EVP_PKEY_CTX_ctrl_str(pctx, tmpval, p);
   1735     }
   1736     if (rv == -2)
   1737         t->err = "PKEY_CTRL_INVALID";
   1738     else if (rv <= 0)
   1739         t->err = "PKEY_CTRL_ERROR";
   1740     else
   1741         rv = 1;
   1742     OPENSSL_free(tmpval);
   1743     return rv > 0;
   1744 }
   1745 
   1746 static int mac_test_run_pkey(EVP_TEST *t)
   1747 {
   1748     MAC_DATA *expected = t->data;
   1749     EVP_MD_CTX *mctx = NULL;
   1750     EVP_PKEY_CTX *pctx = NULL, *genctx = NULL;
   1751     EVP_PKEY *key = NULL;
   1752     const char *mdname = NULL;
   1753     EVP_CIPHER *cipher = NULL;
   1754     unsigned char *got = NULL;
   1755     size_t got_len;
   1756     int i;
   1757     size_t input_len, donelen;
   1758 
   1759     /* We don't do XOF mode via PKEY */
   1760     if (expected->xof)
   1761         return 1;
   1762 
   1763     if (expected->alg == NULL)
   1764         TEST_info("Trying the EVP_PKEY %s test", OBJ_nid2sn(expected->type));
   1765     else
   1766         TEST_info("Trying the EVP_PKEY %s test with %s",
   1767             OBJ_nid2sn(expected->type), expected->alg);
   1768 
   1769     if (expected->type == EVP_PKEY_CMAC) {
   1770 #ifdef OPENSSL_NO_DEPRECATED_3_0
   1771         TEST_info("skipping, PKEY CMAC '%s' is disabled", expected->alg);
   1772         t->skip = 1;
   1773         t->err = NULL;
   1774         goto err;
   1775 #else
   1776         OSSL_LIB_CTX *tmpctx;
   1777 
   1778         if (expected->alg != NULL && is_cipher_disabled(expected->alg)) {
   1779             TEST_info("skipping, PKEY CMAC '%s' is disabled", expected->alg);
   1780             t->skip = 1;
   1781             t->err = NULL;
   1782             goto err;
   1783         }
   1784         if (!TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, expected->alg, propquery))) {
   1785             t->err = "MAC_KEY_CREATE_ERROR";
   1786             goto err;
   1787         }
   1788         tmpctx = OSSL_LIB_CTX_set0_default(libctx);
   1789         key = EVP_PKEY_new_CMAC_key(NULL, expected->key, expected->key_len,
   1790             cipher);
   1791         OSSL_LIB_CTX_set0_default(tmpctx);
   1792 #endif
   1793     } else {
   1794         key = EVP_PKEY_new_raw_private_key_ex(libctx,
   1795             OBJ_nid2sn(expected->type), NULL,
   1796             expected->key, expected->key_len);
   1797     }
   1798     if (key == NULL) {
   1799         t->err = "MAC_KEY_CREATE_ERROR";
   1800         goto err;
   1801     }
   1802 
   1803     if (expected->type == EVP_PKEY_HMAC && expected->alg != NULL) {
   1804         if (is_digest_disabled(expected->alg)) {
   1805             TEST_info("skipping, HMAC '%s' is disabled", expected->alg);
   1806             t->skip = 1;
   1807             t->err = NULL;
   1808             goto err;
   1809         }
   1810         mdname = expected->alg;
   1811     }
   1812     if (!TEST_ptr(mctx = EVP_MD_CTX_new())) {
   1813         t->err = "INTERNAL_ERROR";
   1814         goto err;
   1815     }
   1816     if (!EVP_DigestSignInit_ex(mctx, &pctx, mdname, libctx, NULL, key, NULL)) {
   1817         t->err = "DIGESTSIGNINIT_ERROR";
   1818         goto err;
   1819     }
   1820     for (i = 0; i < sk_OPENSSL_STRING_num(expected->controls); i++)
   1821         if (!mac_test_ctrl_pkey(t, pctx,
   1822                 sk_OPENSSL_STRING_value(expected->controls,
   1823                     i))) {
   1824             t->err = "EVPPKEYCTXCTRL_ERROR";
   1825             goto err;
   1826         }
   1827     input_len = expected->input_len;
   1828     donelen = 0;
   1829     do {
   1830         size_t current_len = (size_t)data_chunk_size;
   1831 
   1832         if (data_chunk_size == 0 || (size_t)data_chunk_size > input_len)
   1833             current_len = input_len;
   1834         if (!EVP_DigestSignUpdate(mctx, expected->input + donelen, current_len)) {
   1835             t->err = "DIGESTSIGNUPDATE_ERROR";
   1836             goto err;
   1837         }
   1838         donelen += current_len;
   1839         input_len -= current_len;
   1840     } while (input_len > 0);
   1841 
   1842     if (!EVP_DigestSignFinal(mctx, NULL, &got_len)) {
   1843         t->err = "DIGESTSIGNFINAL_LENGTH_ERROR";
   1844         goto err;
   1845     }
   1846     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
   1847         t->err = "TEST_FAILURE";
   1848         goto err;
   1849     }
   1850     if (!EVP_DigestSignFinal(mctx, got, &got_len)
   1851         || !memory_err_compare(t, "TEST_MAC_ERR",
   1852             expected->output, expected->output_len,
   1853             got, got_len)) {
   1854         t->err = "TEST_MAC_ERR";
   1855         goto err;
   1856     }
   1857     t->err = NULL;
   1858 err:
   1859     EVP_CIPHER_free(cipher);
   1860     EVP_MD_CTX_free(mctx);
   1861     OPENSSL_free(got);
   1862     EVP_PKEY_CTX_free(genctx);
   1863     EVP_PKEY_free(key);
   1864     return 1;
   1865 }
   1866 
   1867 static int mac_test_run_mac(EVP_TEST *t)
   1868 {
   1869     MAC_DATA *expected = t->data;
   1870     EVP_MAC_CTX *ctx = NULL;
   1871     unsigned char *got = NULL;
   1872     size_t got_len = 0, size = 0;
   1873     size_t size_before_init = 0, size_after_init, size_val = 0;
   1874     int block_size = -1, output_size = -1;
   1875     OSSL_PARAM params[21], sizes[3], *psizes = sizes, *p;
   1876     size_t params_n = 0;
   1877     size_t params_n_allocstart = 0;
   1878     const OSSL_PARAM *defined_params = EVP_MAC_settable_ctx_params(expected->mac);
   1879     int xof;
   1880     int reinit = 1;
   1881     size_t input_len, donelen;
   1882 
   1883     if (expected->alg == NULL)
   1884         TEST_info("Trying the EVP_MAC %s test", expected->mac_name);
   1885     else
   1886         TEST_info("Trying the EVP_MAC %s test with %s",
   1887             expected->mac_name, expected->alg);
   1888 
   1889     if (expected->alg != NULL) {
   1890         int skip = 0;
   1891 
   1892         /*
   1893          * The underlying algorithm may be a cipher or a digest.
   1894          * We don't know which it is, but we can ask the MAC what it
   1895          * should be and bet on that.
   1896          */
   1897         if (OSSL_PARAM_locate_const(defined_params,
   1898                 OSSL_MAC_PARAM_CIPHER)
   1899             != NULL) {
   1900             if (is_cipher_disabled(expected->alg))
   1901                 skip = 1;
   1902             else
   1903                 params[params_n++] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_CIPHER,
   1904                     expected->alg, 0);
   1905         } else if (OSSL_PARAM_locate_const(defined_params,
   1906                        OSSL_MAC_PARAM_DIGEST)
   1907             != NULL) {
   1908             if (is_digest_disabled(expected->alg))
   1909                 skip = 1;
   1910             else
   1911                 params[params_n++] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
   1912                     expected->alg, 0);
   1913         } else {
   1914             t->err = "MAC_BAD_PARAMS";
   1915             goto err;
   1916         }
   1917         if (skip) {
   1918             TEST_info("skipping, algorithm '%s' is disabled", expected->alg);
   1919             t->skip = 1;
   1920             t->err = NULL;
   1921             goto err;
   1922         }
   1923     }
   1924     if (expected->custom != NULL)
   1925         params[params_n++] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_CUSTOM,
   1926             expected->custom,
   1927             expected->custom_len);
   1928     if (expected->salt != NULL)
   1929         params[params_n++] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_SALT,
   1930             expected->salt,
   1931             expected->salt_len);
   1932     if (expected->iv != NULL)
   1933         params[params_n++] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_IV,
   1934             expected->iv,
   1935             expected->iv_len);
   1936 
   1937     params_n_allocstart = params_n;
   1938     if (!ctrl2params(t, expected->controls, defined_params,
   1939             params, OSSL_NELEM(params), &params_n))
   1940         goto err;
   1941 
   1942     p = OSSL_PARAM_locate(params + params_n_allocstart, "size");
   1943     if (p != NULL) {
   1944         if (!OSSL_PARAM_get_size_t(p, &size_val))
   1945             goto err;
   1946     }
   1947 
   1948     if ((ctx = EVP_MAC_CTX_new(expected->mac)) == NULL) {
   1949         t->err = "MAC_CREATE_ERROR";
   1950         goto err;
   1951     }
   1952     if (fips_provider_version_gt(libctx, 3, 2, 0)) {
   1953         /* HMAC will put an error on the stack here (digest is not set yet) */
   1954         ERR_set_mark();
   1955         size_before_init = EVP_MAC_CTX_get_mac_size(ctx);
   1956         ERR_pop_to_mark();
   1957     }
   1958     if (!EVP_MAC_init(ctx, expected->key, expected->key_len, params)) {
   1959         t->err = "MAC_INIT_ERROR";
   1960         goto err;
   1961     }
   1962     size_after_init = EVP_MAC_CTX_get_mac_size(ctx);
   1963     if (!TEST_false(size_before_init == 0 && size_after_init == 0)) {
   1964         t->err = "MAC SIZE not set";
   1965         goto err;
   1966     }
   1967     if (size_before_init != 0) {
   1968         /* mac-size not modified by init params */
   1969         if (size_val == 0 && !TEST_size_t_eq(size_before_init, size_after_init)) {
   1970             t->err = "MAC SIZE check failed";
   1971             goto err;
   1972         }
   1973         /* mac-size modified by init params */
   1974         if (size_val != 0 && !TEST_size_t_eq(size_val, size_after_init)) {
   1975             t->err = "MAC SIZE check failed";
   1976             goto err;
   1977         }
   1978     }
   1979     if (expected->output_size >= 0)
   1980         *psizes++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_SIZE,
   1981             &output_size);
   1982     if (expected->block_size >= 0)
   1983         *psizes++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_BLOCK_SIZE,
   1984             &block_size);
   1985     if (psizes != sizes) {
   1986         *psizes = OSSL_PARAM_construct_end();
   1987         if (!TEST_true(EVP_MAC_CTX_get_params(ctx, sizes))) {
   1988             t->err = "INTERNAL_ERROR";
   1989             goto err;
   1990         }
   1991         if (expected->output_size >= 0
   1992             && !TEST_int_eq(output_size, expected->output_size)) {
   1993             t->err = "TEST_FAILURE";
   1994             goto err;
   1995         }
   1996         if (expected->block_size >= 0
   1997             && !TEST_int_eq(block_size, expected->block_size)) {
   1998             t->err = "TEST_FAILURE";
   1999             goto err;
   2000         }
   2001     }
   2002 retry:
   2003     input_len = expected->input_len;
   2004     donelen = 0;
   2005     do {
   2006         size_t current_len = (size_t)data_chunk_size;
   2007 
   2008         if (data_chunk_size == 0 || (size_t)data_chunk_size > input_len)
   2009             current_len = input_len;
   2010         if (!EVP_MAC_update(ctx, expected->input + donelen, current_len)) {
   2011             t->err = "MAC_UPDATE_ERROR";
   2012             goto err;
   2013         }
   2014         donelen += current_len;
   2015         input_len -= current_len;
   2016     } while (input_len > 0);
   2017 
   2018     xof = expected->xof;
   2019     if (xof) {
   2020         if (!TEST_ptr(got = OPENSSL_malloc(expected->output_len))) {
   2021             t->err = "TEST_FAILURE";
   2022             goto err;
   2023         }
   2024         if (!EVP_MAC_finalXOF(ctx, got, expected->output_len)
   2025             || !memory_err_compare(t, "TEST_MAC_ERR",
   2026                 expected->output, expected->output_len,
   2027                 got, expected->output_len)) {
   2028             t->err = "MAC_FINAL_ERROR";
   2029             goto err;
   2030         }
   2031     } else {
   2032         if (!EVP_MAC_final(ctx, NULL, &got_len, 0)) {
   2033             t->err = "MAC_FINAL_LENGTH_ERROR";
   2034             goto err;
   2035         }
   2036         if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
   2037             t->err = "TEST_FAILURE";
   2038             goto err;
   2039         }
   2040         if (!EVP_MAC_final(ctx, got, &got_len, got_len)
   2041             || !memory_err_compare(t, "TEST_MAC_ERR",
   2042                 expected->output, expected->output_len,
   2043                 got, got_len)) {
   2044             t->err = "TEST_MAC_ERR";
   2045             goto err;
   2046         }
   2047         if (!mac_check_fips_approved(ctx, t))
   2048             goto err;
   2049     }
   2050     /* FIPS(3.0.0): can't reinitialise MAC contexts #18100 */
   2051     if (reinit-- && fips_provider_version_gt(libctx, 3, 0, 0)) {
   2052         OSSL_PARAM ivparams[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
   2053         int ret;
   2054 
   2055         /* If the MAC uses IV, we have to set it again */
   2056         if (expected->iv != NULL) {
   2057             ivparams[0] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_IV,
   2058                 expected->iv,
   2059                 expected->iv_len);
   2060             ivparams[1] = OSSL_PARAM_construct_end();
   2061         }
   2062         ERR_set_mark();
   2063         ret = EVP_MAC_init(ctx, NULL, 0, ivparams);
   2064         if (expected->no_reinit) {
   2065             if (ret) {
   2066                 ERR_clear_last_mark();
   2067                 t->err = "MAC_REINIT_SHOULD_FAIL";
   2068                 goto err;
   2069             }
   2070         } else if (ret) {
   2071             ERR_clear_last_mark();
   2072             OPENSSL_free(got);
   2073             got = NULL;
   2074             goto retry;
   2075         } else {
   2076             ERR_clear_last_mark();
   2077             t->err = "MAC_REINIT_ERROR";
   2078             goto err;
   2079         }
   2080         /* If reinitialization fails, it is unsupported by the algorithm */
   2081         ERR_pop_to_mark();
   2082     }
   2083     t->err = NULL;
   2084 
   2085     /* Test the EVP_Q_mac interface as well */
   2086     if (!xof) {
   2087         OPENSSL_cleanse(got, got_len);
   2088         if (!TEST_true(EVP_Q_mac(libctx, expected->mac_name, NULL,
   2089                 expected->alg, params,
   2090                 expected->key, expected->key_len,
   2091                 expected->input, expected->input_len,
   2092                 got, got_len, &size))
   2093             || !TEST_mem_eq(got, size,
   2094                 expected->output, expected->output_len)) {
   2095             t->err = "EVP_Q_mac failed";
   2096             goto err;
   2097         }
   2098     }
   2099 err:
   2100     ctrl2params_free(params, params_n, params_n_allocstart);
   2101     EVP_MAC_CTX_free(ctx);
   2102     OPENSSL_free(got);
   2103     return 1;
   2104 }
   2105 
   2106 static int mac_test_run(EVP_TEST *t)
   2107 {
   2108     MAC_DATA *expected = t->data;
   2109 
   2110     if (expected->mac != NULL)
   2111         return mac_test_run_mac(t);
   2112     return mac_test_run_pkey(t);
   2113 }
   2114 
   2115 static const EVP_TEST_METHOD mac_test_method = {
   2116     "MAC",
   2117     mac_test_init,
   2118     mac_test_cleanup,
   2119     mac_test_parse,
   2120     mac_test_run
   2121 };
   2122 
   2123 typedef struct kem_data_st {
   2124     /* Context for this operation */
   2125     EVP_PKEY_CTX *ctx;
   2126     const char *op;
   2127     /* Input to decapsulate */
   2128     unsigned char *input;
   2129     size_t inputlen;
   2130     /* Expected secret */
   2131     unsigned char *output;
   2132     size_t outputlen;
   2133     STACK_OF(OPENSSL_STRING) *init_ctrls;
   2134     /* Algorithm name */
   2135     char *algname;
   2136     /* Name of previously generated key */
   2137     char *keyname;
   2138     /* Encoded public key */
   2139     unsigned char *encoded_pub_key;
   2140     size_t encoded_pub_key_len;
   2141     /* Encoded private key */
   2142     unsigned char *encoded_priv_key;
   2143     size_t encoded_priv_key_len;
   2144     /* Entropy for encapsulation */
   2145     unsigned char *entropy;
   2146     size_t entropylen;
   2147     /* Ciphertext */
   2148     unsigned char *ciphertext;
   2149     size_t ciphertext_len;
   2150 } KEM_DATA;
   2151 
   2152 static int kem_test_init(EVP_TEST *t, const char *alg)
   2153 {
   2154     KEM_DATA *kdata = NULL;
   2155     EVP_PKEY *pkey = NULL;
   2156 
   2157     if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata)))
   2158         || !TEST_ptr(kdata->algname = OPENSSL_strdup(alg)))
   2159         goto err;
   2160 
   2161     kdata->init_ctrls = sk_OPENSSL_STRING_new_null();
   2162     t->data = kdata;
   2163     return 1;
   2164 err:
   2165     EVP_PKEY_free(pkey);
   2166     OPENSSL_free(kdata);
   2167     return 0;
   2168 }
   2169 
   2170 static void kem_test_cleanup(EVP_TEST *t)
   2171 {
   2172     KEM_DATA *kdata = t->data;
   2173 
   2174     ctrlfree(kdata->init_ctrls);
   2175     OPENSSL_free(kdata->input);
   2176     OPENSSL_free(kdata->output);
   2177     OPENSSL_free(kdata->algname);
   2178     OPENSSL_free(kdata->keyname);
   2179     OPENSSL_free(kdata->encoded_pub_key);
   2180     OPENSSL_free(kdata->encoded_priv_key);
   2181     OPENSSL_free(kdata->entropy);
   2182     OPENSSL_free(kdata->ciphertext);
   2183     EVP_PKEY_CTX_free(kdata->ctx);
   2184 }
   2185 
   2186 static int kem_test_parse(EVP_TEST *t, const char *keyword, const char *value)
   2187 {
   2188     KEM_DATA *kdata = t->data;
   2189 
   2190     if (strcmp(keyword, "Op") == 0) {
   2191         kdata->op = value;
   2192         return 1;
   2193     }
   2194     if (strcmp(keyword, "CtrlInit") == 0)
   2195         return ctrladd(kdata->init_ctrls, value);
   2196     if (strcmp(keyword, "Input") == 0)
   2197         return parse_bin(value, &kdata->input, &kdata->inputlen);
   2198     if (strcmp(keyword, "Output") == 0)
   2199         return parse_bin(value, &kdata->output, &kdata->outputlen);
   2200     if (strcmp(keyword, "EncodedPublicKey") == 0)
   2201         return parse_bin(value, &kdata->encoded_pub_key,
   2202             &kdata->encoded_pub_key_len);
   2203     if (strcmp(keyword, "EncodedPrivateKey") == 0)
   2204         return parse_bin(value, &kdata->encoded_priv_key,
   2205             &kdata->encoded_priv_key_len);
   2206     if (strcmp(keyword, "Entropy") == 0)
   2207         return parse_bin(value, &kdata->entropy, &kdata->entropylen);
   2208     if (strcmp(keyword, "Ciphertext") == 0)
   2209         return parse_bin(value, &kdata->ciphertext, &kdata->ciphertext_len);
   2210     if (strcmp(keyword, "KeyName") == 0)
   2211         return TEST_ptr(kdata->keyname = OPENSSL_strdup(value));
   2212     return 1;
   2213 }
   2214 
   2215 static int encapsulate(EVP_TEST *t, EVP_PKEY_CTX *ctx, const char *op,
   2216     unsigned char **outwrapped, size_t *outwrappedlen,
   2217     unsigned char **outsecret, size_t *outsecretlen)
   2218 {
   2219     int ret = 0;
   2220     KEM_DATA *kdata = t->data;
   2221     unsigned char *wrapped = NULL, *secret = NULL;
   2222     size_t wrappedlen = 0, secretlen = 0;
   2223     OSSL_PARAM params[10];
   2224     size_t params_n = 0;
   2225     /* Reserve space for the terminator and possibly IKME */
   2226     const size_t params_max = OSSL_NELEM(params) - 1 - (kdata->entropy != NULL);
   2227 
   2228     if (sk_OPENSSL_STRING_num(kdata->init_ctrls) > 0)
   2229         if (!ctrl2params(t, kdata->init_ctrls, NULL, params, params_max,
   2230                 &params_n))
   2231             goto err;
   2232 
   2233     /* We don't expect very many controls here */
   2234     if (!TEST_size_t_lt(params_n, params_max))
   2235         goto err;
   2236 
   2237     if (kdata->entropy != NULL)
   2238         /* Input key material a.k.a entropy */
   2239         params[params_n++] = OSSL_PARAM_construct_octet_string(OSSL_KEM_PARAM_IKME,
   2240             kdata->entropy,
   2241             kdata->entropylen);
   2242     params[params_n] = OSSL_PARAM_construct_end();
   2243 
   2244     if (EVP_PKEY_encapsulate_init(ctx, params) <= 0) {
   2245         t->err = "TEST_ENCAPSULATE_INIT_ERROR";
   2246         goto ok;
   2247     }
   2248 
   2249     if (op != NULL && EVP_PKEY_CTX_set_kem_op(ctx, op) <= 0) {
   2250         t->err = "TEST_SET_KEM_OP_ERROR";
   2251         goto ok;
   2252     }
   2253     if (EVP_PKEY_encapsulate(ctx, NULL, &wrappedlen, NULL, &secretlen) <= 0) {
   2254         t->err = "TEST_ENCAPSULATE_LEN_ERROR";
   2255         goto ok;
   2256     }
   2257     wrapped = OPENSSL_malloc(wrappedlen);
   2258     secret = OPENSSL_malloc(secretlen);
   2259     if (!TEST_ptr(wrapped) || !TEST_ptr(secret)) {
   2260         ret = 0;
   2261         goto err;
   2262     }
   2263     if (EVP_PKEY_encapsulate(ctx, wrapped, &wrappedlen, secret, &secretlen) <= 0) {
   2264         t->err = "TEST_ENCAPSULATE_ERROR";
   2265         goto ok;
   2266     }
   2267     ret = pkey_check_fips_approved(ctx, t);
   2268 
   2269     if (kdata->ciphertext != NULL
   2270         && !TEST_mem_eq(wrapped, wrappedlen, kdata->ciphertext, kdata->ciphertext_len)) {
   2271         ret = 0;
   2272         goto err;
   2273     }
   2274 
   2275     if (kdata->output != NULL
   2276         && !TEST_mem_eq(secret, secretlen, kdata->output, kdata->outputlen)) {
   2277         ret = 0;
   2278         goto err;
   2279     }
   2280 
   2281     if (ret == 0)
   2282         goto err;
   2283 
   2284     t->err = NULL;
   2285     *outwrapped = wrapped;
   2286     *outsecret = secret;
   2287     *outwrappedlen = wrappedlen;
   2288     *outsecretlen = secretlen;
   2289 ok:
   2290     ret = 1;
   2291 err:
   2292     if (ret == 0) {
   2293         OPENSSL_free(wrapped);
   2294         OPENSSL_free(secret);
   2295     }
   2296     if (sk_OPENSSL_STRING_num(kdata->init_ctrls) > 0)
   2297         ctrl2params_free(params, params_n, 0);
   2298     return ret;
   2299 }
   2300 
   2301 static int decapsulate(EVP_TEST *t, EVP_PKEY_CTX *ctx, const char *op,
   2302     const unsigned char *in, size_t inlen,
   2303     const unsigned char *expected, size_t expectedlen)
   2304 {
   2305     int ret = 0;
   2306     KEM_DATA *kdata = t->data;
   2307     size_t outlen = 0;
   2308     unsigned char *out = NULL;
   2309     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
   2310     OSSL_PARAM *p = NULL;
   2311     size_t params_n = 0, params_n_allocated = 0;
   2312 
   2313     if (sk_OPENSSL_STRING_num(kdata->init_ctrls) > 0) {
   2314         if (!ctrl2params(t, kdata->init_ctrls, NULL,
   2315                 params, 2, &params_n))
   2316             goto err;
   2317         p = params;
   2318     }
   2319 
   2320     if (EVP_PKEY_decapsulate_init(ctx, p) <= 0) {
   2321         t->err = "TEST_DECAPSULATE_INIT_ERROR";
   2322         goto ok;
   2323     }
   2324 
   2325     if (op != NULL && EVP_PKEY_CTX_set_kem_op(ctx, op) <= 0) {
   2326         t->err = "TEST_SET_KEM_OP_ERROR";
   2327         goto ok;
   2328     }
   2329     if (EVP_PKEY_decapsulate(ctx, NULL, &outlen, in, inlen) <= 0) {
   2330         t->err = "TEST_DECAPSULATE_LEN_ERROR";
   2331         goto ok;
   2332     }
   2333     if (!TEST_ptr(out = OPENSSL_malloc(outlen))) {
   2334         ret = 0;
   2335         goto err;
   2336     }
   2337 
   2338     if (EVP_PKEY_decapsulate(ctx, out, &outlen, in, inlen) <= 0) {
   2339         t->err = "TEST_DECAPSULATE_ERROR";
   2340         goto err;
   2341     }
   2342     if (!TEST_mem_eq(out, outlen, expected, expectedlen)) {
   2343         t->err = "TEST_SECRET_MISMATCH";
   2344         goto ok;
   2345     }
   2346     t->err = NULL;
   2347 ok:
   2348     ret = 1;
   2349 err:
   2350     OPENSSL_free(out);
   2351     if (sk_OPENSSL_STRING_num(kdata->init_ctrls) > 0)
   2352         ctrl2params_free(params, params_n, params_n_allocated);
   2353     return ret;
   2354 }
   2355 
   2356 static int kem_test_run(EVP_TEST *t)
   2357 {
   2358     int ret = 0, found_key = 0;
   2359     EVP_PKEY *pkey = NULL;
   2360     KEM_DATA *kdata = t->data;
   2361     unsigned char *wrapped = NULL, *secret = NULL;
   2362 
   2363     /* Generate either public or private key based on given params */
   2364     if (kdata->keyname != NULL) {
   2365         /* Previously generated private key */
   2366         found_key = find_key(&pkey, kdata->keyname, private_keys);
   2367         if (found_key == 0 || pkey == NULL) {
   2368             TEST_info("skipping, key '%s' is disabled", kdata->keyname);
   2369             t->skip = 1;
   2370             goto ok;
   2371         }
   2372     } else if (kdata->encoded_pub_key != NULL) {
   2373         /* Encoded public key */
   2374         if ((pkey = EVP_PKEY_new_raw_public_key_ex(libctx, kdata->algname,
   2375                  propquery,
   2376                  kdata->encoded_pub_key,
   2377                  kdata->encoded_pub_key_len))
   2378             == NULL) {
   2379             t->err = "TEST_PARSE_PUBLIC_KEY_ERROR";
   2380             goto ok;
   2381         }
   2382     } else if (kdata->encoded_priv_key != NULL) {
   2383         /* Encoded private key */
   2384         if ((pkey = EVP_PKEY_new_raw_private_key_ex(libctx, kdata->algname,
   2385                  propquery,
   2386                  kdata->encoded_priv_key,
   2387                  kdata->encoded_priv_key_len))
   2388             == NULL) {
   2389             t->err = "TEST_PARSE_PRIVATE_KEY_ERROR";
   2390             goto ok;
   2391         }
   2392     } else {
   2393         TEST_info("Missing parameters to create key");
   2394         goto err;
   2395     }
   2396 
   2397     if (!TEST_ptr(kdata->ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, propquery)))
   2398         goto err;
   2399 
   2400     if (kdata->input == NULL) {
   2401         size_t wrappedlen = 0, secretlen = 0;
   2402 
   2403         ret = encapsulate(t, kdata->ctx, kdata->op, &wrapped, &wrappedlen,
   2404             &secret, &secretlen);
   2405         if (ret == 0 || t->err != NULL)
   2406             goto err;
   2407 
   2408         /* Also attempt to decrypt if we have the private key */
   2409         if (found_key || kdata->encoded_priv_key != NULL)
   2410             ret = decapsulate(t, kdata->ctx, kdata->op, wrapped, wrappedlen,
   2411                 secret, secretlen);
   2412     } else {
   2413         ret = decapsulate(t, kdata->ctx, kdata->op, kdata->input, kdata->inputlen,
   2414             kdata->output, kdata->outputlen);
   2415     }
   2416 
   2417 ok:
   2418     ret = 1;
   2419 err:
   2420     if (!found_key)
   2421         EVP_PKEY_free(pkey);
   2422     OPENSSL_free(wrapped);
   2423     OPENSSL_free(secret);
   2424     return ret;
   2425 }
   2426 
   2427 static const EVP_TEST_METHOD pkey_kem_test_method = {
   2428     "Kem",
   2429     kem_test_init,
   2430     kem_test_cleanup,
   2431     kem_test_parse,
   2432     kem_test_run
   2433 };
   2434 
   2435 /**
   2436  **  PUBLIC KEY TESTS
   2437  **  These are all very similar and share much common code.
   2438  **/
   2439 
   2440 typedef struct pkey_data_st {
   2441     /* Context for this operation */
   2442     EVP_PKEY_CTX *ctx;
   2443     /* Signature algo for such operations */
   2444     EVP_SIGNATURE *sigalgo;
   2445     /* Key operation to perform */
   2446     int (*keyopinit)(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[]);
   2447     int (*keyopinit_ex2)(EVP_PKEY_CTX *ctx, EVP_SIGNATURE *algo,
   2448         const OSSL_PARAM params[]);
   2449     int (*keyop)(EVP_PKEY_CTX *ctx,
   2450         unsigned char *sig, size_t *siglen,
   2451         const unsigned char *tbs, size_t tbslen);
   2452     /* Input to MAC */
   2453     unsigned char *input;
   2454     size_t input_len;
   2455     /* Expected output */
   2456     unsigned char *output;
   2457     size_t output_len;
   2458     STACK_OF(OPENSSL_STRING) *init_controls; /* collection of controls */
   2459     STACK_OF(OPENSSL_STRING) *controls; /* collection of controls */
   2460     EVP_PKEY *peer;
   2461     int validate;
   2462 } PKEY_DATA;
   2463 
   2464 /*
   2465  * Perform public key operation setup: lookup key, allocated ctx and call
   2466  * the appropriate initialisation function
   2467  */
   2468 static int pkey_test_init_keyctx(EVP_TEST *t, const char *keyname,
   2469     int use_public)
   2470 {
   2471     PKEY_DATA *kdata;
   2472     EVP_PKEY *pkey = NULL;
   2473     int rv = 0;
   2474 
   2475     if (use_public)
   2476         rv = find_key(&pkey, keyname, public_keys);
   2477     if (rv == 0)
   2478         rv = find_key(&pkey, keyname, private_keys);
   2479     if (rv == 0 || pkey == NULL) {
   2480         TEST_info("skipping, key '%s' is disabled", keyname);
   2481         t->skip = 1;
   2482         return 1;
   2483     }
   2484 
   2485     if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata)))) {
   2486         EVP_PKEY_free(pkey);
   2487         return 0;
   2488     }
   2489     if (!TEST_ptr(kdata->ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, propquery))) {
   2490         EVP_PKEY_free(pkey);
   2491         OPENSSL_free(kdata);
   2492         return 0;
   2493     }
   2494     t->data = kdata;
   2495     return 1;
   2496 }
   2497 
   2498 static int pkey_test_init(EVP_TEST *t, const char *name,
   2499     int use_public,
   2500     int (*keyopinit)(EVP_PKEY_CTX *ctx,
   2501         const OSSL_PARAM params[]),
   2502     int (*keyop)(EVP_PKEY_CTX *ctx,
   2503         unsigned char *sig, size_t *siglen,
   2504         const unsigned char *tbs,
   2505         size_t tbslen))
   2506 {
   2507     PKEY_DATA *kdata = NULL;
   2508     int rv = 0;
   2509 
   2510     rv = pkey_test_init_keyctx(t, name, use_public);
   2511     if (t->skip || !rv)
   2512         return rv;
   2513     kdata = t->data;
   2514     kdata->keyopinit = keyopinit;
   2515     kdata->keyop = keyop;
   2516     kdata->init_controls = sk_OPENSSL_STRING_new_null();
   2517     kdata->controls = sk_OPENSSL_STRING_new_null();
   2518     return 1;
   2519 }
   2520 
   2521 static int pkey_test_init_ex2(EVP_TEST *t, const char *name,
   2522     int use_public,
   2523     int (*keyopinit)(EVP_PKEY_CTX *ctx,
   2524         EVP_SIGNATURE *algo,
   2525         const OSSL_PARAM param[]),
   2526     int (*keyop)(EVP_PKEY_CTX *ctx,
   2527         unsigned char *sig, size_t *siglen,
   2528         const unsigned char *tbs,
   2529         size_t tbslen))
   2530 {
   2531     PKEY_DATA *kdata = NULL;
   2532     int rv = 0;
   2533     char algoname[OSSL_MAX_NAME_SIZE + 1];
   2534     const char *p;
   2535 
   2536     if ((p = strchr(name, ':')) == NULL
   2537         || p == name || p[1] == '\0' || p - name > OSSL_MAX_NAME_SIZE) {
   2538         TEST_info("Can't extract algorithm or key name from '%s'", name);
   2539         return 0;
   2540     }
   2541     memcpy(algoname, name, p - name);
   2542     algoname[p - name] = '\0';
   2543 
   2544     if (is_pkey_disabled(algoname)) {
   2545         t->skip = 1;
   2546         return 1;
   2547     }
   2548 
   2549     rv = pkey_test_init_keyctx(t, /* keyname */ p + 1, use_public);
   2550     if (t->skip || !rv)
   2551         return rv;
   2552     kdata = t->data;
   2553     kdata->keyopinit_ex2 = keyopinit;
   2554     kdata->keyop = keyop;
   2555     if (!TEST_ptr(kdata->sigalgo
   2556             = EVP_SIGNATURE_fetch(libctx, algoname, propquery))) {
   2557         TEST_info("algoname = '%s'", algoname);
   2558         return 0;
   2559     }
   2560     kdata->init_controls = sk_OPENSSL_STRING_new_null();
   2561     kdata->controls = sk_OPENSSL_STRING_new_null();
   2562     return 1;
   2563 }
   2564 
   2565 static void pkey_test_cleanup(EVP_TEST *t)
   2566 {
   2567     PKEY_DATA *kdata = t->data;
   2568 
   2569     ctrlfree(kdata->init_controls);
   2570     ctrlfree(kdata->controls);
   2571     OPENSSL_free(kdata->input);
   2572     OPENSSL_free(kdata->output);
   2573     EVP_PKEY_CTX_free(kdata->ctx);
   2574     EVP_SIGNATURE_free(kdata->sigalgo);
   2575 }
   2576 
   2577 static int pkey_test_ctrl(EVP_TEST *t, EVP_PKEY_CTX *pctx,
   2578     const char *value)
   2579 {
   2580     int rv = 0;
   2581     char *p, *tmpval;
   2582 
   2583     if (!TEST_ptr(tmpval = OPENSSL_strdup(value)))
   2584         return 0;
   2585     p = strchr(tmpval, ':');
   2586     if (p != NULL) {
   2587         *p++ = '\0';
   2588         rv = EVP_PKEY_CTX_ctrl_str(pctx, tmpval, p);
   2589     }
   2590     if (rv == -2) {
   2591         t->err = "PKEY_CTRL_INVALID";
   2592         rv = 1;
   2593     } else if (p != NULL && rv <= 0) {
   2594         if (is_digest_disabled(p) || is_cipher_disabled(p)) {
   2595             TEST_info("skipping, '%s' is disabled", p);
   2596             t->skip = 1;
   2597             rv = 1;
   2598         } else {
   2599             t->err = "PKEY_CTRL_ERROR";
   2600             rv = 1;
   2601         }
   2602     }
   2603     OPENSSL_free(tmpval);
   2604     return rv > 0;
   2605 }
   2606 
   2607 static int pkey_add_control(EVP_TEST *t, STACK_OF(OPENSSL_STRING) *controls,
   2608     const char *value)
   2609 {
   2610     char *p;
   2611 
   2612     if (controls == NULL)
   2613         return 0;
   2614 
   2615     p = strchr(value, ':');
   2616     if (p == NULL)
   2617         return 0;
   2618     p++;
   2619     if (is_digest_disabled(p) || is_cipher_disabled(p)) {
   2620         TEST_info("skipping, '%s' is disabled", p);
   2621         t->skip = 1;
   2622         return 1;
   2623     }
   2624 
   2625     return ctrladd(controls, value) > 0;
   2626 }
   2627 
   2628 static int pkey_test_parse(EVP_TEST *t,
   2629     const char *keyword, const char *value)
   2630 {
   2631     PKEY_DATA *kdata = t->data;
   2632     if (strcmp(keyword, "Input") == 0)
   2633         return parse_bin(value, &kdata->input, &kdata->input_len);
   2634     if (strcmp(keyword, "Output") == 0)
   2635         return parse_bin(value, &kdata->output, &kdata->output_len);
   2636     if (strcmp(keyword, "CtrlInit") == 0)
   2637         return ctrladd(kdata->init_controls, value);
   2638     if (strcmp(keyword, "Ctrl") == 0)
   2639         return pkey_add_control(t, kdata->controls, value);
   2640     return 0;
   2641 }
   2642 
   2643 static int pkey_test_run_init(EVP_TEST *t)
   2644 {
   2645     PKEY_DATA *data = t->data;
   2646     int i, ret = 0;
   2647     OSSL_PARAM params[5] = {
   2648         OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END,
   2649         OSSL_PARAM_END, OSSL_PARAM_END
   2650     };
   2651     OSSL_PARAM *p = NULL;
   2652     size_t params_n = 0, params_n_allocstart = 0;
   2653 
   2654     if (sk_OPENSSL_STRING_num(data->init_controls) > 0) {
   2655         if (!ctrl2params(t, data->init_controls,
   2656                 NULL,
   2657                 params, OSSL_NELEM(params), &params_n))
   2658             goto err;
   2659         p = params;
   2660     }
   2661     if (data->keyopinit != NULL) {
   2662         if (data->keyopinit(data->ctx, p) <= 0) {
   2663             t->err = "KEYOP_INIT_ERROR";
   2664             goto err;
   2665         }
   2666     } else if (data->keyopinit_ex2 != NULL) {
   2667         if (data->keyopinit_ex2(data->ctx, data->sigalgo, p) <= 0) {
   2668             t->err = "KEYOP_INIT_ERROR";
   2669             goto err;
   2670         }
   2671     } else {
   2672         t->err = "KEYOP_INIT_ERROR";
   2673         goto err;
   2674     }
   2675 
   2676     for (i = 0; i < sk_OPENSSL_STRING_num(data->controls); i++) {
   2677         char *value = sk_OPENSSL_STRING_value(data->controls, i);
   2678 
   2679         if (!pkey_test_ctrl(t, data->ctx, value) || t->err != NULL)
   2680             goto err;
   2681     }
   2682     ret = 1;
   2683 err:
   2684     ctrl2params_free(params, params_n, params_n_allocstart);
   2685     return ret;
   2686 }
   2687 
   2688 static int pkey_test_run(EVP_TEST *t)
   2689 {
   2690     PKEY_DATA *expected = t->data;
   2691     unsigned char *got = NULL;
   2692     size_t got_len;
   2693     EVP_PKEY_CTX *copy = NULL;
   2694 
   2695     if (!pkey_test_run_init(t))
   2696         goto err;
   2697 
   2698     /* Make a copy of the EVP_PKEY context, for repeat use further down */
   2699     if (!TEST_ptr(copy = EVP_PKEY_CTX_dup(expected->ctx))) {
   2700         t->err = "INTERNAL_ERROR";
   2701         goto err;
   2702     }
   2703 
   2704     if (expected->keyop(expected->ctx, NULL, &got_len,
   2705             expected->input, expected->input_len)
   2706             <= 0
   2707         || !TEST_ptr(got = OPENSSL_malloc(got_len))) {
   2708         t->err = "KEYOP_LENGTH_ERROR";
   2709         goto err;
   2710     }
   2711     if (expected->keyop(expected->ctx, got, &got_len,
   2712             expected->input, expected->input_len)
   2713         <= 0) {
   2714         t->err = "KEYOP_ERROR";
   2715         goto err;
   2716     }
   2717 
   2718     if (!memory_err_compare(t, "KEYOP_MISMATCH",
   2719             expected->output, expected->output_len,
   2720             got, got_len))
   2721         goto err;
   2722 
   2723     t->err = NULL;
   2724     OPENSSL_free(got);
   2725     got = NULL;
   2726 
   2727     /* Repeat the test on the EVP_PKEY context copy. */
   2728     if (expected->keyop(copy, NULL, &got_len, expected->input,
   2729             expected->input_len)
   2730             <= 0
   2731         || !TEST_ptr(got = OPENSSL_malloc(got_len))) {
   2732         t->err = "KEYOP_LENGTH_ERROR";
   2733         goto err;
   2734     }
   2735     if (expected->keyop(copy, got, &got_len, expected->input,
   2736             expected->input_len)
   2737         <= 0) {
   2738         t->err = "KEYOP_ERROR";
   2739         goto err;
   2740     }
   2741     if (!memory_err_compare(t, "KEYOP_MISMATCH",
   2742             expected->output, expected->output_len,
   2743             got, got_len))
   2744         goto err;
   2745 
   2746     if (pkey_check_fips_approved(expected->ctx, t) <= 0)
   2747         goto err;
   2748 
   2749 err:
   2750     OPENSSL_free(got);
   2751     EVP_PKEY_CTX_free(copy);
   2752     return 1;
   2753 }
   2754 
   2755 static int pkey_fromdata_test_init(EVP_TEST *t, const char *name)
   2756 {
   2757     PKEY_DATA *kdata = NULL;
   2758 
   2759     if (is_pkey_disabled(name)) {
   2760         TEST_info("skipping, '%s' is disabled", name);
   2761         t->skip = 1;
   2762         return 1;
   2763     }
   2764 
   2765     if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata))))
   2766         return 0;
   2767     kdata->ctx = EVP_PKEY_CTX_new_from_name(libctx, name, "");
   2768     if (kdata->ctx == NULL)
   2769         goto err;
   2770     if (EVP_PKEY_fromdata_init(kdata->ctx) <= 0)
   2771         goto err;
   2772     kdata->controls = sk_OPENSSL_STRING_new_null();
   2773     if (kdata->controls == NULL)
   2774         goto err;
   2775     t->data = kdata;
   2776     return 1;
   2777 err:
   2778     EVP_PKEY_CTX_free(kdata->ctx);
   2779     OPENSSL_free(kdata);
   2780     return 0;
   2781 }
   2782 
   2783 static void pkey_fromdata_test_cleanup(EVP_TEST *t)
   2784 {
   2785     PKEY_DATA *kdata = t->data;
   2786 
   2787     ctrlfree(kdata->controls);
   2788     EVP_PKEY_CTX_free(kdata->ctx);
   2789 }
   2790 
   2791 static int pkey_fromdata_test_parse(EVP_TEST *t,
   2792     const char *keyword, const char *value)
   2793 {
   2794     PKEY_DATA *kdata = t->data;
   2795 
   2796     if (strcmp(keyword, "Ctrl") == 0)
   2797         return pkey_add_control(t, kdata->controls, value);
   2798     return 0;
   2799 }
   2800 
   2801 static int pkey_fromdata_test_run(EVP_TEST *t)
   2802 {
   2803     EVP_PKEY *key = NULL;
   2804     PKEY_DATA *kdata = t->data;
   2805     int ret = 0;
   2806     static const OSSL_PARAM key_settable_ctx_params[] = {
   2807         OSSL_PARAM_octet_string("priv", NULL, 0),
   2808         OSSL_PARAM_octet_string("pub", NULL, 0),
   2809         OSSL_PARAM_END
   2810     };
   2811     OSSL_PARAM params[5] = {
   2812         OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END,
   2813         OSSL_PARAM_END, OSSL_PARAM_END
   2814     };
   2815     OSSL_PARAM *p = NULL;
   2816     size_t params_n = 0, params_n_allocstart = 0;
   2817 
   2818     if (sk_OPENSSL_STRING_num(kdata->controls) > 0) {
   2819         if (!ctrl2params(t, kdata->controls, key_settable_ctx_params,
   2820                 params, OSSL_NELEM(params), &params_n))
   2821             goto err;
   2822         p = params;
   2823     }
   2824 
   2825     ret = 1;
   2826     if (EVP_PKEY_fromdata(kdata->ctx, &key, EVP_PKEY_KEYPAIR, p) <= 0) {
   2827         t->err = "KEY_FROMDATA_ERROR";
   2828         goto err;
   2829     }
   2830 err:
   2831     ctrl2params_free(params, params_n, params_n_allocstart);
   2832     EVP_PKEY_free(key);
   2833     return ret;
   2834 }
   2835 
   2836 static const EVP_TEST_METHOD pkey_fromdata_test_method = {
   2837     "KeyFromData",
   2838     pkey_fromdata_test_init,
   2839     pkey_fromdata_test_cleanup,
   2840     pkey_fromdata_test_parse,
   2841     pkey_fromdata_test_run
   2842 };
   2843 
   2844 /*
   2845  * "Sign" implies EVP_PKEY_sign_init_ex2() if the argument is a colon-separated
   2846  * pair, {algorithm}:{key}.  If not, it implies EVP_PKEY_sign_init_ex()
   2847  */
   2848 static int sign_test_init(EVP_TEST *t, const char *name)
   2849 {
   2850     if (strchr(name, ':') != NULL)
   2851         return pkey_test_init_ex2(t, name, 0,
   2852             EVP_PKEY_sign_init_ex2, EVP_PKEY_sign);
   2853     return pkey_test_init(t, name, 0, EVP_PKEY_sign_init_ex, EVP_PKEY_sign);
   2854 }
   2855 
   2856 static const EVP_TEST_METHOD psign_test_method = {
   2857     "Sign",
   2858     sign_test_init,
   2859     pkey_test_cleanup,
   2860     pkey_test_parse,
   2861     pkey_test_run
   2862 };
   2863 
   2864 /*
   2865  * "Sign-Message" is like "Sign", but uses EVP_PKEY_sign_message_init()
   2866  * The argument must be a colon separated pair, {algorithm}:{key}
   2867  */
   2868 static int sign_test_message_init(EVP_TEST *t, const char *name)
   2869 {
   2870     return pkey_test_init_ex2(t, name, 0,
   2871         EVP_PKEY_sign_message_init, EVP_PKEY_sign);
   2872 }
   2873 
   2874 static const EVP_TEST_METHOD psign_message_test_method = {
   2875     "Sign-Message",
   2876     sign_test_message_init,
   2877     pkey_test_cleanup,
   2878     pkey_test_parse,
   2879     pkey_test_run
   2880 };
   2881 
   2882 /*
   2883  * "VerifyRecover" implies EVP_PKEY_verify_recover_init_ex2() if the argument is a
   2884  * colon-separated pair, {algorithm}:{key}.
   2885  * If not, it implies EVP_PKEY_verify_recover_init_ex()
   2886  */
   2887 static int verify_recover_test_init(EVP_TEST *t, const char *name)
   2888 {
   2889     if (strchr(name, ':') != NULL)
   2890         return pkey_test_init_ex2(t, name, 1,
   2891             EVP_PKEY_verify_recover_init_ex2,
   2892             EVP_PKEY_verify_recover);
   2893     return pkey_test_init(t, name, 1, EVP_PKEY_verify_recover_init_ex,
   2894         EVP_PKEY_verify_recover);
   2895 }
   2896 
   2897 static const EVP_TEST_METHOD pverify_recover_test_method = {
   2898     "VerifyRecover",
   2899     verify_recover_test_init,
   2900     pkey_test_cleanup,
   2901     pkey_test_parse,
   2902     pkey_test_run
   2903 };
   2904 
   2905 static int decrypt_test_init(EVP_TEST *t, const char *name)
   2906 {
   2907     return pkey_test_init(t, name, 0, EVP_PKEY_decrypt_init_ex,
   2908         EVP_PKEY_decrypt);
   2909 }
   2910 
   2911 static const EVP_TEST_METHOD pdecrypt_test_method = {
   2912     "Decrypt",
   2913     decrypt_test_init,
   2914     pkey_test_cleanup,
   2915     pkey_test_parse,
   2916     pkey_test_run
   2917 };
   2918 
   2919 /*
   2920  * "Verify" implies EVP_PKEY_verify_init_ex2() if the argument is a
   2921  * colon-separated pair, {algorithm}:{key}.
   2922  * If not, it implies EVP_PKEY_verify_init_ex()
   2923  */
   2924 static int verify_test_init(EVP_TEST *t, const char *name)
   2925 {
   2926     if (strchr(name, ':') != NULL)
   2927         return pkey_test_init_ex2(t, name, 1,
   2928             EVP_PKEY_verify_init_ex2, NULL);
   2929     return pkey_test_init(t, name, 1, EVP_PKEY_verify_init_ex, NULL);
   2930 }
   2931 
   2932 static int verify_test_run(EVP_TEST *t)
   2933 {
   2934     int ret = 1;
   2935     PKEY_DATA *kdata = t->data;
   2936 
   2937     if (!pkey_test_run_init(t))
   2938         goto err;
   2939     if (EVP_PKEY_verify(kdata->ctx, kdata->output, kdata->output_len,
   2940             kdata->input, kdata->input_len)
   2941         <= 0) {
   2942         t->err = "VERIFY_ERROR";
   2943         goto err;
   2944     }
   2945     if (!pkey_check_fips_approved(kdata->ctx, t))
   2946         ret = 0;
   2947 err:
   2948     return ret;
   2949 }
   2950 
   2951 static const EVP_TEST_METHOD pverify_test_method = {
   2952     "Verify",
   2953     verify_test_init,
   2954     pkey_test_cleanup,
   2955     pkey_test_parse,
   2956     verify_test_run
   2957 };
   2958 
   2959 /*
   2960  * "Verify-Message" is like "Verify", but uses EVP_PKEY_verify_message_init()
   2961  * The argument must be a colon separated pair, {algorithm}:{key}
   2962  */
   2963 static int verify_message_test_init(EVP_TEST *t, const char *name)
   2964 {
   2965     return pkey_test_init_ex2(t, name, 0,
   2966         EVP_PKEY_verify_message_init, NULL);
   2967 }
   2968 
   2969 static const EVP_TEST_METHOD pverify_message_test_method = {
   2970     "Verify-Message",
   2971     verify_message_test_init,
   2972     pkey_test_cleanup,
   2973     pkey_test_parse,
   2974     verify_test_run
   2975 };
   2976 
   2977 /*
   2978  * "Verify-Message-Public" is like "Verify-Message", but uses a public key
   2979  * instead of a private key.
   2980  * The argument must be a colon separated pair, {algorithm}:{key}
   2981  */
   2982 static int verify_message_public_test_init(EVP_TEST *t, const char *name)
   2983 {
   2984     return pkey_test_init_ex2(t, name, 1,
   2985         EVP_PKEY_verify_message_init, NULL);
   2986 }
   2987 
   2988 static const EVP_TEST_METHOD pverify_message_public_test_method = {
   2989     "Verify-Message-Public",
   2990     verify_message_public_test_init,
   2991     pkey_test_cleanup,
   2992     pkey_test_parse,
   2993     verify_test_run
   2994 };
   2995 
   2996 static int pderive_test_init(EVP_TEST *t, const char *name)
   2997 {
   2998     return pkey_test_init(t, name, 0, EVP_PKEY_derive_init_ex, 0);
   2999 }
   3000 
   3001 static int pderive_test_parse(EVP_TEST *t,
   3002     const char *keyword, const char *value)
   3003 {
   3004     PKEY_DATA *kdata = t->data;
   3005     int validate = 0;
   3006 
   3007     if (strcmp(keyword, "PeerKeyValidate") == 0)
   3008         validate = 1;
   3009 
   3010     if (validate || strcmp(keyword, "PeerKey") == 0) {
   3011         EVP_PKEY *peer = NULL;
   3012 
   3013         kdata->validate = validate;
   3014         if (find_key(&peer, value, public_keys) == 0)
   3015             return -1;
   3016         kdata->peer = peer;
   3017         return 1;
   3018     }
   3019     if (strcmp(keyword, "SharedSecret") == 0)
   3020         return parse_bin(value, &kdata->output, &kdata->output_len);
   3021     if (strcmp(keyword, "Ctrl") == 0)
   3022         return pkey_add_control(t, kdata->controls, value);
   3023     if (strcmp(keyword, "CtrlInit") == 0)
   3024         return ctrladd(kdata->init_controls, value);
   3025     return 0;
   3026 }
   3027 
   3028 static int pderive_test_run(EVP_TEST *t)
   3029 {
   3030     EVP_PKEY_CTX *dctx = NULL;
   3031     PKEY_DATA *expected = t->data;
   3032     unsigned char *got = NULL;
   3033     size_t got_len;
   3034     int ret = 1;
   3035 
   3036     if (!pkey_test_run_init(t))
   3037         goto err;
   3038 
   3039     t->err = NULL;
   3040     if (EVP_PKEY_derive_set_peer_ex(expected->ctx, expected->peer,
   3041             expected->validate)
   3042         <= 0) {
   3043         t->err = "DERIVE_SET_PEER_ERROR";
   3044         goto err;
   3045     }
   3046 
   3047     if (!TEST_ptr(dctx = EVP_PKEY_CTX_dup(expected->ctx))) {
   3048         t->err = "DERIVE_ERROR";
   3049         goto err;
   3050     }
   3051 
   3052     if (EVP_PKEY_derive(dctx, NULL, &got_len) <= 0
   3053         || !TEST_size_t_ne(got_len, 0)) {
   3054         t->err = "DERIVE_ERROR";
   3055         goto err;
   3056     }
   3057     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
   3058         t->err = "DERIVE_ERROR";
   3059         goto err;
   3060     }
   3061     if (EVP_PKEY_derive(dctx, got, &got_len) <= 0) {
   3062         t->err = "DERIVE_ERROR";
   3063         goto err;
   3064     }
   3065     if (!memory_err_compare(t, "SHARED_SECRET_MISMATCH",
   3066             expected->output, expected->output_len,
   3067             got, got_len))
   3068         goto err;
   3069 
   3070     if (!pkey_check_fips_approved(dctx, t)) {
   3071         ret = 0;
   3072         goto err;
   3073     }
   3074     t->err = NULL;
   3075 err:
   3076     OPENSSL_free(got);
   3077     EVP_PKEY_CTX_free(dctx);
   3078     return ret;
   3079 }
   3080 
   3081 static const EVP_TEST_METHOD pderive_test_method = {
   3082     "Derive",
   3083     pderive_test_init,
   3084     pkey_test_cleanup,
   3085     pderive_test_parse,
   3086     pderive_test_run
   3087 };
   3088 
   3089 /**
   3090  **  PBE TESTS
   3091  **/
   3092 
   3093 typedef enum pbe_type_enum {
   3094     PBE_TYPE_INVALID = 0,
   3095     PBE_TYPE_SCRYPT,
   3096     PBE_TYPE_PBKDF2,
   3097     PBE_TYPE_PKCS12
   3098 } PBE_TYPE;
   3099 
   3100 typedef struct pbe_data_st {
   3101     PBE_TYPE pbe_type;
   3102     /* scrypt parameters */
   3103     uint64_t N, r, p, maxmem;
   3104     /* PKCS#12 parameters */
   3105     int id, iter;
   3106     const EVP_MD *md;
   3107     /* password */
   3108     unsigned char *pass;
   3109     size_t pass_len;
   3110     /* salt */
   3111     unsigned char *salt;
   3112     size_t salt_len;
   3113     /* Expected output */
   3114     unsigned char *key;
   3115     size_t key_len;
   3116 } PBE_DATA;
   3117 
   3118 #ifndef OPENSSL_NO_SCRYPT
   3119 /* Parse unsigned decimal 64 bit integer value */
   3120 static int parse_uint64(const char *value, uint64_t *pr)
   3121 {
   3122     const char *p = value;
   3123 
   3124     if (!TEST_true(*p)) {
   3125         TEST_info("Invalid empty integer value");
   3126         return -1;
   3127     }
   3128     for (*pr = 0; *p;) {
   3129         if (*pr > UINT64_MAX / 10) {
   3130             TEST_error("Integer overflow in string %s", value);
   3131             return -1;
   3132         }
   3133         *pr *= 10;
   3134         if (!TEST_true(isdigit((unsigned char)*p))) {
   3135             TEST_error("Invalid character in string %s", value);
   3136             return -1;
   3137         }
   3138         *pr += *p - '0';
   3139         p++;
   3140     }
   3141     return 1;
   3142 }
   3143 
   3144 static int scrypt_test_parse(EVP_TEST *t,
   3145     const char *keyword, const char *value)
   3146 {
   3147     PBE_DATA *pdata = t->data;
   3148 
   3149     if (strcmp(keyword, "N") == 0)
   3150         return parse_uint64(value, &pdata->N);
   3151     if (strcmp(keyword, "p") == 0)
   3152         return parse_uint64(value, &pdata->p);
   3153     if (strcmp(keyword, "r") == 0)
   3154         return parse_uint64(value, &pdata->r);
   3155     if (strcmp(keyword, "maxmem") == 0)
   3156         return parse_uint64(value, &pdata->maxmem);
   3157     return 0;
   3158 }
   3159 #endif
   3160 
   3161 static int pbkdf2_test_parse(EVP_TEST *t,
   3162     const char *keyword, const char *value)
   3163 {
   3164     PBE_DATA *pdata = t->data;
   3165 
   3166     if (strcmp(keyword, "iter") == 0) {
   3167         pdata->iter = atoi(value);
   3168         if (pdata->iter <= 0)
   3169             return -1;
   3170         return 1;
   3171     }
   3172     if (strcmp(keyword, "MD") == 0) {
   3173         pdata->md = EVP_get_digestbyname(value);
   3174         if (pdata->md == NULL)
   3175             return -1;
   3176         return 1;
   3177     }
   3178     return 0;
   3179 }
   3180 
   3181 static int pkcs12_test_parse(EVP_TEST *t,
   3182     const char *keyword, const char *value)
   3183 {
   3184     PBE_DATA *pdata = t->data;
   3185 
   3186     if (strcmp(keyword, "id") == 0) {
   3187         pdata->id = atoi(value);
   3188         if (pdata->id <= 0)
   3189             return -1;
   3190         return 1;
   3191     }
   3192     return pbkdf2_test_parse(t, keyword, value);
   3193 }
   3194 
   3195 static int pbe_test_init(EVP_TEST *t, const char *alg)
   3196 {
   3197     PBE_DATA *pdat;
   3198     PBE_TYPE pbe_type = PBE_TYPE_INVALID;
   3199 
   3200     if (is_kdf_disabled(alg)) {
   3201         TEST_info("skipping, '%s' is disabled", alg);
   3202         t->skip = 1;
   3203         return 1;
   3204     }
   3205     if (strcmp(alg, "scrypt") == 0) {
   3206         pbe_type = PBE_TYPE_SCRYPT;
   3207     } else if (strcmp(alg, "pbkdf2") == 0) {
   3208         pbe_type = PBE_TYPE_PBKDF2;
   3209     } else if (strcmp(alg, "pkcs12") == 0) {
   3210         pbe_type = PBE_TYPE_PKCS12;
   3211     } else {
   3212         TEST_error("Unknown pbe algorithm %s", alg);
   3213         return 0;
   3214     }
   3215     if (!TEST_ptr(pdat = OPENSSL_zalloc(sizeof(*pdat))))
   3216         return 0;
   3217     pdat->pbe_type = pbe_type;
   3218     t->data = pdat;
   3219     return 1;
   3220 }
   3221 
   3222 static void pbe_test_cleanup(EVP_TEST *t)
   3223 {
   3224     PBE_DATA *pdat = t->data;
   3225 
   3226     OPENSSL_free(pdat->pass);
   3227     OPENSSL_free(pdat->salt);
   3228     OPENSSL_free(pdat->key);
   3229 }
   3230 
   3231 static int pbe_test_parse(EVP_TEST *t,
   3232     const char *keyword, const char *value)
   3233 {
   3234     PBE_DATA *pdata = t->data;
   3235 
   3236     if (strcmp(keyword, "Password") == 0)
   3237         return parse_bin(value, &pdata->pass, &pdata->pass_len);
   3238     if (strcmp(keyword, "Salt") == 0)
   3239         return parse_bin(value, &pdata->salt, &pdata->salt_len);
   3240     if (strcmp(keyword, "Key") == 0)
   3241         return parse_bin(value, &pdata->key, &pdata->key_len);
   3242     if (pdata->pbe_type == PBE_TYPE_PBKDF2)
   3243         return pbkdf2_test_parse(t, keyword, value);
   3244     else if (pdata->pbe_type == PBE_TYPE_PKCS12)
   3245         return pkcs12_test_parse(t, keyword, value);
   3246 #ifndef OPENSSL_NO_SCRYPT
   3247     else if (pdata->pbe_type == PBE_TYPE_SCRYPT)
   3248         return scrypt_test_parse(t, keyword, value);
   3249 #endif
   3250     return 0;
   3251 }
   3252 
   3253 static int pbe_test_run(EVP_TEST *t)
   3254 {
   3255     PBE_DATA *expected = t->data;
   3256     unsigned char *key;
   3257     EVP_MD *fetched_digest = NULL;
   3258     OSSL_LIB_CTX *save_libctx;
   3259 
   3260     save_libctx = OSSL_LIB_CTX_set0_default(libctx);
   3261 
   3262     if (!TEST_ptr(key = OPENSSL_malloc(expected->key_len))) {
   3263         t->err = "INTERNAL_ERROR";
   3264         goto err;
   3265     }
   3266     if (expected->pbe_type == PBE_TYPE_PBKDF2) {
   3267         if (PKCS5_PBKDF2_HMAC((char *)expected->pass, expected->pass_len,
   3268                 expected->salt, expected->salt_len,
   3269                 expected->iter, expected->md,
   3270                 expected->key_len, key)
   3271             == 0) {
   3272             t->err = "PBKDF2_ERROR";
   3273             goto err;
   3274         }
   3275 #ifndef OPENSSL_NO_SCRYPT
   3276     } else if (expected->pbe_type == PBE_TYPE_SCRYPT) {
   3277         if (EVP_PBE_scrypt((const char *)expected->pass, expected->pass_len,
   3278                 expected->salt, expected->salt_len,
   3279                 expected->N, expected->r, expected->p,
   3280                 expected->maxmem, key, expected->key_len)
   3281             == 0) {
   3282             t->err = "SCRYPT_ERROR";
   3283             goto err;
   3284         }
   3285 #endif
   3286     } else if (expected->pbe_type == PBE_TYPE_PKCS12) {
   3287         fetched_digest = EVP_MD_fetch(libctx, EVP_MD_get0_name(expected->md),
   3288             propquery);
   3289         if (fetched_digest == NULL) {
   3290             t->err = "PKCS12_ERROR";
   3291             goto err;
   3292         }
   3293         if (PKCS12_key_gen_uni(expected->pass, expected->pass_len,
   3294                 expected->salt, expected->salt_len,
   3295                 expected->id, expected->iter, expected->key_len,
   3296                 key, fetched_digest)
   3297             == 0) {
   3298             t->err = "PKCS12_ERROR";
   3299             goto err;
   3300         }
   3301     }
   3302     if (!memory_err_compare(t, "KEY_MISMATCH", expected->key, expected->key_len,
   3303             key, expected->key_len))
   3304         goto err;
   3305 
   3306     t->err = NULL;
   3307 err:
   3308     EVP_MD_free(fetched_digest);
   3309     OPENSSL_free(key);
   3310     OSSL_LIB_CTX_set0_default(save_libctx);
   3311     return 1;
   3312 }
   3313 
   3314 static const EVP_TEST_METHOD pbe_test_method = {
   3315     "PBE",
   3316     pbe_test_init,
   3317     pbe_test_cleanup,
   3318     pbe_test_parse,
   3319     pbe_test_run
   3320 };
   3321 
   3322 /**
   3323  **  BASE64 TESTS
   3324  **/
   3325 
   3326 typedef enum {
   3327     BASE64_CANONICAL_ENCODING = 0,
   3328     BASE64_VALID_ENCODING = 1,
   3329     BASE64_INVALID_ENCODING = 2
   3330 } base64_encoding_type;
   3331 
   3332 typedef struct encode_data_st {
   3333     /* Input to encoding */
   3334     unsigned char *input;
   3335     size_t input_len;
   3336     /* Expected output */
   3337     unsigned char *output;
   3338     size_t output_len;
   3339     base64_encoding_type encoding;
   3340 } ENCODE_DATA;
   3341 
   3342 static int encode_test_init(EVP_TEST *t, const char *encoding)
   3343 {
   3344     ENCODE_DATA *edata;
   3345 
   3346     if (!TEST_ptr(edata = OPENSSL_zalloc(sizeof(*edata))))
   3347         return 0;
   3348     if (strcmp(encoding, "canonical") == 0) {
   3349         edata->encoding = BASE64_CANONICAL_ENCODING;
   3350     } else if (strcmp(encoding, "valid") == 0) {
   3351         edata->encoding = BASE64_VALID_ENCODING;
   3352     } else if (strcmp(encoding, "invalid") == 0) {
   3353         edata->encoding = BASE64_INVALID_ENCODING;
   3354         if (!TEST_ptr(t->expected_err = OPENSSL_strdup("DECODE_ERROR")))
   3355             goto err;
   3356     } else {
   3357         TEST_error("Bad encoding: %s."
   3358                    " Should be one of {canonical, valid, invalid}",
   3359             encoding);
   3360         goto err;
   3361     }
   3362     t->data = edata;
   3363     return 1;
   3364 err:
   3365     OPENSSL_free(edata);
   3366     return 0;
   3367 }
   3368 
   3369 static void encode_test_cleanup(EVP_TEST *t)
   3370 {
   3371     ENCODE_DATA *edata = t->data;
   3372 
   3373     OPENSSL_free(edata->input);
   3374     OPENSSL_free(edata->output);
   3375     memset(edata, 0, sizeof(*edata));
   3376 }
   3377 
   3378 static int encode_test_parse(EVP_TEST *t,
   3379     const char *keyword, const char *value)
   3380 {
   3381     ENCODE_DATA *edata = t->data;
   3382 
   3383     if (strcmp(keyword, "Input") == 0)
   3384         return parse_bin(value, &edata->input, &edata->input_len);
   3385     if (strcmp(keyword, "Output") == 0)
   3386         return parse_bin(value, &edata->output, &edata->output_len);
   3387     return 0;
   3388 }
   3389 
   3390 static int encode_test_run(EVP_TEST *t)
   3391 {
   3392     ENCODE_DATA *expected = t->data;
   3393     unsigned char *encode_out = NULL, *decode_out = NULL;
   3394     int output_len, chunk_len;
   3395     EVP_ENCODE_CTX *decode_ctx = NULL, *encode_ctx = NULL;
   3396     size_t input_len, donelen, decode_length;
   3397 
   3398     if (!TEST_ptr(decode_ctx = EVP_ENCODE_CTX_new())) {
   3399         t->err = "INTERNAL_ERROR";
   3400         goto err;
   3401     }
   3402 
   3403     if (expected->encoding == BASE64_CANONICAL_ENCODING) {
   3404 
   3405         if (!TEST_ptr(encode_ctx = EVP_ENCODE_CTX_new())
   3406             || !TEST_ptr(encode_out = OPENSSL_malloc(EVP_ENCODE_LENGTH(expected->input_len))))
   3407             goto err;
   3408 
   3409         EVP_EncodeInit(encode_ctx);
   3410 
   3411         input_len = expected->input_len;
   3412         donelen = 0;
   3413         output_len = 0;
   3414         do {
   3415             size_t current_len = (size_t)data_chunk_size;
   3416 
   3417             if (data_chunk_size == 0 || (size_t)data_chunk_size > input_len)
   3418                 current_len = input_len;
   3419             if (!TEST_true(EVP_EncodeUpdate(encode_ctx, encode_out, &chunk_len,
   3420                     expected->input + donelen,
   3421                     current_len)))
   3422                 goto err;
   3423             donelen += current_len;
   3424             input_len -= current_len;
   3425             output_len += chunk_len;
   3426         } while (input_len > 0);
   3427 
   3428         EVP_EncodeFinal(encode_ctx, encode_out + output_len, &chunk_len);
   3429         output_len += chunk_len;
   3430 
   3431         if (!memory_err_compare(t, "BAD_ENCODING",
   3432                 expected->output, expected->output_len,
   3433                 encode_out, output_len))
   3434             goto err;
   3435     }
   3436 
   3437     decode_length = EVP_DECODE_LENGTH(expected->output_len);
   3438     if (!TEST_ptr(decode_out = OPENSSL_malloc(decode_length)))
   3439         goto err;
   3440     /*
   3441      * Fill memory with non-zeros
   3442      * to check that decoding does not place redundant zeros.
   3443      */
   3444     memset(decode_out, 0xff, decode_length);
   3445 
   3446     output_len = 0;
   3447     EVP_DecodeInit(decode_ctx);
   3448 
   3449     input_len = expected->output_len;
   3450     donelen = 0;
   3451     do {
   3452         size_t current_len = (size_t)data_chunk_size;
   3453 
   3454         if (data_chunk_size == 0 || (size_t)data_chunk_size > input_len)
   3455             current_len = input_len;
   3456         if (EVP_DecodeUpdate(decode_ctx, decode_out + output_len, &chunk_len,
   3457                 expected->output + donelen, current_len)
   3458             < 0) {
   3459             t->err = "DECODE_ERROR";
   3460             goto err;
   3461         }
   3462         donelen += current_len;
   3463         input_len -= current_len;
   3464         output_len += chunk_len;
   3465     } while (input_len > 0);
   3466 
   3467     if (EVP_DecodeFinal(decode_ctx, decode_out + output_len, &chunk_len) != 1) {
   3468         t->err = "DECODE_ERROR";
   3469         goto err;
   3470     }
   3471     output_len += chunk_len;
   3472 
   3473     if (expected->encoding != BASE64_INVALID_ENCODING
   3474         && !memory_err_compare(t, "BAD_DECODING",
   3475             expected->input, expected->input_len,
   3476             decode_out, output_len)) {
   3477         t->err = "BAD_DECODING";
   3478         goto err;
   3479     }
   3480 
   3481     for (; output_len < (int)decode_length; output_len++) {
   3482         if (decode_out[output_len] != 0xff) {
   3483             t->err = "BAD_DECODING";
   3484             goto err;
   3485         }
   3486     }
   3487 
   3488     t->err = NULL;
   3489 err:
   3490     OPENSSL_free(encode_out);
   3491     OPENSSL_free(decode_out);
   3492     EVP_ENCODE_CTX_free(decode_ctx);
   3493     EVP_ENCODE_CTX_free(encode_ctx);
   3494     return 1;
   3495 }
   3496 
   3497 static const EVP_TEST_METHOD encode_test_method = {
   3498     "Encoding",
   3499     encode_test_init,
   3500     encode_test_cleanup,
   3501     encode_test_parse,
   3502     encode_test_run,
   3503 };
   3504 
   3505 /**
   3506  **  RAND TESTS
   3507  **/
   3508 #define MAX_RAND_REPEATS 15
   3509 
   3510 typedef struct rand_data_pass_st {
   3511     unsigned char *entropy;
   3512     unsigned char *reseed_entropy;
   3513     unsigned char *nonce;
   3514     unsigned char *pers;
   3515     unsigned char *reseed_addin;
   3516     unsigned char *addinA;
   3517     unsigned char *addinB;
   3518     unsigned char *pr_entropyA;
   3519     unsigned char *pr_entropyB;
   3520     unsigned char *output;
   3521     size_t entropy_len, nonce_len, pers_len, addinA_len, addinB_len,
   3522         pr_entropyA_len, pr_entropyB_len, output_len, reseed_entropy_len,
   3523         reseed_addin_len;
   3524 } RAND_DATA_PASS;
   3525 
   3526 typedef struct rand_data_st {
   3527     /* Context for this operation */
   3528     EVP_RAND_CTX *ctx;
   3529     EVP_RAND_CTX *parent;
   3530     int n;
   3531     int prediction_resistance;
   3532     int use_df;
   3533     unsigned int generate_bits;
   3534     char *cipher;
   3535     char *digest;
   3536     STACK_OF(OPENSSL_STRING) *init_controls; /* collection of controls */
   3537 
   3538     /* Expected output */
   3539     RAND_DATA_PASS data[MAX_RAND_REPEATS];
   3540 } RAND_DATA;
   3541 
   3542 static int rand_test_init(EVP_TEST *t, const char *name)
   3543 {
   3544     RAND_DATA *rdata;
   3545     EVP_RAND *rand;
   3546     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
   3547     unsigned int strength = 256;
   3548 
   3549     if (!TEST_ptr(rdata = OPENSSL_zalloc(sizeof(*rdata))))
   3550         return 0;
   3551 
   3552     /* TEST-RAND is available in the FIPS provider but not with "fips=yes" */
   3553     rand = EVP_RAND_fetch(libctx, "TEST-RAND", "-fips");
   3554     if (rand == NULL)
   3555         goto err;
   3556     rdata->parent = EVP_RAND_CTX_new(rand, NULL);
   3557     EVP_RAND_free(rand);
   3558     if (rdata->parent == NULL)
   3559         goto err;
   3560 
   3561     *params = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_STRENGTH, &strength);
   3562     if (!EVP_RAND_CTX_set_params(rdata->parent, params))
   3563         goto err;
   3564 
   3565     rand = EVP_RAND_fetch(libctx, name, propquery);
   3566     if (rand == NULL)
   3567         goto err;
   3568     rdata->ctx = EVP_RAND_CTX_new(rand, rdata->parent);
   3569     EVP_RAND_free(rand);
   3570     if (rdata->ctx == NULL)
   3571         goto err;
   3572     rdata->init_controls = sk_OPENSSL_STRING_new_null();
   3573 
   3574     rdata->n = -1;
   3575     t->data = rdata;
   3576     return 1;
   3577 err:
   3578     EVP_RAND_CTX_free(rdata->parent);
   3579     OPENSSL_free(rdata);
   3580     return 0;
   3581 }
   3582 
   3583 static void rand_test_cleanup(EVP_TEST *t)
   3584 {
   3585     RAND_DATA *rdata = t->data;
   3586     int i;
   3587 
   3588     ctrlfree(rdata->init_controls);
   3589     OPENSSL_free(rdata->cipher);
   3590     OPENSSL_free(rdata->digest);
   3591 
   3592     for (i = 0; i <= rdata->n; i++) {
   3593         OPENSSL_free(rdata->data[i].entropy);
   3594         OPENSSL_free(rdata->data[i].reseed_entropy);
   3595         OPENSSL_free(rdata->data[i].nonce);
   3596         OPENSSL_free(rdata->data[i].pers);
   3597         OPENSSL_free(rdata->data[i].reseed_addin);
   3598         OPENSSL_free(rdata->data[i].addinA);
   3599         OPENSSL_free(rdata->data[i].addinB);
   3600         OPENSSL_free(rdata->data[i].pr_entropyA);
   3601         OPENSSL_free(rdata->data[i].pr_entropyB);
   3602         OPENSSL_free(rdata->data[i].output);
   3603     }
   3604     EVP_RAND_CTX_free(rdata->ctx);
   3605     EVP_RAND_CTX_free(rdata->parent);
   3606 }
   3607 
   3608 static int rand_test_parse(EVP_TEST *t,
   3609     const char *keyword, const char *value)
   3610 {
   3611     RAND_DATA *rdata = t->data;
   3612     RAND_DATA_PASS *item;
   3613     const char *p;
   3614     int n;
   3615 
   3616     if ((p = strchr(keyword, '.')) != NULL) {
   3617         n = atoi(++p);
   3618         if (n >= MAX_RAND_REPEATS)
   3619             return 0;
   3620         if (n > rdata->n)
   3621             rdata->n = n;
   3622         item = rdata->data + n;
   3623         if (HAS_PREFIX(keyword, "Entropy."))
   3624             return parse_bin(value, &item->entropy, &item->entropy_len);
   3625         if (HAS_PREFIX(keyword, "ReseedEntropy."))
   3626             return parse_bin(value, &item->reseed_entropy,
   3627                 &item->reseed_entropy_len);
   3628         if (HAS_PREFIX(keyword, "Nonce."))
   3629             return parse_bin(value, &item->nonce, &item->nonce_len);
   3630         if (HAS_PREFIX(keyword, "PersonalisationString."))
   3631             return parse_bin(value, &item->pers, &item->pers_len);
   3632         if (HAS_PREFIX(keyword, "ReseedAdditionalInput."))
   3633             return parse_bin(value, &item->reseed_addin,
   3634                 &item->reseed_addin_len);
   3635         if (HAS_PREFIX(keyword, "AdditionalInputA."))
   3636             return parse_bin(value, &item->addinA, &item->addinA_len);
   3637         if (HAS_PREFIX(keyword, "AdditionalInputB."))
   3638             return parse_bin(value, &item->addinB, &item->addinB_len);
   3639         if (HAS_PREFIX(keyword, "EntropyPredictionResistanceA."))
   3640             return parse_bin(value, &item->pr_entropyA, &item->pr_entropyA_len);
   3641         if (HAS_PREFIX(keyword, "EntropyPredictionResistanceB."))
   3642             return parse_bin(value, &item->pr_entropyB, &item->pr_entropyB_len);
   3643         if (HAS_PREFIX(keyword, "Output."))
   3644             return parse_bin(value, &item->output, &item->output_len);
   3645     } else {
   3646         if (strcmp(keyword, "Cipher") == 0)
   3647             return TEST_ptr(rdata->cipher = OPENSSL_strdup(value));
   3648         if (strcmp(keyword, "Digest") == 0)
   3649             return TEST_ptr(rdata->digest = OPENSSL_strdup(value));
   3650         if (strcmp(keyword, "DerivationFunction") == 0) {
   3651             rdata->use_df = atoi(value) != 0;
   3652             return 1;
   3653         }
   3654         if (strcmp(keyword, "GenerateBits") == 0) {
   3655             if ((n = atoi(value)) <= 0 || n % 8 != 0)
   3656                 return 0;
   3657             rdata->generate_bits = (unsigned int)n;
   3658             return 1;
   3659         }
   3660         if (strcmp(keyword, "PredictionResistance") == 0) {
   3661             rdata->prediction_resistance = atoi(value) != 0;
   3662             return 1;
   3663         }
   3664         if (strcmp(keyword, "CtrlInit") == 0)
   3665             return ctrladd(rdata->init_controls, value);
   3666     }
   3667     return 0;
   3668 }
   3669 
   3670 static int rand_test_run(EVP_TEST *t)
   3671 {
   3672     RAND_DATA *expected = t->data;
   3673     RAND_DATA_PASS *item;
   3674     unsigned char *got;
   3675     size_t got_len = expected->generate_bits / 8;
   3676     OSSL_PARAM params[8], *p = params;
   3677     int i = -1, ret = 0;
   3678     unsigned int strength;
   3679     unsigned char *z;
   3680     size_t params_n = 0, params_allocated_n = 0;
   3681 
   3682     if (!TEST_ptr(got = OPENSSL_malloc(got_len)))
   3683         return 0;
   3684 
   3685     if (sk_OPENSSL_STRING_num(expected->init_controls) > 0) {
   3686         if (!ctrl2params(t, expected->init_controls,
   3687                 NULL,
   3688                 params, OSSL_NELEM(params), &params_n))
   3689             goto err;
   3690     }
   3691     p = params + params_n;
   3692 
   3693     *p++ = OSSL_PARAM_construct_int(OSSL_DRBG_PARAM_USE_DF, &expected->use_df);
   3694     if (expected->cipher != NULL)
   3695         *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_CIPHER,
   3696             expected->cipher, 0);
   3697     if (expected->digest != NULL)
   3698         *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_DIGEST,
   3699 	    expected->digest, 0);
   3700     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_MAC, (char *)(intptr_t)"HMAC", 0);
   3701     *p = OSSL_PARAM_construct_end();
   3702     if (!EVP_RAND_CTX_set_params(expected->ctx, params)) {
   3703         if (t->expect_unapproved == 0) {
   3704             t->err = "EVP_RAND_CTX_set_params";
   3705             ret = 1;
   3706         }
   3707         goto err;
   3708     }
   3709     ctrl2params_free(params, params_n, params_allocated_n);
   3710     params_n = 0;
   3711 
   3712     strength = EVP_RAND_get_strength(expected->ctx);
   3713     for (i = 0; i <= expected->n; i++) {
   3714         item = expected->data + i;
   3715 
   3716         p = params;
   3717         z = item->entropy != NULL ? item->entropy : (unsigned char *)(intptr_t)"";
   3718         *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY,
   3719 	    z, item->entropy_len);
   3720         z = item->nonce != NULL ? item->nonce : (unsigned char *)(intptr_t)"";
   3721         *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_NONCE,
   3722             z, item->nonce_len);
   3723         *p = OSSL_PARAM_construct_end();
   3724         if (!TEST_true(EVP_RAND_instantiate(expected->parent, strength,
   3725                 0, NULL, 0, params)))
   3726             goto err;
   3727 
   3728         z = item->pers != NULL ? item->pers : (unsigned char *)(intptr_t)"";
   3729         if (!TEST_true(EVP_RAND_instantiate(expected->ctx, strength,
   3730                 expected->prediction_resistance, z,
   3731                 item->pers_len, NULL)))
   3732             goto err;
   3733 
   3734         if (item->reseed_entropy != NULL) {
   3735             params[0] = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY, item->reseed_entropy,
   3736                 item->reseed_entropy_len);
   3737             params[1] = OSSL_PARAM_construct_end();
   3738             if (!TEST_true(EVP_RAND_CTX_set_params(expected->parent, params)))
   3739                 goto err;
   3740 
   3741             if (!TEST_true(EVP_RAND_reseed(expected->ctx, expected->prediction_resistance,
   3742                     NULL, 0, item->reseed_addin,
   3743                     item->reseed_addin_len)))
   3744                 goto err;
   3745         }
   3746         if (item->pr_entropyA != NULL) {
   3747             params[0] = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY, item->pr_entropyA,
   3748                 item->pr_entropyA_len);
   3749             params[1] = OSSL_PARAM_construct_end();
   3750             if (!TEST_true(EVP_RAND_CTX_set_params(expected->parent, params)))
   3751                 goto err;
   3752         }
   3753         if (!TEST_true(EVP_RAND_generate(expected->ctx, got, got_len,
   3754                 strength, expected->prediction_resistance,
   3755                 item->addinA, item->addinA_len)))
   3756             goto err;
   3757 
   3758         if (item->pr_entropyB != NULL) {
   3759             params[0] = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY, item->pr_entropyB,
   3760                 item->pr_entropyB_len);
   3761             params[1] = OSSL_PARAM_construct_end();
   3762             if (!TEST_true(EVP_RAND_CTX_set_params(expected->parent, params)))
   3763                 goto err;
   3764         }
   3765         if (!TEST_true(EVP_RAND_generate(expected->ctx, got, got_len,
   3766                 strength, expected->prediction_resistance,
   3767                 item->addinB, item->addinB_len)))
   3768             goto err;
   3769         if (!TEST_mem_eq(got, got_len, item->output, item->output_len))
   3770             goto err;
   3771         if (!rand_check_fips_approved(expected->ctx, t))
   3772             goto err;
   3773         if (!TEST_true(EVP_RAND_uninstantiate(expected->ctx))
   3774             || !TEST_true(EVP_RAND_uninstantiate(expected->parent))
   3775             || !TEST_true(EVP_RAND_verify_zeroization(expected->ctx))
   3776             || !TEST_int_eq(EVP_RAND_get_state(expected->ctx),
   3777                 EVP_RAND_STATE_UNINITIALISED))
   3778             goto err;
   3779     }
   3780     t->err = NULL;
   3781     ret = 1;
   3782 
   3783 err:
   3784     if (ret == 0 && i >= 0)
   3785         TEST_info("Error in test case %d of %d\n", i, expected->n + 1);
   3786     OPENSSL_free(got);
   3787     ctrl2params_free(params, params_n, params_allocated_n);
   3788     return ret;
   3789 }
   3790 
   3791 static const EVP_TEST_METHOD rand_test_method = {
   3792     "RAND",
   3793     rand_test_init,
   3794     rand_test_cleanup,
   3795     rand_test_parse,
   3796     rand_test_run
   3797 };
   3798 
   3799 /**
   3800  **  KDF TESTS
   3801  **/
   3802 typedef struct kdf_data_st {
   3803     /* Context for this operation */
   3804     EVP_KDF_CTX *ctx;
   3805     /* Expected output */
   3806     unsigned char *output;
   3807     size_t output_len;
   3808     OSSL_PARAM params[20];
   3809     OSSL_PARAM *p;
   3810     STACK_OF(OPENSSL_STRING) *init_controls; /* collection of controls */
   3811 } KDF_DATA;
   3812 
   3813 /*
   3814  * Perform public key operation setup: lookup key, allocated ctx and call
   3815  * the appropriate initialisation function
   3816  */
   3817 static int kdf_test_init(EVP_TEST *t, const char *name)
   3818 {
   3819     KDF_DATA *kdata;
   3820     EVP_KDF *kdf;
   3821 
   3822     if (is_kdf_disabled(name)) {
   3823         TEST_info("skipping, '%s' is disabled", name);
   3824         t->skip = 1;
   3825         return 1;
   3826     }
   3827 
   3828     if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata))))
   3829         return 0;
   3830     kdata->p = kdata->params;
   3831     *kdata->p = OSSL_PARAM_construct_end();
   3832 
   3833     kdf = EVP_KDF_fetch(libctx, name, propquery);
   3834     if (kdf == NULL) {
   3835         OPENSSL_free(kdata);
   3836         return 0;
   3837     }
   3838     kdata->ctx = EVP_KDF_CTX_new(kdf);
   3839     EVP_KDF_free(kdf);
   3840     if (kdata->ctx == NULL) {
   3841         OPENSSL_free(kdata);
   3842         return 0;
   3843     }
   3844     t->data = kdata;
   3845     kdata->init_controls = sk_OPENSSL_STRING_new_null();
   3846     return 1;
   3847 }
   3848 
   3849 static void kdf_test_cleanup(EVP_TEST *t)
   3850 {
   3851     KDF_DATA *kdata = t->data;
   3852     OSSL_PARAM *p;
   3853 
   3854     ctrlfree(kdata->init_controls);
   3855     for (p = kdata->params; p->key != NULL; p++)
   3856         OPENSSL_free(p->data);
   3857     OPENSSL_free(kdata->output);
   3858     EVP_KDF_CTX_free(kdata->ctx);
   3859 }
   3860 
   3861 static int kdf_test_ctrl(EVP_TEST *t, EVP_KDF_CTX *kctx,
   3862     const char *value)
   3863 {
   3864     KDF_DATA *kdata = t->data;
   3865     int rv;
   3866     char *p, *name;
   3867     const OSSL_PARAM *defs = EVP_KDF_settable_ctx_params(EVP_KDF_CTX_kdf(kctx));
   3868 
   3869     if (!TEST_ptr(name = OPENSSL_strdup(value)))
   3870         return 0;
   3871     p = strchr(name, ':');
   3872     if (p == NULL)
   3873         p = "";
   3874     else
   3875         *p++ = '\0';
   3876 
   3877     if (strcmp(name, "r") == 0
   3878         && OSSL_PARAM_locate_const(defs, name) == NULL) {
   3879         TEST_info("skipping, setting 'r' is unsupported");
   3880         t->skip = 1;
   3881         goto end;
   3882     }
   3883 
   3884     if (strcmp(name, "lanes") == 0
   3885         && OSSL_PARAM_locate_const(defs, name) == NULL) {
   3886         TEST_info("skipping, setting 'lanes' is unsupported");
   3887         t->skip = 1;
   3888         goto end;
   3889     }
   3890 
   3891     if (strcmp(name, "iter") == 0
   3892         && OSSL_PARAM_locate_const(defs, name) == NULL) {
   3893         TEST_info("skipping, setting 'iter' is unsupported");
   3894         t->skip = 1;
   3895         goto end;
   3896     }
   3897 
   3898     if (strcmp(name, "memcost") == 0
   3899         && OSSL_PARAM_locate_const(defs, name) == NULL) {
   3900         TEST_info("skipping, setting 'memcost' is unsupported");
   3901         t->skip = 1;
   3902         goto end;
   3903     }
   3904 
   3905     if (strcmp(name, "secret") == 0
   3906         && OSSL_PARAM_locate_const(defs, name) == NULL) {
   3907         TEST_info("skipping, setting 'secret' is unsupported");
   3908         t->skip = 1;
   3909         goto end;
   3910     }
   3911 
   3912     if (strcmp(name, "pass") == 0
   3913         && OSSL_PARAM_locate_const(defs, name) == NULL) {
   3914         TEST_info("skipping, setting 'pass' is unsupported");
   3915         t->skip = 1;
   3916         goto end;
   3917     }
   3918 
   3919     if (strcmp(name, "ad") == 0
   3920         && OSSL_PARAM_locate_const(defs, name) == NULL) {
   3921         TEST_info("skipping, setting 'ad' is unsupported");
   3922         t->skip = 1;
   3923         goto end;
   3924     }
   3925 
   3926     rv = OSSL_PARAM_allocate_from_text(kdata->p, defs, name, p,
   3927         strlen(p), NULL);
   3928     *++kdata->p = OSSL_PARAM_construct_end();
   3929     if (!rv) {
   3930         t->err = "KDF_PARAM_ERROR";
   3931         OPENSSL_free(name);
   3932         return 0;
   3933     }
   3934     if (strcmp(name, "digest") == 0) {
   3935         if (is_digest_disabled(p)) {
   3936             TEST_info("skipping, '%s' is disabled", p);
   3937             t->skip = 1;
   3938         }
   3939         goto end;
   3940     }
   3941 
   3942     if ((strcmp(name, "cipher") == 0
   3943             || strcmp(name, "cekalg") == 0)
   3944         && is_cipher_disabled(p)) {
   3945         TEST_info("skipping, '%s' is disabled", p);
   3946         t->skip = 1;
   3947         goto end;
   3948     }
   3949     if ((strcmp(name, "mac") == 0)
   3950         && is_mac_disabled(p)) {
   3951         TEST_info("skipping, '%s' is disabled", p);
   3952         t->skip = 1;
   3953     }
   3954 end:
   3955     OPENSSL_free(name);
   3956     return 1;
   3957 }
   3958 
   3959 static int kdf_test_parse(EVP_TEST *t,
   3960     const char *keyword, const char *value)
   3961 {
   3962     KDF_DATA *kdata = t->data;
   3963 
   3964     if (strcmp(keyword, "Output") == 0)
   3965         return parse_bin(value, &kdata->output, &kdata->output_len);
   3966     if (strcmp(keyword, "CtrlInit") == 0)
   3967         return ctrladd(kdata->init_controls, value);
   3968     if (HAS_PREFIX(keyword, "Ctrl"))
   3969         return kdf_test_ctrl(t, kdata->ctx, value);
   3970     return 0;
   3971 }
   3972 
   3973 static int kdf_test_run(EVP_TEST *t)
   3974 {
   3975     int ret = 1;
   3976     KDF_DATA *expected = t->data;
   3977     unsigned char *got = NULL;
   3978     size_t got_len = expected->output_len;
   3979     EVP_KDF_CTX *ctx;
   3980     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
   3981     size_t params_n = 0, params_allocated_n = 0;
   3982 
   3983     if (sk_OPENSSL_STRING_num(expected->init_controls) > 0) {
   3984         if (!ctrl2params(t, expected->init_controls,
   3985                 NULL,
   3986                 params, OSSL_NELEM(params), &params_n))
   3987             goto err;
   3988         if (!EVP_KDF_CTX_set_params(expected->ctx, params)) {
   3989             t->err = "KDF_CTRL_ERROR";
   3990             goto err;
   3991         }
   3992     }
   3993 
   3994     if (!EVP_KDF_CTX_set_params(expected->ctx, expected->params)) {
   3995         t->err = "KDF_CTRL_ERROR";
   3996         goto err;
   3997     }
   3998     if (!TEST_ptr(got = OPENSSL_malloc(got_len == 0 ? 1 : got_len))) {
   3999         t->err = "INTERNAL_ERROR";
   4000         goto err;
   4001     }
   4002     /* FIPS(3.0.0): can't dup KDF contexts #17572 */
   4003     if (fips_provider_version_gt(libctx, 3, 0, 0)
   4004         && (ctx = EVP_KDF_CTX_dup(expected->ctx)) != NULL) {
   4005         EVP_KDF_CTX_free(expected->ctx);
   4006         expected->ctx = ctx;
   4007     }
   4008     if (EVP_KDF_derive(expected->ctx, got, got_len, NULL) <= 0) {
   4009         t->err = "KDF_DERIVE_ERROR";
   4010         goto err;
   4011     }
   4012     if (!kdf_check_fips_approved(expected->ctx, t)) {
   4013         ret = 0;
   4014         goto err;
   4015     }
   4016     if (!memory_err_compare(t, "KDF_MISMATCH",
   4017             expected->output, expected->output_len,
   4018             got, got_len))
   4019         goto err;
   4020 
   4021     t->err = NULL;
   4022 
   4023 err:
   4024     ctrl2params_free(params, params_n, params_allocated_n);
   4025     OPENSSL_free(got);
   4026     return ret;
   4027 }
   4028 
   4029 static const EVP_TEST_METHOD kdf_test_method = {
   4030     "KDF",
   4031     kdf_test_init,
   4032     kdf_test_cleanup,
   4033     kdf_test_parse,
   4034     kdf_test_run
   4035 };
   4036 
   4037 /**
   4038  **  PKEY KDF TESTS
   4039  **/
   4040 
   4041 typedef struct pkey_kdf_data_st {
   4042     /* Context for this operation */
   4043     EVP_PKEY_CTX *ctx;
   4044     /* Expected output */
   4045     unsigned char *output;
   4046     size_t output_len;
   4047 } PKEY_KDF_DATA;
   4048 
   4049 /*
   4050  * Perform public key operation setup: lookup key, allocated ctx and call
   4051  * the appropriate initialisation function
   4052  */
   4053 static int pkey_kdf_test_init(EVP_TEST *t, const char *name)
   4054 {
   4055     PKEY_KDF_DATA *kdata = NULL;
   4056 
   4057     if (is_kdf_disabled(name)) {
   4058         TEST_info("skipping, '%s' is disabled", name);
   4059         t->skip = 1;
   4060         return 1;
   4061     }
   4062 
   4063     if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata))))
   4064         return 0;
   4065 
   4066     kdata->ctx = EVP_PKEY_CTX_new_from_name(libctx, name, propquery);
   4067     if (kdata->ctx == NULL
   4068         || EVP_PKEY_derive_init(kdata->ctx) <= 0)
   4069         goto err;
   4070 
   4071     t->data = kdata;
   4072     return 1;
   4073 err:
   4074     EVP_PKEY_CTX_free(kdata->ctx);
   4075     OPENSSL_free(kdata);
   4076     return 0;
   4077 }
   4078 
   4079 static void pkey_kdf_test_cleanup(EVP_TEST *t)
   4080 {
   4081     PKEY_KDF_DATA *kdata = t->data;
   4082 
   4083     OPENSSL_free(kdata->output);
   4084     EVP_PKEY_CTX_free(kdata->ctx);
   4085 }
   4086 
   4087 static int pkey_kdf_test_parse(EVP_TEST *t,
   4088     const char *keyword, const char *value)
   4089 {
   4090     PKEY_KDF_DATA *kdata = t->data;
   4091 
   4092     if (strcmp(keyword, "Output") == 0)
   4093         return parse_bin(value, &kdata->output, &kdata->output_len);
   4094     if (HAS_PREFIX(keyword, "Ctrl"))
   4095         return pkey_test_ctrl(t, kdata->ctx, value);
   4096     return 0;
   4097 }
   4098 
   4099 static int pkey_kdf_test_run(EVP_TEST *t)
   4100 {
   4101     int ret = 1;
   4102     PKEY_KDF_DATA *expected = t->data;
   4103     unsigned char *got = NULL;
   4104     size_t got_len = 0;
   4105 
   4106     if (fips_provider_version_eq(libctx, 3, 0, 0)) {
   4107         /* FIPS(3.0.0): can't deal with oversized output buffers #18533 */
   4108         got_len = expected->output_len;
   4109     } else {
   4110         /* Find out the KDF output size */
   4111         if (EVP_PKEY_derive(expected->ctx, NULL, &got_len) <= 0) {
   4112             t->err = "INTERNAL_ERROR";
   4113             goto err;
   4114         }
   4115 
   4116         /*
   4117          * We may get an absurd output size, which signals that anything goes.
   4118          * If not, we specify a too big buffer for the output, to test that
   4119          * EVP_PKEY_derive() can cope with it.
   4120          */
   4121         if (got_len == SIZE_MAX || got_len == 0)
   4122             got_len = expected->output_len;
   4123         else
   4124             got_len = expected->output_len * 2;
   4125     }
   4126 
   4127     if (!TEST_ptr(got = OPENSSL_malloc(got_len == 0 ? 1 : got_len))) {
   4128         t->err = "INTERNAL_ERROR";
   4129         goto err;
   4130     }
   4131     if (EVP_PKEY_derive(expected->ctx, got, &got_len) <= 0) {
   4132         t->err = "KDF_DERIVE_ERROR";
   4133         goto err;
   4134     }
   4135     if (!pkey_check_fips_approved(expected->ctx, t)) {
   4136         ret = 0;
   4137         goto err;
   4138     }
   4139     if (!TEST_mem_eq(expected->output, expected->output_len, got, got_len)) {
   4140         t->err = "KDF_MISMATCH";
   4141         goto err;
   4142     }
   4143     t->err = NULL;
   4144 
   4145 err:
   4146     OPENSSL_free(got);
   4147     return ret;
   4148 }
   4149 
   4150 static const EVP_TEST_METHOD pkey_kdf_test_method = {
   4151     "PKEYKDF",
   4152     pkey_kdf_test_init,
   4153     pkey_kdf_test_cleanup,
   4154     pkey_kdf_test_parse,
   4155     pkey_kdf_test_run
   4156 };
   4157 
   4158 /**
   4159  **  KEYPAIR TESTS
   4160  **/
   4161 
   4162 typedef struct keypair_test_data_st {
   4163     EVP_PKEY *privk;
   4164     EVP_PKEY *pubk;
   4165 } KEYPAIR_TEST_DATA;
   4166 
   4167 static int keypair_test_init(EVP_TEST *t, const char *pair)
   4168 {
   4169     KEYPAIR_TEST_DATA *data;
   4170     int rv = 0;
   4171     EVP_PKEY *pk = NULL, *pubk = NULL;
   4172     char *pub, *priv = NULL;
   4173 
   4174     /* Split private and public names. */
   4175     if (!TEST_ptr(priv = OPENSSL_strdup(pair))
   4176         || !TEST_ptr(pub = strchr(priv, ':'))) {
   4177         t->err = "PARSING_ERROR";
   4178         goto end;
   4179     }
   4180     *pub++ = '\0';
   4181 
   4182     if (!TEST_true(find_key(&pk, priv, private_keys))) {
   4183         TEST_info("Can't find private key: %s", priv);
   4184         t->err = "MISSING_PRIVATE_KEY";
   4185         goto end;
   4186     }
   4187     if (!TEST_true(find_key(&pubk, pub, public_keys))) {
   4188         TEST_info("Can't find public key: %s", pub);
   4189         t->err = "MISSING_PUBLIC_KEY";
   4190         goto end;
   4191     }
   4192 
   4193     if (pk == NULL && pubk == NULL) {
   4194         /* Both keys are listed but unsupported: skip this test */
   4195         t->skip = 1;
   4196         rv = 1;
   4197         goto end;
   4198     }
   4199 
   4200     if (!TEST_ptr(data = OPENSSL_malloc(sizeof(*data))))
   4201         goto end;
   4202     data->privk = pk;
   4203     data->pubk = pubk;
   4204     t->data = data;
   4205     rv = 1;
   4206     t->err = NULL;
   4207 
   4208 end:
   4209     OPENSSL_free(priv);
   4210     return rv;
   4211 }
   4212 
   4213 static void keypair_test_cleanup(EVP_TEST *t)
   4214 {
   4215     OPENSSL_free(t->data);
   4216     t->data = NULL;
   4217 }
   4218 
   4219 /*
   4220  * For tests that do not accept any custom keywords.
   4221  */
   4222 static int void_test_parse(EVP_TEST *t, const char *keyword, const char *value)
   4223 {
   4224     return 0;
   4225 }
   4226 
   4227 static int keypair_test_run(EVP_TEST *t)
   4228 {
   4229     int rv = 0;
   4230     const KEYPAIR_TEST_DATA *pair = t->data;
   4231 
   4232     if (pair->privk == NULL || pair->pubk == NULL) {
   4233         /*
   4234          * this can only happen if only one of the keys is not set
   4235          * which means that one of them was unsupported while the
   4236          * other isn't: hence a key type mismatch.
   4237          */
   4238         t->err = "KEYPAIR_TYPE_MISMATCH";
   4239         rv = 1;
   4240         goto end;
   4241     }
   4242 
   4243     if ((rv = EVP_PKEY_eq(pair->privk, pair->pubk)) != 1) {
   4244         if (0 == rv) {
   4245             t->err = "KEYPAIR_MISMATCH";
   4246         } else if (-1 == rv) {
   4247             t->err = "KEYPAIR_TYPE_MISMATCH";
   4248         } else if (-2 == rv) {
   4249             t->err = "UNSUPPORTED_KEY_COMPARISON";
   4250         } else {
   4251             TEST_error("Unexpected error in key comparison");
   4252             rv = 0;
   4253             goto end;
   4254         }
   4255         rv = 1;
   4256         goto end;
   4257     }
   4258 
   4259     rv = 1;
   4260     t->err = NULL;
   4261 
   4262 end:
   4263     return rv;
   4264 }
   4265 
   4266 static const EVP_TEST_METHOD keypair_test_method = {
   4267     "PrivPubKeyPair",
   4268     keypair_test_init,
   4269     keypair_test_cleanup,
   4270     void_test_parse,
   4271     keypair_test_run
   4272 };
   4273 
   4274 /**
   4275  **  KEYGEN TEST
   4276  **/
   4277 
   4278 typedef struct keygen_test_data_st {
   4279     char *keyname; /* Key name to store key or NULL */
   4280     char *paramname;
   4281     char *alg;
   4282     STACK_OF(OPENSSL_STRING) *in_controls; /* Collection of controls */
   4283     STACK_OF(OPENSSL_STRING) *out_controls;
   4284 } KEYGEN_TEST_DATA;
   4285 
   4286 static int keygen_test_init(EVP_TEST *t, const char *alg)
   4287 {
   4288     KEYGEN_TEST_DATA *data;
   4289 
   4290     if (is_pkey_disabled(alg)) {
   4291         t->skip = 1;
   4292         return 1;
   4293     }
   4294 
   4295     if (!TEST_ptr(data = OPENSSL_zalloc(sizeof(*data))))
   4296         return 0;
   4297     data->keyname = NULL;
   4298     data->paramname = NULL;
   4299     data->in_controls = sk_OPENSSL_STRING_new_null();
   4300     data->out_controls = sk_OPENSSL_STRING_new_null();
   4301     data->alg = OPENSSL_strdup(alg);
   4302     t->data = data;
   4303     t->err = NULL;
   4304     return 1;
   4305 }
   4306 
   4307 static void keygen_test_cleanup(EVP_TEST *t)
   4308 {
   4309     KEYGEN_TEST_DATA *keygen = t->data;
   4310 
   4311     ctrlfree(keygen->in_controls);
   4312     ctrlfree(keygen->out_controls);
   4313     OPENSSL_free(keygen->alg);
   4314     OPENSSL_free(keygen->keyname);
   4315     OPENSSL_free(keygen->paramname);
   4316     OPENSSL_free(t->data);
   4317     t->data = NULL;
   4318 }
   4319 
   4320 static int keygen_test_parse(EVP_TEST *t,
   4321     const char *keyword, const char *value)
   4322 {
   4323     KEYGEN_TEST_DATA *keygen = t->data;
   4324 
   4325     if (strcmp(keyword, "KeyName") == 0)
   4326         return TEST_ptr(keygen->keyname = OPENSSL_strdup(value));
   4327     if (strcmp(keyword, "KeyParam") == 0)
   4328         return TEST_ptr(keygen->paramname = OPENSSL_strdup(value));
   4329     if (strcmp(keyword, "Ctrl") == 0)
   4330         return ctrladd(keygen->in_controls, value);
   4331     if (strcmp(keyword, "CtrlOut") == 0)
   4332         return ctrladd(keygen->out_controls, value);
   4333     return 0;
   4334 }
   4335 
   4336 /* Iterate thru the key's expected values */
   4337 static int check_pkey_expected_values(EVP_TEST *t, const EVP_PKEY *pkey,
   4338     STACK_OF(OPENSSL_STRING) *out_controls)
   4339 {
   4340     int ret = 0;
   4341     OSSL_PARAM out_params[4], *p;
   4342     size_t out_params_n = 0, len;
   4343 
   4344     if (sk_OPENSSL_STRING_num(out_controls) > 0) {
   4345 
   4346         if (!ctrl2params(t, out_controls,
   4347                 EVP_PKEY_gettable_params(pkey),
   4348                 out_params, OSSL_NELEM(out_params), &out_params_n))
   4349             goto err;
   4350         for (p = out_params; p->key != NULL; ++p) {
   4351             if (p->data_type == OSSL_PARAM_OCTET_STRING) {
   4352                 uint8_t *data = OPENSSL_malloc(p->data_size);
   4353 
   4354                 if (data == NULL)
   4355                     goto err;
   4356                 ret = EVP_PKEY_get_octet_string_param(pkey, p->key, data,
   4357                           p->data_size, &len)
   4358                     && len == p->data_size
   4359                     && (TEST_mem_eq(p->data, len, data, len) == 1);
   4360                 OPENSSL_free(data);
   4361                 if (ret == 0) {
   4362                     TEST_error("Expected %s value is incorrect", p->key);
   4363                     goto err;
   4364                 }
   4365             }
   4366         }
   4367     }
   4368     ret = 1;
   4369 err:
   4370     ctrl2params_free(out_params, out_params_n, 0);
   4371     return ret;
   4372 }
   4373 
   4374 static int keygen_test_run(EVP_TEST *t)
   4375 {
   4376     KEYGEN_TEST_DATA *keygen = t->data;
   4377     EVP_PKEY *pkey = NULL, *keyparams = NULL;
   4378     EVP_PKEY_CTX *genctx = NULL; /* Keygen context to use */
   4379     int rv = 1;
   4380     OSSL_PARAM_BLD *bld = NULL;
   4381     OSSL_PARAM *params = NULL;
   4382     size_t params_n = 0;
   4383     int key_free = 1;
   4384 
   4385     if (keygen->paramname != NULL) {
   4386         rv = find_key(&keyparams, keygen->paramname, public_keys);
   4387         if (rv == 0 || keyparams == NULL) {
   4388             TEST_info("skipping, key '%s' is disabled", keygen->paramname);
   4389             t->skip = 1;
   4390             return 1;
   4391         }
   4392         if (!TEST_ptr(genctx = EVP_PKEY_CTX_new_from_pkey(libctx, keyparams,
   4393                           propquery)))
   4394             goto err;
   4395 
   4396     } else {
   4397         if (!TEST_ptr(genctx = EVP_PKEY_CTX_new_from_name(libctx, keygen->alg,
   4398                           propquery)))
   4399             goto err;
   4400     }
   4401 
   4402     if (EVP_PKEY_keygen_init(genctx) <= 0) {
   4403         t->err = "KEYGEN_INIT_ERROR";
   4404         goto err;
   4405     }
   4406 
   4407     if (sk_OPENSSL_STRING_num(keygen->in_controls) > 0) {
   4408         if ((params = OPENSSL_malloc(sizeof(OSSL_PARAM) * 4)) == NULL)
   4409             goto err;
   4410         if (!ctrl2params(t, keygen->in_controls,
   4411                 EVP_PKEY_CTX_settable_params(genctx),
   4412                 params, 4, &params_n))
   4413             goto err;
   4414         if (!EVP_PKEY_CTX_set_params(genctx, params)) {
   4415             t->err = "PKEY_CTRL_ERROR";
   4416             goto err;
   4417         }
   4418     }
   4419 
   4420     if (EVP_PKEY_keygen(genctx, &pkey) <= 0) {
   4421         t->err = "KEYGEN_GENERATE_ERROR";
   4422         goto err;
   4423     }
   4424 
   4425     if (!pkey_check_fips_approved(genctx, t)) {
   4426         rv = 0;
   4427         goto err;
   4428     }
   4429 
   4430     if (!evp_pkey_is_provided(pkey)) {
   4431         TEST_info("Warning: legacy key generated %s", keygen->keyname);
   4432         goto err;
   4433     }
   4434 
   4435     if (!check_pkey_expected_values(t, pkey, keygen->out_controls)) {
   4436         t->err = "KEYGEN_PKEY_MISMATCH_ERROR";
   4437         goto err;
   4438     }
   4439 
   4440     if (keygen->keyname != NULL) {
   4441         KEY_LIST *key;
   4442 
   4443         rv = 0;
   4444         if (find_key(NULL, keygen->keyname, private_keys)) {
   4445             TEST_info("Duplicate key %s", keygen->keyname);
   4446             goto err;
   4447         }
   4448 
   4449         if (!TEST_ptr(key = OPENSSL_malloc(sizeof(*key))))
   4450             goto err;
   4451         key->name = keygen->keyname;
   4452         keygen->keyname = NULL;
   4453         key->key = pkey;
   4454         key->next = private_keys;
   4455         private_keys = key;
   4456         rv = 1;
   4457         key_free = 0;
   4458     }
   4459 
   4460     t->err = NULL;
   4461 err:
   4462     if (key_free) {
   4463         EVP_PKEY_free(pkey);
   4464         pkey = NULL;
   4465     }
   4466     EVP_PKEY_CTX_free(genctx);
   4467     if (sk_OPENSSL_STRING_num(keygen->in_controls) > 0)
   4468         ctrl2params_free(params, params_n, 0);
   4469     OSSL_PARAM_free(params);
   4470     OSSL_PARAM_BLD_free(bld);
   4471     return rv;
   4472 }
   4473 
   4474 static const EVP_TEST_METHOD keygen_test_method = {
   4475     "KeyGen",
   4476     keygen_test_init,
   4477     keygen_test_cleanup,
   4478     keygen_test_parse,
   4479     keygen_test_run,
   4480 };
   4481 
   4482 /**
   4483  **  DIGEST SIGN+VERIFY TESTS
   4484  **/
   4485 
   4486 typedef struct {
   4487     int is_verify; /* Set to 1 if verifying */
   4488     int is_oneshot; /* Set to 1 for one shot operation */
   4489     const EVP_MD *md; /* Digest to use */
   4490     EVP_MD_CTX *ctx; /* Digest context */
   4491     EVP_PKEY_CTX *pctx;
   4492     STACK_OF(EVP_TEST_BUFFER) *input; /* Input data: streaming */
   4493     unsigned char *osin; /* Input data if one shot */
   4494     size_t osin_len; /* Input length data if one shot */
   4495     unsigned char *output; /* Expected output */
   4496     size_t output_len; /* Expected output length */
   4497     int deterministic_noncetype;
   4498     EVP_PKEY *key;
   4499     STACK_OF(OPENSSL_STRING) *init_controls; /* collection of controls */
   4500     STACK_OF(OPENSSL_STRING) *controls; /* Collection of controls */
   4501 } DIGESTSIGN_DATA;
   4502 
   4503 static int digestsigver_test_init(EVP_TEST *t, const char *alg, int is_verify,
   4504     int is_oneshot)
   4505 {
   4506     const EVP_MD *md = NULL;
   4507     DIGESTSIGN_DATA *mdat;
   4508 
   4509     if (strcmp(alg, "NULL") != 0) {
   4510         if (is_digest_disabled(alg)) {
   4511             t->skip = 1;
   4512             return 1;
   4513         }
   4514         md = EVP_get_digestbyname(alg);
   4515         if (md == NULL)
   4516             return 0;
   4517     }
   4518     if (!TEST_ptr(mdat = OPENSSL_zalloc(sizeof(*mdat))))
   4519         return 0;
   4520     mdat->init_controls = sk_OPENSSL_STRING_new_null();
   4521     mdat->controls = sk_OPENSSL_STRING_new_null();
   4522     mdat->md = md;
   4523     if (!TEST_ptr(mdat->ctx = EVP_MD_CTX_new())) {
   4524         OPENSSL_free(mdat);
   4525         return 0;
   4526     }
   4527     mdat->is_verify = is_verify;
   4528     mdat->is_oneshot = is_oneshot;
   4529     t->data = mdat;
   4530     return 1;
   4531 }
   4532 
   4533 static int digestsign_test_init(EVP_TEST *t, const char *alg)
   4534 {
   4535     return digestsigver_test_init(t, alg, 0, 0);
   4536 }
   4537 
   4538 static void digestsigver_test_cleanup(EVP_TEST *t)
   4539 {
   4540     DIGESTSIGN_DATA *mdata = t->data;
   4541 
   4542     ctrlfree(mdata->init_controls);
   4543     ctrlfree(mdata->controls);
   4544     EVP_MD_CTX_free(mdata->ctx);
   4545     sk_EVP_TEST_BUFFER_pop_free(mdata->input, evp_test_buffer_free);
   4546     OPENSSL_free(mdata->osin);
   4547     OPENSSL_free(mdata->output);
   4548     OPENSSL_free(mdata);
   4549     t->data = NULL;
   4550 }
   4551 
   4552 static int digestsigver_test_parse(EVP_TEST *t,
   4553     const char *keyword, const char *value)
   4554 {
   4555     DIGESTSIGN_DATA *mdata = t->data;
   4556 
   4557     if (strcmp(keyword, "Key") == 0) {
   4558         EVP_PKEY *pkey = NULL;
   4559         int rv = 0;
   4560 
   4561         if (mdata->is_verify)
   4562             rv = find_key(&pkey, value, public_keys);
   4563         if (rv == 0)
   4564             rv = find_key(&pkey, value, private_keys);
   4565         if (rv == 0 || pkey == NULL) {
   4566             t->skip = 1;
   4567             return 1;
   4568         }
   4569         mdata->key = pkey;
   4570         return 1;
   4571     }
   4572 
   4573     if (strcmp(keyword, "Input") == 0) {
   4574         if (mdata->is_oneshot)
   4575             return parse_bin(value, &mdata->osin, &mdata->osin_len);
   4576         return evp_test_buffer_append(value, data_chunk_size, &mdata->input);
   4577     }
   4578     if (strcmp(keyword, "Output") == 0)
   4579         return parse_bin(value, &mdata->output, &mdata->output_len);
   4580 
   4581     if (!mdata->is_oneshot && data_chunk_size == 0) {
   4582         if (strcmp(keyword, "Count") == 0)
   4583             return evp_test_buffer_set_count(value, mdata->input);
   4584         if (strcmp(keyword, "Ncopy") == 0)
   4585             return evp_test_buffer_ncopy(value, mdata->input);
   4586     }
   4587     if (strcmp(keyword, "Ctrl") == 0)
   4588         return pkey_add_control(t, mdata->controls, value);
   4589     if (strcmp(keyword, "CtrlInit") == 0)
   4590         return ctrladd(mdata->init_controls, value);
   4591     if (strcmp(keyword, "NonceType") == 0) {
   4592         if (strcmp(value, "deterministic") == 0)
   4593             mdata->deterministic_noncetype = 1;
   4594         return 1;
   4595     }
   4596     return 0;
   4597 }
   4598 
   4599 static int check_deterministic_noncetype(EVP_TEST *t,
   4600     DIGESTSIGN_DATA *mdata)
   4601 {
   4602     if (mdata->deterministic_noncetype == 1) {
   4603         OSSL_PARAM params[2];
   4604         unsigned int nonce_type = 1;
   4605 
   4606         params[0] = OSSL_PARAM_construct_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE,
   4607             &nonce_type);
   4608         params[1] = OSSL_PARAM_construct_end();
   4609         if (!EVP_PKEY_CTX_set_params(mdata->pctx, params))
   4610             t->err = "EVP_PKEY_CTX_set_params_ERROR";
   4611         else if (!EVP_PKEY_CTX_get_params(mdata->pctx, params))
   4612             t->err = "EVP_PKEY_CTX_get_params_ERROR";
   4613         else if (!OSSL_PARAM_modified(&params[0]))
   4614             t->err = "nonce_type_not_modified_ERROR";
   4615         else if (nonce_type != 1)
   4616             t->err = "nonce_type_value_ERROR";
   4617     }
   4618     return t->err == NULL;
   4619 }
   4620 
   4621 static int signverify_init(EVP_TEST *t, DIGESTSIGN_DATA *data)
   4622 {
   4623     const char *name = data->md == NULL ? NULL : EVP_MD_get0_name(data->md);
   4624     OSSL_PARAM params[5];
   4625     OSSL_PARAM *p = NULL;
   4626     int i, ret = 0;
   4627     size_t params_n = 0, params_allocated_n = 0;
   4628 
   4629     if (sk_OPENSSL_STRING_num(data->init_controls) > 0) {
   4630         if (!ctrl2params(t, data->init_controls,
   4631                 NULL,
   4632                 params, OSSL_NELEM(params), &params_n))
   4633             goto err;
   4634         p = params;
   4635     }
   4636 
   4637     if (data->is_verify) {
   4638         if (!EVP_DigestVerifyInit_ex(data->ctx, &data->pctx, name, libctx,
   4639                 NULL, data->key, p)) {
   4640             t->err = "DIGESTVERIFYINIT_ERROR";
   4641             goto err;
   4642         }
   4643     } else {
   4644         if (!EVP_DigestSignInit_ex(data->ctx, &data->pctx, name, libctx, NULL,
   4645                 data->key, p)) {
   4646             t->err = "DIGESTSIGNINIT_ERROR";
   4647             goto err;
   4648         }
   4649     }
   4650 
   4651     for (i = 0; i < sk_OPENSSL_STRING_num(data->controls); i++) {
   4652         char *value = sk_OPENSSL_STRING_value(data->controls, i);
   4653 
   4654         if (!pkey_test_ctrl(t, data->pctx, value) || t->err != NULL)
   4655             goto err;
   4656     }
   4657     ret = 1;
   4658 err:
   4659     ctrl2params_free(params, params_n, params_allocated_n);
   4660     return ret;
   4661 }
   4662 
   4663 static int digestsign_update_fn(void *ctx, const unsigned char *buf,
   4664     size_t buflen)
   4665 {
   4666     return EVP_DigestSignUpdate(ctx, buf, buflen);
   4667 }
   4668 
   4669 static int digestsign_test_run(EVP_TEST *t)
   4670 {
   4671     int i;
   4672     DIGESTSIGN_DATA *expected = t->data;
   4673     unsigned char *got = NULL;
   4674     size_t got_len;
   4675 
   4676     if (!signverify_init(t, expected))
   4677         goto err;
   4678     if (!check_deterministic_noncetype(t, expected))
   4679         goto err;
   4680 
   4681     for (i = 0; i < sk_OPENSSL_STRING_num(expected->controls); i++) {
   4682         char *value = sk_OPENSSL_STRING_value(expected->controls, i);
   4683         if (!pkey_test_ctrl(t, expected->pctx, value) || t->err != NULL)
   4684             return 0;
   4685     }
   4686 
   4687     if (!evp_test_buffer_do(expected->input, digestsign_update_fn,
   4688             expected->ctx)) {
   4689         t->err = "DIGESTUPDATE_ERROR";
   4690         goto err;
   4691     }
   4692 
   4693     if (!EVP_DigestSignFinal(expected->ctx, NULL, &got_len)) {
   4694         t->err = "DIGESTSIGNFINAL_LENGTH_ERROR";
   4695         goto err;
   4696     }
   4697     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
   4698         t->err = "MALLOC_FAILURE";
   4699         goto err;
   4700     }
   4701     got_len *= 2;
   4702     if (!EVP_DigestSignFinal(expected->ctx, got, &got_len)) {
   4703         t->err = "DIGESTSIGNFINAL_ERROR";
   4704         goto err;
   4705     }
   4706     if (!memory_err_compare(t, "SIGNATURE_MISMATCH",
   4707             expected->output, expected->output_len,
   4708             got, got_len))
   4709         goto err;
   4710 
   4711     t->err = NULL;
   4712 err:
   4713     OPENSSL_free(got);
   4714     return 1;
   4715 }
   4716 
   4717 static const EVP_TEST_METHOD digestsign_test_method = {
   4718     "DigestSign",
   4719     digestsign_test_init,
   4720     digestsigver_test_cleanup,
   4721     digestsigver_test_parse,
   4722     digestsign_test_run
   4723 };
   4724 
   4725 static int digestverify_test_init(EVP_TEST *t, const char *alg)
   4726 {
   4727     return digestsigver_test_init(t, alg, 1, 0);
   4728 }
   4729 
   4730 static int digestverify_update_fn(void *ctx, const unsigned char *buf,
   4731     size_t buflen)
   4732 {
   4733     return EVP_DigestVerifyUpdate(ctx, buf, buflen);
   4734 }
   4735 
   4736 static int digestverify_test_run(EVP_TEST *t)
   4737 {
   4738     DIGESTSIGN_DATA *mdata = t->data;
   4739 
   4740     if (!signverify_init(t, mdata))
   4741         return 1;
   4742 
   4743     if (!evp_test_buffer_do(mdata->input, digestverify_update_fn, mdata->ctx)) {
   4744         t->err = "DIGESTUPDATE_ERROR";
   4745         return 1;
   4746     }
   4747 
   4748     if (EVP_DigestVerifyFinal(mdata->ctx, mdata->output,
   4749             mdata->output_len)
   4750         <= 0)
   4751         t->err = "VERIFY_ERROR";
   4752     return 1;
   4753 }
   4754 
   4755 static const EVP_TEST_METHOD digestverify_test_method = {
   4756     "DigestVerify",
   4757     digestverify_test_init,
   4758     digestsigver_test_cleanup,
   4759     digestsigver_test_parse,
   4760     digestverify_test_run
   4761 };
   4762 
   4763 static int oneshot_digestsign_test_init(EVP_TEST *t, const char *alg)
   4764 {
   4765     return digestsigver_test_init(t, alg, 0, 1);
   4766 }
   4767 
   4768 static int oneshot_digestsign_test_run(EVP_TEST *t)
   4769 {
   4770     DIGESTSIGN_DATA *expected = t->data;
   4771     unsigned char *got = NULL;
   4772     size_t got_len;
   4773 
   4774     if (!signverify_init(t, expected))
   4775         goto err;
   4776 
   4777     if (!EVP_DigestSign(expected->ctx, NULL, &got_len,
   4778             expected->osin, expected->osin_len)) {
   4779         t->err = "DIGESTSIGN_LENGTH_ERROR";
   4780         goto err;
   4781     }
   4782     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
   4783         t->err = "MALLOC_FAILURE";
   4784         goto err;
   4785     }
   4786     got_len *= 2;
   4787     if (!EVP_DigestSign(expected->ctx, got, &got_len,
   4788             expected->osin, expected->osin_len)) {
   4789         t->err = "DIGESTSIGN_ERROR";
   4790         goto err;
   4791     }
   4792     if (!memory_err_compare(t, "SIGNATURE_MISMATCH",
   4793             expected->output, expected->output_len,
   4794             got, got_len))
   4795         goto err;
   4796 
   4797     t->err = NULL;
   4798 err:
   4799     OPENSSL_free(got);
   4800     return 1;
   4801 }
   4802 
   4803 static const EVP_TEST_METHOD oneshot_digestsign_test_method = {
   4804     "OneShotDigestSign",
   4805     oneshot_digestsign_test_init,
   4806     digestsigver_test_cleanup,
   4807     digestsigver_test_parse,
   4808     oneshot_digestsign_test_run
   4809 };
   4810 
   4811 static int oneshot_digestverify_test_init(EVP_TEST *t, const char *alg)
   4812 {
   4813     return digestsigver_test_init(t, alg, 1, 1);
   4814 }
   4815 
   4816 static int oneshot_digestverify_test_run(EVP_TEST *t)
   4817 {
   4818     DIGESTSIGN_DATA *mdata = t->data;
   4819 
   4820     if (!signverify_init(t, mdata))
   4821         return 1;
   4822 
   4823     if (EVP_DigestVerify(mdata->ctx, mdata->output, mdata->output_len,
   4824             mdata->osin, mdata->osin_len)
   4825         <= 0)
   4826         t->err = "VERIFY_ERROR";
   4827     return 1;
   4828 }
   4829 
   4830 static const EVP_TEST_METHOD oneshot_digestverify_test_method = {
   4831     "OneShotDigestVerify",
   4832     oneshot_digestverify_test_init,
   4833     digestsigver_test_cleanup,
   4834     digestsigver_test_parse,
   4835     oneshot_digestverify_test_run
   4836 };
   4837 
   4838 /**
   4839  **  PARSING AND DISPATCH
   4840  **/
   4841 
   4842 static const EVP_TEST_METHOD *evp_test_list[] = {
   4843     &rand_test_method,
   4844     &cipher_test_method,
   4845     &digest_test_method,
   4846     &digestsign_test_method,
   4847     &digestverify_test_method,
   4848     &encode_test_method,
   4849     &kdf_test_method,
   4850     &pkey_kdf_test_method,
   4851     &keypair_test_method,
   4852     &keygen_test_method,
   4853     &mac_test_method,
   4854     &oneshot_digestsign_test_method,
   4855     &oneshot_digestverify_test_method,
   4856     &pbe_test_method,
   4857     &pdecrypt_test_method,
   4858     &pderive_test_method,
   4859     &psign_test_method,
   4860     &psign_message_test_method,
   4861     &pverify_recover_test_method,
   4862     &pverify_test_method,
   4863     &pverify_message_test_method,
   4864     &pverify_message_public_test_method,
   4865     &pkey_kem_test_method,
   4866     &pkey_fromdata_test_method,
   4867     NULL
   4868 };
   4869 
   4870 static const EVP_TEST_METHOD *find_test(const char *name)
   4871 {
   4872     const EVP_TEST_METHOD **tt;
   4873 
   4874     for (tt = evp_test_list; *tt; tt++) {
   4875         if (strcmp(name, (*tt)->name) == 0)
   4876             return *tt;
   4877     }
   4878     return NULL;
   4879 }
   4880 
   4881 static void clear_test(EVP_TEST *t)
   4882 {
   4883     test_clearstanza(&t->s);
   4884     ERR_clear_error();
   4885     if (t->data != NULL) {
   4886         if (t->meth != NULL)
   4887             t->meth->cleanup(t);
   4888         OPENSSL_free(t->data);
   4889         t->data = NULL;
   4890     }
   4891     OPENSSL_free(t->expected_err);
   4892     t->expected_err = NULL;
   4893     OPENSSL_free(t->reason);
   4894     t->reason = NULL;
   4895 
   4896     /* Text literal. */
   4897     t->err = NULL;
   4898     t->skip = 0;
   4899     t->meth = NULL;
   4900     t->expect_unapproved = 0;
   4901 
   4902 #if !defined(OPENSSL_NO_DEFAULT_THREAD_POOL)
   4903     OSSL_set_max_threads(libctx, 0);
   4904 #endif
   4905 }
   4906 
   4907 /* Check for errors in the test structure; return 1 if okay, else 0. */
   4908 static int check_test_error(EVP_TEST *t)
   4909 {
   4910     unsigned long err;
   4911     const char *reason;
   4912 
   4913     if (t->err == NULL && t->expected_err == NULL)
   4914         return 1;
   4915     if (t->err != NULL && t->expected_err == NULL) {
   4916         if (t->aux_err != NULL) {
   4917             TEST_info("%s:%d: Source of above error (%s); unexpected error %s",
   4918                 t->s.test_file, t->s.start, t->aux_err, t->err);
   4919         } else {
   4920             TEST_info("%s:%d: Source of above error; unexpected error %s",
   4921                 t->s.test_file, t->s.start, t->err);
   4922         }
   4923         return 0;
   4924     }
   4925     if (t->err == NULL && t->expected_err != NULL) {
   4926         TEST_info("%s:%d: Succeeded but was expecting %s",
   4927             t->s.test_file, t->s.start, t->expected_err);
   4928         return 0;
   4929     }
   4930 
   4931     if (strcmp(t->err, t->expected_err) != 0) {
   4932         TEST_info("%s:%d: Expected %s got %s",
   4933             t->s.test_file, t->s.start, t->expected_err, t->err);
   4934         return 0;
   4935     }
   4936 
   4937     if (t->reason == NULL)
   4938         return 1;
   4939 
   4940     if (t->reason == NULL) {
   4941         TEST_info("%s:%d: Test is missing function or reason code",
   4942             t->s.test_file, t->s.start);
   4943         return 0;
   4944     }
   4945 
   4946     err = ERR_peek_error();
   4947     if (err == 0) {
   4948         TEST_info("%s:%d: Expected error \"%s\" not set",
   4949             t->s.test_file, t->s.start, t->reason);
   4950         return 0;
   4951     }
   4952 
   4953     reason = ERR_reason_error_string(err);
   4954     if (reason == NULL) {
   4955         TEST_info("%s:%d: Expected error \"%s\", no strings available."
   4956                   " Assuming ok.",
   4957             t->s.test_file, t->s.start, t->reason);
   4958         return 1;
   4959     }
   4960 
   4961     if (strcmp(reason, t->reason) == 0)
   4962         return 1;
   4963 
   4964     TEST_info("%s:%d: Expected error \"%s\", got \"%s\"",
   4965         t->s.test_file, t->s.start, t->reason, reason);
   4966 
   4967     return 0;
   4968 }
   4969 
   4970 /* Run a parsed test. Log a message and return 0 on error. */
   4971 static int run_test(EVP_TEST *t)
   4972 {
   4973     if (t->meth == NULL)
   4974         return 1;
   4975     t->s.numtests++;
   4976     if (t->skip) {
   4977         t->s.numskip++;
   4978     } else {
   4979         /* run the test */
   4980         if (t->err == NULL && t->meth->run_test(t) != 1) {
   4981             TEST_info("%s:%d %s error",
   4982                 t->s.test_file, t->s.start, t->meth->name);
   4983             return 0;
   4984         }
   4985         if (!check_test_error(t)) {
   4986             TEST_openssl_errors();
   4987             t->s.errors++;
   4988         }
   4989     }
   4990 
   4991     /* clean it up */
   4992     return 1;
   4993 }
   4994 
   4995 static int find_key(EVP_PKEY **ppk, const char *name, KEY_LIST *lst)
   4996 {
   4997     for (; lst != NULL; lst = lst->next) {
   4998         if (strcmp(lst->name, name) == 0) {
   4999             if (ppk != NULL)
   5000                 *ppk = lst->key;
   5001             return 1;
   5002         }
   5003     }
   5004     return 0;
   5005 }
   5006 
   5007 static void free_key_list(KEY_LIST *lst)
   5008 {
   5009     while (lst != NULL) {
   5010         KEY_LIST *next = lst->next;
   5011 
   5012         EVP_PKEY_free(lst->key);
   5013         OPENSSL_free(lst->name);
   5014         OPENSSL_free(lst);
   5015         lst = next;
   5016     }
   5017 }
   5018 
   5019 /*
   5020  * Is the key type an unsupported algorithm?
   5021  */
   5022 static int key_unsupported(void)
   5023 {
   5024     long err = ERR_peek_last_error();
   5025     int lib = ERR_GET_LIB(err);
   5026     long reason = ERR_GET_REASON(err);
   5027 
   5028     if ((lib == ERR_LIB_EVP && reason == EVP_R_UNSUPPORTED_ALGORITHM)
   5029         || (lib == ERR_LIB_EVP && reason == EVP_R_DECODE_ERROR)
   5030         || reason == ERR_R_UNSUPPORTED) {
   5031         ERR_clear_error();
   5032         return 1;
   5033     }
   5034 #ifndef OPENSSL_NO_EC
   5035     /*
   5036      * If EC support is enabled we should catch also EC_R_UNKNOWN_GROUP as an
   5037      * hint to an unsupported algorithm/curve (e.g. if binary EC support is
   5038      * disabled).
   5039      */
   5040     if (lib == ERR_LIB_EC
   5041         && (reason == EC_R_UNKNOWN_GROUP
   5042             || reason == EC_R_INVALID_CURVE)) {
   5043         ERR_clear_error();
   5044         return 1;
   5045     }
   5046 #endif /* OPENSSL_NO_EC */
   5047     return 0;
   5048 }
   5049 
   5050 /* NULL out the value from |pp| but return it.  This "steals" a pointer. */
   5051 static char *take_value(PAIR *pp)
   5052 {
   5053     char *p = pp->value;
   5054 
   5055     pp->value = NULL;
   5056     return p;
   5057 }
   5058 
   5059 #if !defined(OPENSSL_NO_FIPS_SECURITYCHECKS)
   5060 static int securitycheck_enabled(void)
   5061 {
   5062     static int enabled = -1;
   5063 
   5064     if (enabled == -1) {
   5065         if (OSSL_PROVIDER_available(libctx, "fips")) {
   5066             OSSL_PARAM params[2];
   5067             OSSL_PROVIDER *prov = NULL;
   5068             int check = 1;
   5069 
   5070             prov = OSSL_PROVIDER_load(libctx, "fips");
   5071             if (prov != NULL) {
   5072                 params[0] = OSSL_PARAM_construct_int(OSSL_PROV_PARAM_SECURITY_CHECKS,
   5073                     &check);
   5074                 params[1] = OSSL_PARAM_construct_end();
   5075                 OSSL_PROVIDER_get_params(prov, params);
   5076                 OSSL_PROVIDER_unload(prov);
   5077             }
   5078             enabled = check;
   5079             return enabled;
   5080         }
   5081         enabled = 0;
   5082     }
   5083     return enabled;
   5084 }
   5085 #endif
   5086 
   5087 /*
   5088  * Return 1 if one of the providers named in the string is available.
   5089  * The provider names are separated with whitespace.
   5090  * NOTE: destructive function, it inserts '\0' after each provider name.
   5091  */
   5092 static int prov_available(char *providers)
   5093 {
   5094     char *p;
   5095     int more = 1;
   5096 
   5097     while (more) {
   5098         for (; isspace((unsigned char)(*providers)); providers++)
   5099             continue;
   5100         if (*providers == '\0')
   5101             break; /* End of the road */
   5102         for (p = providers; *p != '\0' && !isspace((unsigned char)(*p)); p++)
   5103             continue;
   5104         if (*p == '\0')
   5105             more = 0;
   5106         else
   5107             *p = '\0';
   5108         if (OSSL_PROVIDER_available(libctx, providers))
   5109             return 1; /* Found one */
   5110     }
   5111     return 0;
   5112 }
   5113 
   5114 /* Read and parse one test.  Return 0 if failure, 1 if okay. */
   5115 static int parse(EVP_TEST *t)
   5116 {
   5117     KEY_LIST *key, **klist;
   5118     EVP_PKEY *pkey;
   5119     PAIR *pp;
   5120     int i, j, skipped = 0;
   5121 
   5122     fips_indicator_callback_unapproved_count = 0;
   5123 top:
   5124     do {
   5125         if (BIO_eof(t->s.fp))
   5126             return EOF;
   5127         clear_test(t);
   5128         if (!test_readstanza(&t->s))
   5129             return 0;
   5130     } while (t->s.numpairs == 0);
   5131     pp = &t->s.pairs[0];
   5132 
   5133     /* Are we adding a key? */
   5134     klist = NULL;
   5135     pkey = NULL;
   5136 start:
   5137     if (strcmp(pp->key, "PrivateKey") == 0) {
   5138         pkey = PEM_read_bio_PrivateKey_ex(t->s.key, NULL, 0, NULL, libctx, NULL);
   5139         if (pkey == NULL && !key_unsupported()) {
   5140             EVP_PKEY_free(pkey);
   5141             TEST_info("Can't read private key %s", pp->value);
   5142             TEST_openssl_errors();
   5143             return 0;
   5144         }
   5145         klist = &private_keys;
   5146     } else if (strcmp(pp->key, "PublicKey") == 0) {
   5147         pkey = PEM_read_bio_PUBKEY_ex(t->s.key, NULL, 0, NULL, libctx, NULL);
   5148         if (pkey == NULL && !key_unsupported()) {
   5149             EVP_PKEY_free(pkey);
   5150             TEST_info("Can't read public key %s", pp->value);
   5151             TEST_openssl_errors();
   5152             return 0;
   5153         }
   5154         klist = &public_keys;
   5155     } else if (strcmp(pp->key, "ParamKey") == 0) {
   5156         pkey = PEM_read_bio_Parameters_ex(t->s.key, NULL, libctx, NULL);
   5157         if (pkey == NULL && !key_unsupported()) {
   5158             EVP_PKEY_free(pkey);
   5159             TEST_info("Can't read params key %s", pp->value);
   5160             TEST_openssl_errors();
   5161             return 0;
   5162         }
   5163         klist = &public_keys;
   5164     } else if (strcmp(pp->key, "PrivateKeyRaw") == 0
   5165         || strcmp(pp->key, "PublicKeyRaw") == 0) {
   5166         char *strnid = NULL, *keydata = NULL;
   5167         unsigned char *keybin;
   5168         size_t keylen;
   5169         int nid;
   5170 
   5171         if (strcmp(pp->key, "PrivateKeyRaw") == 0)
   5172             klist = &private_keys;
   5173         else
   5174             klist = &public_keys;
   5175 
   5176         strnid = strchr(pp->value, ':');
   5177         if (strnid != NULL) {
   5178             *strnid++ = '\0';
   5179             keydata = strchr(strnid, ':');
   5180             if (keydata != NULL)
   5181                 *keydata++ = '\0';
   5182         }
   5183         if (keydata == NULL) {
   5184             TEST_info("Failed to parse %s value", pp->key);
   5185             return 0;
   5186         }
   5187 
   5188         nid = OBJ_txt2nid(strnid);
   5189         if (nid == NID_undef) {
   5190             TEST_info("Unrecognised algorithm NID");
   5191             return 0;
   5192         }
   5193         if (!parse_bin(keydata, &keybin, &keylen)) {
   5194             TEST_info("Failed to create binary key");
   5195             return 0;
   5196         }
   5197         if (klist == &private_keys)
   5198             pkey = EVP_PKEY_new_raw_private_key_ex(libctx, strnid, NULL, keybin,
   5199                 keylen);
   5200         else
   5201             pkey = EVP_PKEY_new_raw_public_key_ex(libctx, strnid, NULL, keybin,
   5202                 keylen);
   5203         if (pkey == NULL && !key_unsupported()) {
   5204             TEST_info("Can't read %s data", pp->key);
   5205             OPENSSL_free(keybin);
   5206             TEST_openssl_errors();
   5207             return 0;
   5208         }
   5209         OPENSSL_free(keybin);
   5210     } else if (strcmp(pp->key, "Availablein") == 0) {
   5211         if (!prov_available(pp->value)) {
   5212             TEST_info("skipping, '%s' provider not available: %s:%d",
   5213                 pp->value, t->s.test_file, t->s.start);
   5214             t->skip = 1;
   5215             return 0;
   5216         }
   5217         skipped++;
   5218         pp++;
   5219         goto start;
   5220     } else if (strcmp(pp->key, "FIPSversion") == 0) {
   5221         if (prov_available((char *)(intptr_t)"fips")) {
   5222             j = fips_provider_version_match(libctx, pp->value);
   5223             if (j < 0) {
   5224                 TEST_info("Line %d: error matching FIPS versions\n", t->s.curr);
   5225                 return 0;
   5226             } else if (j == 0) {
   5227                 TEST_info("skipping, FIPS provider incompatible version: %s:%d",
   5228                     t->s.test_file, t->s.start);
   5229                 t->skip = 1;
   5230                 return 0;
   5231             }
   5232         }
   5233         skipped++;
   5234         pp++;
   5235         goto start;
   5236     }
   5237 
   5238     /* If we have a key add to list */
   5239     if (klist != NULL) {
   5240         if (find_key(NULL, pp->value, *klist)) {
   5241             TEST_info("Duplicate key %s", pp->value);
   5242             return 0;
   5243         }
   5244         if (!TEST_ptr(key = OPENSSL_malloc(sizeof(*key))))
   5245             return 0;
   5246         key->name = take_value(pp);
   5247         key->key = pkey;
   5248         key->next = *klist;
   5249         *klist = key;
   5250 
   5251         /* Go back and start a new stanza. */
   5252         if ((t->s.numpairs - skipped) != 1)
   5253             TEST_info("Line %d: missing blank line\n", t->s.curr);
   5254         goto top;
   5255     }
   5256 
   5257     /* Find the test, based on first keyword. */
   5258     if (!TEST_ptr(t->meth = find_test(pp->key)))
   5259         return 0;
   5260     if (!t->meth->init(t, pp->value)) {
   5261         TEST_error("unknown %s: %s\n", pp->key, pp->value);
   5262         return 0;
   5263     }
   5264     if (t->skip == 1) {
   5265         /* TEST_info("skipping %s %s", pp->key, pp->value); */
   5266         return 0;
   5267     }
   5268 
   5269     for (pp++, i = 1; i < (t->s.numpairs - skipped); pp++, i++) {
   5270         if (strcmp(pp->key, "Securitycheck") == 0) {
   5271 #if defined(OPENSSL_NO_FIPS_SECURITYCHECKS)
   5272 #else
   5273             if (!securitycheck_enabled())
   5274 #endif
   5275             {
   5276                 TEST_info("skipping, Securitycheck is disabled: %s:%d",
   5277                     t->s.test_file, t->s.start);
   5278                 t->skip = 1;
   5279                 return 0;
   5280             }
   5281         } else if (strcmp(pp->key, "Availablein") == 0) {
   5282             TEST_info("Line %d: 'Availablein' should be the first option",
   5283                 t->s.curr);
   5284             return 0;
   5285         } else if (strcmp(pp->key, "Result") == 0) {
   5286             if (t->expected_err != NULL) {
   5287                 TEST_info("Line %d: multiple result lines", t->s.curr);
   5288                 return 0;
   5289             }
   5290             t->expected_err = take_value(pp);
   5291         } else if (strcmp(pp->key, "Function") == 0) {
   5292             /* Ignore old line. */
   5293         } else if (strcmp(pp->key, "Reason") == 0) {
   5294             if (t->reason != NULL) {
   5295                 TEST_info("Line %d: multiple reason lines", t->s.curr);
   5296                 return 0;
   5297             }
   5298             t->reason = take_value(pp);
   5299         } else if (strcmp(pp->key, "Threads") == 0) {
   5300             if (OSSL_set_max_threads(libctx, atoi(pp->value)) == 0) {
   5301                 TEST_info("skipping, '%s' threads not available: %s:%d",
   5302                     pp->value, t->s.test_file, t->s.start);
   5303                 t->skip = 1;
   5304             }
   5305         } else if (strcmp(pp->key, "Unapproved") == 0) {
   5306             t->expect_unapproved = 1;
   5307         } else if (strcmp(pp->key, "Extended-Test") == 0) {
   5308             if (!extended_tests) {
   5309                 TEST_info("skipping extended test: %s:%d",
   5310                     t->s.test_file, t->s.start);
   5311                 t->skip = 1;
   5312             }
   5313         } else {
   5314             /* Must be test specific line: try to parse it */
   5315             int rv = t->meth->parse(t, pp->key, pp->value);
   5316 
   5317             if (rv == 0) {
   5318                 TEST_info("Line %d: unknown keyword %s", t->s.curr, pp->key);
   5319                 return 0;
   5320             }
   5321             if (rv < 0) {
   5322                 TEST_info("Line %d: error processing keyword %s = %s\n",
   5323                     t->s.curr, pp->key, pp->value);
   5324                 return 0;
   5325             }
   5326             if (t->skip)
   5327                 return 0;
   5328         }
   5329     }
   5330 
   5331     return 1;
   5332 }
   5333 
   5334 static int run_file_tests(int i)
   5335 {
   5336     EVP_TEST *t;
   5337     const char *testfile = test_get_argument(i);
   5338     int c;
   5339 
   5340     if (!TEST_ptr(t = OPENSSL_zalloc(sizeof(*t))))
   5341         return 0;
   5342     if (!test_start_file(&t->s, testfile)) {
   5343         OPENSSL_free(t);
   5344         return 0;
   5345     }
   5346 
   5347     OSSL_INDICATOR_set_callback(libctx, fips_indicator_cb);
   5348     while (!BIO_eof(t->s.fp)) {
   5349         c = parse(t);
   5350         if (t->skip) {
   5351             t->s.numskip++;
   5352             continue;
   5353         }
   5354         if (c == 0 || !run_test(t)) {
   5355             t->s.errors++;
   5356             break;
   5357         }
   5358     }
   5359     test_end_file(&t->s);
   5360     clear_test(t);
   5361 
   5362     free_key_list(public_keys);
   5363     public_keys = NULL;
   5364     free_key_list(private_keys);
   5365     private_keys = NULL;
   5366     BIO_free(t->s.key);
   5367     c = t->s.errors;
   5368     OPENSSL_free(t);
   5369     return c == 0;
   5370 }
   5371 
   5372 const OPTIONS *test_get_options(void)
   5373 {
   5374     static const OPTIONS test_options[] = {
   5375         OPT_TEST_OPTIONS_WITH_EXTRA_USAGE("[file...]\n"),
   5376         { "config", OPT_CONFIG_FILE, '<',
   5377             "The configuration file to use for the libctx" },
   5378         { "process", OPT_IN_PLACE, 's',
   5379             "Mode for data processing by cipher tests [in_place/both], both by default" },
   5380         { "provider", OPT_PROVIDER_NAME, 's',
   5381             "The provider to load (when no configuration file, the default value is 'default')" },
   5382         { "propquery", OPT_PROV_PROPQUERY, 's',
   5383             "Property query used when fetching algorithms" },
   5384         { "chunk", OPT_DATA_CHUNK, 'N', "Size of data chunks to be processed, 0 for default size" },
   5385         { OPT_HELP_STR, 1, '-', "file\tFile to run tests on.\n" },
   5386         { NULL }
   5387     };
   5388     return test_options;
   5389 }
   5390 
   5391 int setup_tests(void)
   5392 {
   5393     size_t n;
   5394     char *config_file = NULL;
   5395     char *provider_name = NULL;
   5396 
   5397     OPTION_CHOICE o;
   5398 
   5399     extended_tests = getenv("EVP_TEST_EXTENDED") != NULL;
   5400 
   5401     while ((o = opt_next()) != OPT_EOF) {
   5402         switch (o) {
   5403         case OPT_CONFIG_FILE:
   5404             config_file = opt_arg();
   5405             break;
   5406         case OPT_IN_PLACE:
   5407             if ((process_mode_in_place = evp_test_process_mode(opt_arg())) == -1)
   5408             case OPT_DATA_CHUNK:
   5409                 if (!opt_int(opt_arg(), &data_chunk_size))
   5410                     return 0;
   5411             break;
   5412         case OPT_PROVIDER_NAME:
   5413             provider_name = opt_arg();
   5414             break;
   5415         case OPT_PROV_PROPQUERY:
   5416             propquery = opt_arg();
   5417             break;
   5418         case OPT_TEST_CASES:
   5419             break;
   5420         default:
   5421         case OPT_ERR:
   5422             return 0;
   5423         }
   5424     }
   5425 
   5426     /*
   5427      * Load the provider via configuration into the created library context.
   5428      * Load the 'null' provider into the default library context to ensure that
   5429      * the tests do not fallback to using the default provider.
   5430      */
   5431     if (config_file == NULL && provider_name == NULL)
   5432         provider_name = "default";
   5433     if (!test_get_libctx(&libctx, &prov_null, config_file, &libprov, provider_name))
   5434         return 0;
   5435 
   5436     n = test_get_argument_count();
   5437     if (n == 0)
   5438         return 0;
   5439 
   5440     ADD_ALL_TESTS(run_file_tests, n);
   5441     return 1;
   5442 }
   5443 
   5444 void cleanup_tests(void)
   5445 {
   5446     OSSL_PROVIDER_unload(libprov);
   5447     OSSL_PROVIDER_unload(prov_null);
   5448     OSSL_LIB_CTX_free(libctx);
   5449 }
   5450 
   5451 static int is_digest_disabled(const char *name)
   5452 {
   5453 #ifdef OPENSSL_NO_BLAKE2
   5454     if (HAS_CASE_PREFIX(name, "BLAKE"))
   5455         return 1;
   5456 #endif
   5457 #ifdef OPENSSL_NO_MD2
   5458     if (OPENSSL_strcasecmp(name, "MD2") == 0)
   5459         return 1;
   5460 #endif
   5461 #ifdef OPENSSL_NO_MDC2
   5462     if (OPENSSL_strcasecmp(name, "MDC2") == 0)
   5463         return 1;
   5464 #endif
   5465 #ifdef OPENSSL_NO_MD4
   5466     if (OPENSSL_strcasecmp(name, "MD4") == 0)
   5467         return 1;
   5468 #endif
   5469 #ifdef OPENSSL_NO_MD5
   5470     if (OPENSSL_strcasecmp(name, "MD5") == 0)
   5471         return 1;
   5472 #endif
   5473 #ifdef OPENSSL_NO_RMD160
   5474     if (OPENSSL_strcasecmp(name, "RIPEMD160") == 0)
   5475         return 1;
   5476 #endif
   5477 #ifdef OPENSSL_NO_SM3
   5478     if (OPENSSL_strcasecmp(name, "SM3") == 0)
   5479         return 1;
   5480 #endif
   5481 #ifdef OPENSSL_NO_WHIRLPOOL
   5482     if (OPENSSL_strcasecmp(name, "WHIRLPOOL") == 0)
   5483         return 1;
   5484 #endif
   5485     return 0;
   5486 }
   5487 
   5488 static int is_pkey_disabled(const char *name)
   5489 {
   5490 #ifdef OPENSSL_NO_EC
   5491     if (HAS_CASE_PREFIX(name, "EC"))
   5492         return 1;
   5493 #endif
   5494 #ifdef OPENSSL_NO_DH
   5495     if (HAS_CASE_PREFIX(name, "DH"))
   5496         return 1;
   5497 #endif
   5498 #ifdef OPENSSL_NO_DSA
   5499     if (HAS_CASE_PREFIX(name, "DSA"))
   5500         return 1;
   5501 #endif
   5502 #ifdef OPENSSL_NO_SM2
   5503     if (HAS_CASE_PREFIX(name, "SM2"))
   5504         return 1;
   5505 #endif
   5506 
   5507     /* For sigalgs we use, we also check for digest suffixes */
   5508 #ifdef OPENSSL_NO_RMD160
   5509     if (HAS_CASE_SUFFIX(name, "-RIPEMD160"))
   5510         return 1;
   5511 #endif
   5512 #ifdef OPENSSL_NO_SM3
   5513     if (HAS_CASE_SUFFIX(name, "-SM3"))
   5514         return 1;
   5515 #endif
   5516 #ifdef OPENSSL_NO_ML_DSA
   5517     if (HAS_CASE_PREFIX(name, "ML-DSA"))
   5518         return 1;
   5519 #endif
   5520     return 0;
   5521 }
   5522 
   5523 static int is_mac_disabled(const char *name)
   5524 {
   5525 #ifdef OPENSSL_NO_BLAKE2
   5526     if (HAS_CASE_PREFIX(name, "BLAKE2BMAC")
   5527         || HAS_CASE_PREFIX(name, "BLAKE2SMAC"))
   5528         return 1;
   5529 #endif
   5530 #ifdef OPENSSL_NO_CMAC
   5531     if (HAS_CASE_PREFIX(name, "CMAC"))
   5532         return 1;
   5533 #endif
   5534 #ifdef OPENSSL_NO_POLY1305
   5535     if (HAS_CASE_PREFIX(name, "Poly1305"))
   5536         return 1;
   5537 #endif
   5538 #ifdef OPENSSL_NO_SIPHASH
   5539     if (HAS_CASE_PREFIX(name, "SipHash"))
   5540         return 1;
   5541 #endif
   5542     return 0;
   5543 }
   5544 static int is_kdf_disabled(const char *name)
   5545 {
   5546 #ifdef OPENSSL_NO_SCRYPT
   5547     if (HAS_CASE_SUFFIX(name, "SCRYPT"))
   5548         return 1;
   5549 #endif
   5550 #ifdef OPENSSL_NO_ARGON2
   5551     if (HAS_CASE_SUFFIX(name, "ARGON2"))
   5552         return 1;
   5553 #endif
   5554     return 0;
   5555 }
   5556 
   5557 static int is_cipher_disabled(const char *name)
   5558 {
   5559 #ifdef OPENSSL_NO_ARIA
   5560     if (HAS_CASE_PREFIX(name, "ARIA"))
   5561         return 1;
   5562 #endif
   5563 #ifdef OPENSSL_NO_BF
   5564     if (HAS_CASE_PREFIX(name, "BF"))
   5565         return 1;
   5566 #endif
   5567 #ifdef OPENSSL_NO_CAMELLIA
   5568     if (HAS_CASE_PREFIX(name, "CAMELLIA"))
   5569         return 1;
   5570 #endif
   5571 #ifdef OPENSSL_NO_CAST
   5572     if (HAS_CASE_PREFIX(name, "CAST"))
   5573         return 1;
   5574 #endif
   5575 #ifdef OPENSSL_NO_CHACHA
   5576     if (HAS_CASE_PREFIX(name, "CHACHA"))
   5577         return 1;
   5578 #endif
   5579 #ifdef OPENSSL_NO_POLY1305
   5580     if (HAS_CASE_SUFFIX(name, "Poly1305"))
   5581         return 1;
   5582 #endif
   5583 #ifdef OPENSSL_NO_DES
   5584     if (HAS_CASE_PREFIX(name, "DES"))
   5585         return 1;
   5586     if (HAS_CASE_SUFFIX(name, "3DESwrap"))
   5587         return 1;
   5588 #endif
   5589 #ifdef OPENSSL_NO_OCB
   5590     if (HAS_CASE_SUFFIX(name, "OCB"))
   5591         return 1;
   5592 #endif
   5593 #ifdef OPENSSL_NO_IDEA
   5594     if (HAS_CASE_PREFIX(name, "IDEA"))
   5595         return 1;
   5596 #endif
   5597 #ifdef OPENSSL_NO_RC2
   5598     if (HAS_CASE_PREFIX(name, "RC2"))
   5599         return 1;
   5600 #endif
   5601 #ifdef OPENSSL_NO_RC4
   5602     if (HAS_CASE_PREFIX(name, "RC4"))
   5603         return 1;
   5604 #endif
   5605 #ifdef OPENSSL_NO_RC5
   5606     if (HAS_CASE_PREFIX(name, "RC5"))
   5607         return 1;
   5608 #endif
   5609 #ifdef OPENSSL_NO_SEED
   5610     if (HAS_CASE_PREFIX(name, "SEED"))
   5611         return 1;
   5612 #endif
   5613 #ifdef OPENSSL_NO_SIV
   5614     if (HAS_CASE_SUFFIX(name, "SIV"))
   5615         return 1;
   5616 #endif
   5617 #ifdef OPENSSL_NO_SM4
   5618     if (HAS_CASE_PREFIX(name, "SM4"))
   5619         return 1;
   5620 #endif
   5621     return 0;
   5622 }
   5623