]> git.ipfire.org Git - thirdparty/openssl.git/blame - test/endecode_test.c
ENCODER: Adapt calls to the changed OSSL_ENCODER_CTX_new_by_EVP_PKEY()
[thirdparty/openssl.git] / test / endecode_test.c
CommitLineData
5a23d78c
RL
1/*
2 * Copyright 2020 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
3ecbea6a 10#include <string.h>
5a23d78c
RL
11#include <openssl/evp.h>
12#include <openssl/pem.h>
13#include <openssl/rsa.h>
14#include <openssl/x509.h>
c0f39ded 15#include <openssl/core_names.h>
7c664b1f 16#include <openssl/params.h>
c0f39ded 17#include <openssl/param_build.h>
ece9304c
RL
18#include <openssl/encoder.h>
19#include <openssl/decoder.h>
5a23d78c 20
a7922e20 21#include "internal/pem.h" /* For PVK and "blob" PEM headers */
e2ac846e
RL
22#include "internal/cryptlib.h" /* ossl_assert */
23
5a23d78c
RL
24#include "testutil.h"
25
c0f39ded
SL
26#ifndef OPENSSL_NO_EC
27static BN_CTX *bnctx = NULL;
28static OSSL_PARAM_BLD *bld_prime_nc = NULL;
29static OSSL_PARAM_BLD *bld_prime = NULL;
30static OSSL_PARAM *ec_explicit_prime_params_nc = NULL;
31static OSSL_PARAM *ec_explicit_prime_params_explicit = NULL;
32
33# ifndef OPENSSL_NO_EC2M
34static OSSL_PARAM_BLD *bld_tri_nc = NULL;
35static OSSL_PARAM_BLD *bld_tri = NULL;
36static OSSL_PARAM *ec_explicit_tri_params_nc = NULL;
37static OSSL_PARAM *ec_explicit_tri_params_explicit = NULL;
38# endif
39#endif
40
7c664b1f
RL
41static EVP_PKEY *make_template(const char *type, OSSL_PARAM *genparams)
42{
43 EVP_PKEY *pkey = NULL;
44 EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name(NULL, type, NULL);
45
46 /*
47 * No real need to check the errors other than for the cascade
48 * effect. |pkey| will simply remain NULL if something goes wrong.
49 */
50 (void)(ctx != NULL
51 && EVP_PKEY_paramgen_init(ctx) > 0
52 && (genparams == NULL
53 || EVP_PKEY_CTX_set_params(ctx, genparams) > 0)
54 && EVP_PKEY_gen(ctx, &pkey) > 0);
55 EVP_PKEY_CTX_free(ctx);
56
57 return pkey;
58}
5a23d78c 59
7c664b1f 60static EVP_PKEY *make_key(const char *type, EVP_PKEY *template,
1251cddf 61 OSSL_PARAM *genparams)
5a23d78c
RL
62{
63 EVP_PKEY *pkey = NULL;
7c664b1f
RL
64 EVP_PKEY_CTX *ctx =
65 template != NULL
66 ? EVP_PKEY_CTX_new(template, NULL)
67 : EVP_PKEY_CTX_new_from_name(NULL, type, NULL);
5a23d78c
RL
68
69 /*
70 * No real need to check the errors other than for the cascade
7c664b1f 71 * effect. |pkey| will simply remain NULL if something goes wrong.
5a23d78c
RL
72 */
73 (void)(ctx != NULL
74 && EVP_PKEY_keygen_init(ctx) > 0
7c664b1f
RL
75 && (genparams == NULL
76 || EVP_PKEY_CTX_set_params(ctx, genparams) > 0)
5a23d78c
RL
77 && EVP_PKEY_keygen(ctx, &pkey) > 0);
78 EVP_PKEY_CTX_free(ctx);
5a23d78c
RL
79 return pkey;
80}
81
82/* Main test driver */
83
4701f0a9
RL
84/*
85 * TODO(3.0) For better error output, changed the callbacks to take __FILE__
86 * and __LINE__ as first two arguments, and have them use the lower case
87 * functions, such as test_strn_eq(), rather than the uppercase macros
88 * (TEST_strn2_eq(), for example).
89 */
90
ece9304c 91typedef int (encoder)(void **encoded, long *encoded_len,
1251cddf
RL
92 void *object, const char *pass, const char *pcipher,
93 const char *encoder_propq);
ece9304c 94typedef int (decoder)(void **object,
1251cddf
RL
95 void *encoded, long encoded_len,
96 const char *pass);
319d0b2b
RL
97typedef int (tester)(const void *data1, size_t data1_len,
98 const void *data2, size_t data2_len);
846f96f8 99typedef int (checker)(const char *type, const void *data, size_t data_len);
5a23d78c
RL
100typedef void (dumper)(const char *label, const void *data, size_t data_len);
101
ece9304c 102static int test_encode_decode(const char *type, EVP_PKEY *pkey,
1251cddf
RL
103 const char *pass, const char *pcipher,
104 encoder *encode_cb, decoder *decode_cb,
105 tester *test_cb, checker *check_cb,
106 dumper *dump_cb, const char *encoder_propq)
5a23d78c 107{
ece9304c
RL
108 void *encoded = NULL;
109 long encoded_len = 0;
5a23d78c 110 EVP_PKEY *pkey2 = NULL;
ece9304c
RL
111 void *encoded2 = NULL;
112 long encoded2_len = 0;
5a23d78c
RL
113 int ok = 0;
114
ece9304c
RL
115 if (!encode_cb(&encoded, &encoded_len, pkey,
116 pass, pcipher, encoder_propq)
117 || !check_cb(type, encoded, encoded_len)
118 || !decode_cb((void **)&pkey2, encoded, encoded_len,
4701f0a9 119 pass)
5a23d78c
RL
120 || !TEST_int_eq(EVP_PKEY_eq(pkey, pkey2), 1))
121 goto end;
122
123 /*
ece9304c 124 * Double check the encoding, but only for unprotected keys,
3ecbea6a
RL
125 * as protected keys have a random component, which makes the output
126 * differ.
5a23d78c 127 */
3ecbea6a 128 if ((pass == NULL && pcipher == NULL)
ece9304c
RL
129 && (!encode_cb(&encoded2, &encoded2_len, pkey2,
130 pass, pcipher, encoder_propq)
131 || !test_cb(encoded, encoded_len,
132 encoded2, encoded2_len)))
5a23d78c
RL
133 goto end;
134
135 ok = 1;
136 end:
319d0b2b 137 if (!ok) {
ece9304c
RL
138 if (encoded != NULL && encoded_len != 0)
139 dump_cb("encoded result", encoded, encoded_len);
140 if (encoded2 != NULL && encoded2_len != 0)
141 dump_cb("re-encoded result", encoded2, encoded2_len);
319d0b2b 142 }
5a23d78c 143
ece9304c
RL
144 OPENSSL_free(encoded);
145 OPENSSL_free(encoded2);
5a23d78c
RL
146 EVP_PKEY_free(pkey2);
147 return ok;
148}
149
ece9304c 150/* Encoding and desencoding methods */
5a23d78c 151
ece9304c 152static int encode_EVP_PKEY_prov(void **encoded, long *encoded_len,
1251cddf
RL
153 void *object,
154 const char *pass, const char *pcipher,
155 const char *encoder_propq)
5a23d78c
RL
156{
157 EVP_PKEY *pkey = object;
ece9304c 158 OSSL_ENCODER_CTX *ectx = NULL;
5a23d78c
RL
159 BIO *mem_ser = NULL;
160 BUF_MEM *mem_buf = NULL;
3ecbea6a 161 const unsigned char *upass = (const unsigned char *)pass;
5a23d78c
RL
162 int ok = 0;
163
ece9304c 164 if (!TEST_ptr(ectx = OSSL_ENCODER_CTX_new_by_EVP_PKEY(pkey, encoder_propq))
3ecbea6a 165 || (pass != NULL
ece9304c 166 && !TEST_true(OSSL_ENCODER_CTX_set_passphrase(ectx, upass,
e2ac846e 167 strlen(pass))))
3ecbea6a 168 || (pcipher != NULL
ece9304c 169 && !TEST_true(OSSL_ENCODER_CTX_set_cipher(ectx, pcipher, NULL)))
5a23d78c 170 || !TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
ece9304c 171 || !TEST_true(OSSL_ENCODER_to_bio(ectx, mem_ser))
5a23d78c 172 || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
ece9304c
RL
173 || !TEST_ptr(*encoded = mem_buf->data)
174 || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
5a23d78c
RL
175 goto end;
176
ece9304c 177 /* Detach the encoded output */
5a23d78c
RL
178 mem_buf->data = NULL;
179 mem_buf->length = 0;
180 ok = 1;
181 end:
182 BIO_free(mem_ser);
ece9304c 183 OSSL_ENCODER_CTX_free(ectx);
5a23d78c
RL
184 return ok;
185}
186
ece9304c 187static int decode_EVP_PKEY_prov(void **object,
1251cddf
RL
188 void *encoded, long encoded_len,
189 const char *pass)
5a23d78c
RL
190{
191 EVP_PKEY *pkey = NULL;
ece9304c 192 OSSL_DECODER_CTX *dctx = NULL;
5a23d78c 193 BIO *mem_deser = NULL;
3ecbea6a 194 const unsigned char *upass = (const unsigned char *)pass;
5a23d78c
RL
195 int ok = 0;
196
ece9304c 197 if (!TEST_ptr(dctx = OSSL_DECODER_CTX_new_by_EVP_PKEY(&pkey, NULL,
5a23d78c 198 NULL, NULL))
3ecbea6a 199 || (pass != NULL
ece9304c 200 && !OSSL_DECODER_CTX_set_passphrase(dctx, upass,
3ecbea6a 201 strlen(pass)))
ece9304c
RL
202 || !TEST_ptr(mem_deser = BIO_new_mem_buf(encoded, encoded_len))
203 || !TEST_true(OSSL_DECODER_from_bio(dctx, mem_deser)))
5a23d78c
RL
204 goto end;
205 ok = 1;
206 *object = pkey;
207 end:
208 BIO_free(mem_deser);
ece9304c 209 OSSL_DECODER_CTX_free(dctx);
5a23d78c
RL
210 return ok;
211}
212
ece9304c 213static int encode_EVP_PKEY_legacy_PEM(void **encoded,
1251cddf
RL
214 long *encoded_len,
215 void *object,
216 const char *pass, const char *pcipher,
217 ossl_unused const char *encoder_propq)
e2ac846e
RL
218{
219 EVP_PKEY *pkey = object;
220 EVP_CIPHER *cipher = NULL;
221 BIO *mem_ser = NULL;
222 BUF_MEM *mem_buf = NULL;
223 const unsigned char *upass = (const unsigned char *)pass;
224 size_t passlen = 0;
225 int ok = 0;
226
227 if (pcipher != NULL && pass != NULL) {
228 passlen = strlen(pass);
229 if (!TEST_ptr(cipher = EVP_CIPHER_fetch(NULL, pcipher, NULL)))
230 goto end;
231 }
232 if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
233 || !TEST_true(PEM_write_bio_PrivateKey_traditional(mem_ser, pkey,
234 cipher,
235 upass, passlen,
236 NULL, NULL))
237 || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
ece9304c
RL
238 || !TEST_ptr(*encoded = mem_buf->data)
239 || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
e2ac846e
RL
240 goto end;
241
ece9304c 242 /* Detach the encoded output */
e2ac846e
RL
243 mem_buf->data = NULL;
244 mem_buf->length = 0;
245 ok = 1;
246 end:
247 BIO_free(mem_ser);
248 EVP_CIPHER_free(cipher);
249 return ok;
250}
251
a7922e20 252#ifndef OPENSSL_NO_DSA
1251cddf
RL
253static int encode_EVP_PKEY_MSBLOB(void **encoded, long *encoded_len,
254 void *object,
255 ossl_unused const char *pass,
256 ossl_unused const char *pcipher,
257 ossl_unused const char *encoder_propq)
a7922e20
RL
258{
259 EVP_PKEY *pkey = object;
260 BIO *mem_ser = NULL;
261 BUF_MEM *mem_buf = NULL;
262 int ok = 0;
263
264 if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
265 || !TEST_int_ge(i2b_PrivateKey_bio(mem_ser, pkey), 0)
266 || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
ece9304c
RL
267 || !TEST_ptr(*encoded = mem_buf->data)
268 || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
a7922e20
RL
269 goto end;
270
ece9304c 271 /* Detach the encoded output */
a7922e20
RL
272 mem_buf->data = NULL;
273 mem_buf->length = 0;
274 ok = 1;
275 end:
276 BIO_free(mem_ser);
277 return ok;
278}
279
1251cddf
RL
280static int encode_public_EVP_PKEY_MSBLOB(void **encoded, long *encoded_len,
281 void *object,
282 ossl_unused const char *pass,
283 ossl_unused const char *pcipher,
284 ossl_unused const char *encoder_propq)
a7922e20
RL
285{
286 EVP_PKEY *pkey = object;
287 BIO *mem_ser = NULL;
288 BUF_MEM *mem_buf = NULL;
289 int ok = 0;
290
291 if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
292 || !TEST_int_ge(i2b_PublicKey_bio(mem_ser, pkey), 0)
293 || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
ece9304c
RL
294 || !TEST_ptr(*encoded = mem_buf->data)
295 || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
a7922e20
RL
296 goto end;
297
ece9304c 298 /* Detach the encoded output */
a7922e20
RL
299 mem_buf->data = NULL;
300 mem_buf->length = 0;
301 ok = 1;
302 end:
303 BIO_free(mem_ser);
304 return ok;
305}
306
307# ifndef OPENSSL_NO_RC4
308static pem_password_cb pass_pw;
309static int pass_pw(char *buf, int size, int rwflag, void *userdata)
310{
311 OPENSSL_strlcpy(buf, userdata, size);
312 return strlen(userdata);
313}
314
ece9304c 315static int encode_EVP_PKEY_PVK(void **encoded, long *encoded_len,
1251cddf
RL
316 void *object,
317 const char *pass,
318 ossl_unused const char *pcipher,
319 ossl_unused const char *encoder_propq)
a7922e20
RL
320{
321 EVP_PKEY *pkey = object;
322 BIO *mem_ser = NULL;
323 BUF_MEM *mem_buf = NULL;
324 int enc = (pass != NULL);
325 int ok = 0;
326
327 if (!TEST_ptr(mem_ser = BIO_new(BIO_s_mem()))
328 || !TEST_int_ge(i2b_PVK_bio(mem_ser, pkey, enc,
329 pass_pw, (void *)pass), 0)
330 || !TEST_true(BIO_get_mem_ptr(mem_ser, &mem_buf) > 0)
ece9304c
RL
331 || !TEST_ptr(*encoded = mem_buf->data)
332 || !TEST_long_gt(*encoded_len = mem_buf->length, 0))
a7922e20
RL
333 goto end;
334
ece9304c 335 /* Detach the encoded output */
a7922e20
RL
336 mem_buf->data = NULL;
337 mem_buf->length = 0;
338 ok = 1;
339 end:
340 BIO_free(mem_ser);
341 return ok;
342}
343# endif
344#endif
345
319d0b2b
RL
346static int test_text(const void *data1, size_t data1_len,
347 const void *data2, size_t data2_len)
348{
349 return TEST_strn2_eq(data1, data1_len, data2, data2_len);
350}
351
352static int test_mem(const void *data1, size_t data1_len,
353 const void *data2, size_t data2_len)
354{
355 return TEST_mem_eq(data1, data1_len, data2, data2_len);
356}
357
5a23d78c
RL
358/* Test cases and their dumpers / checkers */
359
360static void dump_der(const char *label, const void *data, size_t data_len)
361{
362 test_output_memory(label, data, data_len);
363}
364
365static void dump_pem(const char *label, const void *data, size_t data_len)
366{
367 test_output_string(label, data, data_len - 1);
368}
369
846f96f8 370static int check_unprotected_PKCS8_DER(const char *type,
3ecbea6a 371 const void *data, size_t data_len)
5a23d78c
RL
372{
373 const unsigned char *datap = data;
374 PKCS8_PRIV_KEY_INFO *p8inf =
375 d2i_PKCS8_PRIV_KEY_INFO(NULL, &datap, data_len);
376 int ok = 0;
377
378 if (TEST_ptr(p8inf)) {
379 EVP_PKEY *pkey = EVP_PKCS82PKEY(p8inf);
380
846f96f8 381 ok = (TEST_ptr(pkey) && TEST_true(EVP_PKEY_is_a(pkey, type)));
5a23d78c
RL
382 EVP_PKEY_free(pkey);
383 }
384 PKCS8_PRIV_KEY_INFO_free(p8inf);
385 return ok;
386}
387
7c664b1f 388static int test_unprotected_via_DER(const char *type, EVP_PKEY *key)
846f96f8 389{
ece9304c 390 return test_encode_decode(type, key, NULL, NULL,
1251cddf
RL
391 encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
392 test_mem, check_unprotected_PKCS8_DER, dump_der,
393 OSSL_ENCODER_PrivateKey_TO_DER_PQ);
846f96f8
RL
394}
395
396static int check_unprotected_PKCS8_PEM(const char *type,
3ecbea6a 397 const void *data, size_t data_len)
5a23d78c
RL
398{
399 static const char pem_header[] = "-----BEGIN " PEM_STRING_PKCS8INF "-----";
400
401 return TEST_strn_eq(data, pem_header, sizeof(pem_header) - 1);
402}
403
7c664b1f 404static int test_unprotected_via_PEM(const char *type, EVP_PKEY *key)
5a23d78c 405{
ece9304c 406 return test_encode_decode(type, key, NULL, NULL,
1251cddf
RL
407 encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
408 test_text, check_unprotected_PKCS8_PEM, dump_pem,
409 OSSL_ENCODER_PrivateKey_TO_PEM_PQ);
e2ac846e
RL
410}
411
846f96f8 412static int check_unprotected_legacy_PEM(const char *type,
e2ac846e
RL
413 const void *data, size_t data_len)
414{
846f96f8 415 static char pem_header[80];
e2ac846e 416
846f96f8
RL
417 return
418 TEST_int_gt(BIO_snprintf(pem_header, sizeof(pem_header),
419 "-----BEGIN %s PRIVATE KEY-----", type), 0)
420 && TEST_strn_eq(data, pem_header, strlen(pem_header));
e2ac846e
RL
421}
422
7c664b1f 423static int test_unprotected_via_legacy_PEM(const char *type, EVP_PKEY *key)
846f96f8 424{
ece9304c 425 return test_encode_decode(type, key, NULL, NULL,
1251cddf
RL
426 encode_EVP_PKEY_legacy_PEM, decode_EVP_PKEY_prov,
427 test_text, check_unprotected_legacy_PEM, dump_pem,
428 NULL);
3ecbea6a
RL
429}
430
a7922e20
RL
431#ifndef OPENSSL_NO_DSA
432static int check_MSBLOB(const char *type, const void *data, size_t data_len)
433{
434 const unsigned char *datap = data;
435 EVP_PKEY *pkey = b2i_PrivateKey(&datap, data_len);
436 int ok = TEST_ptr(pkey);
437
438 EVP_PKEY_free(pkey);
439 return ok;
440}
441
442static int test_unprotected_via_MSBLOB(const char *type, EVP_PKEY *key)
443{
ece9304c 444 return test_encode_decode(type, key, NULL, NULL,
1251cddf
RL
445 encode_EVP_PKEY_MSBLOB, decode_EVP_PKEY_prov,
446 test_mem, check_MSBLOB, dump_der,
447 NULL);
a7922e20
RL
448}
449
450# ifndef OPENSSL_NO_RC4
451static int check_PVK(const char *type, const void *data, size_t data_len)
452{
453 const unsigned char *in = data;
454 unsigned int saltlen = 0, keylen = 0;
455 int ok = ossl_do_PVK_header(&in, data_len, 0, &saltlen, &keylen);
456
457 return ok;
458}
459
460static int test_unprotected_via_PVK(const char *type, EVP_PKEY *key)
461{
ece9304c 462 return test_encode_decode(type, key, NULL, NULL,
1251cddf
RL
463 encode_EVP_PKEY_PVK, decode_EVP_PKEY_prov,
464 test_mem, check_PVK, dump_der,
465 NULL);
a7922e20
RL
466}
467# endif
468#endif
469
3ecbea6a
RL
470static const char *pass_cipher = "AES-256-CBC";
471static const char *pass = "the holy handgrenade of antioch";
472
846f96f8 473static int check_protected_PKCS8_DER(const char *type,
3ecbea6a
RL
474 const void *data, size_t data_len)
475{
476 const unsigned char *datap = data;
477 X509_SIG *p8 = d2i_X509_SIG(NULL, &datap, data_len);
478 int ok = TEST_ptr(p8);
479
480 X509_SIG_free(p8);
481 return ok;
482}
483
7c664b1f 484static int test_protected_via_DER(const char *type, EVP_PKEY *key)
846f96f8 485{
ece9304c 486 return test_encode_decode(type, key, pass, pass_cipher,
1251cddf
RL
487 encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
488 test_mem, check_protected_PKCS8_DER, dump_der,
489 OSSL_ENCODER_PrivateKey_TO_DER_PQ);
3ecbea6a
RL
490}
491
846f96f8 492static int check_protected_PKCS8_PEM(const char *type,
3ecbea6a
RL
493 const void *data, size_t data_len)
494{
495 static const char pem_header[] = "-----BEGIN " PEM_STRING_PKCS8 "-----";
496
497 return TEST_strn_eq(data, pem_header, sizeof(pem_header) - 1);
498}
499
7c664b1f 500static int test_protected_via_PEM(const char *type, EVP_PKEY *key)
3ecbea6a 501{
ece9304c 502 return test_encode_decode(type, key, pass, pass_cipher,
1251cddf
RL
503 encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
504 test_text, check_protected_PKCS8_PEM, dump_pem,
505 OSSL_ENCODER_PrivateKey_TO_PEM_PQ);
e2ac846e
RL
506}
507
846f96f8 508static int check_protected_legacy_PEM(const char *type,
e2ac846e
RL
509 const void *data, size_t data_len)
510{
846f96f8 511 static char pem_header[80];
e2ac846e
RL
512
513 return
846f96f8
RL
514 TEST_int_gt(BIO_snprintf(pem_header, sizeof(pem_header),
515 "-----BEGIN %s PRIVATE KEY-----", type), 0)
516 && TEST_strn_eq(data, pem_header, strlen(pem_header))
e2ac846e
RL
517 && TEST_ptr(strstr(data, "\nDEK-Info: "));
518}
519
7c664b1f 520static int test_protected_via_legacy_PEM(const char *type, EVP_PKEY *key)
e2ac846e 521{
ece9304c 522 return test_encode_decode(type, key, pass, pass_cipher,
1251cddf
RL
523 encode_EVP_PKEY_legacy_PEM, decode_EVP_PKEY_prov,
524 test_text, check_protected_legacy_PEM, dump_pem,
525 NULL);
846f96f8
RL
526}
527
a7922e20
RL
528#if !defined(OPENSSL_NO_DSA) && !defined(OPENSSL_NO_RC4)
529static int test_protected_via_PVK(const char *type, EVP_PKEY *key)
530{
ece9304c 531 return test_encode_decode(type, key, pass, NULL,
1251cddf
RL
532 encode_EVP_PKEY_PVK, decode_EVP_PKEY_prov,
533 test_mem, check_PVK, dump_der,
534 NULL);
a7922e20
RL
535}
536#endif
537
7c664b1f 538static int check_public_DER(const char *type, const void *data, size_t data_len)
3ff8159a
RL
539{
540 const unsigned char *datap = data;
541 EVP_PKEY *pkey = d2i_PUBKEY(NULL, &datap, data_len);
7c664b1f 542 int ok = (TEST_ptr(pkey) && TEST_true(EVP_PKEY_is_a(pkey, type)));
3ff8159a
RL
543
544 EVP_PKEY_free(pkey);
545 return ok;
546}
547
7c664b1f 548static int test_public_via_DER(const char *type, EVP_PKEY *key)
3ff8159a 549{
ece9304c 550 return test_encode_decode(type, key, NULL, NULL,
1251cddf
RL
551 encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
552 test_mem, check_public_DER, dump_der,
553 OSSL_ENCODER_PUBKEY_TO_DER_PQ);
3ff8159a
RL
554}
555
7c664b1f 556static int check_public_PEM(const char *type, const void *data, size_t data_len)
3ff8159a
RL
557{
558 static const char pem_header[] = "-----BEGIN " PEM_STRING_PUBLIC "-----";
559
560 return
561 TEST_strn_eq(data, pem_header, sizeof(pem_header) - 1);
562}
563
7c664b1f 564static int test_public_via_PEM(const char *type, EVP_PKEY *key)
3ff8159a 565{
ece9304c 566 return test_encode_decode(type, key, NULL, NULL,
1251cddf
RL
567 encode_EVP_PKEY_prov, decode_EVP_PKEY_prov,
568 test_text, check_public_PEM, dump_pem,
569 OSSL_ENCODER_PUBKEY_TO_PEM_PQ);
3ff8159a
RL
570}
571
a7922e20
RL
572#ifndef OPENSSL_NO_DSA
573static int check_public_MSBLOB(const char *type,
574 const void *data, size_t data_len)
575{
576 const unsigned char *datap = data;
577 EVP_PKEY *pkey = b2i_PublicKey(&datap, data_len);
578 int ok = TEST_ptr(pkey);
579
580 EVP_PKEY_free(pkey);
581 return ok;
582}
583
584static int test_public_via_MSBLOB(const char *type, EVP_PKEY *key)
585{
ece9304c 586 return test_encode_decode(type, key, NULL, NULL,
1251cddf
RL
587 encode_public_EVP_PKEY_MSBLOB,
588 decode_EVP_PKEY_prov,
589 test_mem, check_public_MSBLOB, dump_der,
590 NULL);
a7922e20
RL
591}
592#endif
593
7c664b1f 594#define KEYS(KEYTYPE) \
1251cddf 595 static EVP_PKEY *key_##KEYTYPE = NULL
7c664b1f
RL
596#define MAKE_KEYS(KEYTYPE, KEYTYPEstr, params) \
597 ok = ok \
1251cddf 598 && TEST_ptr(key_##KEYTYPE = make_key(KEYTYPEstr, NULL, params))
7c664b1f
RL
599#define FREE_KEYS(KEYTYPE) \
600 EVP_PKEY_free(key_##KEYTYPE); \
7c664b1f
RL
601
602#define DOMAIN_KEYS(KEYTYPE) \
603 static EVP_PKEY *template_##KEYTYPE = NULL; \
1251cddf 604 static EVP_PKEY *key_##KEYTYPE = NULL
7c664b1f
RL
605#define MAKE_DOMAIN_KEYS(KEYTYPE, KEYTYPEstr, params) \
606 ok = ok \
607 && TEST_ptr(template_##KEYTYPE = \
608 make_template(KEYTYPEstr, params)) \
609 && TEST_ptr(key_##KEYTYPE = \
1251cddf 610 make_key(KEYTYPEstr, template_##KEYTYPE, NULL))
7c664b1f
RL
611#define FREE_DOMAIN_KEYS(KEYTYPE) \
612 EVP_PKEY_free(template_##KEYTYPE); \
1251cddf 613 EVP_PKEY_free(key_##KEYTYPE)
7c664b1f
RL
614
615#define IMPLEMENT_TEST_SUITE(KEYTYPE, KEYTYPEstr) \
616 static int test_unprotected_##KEYTYPE##_via_DER(void) \
617 { \
618 return test_unprotected_via_DER(KEYTYPEstr, key_##KEYTYPE); \
619 } \
620 static int test_unprotected_##KEYTYPE##_via_PEM(void) \
621 { \
622 return test_unprotected_via_PEM(KEYTYPEstr, key_##KEYTYPE); \
623 } \
7c664b1f
RL
624 static int test_protected_##KEYTYPE##_via_DER(void) \
625 { \
626 return test_protected_via_DER(KEYTYPEstr, key_##KEYTYPE); \
627 } \
628 static int test_protected_##KEYTYPE##_via_PEM(void) \
629 { \
630 return test_protected_via_PEM(KEYTYPEstr, key_##KEYTYPE); \
631 } \
7c664b1f
RL
632 static int test_public_##KEYTYPE##_via_DER(void) \
633 { \
634 return test_public_via_DER(KEYTYPEstr, key_##KEYTYPE); \
635 } \
636 static int test_public_##KEYTYPE##_via_PEM(void) \
637 { \
638 return test_public_via_PEM(KEYTYPEstr, key_##KEYTYPE); \
639 }
640
641#define ADD_TEST_SUITE(KEYTYPE) \
642 ADD_TEST(test_unprotected_##KEYTYPE##_via_DER); \
643 ADD_TEST(test_unprotected_##KEYTYPE##_via_PEM); \
7c664b1f
RL
644 ADD_TEST(test_protected_##KEYTYPE##_via_DER); \
645 ADD_TEST(test_protected_##KEYTYPE##_via_PEM); \
7c664b1f
RL
646 ADD_TEST(test_public_##KEYTYPE##_via_DER); \
647 ADD_TEST(test_public_##KEYTYPE##_via_PEM)
648
bddfea02
RL
649#define IMPLEMENT_TEST_SUITE_LEGACY(KEYTYPE, KEYTYPEstr) \
650 static int test_unprotected_##KEYTYPE##_via_legacy_PEM(void) \
651 { \
1251cddf
RL
652 return \
653 test_unprotected_via_legacy_PEM(KEYTYPEstr, key_##KEYTYPE); \
bddfea02
RL
654 } \
655 static int test_protected_##KEYTYPE##_via_legacy_PEM(void) \
656 { \
1251cddf
RL
657 return \
658 test_protected_via_legacy_PEM(KEYTYPEstr, key_##KEYTYPE); \
bddfea02
RL
659 }
660
661#define ADD_TEST_SUITE_LEGACY(KEYTYPE) \
1251cddf 662 ADD_TEST(test_unprotected_##KEYTYPE##_via_legacy_PEM); \
bddfea02
RL
663 ADD_TEST(test_protected_##KEYTYPE##_via_legacy_PEM)
664
a7922e20
RL
665#ifndef OPENSSL_NO_DSA
666# define IMPLEMENT_TEST_SUITE_MSBLOB(KEYTYPE, KEYTYPEstr) \
667 static int test_unprotected_##KEYTYPE##_via_MSBLOB(void) \
668 { \
669 return test_unprotected_via_MSBLOB(KEYTYPEstr, key_##KEYTYPE); \
670 } \
671 static int test_public_##KEYTYPE##_via_MSBLOB(void) \
672 { \
673 return test_public_via_MSBLOB(KEYTYPEstr, key_##KEYTYPE); \
674 }
675
676# define ADD_TEST_SUITE_MSBLOB(KEYTYPE) \
677 ADD_TEST(test_unprotected_##KEYTYPE##_via_MSBLOB); \
678 ADD_TEST(test_public_##KEYTYPE##_via_MSBLOB)
679
680# ifndef OPENSSL_NO_RC4
681# define IMPLEMENT_TEST_SUITE_PVK(KEYTYPE, KEYTYPEstr) \
682 static int test_unprotected_##KEYTYPE##_via_PVK(void) \
683 { \
684 return test_unprotected_via_PVK(KEYTYPEstr, key_##KEYTYPE); \
685 } \
686 static int test_protected_##KEYTYPE##_via_PVK(void) \
687 { \
688 return test_protected_via_PVK(KEYTYPEstr, key_##KEYTYPE); \
689 }
690
691# define ADD_TEST_SUITE_PVK(KEYTYPE) \
692 ADD_TEST(test_unprotected_##KEYTYPE##_via_PVK); \
693 ADD_TEST(test_protected_##KEYTYPE##_via_PVK)
694# endif
695#endif
696
7c664b1f
RL
697#ifndef OPENSSL_NO_DH
698DOMAIN_KEYS(DH);
699IMPLEMENT_TEST_SUITE(DH, "DH")
31d2daec
SL
700DOMAIN_KEYS(DHX);
701IMPLEMENT_TEST_SUITE(DHX, "X9.42 DH")
bddfea02
RL
702/*
703 * DH has no support for PEM_write_bio_PrivateKey_traditional(),
704 * so no legacy tests.
705 */
7c664b1f
RL
706#endif
707#ifndef OPENSSL_NO_DSA
708DOMAIN_KEYS(DSA);
709IMPLEMENT_TEST_SUITE(DSA, "DSA")
bddfea02 710IMPLEMENT_TEST_SUITE_LEGACY(DSA, "DSA")
a7922e20
RL
711IMPLEMENT_TEST_SUITE_MSBLOB(DSA, "DSA")
712# ifndef OPENSSL_NO_RC4
713IMPLEMENT_TEST_SUITE_PVK(DSA, "DSA")
714# endif
7c664b1f
RL
715#endif
716#ifndef OPENSSL_NO_EC
717DOMAIN_KEYS(EC);
718IMPLEMENT_TEST_SUITE(EC, "EC")
bddfea02 719IMPLEMENT_TEST_SUITE_LEGACY(EC, "EC")
c0f39ded
SL
720DOMAIN_KEYS(ECExplicitPrimeNamedCurve);
721IMPLEMENT_TEST_SUITE(ECExplicitPrimeNamedCurve, "EC")
bddfea02 722IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitPrimeNamedCurve, "EC")
c0f39ded
SL
723DOMAIN_KEYS(ECExplicitPrime2G);
724IMPLEMENT_TEST_SUITE(ECExplicitPrime2G, "EC")
bddfea02 725IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitPrime2G, "EC")
c0f39ded
SL
726# ifndef OPENSSL_NO_EC2M
727DOMAIN_KEYS(ECExplicitTriNamedCurve);
728IMPLEMENT_TEST_SUITE(ECExplicitTriNamedCurve, "EC")
bddfea02 729IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTriNamedCurve, "EC")
c0f39ded
SL
730DOMAIN_KEYS(ECExplicitTri2G);
731IMPLEMENT_TEST_SUITE(ECExplicitTri2G, "EC")
bddfea02 732IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTri2G, "EC")
c0f39ded 733# endif
7c664b1f
RL
734KEYS(ED25519);
735IMPLEMENT_TEST_SUITE(ED25519, "ED25519")
736KEYS(ED448);
737IMPLEMENT_TEST_SUITE(ED448, "ED448")
738KEYS(X25519);
739IMPLEMENT_TEST_SUITE(X25519, "X25519")
740KEYS(X448);
741IMPLEMENT_TEST_SUITE(X448, "X448")
bddfea02
RL
742/*
743 * ED25519, ED448, X25519 and X448 have no support for
744 * PEM_write_bio_PrivateKey_traditional(), so no legacy tests.
745 */
7c664b1f
RL
746#endif
747KEYS(RSA);
748IMPLEMENT_TEST_SUITE(RSA, "RSA")
bddfea02 749IMPLEMENT_TEST_SUITE_LEGACY(RSA, "RSA")
7c664b1f
RL
750KEYS(RSA_PSS);
751IMPLEMENT_TEST_SUITE(RSA_PSS, "RSA-PSS")
bddfea02
RL
752/*
753 * RSA-PSS has no support for PEM_write_bio_PrivateKey_traditional(),
754 * so no legacy tests.
755 */
a7922e20
RL
756#ifndef OPENSSL_NO_DSA
757IMPLEMENT_TEST_SUITE_MSBLOB(RSA, "RSA")
758# ifndef OPENSSL_NO_RC4
759IMPLEMENT_TEST_SUITE_PVK(RSA, "RSA")
760# endif
761#endif
3ff8159a 762
c0f39ded
SL
763#ifndef OPENSSL_NO_EC
764/* Explicit parameters that match a named curve */
765static int do_create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld,
766 const unsigned char *gen,
767 size_t gen_len)
768{
769 BIGNUM *a, *b, *prime, *order;
770
771 /* Curve prime256v1 */
772 static const unsigned char prime_data[] = {
773 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
774 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
775 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
776 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
777 0xff
778 };
779 static const unsigned char a_data[] = {
780 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
781 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
783 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
784 0xfc
785 };
786 static const unsigned char b_data[] = {
787 0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7,
788 0xb3, 0xeb, 0xbd, 0x55, 0x76, 0x98, 0x86, 0xbc,
789 0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53, 0xb0, 0xf6,
790 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b
791 };
792 static const unsigned char seed[] = {
793 0xc4, 0x9d, 0x36, 0x08, 0x86, 0xe7, 0x04, 0x93,
794 0x6a, 0x66, 0x78, 0xe1, 0x13, 0x9d, 0x26, 0xb7,
795 0x81, 0x9f, 0x7e, 0x90
796 };
797 static const unsigned char order_data[] = {
798 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
799 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
800 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e,
801 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51
802 };
803 return TEST_ptr(a = BN_CTX_get(bnctx))
804 && TEST_ptr(b = BN_CTX_get(bnctx))
805 && TEST_ptr(prime = BN_CTX_get(bnctx))
806 && TEST_ptr(order = BN_CTX_get(bnctx))
807 && TEST_ptr(BN_bin2bn(prime_data, sizeof(prime_data), prime))
808 && TEST_ptr(BN_bin2bn(a_data, sizeof(a_data), a))
809 && TEST_ptr(BN_bin2bn(b_data, sizeof(b_data), b))
810 && TEST_ptr(BN_bin2bn(order_data, sizeof(order_data), order))
811 && TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
812 OSSL_PKEY_PARAM_EC_FIELD_TYPE, SN_X9_62_prime_field,
813 0))
814 && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, prime))
815 && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
816 && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b))
817 && TEST_true(OSSL_PARAM_BLD_push_BN(bld,
818 OSSL_PKEY_PARAM_EC_ORDER, order))
819 && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
820 OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_len))
821 && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
822 OSSL_PKEY_PARAM_EC_SEED, seed, sizeof(seed)))
823 && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
824 BN_value_one()));
825}
826
827static int create_ec_explicit_prime_params_namedcurve(OSSL_PARAM_BLD *bld)
828{
829 static const unsigned char prime256v1_gen[] = {
830 0x04,
831 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47,
832 0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2,
833 0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0,
834 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96,
835 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b,
836 0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0x0f, 0x9e, 0x16,
837 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce,
838 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5
839 };
840 return do_create_ec_explicit_prime_params(bld, prime256v1_gen,
841 sizeof(prime256v1_gen));
842}
843
844static int create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld)
845{
846 /* 2G */
847 static const unsigned char prime256v1_gen2[] = {
848 0x04,
849 0xe4, 0x97, 0x08, 0xbe, 0x7d, 0xfa, 0xa2, 0x9a,
850 0xa3, 0x12, 0x6f, 0xe4, 0xe7, 0xd0, 0x25, 0xe3,
851 0x4a, 0xc1, 0x03, 0x15, 0x8c, 0xd9, 0x33, 0xc6,
852 0x97, 0x42, 0xf5, 0xdc, 0x97, 0xb9, 0xd7, 0x31,
853 0xe9, 0x7d, 0x74, 0x3d, 0x67, 0x6a, 0x3b, 0x21,
854 0x08, 0x9c, 0x31, 0x73, 0xf8, 0xc1, 0x27, 0xc9,
855 0xd2, 0xa0, 0xa0, 0x83, 0x66, 0xe0, 0xc9, 0xda,
856 0xa8, 0xc6, 0x56, 0x2b, 0x94, 0xb1, 0xae, 0x55
857 };
858 return do_create_ec_explicit_prime_params(bld, prime256v1_gen2,
859 sizeof(prime256v1_gen2));
860}
861
862# ifndef OPENSSL_NO_EC2M
863static int do_create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld,
864 const unsigned char *gen,
865 size_t gen_len)
866{
867 BIGNUM *a, *b, *poly, *order, *cofactor;
868 /* sect233k1 characteristic-two-field tpBasis */
869 static const unsigned char poly_data[] = {
870 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
871 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
872 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
873 };
874 static const unsigned char a_data[] = {
875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
877 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
878 };
879 static const unsigned char b_data[] = {
880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
882 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
883 };
884 static const unsigned char order_data[] = {
885 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
886 0x00, 0x00, 0x00, 0x06, 0x9D, 0x5B, 0xB9, 0x15, 0xBC, 0xD4, 0x6E, 0xFB,
887 0x1A, 0xD5, 0xF1, 0x73, 0xAB, 0xDF
888 };
889 static const unsigned char cofactor_data[]= {
890 0x4
891 };
892 return TEST_ptr(a = BN_CTX_get(bnctx))
893 && TEST_ptr(b = BN_CTX_get(bnctx))
894 && TEST_ptr(poly = BN_CTX_get(bnctx))
895 && TEST_ptr(order = BN_CTX_get(bnctx))
896 && TEST_ptr(cofactor = BN_CTX_get(bnctx))
897 && TEST_ptr(BN_bin2bn(poly_data, sizeof(poly_data), poly))
898 && TEST_ptr(BN_bin2bn(a_data, sizeof(a_data), a))
899 && TEST_ptr(BN_bin2bn(b_data, sizeof(b_data), b))
900 && TEST_ptr(BN_bin2bn(order_data, sizeof(order_data), order))
901 && TEST_ptr(BN_bin2bn(cofactor_data, sizeof(cofactor_data), cofactor))
902 && TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
903 OSSL_PKEY_PARAM_EC_FIELD_TYPE,
904 SN_X9_62_characteristic_two_field, 0))
905 && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_P, poly))
906 && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_A, a))
907 && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_B, b))
908 && TEST_true(OSSL_PARAM_BLD_push_BN(bld,
909 OSSL_PKEY_PARAM_EC_ORDER, order))
910 && TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
911 OSSL_PKEY_PARAM_EC_GENERATOR, gen, gen_len))
912 && TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_EC_COFACTOR,
913 cofactor));
914}
915
916static int create_ec_explicit_trinomial_params_namedcurve(OSSL_PARAM_BLD *bld)
917{
918 static const unsigned char gen[] = {
919 0x04,
920 0x01, 0x72, 0x32, 0xBA, 0x85, 0x3A, 0x7E, 0x73, 0x1A, 0xF1, 0x29, 0xF2,
921 0x2F, 0xF4, 0x14, 0x95, 0x63, 0xA4, 0x19, 0xC2, 0x6B, 0xF5, 0x0A, 0x4C,
922 0x9D, 0x6E, 0xEF, 0xAD, 0x61, 0x26,
923 0x01, 0xDB, 0x53, 0x7D, 0xEC, 0xE8, 0x19, 0xB7, 0xF7, 0x0F, 0x55, 0x5A,
924 0x67, 0xC4, 0x27, 0xA8, 0xCD, 0x9B, 0xF1, 0x8A, 0xEB, 0x9B, 0x56, 0xE0,
925 0xC1, 0x10, 0x56, 0xFA, 0xE6, 0xA3
926 };
927 return do_create_ec_explicit_trinomial_params(bld, gen, sizeof(gen));
928}
929
930static int create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld)
931{
932 static const unsigned char gen2[] = {
933 0x04,
934 0x00, 0xd7, 0xba, 0xd0, 0x26, 0x6c, 0x31, 0x6a, 0x78, 0x76, 0x01, 0xd1,
935 0x32, 0x4b, 0x8f, 0x30, 0x29, 0x2d, 0x78, 0x30, 0xca, 0x43, 0xaa, 0xf0,
936 0xa2, 0x5a, 0xd4, 0x0f, 0xb3, 0xf4,
937 0x00, 0x85, 0x4b, 0x1b, 0x8d, 0x50, 0x10, 0xa5, 0x1c, 0x80, 0xf7, 0x86,
938 0x40, 0x62, 0x4c, 0x87, 0xd1, 0x26, 0x7a, 0x9c, 0x5c, 0xe9, 0x82, 0x29,
939 0xd1, 0x67, 0x70, 0x41, 0xea, 0xcb
940 };
941 return do_create_ec_explicit_trinomial_params(bld, gen2, sizeof(gen2));
942}
943# endif /* OPENSSL_NO_EC2M */
944#endif /* OPENSSL_NO_EC */
945
5a23d78c
RL
946int setup_tests(void)
947{
7c664b1f
RL
948 int ok = 1;
949
a7922e20
RL
950#ifndef OPENSSL_NO_DSA
951 static size_t qbits = 160; /* PVK only tolerates 160 Q bits */
952 static size_t pbits = 1024; /* With 160 Q bits, we MUST use 1024 P bits */
953 OSSL_PARAM DSA_params[] = {
954 OSSL_PARAM_size_t("pbits", &pbits),
955 OSSL_PARAM_size_t("qbits", &qbits),
956 OSSL_PARAM_END
957 };
958#endif
959
7c664b1f
RL
960#ifndef OPENSSL_NO_EC
961 static char groupname[] = "prime256v1";
962 OSSL_PARAM EC_params[] = {
963 OSSL_PARAM_utf8_string("group", groupname, sizeof(groupname) - 1),
964 OSSL_PARAM_END
965 };
966#endif
967
968 /* 7 is the default magic number */
969 static unsigned int rsapss_min_saltlen = 7;
970 OSSL_PARAM RSA_PSS_params[] = {
971 OSSL_PARAM_uint("saltlen", &rsapss_min_saltlen),
972 OSSL_PARAM_END
973 };
974
c0f39ded
SL
975#ifndef OPENSSL_NO_EC
976 if (!TEST_ptr(bnctx = BN_CTX_new_ex(NULL))
977 || !TEST_ptr(bld_prime_nc = OSSL_PARAM_BLD_new())
978 || !TEST_ptr(bld_prime = OSSL_PARAM_BLD_new())
979 || !create_ec_explicit_prime_params_namedcurve(bld_prime_nc)
980 || !create_ec_explicit_prime_params(bld_prime)
981 || !TEST_ptr(ec_explicit_prime_params_nc = OSSL_PARAM_BLD_to_param(bld_prime_nc))
982 || !TEST_ptr(ec_explicit_prime_params_explicit = OSSL_PARAM_BLD_to_param(bld_prime))
983# ifndef OPENSSL_NO_EC2M
984 || !TEST_ptr(bld_tri_nc = OSSL_PARAM_BLD_new())
985 || !TEST_ptr(bld_tri = OSSL_PARAM_BLD_new())
986 || !create_ec_explicit_trinomial_params_namedcurve(bld_tri_nc)
987 || !create_ec_explicit_trinomial_params(bld_tri)
988 || !TEST_ptr(ec_explicit_tri_params_nc = OSSL_PARAM_BLD_to_param(bld_tri_nc))
989 || !TEST_ptr(ec_explicit_tri_params_explicit = OSSL_PARAM_BLD_to_param(bld_tri))
990# endif
991 )
992 return 0;
993#endif
994
e2ac846e 995 TEST_info("Generating keys...");
c0f39ded 996
7c664b1f
RL
997#ifndef OPENSSL_NO_DH
998 MAKE_DOMAIN_KEYS(DH, "DH", NULL);
31d2daec 999 MAKE_DOMAIN_KEYS(DHX, "X9.42 DH", NULL);
7c664b1f
RL
1000#endif
1001#ifndef OPENSSL_NO_DSA
a7922e20 1002 MAKE_DOMAIN_KEYS(DSA, "DSA", DSA_params);
7c664b1f
RL
1003#endif
1004#ifndef OPENSSL_NO_EC
1005 MAKE_DOMAIN_KEYS(EC, "EC", EC_params);
c0f39ded
SL
1006 MAKE_DOMAIN_KEYS(ECExplicitPrimeNamedCurve, "EC", ec_explicit_prime_params_nc);
1007 MAKE_DOMAIN_KEYS(ECExplicitPrime2G, "EC", ec_explicit_prime_params_explicit);
1008# ifndef OPENSSL_NO_EC2M
1009 MAKE_DOMAIN_KEYS(ECExplicitTriNamedCurve, "EC", ec_explicit_tri_params_nc);
1010 MAKE_DOMAIN_KEYS(ECExplicitTri2G, "EC", ec_explicit_tri_params_explicit);
1011# endif
7c664b1f
RL
1012 MAKE_KEYS(ED25519, "ED25519", NULL);
1013 MAKE_KEYS(ED448, "ED448", NULL);
1014 MAKE_KEYS(X25519, "X25519", NULL);
1015 MAKE_KEYS(X448, "X448", NULL);
1016#endif
1017 MAKE_KEYS(RSA, "RSA", NULL);
1018 MAKE_KEYS(RSA_PSS, "RSA-PSS", RSA_PSS_params);
5a23d78c
RL
1019 TEST_info("Generating key... done");
1020
7c664b1f
RL
1021 if (ok) {
1022#ifndef OPENSSL_NO_DH
1023 ADD_TEST_SUITE(DH);
31d2daec 1024 ADD_TEST_SUITE(DHX);
bddfea02
RL
1025 /*
1026 * DH has no support for PEM_write_bio_PrivateKey_traditional(),
1027 * so no legacy tests.
1028 */
7c664b1f
RL
1029#endif
1030#ifndef OPENSSL_NO_DSA
1031 ADD_TEST_SUITE(DSA);
bddfea02 1032 ADD_TEST_SUITE_LEGACY(DSA);
a7922e20
RL
1033 ADD_TEST_SUITE_MSBLOB(DSA);
1034# ifndef OPENSSL_NO_RC4
1035 ADD_TEST_SUITE_PVK(DSA);
1036# endif
7c664b1f
RL
1037#endif
1038#ifndef OPENSSL_NO_EC
1039 ADD_TEST_SUITE(EC);
bddfea02 1040 ADD_TEST_SUITE_LEGACY(EC);
c0f39ded 1041 ADD_TEST_SUITE(ECExplicitPrimeNamedCurve);
bddfea02 1042 ADD_TEST_SUITE_LEGACY(ECExplicitPrimeNamedCurve);
c0f39ded 1043 ADD_TEST_SUITE(ECExplicitPrime2G);
bddfea02 1044 ADD_TEST_SUITE_LEGACY(ECExplicitPrime2G);
c0f39ded
SL
1045# ifndef OPENSSL_NO_EC2M
1046 ADD_TEST_SUITE(ECExplicitTriNamedCurve);
bddfea02 1047 ADD_TEST_SUITE_LEGACY(ECExplicitTriNamedCurve);
c0f39ded 1048 ADD_TEST_SUITE(ECExplicitTri2G);
bddfea02 1049 ADD_TEST_SUITE_LEGACY(ECExplicitTri2G);
c0f39ded 1050# endif
7c664b1f
RL
1051 ADD_TEST_SUITE(ED25519);
1052 ADD_TEST_SUITE(ED448);
1053 ADD_TEST_SUITE(X25519);
1054 ADD_TEST_SUITE(X448);
bddfea02
RL
1055 /*
1056 * ED25519, ED448, X25519 and X448 have no support for
1057 * PEM_write_bio_PrivateKey_traditional(), so no legacy tests.
1058 */
7c664b1f
RL
1059#endif
1060 ADD_TEST_SUITE(RSA);
bddfea02 1061 ADD_TEST_SUITE_LEGACY(RSA);
7c664b1f 1062 ADD_TEST_SUITE(RSA_PSS);
bddfea02
RL
1063 /*
1064 * RSA-PSS has no support for PEM_write_bio_PrivateKey_traditional(),
1065 * so no legacy tests.
1066 */
a7922e20
RL
1067#ifndef OPENSSL_NO_DSA
1068 ADD_TEST_SUITE_MSBLOB(RSA);
1069# ifndef OPENSSL_NO_RC4
1070 ADD_TEST_SUITE_PVK(RSA);
1071# endif
1072#endif
7c664b1f 1073 }
5a23d78c
RL
1074
1075 return 1;
1076}
7c664b1f
RL
1077
1078void cleanup_tests(void)
1079{
c0f39ded
SL
1080#ifndef OPENSSL_NO_EC
1081 OSSL_PARAM_BLD_free_params(ec_explicit_prime_params_nc);
1082 OSSL_PARAM_BLD_free_params(ec_explicit_prime_params_explicit);
1083 OSSL_PARAM_BLD_free(bld_prime_nc);
1084 OSSL_PARAM_BLD_free(bld_prime);
1085# ifndef OPENSSL_NO_EC2M
1086 OSSL_PARAM_BLD_free_params(ec_explicit_tri_params_nc);
1087 OSSL_PARAM_BLD_free_params(ec_explicit_tri_params_explicit);
1088 OSSL_PARAM_BLD_free(bld_tri_nc);
1089 OSSL_PARAM_BLD_free(bld_tri);
1090# endif
1091 BN_CTX_free(bnctx);
1092#endif /* OPENSSL_NO_EC */
1093
7c664b1f
RL
1094#ifndef OPENSSL_NO_DH
1095 FREE_DOMAIN_KEYS(DH);
31d2daec 1096 FREE_DOMAIN_KEYS(DHX);
7c664b1f
RL
1097#endif
1098#ifndef OPENSSL_NO_DSA
1099 FREE_DOMAIN_KEYS(DSA);
1100#endif
1101#ifndef OPENSSL_NO_EC
1102 FREE_DOMAIN_KEYS(EC);
c0f39ded
SL
1103 FREE_DOMAIN_KEYS(ECExplicitPrimeNamedCurve);
1104 FREE_DOMAIN_KEYS(ECExplicitPrime2G);
1105# ifndef OPENSSL_NO_EC2M
1106 FREE_DOMAIN_KEYS(ECExplicitTriNamedCurve);
1107 FREE_DOMAIN_KEYS(ECExplicitTri2G);
1108# endif
7c664b1f
RL
1109 FREE_KEYS(ED25519);
1110 FREE_KEYS(ED448);
1111 FREE_KEYS(X25519);
1112 FREE_KEYS(X448);
1113#endif
1114 FREE_KEYS(RSA);
1115 FREE_KEYS(RSA_PSS);
1116}