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