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