1/*
2 * Copyright 2015-2023 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/core_names.h>
24#include <openssl/fips_names.h>
25#include "internal/numbers.h"
26#include "internal/nelem.h"
27#include "crypto/evp.h"
28#include "testutil.h"
29
30typedef struct evp_test_buffer_st EVP_TEST_BUFFER;
31DEFINE_STACK_OF(EVP_TEST_BUFFER)
32
33#define AAD_NUM 4
34
35typedef struct evp_test_method_st EVP_TEST_METHOD;
36
37/* Structure holding test information */
38typedef struct evp_test_st {
39    STANZA s;                     /* Common test stanza */
40    char *name;
41    int skip;                     /* Current test should be skipped */
42    const EVP_TEST_METHOD *meth;  /* method for this test */
43    const char *err, *aux_err;    /* Error string for test */
44    char *expected_err;           /* Expected error value of test */
45    char *reason;                 /* Expected error reason string */
46    void *data;                   /* test specific data */
47} EVP_TEST;
48
49/* Test method structure */
50struct evp_test_method_st {
51    /* Name of test as it appears in file */
52    const char *name;
53    /* Initialise test for "alg" */
54    int (*init) (EVP_TEST * t, const char *alg);
55    /* Clean up method */
56    void (*cleanup) (EVP_TEST * t);
57    /* Test specific name value pair processing */
58    int (*parse) (EVP_TEST * t, const char *name, const char *value);
59    /* Run the test itself */
60    int (*run_test) (EVP_TEST * t);
61};
62
63/* Linked list of named keys. */
64typedef struct key_list_st {
65    char *name;
66    EVP_PKEY *key;
67    struct key_list_st *next;
68} KEY_LIST;
69
70typedef enum OPTION_choice {
71    OPT_ERR = -1,
72    OPT_EOF = 0,
73    OPT_CONFIG_FILE,
74    OPT_TEST_ENUM
75} OPTION_CHOICE;
76
77static OSSL_PROVIDER *prov_null = NULL;
78static OSSL_LIB_CTX *libctx = NULL;
79
80/* List of public and private keys */
81static KEY_LIST *private_keys;
82static KEY_LIST *public_keys;
83
84static int find_key(EVP_PKEY **ppk, const char *name, KEY_LIST *lst);
85static int parse_bin(const char *value, unsigned char **buf, size_t *buflen);
86static int is_digest_disabled(const char *name);
87static int is_pkey_disabled(const char *name);
88static int is_mac_disabled(const char *name);
89static int is_cipher_disabled(const char *name);
90static int is_kdf_disabled(const char *name);
91
92/*
93 * Compare two memory regions for equality, returning zero if they differ.
94 * However, if there is expected to be an error and the actual error
95 * matches then the memory is expected to be different so handle this
96 * case without producing unnecessary test framework output.
97 */
98static int memory_err_compare(EVP_TEST *t, const char *err,
99                              const void *expected, size_t expected_len,
100                              const void *got, size_t got_len)
101{
102    int r;
103
104    if (t->expected_err != NULL && strcmp(t->expected_err, err) == 0)
105        r = !TEST_mem_ne(expected, expected_len, got, got_len);
106    else
107        r = TEST_mem_eq(expected, expected_len, got, got_len);
108    if (!r)
109        t->err = err;
110    return r;
111}
112
113/*
114 * Structure used to hold a list of blocks of memory to test
115 * calls to "update" like functions.
116 */
117struct evp_test_buffer_st {
118    unsigned char *buf;
119    size_t buflen;
120    size_t count;
121    int count_set;
122};
123
124static void evp_test_buffer_free(EVP_TEST_BUFFER *db)
125{
126    if (db != NULL) {
127        OPENSSL_free(db->buf);
128        OPENSSL_free(db);
129    }
130}
131
132/* append buffer to a list */
133static int evp_test_buffer_append(const char *value,
134                                  STACK_OF(EVP_TEST_BUFFER) **sk)
135{
136    EVP_TEST_BUFFER *db = NULL;
137
138    if (!TEST_ptr(db = OPENSSL_malloc(sizeof(*db))))
139        goto err;
140
141    if (!parse_bin(value, &db->buf, &db->buflen))
142        goto err;
143    db->count = 1;
144    db->count_set = 0;
145
146    if (*sk == NULL && !TEST_ptr(*sk = sk_EVP_TEST_BUFFER_new_null()))
147        goto err;
148    if (!sk_EVP_TEST_BUFFER_push(*sk, db))
149        goto err;
150
151    return 1;
152
153err:
154    evp_test_buffer_free(db);
155    return 0;
156}
157
158/* replace last buffer in list with copies of itself */
159static int evp_test_buffer_ncopy(const char *value,
160                                 STACK_OF(EVP_TEST_BUFFER) *sk)
161{
162    EVP_TEST_BUFFER *db;
163    unsigned char *tbuf, *p;
164    size_t tbuflen;
165    int ncopy = atoi(value);
166    int i;
167
168    if (ncopy <= 0)
169        return 0;
170    if (sk == NULL || sk_EVP_TEST_BUFFER_num(sk) == 0)
171        return 0;
172    db = sk_EVP_TEST_BUFFER_value(sk, sk_EVP_TEST_BUFFER_num(sk) - 1);
173
174    tbuflen = db->buflen * ncopy;
175    if (!TEST_ptr(tbuf = OPENSSL_malloc(tbuflen)))
176        return 0;
177    for (i = 0, p = tbuf; i < ncopy; i++, p += db->buflen)
178        memcpy(p, db->buf, db->buflen);
179
180    OPENSSL_free(db->buf);
181    db->buf = tbuf;
182    db->buflen = tbuflen;
183    return 1;
184}
185
186/* set repeat count for last buffer in list */
187static int evp_test_buffer_set_count(const char *value,
188                                     STACK_OF(EVP_TEST_BUFFER) *sk)
189{
190    EVP_TEST_BUFFER *db;
191    int count = atoi(value);
192
193    if (count <= 0)
194        return 0;
195
196    if (sk == NULL || sk_EVP_TEST_BUFFER_num(sk) == 0)
197        return 0;
198
199    db = sk_EVP_TEST_BUFFER_value(sk, sk_EVP_TEST_BUFFER_num(sk) - 1);
200    if (db->count_set != 0)
201        return 0;
202
203    db->count = (size_t)count;
204    db->count_set = 1;
205    return 1;
206}
207
208/* call "fn" with each element of the list in turn */
209static int evp_test_buffer_do(STACK_OF(EVP_TEST_BUFFER) *sk,
210                              int (*fn)(void *ctx,
211                                        const unsigned char *buf,
212                                        size_t buflen),
213                              void *ctx)
214{
215    int i;
216
217    for (i = 0; i < sk_EVP_TEST_BUFFER_num(sk); i++) {
218        EVP_TEST_BUFFER *tb = sk_EVP_TEST_BUFFER_value(sk, i);
219        size_t j;
220
221        for (j = 0; j < tb->count; j++) {
222            if (fn(ctx, tb->buf, tb->buflen) <= 0)
223                return 0;
224        }
225    }
226    return 1;
227}
228
229/*
230 * Unescape some sequences in string literals (only \n for now).
231 * Return an allocated buffer, set |out_len|.  If |input_len|
232 * is zero, get an empty buffer but set length to zero.
233 */
234static unsigned char* unescape(const char *input, size_t input_len,
235                               size_t *out_len)
236{
237    unsigned char *ret, *p;
238    size_t i;
239
240    if (input_len == 0) {
241        *out_len = 0;
242        return OPENSSL_zalloc(1);
243    }
244
245    /* Escaping is non-expanding; over-allocate original size for simplicity. */
246    if (!TEST_ptr(ret = p = OPENSSL_malloc(input_len)))
247        return NULL;
248
249    for (i = 0; i < input_len; i++) {
250        if (*input == '\\') {
251            if (i == input_len - 1 || *++input != 'n') {
252                TEST_error("Bad escape sequence in file");
253                goto err;
254            }
255            *p++ = '\n';
256            i++;
257            input++;
258        } else {
259            *p++ = *input++;
260        }
261    }
262
263    *out_len = p - ret;
264    return ret;
265
266 err:
267    OPENSSL_free(ret);
268    return NULL;
269}
270
271/*
272 * For a hex string "value" convert to a binary allocated buffer.
273 * Return 1 on success or 0 on failure.
274 */
275static int parse_bin(const char *value, unsigned char **buf, size_t *buflen)
276{
277    long len;
278
279    /* Check for NULL literal */
280    if (strcmp(value, "NULL") == 0) {
281        *buf = NULL;
282        *buflen = 0;
283        return 1;
284    }
285
286    /* Check for empty value */
287    if (*value == '\0') {
288        /*
289         * Don't return NULL for zero length buffer. This is needed for
290         * some tests with empty keys: HMAC_Init_ex() expects a non-NULL key
291         * buffer even if the key length is 0, in order to detect key reset.
292         */
293        *buf = OPENSSL_malloc(1);
294        if (*buf == NULL)
295            return 0;
296        **buf = 0;
297        *buflen = 0;
298        return 1;
299    }
300
301    /* Check for string literal */
302    if (value[0] == '"') {
303        size_t vlen = strlen(++value);
304
305        if (vlen == 0 || value[vlen - 1] != '"')
306            return 0;
307        vlen--;
308        *buf = unescape(value, vlen, buflen);
309        return *buf == NULL ? 0 : 1;
310    }
311
312    /* Otherwise assume as hex literal and convert it to binary buffer */
313    if (!TEST_ptr(*buf = OPENSSL_hexstr2buf(value, &len))) {
314        TEST_info("Can't convert %s", value);
315        TEST_openssl_errors();
316        return -1;
317    }
318    /* Size of input buffer means we'll never overflow */
319    *buflen = len;
320    return 1;
321}
322
323/**
324 **  MESSAGE DIGEST TESTS
325 **/
326
327typedef struct digest_data_st {
328    /* Digest this test is for */
329    const EVP_MD *digest;
330    EVP_MD *fetched_digest;
331    /* Input to digest */
332    STACK_OF(EVP_TEST_BUFFER) *input;
333    /* Expected output */
334    unsigned char *output;
335    size_t output_len;
336    /* Padding type */
337    int pad_type;
338} DIGEST_DATA;
339
340static int digest_test_init(EVP_TEST *t, const char *alg)
341{
342    DIGEST_DATA *mdat;
343    const EVP_MD *digest;
344    EVP_MD *fetched_digest;
345
346    if (is_digest_disabled(alg)) {
347        TEST_info("skipping, '%s' is disabled", alg);
348        t->skip = 1;
349        return 1;
350    }
351
352    if ((digest = fetched_digest = EVP_MD_fetch(libctx, alg, NULL)) == NULL
353        && (digest = EVP_get_digestbyname(alg)) == NULL)
354        return 0;
355    if (!TEST_ptr(mdat = OPENSSL_zalloc(sizeof(*mdat))))
356        return 0;
357    t->data = mdat;
358    mdat->digest = digest;
359    mdat->fetched_digest = fetched_digest;
360    mdat->pad_type = 0;
361    if (fetched_digest != NULL)
362        TEST_info("%s is fetched", alg);
363    return 1;
364}
365
366static void digest_test_cleanup(EVP_TEST *t)
367{
368    DIGEST_DATA *mdat = t->data;
369
370    sk_EVP_TEST_BUFFER_pop_free(mdat->input, evp_test_buffer_free);
371    OPENSSL_free(mdat->output);
372    EVP_MD_free(mdat->fetched_digest);
373}
374
375static int digest_test_parse(EVP_TEST *t,
376                             const char *keyword, const char *value)
377{
378    DIGEST_DATA *mdata = t->data;
379
380    if (strcmp(keyword, "Input") == 0)
381        return evp_test_buffer_append(value, &mdata->input);
382    if (strcmp(keyword, "Output") == 0)
383        return parse_bin(value, &mdata->output, &mdata->output_len);
384    if (strcmp(keyword, "Count") == 0)
385        return evp_test_buffer_set_count(value, mdata->input);
386    if (strcmp(keyword, "Ncopy") == 0)
387        return evp_test_buffer_ncopy(value, mdata->input);
388    if (strcmp(keyword, "Padding") == 0)
389        return (mdata->pad_type = atoi(value)) > 0;
390    return 0;
391}
392
393static int digest_update_fn(void *ctx, const unsigned char *buf, size_t buflen)
394{
395    return EVP_DigestUpdate(ctx, buf, buflen);
396}
397
398static int digest_test_run(EVP_TEST *t)
399{
400    DIGEST_DATA *expected = t->data;
401    EVP_TEST_BUFFER *inbuf;
402    EVP_MD_CTX *mctx;
403    unsigned char *got = NULL;
404    unsigned int got_len;
405    size_t size = 0;
406    int xof = 0;
407    OSSL_PARAM params[2];
408
409    t->err = "TEST_FAILURE";
410    if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
411        goto err;
412
413    got = OPENSSL_malloc(expected->output_len > EVP_MAX_MD_SIZE ?
414                         expected->output_len : EVP_MAX_MD_SIZE);
415    if (!TEST_ptr(got))
416        goto err;
417
418    if (!EVP_DigestInit_ex(mctx, expected->digest, NULL)) {
419        t->err = "DIGESTINIT_ERROR";
420        goto err;
421    }
422    if (expected->pad_type > 0) {
423        params[0] = OSSL_PARAM_construct_int(OSSL_DIGEST_PARAM_PAD_TYPE,
424                                              &expected->pad_type);
425        params[1] = OSSL_PARAM_construct_end();
426        if (!TEST_int_gt(EVP_MD_CTX_set_params(mctx, params), 0)) {
427            t->err = "PARAMS_ERROR";
428            goto err;
429        }
430    }
431    if (!evp_test_buffer_do(expected->input, digest_update_fn, mctx)) {
432        t->err = "DIGESTUPDATE_ERROR";
433        goto err;
434    }
435
436    xof = (EVP_MD_get_flags(expected->digest) & EVP_MD_FLAG_XOF) != 0;
437    if (xof) {
438        EVP_MD_CTX *mctx_cpy;
439        char dont[] = "touch";
440
441        if (!TEST_ptr(mctx_cpy = EVP_MD_CTX_new())) {
442            goto err;
443        }
444        if (!EVP_MD_CTX_copy(mctx_cpy, mctx)) {
445            EVP_MD_CTX_free(mctx_cpy);
446            goto err;
447        }
448        if (!EVP_DigestFinalXOF(mctx_cpy, (unsigned char *)dont, 0)) {
449            EVP_MD_CTX_free(mctx_cpy);
450            t->err = "DIGESTFINALXOF_ERROR";
451            goto err;
452        }
453        if (!TEST_str_eq(dont, "touch")) {
454            EVP_MD_CTX_free(mctx_cpy);
455            t->err = "DIGESTFINALXOF_ERROR";
456            goto err;
457        }
458        EVP_MD_CTX_free(mctx_cpy);
459
460        got_len = expected->output_len;
461        if (!EVP_DigestFinalXOF(mctx, got, got_len)) {
462            t->err = "DIGESTFINALXOF_ERROR";
463            goto err;
464        }
465    } else {
466        if (!EVP_DigestFinal(mctx, got, &got_len)) {
467            t->err = "DIGESTFINAL_ERROR";
468            goto err;
469        }
470    }
471    if (!TEST_int_eq(expected->output_len, got_len)) {
472        t->err = "DIGEST_LENGTH_MISMATCH";
473        goto err;
474    }
475    if (!memory_err_compare(t, "DIGEST_MISMATCH",
476                            expected->output, expected->output_len,
477                            got, got_len))
478        goto err;
479
480    t->err = NULL;
481
482    /* Test the EVP_Q_digest interface as well */
483    if (sk_EVP_TEST_BUFFER_num(expected->input) == 1
484            && !xof
485            /* This should never fail but we need the returned pointer now */
486            && !TEST_ptr(inbuf = sk_EVP_TEST_BUFFER_value(expected->input, 0))
487            && !inbuf->count_set) {
488        OPENSSL_cleanse(got, got_len);
489        if (!TEST_true(EVP_Q_digest(libctx,
490                                    EVP_MD_get0_name(expected->fetched_digest),
491                                    NULL, inbuf->buf, inbuf->buflen,
492                                    got, &size))
493                || !TEST_mem_eq(got, size,
494                                expected->output, expected->output_len)) {
495            t->err = "EVP_Q_digest failed";
496            goto err;
497        }
498    }
499
500 err:
501    OPENSSL_free(got);
502    EVP_MD_CTX_free(mctx);
503    return 1;
504}
505
506static const EVP_TEST_METHOD digest_test_method = {
507    "Digest",
508    digest_test_init,
509    digest_test_cleanup,
510    digest_test_parse,
511    digest_test_run
512};
513
514/**
515***  CIPHER TESTS
516**/
517
518typedef struct cipher_data_st {
519    const EVP_CIPHER *cipher;
520    EVP_CIPHER *fetched_cipher;
521    int enc;
522    /* EVP_CIPH_GCM_MODE, EVP_CIPH_CCM_MODE or EVP_CIPH_OCB_MODE if AEAD */
523    int aead;
524    unsigned char *key;
525    size_t key_len;
526    size_t key_bits; /* Used by RC2 */
527    unsigned char *iv;
528    unsigned char *next_iv; /* Expected IV state after operation */
529    unsigned int rounds;
530    size_t iv_len;
531    unsigned char *plaintext;
532    size_t plaintext_len;
533    unsigned char *ciphertext;
534    size_t ciphertext_len;
535    /* AEAD ciphers only */
536    unsigned char *aad[AAD_NUM];
537    size_t aad_len[AAD_NUM];
538    int tls_aad;
539    int tls_version;
540    unsigned char *tag;
541    const char *cts_mode;
542    size_t tag_len;
543    int tag_late;
544    unsigned char *mac_key;
545    size_t mac_key_len;
546} CIPHER_DATA;
547
548static int cipher_test_init(EVP_TEST *t, const char *alg)
549{
550    const EVP_CIPHER *cipher;
551    EVP_CIPHER *fetched_cipher;
552    CIPHER_DATA *cdat;
553    int m;
554
555    if (is_cipher_disabled(alg)) {
556        t->skip = 1;
557        TEST_info("skipping, '%s' is disabled", alg);
558        return 1;
559    }
560
561    ERR_set_mark();
562    if ((cipher = fetched_cipher = EVP_CIPHER_fetch(libctx, alg, NULL)) == NULL
563        && (cipher = EVP_get_cipherbyname(alg)) == NULL) {
564        /* a stitched cipher might not be available */
565        if (strstr(alg, "HMAC") != NULL) {
566            ERR_pop_to_mark();
567            t->skip = 1;
568            TEST_info("skipping, '%s' is not available", alg);
569            return 1;
570        }
571        ERR_clear_last_mark();
572        return 0;
573    }
574    ERR_clear_last_mark();
575
576    if (!TEST_ptr(cdat = OPENSSL_zalloc(sizeof(*cdat))))
577        return 0;
578
579    cdat->cipher = cipher;
580    cdat->fetched_cipher = fetched_cipher;
581    cdat->enc = -1;
582    m = EVP_CIPHER_get_mode(cipher);
583    if (EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER)
584        cdat->aead = m != 0 ? m : -1;
585    else
586        cdat->aead = 0;
587
588    t->data = cdat;
589    if (fetched_cipher != NULL)
590        TEST_info("%s is fetched", alg);
591    return 1;
592}
593
594static void cipher_test_cleanup(EVP_TEST *t)
595{
596    int i;
597    CIPHER_DATA *cdat = t->data;
598
599    OPENSSL_free(cdat->key);
600    OPENSSL_free(cdat->iv);
601    OPENSSL_free(cdat->next_iv);
602    OPENSSL_free(cdat->ciphertext);
603    OPENSSL_free(cdat->plaintext);
604    for (i = 0; i < AAD_NUM; i++)
605        OPENSSL_free(cdat->aad[i]);
606    OPENSSL_free(cdat->tag);
607    OPENSSL_free(cdat->mac_key);
608    EVP_CIPHER_free(cdat->fetched_cipher);
609}
610
611static int cipher_test_parse(EVP_TEST *t, const char *keyword,
612                             const char *value)
613{
614    CIPHER_DATA *cdat = t->data;
615    int i;
616
617    if (strcmp(keyword, "Key") == 0)
618        return parse_bin(value, &cdat->key, &cdat->key_len);
619    if (strcmp(keyword, "Rounds") == 0) {
620        i = atoi(value);
621        if (i < 0)
622            return -1;
623        cdat->rounds = (unsigned int)i;
624        return 1;
625    }
626    if (strcmp(keyword, "IV") == 0)
627        return parse_bin(value, &cdat->iv, &cdat->iv_len);
628    if (strcmp(keyword, "NextIV") == 0)
629        return parse_bin(value, &cdat->next_iv, &cdat->iv_len);
630    if (strcmp(keyword, "Plaintext") == 0)
631        return parse_bin(value, &cdat->plaintext, &cdat->plaintext_len);
632    if (strcmp(keyword, "Ciphertext") == 0)
633        return parse_bin(value, &cdat->ciphertext, &cdat->ciphertext_len);
634    if (strcmp(keyword, "KeyBits") == 0) {
635        i = atoi(value);
636        if (i < 0)
637            return -1;
638        cdat->key_bits = (size_t)i;
639        return 1;
640    }
641    if (cdat->aead) {
642        int tls_aad = 0;
643
644        if (strcmp(keyword, "TLSAAD") == 0)
645            cdat->tls_aad = tls_aad = 1;
646        if (strcmp(keyword, "AAD") == 0 || tls_aad) {
647            for (i = 0; i < AAD_NUM; i++) {
648                if (cdat->aad[i] == NULL)
649                    return parse_bin(value, &cdat->aad[i], &cdat->aad_len[i]);
650            }
651            return -1;
652        }
653        if (strcmp(keyword, "Tag") == 0)
654            return parse_bin(value, &cdat->tag, &cdat->tag_len);
655        if (strcmp(keyword, "SetTagLate") == 0) {
656            if (strcmp(value, "TRUE") == 0)
657                cdat->tag_late = 1;
658            else if (strcmp(value, "FALSE") == 0)
659                cdat->tag_late = 0;
660            else
661                return -1;
662            return 1;
663        }
664        if (strcmp(keyword, "MACKey") == 0)
665            return parse_bin(value, &cdat->mac_key, &cdat->mac_key_len);
666        if (strcmp(keyword, "TLSVersion") == 0) {
667            char *endptr;
668
669            cdat->tls_version = (int)strtol(value, &endptr, 0);
670            return value[0] != '\0' && endptr[0] == '\0';
671        }
672    }
673
674    if (strcmp(keyword, "Operation") == 0) {
675        if (strcmp(value, "ENCRYPT") == 0)
676            cdat->enc = 1;
677        else if (strcmp(value, "DECRYPT") == 0)
678            cdat->enc = 0;
679        else
680            return -1;
681        return 1;
682    }
683    if (strcmp(keyword, "CTSMode") == 0) {
684        cdat->cts_mode = value;
685        return 1;
686    }
687    return 0;
688}
689
690static int cipher_test_enc(EVP_TEST *t, int enc,
691                           size_t out_misalign, size_t inp_misalign, int frag)
692{
693    CIPHER_DATA *expected = t->data;
694    unsigned char *in, *expected_out, *tmp = NULL;
695    size_t in_len, out_len, donelen = 0;
696    int ok = 0, tmplen, chunklen, tmpflen, i;
697    EVP_CIPHER_CTX *ctx_base = NULL;
698    EVP_CIPHER_CTX *ctx = NULL;
699
700    t->err = "TEST_FAILURE";
701    if (!TEST_ptr(ctx_base = EVP_CIPHER_CTX_new()))
702        goto err;
703    if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new()))
704        goto err;
705    EVP_CIPHER_CTX_set_flags(ctx_base, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
706    if (enc) {
707        in = expected->plaintext;
708        in_len = expected->plaintext_len;
709        expected_out = expected->ciphertext;
710        out_len = expected->ciphertext_len;
711    } else {
712        in = expected->ciphertext;
713        in_len = expected->ciphertext_len;
714        expected_out = expected->plaintext;
715        out_len = expected->plaintext_len;
716    }
717    if (inp_misalign == (size_t)-1) {
718        /* Exercise in-place encryption */
719        tmp = OPENSSL_malloc(out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH);
720        if (!tmp)
721            goto err;
722        in = memcpy(tmp + out_misalign, in, in_len);
723    } else {
724        inp_misalign += 16 - ((out_misalign + in_len) & 15);
725        /*
726         * 'tmp' will store both output and copy of input. We make the copy
727         * of input to specifically aligned part of 'tmp'. So we just
728         * figured out how much padding would ensure the required alignment,
729         * now we allocate extended buffer and finally copy the input just
730         * past inp_misalign in expression below. Output will be written
731         * past out_misalign...
732         */
733        tmp = OPENSSL_malloc(out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH +
734                             inp_misalign + in_len);
735        if (!tmp)
736            goto err;
737        in = memcpy(tmp + out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH +
738                    inp_misalign, in, in_len);
739    }
740    if (!EVP_CipherInit_ex(ctx_base, expected->cipher, NULL, NULL, NULL, enc)) {
741        t->err = "CIPHERINIT_ERROR";
742        goto err;
743    }
744    if (expected->cts_mode != NULL) {
745        OSSL_PARAM params[2];
746
747        params[0] = OSSL_PARAM_construct_utf8_string(OSSL_CIPHER_PARAM_CTS_MODE,
748                                                     (char *)(intptr_t)expected->cts_mode,
749                                                     0);
750        params[1] = OSSL_PARAM_construct_end();
751        if (!EVP_CIPHER_CTX_set_params(ctx_base, params)) {
752            t->err = "INVALID_CTS_MODE";
753            goto err;
754        }
755    }
756    if (expected->iv) {
757        if (expected->aead) {
758            if (EVP_CIPHER_CTX_ctrl(ctx_base, EVP_CTRL_AEAD_SET_IVLEN,
759                                     expected->iv_len, 0) <= 0) {
760                t->err = "INVALID_IV_LENGTH";
761                goto err;
762            }
763        } else if (expected->iv_len != (size_t)EVP_CIPHER_CTX_get_iv_length(ctx_base)) {
764            t->err = "INVALID_IV_LENGTH";
765            goto err;
766        }
767    }
768    if (expected->aead && !expected->tls_aad) {
769        unsigned char *tag;
770        /*
771         * If encrypting or OCB just set tag length initially, otherwise
772         * set tag length and value.
773         */
774        if (enc || expected->aead == EVP_CIPH_OCB_MODE || expected->tag_late) {
775            t->err = "TAG_LENGTH_SET_ERROR";
776            tag = NULL;
777        } else {
778            t->err = "TAG_SET_ERROR";
779            tag = expected->tag;
780        }
781        if (tag || expected->aead != EVP_CIPH_GCM_MODE) {
782            if (EVP_CIPHER_CTX_ctrl(ctx_base, EVP_CTRL_AEAD_SET_TAG,
783                                     expected->tag_len, tag) <= 0)
784                goto err;
785        }
786    }
787
788    if (expected->rounds > 0) {
789        int  rounds = (int)expected->rounds;
790
791        if (EVP_CIPHER_CTX_ctrl(ctx_base, EVP_CTRL_SET_RC5_ROUNDS, rounds, NULL) <= 0) {
792            t->err = "INVALID_ROUNDS";
793            goto err;
794        }
795    }
796
797    if (!EVP_CIPHER_CTX_set_key_length(ctx_base, expected->key_len)) {
798        t->err = "INVALID_KEY_LENGTH";
799        goto err;
800    }
801    if (expected->key_bits > 0) {
802        int bits = (int)expected->key_bits;
803
804        if (EVP_CIPHER_CTX_ctrl(ctx_base, EVP_CTRL_SET_RC2_KEY_BITS, bits, NULL) <= 0) {
805            t->err = "INVALID KEY BITS";
806            goto err;
807        }
808    }
809    if (!EVP_CipherInit_ex(ctx_base, NULL, NULL, expected->key, expected->iv, -1)) {
810        t->err = "KEY_SET_ERROR";
811        goto err;
812    }
813
814    /* Check that we get the same IV back */
815    if (expected->iv != NULL) {
816        /* Some (e.g., GCM) tests use IVs longer than EVP_MAX_IV_LENGTH. */
817        unsigned char iv[128];
818        if (!TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx_base, iv, sizeof(iv)))
819            || ((EVP_CIPHER_get_flags(expected->cipher) & EVP_CIPH_CUSTOM_IV) == 0
820                && !TEST_mem_eq(expected->iv, expected->iv_len, iv,
821                                expected->iv_len))) {
822            t->err = "INVALID_IV";
823            goto err;
824        }
825    }
826
827    /* Test that the cipher dup functions correctly if it is supported */
828    ERR_set_mark();
829    if (EVP_CIPHER_CTX_copy(ctx, ctx_base)) {
830        EVP_CIPHER_CTX_free(ctx_base);
831        ctx_base = NULL;
832    } else {
833        EVP_CIPHER_CTX_free(ctx);
834        ctx = ctx_base;
835    }
836    ERR_pop_to_mark();
837
838    if (expected->mac_key != NULL
839        && EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_MAC_KEY,
840                                (int)expected->mac_key_len,
841                                (void *)expected->mac_key) <= 0) {
842        t->err = "SET_MAC_KEY_ERROR";
843        goto err;
844    }
845
846    if (expected->tls_version) {
847        OSSL_PARAM params[2];
848
849        params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_TLS_VERSION,
850                                             &expected->tls_version);
851        params[1] = OSSL_PARAM_construct_end();
852        if (!EVP_CIPHER_CTX_set_params(ctx, params)) {
853            t->err = "SET_TLS_VERSION_ERROR";
854            goto err;
855        }
856    }
857
858    if (expected->aead == EVP_CIPH_CCM_MODE) {
859        if (!EVP_CipherUpdate(ctx, NULL, &tmplen, NULL, out_len)) {
860            t->err = "CCM_PLAINTEXT_LENGTH_SET_ERROR";
861            goto err;
862        }
863    }
864    if (expected->aad[0] != NULL && !expected->tls_aad) {
865        t->err = "AAD_SET_ERROR";
866        if (!frag) {
867            for (i = 0; expected->aad[i] != NULL; i++) {
868                if (!EVP_CipherUpdate(ctx, NULL, &chunklen, expected->aad[i],
869                                      expected->aad_len[i]))
870                    goto err;
871            }
872        } else {
873            /*
874             * Supply the AAD in chunks less than the block size where possible
875             */
876            for (i = 0; expected->aad[i] != NULL; i++) {
877                if (expected->aad_len[i] > 0) {
878                    if (!EVP_CipherUpdate(ctx, NULL, &chunklen, expected->aad[i], 1))
879                        goto err;
880                    donelen++;
881                }
882                if (expected->aad_len[i] > 2) {
883                    if (!EVP_CipherUpdate(ctx, NULL, &chunklen,
884                                          expected->aad[i] + donelen,
885                                          expected->aad_len[i] - 2))
886                        goto err;
887                    donelen += expected->aad_len[i] - 2;
888                }
889                if (expected->aad_len[i] > 1
890                    && !EVP_CipherUpdate(ctx, NULL, &chunklen,
891                                         expected->aad[i] + donelen, 1))
892                    goto err;
893            }
894        }
895    }
896
897    if (expected->tls_aad) {
898        OSSL_PARAM params[2];
899        char *tls_aad;
900
901        /* duplicate the aad as the implementation might modify it */
902        if ((tls_aad = OPENSSL_memdup(expected->aad[0],
903                                      expected->aad_len[0])) == NULL)
904            goto err;
905        params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD,
906                                                      tls_aad,
907                                                      expected->aad_len[0]);
908        params[1] = OSSL_PARAM_construct_end();
909        if (!EVP_CIPHER_CTX_set_params(ctx, params)) {
910            OPENSSL_free(tls_aad);
911            t->err = "TLS1_AAD_ERROR";
912            goto err;
913        }
914        OPENSSL_free(tls_aad);
915    } else if (!enc && (expected->aead == EVP_CIPH_OCB_MODE
916                        || expected->tag_late)) {
917        if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
918                                 expected->tag_len, expected->tag) <= 0) {
919            t->err = "TAG_SET_ERROR";
920            goto err;
921        }
922    }
923
924    EVP_CIPHER_CTX_set_padding(ctx, 0);
925    t->err = "CIPHERUPDATE_ERROR";
926    tmplen = 0;
927    if (!frag) {
928        /* We supply the data all in one go */
929        if (!EVP_CipherUpdate(ctx, tmp + out_misalign, &tmplen, in, in_len))
930            goto err;
931    } else {
932        /* Supply the data in chunks less than the block size where possible */
933        if (in_len > 0) {
934            if (!EVP_CipherUpdate(ctx, tmp + out_misalign, &chunklen, in, 1))
935                goto err;
936            tmplen += chunklen;
937            in++;
938            in_len--;
939        }
940        if (in_len > 1) {
941            if (!EVP_CipherUpdate(ctx, tmp + out_misalign + tmplen, &chunklen,
942                                  in, in_len - 1))
943                goto err;
944            tmplen += chunklen;
945            in += in_len - 1;
946            in_len = 1;
947        }
948        if (in_len > 0 ) {
949            if (!EVP_CipherUpdate(ctx, tmp + out_misalign + tmplen, &chunklen,
950                                  in, 1))
951                goto err;
952            tmplen += chunklen;
953        }
954    }
955    if (!EVP_CipherFinal_ex(ctx, tmp + out_misalign + tmplen, &tmpflen)) {
956        t->err = "CIPHERFINAL_ERROR";
957        goto err;
958    }
959    if (!enc && expected->tls_aad) {
960        if (expected->tls_version >= TLS1_1_VERSION
961            && (EVP_CIPHER_is_a(expected->cipher, "AES-128-CBC-HMAC-SHA1")
962                || EVP_CIPHER_is_a(expected->cipher, "AES-256-CBC-HMAC-SHA1"))) {
963            tmplen -= expected->iv_len;
964            expected_out += expected->iv_len;
965            out_misalign += expected->iv_len;
966        }
967        if ((int)out_len > tmplen + tmpflen)
968            out_len = tmplen + tmpflen;
969    }
970    if (!memory_err_compare(t, "VALUE_MISMATCH", expected_out, out_len,
971                            tmp + out_misalign, tmplen + tmpflen))
972        goto err;
973    if (enc && expected->aead && !expected->tls_aad) {
974        unsigned char rtag[16];
975
976        if (!TEST_size_t_le(expected->tag_len, sizeof(rtag))) {
977            t->err = "TAG_LENGTH_INTERNAL_ERROR";
978            goto err;
979        }
980        if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG,
981                                 expected->tag_len, rtag) <= 0) {
982            t->err = "TAG_RETRIEVE_ERROR";
983            goto err;
984        }
985        if (!memory_err_compare(t, "TAG_VALUE_MISMATCH",
986                                expected->tag, expected->tag_len,
987                                rtag, expected->tag_len))
988            goto err;
989    }
990    /* Check the updated IV */
991    if (expected->next_iv != NULL) {
992        /* Some (e.g., GCM) tests use IVs longer than EVP_MAX_IV_LENGTH. */
993        unsigned char iv[128];
994        if (!TEST_true(EVP_CIPHER_CTX_get_updated_iv(ctx, iv, sizeof(iv)))
995            || ((EVP_CIPHER_get_flags(expected->cipher) & EVP_CIPH_CUSTOM_IV) == 0
996                && !TEST_mem_eq(expected->next_iv, expected->iv_len, iv,
997                                expected->iv_len))) {
998            t->err = "INVALID_NEXT_IV";
999            goto err;
1000        }
1001    }
1002
1003    t->err = NULL;
1004    ok = 1;
1005 err:
1006    OPENSSL_free(tmp);
1007    if (ctx != ctx_base)
1008        EVP_CIPHER_CTX_free(ctx_base);
1009    EVP_CIPHER_CTX_free(ctx);
1010    return ok;
1011}
1012
1013static int cipher_test_run(EVP_TEST *t)
1014{
1015    CIPHER_DATA *cdat = t->data;
1016    int rv, frag = 0;
1017    size_t out_misalign, inp_misalign;
1018
1019    if (!cdat->key) {
1020        t->err = "NO_KEY";
1021        return 0;
1022    }
1023    if (!cdat->iv && EVP_CIPHER_get_iv_length(cdat->cipher)) {
1024        /* IV is optional and usually omitted in wrap mode */
1025        if (EVP_CIPHER_get_mode(cdat->cipher) != EVP_CIPH_WRAP_MODE) {
1026            t->err = "NO_IV";
1027            return 0;
1028        }
1029    }
1030    if (cdat->aead && cdat->tag == NULL && !cdat->tls_aad) {
1031        t->err = "NO_TAG";
1032        return 0;
1033    }
1034    for (out_misalign = 0; out_misalign <= 1;) {
1035        static char aux_err[64];
1036        t->aux_err = aux_err;
1037        for (inp_misalign = (size_t)-1; inp_misalign != 2; inp_misalign++) {
1038            if (inp_misalign == (size_t)-1) {
1039                /* kludge: inp_misalign == -1 means "exercise in-place" */
1040                BIO_snprintf(aux_err, sizeof(aux_err),
1041                             "%s in-place, %sfragmented",
1042                             out_misalign ? "misaligned" : "aligned",
1043                             frag ? "" : "not ");
1044            } else {
1045                BIO_snprintf(aux_err, sizeof(aux_err),
1046                             "%s output and %s input, %sfragmented",
1047                             out_misalign ? "misaligned" : "aligned",
1048                             inp_misalign ? "misaligned" : "aligned",
1049                             frag ? "" : "not ");
1050            }
1051            if (cdat->enc) {
1052                rv = cipher_test_enc(t, 1, out_misalign, inp_misalign, frag);
1053                /* Not fatal errors: return */
1054                if (rv != 1) {
1055                    if (rv < 0)
1056                        return 0;
1057                    return 1;
1058                }
1059            }
1060            if (cdat->enc != 1) {
1061                rv = cipher_test_enc(t, 0, out_misalign, inp_misalign, frag);
1062                /* Not fatal errors: return */
1063                if (rv != 1) {
1064                    if (rv < 0)
1065                        return 0;
1066                    return 1;
1067                }
1068            }
1069        }
1070
1071        if (out_misalign == 1 && frag == 0) {
1072            /*
1073             * XTS, SIV, CCM, stitched ciphers and Wrap modes have special
1074             * requirements about input lengths so we don't fragment for those
1075             */
1076            if (cdat->aead == EVP_CIPH_CCM_MODE
1077                || cdat->aead == EVP_CIPH_CBC_MODE
1078                || (cdat->aead == -1
1079                    && EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_STREAM_CIPHER)
1080                || ((EVP_CIPHER_get_flags(cdat->cipher) & EVP_CIPH_FLAG_CTS) != 0)
1081                || EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_SIV_MODE
1082                || EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_XTS_MODE
1083                || EVP_CIPHER_get_mode(cdat->cipher) == EVP_CIPH_WRAP_MODE)
1084                break;
1085            out_misalign = 0;
1086            frag++;
1087        } else {
1088            out_misalign++;
1089        }
1090    }
1091    t->aux_err = NULL;
1092
1093    return 1;
1094}
1095
1096static const EVP_TEST_METHOD cipher_test_method = {
1097    "Cipher",
1098    cipher_test_init,
1099    cipher_test_cleanup,
1100    cipher_test_parse,
1101    cipher_test_run
1102};
1103
1104
1105/**
1106 **  MAC TESTS
1107 **/
1108
1109typedef struct mac_data_st {
1110    /* MAC type in one form or another */
1111    char *mac_name;
1112    EVP_MAC *mac;                /* for mac_test_run_mac */
1113    int type;                    /* for mac_test_run_pkey */
1114    /* Algorithm string for this MAC */
1115    char *alg;
1116    /* MAC key */
1117    unsigned char *key;
1118    size_t key_len;
1119    /* MAC IV (GMAC) */
1120    unsigned char *iv;
1121    size_t iv_len;
1122    /* Input to MAC */
1123    unsigned char *input;
1124    size_t input_len;
1125    /* Expected output */
1126    unsigned char *output;
1127    size_t output_len;
1128    unsigned char *custom;
1129    size_t custom_len;
1130    /* MAC salt (blake2) */
1131    unsigned char *salt;
1132    size_t salt_len;
1133    /* XOF mode? */
1134    int xof;
1135    /* Reinitialization fails */
1136    int no_reinit;
1137    /* Collection of controls */
1138    STACK_OF(OPENSSL_STRING) *controls;
1139    /* Output size */
1140    int output_size;
1141    /* Block size */
1142    int block_size;
1143} MAC_DATA;
1144
1145static int mac_test_init(EVP_TEST *t, const char *alg)
1146{
1147    EVP_MAC *mac = NULL;
1148    int type = NID_undef;
1149    MAC_DATA *mdat;
1150
1151    if (is_mac_disabled(alg)) {
1152        TEST_info("skipping, '%s' is disabled", alg);
1153        t->skip = 1;
1154        return 1;
1155    }
1156    if ((mac = EVP_MAC_fetch(libctx, alg, NULL)) == NULL) {
1157        /*
1158         * Since we didn't find an EVP_MAC, we check for known EVP_PKEY methods
1159         * For debugging purposes, we allow 'NNNN by EVP_PKEY' to force running
1160         * the EVP_PKEY method.
1161         */
1162        size_t sz = strlen(alg);
1163        static const char epilogue[] = " by EVP_PKEY";
1164
1165        if (sz >= sizeof(epilogue)
1166            && strcmp(alg + sz - (sizeof(epilogue) - 1), epilogue) == 0)
1167            sz -= sizeof(epilogue) - 1;
1168
1169        if (strncmp(alg, "HMAC", sz) == 0)
1170            type = EVP_PKEY_HMAC;
1171        else if (strncmp(alg, "CMAC", sz) == 0)
1172            type = EVP_PKEY_CMAC;
1173        else if (strncmp(alg, "Poly1305", sz) == 0)
1174            type = EVP_PKEY_POLY1305;
1175        else if (strncmp(alg, "SipHash", sz) == 0)
1176            type = EVP_PKEY_SIPHASH;
1177        else
1178            return 0;
1179    }
1180
1181    if (!TEST_ptr(mdat = OPENSSL_zalloc(sizeof(*mdat))))
1182        return 0;
1183
1184    mdat->type = type;
1185    if (!TEST_ptr(mdat->mac_name = OPENSSL_strdup(alg))) {
1186        OPENSSL_free(mdat);
1187        return 0;
1188    }
1189
1190    mdat->mac = mac;
1191    if (!TEST_ptr(mdat->controls = sk_OPENSSL_STRING_new_null())) {
1192        OPENSSL_free(mdat->mac_name);
1193        OPENSSL_free(mdat);
1194        return 0;
1195    }
1196
1197    mdat->output_size = mdat->block_size = -1;
1198    t->data = mdat;
1199    return 1;
1200}
1201
1202/* Because OPENSSL_free is a macro, it can't be passed as a function pointer */
1203static void openssl_free(char *m)
1204{
1205    OPENSSL_free(m);
1206}
1207
1208static void mac_test_cleanup(EVP_TEST *t)
1209{
1210    MAC_DATA *mdat = t->data;
1211
1212    EVP_MAC_free(mdat->mac);
1213    OPENSSL_free(mdat->mac_name);
1214    sk_OPENSSL_STRING_pop_free(mdat->controls, openssl_free);
1215    OPENSSL_free(mdat->alg);
1216    OPENSSL_free(mdat->key);
1217    OPENSSL_free(mdat->iv);
1218    OPENSSL_free(mdat->custom);
1219    OPENSSL_free(mdat->salt);
1220    OPENSSL_free(mdat->input);
1221    OPENSSL_free(mdat->output);
1222}
1223
1224static int mac_test_parse(EVP_TEST *t,
1225                          const char *keyword, const char *value)
1226{
1227    MAC_DATA *mdata = t->data;
1228
1229    if (strcmp(keyword, "Key") == 0)
1230        return parse_bin(value, &mdata->key, &mdata->key_len);
1231    if (strcmp(keyword, "IV") == 0)
1232        return parse_bin(value, &mdata->iv, &mdata->iv_len);
1233    if (strcmp(keyword, "Custom") == 0)
1234        return parse_bin(value, &mdata->custom, &mdata->custom_len);
1235    if (strcmp(keyword, "Salt") == 0)
1236        return parse_bin(value, &mdata->salt, &mdata->salt_len);
1237    if (strcmp(keyword, "Algorithm") == 0) {
1238        mdata->alg = OPENSSL_strdup(value);
1239        if (mdata->alg == NULL)
1240            return -1;
1241        return 1;
1242    }
1243    if (strcmp(keyword, "Input") == 0)
1244        return parse_bin(value, &mdata->input, &mdata->input_len);
1245    if (strcmp(keyword, "Output") == 0)
1246        return parse_bin(value, &mdata->output, &mdata->output_len);
1247    if (strcmp(keyword, "XOF") == 0)
1248        return mdata->xof = 1;
1249    if (strcmp(keyword, "NoReinit") == 0)
1250        return mdata->no_reinit = 1;
1251    if (strcmp(keyword, "Ctrl") == 0) {
1252        char *data = OPENSSL_strdup(value);
1253
1254        if (data == NULL)
1255            return -1;
1256        return sk_OPENSSL_STRING_push(mdata->controls, data) != 0;
1257    }
1258    if (strcmp(keyword, "OutputSize") == 0) {
1259        mdata->output_size = atoi(value);
1260        if (mdata->output_size < 0)
1261            return -1;
1262        return 1;
1263    }
1264    if (strcmp(keyword, "BlockSize") == 0) {
1265        mdata->block_size = atoi(value);
1266        if (mdata->block_size < 0)
1267            return -1;
1268        return 1;
1269    }
1270    return 0;
1271}
1272
1273static int mac_test_ctrl_pkey(EVP_TEST *t, EVP_PKEY_CTX *pctx,
1274                              const char *value)
1275{
1276    int rv = 0;
1277    char *p, *tmpval;
1278
1279    if (!TEST_ptr(tmpval = OPENSSL_strdup(value)))
1280        return 0;
1281    p = strchr(tmpval, ':');
1282    if (p != NULL) {
1283        *p++ = '\0';
1284        rv = EVP_PKEY_CTX_ctrl_str(pctx, tmpval, p);
1285    }
1286    if (rv == -2)
1287        t->err = "PKEY_CTRL_INVALID";
1288    else if (rv <= 0)
1289        t->err = "PKEY_CTRL_ERROR";
1290    else
1291        rv = 1;
1292    OPENSSL_free(tmpval);
1293    return rv > 0;
1294}
1295
1296static int mac_test_run_pkey(EVP_TEST *t)
1297{
1298    MAC_DATA *expected = t->data;
1299    EVP_MD_CTX *mctx = NULL;
1300    EVP_PKEY_CTX *pctx = NULL, *genctx = NULL;
1301    EVP_PKEY *key = NULL;
1302    const char *mdname = NULL;
1303    EVP_CIPHER *cipher = NULL;
1304    unsigned char *got = NULL;
1305    size_t got_len;
1306    int i;
1307
1308    /* We don't do XOF mode via PKEY */
1309    if (expected->xof)
1310        return 1;
1311
1312    if (expected->alg == NULL)
1313        TEST_info("Trying the EVP_PKEY %s test", OBJ_nid2sn(expected->type));
1314    else
1315        TEST_info("Trying the EVP_PKEY %s test with %s",
1316                  OBJ_nid2sn(expected->type), expected->alg);
1317
1318    if (expected->type == EVP_PKEY_CMAC) {
1319#ifdef OPENSSL_NO_DEPRECATED_3_0
1320        TEST_info("skipping, PKEY CMAC '%s' is disabled", expected->alg);
1321        t->skip = 1;
1322        t->err = NULL;
1323        goto err;
1324#else
1325        OSSL_LIB_CTX *tmpctx;
1326
1327        if (expected->alg != NULL && is_cipher_disabled(expected->alg)) {
1328            TEST_info("skipping, PKEY CMAC '%s' is disabled", expected->alg);
1329            t->skip = 1;
1330            t->err = NULL;
1331            goto err;
1332        }
1333        if (!TEST_ptr(cipher = EVP_CIPHER_fetch(libctx, expected->alg, NULL))) {
1334            t->err = "MAC_KEY_CREATE_ERROR";
1335            goto err;
1336        }
1337        tmpctx = OSSL_LIB_CTX_set0_default(libctx);
1338        key = EVP_PKEY_new_CMAC_key(NULL, expected->key, expected->key_len,
1339                                    cipher);
1340        OSSL_LIB_CTX_set0_default(tmpctx);
1341#endif
1342    } else {
1343        key = EVP_PKEY_new_raw_private_key_ex(libctx,
1344                                              OBJ_nid2sn(expected->type), NULL,
1345                                              expected->key, expected->key_len);
1346    }
1347    if (key == NULL) {
1348        t->err = "MAC_KEY_CREATE_ERROR";
1349        goto err;
1350    }
1351
1352    if (expected->type == EVP_PKEY_HMAC && expected->alg != NULL) {
1353        if (is_digest_disabled(expected->alg)) {
1354            TEST_info("skipping, HMAC '%s' is disabled", expected->alg);
1355            t->skip = 1;
1356            t->err = NULL;
1357            goto err;
1358        }
1359        mdname = expected->alg;
1360    }
1361    if (!TEST_ptr(mctx = EVP_MD_CTX_new())) {
1362        t->err = "INTERNAL_ERROR";
1363        goto err;
1364    }
1365    if (!EVP_DigestSignInit_ex(mctx, &pctx, mdname, libctx, NULL, key, NULL)) {
1366        t->err = "DIGESTSIGNINIT_ERROR";
1367        goto err;
1368    }
1369    for (i = 0; i < sk_OPENSSL_STRING_num(expected->controls); i++)
1370        if (!mac_test_ctrl_pkey(t, pctx,
1371                                sk_OPENSSL_STRING_value(expected->controls,
1372                                                        i))) {
1373            t->err = "EVPPKEYCTXCTRL_ERROR";
1374            goto err;
1375        }
1376    if (!EVP_DigestSignUpdate(mctx, expected->input, expected->input_len)) {
1377        t->err = "DIGESTSIGNUPDATE_ERROR";
1378        goto err;
1379    }
1380    if (!EVP_DigestSignFinal(mctx, NULL, &got_len)) {
1381        t->err = "DIGESTSIGNFINAL_LENGTH_ERROR";
1382        goto err;
1383    }
1384    if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
1385        t->err = "TEST_FAILURE";
1386        goto err;
1387    }
1388    if (!EVP_DigestSignFinal(mctx, got, &got_len)
1389            || !memory_err_compare(t, "TEST_MAC_ERR",
1390                                   expected->output, expected->output_len,
1391                                   got, got_len)) {
1392        t->err = "TEST_MAC_ERR";
1393        goto err;
1394    }
1395    t->err = NULL;
1396 err:
1397    EVP_CIPHER_free(cipher);
1398    EVP_MD_CTX_free(mctx);
1399    OPENSSL_free(got);
1400    EVP_PKEY_CTX_free(genctx);
1401    EVP_PKEY_free(key);
1402    return 1;
1403}
1404
1405static int mac_test_run_mac(EVP_TEST *t)
1406{
1407    MAC_DATA *expected = t->data;
1408    EVP_MAC_CTX *ctx = NULL;
1409    unsigned char *got = NULL;
1410    size_t got_len = 0, size = 0;
1411    int i, block_size = -1, output_size = -1;
1412    OSSL_PARAM params[21], sizes[3], *psizes = sizes;
1413    size_t params_n = 0;
1414    size_t params_n_allocstart = 0;
1415    const OSSL_PARAM *defined_params =
1416        EVP_MAC_settable_ctx_params(expected->mac);
1417    int xof;
1418    int reinit = 1;
1419
1420    if (expected->alg == NULL)
1421        TEST_info("Trying the EVP_MAC %s test", expected->mac_name);
1422    else
1423        TEST_info("Trying the EVP_MAC %s test with %s",
1424                  expected->mac_name, expected->alg);
1425
1426    if (expected->alg != NULL) {
1427        int skip = 0;
1428
1429        /*
1430         * The underlying algorithm may be a cipher or a digest.
1431         * We don't know which it is, but we can ask the MAC what it
1432         * should be and bet on that.
1433         */
1434        if (OSSL_PARAM_locate_const(defined_params,
1435                                    OSSL_MAC_PARAM_CIPHER) != NULL) {
1436            if (is_cipher_disabled(expected->alg))
1437                skip = 1;
1438            else
1439                params[params_n++] =
1440                    OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_CIPHER,
1441                                                     expected->alg, 0);
1442        } else if (OSSL_PARAM_locate_const(defined_params,
1443                                           OSSL_MAC_PARAM_DIGEST) != NULL) {
1444            if (is_digest_disabled(expected->alg))
1445                skip = 1;
1446            else
1447                params[params_n++] =
1448                    OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1449                                                     expected->alg, 0);
1450        } else {
1451            t->err = "MAC_BAD_PARAMS";
1452            goto err;
1453        }
1454        if (skip) {
1455            TEST_info("skipping, algorithm '%s' is disabled", expected->alg);
1456            t->skip = 1;
1457            t->err = NULL;
1458            goto err;
1459        }
1460    }
1461    if (expected->custom != NULL)
1462        params[params_n++] =
1463            OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_CUSTOM,
1464                                              expected->custom,
1465                                              expected->custom_len);
1466    if (expected->salt != NULL)
1467        params[params_n++] =
1468            OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_SALT,
1469                                              expected->salt,
1470                                              expected->salt_len);
1471    if (expected->iv != NULL)
1472        params[params_n++] =
1473            OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_IV,
1474                                              expected->iv,
1475                                              expected->iv_len);
1476
1477    /* Unknown controls.  They must match parameters that the MAC recognizes */
1478    if (params_n + sk_OPENSSL_STRING_num(expected->controls)
1479        >= OSSL_NELEM(params)) {
1480        t->err = "MAC_TOO_MANY_PARAMETERS";
1481        goto err;
1482    }
1483    params_n_allocstart = params_n;
1484    for (i = 0; i < sk_OPENSSL_STRING_num(expected->controls); i++) {
1485        char *tmpkey, *tmpval;
1486        char *value = sk_OPENSSL_STRING_value(expected->controls, i);
1487
1488        if (!TEST_ptr(tmpkey = OPENSSL_strdup(value))) {
1489            t->err = "MAC_PARAM_ERROR";
1490            goto err;
1491        }
1492        tmpval = strchr(tmpkey, ':');
1493        if (tmpval != NULL)
1494            *tmpval++ = '\0';
1495
1496        if (tmpval == NULL
1497            || !OSSL_PARAM_allocate_from_text(&params[params_n],
1498                                              defined_params,
1499                                              tmpkey, tmpval,
1500                                              strlen(tmpval), NULL)) {
1501            OPENSSL_free(tmpkey);
1502            t->err = "MAC_PARAM_ERROR";
1503            goto err;
1504        }
1505        params_n++;
1506
1507        OPENSSL_free(tmpkey);
1508    }
1509    params[params_n] = OSSL_PARAM_construct_end();
1510
1511    if ((ctx = EVP_MAC_CTX_new(expected->mac)) == NULL) {
1512        t->err = "MAC_CREATE_ERROR";
1513        goto err;
1514    }
1515
1516    if (!EVP_MAC_init(ctx, expected->key, expected->key_len, params)) {
1517        t->err = "MAC_INIT_ERROR";
1518        goto err;
1519    }
1520    if (expected->output_size >= 0)
1521        *psizes++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_SIZE,
1522                                             &output_size);
1523    if (expected->block_size >= 0)
1524        *psizes++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_BLOCK_SIZE,
1525                                             &block_size);
1526    if (psizes != sizes) {
1527        *psizes = OSSL_PARAM_construct_end();
1528        if (!TEST_true(EVP_MAC_CTX_get_params(ctx, sizes))) {
1529            t->err = "INTERNAL_ERROR";
1530            goto err;
1531        }
1532        if (expected->output_size >= 0
1533                && !TEST_int_eq(output_size, expected->output_size)) {
1534            t->err = "TEST_FAILURE";
1535            goto err;
1536        }
1537        if (expected->block_size >= 0
1538                && !TEST_int_eq(block_size, expected->block_size)) {
1539            t->err = "TEST_FAILURE";
1540            goto err;
1541        }
1542    }
1543 retry:
1544    if (!EVP_MAC_update(ctx, expected->input, expected->input_len)) {
1545        t->err = "MAC_UPDATE_ERROR";
1546        goto err;
1547    }
1548    xof = expected->xof;
1549    if (xof) {
1550        if (!TEST_ptr(got = OPENSSL_malloc(expected->output_len))) {
1551            t->err = "TEST_FAILURE";
1552            goto err;
1553        }
1554        if (!EVP_MAC_finalXOF(ctx, got, expected->output_len)
1555            || !memory_err_compare(t, "TEST_MAC_ERR",
1556                                   expected->output, expected->output_len,
1557                                   got, expected->output_len)) {
1558            t->err = "MAC_FINAL_ERROR";
1559            goto err;
1560        }
1561    } else {
1562        if (!EVP_MAC_final(ctx, NULL, &got_len, 0)) {
1563            t->err = "MAC_FINAL_LENGTH_ERROR";
1564            goto err;
1565        }
1566        if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
1567            t->err = "TEST_FAILURE";
1568            goto err;
1569        }
1570        if (!EVP_MAC_final(ctx, got, &got_len, got_len)
1571            || !memory_err_compare(t, "TEST_MAC_ERR",
1572                                   expected->output, expected->output_len,
1573                                   got, got_len)) {
1574            t->err = "TEST_MAC_ERR";
1575            goto err;
1576        }
1577    }
1578    /* FIPS(3.0.0): can't reinitialise MAC contexts #18100 */
1579    if (reinit-- && fips_provider_version_gt(libctx, 3, 0, 0)) {
1580        OSSL_PARAM ivparams[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
1581        int ret;
1582
1583        /* If the MAC uses IV, we have to set it again */
1584        if (expected->iv != NULL) {
1585            ivparams[0] =
1586                OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_IV,
1587                                                  expected->iv,
1588                                                  expected->iv_len);
1589            ivparams[1] = OSSL_PARAM_construct_end();
1590        }
1591        ERR_set_mark();
1592        ret = EVP_MAC_init(ctx, NULL, 0, ivparams);
1593        if (expected->no_reinit) {
1594            if (ret) {
1595                ERR_clear_last_mark();
1596                t->err = "MAC_REINIT_SHOULD_FAIL";
1597                goto err;
1598            }
1599        } else if (ret) {
1600            ERR_clear_last_mark();
1601            OPENSSL_free(got);
1602            got = NULL;
1603            goto retry;
1604        } else {
1605            ERR_clear_last_mark();
1606            t->err = "MAC_REINIT_ERROR";
1607            goto err;
1608        }
1609        /* If reinitialization fails, it is unsupported by the algorithm */
1610        ERR_pop_to_mark();
1611    }
1612    t->err = NULL;
1613
1614    /* Test the EVP_Q_mac interface as well */
1615    if (!xof) {
1616        OPENSSL_cleanse(got, got_len);
1617        if (!TEST_true(EVP_Q_mac(libctx, expected->mac_name, NULL,
1618                                 expected->alg, params,
1619                                 expected->key, expected->key_len,
1620                                 expected->input, expected->input_len,
1621                                 got, got_len, &size))
1622                || !TEST_mem_eq(got, size,
1623                                expected->output, expected->output_len)) {
1624            t->err = "EVP_Q_mac failed";
1625            goto err;
1626        }
1627    }
1628 err:
1629    while (params_n-- > params_n_allocstart) {
1630        OPENSSL_free(params[params_n].data);
1631    }
1632    EVP_MAC_CTX_free(ctx);
1633    OPENSSL_free(got);
1634    return 1;
1635}
1636
1637static int mac_test_run(EVP_TEST *t)
1638{
1639    MAC_DATA *expected = t->data;
1640
1641    if (expected->mac != NULL)
1642        return mac_test_run_mac(t);
1643    return mac_test_run_pkey(t);
1644}
1645
1646static const EVP_TEST_METHOD mac_test_method = {
1647    "MAC",
1648    mac_test_init,
1649    mac_test_cleanup,
1650    mac_test_parse,
1651    mac_test_run
1652};
1653
1654
1655/**
1656 **  PUBLIC KEY TESTS
1657 **  These are all very similar and share much common code.
1658 **/
1659
1660typedef struct pkey_data_st {
1661    /* Context for this operation */
1662    EVP_PKEY_CTX *ctx;
1663    /* Key operation to perform */
1664    int (*keyop) (EVP_PKEY_CTX *ctx,
1665                  unsigned char *sig, size_t *siglen,
1666                  const unsigned char *tbs, size_t tbslen);
1667    /* Input to MAC */
1668    unsigned char *input;
1669    size_t input_len;
1670    /* Expected output */
1671    unsigned char *output;
1672    size_t output_len;
1673} PKEY_DATA;
1674
1675/*
1676 * Perform public key operation setup: lookup key, allocated ctx and call
1677 * the appropriate initialisation function
1678 */
1679static int pkey_test_init(EVP_TEST *t, const char *name,
1680                          int use_public,
1681                          int (*keyopinit) (EVP_PKEY_CTX *ctx),
1682                          int (*keyop)(EVP_PKEY_CTX *ctx,
1683                                       unsigned char *sig, size_t *siglen,
1684                                       const unsigned char *tbs,
1685                                       size_t tbslen))
1686{
1687    PKEY_DATA *kdata;
1688    EVP_PKEY *pkey = NULL;
1689    int rv = 0;
1690
1691    if (use_public)
1692        rv = find_key(&pkey, name, public_keys);
1693    if (rv == 0)
1694        rv = find_key(&pkey, name, private_keys);
1695    if (rv == 0 || pkey == NULL) {
1696        TEST_info("skipping, key '%s' is disabled", name);
1697        t->skip = 1;
1698        return 1;
1699    }
1700
1701    if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata)))) {
1702        EVP_PKEY_free(pkey);
1703        return 0;
1704    }
1705    kdata->keyop = keyop;
1706    if (!TEST_ptr(kdata->ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, NULL))) {
1707        EVP_PKEY_free(pkey);
1708        OPENSSL_free(kdata);
1709        return 0;
1710    }
1711    if (keyopinit(kdata->ctx) <= 0)
1712        t->err = "KEYOP_INIT_ERROR";
1713    t->data = kdata;
1714    return 1;
1715}
1716
1717static void pkey_test_cleanup(EVP_TEST *t)
1718{
1719    PKEY_DATA *kdata = t->data;
1720
1721    OPENSSL_free(kdata->input);
1722    OPENSSL_free(kdata->output);
1723    EVP_PKEY_CTX_free(kdata->ctx);
1724}
1725
1726static int pkey_test_ctrl(EVP_TEST *t, EVP_PKEY_CTX *pctx,
1727                          const char *value)
1728{
1729    int rv = 0;
1730    char *p, *tmpval;
1731
1732    if (!TEST_ptr(tmpval = OPENSSL_strdup(value)))
1733        return 0;
1734    p = strchr(tmpval, ':');
1735    if (p != NULL) {
1736        *p++ = '\0';
1737        rv = EVP_PKEY_CTX_ctrl_str(pctx, tmpval, p);
1738    }
1739    if (rv == -2) {
1740        t->err = "PKEY_CTRL_INVALID";
1741        rv = 1;
1742    } else if (p != NULL && rv <= 0) {
1743        if (is_digest_disabled(p) || is_cipher_disabled(p)) {
1744            TEST_info("skipping, '%s' is disabled", p);
1745            t->skip = 1;
1746            rv = 1;
1747        } else {
1748            t->err = "PKEY_CTRL_ERROR";
1749            rv = 1;
1750        }
1751    }
1752    OPENSSL_free(tmpval);
1753    return rv > 0;
1754}
1755
1756static int pkey_test_parse(EVP_TEST *t,
1757                           const char *keyword, const char *value)
1758{
1759    PKEY_DATA *kdata = t->data;
1760    if (strcmp(keyword, "Input") == 0)
1761        return parse_bin(value, &kdata->input, &kdata->input_len);
1762    if (strcmp(keyword, "Output") == 0)
1763        return parse_bin(value, &kdata->output, &kdata->output_len);
1764    if (strcmp(keyword, "Ctrl") == 0)
1765        return pkey_test_ctrl(t, kdata->ctx, value);
1766    return 0;
1767}
1768
1769static int pkey_test_run(EVP_TEST *t)
1770{
1771    PKEY_DATA *expected = t->data;
1772    unsigned char *got = NULL;
1773    size_t got_len;
1774    EVP_PKEY_CTX *copy = NULL;
1775
1776    if (expected->keyop(expected->ctx, NULL, &got_len,
1777                        expected->input, expected->input_len) <= 0
1778            || !TEST_ptr(got = OPENSSL_malloc(got_len))) {
1779        t->err = "KEYOP_LENGTH_ERROR";
1780        goto err;
1781    }
1782    if (expected->keyop(expected->ctx, got, &got_len,
1783                        expected->input, expected->input_len) <= 0) {
1784        t->err = "KEYOP_ERROR";
1785        goto err;
1786    }
1787    if (!memory_err_compare(t, "KEYOP_MISMATCH",
1788                            expected->output, expected->output_len,
1789                            got, got_len))
1790        goto err;
1791
1792    t->err = NULL;
1793    OPENSSL_free(got);
1794    got = NULL;
1795
1796    /* Repeat the test on a copy. */
1797    if (!TEST_ptr(copy = EVP_PKEY_CTX_dup(expected->ctx))) {
1798        t->err = "INTERNAL_ERROR";
1799        goto err;
1800    }
1801    if (expected->keyop(copy, NULL, &got_len, expected->input,
1802                        expected->input_len) <= 0
1803            || !TEST_ptr(got = OPENSSL_malloc(got_len))) {
1804        t->err = "KEYOP_LENGTH_ERROR";
1805        goto err;
1806    }
1807    if (expected->keyop(copy, got, &got_len, expected->input,
1808                        expected->input_len) <= 0) {
1809        t->err = "KEYOP_ERROR";
1810        goto err;
1811    }
1812    if (!memory_err_compare(t, "KEYOP_MISMATCH",
1813                            expected->output, expected->output_len,
1814                            got, got_len))
1815        goto err;
1816
1817 err:
1818    OPENSSL_free(got);
1819    EVP_PKEY_CTX_free(copy);
1820    return 1;
1821}
1822
1823static int sign_test_init(EVP_TEST *t, const char *name)
1824{
1825    return pkey_test_init(t, name, 0, EVP_PKEY_sign_init, EVP_PKEY_sign);
1826}
1827
1828static const EVP_TEST_METHOD psign_test_method = {
1829    "Sign",
1830    sign_test_init,
1831    pkey_test_cleanup,
1832    pkey_test_parse,
1833    pkey_test_run
1834};
1835
1836static int verify_recover_test_init(EVP_TEST *t, const char *name)
1837{
1838    return pkey_test_init(t, name, 1, EVP_PKEY_verify_recover_init,
1839                          EVP_PKEY_verify_recover);
1840}
1841
1842static const EVP_TEST_METHOD pverify_recover_test_method = {
1843    "VerifyRecover",
1844    verify_recover_test_init,
1845    pkey_test_cleanup,
1846    pkey_test_parse,
1847    pkey_test_run
1848};
1849
1850static int decrypt_test_init(EVP_TEST *t, const char *name)
1851{
1852    return pkey_test_init(t, name, 0, EVP_PKEY_decrypt_init,
1853                          EVP_PKEY_decrypt);
1854}
1855
1856static const EVP_TEST_METHOD pdecrypt_test_method = {
1857    "Decrypt",
1858    decrypt_test_init,
1859    pkey_test_cleanup,
1860    pkey_test_parse,
1861    pkey_test_run
1862};
1863
1864static int verify_test_init(EVP_TEST *t, const char *name)
1865{
1866    return pkey_test_init(t, name, 1, EVP_PKEY_verify_init, 0);
1867}
1868
1869static int verify_test_run(EVP_TEST *t)
1870{
1871    PKEY_DATA *kdata = t->data;
1872
1873    if (EVP_PKEY_verify(kdata->ctx, kdata->output, kdata->output_len,
1874                        kdata->input, kdata->input_len) <= 0)
1875        t->err = "VERIFY_ERROR";
1876    return 1;
1877}
1878
1879static const EVP_TEST_METHOD pverify_test_method = {
1880    "Verify",
1881    verify_test_init,
1882    pkey_test_cleanup,
1883    pkey_test_parse,
1884    verify_test_run
1885};
1886
1887static int pderive_test_init(EVP_TEST *t, const char *name)
1888{
1889    return pkey_test_init(t, name, 0, EVP_PKEY_derive_init, 0);
1890}
1891
1892static int pderive_test_parse(EVP_TEST *t,
1893                              const char *keyword, const char *value)
1894{
1895    PKEY_DATA *kdata = t->data;
1896    int validate = 0;
1897
1898    if (strcmp(keyword, "PeerKeyValidate") == 0)
1899        validate = 1;
1900
1901    if (validate || strcmp(keyword, "PeerKey") == 0) {
1902        EVP_PKEY *peer;
1903        if (find_key(&peer, value, public_keys) == 0)
1904            return -1;
1905        if (EVP_PKEY_derive_set_peer_ex(kdata->ctx, peer, validate) <= 0) {
1906            t->err = "DERIVE_SET_PEER_ERROR";
1907            return 1;
1908        }
1909        t->err = NULL;
1910        return 1;
1911    }
1912    if (strcmp(keyword, "SharedSecret") == 0)
1913        return parse_bin(value, &kdata->output, &kdata->output_len);
1914    if (strcmp(keyword, "Ctrl") == 0)
1915        return pkey_test_ctrl(t, kdata->ctx, value);
1916    if (strcmp(keyword, "KDFType") == 0) {
1917        OSSL_PARAM params[2];
1918
1919        params[0] = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_TYPE,
1920                                                     (char *)(intptr_t)value, 0);
1921        params[1] = OSSL_PARAM_construct_end();
1922        if (EVP_PKEY_CTX_set_params(kdata->ctx, params) == 0)
1923            return -1;
1924        return 1;
1925    }
1926    if (strcmp(keyword, "KDFDigest") == 0) {
1927        OSSL_PARAM params[2];
1928
1929        params[0] = OSSL_PARAM_construct_utf8_string(OSSL_EXCHANGE_PARAM_KDF_DIGEST,
1930                                                     (char *)(intptr_t)value, 0);
1931        params[1] = OSSL_PARAM_construct_end();
1932        if (EVP_PKEY_CTX_set_params(kdata->ctx, params) == 0)
1933            return -1;
1934        return 1;
1935    }
1936    if (strcmp(keyword, "CEKAlg") == 0) {
1937        OSSL_PARAM params[2];
1938
1939        params[0] = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CEK_ALG,
1940                                                     (char *)(intptr_t)value, 0);
1941        params[1] = OSSL_PARAM_construct_end();
1942        if (EVP_PKEY_CTX_set_params(kdata->ctx, params) == 0)
1943            return -1;
1944        return 1;
1945    }
1946    if (strcmp(keyword, "KDFOutlen") == 0) {
1947        OSSL_PARAM params[2];
1948        char *endptr;
1949        size_t outlen = (size_t)strtoul(value, &endptr, 0);
1950
1951        if (endptr[0] != '\0')
1952            return -1;
1953
1954        params[0] = OSSL_PARAM_construct_size_t(OSSL_EXCHANGE_PARAM_KDF_OUTLEN,
1955                                                &outlen);
1956        params[1] = OSSL_PARAM_construct_end();
1957        if (EVP_PKEY_CTX_set_params(kdata->ctx, params) == 0)
1958            return -1;
1959        return 1;
1960    }
1961    return 0;
1962}
1963
1964static int pderive_test_run(EVP_TEST *t)
1965{
1966    EVP_PKEY_CTX *dctx = NULL;
1967    PKEY_DATA *expected = t->data;
1968    unsigned char *got = NULL;
1969    size_t got_len;
1970
1971    if (!TEST_ptr(dctx = EVP_PKEY_CTX_dup(expected->ctx))) {
1972        t->err = "DERIVE_ERROR";
1973        goto err;
1974    }
1975
1976    if (EVP_PKEY_derive(dctx, NULL, &got_len) <= 0
1977        || !TEST_size_t_ne(got_len, 0)) {
1978        t->err = "DERIVE_ERROR";
1979        goto err;
1980    }
1981    if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
1982        t->err = "DERIVE_ERROR";
1983        goto err;
1984    }
1985    if (EVP_PKEY_derive(dctx, got, &got_len) <= 0) {
1986        t->err = "DERIVE_ERROR";
1987        goto err;
1988    }
1989    if (!memory_err_compare(t, "SHARED_SECRET_MISMATCH",
1990                            expected->output, expected->output_len,
1991                            got, got_len))
1992        goto err;
1993
1994    t->err = NULL;
1995 err:
1996    OPENSSL_free(got);
1997    EVP_PKEY_CTX_free(dctx);
1998    return 1;
1999}
2000
2001static const EVP_TEST_METHOD pderive_test_method = {
2002    "Derive",
2003    pderive_test_init,
2004    pkey_test_cleanup,
2005    pderive_test_parse,
2006    pderive_test_run
2007};
2008
2009
2010/**
2011 **  PBE TESTS
2012 **/
2013
2014typedef enum pbe_type_enum {
2015    PBE_TYPE_INVALID = 0,
2016    PBE_TYPE_SCRYPT, PBE_TYPE_PBKDF2, PBE_TYPE_PKCS12
2017} PBE_TYPE;
2018
2019typedef struct pbe_data_st {
2020    PBE_TYPE pbe_type;
2021        /* scrypt parameters */
2022    uint64_t N, r, p, maxmem;
2023        /* PKCS#12 parameters */
2024    int id, iter;
2025    const EVP_MD *md;
2026        /* password */
2027    unsigned char *pass;
2028    size_t pass_len;
2029        /* salt */
2030    unsigned char *salt;
2031    size_t salt_len;
2032        /* Expected output */
2033    unsigned char *key;
2034    size_t key_len;
2035} PBE_DATA;
2036
2037#ifndef OPENSSL_NO_SCRYPT
2038/* Parse unsigned decimal 64 bit integer value */
2039static int parse_uint64(const char *value, uint64_t *pr)
2040{
2041    const char *p = value;
2042
2043    if (!TEST_true(*p)) {
2044        TEST_info("Invalid empty integer value");
2045        return -1;
2046    }
2047    for (*pr = 0; *p; ) {
2048        if (*pr > UINT64_MAX / 10) {
2049            TEST_error("Integer overflow in string %s", value);
2050            return -1;
2051        }
2052        *pr *= 10;
2053        if (!TEST_true(isdigit((unsigned char)*p))) {
2054            TEST_error("Invalid character in string %s", value);
2055            return -1;
2056        }
2057        *pr += *p - '0';
2058        p++;
2059    }
2060    return 1;
2061}
2062
2063static int scrypt_test_parse(EVP_TEST *t,
2064                             const char *keyword, const char *value)
2065{
2066    PBE_DATA *pdata = t->data;
2067
2068    if (strcmp(keyword, "N") == 0)
2069        return parse_uint64(value, &pdata->N);
2070    if (strcmp(keyword, "p") == 0)
2071        return parse_uint64(value, &pdata->p);
2072    if (strcmp(keyword, "r") == 0)
2073        return parse_uint64(value, &pdata->r);
2074    if (strcmp(keyword, "maxmem") == 0)
2075        return parse_uint64(value, &pdata->maxmem);
2076    return 0;
2077}
2078#endif
2079
2080static int pbkdf2_test_parse(EVP_TEST *t,
2081                             const char *keyword, const char *value)
2082{
2083    PBE_DATA *pdata = t->data;
2084
2085    if (strcmp(keyword, "iter") == 0) {
2086        pdata->iter = atoi(value);
2087        if (pdata->iter <= 0)
2088            return -1;
2089        return 1;
2090    }
2091    if (strcmp(keyword, "MD") == 0) {
2092        pdata->md = EVP_get_digestbyname(value);
2093        if (pdata->md == NULL)
2094            return -1;
2095        return 1;
2096    }
2097    return 0;
2098}
2099
2100static int pkcs12_test_parse(EVP_TEST *t,
2101                             const char *keyword, const char *value)
2102{
2103    PBE_DATA *pdata = t->data;
2104
2105    if (strcmp(keyword, "id") == 0) {
2106        pdata->id = atoi(value);
2107        if (pdata->id <= 0)
2108            return -1;
2109        return 1;
2110    }
2111    return pbkdf2_test_parse(t, keyword, value);
2112}
2113
2114static int pbe_test_init(EVP_TEST *t, const char *alg)
2115{
2116    PBE_DATA *pdat;
2117    PBE_TYPE pbe_type = PBE_TYPE_INVALID;
2118
2119    if (is_kdf_disabled(alg)) {
2120        TEST_info("skipping, '%s' is disabled", alg);
2121        t->skip = 1;
2122        return 1;
2123    }
2124    if (strcmp(alg, "scrypt") == 0) {
2125        pbe_type = PBE_TYPE_SCRYPT;
2126    } else if (strcmp(alg, "pbkdf2") == 0) {
2127        pbe_type = PBE_TYPE_PBKDF2;
2128    } else if (strcmp(alg, "pkcs12") == 0) {
2129        pbe_type = PBE_TYPE_PKCS12;
2130    } else {
2131        TEST_error("Unknown pbe algorithm %s", alg);
2132        return 0;
2133    }
2134    if (!TEST_ptr(pdat = OPENSSL_zalloc(sizeof(*pdat))))
2135        return 0;
2136    pdat->pbe_type = pbe_type;
2137    t->data = pdat;
2138    return 1;
2139}
2140
2141static void pbe_test_cleanup(EVP_TEST *t)
2142{
2143    PBE_DATA *pdat = t->data;
2144
2145    OPENSSL_free(pdat->pass);
2146    OPENSSL_free(pdat->salt);
2147    OPENSSL_free(pdat->key);
2148}
2149
2150static int pbe_test_parse(EVP_TEST *t,
2151                          const char *keyword, const char *value)
2152{
2153    PBE_DATA *pdata = t->data;
2154
2155    if (strcmp(keyword, "Password") == 0)
2156        return parse_bin(value, &pdata->pass, &pdata->pass_len);
2157    if (strcmp(keyword, "Salt") == 0)
2158        return parse_bin(value, &pdata->salt, &pdata->salt_len);
2159    if (strcmp(keyword, "Key") == 0)
2160        return parse_bin(value, &pdata->key, &pdata->key_len);
2161    if (pdata->pbe_type == PBE_TYPE_PBKDF2)
2162        return pbkdf2_test_parse(t, keyword, value);
2163    else if (pdata->pbe_type == PBE_TYPE_PKCS12)
2164        return pkcs12_test_parse(t, keyword, value);
2165#ifndef OPENSSL_NO_SCRYPT
2166    else if (pdata->pbe_type == PBE_TYPE_SCRYPT)
2167        return scrypt_test_parse(t, keyword, value);
2168#endif
2169    return 0;
2170}
2171
2172static int pbe_test_run(EVP_TEST *t)
2173{
2174    PBE_DATA *expected = t->data;
2175    unsigned char *key;
2176    EVP_MD *fetched_digest = NULL;
2177    OSSL_LIB_CTX *save_libctx;
2178
2179    save_libctx = OSSL_LIB_CTX_set0_default(libctx);
2180
2181    if (!TEST_ptr(key = OPENSSL_malloc(expected->key_len))) {
2182        t->err = "INTERNAL_ERROR";
2183        goto err;
2184    }
2185    if (expected->pbe_type == PBE_TYPE_PBKDF2) {
2186        if (PKCS5_PBKDF2_HMAC((char *)expected->pass, expected->pass_len,
2187                              expected->salt, expected->salt_len,
2188                              expected->iter, expected->md,
2189                              expected->key_len, key) == 0) {
2190            t->err = "PBKDF2_ERROR";
2191            goto err;
2192        }
2193#ifndef OPENSSL_NO_SCRYPT
2194    } else if (expected->pbe_type == PBE_TYPE_SCRYPT) {
2195        if (EVP_PBE_scrypt((const char *)expected->pass, expected->pass_len,
2196                            expected->salt, expected->salt_len,
2197                            expected->N, expected->r, expected->p,
2198                            expected->maxmem, key, expected->key_len) == 0) {
2199            t->err = "SCRYPT_ERROR";
2200            goto err;
2201        }
2202#endif
2203    } else if (expected->pbe_type == PBE_TYPE_PKCS12) {
2204        fetched_digest = EVP_MD_fetch(libctx, EVP_MD_get0_name(expected->md),
2205                                      NULL);
2206        if (fetched_digest == NULL) {
2207            t->err = "PKCS12_ERROR";
2208            goto err;
2209        }
2210        if (PKCS12_key_gen_uni(expected->pass, expected->pass_len,
2211                               expected->salt, expected->salt_len,
2212                               expected->id, expected->iter, expected->key_len,
2213                               key, fetched_digest) == 0) {
2214            t->err = "PKCS12_ERROR";
2215            goto err;
2216        }
2217    }
2218    if (!memory_err_compare(t, "KEY_MISMATCH", expected->key, expected->key_len,
2219                            key, expected->key_len))
2220        goto err;
2221
2222    t->err = NULL;
2223err:
2224    EVP_MD_free(fetched_digest);
2225    OPENSSL_free(key);
2226    OSSL_LIB_CTX_set0_default(save_libctx);
2227    return 1;
2228}
2229
2230static const EVP_TEST_METHOD pbe_test_method = {
2231    "PBE",
2232    pbe_test_init,
2233    pbe_test_cleanup,
2234    pbe_test_parse,
2235    pbe_test_run
2236};
2237
2238
2239/**
2240 **  BASE64 TESTS
2241 **/
2242
2243typedef enum {
2244    BASE64_CANONICAL_ENCODING = 0,
2245    BASE64_VALID_ENCODING = 1,
2246    BASE64_INVALID_ENCODING = 2
2247} base64_encoding_type;
2248
2249typedef struct encode_data_st {
2250    /* Input to encoding */
2251    unsigned char *input;
2252    size_t input_len;
2253    /* Expected output */
2254    unsigned char *output;
2255    size_t output_len;
2256    base64_encoding_type encoding;
2257} ENCODE_DATA;
2258
2259static int encode_test_init(EVP_TEST *t, const char *encoding)
2260{
2261    ENCODE_DATA *edata;
2262
2263    if (!TEST_ptr(edata = OPENSSL_zalloc(sizeof(*edata))))
2264        return 0;
2265    if (strcmp(encoding, "canonical") == 0) {
2266        edata->encoding = BASE64_CANONICAL_ENCODING;
2267    } else if (strcmp(encoding, "valid") == 0) {
2268        edata->encoding = BASE64_VALID_ENCODING;
2269    } else if (strcmp(encoding, "invalid") == 0) {
2270        edata->encoding = BASE64_INVALID_ENCODING;
2271        if (!TEST_ptr(t->expected_err = OPENSSL_strdup("DECODE_ERROR")))
2272            goto err;
2273    } else {
2274        TEST_error("Bad encoding: %s."
2275                   " Should be one of {canonical, valid, invalid}",
2276                   encoding);
2277        goto err;
2278    }
2279    t->data = edata;
2280    return 1;
2281err:
2282    OPENSSL_free(edata);
2283    return 0;
2284}
2285
2286static void encode_test_cleanup(EVP_TEST *t)
2287{
2288    ENCODE_DATA *edata = t->data;
2289
2290    OPENSSL_free(edata->input);
2291    OPENSSL_free(edata->output);
2292    memset(edata, 0, sizeof(*edata));
2293}
2294
2295static int encode_test_parse(EVP_TEST *t,
2296                             const char *keyword, const char *value)
2297{
2298    ENCODE_DATA *edata = t->data;
2299
2300    if (strcmp(keyword, "Input") == 0)
2301        return parse_bin(value, &edata->input, &edata->input_len);
2302    if (strcmp(keyword, "Output") == 0)
2303        return parse_bin(value, &edata->output, &edata->output_len);
2304    return 0;
2305}
2306
2307static int encode_test_run(EVP_TEST *t)
2308{
2309    ENCODE_DATA *expected = t->data;
2310    unsigned char *encode_out = NULL, *decode_out = NULL;
2311    int output_len, chunk_len;
2312    EVP_ENCODE_CTX *decode_ctx = NULL, *encode_ctx = NULL;
2313
2314    if (!TEST_ptr(decode_ctx = EVP_ENCODE_CTX_new())) {
2315        t->err = "INTERNAL_ERROR";
2316        goto err;
2317    }
2318
2319    if (expected->encoding == BASE64_CANONICAL_ENCODING) {
2320
2321        if (!TEST_ptr(encode_ctx = EVP_ENCODE_CTX_new())
2322                || !TEST_ptr(encode_out =
2323                        OPENSSL_malloc(EVP_ENCODE_LENGTH(expected->input_len))))
2324            goto err;
2325
2326        EVP_EncodeInit(encode_ctx);
2327        if (!TEST_true(EVP_EncodeUpdate(encode_ctx, encode_out, &chunk_len,
2328                                        expected->input, expected->input_len)))
2329            goto err;
2330
2331        output_len = chunk_len;
2332
2333        EVP_EncodeFinal(encode_ctx, encode_out + chunk_len, &chunk_len);
2334        output_len += chunk_len;
2335
2336        if (!memory_err_compare(t, "BAD_ENCODING",
2337                                expected->output, expected->output_len,
2338                                encode_out, output_len))
2339            goto err;
2340    }
2341
2342    if (!TEST_ptr(decode_out =
2343                OPENSSL_malloc(EVP_DECODE_LENGTH(expected->output_len))))
2344        goto err;
2345
2346    EVP_DecodeInit(decode_ctx);
2347    if (EVP_DecodeUpdate(decode_ctx, decode_out, &chunk_len, expected->output,
2348                         expected->output_len) < 0) {
2349        t->err = "DECODE_ERROR";
2350        goto err;
2351    }
2352    output_len = chunk_len;
2353
2354    if (EVP_DecodeFinal(decode_ctx, decode_out + chunk_len, &chunk_len) != 1) {
2355        t->err = "DECODE_ERROR";
2356        goto err;
2357    }
2358    output_len += chunk_len;
2359
2360    if (expected->encoding != BASE64_INVALID_ENCODING
2361            && !memory_err_compare(t, "BAD_DECODING",
2362                                   expected->input, expected->input_len,
2363                                   decode_out, output_len)) {
2364        t->err = "BAD_DECODING";
2365        goto err;
2366    }
2367
2368    t->err = NULL;
2369 err:
2370    OPENSSL_free(encode_out);
2371    OPENSSL_free(decode_out);
2372    EVP_ENCODE_CTX_free(decode_ctx);
2373    EVP_ENCODE_CTX_free(encode_ctx);
2374    return 1;
2375}
2376
2377static const EVP_TEST_METHOD encode_test_method = {
2378    "Encoding",
2379    encode_test_init,
2380    encode_test_cleanup,
2381    encode_test_parse,
2382    encode_test_run,
2383};
2384
2385
2386/**
2387 **  RAND TESTS
2388 **/
2389#define MAX_RAND_REPEATS    15
2390
2391typedef struct rand_data_pass_st {
2392    unsigned char *entropy;
2393    unsigned char *reseed_entropy;
2394    unsigned char *nonce;
2395    unsigned char *pers;
2396    unsigned char *reseed_addin;
2397    unsigned char *addinA;
2398    unsigned char *addinB;
2399    unsigned char *pr_entropyA;
2400    unsigned char *pr_entropyB;
2401    unsigned char *output;
2402    size_t entropy_len, nonce_len, pers_len, addinA_len, addinB_len,
2403           pr_entropyA_len, pr_entropyB_len, output_len, reseed_entropy_len,
2404           reseed_addin_len;
2405} RAND_DATA_PASS;
2406
2407typedef struct rand_data_st {
2408    /* Context for this operation */
2409    EVP_RAND_CTX *ctx;
2410    EVP_RAND_CTX *parent;
2411    int n;
2412    int prediction_resistance;
2413    int use_df;
2414    unsigned int generate_bits;
2415    char *cipher;
2416    char *digest;
2417
2418    /* Expected output */
2419    RAND_DATA_PASS data[MAX_RAND_REPEATS];
2420} RAND_DATA;
2421
2422static int rand_test_init(EVP_TEST *t, const char *name)
2423{
2424    RAND_DATA *rdata;
2425    EVP_RAND *rand;
2426    OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
2427    unsigned int strength = 256;
2428
2429    if (!TEST_ptr(rdata = OPENSSL_zalloc(sizeof(*rdata))))
2430        return 0;
2431
2432    /* TEST-RAND is available in the FIPS provider but not with "fips=yes" */
2433    rand = EVP_RAND_fetch(libctx, "TEST-RAND", "-fips");
2434    if (rand == NULL)
2435        goto err;
2436    rdata->parent = EVP_RAND_CTX_new(rand, NULL);
2437    EVP_RAND_free(rand);
2438    if (rdata->parent == NULL)
2439        goto err;
2440
2441    *params = OSSL_PARAM_construct_uint(OSSL_RAND_PARAM_STRENGTH, &strength);
2442    if (!EVP_RAND_CTX_set_params(rdata->parent, params))
2443        goto err;
2444
2445    rand = EVP_RAND_fetch(libctx, name, NULL);
2446    if (rand == NULL)
2447        goto err;
2448    rdata->ctx = EVP_RAND_CTX_new(rand, rdata->parent);
2449    EVP_RAND_free(rand);
2450    if (rdata->ctx == NULL)
2451        goto err;
2452
2453    rdata->n = -1;
2454    t->data = rdata;
2455    return 1;
2456 err:
2457    EVP_RAND_CTX_free(rdata->parent);
2458    OPENSSL_free(rdata);
2459    return 0;
2460}
2461
2462static void rand_test_cleanup(EVP_TEST *t)
2463{
2464    RAND_DATA *rdata = t->data;
2465    int i;
2466
2467    OPENSSL_free(rdata->cipher);
2468    OPENSSL_free(rdata->digest);
2469
2470    for (i = 0; i <= rdata->n; i++) {
2471        OPENSSL_free(rdata->data[i].entropy);
2472        OPENSSL_free(rdata->data[i].reseed_entropy);
2473        OPENSSL_free(rdata->data[i].nonce);
2474        OPENSSL_free(rdata->data[i].pers);
2475        OPENSSL_free(rdata->data[i].reseed_addin);
2476        OPENSSL_free(rdata->data[i].addinA);
2477        OPENSSL_free(rdata->data[i].addinB);
2478        OPENSSL_free(rdata->data[i].pr_entropyA);
2479        OPENSSL_free(rdata->data[i].pr_entropyB);
2480        OPENSSL_free(rdata->data[i].output);
2481    }
2482    EVP_RAND_CTX_free(rdata->ctx);
2483    EVP_RAND_CTX_free(rdata->parent);
2484}
2485
2486static int rand_test_parse(EVP_TEST *t,
2487                          const char *keyword, const char *value)
2488{
2489    RAND_DATA *rdata = t->data;
2490    RAND_DATA_PASS *item;
2491    const char *p;
2492    int n;
2493
2494    if ((p = strchr(keyword, '.')) != NULL) {
2495        n = atoi(++p);
2496        if (n >= MAX_RAND_REPEATS)
2497            return 0;
2498        if (n > rdata->n)
2499            rdata->n = n;
2500        item = rdata->data + n;
2501        if (strncmp(keyword, "Entropy.", sizeof("Entropy")) == 0)
2502            return parse_bin(value, &item->entropy, &item->entropy_len);
2503        if (strncmp(keyword, "ReseedEntropy.", sizeof("ReseedEntropy")) == 0)
2504            return parse_bin(value, &item->reseed_entropy,
2505                             &item->reseed_entropy_len);
2506        if (strncmp(keyword, "Nonce.", sizeof("Nonce")) == 0)
2507            return parse_bin(value, &item->nonce, &item->nonce_len);
2508        if (strncmp(keyword, "PersonalisationString.",
2509                    sizeof("PersonalisationString")) == 0)
2510            return parse_bin(value, &item->pers, &item->pers_len);
2511        if (strncmp(keyword, "ReseedAdditionalInput.",
2512                    sizeof("ReseedAdditionalInput")) == 0)
2513            return parse_bin(value, &item->reseed_addin,
2514                             &item->reseed_addin_len);
2515        if (strncmp(keyword, "AdditionalInputA.",
2516                    sizeof("AdditionalInputA")) == 0)
2517            return parse_bin(value, &item->addinA, &item->addinA_len);
2518        if (strncmp(keyword, "AdditionalInputB.",
2519                    sizeof("AdditionalInputB")) == 0)
2520            return parse_bin(value, &item->addinB, &item->addinB_len);
2521        if (strncmp(keyword, "EntropyPredictionResistanceA.",
2522                    sizeof("EntropyPredictionResistanceA")) == 0)
2523            return parse_bin(value, &item->pr_entropyA, &item->pr_entropyA_len);
2524        if (strncmp(keyword, "EntropyPredictionResistanceB.",
2525                    sizeof("EntropyPredictionResistanceB")) == 0)
2526            return parse_bin(value, &item->pr_entropyB, &item->pr_entropyB_len);
2527        if (strncmp(keyword, "Output.", sizeof("Output")) == 0)
2528            return parse_bin(value, &item->output, &item->output_len);
2529    } else {
2530        if (strcmp(keyword, "Cipher") == 0)
2531            return TEST_ptr(rdata->cipher = OPENSSL_strdup(value));
2532        if (strcmp(keyword, "Digest") == 0)
2533            return TEST_ptr(rdata->digest = OPENSSL_strdup(value));
2534        if (strcmp(keyword, "DerivationFunction") == 0) {
2535            rdata->use_df = atoi(value) != 0;
2536            return 1;
2537        }
2538        if (strcmp(keyword, "GenerateBits") == 0) {
2539            if ((n = atoi(value)) <= 0 || n % 8 != 0)
2540                return 0;
2541            rdata->generate_bits = (unsigned int)n;
2542            return 1;
2543        }
2544        if (strcmp(keyword, "PredictionResistance") == 0) {
2545            rdata->prediction_resistance = atoi(value) != 0;
2546            return 1;
2547        }
2548    }
2549    return 0;
2550}
2551
2552static int rand_test_run(EVP_TEST *t)
2553{
2554    RAND_DATA *expected = t->data;
2555    RAND_DATA_PASS *item;
2556    unsigned char *got;
2557    size_t got_len = expected->generate_bits / 8;
2558    OSSL_PARAM params[5], *p = params;
2559    int i = -1, ret = 0;
2560    unsigned int strength;
2561    unsigned char *z;
2562
2563    if (!TEST_ptr(got = OPENSSL_malloc(got_len)))
2564        return 0;
2565
2566    *p++ = OSSL_PARAM_construct_int(OSSL_DRBG_PARAM_USE_DF, &expected->use_df);
2567    if (expected->cipher != NULL)
2568        *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_CIPHER,
2569                                                expected->cipher, 0);
2570    if (expected->digest != NULL)
2571        *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_DIGEST,
2572                                                expected->digest, 0);
2573    *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_MAC, (char *)(intptr_t)"HMAC", 0);
2574    *p = OSSL_PARAM_construct_end();
2575    if (!TEST_true(EVP_RAND_CTX_set_params(expected->ctx, params)))
2576        goto err;
2577
2578    strength = EVP_RAND_get_strength(expected->ctx);
2579    for (i = 0; i <= expected->n; i++) {
2580        item = expected->data + i;
2581
2582        p = params;
2583        z = item->entropy != NULL ? item->entropy : (unsigned char *)(intptr_t)"";
2584        *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_ENTROPY,
2585                                                 z, item->entropy_len);
2586        z = item->nonce != NULL ? item->nonce : (unsigned char *)(intptr_t)"";
2587        *p++ = OSSL_PARAM_construct_octet_string(OSSL_RAND_PARAM_TEST_NONCE,
2588                                                 z, item->nonce_len);
2589        *p = OSSL_PARAM_construct_end();
2590        if (!TEST_true(EVP_RAND_instantiate(expected->parent, strength,
2591                                            0, NULL, 0, params)))
2592            goto err;
2593
2594        z = item->pers != NULL ? item->pers : (unsigned char *)(intptr_t)"";
2595        if (!TEST_true(EVP_RAND_instantiate
2596                           (expected->ctx, strength,
2597                            expected->prediction_resistance, z,
2598                            item->pers_len, NULL)))
2599            goto err;
2600
2601        if (item->reseed_entropy != NULL) {
2602            params[0] = OSSL_PARAM_construct_octet_string
2603                           (OSSL_RAND_PARAM_TEST_ENTROPY, item->reseed_entropy,
2604                            item->reseed_entropy_len);
2605            params[1] = OSSL_PARAM_construct_end();
2606            if (!TEST_true(EVP_RAND_CTX_set_params(expected->parent, params)))
2607                goto err;
2608
2609            if (!TEST_true(EVP_RAND_reseed
2610                               (expected->ctx, expected->prediction_resistance,
2611                                NULL, 0, item->reseed_addin,
2612                                item->reseed_addin_len)))
2613                goto err;
2614        }
2615        if (item->pr_entropyA != NULL) {
2616            params[0] = OSSL_PARAM_construct_octet_string
2617                           (OSSL_RAND_PARAM_TEST_ENTROPY, item->pr_entropyA,
2618                            item->pr_entropyA_len);
2619            params[1] = OSSL_PARAM_construct_end();
2620            if (!TEST_true(EVP_RAND_CTX_set_params(expected->parent, params)))
2621                goto err;
2622        }
2623        if (!TEST_true(EVP_RAND_generate
2624                           (expected->ctx, got, got_len,
2625                            strength, expected->prediction_resistance,
2626                            item->addinA, item->addinA_len)))
2627            goto err;
2628
2629        if (item->pr_entropyB != NULL) {
2630            params[0] = OSSL_PARAM_construct_octet_string
2631                           (OSSL_RAND_PARAM_TEST_ENTROPY, item->pr_entropyB,
2632                            item->pr_entropyB_len);
2633            params[1] = OSSL_PARAM_construct_end();
2634            if (!TEST_true(EVP_RAND_CTX_set_params(expected->parent, params)))
2635                goto err;
2636        }
2637        if (!TEST_true(EVP_RAND_generate
2638                           (expected->ctx, got, got_len,
2639                            strength, expected->prediction_resistance,
2640                            item->addinB, item->addinB_len)))
2641            goto err;
2642        if (!TEST_mem_eq(got, got_len, item->output, item->output_len))
2643            goto err;
2644        if (!TEST_true(EVP_RAND_uninstantiate(expected->ctx))
2645                || !TEST_true(EVP_RAND_uninstantiate(expected->parent))
2646                || !TEST_true(EVP_RAND_verify_zeroization(expected->ctx))
2647                || !TEST_int_eq(EVP_RAND_get_state(expected->ctx),
2648                                EVP_RAND_STATE_UNINITIALISED))
2649            goto err;
2650    }
2651    t->err = NULL;
2652    ret = 1;
2653
2654 err:
2655    if (ret == 0 && i >= 0)
2656        TEST_info("Error in test case %d of %d\n", i, expected->n + 1);
2657    OPENSSL_free(got);
2658    return ret;
2659}
2660
2661static const EVP_TEST_METHOD rand_test_method = {
2662    "RAND",
2663    rand_test_init,
2664    rand_test_cleanup,
2665    rand_test_parse,
2666    rand_test_run
2667};
2668
2669
2670/**
2671 **  KDF TESTS
2672 **/
2673typedef struct kdf_data_st {
2674    /* Context for this operation */
2675    EVP_KDF_CTX *ctx;
2676    /* Expected output */
2677    unsigned char *output;
2678    size_t output_len;
2679    OSSL_PARAM params[20];
2680    OSSL_PARAM *p;
2681} KDF_DATA;
2682
2683/*
2684 * Perform public key operation setup: lookup key, allocated ctx and call
2685 * the appropriate initialisation function
2686 */
2687static int kdf_test_init(EVP_TEST *t, const char *name)
2688{
2689    KDF_DATA *kdata;
2690    EVP_KDF *kdf;
2691
2692    if (is_kdf_disabled(name)) {
2693        TEST_info("skipping, '%s' is disabled", name);
2694        t->skip = 1;
2695        return 1;
2696    }
2697
2698    if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata))))
2699        return 0;
2700    kdata->p = kdata->params;
2701    *kdata->p = OSSL_PARAM_construct_end();
2702
2703    kdf = EVP_KDF_fetch(libctx, name, NULL);
2704    if (kdf == NULL) {
2705        OPENSSL_free(kdata);
2706        return 0;
2707    }
2708    kdata->ctx = EVP_KDF_CTX_new(kdf);
2709    EVP_KDF_free(kdf);
2710    if (kdata->ctx == NULL) {
2711        OPENSSL_free(kdata);
2712        return 0;
2713    }
2714    t->data = kdata;
2715    return 1;
2716}
2717
2718static void kdf_test_cleanup(EVP_TEST *t)
2719{
2720    KDF_DATA *kdata = t->data;
2721    OSSL_PARAM *p;
2722
2723    for (p = kdata->params; p->key != NULL; p++)
2724        OPENSSL_free(p->data);
2725    OPENSSL_free(kdata->output);
2726    EVP_KDF_CTX_free(kdata->ctx);
2727}
2728
2729static int kdf_test_ctrl(EVP_TEST *t, EVP_KDF_CTX *kctx,
2730                         const char *value)
2731{
2732    KDF_DATA *kdata = t->data;
2733    int rv;
2734    char *p, *name;
2735    const OSSL_PARAM *defs = EVP_KDF_settable_ctx_params(EVP_KDF_CTX_kdf(kctx));
2736
2737    if (!TEST_ptr(name = OPENSSL_strdup(value)))
2738        return 0;
2739    p = strchr(name, ':');
2740    if (p != NULL)
2741        *p++ = '\0';
2742
2743    rv = OSSL_PARAM_allocate_from_text(kdata->p, defs, name, p,
2744                                       p != NULL ? strlen(p) : 0, NULL);
2745    *++kdata->p = OSSL_PARAM_construct_end();
2746    if (!rv) {
2747        t->err = "KDF_PARAM_ERROR";
2748        OPENSSL_free(name);
2749        return 0;
2750    }
2751    if (p != NULL && strcmp(name, "digest") == 0) {
2752        if (is_digest_disabled(p)) {
2753            TEST_info("skipping, '%s' is disabled", p);
2754            t->skip = 1;
2755        }
2756    }
2757    if (p != NULL
2758        && (strcmp(name, "cipher") == 0
2759            || strcmp(name, "cekalg") == 0)
2760        && is_cipher_disabled(p)) {
2761        TEST_info("skipping, '%s' is disabled", p);
2762        t->skip = 1;
2763    }
2764    OPENSSL_free(name);
2765    return 1;
2766}
2767
2768static int kdf_test_parse(EVP_TEST *t,
2769                          const char *keyword, const char *value)
2770{
2771    KDF_DATA *kdata = t->data;
2772
2773    if (strcmp(keyword, "Output") == 0)
2774        return parse_bin(value, &kdata->output, &kdata->output_len);
2775    if (strncmp(keyword, "Ctrl", 4) == 0)
2776        return kdf_test_ctrl(t, kdata->ctx, value);
2777    return 0;
2778}
2779
2780static int kdf_test_run(EVP_TEST *t)
2781{
2782    KDF_DATA *expected = t->data;
2783    unsigned char *got = NULL;
2784    size_t got_len = expected->output_len;
2785
2786    if (!EVP_KDF_CTX_set_params(expected->ctx, expected->params)) {
2787        t->err = "KDF_CTRL_ERROR";
2788        return 1;
2789    }
2790    if (!TEST_ptr(got = OPENSSL_malloc(got_len == 0 ? 1 : got_len))) {
2791        t->err = "INTERNAL_ERROR";
2792        goto err;
2793    }
2794    if (EVP_KDF_derive(expected->ctx, got, got_len, NULL) <= 0) {
2795        t->err = "KDF_DERIVE_ERROR";
2796        goto err;
2797    }
2798    if (!memory_err_compare(t, "KDF_MISMATCH",
2799                            expected->output, expected->output_len,
2800                            got, got_len))
2801        goto err;
2802
2803    t->err = NULL;
2804
2805 err:
2806    OPENSSL_free(got);
2807    return 1;
2808}
2809
2810static const EVP_TEST_METHOD kdf_test_method = {
2811    "KDF",
2812    kdf_test_init,
2813    kdf_test_cleanup,
2814    kdf_test_parse,
2815    kdf_test_run
2816};
2817
2818/**
2819 **  PKEY KDF TESTS
2820 **/
2821
2822typedef struct pkey_kdf_data_st {
2823    /* Context for this operation */
2824    EVP_PKEY_CTX *ctx;
2825    /* Expected output */
2826    unsigned char *output;
2827    size_t output_len;
2828} PKEY_KDF_DATA;
2829
2830/*
2831 * Perform public key operation setup: lookup key, allocated ctx and call
2832 * the appropriate initialisation function
2833 */
2834static int pkey_kdf_test_init(EVP_TEST *t, const char *name)
2835{
2836    PKEY_KDF_DATA *kdata = NULL;
2837
2838    if (is_kdf_disabled(name)) {
2839        TEST_info("skipping, '%s' is disabled", name);
2840        t->skip = 1;
2841        return 1;
2842    }
2843
2844    if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata))))
2845        return 0;
2846
2847    kdata->ctx = EVP_PKEY_CTX_new_from_name(libctx, name, NULL);
2848    if (kdata->ctx == NULL
2849        || EVP_PKEY_derive_init(kdata->ctx) <= 0)
2850        goto err;
2851
2852    t->data = kdata;
2853    return 1;
2854err:
2855    EVP_PKEY_CTX_free(kdata->ctx);
2856    OPENSSL_free(kdata);
2857    return 0;
2858}
2859
2860static void pkey_kdf_test_cleanup(EVP_TEST *t)
2861{
2862    PKEY_KDF_DATA *kdata = t->data;
2863
2864    OPENSSL_free(kdata->output);
2865    EVP_PKEY_CTX_free(kdata->ctx);
2866}
2867
2868static int pkey_kdf_test_parse(EVP_TEST *t,
2869                               const char *keyword, const char *value)
2870{
2871    PKEY_KDF_DATA *kdata = t->data;
2872
2873    if (strcmp(keyword, "Output") == 0)
2874        return parse_bin(value, &kdata->output, &kdata->output_len);
2875    if (strncmp(keyword, "Ctrl", 4) == 0)
2876        return pkey_test_ctrl(t, kdata->ctx, value);
2877    return 0;
2878}
2879
2880static int pkey_kdf_test_run(EVP_TEST *t)
2881{
2882    PKEY_KDF_DATA *expected = t->data;
2883    unsigned char *got = NULL;
2884    size_t got_len = 0;
2885
2886    if (fips_provider_version_eq(libctx, 3, 0, 0)) {
2887        /* FIPS(3.0.0): can't deal with oversized output buffers #18533 */
2888        got_len = expected->output_len;
2889    } else {
2890        /* Find out the KDF output size */
2891        if (EVP_PKEY_derive(expected->ctx, NULL, &got_len) <= 0) {
2892            t->err = "INTERNAL_ERROR";
2893            goto err;
2894        }
2895
2896        /*
2897         * We may get an absurd output size, which signals that anything goes.
2898         * If not, we specify a too big buffer for the output, to test that
2899         * EVP_PKEY_derive() can cope with it.
2900         */
2901        if (got_len == SIZE_MAX || got_len == 0)
2902            got_len = expected->output_len;
2903        else
2904            got_len = expected->output_len * 2;
2905    }
2906
2907    if (!TEST_ptr(got = OPENSSL_malloc(got_len == 0 ? 1 : got_len))) {
2908        t->err = "INTERNAL_ERROR";
2909        goto err;
2910    }
2911    if (EVP_PKEY_derive(expected->ctx, got, &got_len) <= 0) {
2912        t->err = "KDF_DERIVE_ERROR";
2913        goto err;
2914    }
2915    if (!TEST_mem_eq(expected->output, expected->output_len, got, got_len)) {
2916        t->err = "KDF_MISMATCH";
2917        goto err;
2918    }
2919    t->err = NULL;
2920
2921 err:
2922    OPENSSL_free(got);
2923    return 1;
2924}
2925
2926static const EVP_TEST_METHOD pkey_kdf_test_method = {
2927    "PKEYKDF",
2928    pkey_kdf_test_init,
2929    pkey_kdf_test_cleanup,
2930    pkey_kdf_test_parse,
2931    pkey_kdf_test_run
2932};
2933
2934/**
2935 **  KEYPAIR TESTS
2936 **/
2937
2938typedef struct keypair_test_data_st {
2939    EVP_PKEY *privk;
2940    EVP_PKEY *pubk;
2941} KEYPAIR_TEST_DATA;
2942
2943static int keypair_test_init(EVP_TEST *t, const char *pair)
2944{
2945    KEYPAIR_TEST_DATA *data;
2946    int rv = 0;
2947    EVP_PKEY *pk = NULL, *pubk = NULL;
2948    char *pub, *priv = NULL;
2949
2950    /* Split private and public names. */
2951    if (!TEST_ptr(priv = OPENSSL_strdup(pair))
2952            || !TEST_ptr(pub = strchr(priv, ':'))) {
2953        t->err = "PARSING_ERROR";
2954        goto end;
2955    }
2956    *pub++ = '\0';
2957
2958    if (!TEST_true(find_key(&pk, priv, private_keys))) {
2959        TEST_info("Can't find private key: %s", priv);
2960        t->err = "MISSING_PRIVATE_KEY";
2961        goto end;
2962    }
2963    if (!TEST_true(find_key(&pubk, pub, public_keys))) {
2964        TEST_info("Can't find public key: %s", pub);
2965        t->err = "MISSING_PUBLIC_KEY";
2966        goto end;
2967    }
2968
2969    if (pk == NULL && pubk == NULL) {
2970        /* Both keys are listed but unsupported: skip this test */
2971        t->skip = 1;
2972        rv = 1;
2973        goto end;
2974    }
2975
2976    if (!TEST_ptr(data = OPENSSL_malloc(sizeof(*data))))
2977        goto end;
2978    data->privk = pk;
2979    data->pubk = pubk;
2980    t->data = data;
2981    rv = 1;
2982    t->err = NULL;
2983
2984end:
2985    OPENSSL_free(priv);
2986    return rv;
2987}
2988
2989static void keypair_test_cleanup(EVP_TEST *t)
2990{
2991    OPENSSL_free(t->data);
2992    t->data = NULL;
2993}
2994
2995/*
2996 * For tests that do not accept any custom keywords.
2997 */
2998static int void_test_parse(EVP_TEST *t, const char *keyword, const char *value)
2999{
3000    return 0;
3001}
3002
3003static int keypair_test_run(EVP_TEST *t)
3004{
3005    int rv = 0;
3006    const KEYPAIR_TEST_DATA *pair = t->data;
3007
3008    if (pair->privk == NULL || pair->pubk == NULL) {
3009        /*
3010         * this can only happen if only one of the keys is not set
3011         * which means that one of them was unsupported while the
3012         * other isn't: hence a key type mismatch.
3013         */
3014        t->err = "KEYPAIR_TYPE_MISMATCH";
3015        rv = 1;
3016        goto end;
3017    }
3018
3019    if ((rv = EVP_PKEY_eq(pair->privk, pair->pubk)) != 1 ) {
3020        if ( 0 == rv ) {
3021            t->err = "KEYPAIR_MISMATCH";
3022        } else if ( -1 == rv ) {
3023            t->err = "KEYPAIR_TYPE_MISMATCH";
3024        } else if ( -2 == rv ) {
3025            t->err = "UNSUPPORTED_KEY_COMPARISON";
3026        } else {
3027            TEST_error("Unexpected error in key comparison");
3028            rv = 0;
3029            goto end;
3030        }
3031        rv = 1;
3032        goto end;
3033    }
3034
3035    rv = 1;
3036    t->err = NULL;
3037
3038end:
3039    return rv;
3040}
3041
3042static const EVP_TEST_METHOD keypair_test_method = {
3043    "PrivPubKeyPair",
3044    keypair_test_init,
3045    keypair_test_cleanup,
3046    void_test_parse,
3047    keypair_test_run
3048};
3049
3050/**
3051 **  KEYGEN TEST
3052 **/
3053
3054typedef struct keygen_test_data_st {
3055    EVP_PKEY_CTX *genctx; /* Keygen context to use */
3056    char *keyname; /* Key name to store key or NULL */
3057} KEYGEN_TEST_DATA;
3058
3059static int keygen_test_init(EVP_TEST *t, const char *alg)
3060{
3061    KEYGEN_TEST_DATA *data;
3062    EVP_PKEY_CTX *genctx;
3063    int nid = OBJ_sn2nid(alg);
3064
3065    if (nid == NID_undef) {
3066        nid = OBJ_ln2nid(alg);
3067        if (nid == NID_undef)
3068            return 0;
3069    }
3070
3071    if (is_pkey_disabled(alg)) {
3072        t->skip = 1;
3073        return 1;
3074    }
3075    if (!TEST_ptr(genctx = EVP_PKEY_CTX_new_from_name(libctx, alg, NULL)))
3076        goto err;
3077
3078    if (EVP_PKEY_keygen_init(genctx) <= 0) {
3079        t->err = "KEYGEN_INIT_ERROR";
3080        goto err;
3081    }
3082
3083    if (!TEST_ptr(data = OPENSSL_malloc(sizeof(*data))))
3084        goto err;
3085    data->genctx = genctx;
3086    data->keyname = NULL;
3087    t->data = data;
3088    t->err = NULL;
3089    return 1;
3090
3091err:
3092    EVP_PKEY_CTX_free(genctx);
3093    return 0;
3094}
3095
3096static void keygen_test_cleanup(EVP_TEST *t)
3097{
3098    KEYGEN_TEST_DATA *keygen = t->data;
3099
3100    EVP_PKEY_CTX_free(keygen->genctx);
3101    OPENSSL_free(keygen->keyname);
3102    OPENSSL_free(t->data);
3103    t->data = NULL;
3104}
3105
3106static int keygen_test_parse(EVP_TEST *t,
3107                             const char *keyword, const char *value)
3108{
3109    KEYGEN_TEST_DATA *keygen = t->data;
3110
3111    if (strcmp(keyword, "KeyName") == 0)
3112        return TEST_ptr(keygen->keyname = OPENSSL_strdup(value));
3113    if (strcmp(keyword, "Ctrl") == 0)
3114        return pkey_test_ctrl(t, keygen->genctx, value);
3115    return 0;
3116}
3117
3118static int keygen_test_run(EVP_TEST *t)
3119{
3120    KEYGEN_TEST_DATA *keygen = t->data;
3121    EVP_PKEY *pkey = NULL;
3122    int rv = 1;
3123
3124    if (EVP_PKEY_keygen(keygen->genctx, &pkey) <= 0) {
3125        t->err = "KEYGEN_GENERATE_ERROR";
3126        goto err;
3127    }
3128
3129    if (!evp_pkey_is_provided(pkey)) {
3130        TEST_info("Warning: legacy key generated %s", keygen->keyname);
3131        goto err;
3132    }
3133    if (keygen->keyname != NULL) {
3134        KEY_LIST *key;
3135
3136        rv = 0;
3137        if (find_key(NULL, keygen->keyname, private_keys)) {
3138            TEST_info("Duplicate key %s", keygen->keyname);
3139            goto err;
3140        }
3141
3142        if (!TEST_ptr(key = OPENSSL_malloc(sizeof(*key))))
3143            goto err;
3144        key->name = keygen->keyname;
3145        keygen->keyname = NULL;
3146        key->key = pkey;
3147        key->next = private_keys;
3148        private_keys = key;
3149        rv = 1;
3150    } else {
3151        EVP_PKEY_free(pkey);
3152    }
3153
3154    t->err = NULL;
3155
3156err:
3157    return rv;
3158}
3159
3160static const EVP_TEST_METHOD keygen_test_method = {
3161    "KeyGen",
3162    keygen_test_init,
3163    keygen_test_cleanup,
3164    keygen_test_parse,
3165    keygen_test_run,
3166};
3167
3168/**
3169 **  DIGEST SIGN+VERIFY TESTS
3170 **/
3171
3172typedef struct {
3173    int is_verify; /* Set to 1 if verifying */
3174    int is_oneshot; /* Set to 1 for one shot operation */
3175    const EVP_MD *md; /* Digest to use */
3176    EVP_MD_CTX *ctx; /* Digest context */
3177    EVP_PKEY_CTX *pctx;
3178    STACK_OF(EVP_TEST_BUFFER) *input; /* Input data: streaming */
3179    unsigned char *osin; /* Input data if one shot */
3180    size_t osin_len; /* Input length data if one shot */
3181    unsigned char *output; /* Expected output */
3182    size_t output_len; /* Expected output length */
3183} DIGESTSIGN_DATA;
3184
3185static int digestsigver_test_init(EVP_TEST *t, const char *alg, int is_verify,
3186                                  int is_oneshot)
3187{
3188    const EVP_MD *md = NULL;
3189    DIGESTSIGN_DATA *mdat;
3190
3191    if (strcmp(alg, "NULL") != 0) {
3192        if (is_digest_disabled(alg)) {
3193            t->skip = 1;
3194            return 1;
3195        }
3196        md = EVP_get_digestbyname(alg);
3197        if (md == NULL)
3198            return 0;
3199    }
3200    if (!TEST_ptr(mdat = OPENSSL_zalloc(sizeof(*mdat))))
3201        return 0;
3202    mdat->md = md;
3203    if (!TEST_ptr(mdat->ctx = EVP_MD_CTX_new())) {
3204        OPENSSL_free(mdat);
3205        return 0;
3206    }
3207    mdat->is_verify = is_verify;
3208    mdat->is_oneshot = is_oneshot;
3209    t->data = mdat;
3210    return 1;
3211}
3212
3213static int digestsign_test_init(EVP_TEST *t, const char *alg)
3214{
3215    return digestsigver_test_init(t, alg, 0, 0);
3216}
3217
3218static void digestsigver_test_cleanup(EVP_TEST *t)
3219{
3220    DIGESTSIGN_DATA *mdata = t->data;
3221
3222    EVP_MD_CTX_free(mdata->ctx);
3223    sk_EVP_TEST_BUFFER_pop_free(mdata->input, evp_test_buffer_free);
3224    OPENSSL_free(mdata->osin);
3225    OPENSSL_free(mdata->output);
3226    OPENSSL_free(mdata);
3227    t->data = NULL;
3228}
3229
3230static int digestsigver_test_parse(EVP_TEST *t,
3231                                   const char *keyword, const char *value)
3232{
3233    DIGESTSIGN_DATA *mdata = t->data;
3234
3235    if (strcmp(keyword, "Key") == 0) {
3236        EVP_PKEY *pkey = NULL;
3237        int rv = 0;
3238        const char *name = mdata->md == NULL ? NULL : EVP_MD_get0_name(mdata->md);
3239
3240        if (mdata->is_verify)
3241            rv = find_key(&pkey, value, public_keys);
3242        if (rv == 0)
3243            rv = find_key(&pkey, value, private_keys);
3244        if (rv == 0 || pkey == NULL) {
3245            t->skip = 1;
3246            return 1;
3247        }
3248        if (mdata->is_verify) {
3249            if (!EVP_DigestVerifyInit_ex(mdata->ctx, &mdata->pctx, name, libctx,
3250                                         NULL, pkey, NULL))
3251                t->err = "DIGESTVERIFYINIT_ERROR";
3252            return 1;
3253        }
3254        if (!EVP_DigestSignInit_ex(mdata->ctx, &mdata->pctx, name, libctx, NULL,
3255                                   pkey, NULL))
3256            t->err = "DIGESTSIGNINIT_ERROR";
3257        return 1;
3258    }
3259
3260    if (strcmp(keyword, "Input") == 0) {
3261        if (mdata->is_oneshot)
3262            return parse_bin(value, &mdata->osin, &mdata->osin_len);
3263        return evp_test_buffer_append(value, &mdata->input);
3264    }
3265    if (strcmp(keyword, "Output") == 0)
3266        return parse_bin(value, &mdata->output, &mdata->output_len);
3267
3268    if (!mdata->is_oneshot) {
3269        if (strcmp(keyword, "Count") == 0)
3270            return evp_test_buffer_set_count(value, mdata->input);
3271        if (strcmp(keyword, "Ncopy") == 0)
3272            return evp_test_buffer_ncopy(value, mdata->input);
3273    }
3274    if (strcmp(keyword, "Ctrl") == 0) {
3275        if (mdata->pctx == NULL)
3276            return -1;
3277        return pkey_test_ctrl(t, mdata->pctx, value);
3278    }
3279    return 0;
3280}
3281
3282static int digestsign_update_fn(void *ctx, const unsigned char *buf,
3283                                size_t buflen)
3284{
3285    return EVP_DigestSignUpdate(ctx, buf, buflen);
3286}
3287
3288static int digestsign_test_run(EVP_TEST *t)
3289{
3290    DIGESTSIGN_DATA *expected = t->data;
3291    unsigned char *got = NULL;
3292    size_t got_len;
3293
3294    if (!evp_test_buffer_do(expected->input, digestsign_update_fn,
3295                            expected->ctx)) {
3296        t->err = "DIGESTUPDATE_ERROR";
3297        goto err;
3298    }
3299
3300    if (!EVP_DigestSignFinal(expected->ctx, NULL, &got_len)) {
3301        t->err = "DIGESTSIGNFINAL_LENGTH_ERROR";
3302        goto err;
3303    }
3304    if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
3305        t->err = "MALLOC_FAILURE";
3306        goto err;
3307    }
3308    got_len *= 2;
3309    if (!EVP_DigestSignFinal(expected->ctx, got, &got_len)) {
3310        t->err = "DIGESTSIGNFINAL_ERROR";
3311        goto err;
3312    }
3313    if (!memory_err_compare(t, "SIGNATURE_MISMATCH",
3314                            expected->output, expected->output_len,
3315                            got, got_len))
3316        goto err;
3317
3318    t->err = NULL;
3319 err:
3320    OPENSSL_free(got);
3321    return 1;
3322}
3323
3324static const EVP_TEST_METHOD digestsign_test_method = {
3325    "DigestSign",
3326    digestsign_test_init,
3327    digestsigver_test_cleanup,
3328    digestsigver_test_parse,
3329    digestsign_test_run
3330};
3331
3332static int digestverify_test_init(EVP_TEST *t, const char *alg)
3333{
3334    return digestsigver_test_init(t, alg, 1, 0);
3335}
3336
3337static int digestverify_update_fn(void *ctx, const unsigned char *buf,
3338                                  size_t buflen)
3339{
3340    return EVP_DigestVerifyUpdate(ctx, buf, buflen);
3341}
3342
3343static int digestverify_test_run(EVP_TEST *t)
3344{
3345    DIGESTSIGN_DATA *mdata = t->data;
3346
3347    if (!evp_test_buffer_do(mdata->input, digestverify_update_fn, mdata->ctx)) {
3348        t->err = "DIGESTUPDATE_ERROR";
3349        return 1;
3350    }
3351
3352    if (EVP_DigestVerifyFinal(mdata->ctx, mdata->output,
3353                              mdata->output_len) <= 0)
3354        t->err = "VERIFY_ERROR";
3355    return 1;
3356}
3357
3358static const EVP_TEST_METHOD digestverify_test_method = {
3359    "DigestVerify",
3360    digestverify_test_init,
3361    digestsigver_test_cleanup,
3362    digestsigver_test_parse,
3363    digestverify_test_run
3364};
3365
3366static int oneshot_digestsign_test_init(EVP_TEST *t, const char *alg)
3367{
3368    return digestsigver_test_init(t, alg, 0, 1);
3369}
3370
3371static int oneshot_digestsign_test_run(EVP_TEST *t)
3372{
3373    DIGESTSIGN_DATA *expected = t->data;
3374    unsigned char *got = NULL;
3375    size_t got_len;
3376
3377    if (!EVP_DigestSign(expected->ctx, NULL, &got_len,
3378                        expected->osin, expected->osin_len)) {
3379        t->err = "DIGESTSIGN_LENGTH_ERROR";
3380        goto err;
3381    }
3382    if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
3383        t->err = "MALLOC_FAILURE";
3384        goto err;
3385    }
3386    got_len *= 2;
3387    if (!EVP_DigestSign(expected->ctx, got, &got_len,
3388                        expected->osin, expected->osin_len)) {
3389        t->err = "DIGESTSIGN_ERROR";
3390        goto err;
3391    }
3392    if (!memory_err_compare(t, "SIGNATURE_MISMATCH",
3393                            expected->output, expected->output_len,
3394                            got, got_len))
3395        goto err;
3396
3397    t->err = NULL;
3398 err:
3399    OPENSSL_free(got);
3400    return 1;
3401}
3402
3403static const EVP_TEST_METHOD oneshot_digestsign_test_method = {
3404    "OneShotDigestSign",
3405    oneshot_digestsign_test_init,
3406    digestsigver_test_cleanup,
3407    digestsigver_test_parse,
3408    oneshot_digestsign_test_run
3409};
3410
3411static int oneshot_digestverify_test_init(EVP_TEST *t, const char *alg)
3412{
3413    return digestsigver_test_init(t, alg, 1, 1);
3414}
3415
3416static int oneshot_digestverify_test_run(EVP_TEST *t)
3417{
3418    DIGESTSIGN_DATA *mdata = t->data;
3419
3420    if (EVP_DigestVerify(mdata->ctx, mdata->output, mdata->output_len,
3421                         mdata->osin, mdata->osin_len) <= 0)
3422        t->err = "VERIFY_ERROR";
3423    return 1;
3424}
3425
3426static const EVP_TEST_METHOD oneshot_digestverify_test_method = {
3427    "OneShotDigestVerify",
3428    oneshot_digestverify_test_init,
3429    digestsigver_test_cleanup,
3430    digestsigver_test_parse,
3431    oneshot_digestverify_test_run
3432};
3433
3434
3435/**
3436 **  PARSING AND DISPATCH
3437 **/
3438
3439static const EVP_TEST_METHOD *evp_test_list[] = {
3440    &rand_test_method,
3441    &cipher_test_method,
3442    &digest_test_method,
3443    &digestsign_test_method,
3444    &digestverify_test_method,
3445    &encode_test_method,
3446    &kdf_test_method,
3447    &pkey_kdf_test_method,
3448    &keypair_test_method,
3449    &keygen_test_method,
3450    &mac_test_method,
3451    &oneshot_digestsign_test_method,
3452    &oneshot_digestverify_test_method,
3453    &pbe_test_method,
3454    &pdecrypt_test_method,
3455    &pderive_test_method,
3456    &psign_test_method,
3457    &pverify_recover_test_method,
3458    &pverify_test_method,
3459    NULL
3460};
3461
3462static const EVP_TEST_METHOD *find_test(const char *name)
3463{
3464    const EVP_TEST_METHOD **tt;
3465
3466    for (tt = evp_test_list; *tt; tt++) {
3467        if (strcmp(name, (*tt)->name) == 0)
3468            return *tt;
3469    }
3470    return NULL;
3471}
3472
3473static void clear_test(EVP_TEST *t)
3474{
3475    test_clearstanza(&t->s);
3476    ERR_clear_error();
3477    if (t->data != NULL) {
3478        if (t->meth != NULL)
3479            t->meth->cleanup(t);
3480        OPENSSL_free(t->data);
3481        t->data = NULL;
3482    }
3483    OPENSSL_free(t->expected_err);
3484    t->expected_err = NULL;
3485    OPENSSL_free(t->reason);
3486    t->reason = NULL;
3487
3488    /* Text literal. */
3489    t->err = NULL;
3490    t->skip = 0;
3491    t->meth = NULL;
3492}
3493
3494/* Check for errors in the test structure; return 1 if okay, else 0. */
3495static int check_test_error(EVP_TEST *t)
3496{
3497    unsigned long err;
3498    const char *reason;
3499
3500    if (t->err == NULL && t->expected_err == NULL)
3501        return 1;
3502    if (t->err != NULL && t->expected_err == NULL) {
3503        if (t->aux_err != NULL) {
3504            TEST_info("%s:%d: Source of above error (%s); unexpected error %s",
3505                      t->s.test_file, t->s.start, t->aux_err, t->err);
3506        } else {
3507            TEST_info("%s:%d: Source of above error; unexpected error %s",
3508                      t->s.test_file, t->s.start, t->err);
3509        }
3510        return 0;
3511    }
3512    if (t->err == NULL && t->expected_err != NULL) {
3513        TEST_info("%s:%d: Succeeded but was expecting %s",
3514                  t->s.test_file, t->s.start, t->expected_err);
3515        return 0;
3516    }
3517
3518    if (strcmp(t->err, t->expected_err) != 0) {
3519        TEST_info("%s:%d: Expected %s got %s",
3520                  t->s.test_file, t->s.start, t->expected_err, t->err);
3521        return 0;
3522    }
3523
3524    if (t->reason == NULL)
3525        return 1;
3526
3527    if (t->reason == NULL) {
3528        TEST_info("%s:%d: Test is missing function or reason code",
3529                  t->s.test_file, t->s.start);
3530        return 0;
3531    }
3532
3533    err = ERR_peek_error();
3534    if (err == 0) {
3535        TEST_info("%s:%d: Expected error \"%s\" not set",
3536                  t->s.test_file, t->s.start, t->reason);
3537        return 0;
3538    }
3539
3540    reason = ERR_reason_error_string(err);
3541    if (reason == NULL) {
3542        TEST_info("%s:%d: Expected error \"%s\", no strings available."
3543                  " Assuming ok.",
3544                  t->s.test_file, t->s.start, t->reason);
3545        return 1;
3546    }
3547
3548    if (strcmp(reason, t->reason) == 0)
3549        return 1;
3550
3551    TEST_info("%s:%d: Expected error \"%s\", got \"%s\"",
3552              t->s.test_file, t->s.start, t->reason, reason);
3553
3554    return 0;
3555}
3556
3557/* Run a parsed test. Log a message and return 0 on error. */
3558static int run_test(EVP_TEST *t)
3559{
3560    if (t->meth == NULL)
3561        return 1;
3562    t->s.numtests++;
3563    if (t->skip) {
3564        t->s.numskip++;
3565    } else {
3566        /* run the test */
3567        if (t->err == NULL && t->meth->run_test(t) != 1) {
3568            TEST_info("%s:%d %s error",
3569                      t->s.test_file, t->s.start, t->meth->name);
3570            return 0;
3571        }
3572        if (!check_test_error(t)) {
3573            TEST_openssl_errors();
3574            t->s.errors++;
3575        }
3576    }
3577
3578    /* clean it up */
3579    return 1;
3580}
3581
3582static int find_key(EVP_PKEY **ppk, const char *name, KEY_LIST *lst)
3583{
3584    for (; lst != NULL; lst = lst->next) {
3585        if (strcmp(lst->name, name) == 0) {
3586            if (ppk != NULL)
3587                *ppk = lst->key;
3588            return 1;
3589        }
3590    }
3591    return 0;
3592}
3593
3594static void free_key_list(KEY_LIST *lst)
3595{
3596    while (lst != NULL) {
3597        KEY_LIST *next = lst->next;
3598
3599        EVP_PKEY_free(lst->key);
3600        OPENSSL_free(lst->name);
3601        OPENSSL_free(lst);
3602        lst = next;
3603    }
3604}
3605
3606/*
3607 * Is the key type an unsupported algorithm?
3608 */
3609static int key_unsupported(void)
3610{
3611    long err = ERR_peek_last_error();
3612    int lib = ERR_GET_LIB(err);
3613    long reason = ERR_GET_REASON(err);
3614
3615    if ((lib == ERR_LIB_EVP && reason == EVP_R_UNSUPPORTED_ALGORITHM)
3616        || (lib == ERR_LIB_EVP && reason == EVP_R_DECODE_ERROR)
3617        || reason == ERR_R_UNSUPPORTED) {
3618        ERR_clear_error();
3619        return 1;
3620    }
3621#ifndef OPENSSL_NO_EC
3622    /*
3623     * If EC support is enabled we should catch also EC_R_UNKNOWN_GROUP as an
3624     * hint to an unsupported algorithm/curve (e.g. if binary EC support is
3625     * disabled).
3626     */
3627    if (lib == ERR_LIB_EC
3628        && (reason == EC_R_UNKNOWN_GROUP
3629            || reason == EC_R_INVALID_CURVE)) {
3630        ERR_clear_error();
3631        return 1;
3632    }
3633#endif /* OPENSSL_NO_EC */
3634    return 0;
3635}
3636
3637/* NULL out the value from |pp| but return it.  This "steals" a pointer. */
3638static char *take_value(PAIR *pp)
3639{
3640    char *p = pp->value;
3641
3642    pp->value = NULL;
3643    return p;
3644}
3645
3646#if !defined(OPENSSL_NO_FIPS_SECURITYCHECKS)
3647static int securitycheck_enabled(void)
3648{
3649    static int enabled = -1;
3650
3651    if (enabled == -1) {
3652        if (OSSL_PROVIDER_available(libctx, "fips")) {
3653            OSSL_PARAM params[2];
3654            OSSL_PROVIDER *prov = NULL;
3655            int check = 1;
3656
3657            prov = OSSL_PROVIDER_load(libctx, "fips");
3658            if (prov != NULL) {
3659                params[0] =
3660                    OSSL_PARAM_construct_int(OSSL_PROV_PARAM_SECURITY_CHECKS,
3661                                             &check);
3662                params[1] = OSSL_PARAM_construct_end();
3663                OSSL_PROVIDER_get_params(prov, params);
3664                OSSL_PROVIDER_unload(prov);
3665            }
3666            enabled = check;
3667            return enabled;
3668        }
3669        enabled = 0;
3670    }
3671    return enabled;
3672}
3673#endif
3674
3675/*
3676 * Return 1 if one of the providers named in the string is available.
3677 * The provider names are separated with whitespace.
3678 * NOTE: destructive function, it inserts '\0' after each provider name.
3679 */
3680static int prov_available(char *providers)
3681{
3682    char *p;
3683    int more = 1;
3684
3685    while (more) {
3686        for (; isspace((unsigned char)(*providers)); providers++)
3687            continue;
3688        if (*providers == '\0')
3689            break;               /* End of the road */
3690        for (p = providers; *p != '\0' && !isspace((unsigned char)(*p)); p++)
3691            continue;
3692        if (*p == '\0')
3693            more = 0;
3694        else
3695            *p = '\0';
3696        if (OSSL_PROVIDER_available(libctx, providers))
3697            return 1;            /* Found one */
3698    }
3699    return 0;
3700}
3701
3702/* Read and parse one test.  Return 0 if failure, 1 if okay. */
3703static int parse(EVP_TEST *t)
3704{
3705    KEY_LIST *key, **klist;
3706    EVP_PKEY *pkey;
3707    PAIR *pp;
3708    int i, j, skipped = 0;
3709
3710top:
3711    do {
3712        if (BIO_eof(t->s.fp))
3713            return EOF;
3714        clear_test(t);
3715        if (!test_readstanza(&t->s))
3716            return 0;
3717    } while (t->s.numpairs == 0);
3718    pp = &t->s.pairs[0];
3719
3720    /* Are we adding a key? */
3721    klist = NULL;
3722    pkey = NULL;
3723start:
3724    if (strcmp(pp->key, "PrivateKey") == 0) {
3725        pkey = PEM_read_bio_PrivateKey_ex(t->s.key, NULL, 0, NULL, libctx, NULL);
3726        if (pkey == NULL && !key_unsupported()) {
3727            EVP_PKEY_free(pkey);
3728            TEST_info("Can't read private key %s", pp->value);
3729            TEST_openssl_errors();
3730            return 0;
3731        }
3732        klist = &private_keys;
3733    } else if (strcmp(pp->key, "PublicKey") == 0) {
3734        pkey = PEM_read_bio_PUBKEY_ex(t->s.key, NULL, 0, NULL, libctx, NULL);
3735        if (pkey == NULL && !key_unsupported()) {
3736            EVP_PKEY_free(pkey);
3737            TEST_info("Can't read public key %s", pp->value);
3738            TEST_openssl_errors();
3739            return 0;
3740        }
3741        klist = &public_keys;
3742    } else if (strcmp(pp->key, "PrivateKeyRaw") == 0
3743               || strcmp(pp->key, "PublicKeyRaw") == 0 ) {
3744        char *strnid = NULL, *keydata = NULL;
3745        unsigned char *keybin;
3746        size_t keylen;
3747        int nid;
3748
3749        if (strcmp(pp->key, "PrivateKeyRaw") == 0)
3750            klist = &private_keys;
3751        else
3752            klist = &public_keys;
3753
3754        strnid = strchr(pp->value, ':');
3755        if (strnid != NULL) {
3756            *strnid++ = '\0';
3757            keydata = strchr(strnid, ':');
3758            if (keydata != NULL)
3759                *keydata++ = '\0';
3760        }
3761        if (keydata == NULL) {
3762            TEST_info("Failed to parse %s value", pp->key);
3763            return 0;
3764        }
3765
3766        nid = OBJ_txt2nid(strnid);
3767        if (nid == NID_undef) {
3768            TEST_info("Unrecognised algorithm NID");
3769            return 0;
3770        }
3771        if (!parse_bin(keydata, &keybin, &keylen)) {
3772            TEST_info("Failed to create binary key");
3773            return 0;
3774        }
3775        if (klist == &private_keys)
3776            pkey = EVP_PKEY_new_raw_private_key_ex(libctx, strnid, NULL, keybin,
3777                                                   keylen);
3778        else
3779            pkey = EVP_PKEY_new_raw_public_key_ex(libctx, strnid, NULL, keybin,
3780                                                  keylen);
3781        if (pkey == NULL && !key_unsupported()) {
3782            TEST_info("Can't read %s data", pp->key);
3783            OPENSSL_free(keybin);
3784            TEST_openssl_errors();
3785            return 0;
3786        }
3787        OPENSSL_free(keybin);
3788    } else if (strcmp(pp->key, "Availablein") == 0) {
3789        if (!prov_available(pp->value)) {
3790            TEST_info("skipping, '%s' provider not available: %s:%d",
3791                      pp->value, t->s.test_file, t->s.start);
3792                t->skip = 1;
3793                return 0;
3794        }
3795        skipped++;
3796        pp++;
3797        goto start;
3798    } else if (strcmp(pp->key, "FIPSversion") == 0) {
3799        if (prov_available((char *)(intptr_t)"fips")) {
3800            j = fips_provider_version_match(libctx, pp->value);
3801            if (j < 0) {
3802                TEST_info("Line %d: error matching FIPS versions\n", t->s.curr);
3803                return 0;
3804            } else if (j == 0) {
3805                TEST_info("skipping, FIPS provider incompatible version: %s:%d",
3806                          t->s.test_file, t->s.start);
3807                    t->skip = 1;
3808                    return 0;
3809            }
3810        }
3811        skipped++;
3812        pp++;
3813        goto start;
3814    }
3815
3816    /* If we have a key add to list */
3817    if (klist != NULL) {
3818        if (find_key(NULL, pp->value, *klist)) {
3819            TEST_info("Duplicate key %s", pp->value);
3820            return 0;
3821        }
3822        if (!TEST_ptr(key = OPENSSL_malloc(sizeof(*key))))
3823            return 0;
3824        key->name = take_value(pp);
3825        key->key = pkey;
3826        key->next = *klist;
3827        *klist = key;
3828
3829        /* Go back and start a new stanza. */
3830        if ((t->s.numpairs - skipped) != 1)
3831            TEST_info("Line %d: missing blank line\n", t->s.curr);
3832        goto top;
3833    }
3834
3835    /* Find the test, based on first keyword. */
3836    if (!TEST_ptr(t->meth = find_test(pp->key)))
3837        return 0;
3838    if (!t->meth->init(t, pp->value)) {
3839        TEST_error("unknown %s: %s\n", pp->key, pp->value);
3840        return 0;
3841    }
3842    if (t->skip == 1) {
3843        /* TEST_info("skipping %s %s", pp->key, pp->value); */
3844        return 0;
3845    }
3846
3847    for (pp++, i = 1; i < (t->s.numpairs - skipped); pp++, i++) {
3848        if (strcmp(pp->key, "Securitycheck") == 0) {
3849#if defined(OPENSSL_NO_FIPS_SECURITYCHECKS)
3850#else
3851            if (!securitycheck_enabled())
3852#endif
3853            {
3854                TEST_info("skipping, Securitycheck is disabled: %s:%d",
3855                          t->s.test_file, t->s.start);
3856                t->skip = 1;
3857                return 0;
3858            }
3859        } else if (strcmp(pp->key, "Availablein") == 0) {
3860            TEST_info("Line %d: 'Availablein' should be the first option",
3861                      t->s.curr);
3862            return 0;
3863        } else if (strcmp(pp->key, "Result") == 0) {
3864            if (t->expected_err != NULL) {
3865                TEST_info("Line %d: multiple result lines", t->s.curr);
3866                return 0;
3867            }
3868            t->expected_err = take_value(pp);
3869        } else if (strcmp(pp->key, "Function") == 0) {
3870            /* Ignore old line. */
3871        } else if (strcmp(pp->key, "Reason") == 0) {
3872            if (t->reason != NULL) {
3873                TEST_info("Line %d: multiple reason lines", t->s.curr);
3874                return 0;
3875            }
3876            t->reason = take_value(pp);
3877        } else {
3878            /* Must be test specific line: try to parse it */
3879            int rv = t->meth->parse(t, pp->key, pp->value);
3880
3881            if (rv == 0) {
3882                TEST_info("Line %d: unknown keyword %s", t->s.curr, pp->key);
3883                return 0;
3884            }
3885            if (rv < 0) {
3886                TEST_info("Line %d: error processing keyword %s = %s\n",
3887                          t->s.curr, pp->key, pp->value);
3888                return 0;
3889            }
3890        }
3891    }
3892
3893    return 1;
3894}
3895
3896static int run_file_tests(int i)
3897{
3898    EVP_TEST *t;
3899    const char *testfile = test_get_argument(i);
3900    int c;
3901
3902    if (!TEST_ptr(t = OPENSSL_zalloc(sizeof(*t))))
3903        return 0;
3904    if (!test_start_file(&t->s, testfile)) {
3905        OPENSSL_free(t);
3906        return 0;
3907    }
3908
3909    while (!BIO_eof(t->s.fp)) {
3910        c = parse(t);
3911        if (t->skip) {
3912            t->s.numskip++;
3913            continue;
3914        }
3915        if (c == 0 || !run_test(t)) {
3916            t->s.errors++;
3917            break;
3918        }
3919    }
3920    test_end_file(&t->s);
3921    clear_test(t);
3922
3923    free_key_list(public_keys);
3924    free_key_list(private_keys);
3925    BIO_free(t->s.key);
3926    c = t->s.errors;
3927    OPENSSL_free(t);
3928    return c == 0;
3929}
3930
3931const OPTIONS *test_get_options(void)
3932{
3933    static const OPTIONS test_options[] = {
3934        OPT_TEST_OPTIONS_WITH_EXTRA_USAGE("[file...]\n"),
3935        { "config", OPT_CONFIG_FILE, '<',
3936          "The configuration file to use for the libctx" },
3937        { OPT_HELP_STR, 1, '-', "file\tFile to run tests on.\n" },
3938        { NULL }
3939    };
3940    return test_options;
3941}
3942
3943int setup_tests(void)
3944{
3945    size_t n;
3946    char *config_file = NULL;
3947
3948    OPTION_CHOICE o;
3949
3950    while ((o = opt_next()) != OPT_EOF) {
3951        switch (o) {
3952        case OPT_CONFIG_FILE:
3953            config_file = opt_arg();
3954            break;
3955        case OPT_TEST_CASES:
3956           break;
3957        default:
3958        case OPT_ERR:
3959            return 0;
3960        }
3961    }
3962
3963    /*
3964     * Load the provider via configuration into the created library context.
3965     * Load the 'null' provider into the default library context to ensure that
3966     * the tests do not fallback to using the default provider.
3967     */
3968    if (!test_get_libctx(&libctx, &prov_null, config_file, NULL, NULL))
3969        return 0;
3970
3971    n = test_get_argument_count();
3972    if (n == 0)
3973        return 0;
3974
3975    ADD_ALL_TESTS(run_file_tests, n);
3976    return 1;
3977}
3978
3979void cleanup_tests(void)
3980{
3981    OSSL_PROVIDER_unload(prov_null);
3982    OSSL_LIB_CTX_free(libctx);
3983}
3984
3985#define STR_STARTS_WITH(str, pre) OPENSSL_strncasecmp(pre, str, strlen(pre)) == 0
3986#define STR_ENDS_WITH(str, pre)                                                \
3987strlen(str) < strlen(pre) ? 0 : (OPENSSL_strcasecmp(pre, str + strlen(str) - strlen(pre)) == 0)
3988
3989static int is_digest_disabled(const char *name)
3990{
3991#ifdef OPENSSL_NO_BLAKE2
3992    if (STR_STARTS_WITH(name, "BLAKE"))
3993        return 1;
3994#endif
3995#ifdef OPENSSL_NO_MD2
3996    if (OPENSSL_strcasecmp(name, "MD2") == 0)
3997        return 1;
3998#endif
3999#ifdef OPENSSL_NO_MDC2
4000    if (OPENSSL_strcasecmp(name, "MDC2") == 0)
4001        return 1;
4002#endif
4003#ifdef OPENSSL_NO_MD4
4004    if (OPENSSL_strcasecmp(name, "MD4") == 0)
4005        return 1;
4006#endif
4007#ifdef OPENSSL_NO_MD5
4008    if (OPENSSL_strcasecmp(name, "MD5") == 0)
4009        return 1;
4010#endif
4011#ifdef OPENSSL_NO_RMD160
4012    if (OPENSSL_strcasecmp(name, "RIPEMD160") == 0)
4013        return 1;
4014#endif
4015#ifdef OPENSSL_NO_SM3
4016    if (OPENSSL_strcasecmp(name, "SM3") == 0)
4017        return 1;
4018#endif
4019#ifdef OPENSSL_NO_WHIRLPOOL
4020    if (OPENSSL_strcasecmp(name, "WHIRLPOOL") == 0)
4021        return 1;
4022#endif
4023    return 0;
4024}
4025
4026static int is_pkey_disabled(const char *name)
4027{
4028#ifdef OPENSSL_NO_EC
4029    if (STR_STARTS_WITH(name, "EC"))
4030        return 1;
4031#endif
4032#ifdef OPENSSL_NO_DH
4033    if (STR_STARTS_WITH(name, "DH"))
4034        return 1;
4035#endif
4036#ifdef OPENSSL_NO_DSA
4037    if (STR_STARTS_WITH(name, "DSA"))
4038        return 1;
4039#endif
4040    return 0;
4041}
4042
4043static int is_mac_disabled(const char *name)
4044{
4045#ifdef OPENSSL_NO_BLAKE2
4046    if (STR_STARTS_WITH(name, "BLAKE2BMAC")
4047        || STR_STARTS_WITH(name, "BLAKE2SMAC"))
4048        return 1;
4049#endif
4050#ifdef OPENSSL_NO_CMAC
4051    if (STR_STARTS_WITH(name, "CMAC"))
4052        return 1;
4053#endif
4054#ifdef OPENSSL_NO_POLY1305
4055    if (STR_STARTS_WITH(name, "Poly1305"))
4056        return 1;
4057#endif
4058#ifdef OPENSSL_NO_SIPHASH
4059    if (STR_STARTS_WITH(name, "SipHash"))
4060        return 1;
4061#endif
4062    return 0;
4063}
4064static int is_kdf_disabled(const char *name)
4065{
4066#ifdef OPENSSL_NO_SCRYPT
4067    if (STR_ENDS_WITH(name, "SCRYPT"))
4068        return 1;
4069#endif
4070    return 0;
4071}
4072
4073static int is_cipher_disabled(const char *name)
4074{
4075#ifdef OPENSSL_NO_ARIA
4076    if (STR_STARTS_WITH(name, "ARIA"))
4077        return 1;
4078#endif
4079#ifdef OPENSSL_NO_BF
4080    if (STR_STARTS_WITH(name, "BF"))
4081        return 1;
4082#endif
4083#ifdef OPENSSL_NO_CAMELLIA
4084    if (STR_STARTS_WITH(name, "CAMELLIA"))
4085        return 1;
4086#endif
4087#ifdef OPENSSL_NO_CAST
4088    if (STR_STARTS_WITH(name, "CAST"))
4089        return 1;
4090#endif
4091#ifdef OPENSSL_NO_CHACHA
4092    if (STR_STARTS_WITH(name, "CHACHA"))
4093        return 1;
4094#endif
4095#ifdef OPENSSL_NO_POLY1305
4096    if (STR_ENDS_WITH(name, "Poly1305"))
4097        return 1;
4098#endif
4099#ifdef OPENSSL_NO_DES
4100    if (STR_STARTS_WITH(name, "DES"))
4101        return 1;
4102    if (STR_ENDS_WITH(name, "3DESwrap"))
4103        return 1;
4104#endif
4105#ifdef OPENSSL_NO_OCB
4106    if (STR_ENDS_WITH(name, "OCB"))
4107        return 1;
4108#endif
4109#ifdef OPENSSL_NO_IDEA
4110    if (STR_STARTS_WITH(name, "IDEA"))
4111        return 1;
4112#endif
4113#ifdef OPENSSL_NO_RC2
4114    if (STR_STARTS_WITH(name, "RC2"))
4115        return 1;
4116#endif
4117#ifdef OPENSSL_NO_RC4
4118    if (STR_STARTS_WITH(name, "RC4"))
4119        return 1;
4120#endif
4121#ifdef OPENSSL_NO_RC5
4122    if (STR_STARTS_WITH(name, "RC5"))
4123        return 1;
4124#endif
4125#ifdef OPENSSL_NO_SEED
4126    if (STR_STARTS_WITH(name, "SEED"))
4127        return 1;
4128#endif
4129#ifdef OPENSSL_NO_SIV
4130    if (STR_ENDS_WITH(name, "SIV"))
4131        return 1;
4132#endif
4133#ifdef OPENSSL_NO_SM4
4134    if (STR_STARTS_WITH(name, "SM4"))
4135        return 1;
4136#endif
4137    return 0;
4138}
4139