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