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