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