Modernise the ERR functionality further (new functions and deprecations)
[openssl.git] / test / evp_test.c
1 /*
2  * Copyright 2015-2019 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 #include <stdio.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <ctype.h>
14 #include <openssl/evp.h>
15 #include <openssl/pem.h>
16 #include <openssl/err.h>
17 #include <openssl/provider.h>
18 #include <openssl/x509v3.h>
19 #include <openssl/pkcs12.h>
20 #include <openssl/kdf.h>
21 #include <openssl/params.h>
22 #include <openssl/core_names.h>
23 #include "internal/numbers.h"
24 #include "internal/nelem.h"
25 #include "testutil.h"
26 #include "evp_test.h"
27
28 #define AAD_NUM 4
29
30 typedef struct evp_test_method_st EVP_TEST_METHOD;
31
32 /*
33  * Structure holding test information
34  */
35 typedef struct evp_test_st {
36     STANZA s;                     /* Common test stanza */
37     char *name;
38     int skip;                     /* Current test should be skipped */
39     const EVP_TEST_METHOD *meth;  /* method for this test */
40     const char *err, *aux_err;    /* Error string for test */
41     char *expected_err;           /* Expected error value of test */
42     char *reason;                 /* Expected error reason string */
43     void *data;                   /* test specific data */
44 } EVP_TEST;
45
46 /*
47  * Test method structure
48  */
49 struct evp_test_method_st {
50     /* Name of test as it appears in file */
51     const char *name;
52     /* Initialise test for "alg" */
53     int (*init) (EVP_TEST * t, const char *alg);
54     /* Clean up method */
55     void (*cleanup) (EVP_TEST * t);
56     /* Test specific name value pair processing */
57     int (*parse) (EVP_TEST * t, const char *name, const char *value);
58     /* Run the test itself */
59     int (*run_test) (EVP_TEST * t);
60 };
61
62
63 /*
64  * Linked list of named keys.
65  */
66 typedef struct key_list_st {
67     char *name;
68     EVP_PKEY *key;
69     struct key_list_st *next;
70 } KEY_LIST;
71
72 /*
73  * List of public and private keys
74  */
75 static KEY_LIST *private_keys;
76 static KEY_LIST *public_keys;
77 static int find_key(EVP_PKEY **ppk, const char *name, KEY_LIST *lst);
78
79 static int parse_bin(const char *value, unsigned char **buf, size_t *buflen);
80
81 /*
82  * Compare two memory regions for equality, returning zero if they differ.
83  * However, if there is expected to be an error and the actual error
84  * matches then the memory is expected to be different so handle this
85  * case without producing unnecessary test framework output.
86  */
87 static int memory_err_compare(EVP_TEST *t, const char *err,
88                               const void *expected, size_t expected_len,
89                               const void *got, size_t got_len)
90 {
91     int r;
92
93     if (t->expected_err != NULL && strcmp(t->expected_err, err) == 0)
94         r = !TEST_mem_ne(expected, expected_len, got, got_len);
95     else
96         r = TEST_mem_eq(expected, expected_len, got, got_len);
97     if (!r)
98         t->err = err;
99     return r;
100 }
101
102 /*
103  * Structure used to hold a list of blocks of memory to test
104  * calls to "update" like functions.
105  */
106 struct evp_test_buffer_st {
107     unsigned char *buf;
108     size_t buflen;
109     size_t count;
110     int count_set;
111 };
112
113 static void evp_test_buffer_free(EVP_TEST_BUFFER *db)
114 {
115     if (db != NULL) {
116         OPENSSL_free(db->buf);
117         OPENSSL_free(db);
118     }
119 }
120
121 /*
122  * append buffer to a list
123  */
124 static int evp_test_buffer_append(const char *value,
125                                   STACK_OF(EVP_TEST_BUFFER) **sk)
126 {
127     EVP_TEST_BUFFER *db = NULL;
128
129     if (!TEST_ptr(db = OPENSSL_malloc(sizeof(*db))))
130         goto err;
131
132     if (!parse_bin(value, &db->buf, &db->buflen))
133         goto err;
134     db->count = 1;
135     db->count_set = 0;
136
137     if (*sk == NULL && !TEST_ptr(*sk = sk_EVP_TEST_BUFFER_new_null()))
138         goto err;
139     if (!sk_EVP_TEST_BUFFER_push(*sk, db))
140         goto err;
141
142     return 1;
143
144 err:
145     evp_test_buffer_free(db);
146     return 0;
147 }
148
149 /*
150  * replace last buffer in list with copies of itself
151  */
152 static int evp_test_buffer_ncopy(const char *value,
153                                  STACK_OF(EVP_TEST_BUFFER) *sk)
154 {
155     EVP_TEST_BUFFER *db;
156     unsigned char *tbuf, *p;
157     size_t tbuflen;
158     int ncopy = atoi(value);
159     int i;
160
161     if (ncopy <= 0)
162         return 0;
163     if (sk == NULL || sk_EVP_TEST_BUFFER_num(sk) == 0)
164         return 0;
165     db = sk_EVP_TEST_BUFFER_value(sk, sk_EVP_TEST_BUFFER_num(sk) - 1);
166
167     tbuflen = db->buflen * ncopy;
168     if (!TEST_ptr(tbuf = OPENSSL_malloc(tbuflen)))
169         return 0;
170     for (i = 0, p = tbuf; i < ncopy; i++, p += db->buflen)
171         memcpy(p, db->buf, db->buflen);
172
173     OPENSSL_free(db->buf);
174     db->buf = tbuf;
175     db->buflen = tbuflen;
176     return 1;
177 }
178
179 /*
180  * set repeat count for last buffer in list
181  */
182 static int evp_test_buffer_set_count(const char *value,
183                                      STACK_OF(EVP_TEST_BUFFER) *sk)
184 {
185     EVP_TEST_BUFFER *db;
186     int count = atoi(value);
187
188     if (count <= 0)
189         return 0;
190
191     if (sk == NULL || sk_EVP_TEST_BUFFER_num(sk) == 0)
192         return 0;
193
194     db = sk_EVP_TEST_BUFFER_value(sk, sk_EVP_TEST_BUFFER_num(sk) - 1);
195     if (db->count_set != 0)
196         return 0;
197
198     db->count = (size_t)count;
199     db->count_set = 1;
200     return 1;
201 }
202
203 /*
204  * call "fn" with each element of the list in turn
205  */
206 static int evp_test_buffer_do(STACK_OF(EVP_TEST_BUFFER) *sk,
207                               int (*fn)(void *ctx,
208                                         const unsigned char *buf,
209                                         size_t buflen),
210                               void *ctx)
211 {
212     int i;
213
214     for (i = 0; i < sk_EVP_TEST_BUFFER_num(sk); i++) {
215         EVP_TEST_BUFFER *tb = sk_EVP_TEST_BUFFER_value(sk, i);
216         size_t j;
217
218         for (j = 0; j < tb->count; j++) {
219             if (fn(ctx, tb->buf, tb->buflen) <= 0)
220                 return 0;
221         }
222     }
223     return 1;
224 }
225
226 /*
227  * Unescape some sequences in string literals (only \n for now).
228  * Return an allocated buffer, set |out_len|.  If |input_len|
229  * is zero, get an empty buffer but set length to zero.
230  */
231 static unsigned char* unescape(const char *input, size_t input_len,
232                                size_t *out_len)
233 {
234     unsigned char *ret, *p;
235     size_t i;
236
237     if (input_len == 0) {
238         *out_len = 0;
239         return OPENSSL_zalloc(1);
240     }
241
242     /* Escaping is non-expanding; over-allocate original size for simplicity. */
243     if (!TEST_ptr(ret = p = OPENSSL_malloc(input_len)))
244         return NULL;
245
246     for (i = 0; i < input_len; i++) {
247         if (*input == '\\') {
248             if (i == input_len - 1 || *++input != 'n') {
249                 TEST_error("Bad escape sequence in file");
250                 goto err;
251             }
252             *p++ = '\n';
253             i++;
254             input++;
255         } else {
256             *p++ = *input++;
257         }
258     }
259
260     *out_len = p - ret;
261     return ret;
262
263  err:
264     OPENSSL_free(ret);
265     return NULL;
266 }
267
268 /*
269  * For a hex string "value" convert to a binary allocated buffer.
270  * Return 1 on success or 0 on failure.
271  */
272 static int parse_bin(const char *value, unsigned char **buf, size_t *buflen)
273 {
274     long len;
275
276     /* Check for NULL literal */
277     if (strcmp(value, "NULL") == 0) {
278         *buf = NULL;
279         *buflen = 0;
280         return 1;
281     }
282
283     /* Check for empty value */
284     if (*value == '\0') {
285         /*
286          * Don't return NULL for zero length buffer. This is needed for
287          * some tests with empty keys: HMAC_Init_ex() expects a non-NULL key
288          * buffer even if the key length is 0, in order to detect key reset.
289          */
290         *buf = OPENSSL_malloc(1);
291         if (*buf == NULL)
292             return 0;
293         **buf = 0;
294         *buflen = 0;
295         return 1;
296     }
297
298     /* Check for string literal */
299     if (value[0] == '"') {
300         size_t vlen = strlen(++value);
301
302         if (vlen == 0 || value[vlen - 1] != '"')
303             return 0;
304         vlen--;
305         *buf = unescape(value, vlen, buflen);
306         return *buf == NULL ? 0 : 1;
307     }
308
309     /* Otherwise assume as hex literal and convert it to binary buffer */
310     if (!TEST_ptr(*buf = OPENSSL_hexstr2buf(value, &len))) {
311         TEST_info("Can't convert %s", value);
312         TEST_openssl_errors();
313         return -1;
314     }
315     /* Size of input buffer means we'll never overflow */
316     *buflen = len;
317     return 1;
318 }
319
320
321 /**
322 ***  MESSAGE DIGEST TESTS
323 **/
324
325 typedef struct digest_data_st {
326     /* Digest this test is for */
327     const EVP_MD *digest;
328     EVP_MD *fetched_digest;
329     /* Input to digest */
330     STACK_OF(EVP_TEST_BUFFER) *input;
331     /* Expected output */
332     unsigned char *output;
333     size_t output_len;
334 } DIGEST_DATA;
335
336 static int digest_test_init(EVP_TEST *t, const char *alg)
337 {
338     DIGEST_DATA *mdat;
339     const EVP_MD *digest;
340     EVP_MD *fetched_digest;
341
342     if ((digest = fetched_digest = EVP_MD_fetch(NULL, alg, NULL)) == NULL
343         && (digest = EVP_get_digestbyname(alg)) == NULL) {
344         /* If alg has an OID assume disabled algorithm */
345         if (OBJ_sn2nid(alg) != NID_undef || OBJ_ln2nid(alg) != NID_undef) {
346             t->skip = 1;
347             return 1;
348         }
349         return 0;
350     }
351     if (!TEST_ptr(mdat = OPENSSL_zalloc(sizeof(*mdat))))
352         return 0;
353     t->data = mdat;
354     mdat->digest = digest;
355     mdat->fetched_digest = fetched_digest;
356     if (fetched_digest != NULL)
357         TEST_info("%s is fetched", alg);
358     return 1;
359 }
360
361 static void digest_test_cleanup(EVP_TEST *t)
362 {
363     DIGEST_DATA *mdat = t->data;
364
365     sk_EVP_TEST_BUFFER_pop_free(mdat->input, evp_test_buffer_free);
366     OPENSSL_free(mdat->output);
367     EVP_MD_meth_free(mdat->fetched_digest);
368 }
369
370 static int digest_test_parse(EVP_TEST *t,
371                              const char *keyword, const char *value)
372 {
373     DIGEST_DATA *mdata = t->data;
374
375     if (strcmp(keyword, "Input") == 0)
376         return evp_test_buffer_append(value, &mdata->input);
377     if (strcmp(keyword, "Output") == 0)
378         return parse_bin(value, &mdata->output, &mdata->output_len);
379     if (strcmp(keyword, "Count") == 0)
380         return evp_test_buffer_set_count(value, mdata->input);
381     if (strcmp(keyword, "Ncopy") == 0)
382         return evp_test_buffer_ncopy(value, mdata->input);
383     return 0;
384 }
385
386 static int digest_update_fn(void *ctx, const unsigned char *buf, size_t buflen)
387 {
388     return EVP_DigestUpdate(ctx, buf, buflen);
389 }
390
391 static int digest_test_run(EVP_TEST *t)
392 {
393     DIGEST_DATA *expected = t->data;
394     EVP_MD_CTX *mctx;
395     unsigned char *got = NULL;
396     unsigned int got_len;
397
398     t->err = "TEST_FAILURE";
399     if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
400         goto err;
401
402     got = OPENSSL_malloc(expected->output_len > EVP_MAX_MD_SIZE ?
403                          expected->output_len : EVP_MAX_MD_SIZE);
404     if (!TEST_ptr(got))
405         goto err;
406
407     if (!EVP_DigestInit_ex(mctx, expected->digest, NULL)) {
408         t->err = "DIGESTINIT_ERROR";
409         goto err;
410     }
411     if (!evp_test_buffer_do(expected->input, digest_update_fn, mctx)) {
412         t->err = "DIGESTUPDATE_ERROR";
413         goto err;
414     }
415
416     if (EVP_MD_flags(expected->digest) & EVP_MD_FLAG_XOF) {
417         EVP_MD_CTX *mctx_cpy;
418         char dont[] = "touch";
419
420         if (!TEST_ptr(mctx_cpy = EVP_MD_CTX_new())) {
421             goto err;
422         }
423         if (!EVP_MD_CTX_copy(mctx_cpy, mctx)) {
424             EVP_MD_CTX_free(mctx_cpy);
425             goto err;
426         }
427         if (!EVP_DigestFinalXOF(mctx_cpy, (unsigned char *)dont, 0)) {
428             EVP_MD_CTX_free(mctx_cpy);
429             t->err = "DIGESTFINALXOF_ERROR";
430             goto err;
431         }
432         if (!TEST_str_eq(dont, "touch")) {
433             EVP_MD_CTX_free(mctx_cpy);
434             t->err = "DIGESTFINALXOF_ERROR";
435             goto err;
436         }
437         EVP_MD_CTX_free(mctx_cpy);
438
439         got_len = expected->output_len;
440         if (!EVP_DigestFinalXOF(mctx, got, got_len)) {
441             t->err = "DIGESTFINALXOF_ERROR";
442             goto err;
443         }
444     } else {
445         if (!EVP_DigestFinal(mctx, got, &got_len)) {
446             t->err = "DIGESTFINAL_ERROR";
447             goto err;
448         }
449     }
450     if (!TEST_int_eq(expected->output_len, got_len)) {
451         t->err = "DIGEST_LENGTH_MISMATCH";
452         goto err;
453     }
454     if (!memory_err_compare(t, "DIGEST_MISMATCH",
455                             expected->output, expected->output_len,
456                             got, got_len))
457         goto err;
458
459     t->err = NULL;
460
461  err:
462     OPENSSL_free(got);
463     EVP_MD_CTX_free(mctx);
464     return 1;
465 }
466
467 static const EVP_TEST_METHOD digest_test_method = {
468     "Digest",
469     digest_test_init,
470     digest_test_cleanup,
471     digest_test_parse,
472     digest_test_run
473 };
474
475
476 /**
477 ***  CIPHER TESTS
478 **/
479
480 typedef struct cipher_data_st {
481     const EVP_CIPHER *cipher;
482     EVP_CIPHER *fetched_cipher;
483     int enc;
484     /* EVP_CIPH_GCM_MODE, EVP_CIPH_CCM_MODE or EVP_CIPH_OCB_MODE if AEAD */
485     int aead;
486     unsigned char *key;
487     size_t key_len;
488     unsigned char *iv;
489     size_t iv_len;
490     unsigned char *plaintext;
491     size_t plaintext_len;
492     unsigned char *ciphertext;
493     size_t ciphertext_len;
494     /* GCM, CCM, OCB and SIV only */
495     unsigned char *aad[AAD_NUM];
496     size_t aad_len[AAD_NUM];
497     unsigned char *tag;
498     size_t tag_len;
499     int tag_late;
500 } CIPHER_DATA;
501
502 static int cipher_test_init(EVP_TEST *t, const char *alg)
503 {
504     const EVP_CIPHER *cipher;
505     EVP_CIPHER *fetched_cipher;
506     CIPHER_DATA *cdat;
507     int m;
508
509     if ((cipher = fetched_cipher = EVP_CIPHER_fetch(NULL, alg, NULL)) == NULL
510         && (cipher = EVP_get_cipherbyname(alg)) == NULL) {
511         /* If alg has an OID assume disabled algorithm */
512         if (OBJ_sn2nid(alg) != NID_undef || OBJ_ln2nid(alg) != NID_undef) {
513             t->skip = 1;
514             return 1;
515         }
516         return 0;
517     }
518     cdat = OPENSSL_zalloc(sizeof(*cdat));
519     cdat->cipher = cipher;
520     cdat->fetched_cipher = fetched_cipher;
521     cdat->enc = -1;
522     m = EVP_CIPHER_mode(cipher);
523     if (m == EVP_CIPH_GCM_MODE
524             || m == EVP_CIPH_OCB_MODE
525             || m == EVP_CIPH_SIV_MODE
526             || m == EVP_CIPH_CCM_MODE)
527         cdat->aead = m;
528     else if (EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER)
529         cdat->aead = -1;
530     else
531         cdat->aead = 0;
532
533     t->data = cdat;
534     if (fetched_cipher != NULL)
535         TEST_info("%s is fetched", alg);
536     return 1;
537 }
538
539 static void cipher_test_cleanup(EVP_TEST *t)
540 {
541     int i;
542     CIPHER_DATA *cdat = t->data;
543
544     OPENSSL_free(cdat->key);
545     OPENSSL_free(cdat->iv);
546     OPENSSL_free(cdat->ciphertext);
547     OPENSSL_free(cdat->plaintext);
548     for (i = 0; i < AAD_NUM; i++)
549         OPENSSL_free(cdat->aad[i]);
550     OPENSSL_free(cdat->tag);
551     EVP_CIPHER_meth_free(cdat->fetched_cipher);
552 }
553
554 static int cipher_test_parse(EVP_TEST *t, const char *keyword,
555                              const char *value)
556 {
557     CIPHER_DATA *cdat = t->data;
558     int i;
559
560     if (strcmp(keyword, "Key") == 0)
561         return parse_bin(value, &cdat->key, &cdat->key_len);
562     if (strcmp(keyword, "IV") == 0)
563         return parse_bin(value, &cdat->iv, &cdat->iv_len);
564     if (strcmp(keyword, "Plaintext") == 0)
565         return parse_bin(value, &cdat->plaintext, &cdat->plaintext_len);
566     if (strcmp(keyword, "Ciphertext") == 0)
567         return parse_bin(value, &cdat->ciphertext, &cdat->ciphertext_len);
568     if (cdat->aead) {
569         if (strcmp(keyword, "AAD") == 0) {
570             for (i = 0; i < AAD_NUM; i++) {
571                 if (cdat->aad[i] == NULL)
572                     return parse_bin(value, &cdat->aad[i], &cdat->aad_len[i]);
573             }
574             return -1;
575         }
576         if (strcmp(keyword, "Tag") == 0)
577             return parse_bin(value, &cdat->tag, &cdat->tag_len);
578         if (strcmp(keyword, "SetTagLate") == 0) {
579             if (strcmp(value, "TRUE") == 0)
580                 cdat->tag_late = 1;
581             else if (strcmp(value, "FALSE") == 0)
582                 cdat->tag_late = 0;
583             else
584                 return -1;
585             return 1;
586         }
587     }
588
589     if (strcmp(keyword, "Operation") == 0) {
590         if (strcmp(value, "ENCRYPT") == 0)
591             cdat->enc = 1;
592         else if (strcmp(value, "DECRYPT") == 0)
593             cdat->enc = 0;
594         else
595             return -1;
596         return 1;
597     }
598     return 0;
599 }
600
601 static int cipher_test_enc(EVP_TEST *t, int enc,
602                            size_t out_misalign, size_t inp_misalign, int frag)
603 {
604     CIPHER_DATA *expected = t->data;
605     unsigned char *in, *expected_out, *tmp = NULL;
606     size_t in_len, out_len, donelen = 0;
607     int ok = 0, tmplen, chunklen, tmpflen, i;
608     EVP_CIPHER_CTX *ctx = NULL;
609
610     t->err = "TEST_FAILURE";
611     if (!TEST_ptr(ctx = EVP_CIPHER_CTX_new()))
612         goto err;
613     EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
614     if (enc) {
615         in = expected->plaintext;
616         in_len = expected->plaintext_len;
617         expected_out = expected->ciphertext;
618         out_len = expected->ciphertext_len;
619     } else {
620         in = expected->ciphertext;
621         in_len = expected->ciphertext_len;
622         expected_out = expected->plaintext;
623         out_len = expected->plaintext_len;
624     }
625     if (inp_misalign == (size_t)-1) {
626         /*
627          * Exercise in-place encryption
628          */
629         tmp = OPENSSL_malloc(out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH);
630         if (!tmp)
631             goto err;
632         in = memcpy(tmp + out_misalign, in, in_len);
633     } else {
634         inp_misalign += 16 - ((out_misalign + in_len) & 15);
635         /*
636          * 'tmp' will store both output and copy of input. We make the copy
637          * of input to specifically aligned part of 'tmp'. So we just
638          * figured out how much padding would ensure the required alignment,
639          * now we allocate extended buffer and finally copy the input just
640          * past inp_misalign in expression below. Output will be written
641          * past out_misalign...
642          */
643         tmp = OPENSSL_malloc(out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH +
644                              inp_misalign + in_len);
645         if (!tmp)
646             goto err;
647         in = memcpy(tmp + out_misalign + in_len + 2 * EVP_MAX_BLOCK_LENGTH +
648                     inp_misalign, in, in_len);
649     }
650     if (!EVP_CipherInit_ex(ctx, expected->cipher, NULL, NULL, NULL, enc)) {
651         t->err = "CIPHERINIT_ERROR";
652         goto err;
653     }
654     if (expected->iv) {
655         if (expected->aead) {
656             if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN,
657                                      expected->iv_len, 0)) {
658                 t->err = "INVALID_IV_LENGTH";
659                 goto err;
660             }
661         } else if (expected->iv_len != (size_t)EVP_CIPHER_CTX_iv_length(ctx)) {
662             t->err = "INVALID_IV_LENGTH";
663             goto err;
664         }
665     }
666     if (expected->aead) {
667         unsigned char *tag;
668         /*
669          * If encrypting or OCB just set tag length initially, otherwise
670          * set tag length and value.
671          */
672         if (enc || expected->aead == EVP_CIPH_OCB_MODE || expected->tag_late) {
673             t->err = "TAG_LENGTH_SET_ERROR";
674             tag = NULL;
675         } else {
676             t->err = "TAG_SET_ERROR";
677             tag = expected->tag;
678         }
679         if (tag || expected->aead != EVP_CIPH_GCM_MODE) {
680             if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
681                                      expected->tag_len, tag))
682                 goto err;
683         }
684     }
685
686     if (!EVP_CIPHER_CTX_set_key_length(ctx, expected->key_len)) {
687         t->err = "INVALID_KEY_LENGTH";
688         goto err;
689     }
690     if (!EVP_CipherInit_ex(ctx, NULL, NULL, expected->key, expected->iv, -1)) {
691         t->err = "KEY_SET_ERROR";
692         goto err;
693     }
694     /* Check that we get the same IV back */
695     if (expected->iv != NULL
696         && (EVP_CIPHER_flags(expected->cipher) & EVP_CIPH_CUSTOM_IV) == 0
697         && !TEST_mem_eq(expected->iv, expected->iv_len,
698                         EVP_CIPHER_CTX_iv(ctx), expected->iv_len)) {
699         t->err = "INVALID_IV";
700         goto err;
701     }
702
703     if (expected->aead == EVP_CIPH_CCM_MODE) {
704         if (!EVP_CipherUpdate(ctx, NULL, &tmplen, NULL, out_len)) {
705             t->err = "CCM_PLAINTEXT_LENGTH_SET_ERROR";
706             goto err;
707         }
708     }
709     if (expected->aad[0] != NULL) {
710         t->err = "AAD_SET_ERROR";
711         if (!frag) {
712             for (i = 0; expected->aad[i] != NULL; i++) {
713                 if (!EVP_CipherUpdate(ctx, NULL, &chunklen, expected->aad[i],
714                                       expected->aad_len[i]))
715                     goto err;
716             }
717         } else {
718             /*
719              * Supply the AAD in chunks less than the block size where possible
720              */
721             for (i = 0; expected->aad[i] != NULL; i++) {
722                 if (expected->aad_len[i] > 0) {
723                     if (!EVP_CipherUpdate(ctx, NULL, &chunklen, expected->aad[i], 1))
724                         goto err;
725                     donelen++;
726                 }
727                 if (expected->aad_len[i] > 2) {
728                     if (!EVP_CipherUpdate(ctx, NULL, &chunklen,
729                                           expected->aad[i] + donelen,
730                                           expected->aad_len[i] - 2))
731                         goto err;
732                     donelen += expected->aad_len[i] - 2;
733                 }
734                 if (expected->aad_len[i] > 1
735                     && !EVP_CipherUpdate(ctx, NULL, &chunklen,
736                                          expected->aad[i] + donelen, 1))
737                     goto err;
738             }
739         }
740     }
741
742     if (!enc && (expected->aead == EVP_CIPH_OCB_MODE || expected->tag_late)) {
743         if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
744                                  expected->tag_len, expected->tag)) {
745             t->err = "TAG_SET_ERROR";
746             goto err;
747         }
748     }
749
750     EVP_CIPHER_CTX_set_padding(ctx, 0);
751     t->err = "CIPHERUPDATE_ERROR";
752     tmplen = 0;
753     if (!frag) {
754         /* We supply the data all in one go */
755         if (!EVP_CipherUpdate(ctx, tmp + out_misalign, &tmplen, in, in_len))
756             goto err;
757     } else {
758         /* Supply the data in chunks less than the block size where possible */
759         if (in_len > 0) {
760             if (!EVP_CipherUpdate(ctx, tmp + out_misalign, &chunklen, in, 1))
761                 goto err;
762             tmplen += chunklen;
763             in++;
764             in_len--;
765         }
766         if (in_len > 1) {
767             if (!EVP_CipherUpdate(ctx, tmp + out_misalign + tmplen, &chunklen,
768                                   in, in_len - 1))
769                 goto err;
770             tmplen += chunklen;
771             in += in_len - 1;
772             in_len = 1;
773         }
774         if (in_len > 0 ) {
775             if (!EVP_CipherUpdate(ctx, tmp + out_misalign + tmplen, &chunklen,
776                                   in, 1))
777                 goto err;
778             tmplen += chunklen;
779         }
780     }
781     if (!EVP_CipherFinal_ex(ctx, tmp + out_misalign + tmplen, &tmpflen)) {
782         t->err = "CIPHERFINAL_ERROR";
783         goto err;
784     }
785     if (!memory_err_compare(t, "VALUE_MISMATCH", expected_out, out_len,
786                             tmp + out_misalign, tmplen + tmpflen))
787         goto err;
788     if (enc && expected->aead) {
789         unsigned char rtag[16];
790
791         if (!TEST_size_t_le(expected->tag_len, sizeof(rtag))) {
792             t->err = "TAG_LENGTH_INTERNAL_ERROR";
793             goto err;
794         }
795         if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG,
796                                  expected->tag_len, rtag)) {
797             t->err = "TAG_RETRIEVE_ERROR";
798             goto err;
799         }
800         if (!memory_err_compare(t, "TAG_VALUE_MISMATCH",
801                                 expected->tag, expected->tag_len,
802                                 rtag, expected->tag_len))
803             goto err;
804     }
805     t->err = NULL;
806     ok = 1;
807  err:
808     OPENSSL_free(tmp);
809     EVP_CIPHER_CTX_free(ctx);
810     return ok;
811 }
812
813 static int cipher_test_run(EVP_TEST *t)
814 {
815     CIPHER_DATA *cdat = t->data;
816     int rv, frag = 0;
817     size_t out_misalign, inp_misalign;
818
819     if (!cdat->key) {
820         t->err = "NO_KEY";
821         return 0;
822     }
823     if (!cdat->iv && EVP_CIPHER_iv_length(cdat->cipher)) {
824         /* IV is optional and usually omitted in wrap mode */
825         if (EVP_CIPHER_mode(cdat->cipher) != EVP_CIPH_WRAP_MODE) {
826             t->err = "NO_IV";
827             return 0;
828         }
829     }
830     if (cdat->aead && !cdat->tag) {
831         t->err = "NO_TAG";
832         return 0;
833     }
834     for (out_misalign = 0; out_misalign <= 1;) {
835         static char aux_err[64];
836         t->aux_err = aux_err;
837         for (inp_misalign = (size_t)-1; inp_misalign != 2; inp_misalign++) {
838             if (inp_misalign == (size_t)-1) {
839                 /* kludge: inp_misalign == -1 means "exercise in-place" */
840                 BIO_snprintf(aux_err, sizeof(aux_err),
841                              "%s in-place, %sfragmented",
842                              out_misalign ? "misaligned" : "aligned",
843                              frag ? "" : "not ");
844             } else {
845                 BIO_snprintf(aux_err, sizeof(aux_err),
846                              "%s output and %s input, %sfragmented",
847                              out_misalign ? "misaligned" : "aligned",
848                              inp_misalign ? "misaligned" : "aligned",
849                              frag ? "" : "not ");
850             }
851             if (cdat->enc) {
852                 rv = cipher_test_enc(t, 1, out_misalign, inp_misalign, frag);
853                 /* Not fatal errors: return */
854                 if (rv != 1) {
855                     if (rv < 0)
856                         return 0;
857                     return 1;
858                 }
859             }
860             if (cdat->enc != 1) {
861                 rv = cipher_test_enc(t, 0, out_misalign, inp_misalign, frag);
862                 /* Not fatal errors: return */
863                 if (rv != 1) {
864                     if (rv < 0)
865                         return 0;
866                     return 1;
867                 }
868             }
869         }
870
871         if (out_misalign == 1 && frag == 0) {
872             /*
873              * XTS, SIV, CCM and Wrap modes have special requirements about input
874              * lengths so we don't fragment for those
875              */
876             if (cdat->aead == EVP_CIPH_CCM_MODE
877                     || EVP_CIPHER_mode(cdat->cipher) == EVP_CIPH_SIV_MODE
878                     || EVP_CIPHER_mode(cdat->cipher) == EVP_CIPH_XTS_MODE
879                     || EVP_CIPHER_mode(cdat->cipher) == EVP_CIPH_WRAP_MODE)
880                 break;
881             out_misalign = 0;
882             frag++;
883         } else {
884             out_misalign++;
885         }
886     }
887     t->aux_err = NULL;
888
889     return 1;
890 }
891
892 static const EVP_TEST_METHOD cipher_test_method = {
893     "Cipher",
894     cipher_test_init,
895     cipher_test_cleanup,
896     cipher_test_parse,
897     cipher_test_run
898 };
899
900
901 /**
902 ***  MAC TESTS
903 **/
904
905 typedef struct mac_data_st {
906     /* MAC type in one form or another */
907     EVP_MAC *mac;                /* for mac_test_run_mac */
908     int type;                    /* for mac_test_run_pkey */
909     /* Algorithm string for this MAC */
910     char *alg;
911     /* MAC key */
912     unsigned char *key;
913     size_t key_len;
914     /* MAC IV (GMAC) */
915     unsigned char *iv;
916     size_t iv_len;
917     /* Input to MAC */
918     unsigned char *input;
919     size_t input_len;
920     /* Expected output */
921     unsigned char *output;
922     size_t output_len;
923     unsigned char *custom;
924     size_t custom_len;
925     /* MAC salt (blake2) */
926     unsigned char *salt;
927     size_t salt_len;
928     /* Collection of controls */
929     STACK_OF(OPENSSL_STRING) *controls;
930 } MAC_DATA;
931
932 static int mac_test_init(EVP_TEST *t, const char *alg)
933 {
934     EVP_MAC *mac = NULL;
935     int type = NID_undef;
936     MAC_DATA *mdat;
937
938     if ((mac = EVP_MAC_fetch(NULL, alg, NULL)) == NULL) {
939         /*
940          * Since we didn't find an EVP_MAC, we check for known EVP_PKEY methods
941          * For debugging purposes, we allow 'NNNN by EVP_PKEY' to force running
942          * the EVP_PKEY method.
943          */
944         size_t sz = strlen(alg);
945         static const char epilogue[] = " by EVP_PKEY";
946
947         if (sz >= sizeof(epilogue)
948             && strcmp(alg + sz - (sizeof(epilogue) - 1), epilogue) == 0)
949             sz -= sizeof(epilogue) - 1;
950
951         if (strncmp(alg, "HMAC", sz) == 0) {
952             type = EVP_PKEY_HMAC;
953         } else if (strncmp(alg, "CMAC", sz) == 0) {
954 #ifndef OPENSSL_NO_CMAC
955             type = EVP_PKEY_CMAC;
956 #else
957             t->skip = 1;
958             return 1;
959 #endif
960         } else if (strncmp(alg, "Poly1305", sz) == 0) {
961 #ifndef OPENSSL_NO_POLY1305
962             type = EVP_PKEY_POLY1305;
963 #else
964             t->skip = 1;
965             return 1;
966 #endif
967         } else if (strncmp(alg, "SipHash", sz) == 0) {
968 #ifndef OPENSSL_NO_SIPHASH
969             type = EVP_PKEY_SIPHASH;
970 #else
971             t->skip = 1;
972             return 1;
973 #endif
974         } else {
975             /*
976              * Not a known EVP_PKEY method either.  If it's a known OID, then
977              * assume it's been disabled.
978              */
979             if (OBJ_sn2nid(alg) != NID_undef || OBJ_ln2nid(alg) != NID_undef) {
980                 t->skip = 1;
981                 return 1;
982             }
983
984             return 0;
985         }
986     }
987
988     mdat = OPENSSL_zalloc(sizeof(*mdat));
989     mdat->type = type;
990     mdat->mac = mac;
991     mdat->controls = sk_OPENSSL_STRING_new_null();
992     t->data = mdat;
993     return 1;
994 }
995
996 /* Because OPENSSL_free is a macro, it can't be passed as a function pointer */
997 static void openssl_free(char *m)
998 {
999     OPENSSL_free(m);
1000 }
1001
1002 static void mac_test_cleanup(EVP_TEST *t)
1003 {
1004     MAC_DATA *mdat = t->data;
1005
1006     EVP_MAC_free(mdat->mac);
1007     sk_OPENSSL_STRING_pop_free(mdat->controls, openssl_free);
1008     OPENSSL_free(mdat->alg);
1009     OPENSSL_free(mdat->key);
1010     OPENSSL_free(mdat->iv);
1011     OPENSSL_free(mdat->custom);
1012     OPENSSL_free(mdat->salt);
1013     OPENSSL_free(mdat->input);
1014     OPENSSL_free(mdat->output);
1015 }
1016
1017 static int mac_test_parse(EVP_TEST *t,
1018                           const char *keyword, const char *value)
1019 {
1020     MAC_DATA *mdata = t->data;
1021
1022     if (strcmp(keyword, "Key") == 0)
1023         return parse_bin(value, &mdata->key, &mdata->key_len);
1024     if (strcmp(keyword, "IV") == 0)
1025         return parse_bin(value, &mdata->iv, &mdata->iv_len);
1026     if (strcmp(keyword, "Custom") == 0)
1027         return parse_bin(value, &mdata->custom, &mdata->custom_len);
1028     if (strcmp(keyword, "Salt") == 0)
1029         return parse_bin(value, &mdata->salt, &mdata->salt_len);
1030     if (strcmp(keyword, "Algorithm") == 0) {
1031         mdata->alg = OPENSSL_strdup(value);
1032         if (!mdata->alg)
1033             return -1;
1034         return 1;
1035     }
1036     if (strcmp(keyword, "Input") == 0)
1037         return parse_bin(value, &mdata->input, &mdata->input_len);
1038     if (strcmp(keyword, "Output") == 0)
1039         return parse_bin(value, &mdata->output, &mdata->output_len);
1040     if (strcmp(keyword, "Ctrl") == 0)
1041         return sk_OPENSSL_STRING_push(mdata->controls,
1042                                       OPENSSL_strdup(value)) != 0;
1043     return 0;
1044 }
1045
1046 static int mac_test_ctrl_pkey(EVP_TEST *t, EVP_PKEY_CTX *pctx,
1047                               const char *value)
1048 {
1049     int rv;
1050     char *p, *tmpval;
1051
1052     if (!TEST_ptr(tmpval = OPENSSL_strdup(value)))
1053         return 0;
1054     p = strchr(tmpval, ':');
1055     if (p != NULL)
1056         *p++ = '\0';
1057     rv = EVP_PKEY_CTX_ctrl_str(pctx, tmpval, p);
1058     if (rv == -2)
1059         t->err = "PKEY_CTRL_INVALID";
1060     else if (rv <= 0)
1061         t->err = "PKEY_CTRL_ERROR";
1062     else
1063         rv = 1;
1064     OPENSSL_free(tmpval);
1065     return rv > 0;
1066 }
1067
1068 static int mac_test_run_pkey(EVP_TEST *t)
1069 {
1070     MAC_DATA *expected = t->data;
1071     EVP_MD_CTX *mctx = NULL;
1072     EVP_PKEY_CTX *pctx = NULL, *genctx = NULL;
1073     EVP_PKEY *key = NULL;
1074     const EVP_MD *md = NULL;
1075     unsigned char *got = NULL;
1076     size_t got_len;
1077     int i;
1078
1079     if (expected->alg == NULL)
1080         TEST_info("Trying the EVP_PKEY %s test", OBJ_nid2sn(expected->type));
1081     else
1082         TEST_info("Trying the EVP_PKEY %s test with %s",
1083                   OBJ_nid2sn(expected->type), expected->alg);
1084
1085 #ifdef OPENSSL_NO_DES
1086     if (expected->alg != NULL && strstr(expected->alg, "DES") != NULL) {
1087         /* Skip DES */
1088         t->err = NULL;
1089         goto err;
1090     }
1091 #endif
1092
1093     if (expected->type == EVP_PKEY_CMAC)
1094         key = EVP_PKEY_new_CMAC_key(NULL, expected->key, expected->key_len,
1095                                     EVP_get_cipherbyname(expected->alg));
1096     else
1097         key = EVP_PKEY_new_raw_private_key(expected->type, NULL, expected->key,
1098                                            expected->key_len);
1099     if (key == NULL) {
1100         t->err = "MAC_KEY_CREATE_ERROR";
1101         goto err;
1102     }
1103
1104     if (expected->type == EVP_PKEY_HMAC) {
1105         if (!TEST_ptr(md = EVP_get_digestbyname(expected->alg))) {
1106             t->err = "MAC_ALGORITHM_SET_ERROR";
1107             goto err;
1108         }
1109     }
1110     if (!TEST_ptr(mctx = EVP_MD_CTX_new())) {
1111         t->err = "INTERNAL_ERROR";
1112         goto err;
1113     }
1114     if (!EVP_DigestSignInit(mctx, &pctx, md, NULL, key)) {
1115         t->err = "DIGESTSIGNINIT_ERROR";
1116         goto err;
1117     }
1118     for (i = 0; i < sk_OPENSSL_STRING_num(expected->controls); i++)
1119         if (!mac_test_ctrl_pkey(t, pctx,
1120                                 sk_OPENSSL_STRING_value(expected->controls,
1121                                                         i))) {
1122             t->err = "EVPPKEYCTXCTRL_ERROR";
1123             goto err;
1124         }
1125     if (!EVP_DigestSignUpdate(mctx, expected->input, expected->input_len)) {
1126         t->err = "DIGESTSIGNUPDATE_ERROR";
1127         goto err;
1128     }
1129     if (!EVP_DigestSignFinal(mctx, NULL, &got_len)) {
1130         t->err = "DIGESTSIGNFINAL_LENGTH_ERROR";
1131         goto err;
1132     }
1133     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
1134         t->err = "TEST_FAILURE";
1135         goto err;
1136     }
1137     if (!EVP_DigestSignFinal(mctx, got, &got_len)
1138             || !memory_err_compare(t, "TEST_MAC_ERR",
1139                                    expected->output, expected->output_len,
1140                                    got, got_len)) {
1141         t->err = "TEST_MAC_ERR";
1142         goto err;
1143     }
1144     t->err = NULL;
1145  err:
1146     EVP_MD_CTX_free(mctx);
1147     OPENSSL_free(got);
1148     EVP_PKEY_CTX_free(genctx);
1149     EVP_PKEY_free(key);
1150     return 1;
1151 }
1152
1153 static int mac_test_run_mac(EVP_TEST *t)
1154 {
1155     MAC_DATA *expected = t->data;
1156     EVP_MAC_CTX *ctx = NULL;
1157     unsigned char *got = NULL;
1158     size_t got_len;
1159     int i;
1160     OSSL_PARAM params[21];
1161     size_t params_n = 0;
1162     size_t params_n_allocstart = 0;
1163     const OSSL_PARAM *defined_params =
1164         EVP_MAC_CTX_settable_params(expected->mac);
1165
1166     if (expected->alg == NULL)
1167         TEST_info("Trying the EVP_MAC %s test", EVP_MAC_name(expected->mac));
1168     else
1169         TEST_info("Trying the EVP_MAC %s test with %s",
1170                   EVP_MAC_name(expected->mac), expected->alg);
1171
1172 #ifdef OPENSSL_NO_DES
1173     if (expected->alg != NULL && strstr(expected->alg, "DES") != NULL) {
1174         /* Skip DES */
1175         t->err = NULL;
1176         goto err;
1177     }
1178 #endif
1179
1180     if (expected->alg != NULL) {
1181         /*
1182          * The underlying algorithm may be a cipher or a digest.
1183          * We don't know which it is, but we can ask the MAC what it
1184          * should be and bet on that.
1185          */
1186         if (OSSL_PARAM_locate_const(defined_params,
1187                                     OSSL_MAC_PARAM_CIPHER) != NULL) {
1188             params[params_n++] =
1189                 OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_CIPHER,
1190                                                  expected->alg, 0);
1191         } else if (OSSL_PARAM_locate_const(defined_params,
1192                                            OSSL_MAC_PARAM_DIGEST) != NULL) {
1193             params[params_n++] =
1194                 OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1195                                                  expected->alg, 0);
1196         } else {
1197             t->err = "MAC_BAD_PARAMS";
1198             goto err;
1199         }
1200     }
1201     if (expected->key != NULL)
1202         params[params_n++] =
1203             OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
1204                                               expected->key,
1205                                               expected->key_len);
1206     if (expected->custom != NULL)
1207         params[params_n++] =
1208             OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_CUSTOM,
1209                                               expected->custom,
1210                                               expected->custom_len);
1211     if (expected->salt != NULL)
1212         params[params_n++] =
1213             OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_SALT,
1214                                               expected->salt,
1215                                               expected->salt_len);
1216     if (expected->iv != NULL)
1217         params[params_n++] =
1218             OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_IV,
1219                                               expected->iv,
1220                                               expected->iv_len);
1221
1222     /*
1223      * Unknown controls.  They must match parameters that the MAC recognises
1224      */
1225     if (params_n + sk_OPENSSL_STRING_num(expected->controls)
1226         >= OSSL_NELEM(params)) {
1227         t->err = "MAC_TOO_MANY_PARAMETERS";
1228         goto err;
1229     }
1230     params_n_allocstart = params_n;
1231     for (i = 0; i < sk_OPENSSL_STRING_num(expected->controls); i++) {
1232         char *tmpkey, *tmpval;
1233         char *value = sk_OPENSSL_STRING_value(expected->controls, i);
1234
1235         if (!TEST_ptr(tmpkey = OPENSSL_strdup(value))) {
1236             t->err = "MAC_PARAM_ERROR";
1237             goto err;
1238         }
1239         tmpval = strchr(tmpkey, ':');
1240         if (tmpval != NULL)
1241             *tmpval++ = '\0';
1242
1243         if (tmpval == NULL
1244             || !OSSL_PARAM_allocate_from_text(&params[params_n],
1245                                               defined_params,
1246                                               tmpkey, tmpval,
1247                                               strlen(tmpval))) {
1248             OPENSSL_free(tmpkey);
1249             t->err = "MAC_PARAM_ERROR";
1250             goto err;
1251         }
1252         params_n++;
1253
1254         OPENSSL_free(tmpkey);
1255     }
1256     params[params_n] = OSSL_PARAM_construct_end();
1257
1258     if ((ctx = EVP_MAC_CTX_new(expected->mac)) == NULL) {
1259         t->err = "MAC_CREATE_ERROR";
1260         goto err;
1261     }
1262
1263     if (!EVP_MAC_CTX_set_params(ctx, params)) {
1264         t->err = "MAC_BAD_PARAMS";
1265         goto err;
1266     }
1267     if (!EVP_MAC_init(ctx)) {
1268         t->err = "MAC_INIT_ERROR";
1269         goto err;
1270     }
1271     if (!EVP_MAC_update(ctx, expected->input, expected->input_len)) {
1272         t->err = "MAC_UPDATE_ERROR";
1273         goto err;
1274     }
1275     if (!EVP_MAC_final(ctx, NULL, &got_len, 0)) {
1276         t->err = "MAC_FINAL_LENGTH_ERROR";
1277         goto err;
1278     }
1279     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
1280         t->err = "TEST_FAILURE";
1281         goto err;
1282     }
1283     if (!EVP_MAC_final(ctx, got, &got_len, got_len)
1284         || !memory_err_compare(t, "TEST_MAC_ERR",
1285                                expected->output, expected->output_len,
1286                                got, got_len)) {
1287         t->err = "TEST_MAC_ERR";
1288         goto err;
1289     }
1290     t->err = NULL;
1291  err:
1292     while (params_n-- > params_n_allocstart) {
1293         OPENSSL_free(params[params_n].data);
1294     }
1295     EVP_MAC_CTX_free(ctx);
1296     OPENSSL_free(got);
1297     return 1;
1298 }
1299
1300 static int mac_test_run(EVP_TEST *t)
1301 {
1302     MAC_DATA *expected = t->data;
1303
1304     if (expected->mac != NULL)
1305         return mac_test_run_mac(t);
1306     return mac_test_run_pkey(t);
1307 }
1308
1309 static const EVP_TEST_METHOD mac_test_method = {
1310     "MAC",
1311     mac_test_init,
1312     mac_test_cleanup,
1313     mac_test_parse,
1314     mac_test_run
1315 };
1316
1317
1318 /**
1319 ***  PUBLIC KEY TESTS
1320 ***  These are all very similar and share much common code.
1321 **/
1322
1323 typedef struct pkey_data_st {
1324     /* Context for this operation */
1325     EVP_PKEY_CTX *ctx;
1326     /* Key operation to perform */
1327     int (*keyop) (EVP_PKEY_CTX *ctx,
1328                   unsigned char *sig, size_t *siglen,
1329                   const unsigned char *tbs, size_t tbslen);
1330     /* Input to MAC */
1331     unsigned char *input;
1332     size_t input_len;
1333     /* Expected output */
1334     unsigned char *output;
1335     size_t output_len;
1336 } PKEY_DATA;
1337
1338 /*
1339  * Perform public key operation setup: lookup key, allocated ctx and call
1340  * the appropriate initialisation function
1341  */
1342 static int pkey_test_init(EVP_TEST *t, const char *name,
1343                           int use_public,
1344                           int (*keyopinit) (EVP_PKEY_CTX *ctx),
1345                           int (*keyop)(EVP_PKEY_CTX *ctx,
1346                                        unsigned char *sig, size_t *siglen,
1347                                        const unsigned char *tbs,
1348                                        size_t tbslen))
1349 {
1350     PKEY_DATA *kdata;
1351     EVP_PKEY *pkey = NULL;
1352     int rv = 0;
1353
1354     if (use_public)
1355         rv = find_key(&pkey, name, public_keys);
1356     if (rv == 0)
1357         rv = find_key(&pkey, name, private_keys);
1358     if (rv == 0 || pkey == NULL) {
1359         t->skip = 1;
1360         return 1;
1361     }
1362
1363     if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata)))) {
1364         EVP_PKEY_free(pkey);
1365         return 0;
1366     }
1367     kdata->keyop = keyop;
1368     if (!TEST_ptr(kdata->ctx = EVP_PKEY_CTX_new(pkey, NULL))) {
1369         EVP_PKEY_free(pkey);
1370         OPENSSL_free(kdata);
1371         return 0;
1372     }
1373     if (keyopinit(kdata->ctx) <= 0)
1374         t->err = "KEYOP_INIT_ERROR";
1375     t->data = kdata;
1376     return 1;
1377 }
1378
1379 static void pkey_test_cleanup(EVP_TEST *t)
1380 {
1381     PKEY_DATA *kdata = t->data;
1382
1383     OPENSSL_free(kdata->input);
1384     OPENSSL_free(kdata->output);
1385     EVP_PKEY_CTX_free(kdata->ctx);
1386 }
1387
1388 static int pkey_test_ctrl(EVP_TEST *t, EVP_PKEY_CTX *pctx,
1389                           const char *value)
1390 {
1391     int rv;
1392     char *p, *tmpval;
1393
1394     if (!TEST_ptr(tmpval = OPENSSL_strdup(value)))
1395         return 0;
1396     p = strchr(tmpval, ':');
1397     if (p != NULL)
1398         *p++ = '\0';
1399     rv = EVP_PKEY_CTX_ctrl_str(pctx, tmpval, p);
1400     if (rv == -2) {
1401         t->err = "PKEY_CTRL_INVALID";
1402         rv = 1;
1403     } else if (p != NULL && rv <= 0) {
1404         /* If p has an OID and lookup fails assume disabled algorithm */
1405         int nid = OBJ_sn2nid(p);
1406
1407         if (nid == NID_undef)
1408              nid = OBJ_ln2nid(p);
1409         if (nid != NID_undef
1410                 && EVP_get_digestbynid(nid) == NULL
1411                 && EVP_get_cipherbynid(nid) == NULL) {
1412             t->skip = 1;
1413             rv = 1;
1414         } else {
1415             t->err = "PKEY_CTRL_ERROR";
1416             rv = 1;
1417         }
1418     }
1419     OPENSSL_free(tmpval);
1420     return rv > 0;
1421 }
1422
1423 static int pkey_test_parse(EVP_TEST *t,
1424                            const char *keyword, const char *value)
1425 {
1426     PKEY_DATA *kdata = t->data;
1427     if (strcmp(keyword, "Input") == 0)
1428         return parse_bin(value, &kdata->input, &kdata->input_len);
1429     if (strcmp(keyword, "Output") == 0)
1430         return parse_bin(value, &kdata->output, &kdata->output_len);
1431     if (strcmp(keyword, "Ctrl") == 0)
1432         return pkey_test_ctrl(t, kdata->ctx, value);
1433     return 0;
1434 }
1435
1436 static int pkey_test_run(EVP_TEST *t)
1437 {
1438     PKEY_DATA *expected = t->data;
1439     unsigned char *got = NULL;
1440     size_t got_len;
1441     EVP_PKEY_CTX *copy = NULL;
1442
1443     if (expected->keyop(expected->ctx, NULL, &got_len,
1444                         expected->input, expected->input_len) <= 0
1445             || !TEST_ptr(got = OPENSSL_malloc(got_len))) {
1446         t->err = "KEYOP_LENGTH_ERROR";
1447         goto err;
1448     }
1449     if (expected->keyop(expected->ctx, got, &got_len,
1450                         expected->input, expected->input_len) <= 0) {
1451         t->err = "KEYOP_ERROR";
1452         goto err;
1453     }
1454     if (!memory_err_compare(t, "KEYOP_MISMATCH",
1455                             expected->output, expected->output_len,
1456                             got, got_len))
1457         goto err;
1458
1459     t->err = NULL;
1460     OPENSSL_free(got);
1461     got = NULL;
1462
1463     /* Repeat the test on a copy. */
1464     if (!TEST_ptr(copy = EVP_PKEY_CTX_dup(expected->ctx))) {
1465         t->err = "INTERNAL_ERROR";
1466         goto err;
1467     }
1468     if (expected->keyop(copy, NULL, &got_len, expected->input,
1469                         expected->input_len) <= 0
1470             || !TEST_ptr(got = OPENSSL_malloc(got_len))) {
1471         t->err = "KEYOP_LENGTH_ERROR";
1472         goto err;
1473     }
1474     if (expected->keyop(copy, got, &got_len, expected->input,
1475                         expected->input_len) <= 0) {
1476         t->err = "KEYOP_ERROR";
1477         goto err;
1478     }
1479     if (!memory_err_compare(t, "KEYOP_MISMATCH",
1480                             expected->output, expected->output_len,
1481                             got, got_len))
1482         goto err;
1483
1484  err:
1485     OPENSSL_free(got);
1486     EVP_PKEY_CTX_free(copy);
1487     return 1;
1488 }
1489
1490 static int sign_test_init(EVP_TEST *t, const char *name)
1491 {
1492     return pkey_test_init(t, name, 0, EVP_PKEY_sign_init, EVP_PKEY_sign);
1493 }
1494
1495 static const EVP_TEST_METHOD psign_test_method = {
1496     "Sign",
1497     sign_test_init,
1498     pkey_test_cleanup,
1499     pkey_test_parse,
1500     pkey_test_run
1501 };
1502
1503 static int verify_recover_test_init(EVP_TEST *t, const char *name)
1504 {
1505     return pkey_test_init(t, name, 1, EVP_PKEY_verify_recover_init,
1506                           EVP_PKEY_verify_recover);
1507 }
1508
1509 static const EVP_TEST_METHOD pverify_recover_test_method = {
1510     "VerifyRecover",
1511     verify_recover_test_init,
1512     pkey_test_cleanup,
1513     pkey_test_parse,
1514     pkey_test_run
1515 };
1516
1517 static int decrypt_test_init(EVP_TEST *t, const char *name)
1518 {
1519     return pkey_test_init(t, name, 0, EVP_PKEY_decrypt_init,
1520                           EVP_PKEY_decrypt);
1521 }
1522
1523 static const EVP_TEST_METHOD pdecrypt_test_method = {
1524     "Decrypt",
1525     decrypt_test_init,
1526     pkey_test_cleanup,
1527     pkey_test_parse,
1528     pkey_test_run
1529 };
1530
1531 static int verify_test_init(EVP_TEST *t, const char *name)
1532 {
1533     return pkey_test_init(t, name, 1, EVP_PKEY_verify_init, 0);
1534 }
1535
1536 static int verify_test_run(EVP_TEST *t)
1537 {
1538     PKEY_DATA *kdata = t->data;
1539
1540     if (EVP_PKEY_verify(kdata->ctx, kdata->output, kdata->output_len,
1541                         kdata->input, kdata->input_len) <= 0)
1542         t->err = "VERIFY_ERROR";
1543     return 1;
1544 }
1545
1546 static const EVP_TEST_METHOD pverify_test_method = {
1547     "Verify",
1548     verify_test_init,
1549     pkey_test_cleanup,
1550     pkey_test_parse,
1551     verify_test_run
1552 };
1553
1554
1555 static int pderive_test_init(EVP_TEST *t, const char *name)
1556 {
1557     return pkey_test_init(t, name, 0, EVP_PKEY_derive_init, 0);
1558 }
1559
1560 static int pderive_test_parse(EVP_TEST *t,
1561                               const char *keyword, const char *value)
1562 {
1563     PKEY_DATA *kdata = t->data;
1564
1565     if (strcmp(keyword, "PeerKey") == 0) {
1566         EVP_PKEY *peer;
1567         if (find_key(&peer, value, public_keys) == 0)
1568             return -1;
1569         if (EVP_PKEY_derive_set_peer(kdata->ctx, peer) <= 0)
1570             return -1;
1571         return 1;
1572     }
1573     if (strcmp(keyword, "SharedSecret") == 0)
1574         return parse_bin(value, &kdata->output, &kdata->output_len);
1575     if (strcmp(keyword, "Ctrl") == 0)
1576         return pkey_test_ctrl(t, kdata->ctx, value);
1577     return 0;
1578 }
1579
1580 static int pderive_test_run(EVP_TEST *t)
1581 {
1582     PKEY_DATA *expected = t->data;
1583     unsigned char *got = NULL;
1584     size_t got_len;
1585
1586     if (EVP_PKEY_derive(expected->ctx, NULL, &got_len) <= 0) {
1587         t->err = "DERIVE_ERROR";
1588         goto err;
1589     }
1590     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
1591         t->err = "DERIVE_ERROR";
1592         goto err;
1593     }
1594     if (EVP_PKEY_derive(expected->ctx, got, &got_len) <= 0) {
1595         t->err = "DERIVE_ERROR";
1596         goto err;
1597     }
1598     if (!memory_err_compare(t, "SHARED_SECRET_MISMATCH",
1599                             expected->output, expected->output_len,
1600                             got, got_len))
1601         goto err;
1602
1603     t->err = NULL;
1604  err:
1605     OPENSSL_free(got);
1606     return 1;
1607 }
1608
1609 static const EVP_TEST_METHOD pderive_test_method = {
1610     "Derive",
1611     pderive_test_init,
1612     pkey_test_cleanup,
1613     pderive_test_parse,
1614     pderive_test_run
1615 };
1616
1617
1618 /**
1619 ***  PBE TESTS
1620 **/
1621
1622 typedef enum pbe_type_enum {
1623     PBE_TYPE_INVALID = 0,
1624     PBE_TYPE_SCRYPT, PBE_TYPE_PBKDF2, PBE_TYPE_PKCS12
1625 } PBE_TYPE;
1626
1627 typedef struct pbe_data_st {
1628     PBE_TYPE pbe_type;
1629         /* scrypt parameters */
1630     uint64_t N, r, p, maxmem;
1631         /* PKCS#12 parameters */
1632     int id, iter;
1633     const EVP_MD *md;
1634         /* password */
1635     unsigned char *pass;
1636     size_t pass_len;
1637         /* salt */
1638     unsigned char *salt;
1639     size_t salt_len;
1640         /* Expected output */
1641     unsigned char *key;
1642     size_t key_len;
1643 } PBE_DATA;
1644
1645 #ifndef OPENSSL_NO_SCRYPT
1646 /*
1647  * Parse unsigned decimal 64 bit integer value
1648  */
1649 static int parse_uint64(const char *value, uint64_t *pr)
1650 {
1651     const char *p = value;
1652
1653     if (!TEST_true(*p)) {
1654         TEST_info("Invalid empty integer value");
1655         return -1;
1656     }
1657     for (*pr = 0; *p; ) {
1658         if (*pr > UINT64_MAX / 10) {
1659             TEST_error("Integer overflow in string %s", value);
1660             return -1;
1661         }
1662         *pr *= 10;
1663         if (!TEST_true(isdigit((unsigned char)*p))) {
1664             TEST_error("Invalid character in string %s", value);
1665             return -1;
1666         }
1667         *pr += *p - '0';
1668         p++;
1669     }
1670     return 1;
1671 }
1672
1673 static int scrypt_test_parse(EVP_TEST *t,
1674                              const char *keyword, const char *value)
1675 {
1676     PBE_DATA *pdata = t->data;
1677
1678     if (strcmp(keyword, "N") == 0)
1679         return parse_uint64(value, &pdata->N);
1680     if (strcmp(keyword, "p") == 0)
1681         return parse_uint64(value, &pdata->p);
1682     if (strcmp(keyword, "r") == 0)
1683         return parse_uint64(value, &pdata->r);
1684     if (strcmp(keyword, "maxmem") == 0)
1685         return parse_uint64(value, &pdata->maxmem);
1686     return 0;
1687 }
1688 #endif
1689
1690 static int pbkdf2_test_parse(EVP_TEST *t,
1691                              const char *keyword, const char *value)
1692 {
1693     PBE_DATA *pdata = t->data;
1694
1695     if (strcmp(keyword, "iter") == 0) {
1696         pdata->iter = atoi(value);
1697         if (pdata->iter <= 0)
1698             return -1;
1699         return 1;
1700     }
1701     if (strcmp(keyword, "MD") == 0) {
1702         pdata->md = EVP_get_digestbyname(value);
1703         if (pdata->md == NULL)
1704             return -1;
1705         return 1;
1706     }
1707     return 0;
1708 }
1709
1710 static int pkcs12_test_parse(EVP_TEST *t,
1711                              const char *keyword, const char *value)
1712 {
1713     PBE_DATA *pdata = t->data;
1714
1715     if (strcmp(keyword, "id") == 0) {
1716         pdata->id = atoi(value);
1717         if (pdata->id <= 0)
1718             return -1;
1719         return 1;
1720     }
1721     return pbkdf2_test_parse(t, keyword, value);
1722 }
1723
1724 static int pbe_test_init(EVP_TEST *t, const char *alg)
1725 {
1726     PBE_DATA *pdat;
1727     PBE_TYPE pbe_type = PBE_TYPE_INVALID;
1728
1729     if (strcmp(alg, "scrypt") == 0) {
1730 #ifndef OPENSSL_NO_SCRYPT
1731         pbe_type = PBE_TYPE_SCRYPT;
1732 #else
1733         t->skip = 1;
1734         return 1;
1735 #endif
1736     } else if (strcmp(alg, "pbkdf2") == 0) {
1737         pbe_type = PBE_TYPE_PBKDF2;
1738     } else if (strcmp(alg, "pkcs12") == 0) {
1739         pbe_type = PBE_TYPE_PKCS12;
1740     } else {
1741         TEST_error("Unknown pbe algorithm %s", alg);
1742     }
1743     pdat = OPENSSL_zalloc(sizeof(*pdat));
1744     pdat->pbe_type = pbe_type;
1745     t->data = pdat;
1746     return 1;
1747 }
1748
1749 static void pbe_test_cleanup(EVP_TEST *t)
1750 {
1751     PBE_DATA *pdat = t->data;
1752
1753     OPENSSL_free(pdat->pass);
1754     OPENSSL_free(pdat->salt);
1755     OPENSSL_free(pdat->key);
1756 }
1757
1758 static int pbe_test_parse(EVP_TEST *t,
1759                           const char *keyword, const char *value)
1760 {
1761     PBE_DATA *pdata = t->data;
1762
1763     if (strcmp(keyword, "Password") == 0)
1764         return parse_bin(value, &pdata->pass, &pdata->pass_len);
1765     if (strcmp(keyword, "Salt") == 0)
1766         return parse_bin(value, &pdata->salt, &pdata->salt_len);
1767     if (strcmp(keyword, "Key") == 0)
1768         return parse_bin(value, &pdata->key, &pdata->key_len);
1769     if (pdata->pbe_type == PBE_TYPE_PBKDF2)
1770         return pbkdf2_test_parse(t, keyword, value);
1771     else if (pdata->pbe_type == PBE_TYPE_PKCS12)
1772         return pkcs12_test_parse(t, keyword, value);
1773 #ifndef OPENSSL_NO_SCRYPT
1774     else if (pdata->pbe_type == PBE_TYPE_SCRYPT)
1775         return scrypt_test_parse(t, keyword, value);
1776 #endif
1777     return 0;
1778 }
1779
1780 static int pbe_test_run(EVP_TEST *t)
1781 {
1782     PBE_DATA *expected = t->data;
1783     unsigned char *key;
1784
1785     if (!TEST_ptr(key = OPENSSL_malloc(expected->key_len))) {
1786         t->err = "INTERNAL_ERROR";
1787         goto err;
1788     }
1789     if (expected->pbe_type == PBE_TYPE_PBKDF2) {
1790         if (PKCS5_PBKDF2_HMAC((char *)expected->pass, expected->pass_len,
1791                               expected->salt, expected->salt_len,
1792                               expected->iter, expected->md,
1793                               expected->key_len, key) == 0) {
1794             t->err = "PBKDF2_ERROR";
1795             goto err;
1796         }
1797 #ifndef OPENSSL_NO_SCRYPT
1798     } else if (expected->pbe_type == PBE_TYPE_SCRYPT) {
1799         if (EVP_PBE_scrypt((const char *)expected->pass, expected->pass_len,
1800                            expected->salt, expected->salt_len, expected->N,
1801                            expected->r, expected->p, expected->maxmem,
1802                            key, expected->key_len) == 0) {
1803             t->err = "SCRYPT_ERROR";
1804             goto err;
1805         }
1806 #endif
1807     } else if (expected->pbe_type == PBE_TYPE_PKCS12) {
1808         if (PKCS12_key_gen_uni(expected->pass, expected->pass_len,
1809                                expected->salt, expected->salt_len,
1810                                expected->id, expected->iter, expected->key_len,
1811                                key, expected->md) == 0) {
1812             t->err = "PKCS12_ERROR";
1813             goto err;
1814         }
1815     }
1816     if (!memory_err_compare(t, "KEY_MISMATCH", expected->key, expected->key_len,
1817                             key, expected->key_len))
1818         goto err;
1819
1820     t->err = NULL;
1821 err:
1822     OPENSSL_free(key);
1823     return 1;
1824 }
1825
1826 static const EVP_TEST_METHOD pbe_test_method = {
1827     "PBE",
1828     pbe_test_init,
1829     pbe_test_cleanup,
1830     pbe_test_parse,
1831     pbe_test_run
1832 };
1833
1834
1835 /**
1836 ***  BASE64 TESTS
1837 **/
1838
1839 typedef enum {
1840     BASE64_CANONICAL_ENCODING = 0,
1841     BASE64_VALID_ENCODING = 1,
1842     BASE64_INVALID_ENCODING = 2
1843 } base64_encoding_type;
1844
1845 typedef struct encode_data_st {
1846     /* Input to encoding */
1847     unsigned char *input;
1848     size_t input_len;
1849     /* Expected output */
1850     unsigned char *output;
1851     size_t output_len;
1852     base64_encoding_type encoding;
1853 } ENCODE_DATA;
1854
1855 static int encode_test_init(EVP_TEST *t, const char *encoding)
1856 {
1857     ENCODE_DATA *edata;
1858
1859     if (!TEST_ptr(edata = OPENSSL_zalloc(sizeof(*edata))))
1860         return 0;
1861     if (strcmp(encoding, "canonical") == 0) {
1862         edata->encoding = BASE64_CANONICAL_ENCODING;
1863     } else if (strcmp(encoding, "valid") == 0) {
1864         edata->encoding = BASE64_VALID_ENCODING;
1865     } else if (strcmp(encoding, "invalid") == 0) {
1866         edata->encoding = BASE64_INVALID_ENCODING;
1867         if (!TEST_ptr(t->expected_err = OPENSSL_strdup("DECODE_ERROR")))
1868             goto err;
1869     } else {
1870         TEST_error("Bad encoding: %s."
1871                    " Should be one of {canonical, valid, invalid}",
1872                    encoding);
1873         goto err;
1874     }
1875     t->data = edata;
1876     return 1;
1877 err:
1878     OPENSSL_free(edata);
1879     return 0;
1880 }
1881
1882 static void encode_test_cleanup(EVP_TEST *t)
1883 {
1884     ENCODE_DATA *edata = t->data;
1885
1886     OPENSSL_free(edata->input);
1887     OPENSSL_free(edata->output);
1888     memset(edata, 0, sizeof(*edata));
1889 }
1890
1891 static int encode_test_parse(EVP_TEST *t,
1892                              const char *keyword, const char *value)
1893 {
1894     ENCODE_DATA *edata = t->data;
1895
1896     if (strcmp(keyword, "Input") == 0)
1897         return parse_bin(value, &edata->input, &edata->input_len);
1898     if (strcmp(keyword, "Output") == 0)
1899         return parse_bin(value, &edata->output, &edata->output_len);
1900     return 0;
1901 }
1902
1903 static int encode_test_run(EVP_TEST *t)
1904 {
1905     ENCODE_DATA *expected = t->data;
1906     unsigned char *encode_out = NULL, *decode_out = NULL;
1907     int output_len, chunk_len;
1908     EVP_ENCODE_CTX *decode_ctx = NULL, *encode_ctx = NULL;
1909
1910     if (!TEST_ptr(decode_ctx = EVP_ENCODE_CTX_new())) {
1911         t->err = "INTERNAL_ERROR";
1912         goto err;
1913     }
1914
1915     if (expected->encoding == BASE64_CANONICAL_ENCODING) {
1916
1917         if (!TEST_ptr(encode_ctx = EVP_ENCODE_CTX_new())
1918                 || !TEST_ptr(encode_out =
1919                         OPENSSL_malloc(EVP_ENCODE_LENGTH(expected->input_len))))
1920             goto err;
1921
1922         EVP_EncodeInit(encode_ctx);
1923         if (!TEST_true(EVP_EncodeUpdate(encode_ctx, encode_out, &chunk_len,
1924                                         expected->input, expected->input_len)))
1925             goto err;
1926
1927         output_len = chunk_len;
1928
1929         EVP_EncodeFinal(encode_ctx, encode_out + chunk_len, &chunk_len);
1930         output_len += chunk_len;
1931
1932         if (!memory_err_compare(t, "BAD_ENCODING",
1933                                 expected->output, expected->output_len,
1934                                 encode_out, output_len))
1935             goto err;
1936     }
1937
1938     if (!TEST_ptr(decode_out =
1939                 OPENSSL_malloc(EVP_DECODE_LENGTH(expected->output_len))))
1940         goto err;
1941
1942     EVP_DecodeInit(decode_ctx);
1943     if (EVP_DecodeUpdate(decode_ctx, decode_out, &chunk_len, expected->output,
1944                          expected->output_len) < 0) {
1945         t->err = "DECODE_ERROR";
1946         goto err;
1947     }
1948     output_len = chunk_len;
1949
1950     if (EVP_DecodeFinal(decode_ctx, decode_out + chunk_len, &chunk_len) != 1) {
1951         t->err = "DECODE_ERROR";
1952         goto err;
1953     }
1954     output_len += chunk_len;
1955
1956     if (expected->encoding != BASE64_INVALID_ENCODING
1957             && !memory_err_compare(t, "BAD_DECODING",
1958                                    expected->input, expected->input_len,
1959                                    decode_out, output_len)) {
1960         t->err = "BAD_DECODING";
1961         goto err;
1962     }
1963
1964     t->err = NULL;
1965  err:
1966     OPENSSL_free(encode_out);
1967     OPENSSL_free(decode_out);
1968     EVP_ENCODE_CTX_free(decode_ctx);
1969     EVP_ENCODE_CTX_free(encode_ctx);
1970     return 1;
1971 }
1972
1973 static const EVP_TEST_METHOD encode_test_method = {
1974     "Encoding",
1975     encode_test_init,
1976     encode_test_cleanup,
1977     encode_test_parse,
1978     encode_test_run,
1979 };
1980
1981
1982 /**
1983 ***  KDF TESTS
1984 **/
1985
1986 typedef struct kdf_data_st {
1987     /* Context for this operation */
1988     EVP_KDF_CTX *ctx;
1989     /* Expected output */
1990     unsigned char *output;
1991     size_t output_len;
1992     OSSL_PARAM params[20];
1993     OSSL_PARAM *p;
1994 } KDF_DATA;
1995
1996 /*
1997  * Perform public key operation setup: lookup key, allocated ctx and call
1998  * the appropriate initialisation function
1999  */
2000 static int kdf_test_init(EVP_TEST *t, const char *name)
2001 {
2002     KDF_DATA *kdata;
2003     EVP_KDF *kdf;
2004
2005 #ifdef OPENSSL_NO_SCRYPT
2006     /* TODO(3.0) Replace with "scrypt" once aliases are supported */
2007     if (strcmp(name, "id-scrypt") == 0) {
2008         t->skip = 1;
2009         return 1;
2010     }
2011 #endif /* OPENSSL_NO_SCRYPT */
2012
2013 #ifdef OPENSSL_NO_CMS
2014     if (strcmp(name, "X942KDF") == 0) {
2015         t->skip = 1;
2016         return 1;
2017     }
2018 #endif /* OPENSSL_NO_CMS */
2019
2020     if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata))))
2021         return 0;
2022     kdata->p = kdata->params;
2023     *kdata->p = OSSL_PARAM_construct_end();
2024
2025     kdf = EVP_KDF_fetch(NULL, name, NULL);
2026     if (kdf == NULL) {
2027         OPENSSL_free(kdata);
2028         return 0;
2029     }
2030     kdata->ctx = EVP_KDF_CTX_new(kdf);
2031     EVP_KDF_free(kdf);
2032     if (kdata->ctx == NULL) {
2033         OPENSSL_free(kdata);
2034         return 0;
2035     }
2036     t->data = kdata;
2037     return 1;
2038 }
2039
2040 static void kdf_test_cleanup(EVP_TEST *t)
2041 {
2042     KDF_DATA *kdata = t->data;
2043     OSSL_PARAM *p;
2044
2045     for (p = kdata->params; p->key != NULL; p++)
2046         OPENSSL_free(p->data);
2047     OPENSSL_free(kdata->output);
2048     EVP_KDF_CTX_free(kdata->ctx);
2049 }
2050
2051 static int kdf_test_ctrl(EVP_TEST *t, EVP_KDF_CTX *kctx,
2052                          const char *value)
2053 {
2054     KDF_DATA *kdata = t->data;
2055     int rv;
2056     char *p, *name;
2057     const OSSL_PARAM *defs = EVP_KDF_CTX_settable_params(EVP_KDF_CTX_kdf(kctx));
2058
2059     if (!TEST_ptr(name = OPENSSL_strdup(value)))
2060         return 0;
2061     p = strchr(name, ':');
2062     if (p != NULL)
2063         *p++ = '\0';
2064
2065     rv = OSSL_PARAM_allocate_from_text(kdata->p, defs, name, p,
2066                                        p != NULL ? strlen(p) : 0);
2067     *++kdata->p = OSSL_PARAM_construct_end();
2068     if (!rv) {
2069         t->err = "KDF_PARAM_ERROR";
2070         OPENSSL_free(name);
2071         return 0;
2072     }
2073     if (p != NULL && strcmp(name, "digest") == 0) {
2074         /* If p has an OID and lookup fails assume disabled algorithm */
2075         int nid = OBJ_sn2nid(p);
2076
2077         if (nid == NID_undef)
2078              nid = OBJ_ln2nid(p);
2079         if (nid != NID_undef && EVP_get_digestbynid(nid) == NULL)
2080             t->skip = 1;
2081     }
2082     OPENSSL_free(name);
2083     return 1;
2084 }
2085
2086 static int kdf_test_parse(EVP_TEST *t,
2087                           const char *keyword, const char *value)
2088 {
2089     KDF_DATA *kdata = t->data;
2090
2091     if (strcmp(keyword, "Output") == 0)
2092         return parse_bin(value, &kdata->output, &kdata->output_len);
2093     if (strncmp(keyword, "Ctrl", 4) == 0)
2094         return kdf_test_ctrl(t, kdata->ctx, value);
2095     return 0;
2096 }
2097
2098 static int kdf_test_run(EVP_TEST *t)
2099 {
2100     KDF_DATA *expected = t->data;
2101     unsigned char *got = NULL;
2102     size_t got_len = expected->output_len;
2103
2104     if (!EVP_KDF_CTX_set_params(expected->ctx, expected->params)) {
2105         t->err = "KDF_CTRL_ERROR";
2106         return 1;
2107     }
2108     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
2109         t->err = "INTERNAL_ERROR";
2110         goto err;
2111     }
2112     if (EVP_KDF_derive(expected->ctx, got, got_len) <= 0) {
2113         t->err = "KDF_DERIVE_ERROR";
2114         goto err;
2115     }
2116     if (!memory_err_compare(t, "KDF_MISMATCH",
2117                             expected->output, expected->output_len,
2118                             got, got_len))
2119         goto err;
2120
2121     t->err = NULL;
2122
2123  err:
2124     OPENSSL_free(got);
2125     return 1;
2126 }
2127
2128 static const EVP_TEST_METHOD kdf_test_method = {
2129     "KDF",
2130     kdf_test_init,
2131     kdf_test_cleanup,
2132     kdf_test_parse,
2133     kdf_test_run
2134 };
2135
2136
2137 /**
2138 ***  PKEY KDF TESTS
2139 **/
2140
2141 typedef struct pkey_kdf_data_st {
2142     /* Context for this operation */
2143     EVP_PKEY_CTX *ctx;
2144     /* Expected output */
2145     unsigned char *output;
2146     size_t output_len;
2147 } PKEY_KDF_DATA;
2148
2149 /*
2150  * Perform public key operation setup: lookup key, allocated ctx and call
2151  * the appropriate initialisation function
2152  */
2153 static int pkey_kdf_test_init(EVP_TEST *t, const char *name)
2154 {
2155     PKEY_KDF_DATA *kdata;
2156     int kdf_nid = OBJ_sn2nid(name);
2157
2158 #ifdef OPENSSL_NO_SCRYPT
2159     if (strcmp(name, "scrypt") == 0) {
2160         t->skip = 1;
2161         return 1;
2162     }
2163 #endif /* OPENSSL_NO_SCRYPT */
2164
2165 #ifdef OPENSSL_NO_CMS
2166     if (strcmp(name, "X942KDF") == 0) {
2167         t->skip = 1;
2168         return 1;
2169     }
2170 #endif /* OPENSSL_NO_CMS */
2171
2172     if (kdf_nid == NID_undef)
2173         kdf_nid = OBJ_ln2nid(name);
2174
2175     if (!TEST_ptr(kdata = OPENSSL_zalloc(sizeof(*kdata))))
2176         return 0;
2177     kdata->ctx = EVP_PKEY_CTX_new_id(kdf_nid, NULL);
2178     if (kdata->ctx == NULL) {
2179         OPENSSL_free(kdata);
2180         return 0;
2181     }
2182     if (EVP_PKEY_derive_init(kdata->ctx) <= 0) {
2183         EVP_PKEY_CTX_free(kdata->ctx);
2184         OPENSSL_free(kdata);
2185         return 0;
2186     }
2187     t->data = kdata;
2188     return 1;
2189 }
2190
2191 static void pkey_kdf_test_cleanup(EVP_TEST *t)
2192 {
2193     PKEY_KDF_DATA *kdata = t->data;
2194
2195     OPENSSL_free(kdata->output);
2196     EVP_PKEY_CTX_free(kdata->ctx);
2197 }
2198
2199 static int pkey_kdf_test_parse(EVP_TEST *t,
2200                                const char *keyword, const char *value)
2201 {
2202     PKEY_KDF_DATA *kdata = t->data;
2203
2204     if (strcmp(keyword, "Output") == 0)
2205         return parse_bin(value, &kdata->output, &kdata->output_len);
2206     if (strncmp(keyword, "Ctrl", 4) == 0)
2207         return pkey_test_ctrl(t, kdata->ctx, value);
2208     return 0;
2209 }
2210
2211 static int pkey_kdf_test_run(EVP_TEST *t)
2212 {
2213     PKEY_KDF_DATA *expected = t->data;
2214     unsigned char *got = NULL;
2215     size_t got_len = expected->output_len;
2216
2217     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
2218         t->err = "INTERNAL_ERROR";
2219         goto err;
2220     }
2221     if (EVP_PKEY_derive(expected->ctx, got, &got_len) <= 0) {
2222         t->err = "KDF_DERIVE_ERROR";
2223         goto err;
2224     }
2225     if (!TEST_mem_eq(expected->output, expected->output_len, got, got_len)) {
2226         t->err = "KDF_MISMATCH";
2227         goto err;
2228     }
2229     t->err = NULL;
2230
2231  err:
2232     OPENSSL_free(got);
2233     return 1;
2234 }
2235
2236 static const EVP_TEST_METHOD pkey_kdf_test_method = {
2237     "PKEYKDF",
2238     pkey_kdf_test_init,
2239     pkey_kdf_test_cleanup,
2240     pkey_kdf_test_parse,
2241     pkey_kdf_test_run
2242 };
2243
2244
2245 /**
2246 ***  KEYPAIR TESTS
2247 **/
2248
2249 typedef struct keypair_test_data_st {
2250     EVP_PKEY *privk;
2251     EVP_PKEY *pubk;
2252 } KEYPAIR_TEST_DATA;
2253
2254 static int keypair_test_init(EVP_TEST *t, const char *pair)
2255 {
2256     KEYPAIR_TEST_DATA *data;
2257     int rv = 0;
2258     EVP_PKEY *pk = NULL, *pubk = NULL;
2259     char *pub, *priv = NULL;
2260
2261     /* Split private and public names. */
2262     if (!TEST_ptr(priv = OPENSSL_strdup(pair))
2263             || !TEST_ptr(pub = strchr(priv, ':'))) {
2264         t->err = "PARSING_ERROR";
2265         goto end;
2266     }
2267     *pub++ = '\0';
2268
2269     if (!TEST_true(find_key(&pk, priv, private_keys))) {
2270         TEST_info("Can't find private key: %s", priv);
2271         t->err = "MISSING_PRIVATE_KEY";
2272         goto end;
2273     }
2274     if (!TEST_true(find_key(&pubk, pub, public_keys))) {
2275         TEST_info("Can't find public key: %s", pub);
2276         t->err = "MISSING_PUBLIC_KEY";
2277         goto end;
2278     }
2279
2280     if (pk == NULL && pubk == NULL) {
2281         /* Both keys are listed but unsupported: skip this test */
2282         t->skip = 1;
2283         rv = 1;
2284         goto end;
2285     }
2286
2287     if (!TEST_ptr(data = OPENSSL_malloc(sizeof(*data))))
2288         goto end;
2289     data->privk = pk;
2290     data->pubk = pubk;
2291     t->data = data;
2292     rv = 1;
2293     t->err = NULL;
2294
2295 end:
2296     OPENSSL_free(priv);
2297     return rv;
2298 }
2299
2300 static void keypair_test_cleanup(EVP_TEST *t)
2301 {
2302     OPENSSL_free(t->data);
2303     t->data = NULL;
2304 }
2305
2306 /*
2307  * For tests that do not accept any custom keywords.
2308  */
2309 static int void_test_parse(EVP_TEST *t, const char *keyword, const char *value)
2310 {
2311     return 0;
2312 }
2313
2314 static int keypair_test_run(EVP_TEST *t)
2315 {
2316     int rv = 0;
2317     const KEYPAIR_TEST_DATA *pair = t->data;
2318
2319     if (pair->privk == NULL || pair->pubk == NULL) {
2320         /*
2321          * this can only happen if only one of the keys is not set
2322          * which means that one of them was unsupported while the
2323          * other isn't: hence a key type mismatch.
2324          */
2325         t->err = "KEYPAIR_TYPE_MISMATCH";
2326         rv = 1;
2327         goto end;
2328     }
2329
2330     if ((rv = EVP_PKEY_cmp(pair->privk, pair->pubk)) != 1 ) {
2331         if ( 0 == rv ) {
2332             t->err = "KEYPAIR_MISMATCH";
2333         } else if ( -1 == rv ) {
2334             t->err = "KEYPAIR_TYPE_MISMATCH";
2335         } else if ( -2 == rv ) {
2336             t->err = "UNSUPPORTED_KEY_COMPARISON";
2337         } else {
2338             TEST_error("Unexpected error in key comparison");
2339             rv = 0;
2340             goto end;
2341         }
2342         rv = 1;
2343         goto end;
2344     }
2345
2346     rv = 1;
2347     t->err = NULL;
2348
2349 end:
2350     return rv;
2351 }
2352
2353 static const EVP_TEST_METHOD keypair_test_method = {
2354     "PrivPubKeyPair",
2355     keypair_test_init,
2356     keypair_test_cleanup,
2357     void_test_parse,
2358     keypair_test_run
2359 };
2360
2361 /**
2362 ***  KEYGEN TEST
2363 **/
2364
2365 typedef struct keygen_test_data_st {
2366     EVP_PKEY_CTX *genctx; /* Keygen context to use */
2367     char *keyname; /* Key name to store key or NULL */
2368 } KEYGEN_TEST_DATA;
2369
2370 static int keygen_test_init(EVP_TEST *t, const char *alg)
2371 {
2372     KEYGEN_TEST_DATA *data;
2373     EVP_PKEY_CTX *genctx;
2374     int nid = OBJ_sn2nid(alg);
2375
2376     if (nid == NID_undef) {
2377         nid = OBJ_ln2nid(alg);
2378         if (nid == NID_undef)
2379             return 0;
2380     }
2381
2382     if (!TEST_ptr(genctx = EVP_PKEY_CTX_new_id(nid, NULL))) {
2383         /* assume algorithm disabled */
2384         t->skip = 1;
2385         return 1;
2386     }
2387
2388     if (EVP_PKEY_keygen_init(genctx) <= 0) {
2389         t->err = "KEYGEN_INIT_ERROR";
2390         goto err;
2391     }
2392
2393     if (!TEST_ptr(data = OPENSSL_malloc(sizeof(*data))))
2394         goto err;
2395     data->genctx = genctx;
2396     data->keyname = NULL;
2397     t->data = data;
2398     t->err = NULL;
2399     return 1;
2400
2401 err:
2402     EVP_PKEY_CTX_free(genctx);
2403     return 0;
2404 }
2405
2406 static void keygen_test_cleanup(EVP_TEST *t)
2407 {
2408     KEYGEN_TEST_DATA *keygen = t->data;
2409
2410     EVP_PKEY_CTX_free(keygen->genctx);
2411     OPENSSL_free(keygen->keyname);
2412     OPENSSL_free(t->data);
2413     t->data = NULL;
2414 }
2415
2416 static int keygen_test_parse(EVP_TEST *t,
2417                              const char *keyword, const char *value)
2418 {
2419     KEYGEN_TEST_DATA *keygen = t->data;
2420
2421     if (strcmp(keyword, "KeyName") == 0)
2422         return TEST_ptr(keygen->keyname = OPENSSL_strdup(value));
2423     if (strcmp(keyword, "Ctrl") == 0)
2424         return pkey_test_ctrl(t, keygen->genctx, value);
2425     return 0;
2426 }
2427
2428 static int keygen_test_run(EVP_TEST *t)
2429 {
2430     KEYGEN_TEST_DATA *keygen = t->data;
2431     EVP_PKEY *pkey = NULL;
2432
2433     t->err = NULL;
2434     if (EVP_PKEY_keygen(keygen->genctx, &pkey) <= 0) {
2435         t->err = "KEYGEN_GENERATE_ERROR";
2436         goto err;
2437     }
2438
2439     if (keygen->keyname != NULL) {
2440         KEY_LIST *key;
2441
2442         if (find_key(NULL, keygen->keyname, private_keys)) {
2443             TEST_info("Duplicate key %s", keygen->keyname);
2444             goto err;
2445         }
2446
2447         if (!TEST_ptr(key = OPENSSL_malloc(sizeof(*key))))
2448             goto err;
2449         key->name = keygen->keyname;
2450         keygen->keyname = NULL;
2451         key->key = pkey;
2452         key->next = private_keys;
2453         private_keys = key;
2454     } else {
2455         EVP_PKEY_free(pkey);
2456     }
2457
2458     return 1;
2459
2460 err:
2461     EVP_PKEY_free(pkey);
2462     return 0;
2463 }
2464
2465 static const EVP_TEST_METHOD keygen_test_method = {
2466     "KeyGen",
2467     keygen_test_init,
2468     keygen_test_cleanup,
2469     keygen_test_parse,
2470     keygen_test_run,
2471 };
2472
2473 /**
2474 ***  DIGEST SIGN+VERIFY TESTS
2475 **/
2476
2477 typedef struct {
2478     int is_verify; /* Set to 1 if verifying */
2479     int is_oneshot; /* Set to 1 for one shot operation */
2480     const EVP_MD *md; /* Digest to use */
2481     EVP_MD_CTX *ctx; /* Digest context */
2482     EVP_PKEY_CTX *pctx;
2483     STACK_OF(EVP_TEST_BUFFER) *input; /* Input data: streaming */
2484     unsigned char *osin; /* Input data if one shot */
2485     size_t osin_len; /* Input length data if one shot */
2486     unsigned char *output; /* Expected output */
2487     size_t output_len; /* Expected output length */
2488 } DIGESTSIGN_DATA;
2489
2490 static int digestsigver_test_init(EVP_TEST *t, const char *alg, int is_verify,
2491                                   int is_oneshot)
2492 {
2493     const EVP_MD *md = NULL;
2494     DIGESTSIGN_DATA *mdat;
2495
2496     if (strcmp(alg, "NULL") != 0) {
2497         if ((md = EVP_get_digestbyname(alg)) == NULL) {
2498             /* If alg has an OID assume disabled algorithm */
2499             if (OBJ_sn2nid(alg) != NID_undef || OBJ_ln2nid(alg) != NID_undef) {
2500                 t->skip = 1;
2501                 return 1;
2502             }
2503             return 0;
2504         }
2505     }
2506     if (!TEST_ptr(mdat = OPENSSL_zalloc(sizeof(*mdat))))
2507         return 0;
2508     mdat->md = md;
2509     if (!TEST_ptr(mdat->ctx = EVP_MD_CTX_new())) {
2510         OPENSSL_free(mdat);
2511         return 0;
2512     }
2513     mdat->is_verify = is_verify;
2514     mdat->is_oneshot = is_oneshot;
2515     t->data = mdat;
2516     return 1;
2517 }
2518
2519 static int digestsign_test_init(EVP_TEST *t, const char *alg)
2520 {
2521     return digestsigver_test_init(t, alg, 0, 0);
2522 }
2523
2524 static void digestsigver_test_cleanup(EVP_TEST *t)
2525 {
2526     DIGESTSIGN_DATA *mdata = t->data;
2527
2528     EVP_MD_CTX_free(mdata->ctx);
2529     sk_EVP_TEST_BUFFER_pop_free(mdata->input, evp_test_buffer_free);
2530     OPENSSL_free(mdata->osin);
2531     OPENSSL_free(mdata->output);
2532     OPENSSL_free(mdata);
2533     t->data = NULL;
2534 }
2535
2536 static int digestsigver_test_parse(EVP_TEST *t,
2537                                    const char *keyword, const char *value)
2538 {
2539     DIGESTSIGN_DATA *mdata = t->data;
2540
2541     if (strcmp(keyword, "Key") == 0) {
2542         EVP_PKEY *pkey = NULL;
2543         int rv = 0;
2544
2545         if (mdata->is_verify)
2546             rv = find_key(&pkey, value, public_keys);
2547         if (rv == 0)
2548             rv = find_key(&pkey, value, private_keys);
2549         if (rv == 0 || pkey == NULL) {
2550             t->skip = 1;
2551             return 1;
2552         }
2553         if (mdata->is_verify) {
2554             if (!EVP_DigestVerifyInit(mdata->ctx, &mdata->pctx, mdata->md,
2555                                       NULL, pkey))
2556                 t->err = "DIGESTVERIFYINIT_ERROR";
2557             return 1;
2558         }
2559         if (!EVP_DigestSignInit(mdata->ctx, &mdata->pctx, mdata->md, NULL,
2560                                 pkey))
2561             t->err = "DIGESTSIGNINIT_ERROR";
2562         return 1;
2563     }
2564
2565     if (strcmp(keyword, "Input") == 0) {
2566         if (mdata->is_oneshot)
2567             return parse_bin(value, &mdata->osin, &mdata->osin_len);
2568         return evp_test_buffer_append(value, &mdata->input);
2569     }
2570     if (strcmp(keyword, "Output") == 0)
2571         return parse_bin(value, &mdata->output, &mdata->output_len);
2572
2573     if (!mdata->is_oneshot) {
2574         if (strcmp(keyword, "Count") == 0)
2575             return evp_test_buffer_set_count(value, mdata->input);
2576         if (strcmp(keyword, "Ncopy") == 0)
2577             return evp_test_buffer_ncopy(value, mdata->input);
2578     }
2579     if (strcmp(keyword, "Ctrl") == 0) {
2580         if (mdata->pctx == NULL)
2581             return -1;
2582         return pkey_test_ctrl(t, mdata->pctx, value);
2583     }
2584     return 0;
2585 }
2586
2587 static int digestsign_update_fn(void *ctx, const unsigned char *buf,
2588                                 size_t buflen)
2589 {
2590     return EVP_DigestSignUpdate(ctx, buf, buflen);
2591 }
2592
2593 static int digestsign_test_run(EVP_TEST *t)
2594 {
2595     DIGESTSIGN_DATA *expected = t->data;
2596     unsigned char *got = NULL;
2597     size_t got_len;
2598
2599     if (!evp_test_buffer_do(expected->input, digestsign_update_fn,
2600                             expected->ctx)) {
2601         t->err = "DIGESTUPDATE_ERROR";
2602         goto err;
2603     }
2604
2605     if (!EVP_DigestSignFinal(expected->ctx, NULL, &got_len)) {
2606         t->err = "DIGESTSIGNFINAL_LENGTH_ERROR";
2607         goto err;
2608     }
2609     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
2610         t->err = "MALLOC_FAILURE";
2611         goto err;
2612     }
2613     if (!EVP_DigestSignFinal(expected->ctx, got, &got_len)) {
2614         t->err = "DIGESTSIGNFINAL_ERROR";
2615         goto err;
2616     }
2617     if (!memory_err_compare(t, "SIGNATURE_MISMATCH",
2618                             expected->output, expected->output_len,
2619                             got, got_len))
2620         goto err;
2621
2622     t->err = NULL;
2623  err:
2624     OPENSSL_free(got);
2625     return 1;
2626 }
2627
2628 static const EVP_TEST_METHOD digestsign_test_method = {
2629     "DigestSign",
2630     digestsign_test_init,
2631     digestsigver_test_cleanup,
2632     digestsigver_test_parse,
2633     digestsign_test_run
2634 };
2635
2636 static int digestverify_test_init(EVP_TEST *t, const char *alg)
2637 {
2638     return digestsigver_test_init(t, alg, 1, 0);
2639 }
2640
2641 static int digestverify_update_fn(void *ctx, const unsigned char *buf,
2642                                   size_t buflen)
2643 {
2644     return EVP_DigestVerifyUpdate(ctx, buf, buflen);
2645 }
2646
2647 static int digestverify_test_run(EVP_TEST *t)
2648 {
2649     DIGESTSIGN_DATA *mdata = t->data;
2650
2651     if (!evp_test_buffer_do(mdata->input, digestverify_update_fn, mdata->ctx)) {
2652         t->err = "DIGESTUPDATE_ERROR";
2653         return 1;
2654     }
2655
2656     if (EVP_DigestVerifyFinal(mdata->ctx, mdata->output,
2657                               mdata->output_len) <= 0)
2658         t->err = "VERIFY_ERROR";
2659     return 1;
2660 }
2661
2662 static const EVP_TEST_METHOD digestverify_test_method = {
2663     "DigestVerify",
2664     digestverify_test_init,
2665     digestsigver_test_cleanup,
2666     digestsigver_test_parse,
2667     digestverify_test_run
2668 };
2669
2670 static int oneshot_digestsign_test_init(EVP_TEST *t, const char *alg)
2671 {
2672     return digestsigver_test_init(t, alg, 0, 1);
2673 }
2674
2675 static int oneshot_digestsign_test_run(EVP_TEST *t)
2676 {
2677     DIGESTSIGN_DATA *expected = t->data;
2678     unsigned char *got = NULL;
2679     size_t got_len;
2680
2681     if (!EVP_DigestSign(expected->ctx, NULL, &got_len,
2682                         expected->osin, expected->osin_len)) {
2683         t->err = "DIGESTSIGN_LENGTH_ERROR";
2684         goto err;
2685     }
2686     if (!TEST_ptr(got = OPENSSL_malloc(got_len))) {
2687         t->err = "MALLOC_FAILURE";
2688         goto err;
2689     }
2690     if (!EVP_DigestSign(expected->ctx, got, &got_len,
2691                         expected->osin, expected->osin_len)) {
2692         t->err = "DIGESTSIGN_ERROR";
2693         goto err;
2694     }
2695     if (!memory_err_compare(t, "SIGNATURE_MISMATCH",
2696                             expected->output, expected->output_len,
2697                             got, got_len))
2698         goto err;
2699
2700     t->err = NULL;
2701  err:
2702     OPENSSL_free(got);
2703     return 1;
2704 }
2705
2706 static const EVP_TEST_METHOD oneshot_digestsign_test_method = {
2707     "OneShotDigestSign",
2708     oneshot_digestsign_test_init,
2709     digestsigver_test_cleanup,
2710     digestsigver_test_parse,
2711     oneshot_digestsign_test_run
2712 };
2713
2714 static int oneshot_digestverify_test_init(EVP_TEST *t, const char *alg)
2715 {
2716     return digestsigver_test_init(t, alg, 1, 1);
2717 }
2718
2719 static int oneshot_digestverify_test_run(EVP_TEST *t)
2720 {
2721     DIGESTSIGN_DATA *mdata = t->data;
2722
2723     if (EVP_DigestVerify(mdata->ctx, mdata->output, mdata->output_len,
2724                          mdata->osin, mdata->osin_len) <= 0)
2725         t->err = "VERIFY_ERROR";
2726     return 1;
2727 }
2728
2729 static const EVP_TEST_METHOD oneshot_digestverify_test_method = {
2730     "OneShotDigestVerify",
2731     oneshot_digestverify_test_init,
2732     digestsigver_test_cleanup,
2733     digestsigver_test_parse,
2734     oneshot_digestverify_test_run
2735 };
2736
2737
2738 /**
2739 ***  PARSING AND DISPATCH
2740 **/
2741
2742 static const EVP_TEST_METHOD *evp_test_list[] = {
2743     &cipher_test_method,
2744     &digest_test_method,
2745     &digestsign_test_method,
2746     &digestverify_test_method,
2747     &encode_test_method,
2748     &kdf_test_method,
2749     &pkey_kdf_test_method,
2750     &keypair_test_method,
2751     &keygen_test_method,
2752     &mac_test_method,
2753     &oneshot_digestsign_test_method,
2754     &oneshot_digestverify_test_method,
2755     &pbe_test_method,
2756     &pdecrypt_test_method,
2757     &pderive_test_method,
2758     &psign_test_method,
2759     &pverify_recover_test_method,
2760     &pverify_test_method,
2761     NULL
2762 };
2763
2764 static const EVP_TEST_METHOD *find_test(const char *name)
2765 {
2766     const EVP_TEST_METHOD **tt;
2767
2768     for (tt = evp_test_list; *tt; tt++) {
2769         if (strcmp(name, (*tt)->name) == 0)
2770             return *tt;
2771     }
2772     return NULL;
2773 }
2774
2775 static void clear_test(EVP_TEST *t)
2776 {
2777     test_clearstanza(&t->s);
2778     ERR_clear_error();
2779     if (t->data != NULL) {
2780         if (t->meth != NULL)
2781             t->meth->cleanup(t);
2782         OPENSSL_free(t->data);
2783         t->data = NULL;
2784     }
2785     OPENSSL_free(t->expected_err);
2786     t->expected_err = NULL;
2787     OPENSSL_free(t->reason);
2788     t->reason = NULL;
2789
2790     /* Text literal. */
2791     t->err = NULL;
2792     t->skip = 0;
2793     t->meth = NULL;
2794 }
2795
2796 /*
2797  * Check for errors in the test structure; return 1 if okay, else 0.
2798  */
2799 static int check_test_error(EVP_TEST *t)
2800 {
2801     unsigned long err;
2802     const char *reason;
2803
2804     if (t->err == NULL && t->expected_err == NULL)
2805         return 1;
2806     if (t->err != NULL && t->expected_err == NULL) {
2807         if (t->aux_err != NULL) {
2808             TEST_info("%s:%d: Source of above error (%s); unexpected error %s",
2809                       t->s.test_file, t->s.start, t->aux_err, t->err);
2810         } else {
2811             TEST_info("%s:%d: Source of above error; unexpected error %s",
2812                       t->s.test_file, t->s.start, t->err);
2813         }
2814         return 0;
2815     }
2816     if (t->err == NULL && t->expected_err != NULL) {
2817         TEST_info("%s:%d: Succeeded but was expecting %s",
2818                   t->s.test_file, t->s.start, t->expected_err);
2819         return 0;
2820     }
2821
2822     if (strcmp(t->err, t->expected_err) != 0) {
2823         TEST_info("%s:%d: Expected %s got %s",
2824                   t->s.test_file, t->s.start, t->expected_err, t->err);
2825         return 0;
2826     }
2827
2828     if (t->reason == NULL)
2829         return 1;
2830
2831     if (t->reason == NULL) {
2832         TEST_info("%s:%d: Test is missing function or reason code",
2833                   t->s.test_file, t->s.start);
2834         return 0;
2835     }
2836
2837     err = ERR_peek_error();
2838     if (err == 0) {
2839         TEST_info("%s:%d: Expected error \"%s\" not set",
2840                   t->s.test_file, t->s.start, t->reason);
2841         return 0;
2842     }
2843
2844     reason = ERR_reason_error_string(err);
2845     if (reason == NULL) {
2846         TEST_info("%s:%d: Expected error \"%s\", no strings available."
2847                   " Assuming ok.",
2848                   t->s.test_file, t->s.start, t->reason);
2849         return 1;
2850     }
2851
2852     if (strcmp(reason, t->reason) == 0)
2853         return 1;
2854
2855     TEST_info("%s:%d: Expected error \"%s\", got \"%s\"",
2856               t->s.test_file, t->s.start, t->reason, reason);
2857
2858     return 0;
2859 }
2860
2861 /*
2862  * Run a parsed test. Log a message and return 0 on error.
2863  */
2864 static int run_test(EVP_TEST *t)
2865 {
2866     if (t->meth == NULL)
2867         return 1;
2868     t->s.numtests++;
2869     if (t->skip) {
2870         t->s.numskip++;
2871     } else {
2872         /* run the test */
2873         if (t->err == NULL && t->meth->run_test(t) != 1) {
2874             TEST_info("%s:%d %s error",
2875                       t->s.test_file, t->s.start, t->meth->name);
2876             return 0;
2877         }
2878         if (!check_test_error(t)) {
2879             TEST_openssl_errors();
2880             t->s.errors++;
2881         }
2882     }
2883
2884     /* clean it up */
2885     return 1;
2886 }
2887
2888 static int find_key(EVP_PKEY **ppk, const char *name, KEY_LIST *lst)
2889 {
2890     for (; lst != NULL; lst = lst->next) {
2891         if (strcmp(lst->name, name) == 0) {
2892             if (ppk != NULL)
2893                 *ppk = lst->key;
2894             return 1;
2895         }
2896     }
2897     return 0;
2898 }
2899
2900 static void free_key_list(KEY_LIST *lst)
2901 {
2902     while (lst != NULL) {
2903         KEY_LIST *next = lst->next;
2904
2905         EVP_PKEY_free(lst->key);
2906         OPENSSL_free(lst->name);
2907         OPENSSL_free(lst);
2908         lst = next;
2909     }
2910 }
2911
2912 /*
2913  * Is the key type an unsupported algorithm?
2914  */
2915 static int key_unsupported(void)
2916 {
2917     long err = ERR_peek_error();
2918
2919     if (ERR_GET_LIB(err) == ERR_LIB_EVP
2920             && ERR_GET_REASON(err) == EVP_R_UNSUPPORTED_ALGORITHM) {
2921         ERR_clear_error();
2922         return 1;
2923     }
2924 #ifndef OPENSSL_NO_EC
2925     /*
2926      * If EC support is enabled we should catch also EC_R_UNKNOWN_GROUP as an
2927      * hint to an unsupported algorithm/curve (e.g. if binary EC support is
2928      * disabled).
2929      */
2930     if (ERR_GET_LIB(err) == ERR_LIB_EC
2931         && ERR_GET_REASON(err) == EC_R_UNKNOWN_GROUP) {
2932         ERR_clear_error();
2933         return 1;
2934     }
2935 #endif /* OPENSSL_NO_EC */
2936     return 0;
2937 }
2938
2939 /*
2940  * NULL out the value from |pp| but return it.  This "steals" a pointer.
2941  */
2942 static char *take_value(PAIR *pp)
2943 {
2944     char *p = pp->value;
2945
2946     pp->value = NULL;
2947     return p;
2948 }
2949
2950 /*
2951  * Return 1 if one of the providers named in the string is available.
2952  * The provider names are separated with whitespace.
2953  * NOTE: destructive function, it inserts '\0' after each provider name.
2954  */
2955 static int prov_available(char *providers)
2956 {
2957     char *p;
2958     int more = 1;
2959
2960     while (more) {
2961         for (; isspace(*providers); providers++)
2962             continue;
2963         if (*providers == '\0')
2964             break;               /* End of the road */
2965         for (p = providers; *p != '\0' && !isspace(*p); p++)
2966             continue;
2967         if (*p == '\0')
2968             more = 0;
2969         else
2970             *p = '\0';
2971         if (OSSL_PROVIDER_available(NULL, providers))
2972             return 1;            /* Found one */
2973     }
2974     return 0;
2975 }
2976
2977 /*
2978  * Read and parse one test.  Return 0 if failure, 1 if okay.
2979  */
2980 static int parse(EVP_TEST *t)
2981 {
2982     KEY_LIST *key, **klist;
2983     EVP_PKEY *pkey;
2984     PAIR *pp;
2985     int i;
2986
2987 top:
2988     do {
2989         if (BIO_eof(t->s.fp))
2990             return EOF;
2991         clear_test(t);
2992         if (!test_readstanza(&t->s))
2993             return 0;
2994     } while (t->s.numpairs == 0);
2995     pp = &t->s.pairs[0];
2996
2997     /* Are we adding a key? */
2998     klist = NULL;
2999     pkey = NULL;
3000     if (strcmp(pp->key, "PrivateKey") == 0) {
3001         pkey = PEM_read_bio_PrivateKey(t->s.key, NULL, 0, NULL);
3002         if (pkey == NULL && !key_unsupported()) {
3003             EVP_PKEY_free(pkey);
3004             TEST_info("Can't read private key %s", pp->value);
3005             TEST_openssl_errors();
3006             return 0;
3007         }
3008         klist = &private_keys;
3009     } else if (strcmp(pp->key, "PublicKey") == 0) {
3010         pkey = PEM_read_bio_PUBKEY(t->s.key, NULL, 0, NULL);
3011         if (pkey == NULL && !key_unsupported()) {
3012             EVP_PKEY_free(pkey);
3013             TEST_info("Can't read public key %s", pp->value);
3014             TEST_openssl_errors();
3015             return 0;
3016         }
3017         klist = &public_keys;
3018     } else if (strcmp(pp->key, "PrivateKeyRaw") == 0
3019                || strcmp(pp->key, "PublicKeyRaw") == 0 ) {
3020         char *strnid = NULL, *keydata = NULL;
3021         unsigned char *keybin;
3022         size_t keylen;
3023         int nid;
3024
3025         if (strcmp(pp->key, "PrivateKeyRaw") == 0)
3026             klist = &private_keys;
3027         else
3028             klist = &public_keys;
3029
3030         strnid = strchr(pp->value, ':');
3031         if (strnid != NULL) {
3032             *strnid++ = '\0';
3033             keydata = strchr(strnid, ':');
3034             if (keydata != NULL)
3035                 *keydata++ = '\0';
3036         }
3037         if (keydata == NULL) {
3038             TEST_info("Failed to parse %s value", pp->key);
3039             return 0;
3040         }
3041
3042         nid = OBJ_txt2nid(strnid);
3043         if (nid == NID_undef) {
3044             TEST_info("Uncrecognised algorithm NID");
3045             return 0;
3046         }
3047         if (!parse_bin(keydata, &keybin, &keylen)) {
3048             TEST_info("Failed to create binary key");
3049             return 0;
3050         }
3051         if (klist == &private_keys)
3052             pkey = EVP_PKEY_new_raw_private_key(nid, NULL, keybin, keylen);
3053         else
3054             pkey = EVP_PKEY_new_raw_public_key(nid, NULL, keybin, keylen);
3055         if (pkey == NULL && !key_unsupported()) {
3056             TEST_info("Can't read %s data", pp->key);
3057             OPENSSL_free(keybin);
3058             TEST_openssl_errors();
3059             return 0;
3060         }
3061         OPENSSL_free(keybin);
3062     }
3063
3064     /* If we have a key add to list */
3065     if (klist != NULL) {
3066         if (find_key(NULL, pp->value, *klist)) {
3067             TEST_info("Duplicate key %s", pp->value);
3068             return 0;
3069         }
3070         if (!TEST_ptr(key = OPENSSL_malloc(sizeof(*key))))
3071             return 0;
3072         key->name = take_value(pp);
3073
3074         /* Hack to detect SM2 keys */
3075         if(pkey != NULL && strstr(key->name, "SM2") != NULL) {
3076 #ifdef OPENSSL_NO_SM2
3077             EVP_PKEY_free(pkey);
3078             pkey = NULL;
3079 #else
3080             EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2);
3081 #endif
3082         }
3083
3084         key->key = pkey;
3085         key->next = *klist;
3086         *klist = key;
3087
3088         /* Go back and start a new stanza. */
3089         if (t->s.numpairs != 1)
3090             TEST_info("Line %d: missing blank line\n", t->s.curr);
3091         goto top;
3092     }
3093
3094     /* Find the test, based on first keyword. */
3095     if (!TEST_ptr(t->meth = find_test(pp->key)))
3096         return 0;
3097     if (!t->meth->init(t, pp->value)) {
3098         TEST_error("unknown %s: %s\n", pp->key, pp->value);
3099         return 0;
3100     }
3101     if (t->skip == 1) {
3102         /* TEST_info("skipping %s %s", pp->key, pp->value); */
3103         return 0;
3104     }
3105
3106     for (pp++, i = 1; i < t->s.numpairs; pp++, i++) {
3107         if (strcmp(pp->key, "Availablein") == 0) {
3108             if (!prov_available(pp->value)) {
3109                 TEST_info("skipping, providers not available: %s:%d",
3110                           t->s.test_file, t->s.start);
3111                 t->skip = 1;
3112                 return 0;
3113             }
3114         } else if (strcmp(pp->key, "Result") == 0) {
3115             if (t->expected_err != NULL) {
3116                 TEST_info("Line %d: multiple result lines", t->s.curr);
3117                 return 0;
3118             }
3119             t->expected_err = take_value(pp);
3120         } else if (strcmp(pp->key, "Function") == 0) {
3121             /* Ignore old line. */
3122         } else if (strcmp(pp->key, "Reason") == 0) {
3123             if (t->reason != NULL) {
3124                 TEST_info("Line %d: multiple reason lines", t->s.curr);
3125                 return 0;
3126             }
3127             t->reason = take_value(pp);
3128         } else {
3129             /* Must be test specific line: try to parse it */
3130             int rv = t->meth->parse(t, pp->key, pp->value);
3131
3132             if (rv == 0) {
3133                 TEST_info("Line %d: unknown keyword %s", t->s.curr, pp->key);
3134                 return 0;
3135             }
3136             if (rv < 0) {
3137                 TEST_info("Line %d: error processing keyword %s = %s\n",
3138                           t->s.curr, pp->key, pp->value);
3139                 return 0;
3140             }
3141         }
3142     }
3143
3144     return 1;
3145 }
3146
3147 static int run_file_tests(int i)
3148 {
3149     EVP_TEST *t;
3150     const char *testfile = test_get_argument(i);
3151     int c;
3152
3153     if (!TEST_ptr(t = OPENSSL_zalloc(sizeof(*t))))
3154         return 0;
3155     if (!test_start_file(&t->s, testfile)) {
3156         OPENSSL_free(t);
3157         return 0;
3158     }
3159
3160     while (!BIO_eof(t->s.fp)) {
3161         c = parse(t);
3162         if (t->skip) {
3163             t->s.numskip++;
3164             continue;
3165         }
3166         if (c == 0 || !run_test(t)) {
3167             t->s.errors++;
3168             break;
3169         }
3170     }
3171     test_end_file(&t->s);
3172     clear_test(t);
3173
3174     free_key_list(public_keys);
3175     free_key_list(private_keys);
3176     BIO_free(t->s.key);
3177     c = t->s.errors;
3178     OPENSSL_free(t);
3179     return c == 0;
3180 }
3181
3182 OPT_TEST_DECLARE_USAGE("file...\n")
3183
3184 int setup_tests(void)
3185 {
3186     size_t n = test_get_argument_count();
3187
3188     if (n == 0)
3189         return 0;
3190
3191     ADD_ALL_TESTS(run_file_tests, n);
3192     return 1;
3193 }