]> git.ipfire.org Git - thirdparty/openssl.git/blame - test/evp_pkey_provided_test.c
TEST: Adapt applicable tests to the changed OSSL_ENCODER_CTX_new_by_EVP_PKEY()
[thirdparty/openssl.git] / test / evp_pkey_provided_test.c
CommitLineData
6ae5543c 1/*
f552d900 2 * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
6ae5543c
RL
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
96ebe52e 10#include <string.h> /* memset */
6ae5543c
RL
11#include <openssl/evp.h>
12#include <openssl/pem.h>
ece9304c 13#include <openssl/encoder.h>
6ae5543c 14#include <openssl/provider.h>
7165593c 15#include <openssl/param_build.h>
6ae5543c 16#include <openssl/core_names.h>
8efc4a9c 17#include "crypto/ecx.h"
6ae5543c 18#include "crypto/evp.h" /* For the internal API */
7165593c
SL
19#include "crypto/bn_dh.h" /* _bignum_ffdhe2048_p */
20#include "internal/nelem.h"
6ae5543c
RL
21#include "testutil.h"
22
8efc4a9c
MC
23static char *datadir = NULL;
24
25#define PRIV_TEXT 0
26#define PRIV_PEM 1
27#define PRIV_DER 2
28#define PUB_TEXT 3
29#define PUB_PEM 4
30#define PUB_DER 5
31
32static void stripcr(char *buf, size_t *len)
33{
34 size_t i;
35 char *curr, *writ;
36
37 for (i = *len, curr = buf, writ = buf; i > 0; i--, curr++) {
38 if (*curr == '\r') {
39 (*len)--;
40 continue;
41 }
42 if (curr != writ)
43 *writ = *curr;
44 writ++;
45 }
46}
47
48static int compare_with_file(const char *alg, int type, BIO *membio)
49{
50 char filename[80];
51 BIO *file = NULL;
b03ec3b5 52 char buf[4096];
8efc4a9c
MC
53 char *memdata, *fullfile = NULL;
54 const char *suffix;
55 size_t readbytes;
56 int ret = 0;
57 int len;
58 size_t slen;
59
60 switch (type) {
61 case PRIV_TEXT:
62 suffix = "priv.txt";
63 break;
64
65 case PRIV_PEM:
66 suffix = "priv.pem";
67 break;
68
69 case PRIV_DER:
70 suffix = "priv.der";
71 break;
72
73 case PUB_TEXT:
74 suffix = "pub.txt";
75 break;
76
77 case PUB_PEM:
78 suffix = "pub.pem";
79 break;
80
81 case PUB_DER:
82 suffix = "pub.der";
83 break;
84
85 default:
86 TEST_error("Invalid file type");
87 goto err;
88 }
89
90 BIO_snprintf(filename, sizeof(filename), "%s.%s", alg, suffix);
91 fullfile = test_mk_file_path(datadir, filename);
92 if (!TEST_ptr(fullfile))
93 goto err;
94
95 file = BIO_new_file(fullfile, "rb");
96 if (!TEST_ptr(file))
97 goto err;
98
99 if (!TEST_true(BIO_read_ex(file, buf, sizeof(buf), &readbytes))
100 || !TEST_true(BIO_eof(file))
101 || !TEST_size_t_lt(readbytes, sizeof(buf)))
102 goto err;
103
104 len = BIO_get_mem_data(membio, &memdata);
105 if (!TEST_int_gt(len, 0))
106 goto err;
107
108 slen = len;
109 if (type != PRIV_DER && type != PUB_DER) {
110 stripcr(memdata, &slen);
111 stripcr(buf, &readbytes);
112 }
113
114 if (!TEST_mem_eq(memdata, slen, buf, readbytes))
115 goto err;
116
117 ret = 1;
118 err:
119 OPENSSL_free(fullfile);
120 (void)BIO_reset(membio);
121 BIO_free(file);
122 return ret;
123}
124
125static int test_print_key_using_pem(const char *alg, const EVP_PKEY *pk)
6ae5543c 126{
8efc4a9c
MC
127 BIO *membio = BIO_new(BIO_s_mem());
128 int ret = 0;
129
130 if (!TEST_ptr(membio))
131 goto err;
132
d59b7a54
RL
133 if (/* Output Encrypted private key in PEM form */
134 !TEST_true(PEM_write_bio_PrivateKey(bio_out, pk, EVP_aes_256_cbc(),
135 (unsigned char *)"pass", 4,
136 NULL, NULL))
137 /* Private key in text form */
138 || !TEST_true(EVP_PKEY_print_private(membio, pk, 0, NULL))
8efc4a9c 139 || !TEST_true(compare_with_file(alg, PRIV_TEXT, membio))
6ae5543c 140 /* Public key in PEM form */
8efc4a9c
MC
141 || !TEST_true(PEM_write_bio_PUBKEY(membio, pk))
142 || !TEST_true(compare_with_file(alg, PUB_PEM, membio))
6ae5543c 143 /* Unencrypted private key in PEM form */
8efc4a9c 144 || !TEST_true(PEM_write_bio_PrivateKey(membio, pk,
6ae5543c 145 NULL, NULL, 0, NULL, NULL))
d59b7a54 146 || !TEST_true(compare_with_file(alg, PRIV_PEM, membio)))
8efc4a9c 147 goto err;
6ae5543c 148
8efc4a9c
MC
149 ret = 1;
150 err:
151 BIO_free(membio);
152 return ret;
6ae5543c
RL
153}
154
ece9304c 155static int test_print_key_type_using_encoder(const char *alg, int type,
ae12eac0 156 const EVP_PKEY *pk)
6ae5543c 157{
ae12eac0
RL
158 const char *output_type;
159 int selection;
ece9304c 160 OSSL_ENCODER_CTX *ctx = NULL;
8efc4a9c 161 BIO *membio = BIO_new(BIO_s_mem());
f552d900 162 int ret = 0;
6ae5543c 163
8efc4a9c
MC
164 switch (type) {
165 case PRIV_TEXT:
ae12eac0
RL
166 output_type = "TEXT";
167 selection = OSSL_KEYMGMT_SELECT_KEYPAIR
168 | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
8efc4a9c
MC
169 break;
170
171 case PRIV_PEM:
ae12eac0
RL
172 output_type = "PEM";
173 selection = OSSL_KEYMGMT_SELECT_KEYPAIR
174 | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
8efc4a9c
MC
175 break;
176
177 case PRIV_DER:
ae12eac0
RL
178 output_type = "DER";
179 selection = OSSL_KEYMGMT_SELECT_KEYPAIR
180 | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
8efc4a9c
MC
181 break;
182
183 case PUB_TEXT:
ae12eac0
RL
184 output_type = "TEXT";
185 selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
186 | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
8efc4a9c
MC
187 break;
188
189 case PUB_PEM:
ae12eac0
RL
190 output_type = "PEM";
191 selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
192 | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
8efc4a9c
MC
193 break;
194
195 case PUB_DER:
ae12eac0
RL
196 output_type = "DER";
197 selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
198 | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
8efc4a9c
MC
199 break;
200
201 default:
ece9304c 202 TEST_error("Invalid encoding type");
8efc4a9c
MC
203 goto err;
204 }
205
f552d900 206 if (!TEST_ptr(membio))
8efc4a9c 207 goto err;
8efc4a9c 208
6ae5543c 209 /* Make a context, it's valid for several prints */
ece9304c 210 TEST_note("Setting up a OSSL_ENCODER context with passphrase");
ae12eac0
RL
211 if (!TEST_ptr(ctx = OSSL_ENCODER_CTX_new_by_EVP_PKEY(pk, output_type,
212 selection,
213 NULL, NULL))
6ae5543c 214 /* Check that this operation is supported */
ae12eac0 215 || !TEST_int_ne(OSSL_ENCODER_CTX_get_num_encoders(ctx), 0))
6ae5543c
RL
216 goto err;
217
218 /* Use no cipher. This should give us an unencrypted PEM */
8efc4a9c 219 TEST_note("Testing with no encryption");
ece9304c 220 if (!TEST_true(OSSL_ENCODER_to_bio(ctx, membio))
8efc4a9c 221 || !TEST_true(compare_with_file(alg, type, membio)))
f552d900 222 goto err;
6ae5543c 223
8efc4a9c
MC
224 if (type == PRIV_PEM) {
225 /* Set a passphrase to be used later */
ece9304c 226 if (!TEST_true(OSSL_ENCODER_CTX_set_passphrase(ctx,
8efc4a9c
MC
227 (unsigned char *)"pass",
228 4)))
229 goto err;
6ae5543c 230
8efc4a9c
MC
231 /* Use a valid cipher name */
232 TEST_note("Displaying PEM encrypted with AES-256-CBC");
ece9304c
RL
233 if (!TEST_true(OSSL_ENCODER_CTX_set_cipher(ctx, "AES-256-CBC", NULL))
234 || !TEST_true(OSSL_ENCODER_to_bio(ctx, bio_out)))
f552d900 235 goto err;
6ae5543c 236
8efc4a9c
MC
237 /* Use an invalid cipher name, which should generate no output */
238 TEST_note("NOT Displaying PEM encrypted with (invalid) FOO");
ece9304c
RL
239 if (!TEST_false(OSSL_ENCODER_CTX_set_cipher(ctx, "FOO", NULL))
240 || !TEST_false(OSSL_ENCODER_to_bio(ctx, bio_out)))
f552d900 241 goto err;
8efc4a9c
MC
242
243 /* Clear the cipher. This should give us an unencrypted PEM again */
244 TEST_note("Testing with encryption cleared (no encryption)");
ece9304c
RL
245 if (!TEST_true(OSSL_ENCODER_CTX_set_cipher(ctx, NULL, NULL))
246 || !TEST_true(OSSL_ENCODER_to_bio(ctx, membio))
8efc4a9c 247 || !TEST_true(compare_with_file(alg, type, membio)))
f552d900 248 goto err;
8efc4a9c 249 }
f552d900 250 ret = 1;
6ae5543c 251err:
8efc4a9c 252 BIO_free(membio);
ece9304c 253 OSSL_ENCODER_CTX_free(ctx);
6ae5543c
RL
254 return ret;
255}
256
ece9304c 257static int test_print_key_using_encoder(const char *alg, const EVP_PKEY *pk)
8efc4a9c
MC
258{
259 int i;
260 int ret = 1;
261
262 for (i = 0; i < 6; i++)
ece9304c 263 ret = ret && test_print_key_type_using_encoder(alg, i, pk);
8efc4a9c
MC
264
265 return ret;
266}
267
6ae5543c
RL
268/* Array indexes used in test_fromdata_rsa */
269#define N 0
270#define E 1
271#define D 2
272#define P 3
273#define Q 4
274#define DP 5
275#define DQ 6
276#define QINV 7
277
278static int test_fromdata_rsa(void)
279{
96ebe52e 280 int ret = 0, i;
12603de6 281 EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
ff7262b4 282 EVP_PKEY *pk = NULL, *copy_pk = NULL;
6ae5543c
RL
283 /*
284 * 32-bit RSA key, extracted from this command,
285 * executed with OpenSSL 1.0.2:
286 *
287 * openssl genrsa 32 | openssl rsa -text
288 */
289 static unsigned long key_numbers[] = {
290 0xbc747fc5, /* N */
291 0x10001, /* E */
292 0x7b133399, /* D */
293 0xe963, /* P */
294 0xceb7, /* Q */
295 0x8599, /* DP */
296 0xbd87, /* DQ */
297 0xcc3b, /* QINV */
298 };
299 OSSL_PARAM fromdata_params[] = {
300 OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_N, &key_numbers[N]),
301 OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_E, &key_numbers[E]),
302 OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_D, &key_numbers[D]),
96ebe52e
SL
303 OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_FACTOR1, &key_numbers[P]),
304 OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_FACTOR2, &key_numbers[Q]),
305 OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_EXPONENT1, &key_numbers[DP]),
306 OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_EXPONENT2, &key_numbers[DQ]),
307 OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_COEFFICIENT1, &key_numbers[QINV]),
6ae5543c
RL
308 OSSL_PARAM_END
309 };
96ebe52e
SL
310 BIGNUM *bn = BN_new();
311 BIGNUM *bn_from = BN_new();
6ae5543c 312
e683582b 313 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL)))
6ae5543c
RL
314 goto err;
315
316 if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
81a624f2
RL
317 || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
318 || !TEST_int_eq(EVP_PKEY_bits(pk), 32)
319 || !TEST_int_eq(EVP_PKEY_security_bits(pk), 8)
320 || !TEST_int_eq(EVP_PKEY_size(pk), 4))
6ae5543c
RL
321 goto err;
322
12603de6
SL
323 if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
324 goto err;
325
326 if (!TEST_true(EVP_PKEY_check(key_ctx))
327 || !TEST_true(EVP_PKEY_public_check(key_ctx))
328 || !TEST_true(EVP_PKEY_private_check(key_ctx))
329 || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
330 goto err;
331
ff7262b4
RL
332 /* EVP_PKEY_copy_parameters() should fail for RSA */
333 if (!TEST_ptr(copy_pk = EVP_PKEY_new())
334 || !TEST_false(EVP_PKEY_copy_parameters(copy_pk, pk)))
335 goto err;
336
96ebe52e
SL
337 for (i = 0; fromdata_params[i].key != NULL; ++i) {
338 if (!TEST_true(BN_set_word(bn_from, key_numbers[i]))
339 || !TEST_true(EVP_PKEY_get_bn_param(pk, fromdata_params[i].key, &bn))
340 || !TEST_BN_eq(bn, bn_from))
341 goto err;
342 }
8efc4a9c 343 ret = test_print_key_using_pem("RSA", pk)
ece9304c 344 && test_print_key_using_encoder("RSA", pk);
6ae5543c 345 err:
96ebe52e
SL
346 BN_free(bn_from);
347 BN_free(bn);
6ae5543c 348 EVP_PKEY_free(pk);
ff7262b4 349 EVP_PKEY_free(copy_pk);
12603de6 350 EVP_PKEY_CTX_free(key_ctx);
6ae5543c
RL
351 EVP_PKEY_CTX_free(ctx);
352
353 return ret;
354}
355
96ebe52e
SL
356static int test_evp_pkey_get_bn_param_large(void)
357{
358 int ret = 0;
359 EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
360 EVP_PKEY *pk = NULL;
361 OSSL_PARAM_BLD *bld = NULL;
362 OSSL_PARAM *fromdata_params = NULL;
363 BIGNUM *n = NULL, *e = NULL, *d = NULL, *n_out = NULL;
364 /*
365 * The buffer size chosen here for n_data larger than the buffer used
366 * internally in EVP_PKEY_get_bn_param.
367 */
368 static unsigned char n_data[2050];
369 static const unsigned char e_data[] = {
370 0x1, 0x00, 0x01
371 };
372 static const unsigned char d_data[]= {
373 0x99, 0x33, 0x13, 0x7b
374 };
375
376 /* N is a large buffer */
377 memset(n_data, 0xCE, sizeof(n_data));
378
379 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
380 || !TEST_ptr(n = BN_bin2bn(n_data, sizeof(n_data), NULL))
381 || !TEST_ptr(e = BN_bin2bn(e_data, sizeof(e_data), NULL))
382 || !TEST_ptr(d = BN_bin2bn(d_data, sizeof(d_data), NULL))
383 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
384 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
385 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d))
386 || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld))
387 || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL))
388 || !TEST_true(EVP_PKEY_key_fromdata_init(ctx))
389 || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
390 || !TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, ""))
391 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_RSA_N, &n_out))
392 || !TEST_BN_eq(n, n_out))
393 goto err;
394 ret = 1;
395 err:
396 BN_free(n_out);
397 BN_free(n);
398 BN_free(e);
399 BN_free(d);
400 EVP_PKEY_free(pk);
401 EVP_PKEY_CTX_free(key_ctx);
402 EVP_PKEY_CTX_free(ctx);
403 OSSL_PARAM_BLD_free_params(fromdata_params);
404 OSSL_PARAM_BLD_free(bld);
405 return ret;
406}
407
408
285c6913 409#ifndef OPENSSL_NO_DH
7165593c 410static int test_fromdata_dh_named_group(void)
6ae5543c
RL
411{
412 int ret = 0;
7165593c 413 int gindex = 0, pcounter = 0, hindex = 0;
a54ff473 414 EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
ff7262b4 415 EVP_PKEY *pk = NULL, *copy_pk = NULL;
7165593c
SL
416 size_t len;
417 BIGNUM *pub = NULL, *priv = NULL;
418 BIGNUM *pub_out = NULL, *priv_out = NULL;
419 BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
420 OSSL_PARAM *fromdata_params = NULL;
421 OSSL_PARAM_BLD *bld = NULL;
422 char name_out[80];
423 unsigned char seed_out[32];
424
6ae5543c 425 /*
7165593c 426 * DH key data was generated using the following:
738ee181
SL
427 * openssl genpkey -algorithm DH -pkeyopt group:ffdhe2048
428 * -pkeyopt priv_len:224 -text
6ae5543c 429 */
7165593c
SL
430 static const unsigned char priv_data[] = {
431 0x88, 0x85, 0xe7, 0x9f, 0xee, 0x6d, 0xc5, 0x7c, 0x78, 0xaf, 0x63, 0x5d,
432 0x38, 0x2a, 0xd0, 0xed, 0x56, 0x4b, 0x47, 0x21, 0x2b, 0xfa, 0x55, 0xfa,
433 0x87, 0xe8, 0xa9, 0x7b,
6ae5543c 434 };
7165593c
SL
435 static const unsigned char pub_data[] = {
436 0x00, 0xd6, 0x2d, 0x77, 0xe0, 0xd3, 0x7d, 0xf8, 0xeb, 0x98, 0x50, 0xa1,
437 0x82, 0x22, 0x65, 0xd5, 0xd9, 0xfe, 0xc9, 0x3f, 0xbe, 0x16, 0x83, 0xbd,
438 0x33, 0xe9, 0xc6, 0x93, 0xcf, 0x08, 0xaf, 0x83, 0xfa, 0x80, 0x8a, 0x6c,
439 0x64, 0xdf, 0x70, 0x64, 0xd5, 0x0a, 0x7c, 0x5a, 0x72, 0xda, 0x66, 0xe6,
440 0xf9, 0xf5, 0x31, 0x21, 0x92, 0xb0, 0x60, 0x1a, 0xb5, 0xd3, 0xf0, 0xa5,
441 0xfa, 0x48, 0x95, 0x2e, 0x38, 0xd9, 0xc5, 0xe6, 0xda, 0xfb, 0x6c, 0x03,
442 0x9d, 0x4b, 0x69, 0xb7, 0x95, 0xe4, 0x5c, 0xc0, 0x93, 0x4f, 0x48, 0xd9,
443 0x7e, 0x06, 0x22, 0xb2, 0xde, 0xf3, 0x79, 0x24, 0xed, 0xe1, 0xd1, 0x4a,
444 0x57, 0xf1, 0x40, 0x86, 0x70, 0x42, 0x25, 0xc5, 0x27, 0x68, 0xc9, 0xfa,
445 0xe5, 0x8e, 0x62, 0x7e, 0xff, 0x49, 0x6c, 0x5b, 0xb5, 0xba, 0xf9, 0xef,
446 0x9a, 0x1a, 0x10, 0xd4, 0x81, 0x53, 0xcf, 0x83, 0x04, 0x18, 0x1c, 0xe1,
447 0xdb, 0xe1, 0x65, 0xa9, 0x7f, 0xe1, 0x33, 0xeb, 0xc3, 0x4f, 0xe3, 0xb7,
448 0x22, 0xf7, 0x1c, 0x09, 0x4f, 0xed, 0xc6, 0x07, 0x8e, 0x78, 0x05, 0x8f,
449 0x7c, 0x96, 0xd9, 0x12, 0xe0, 0x81, 0x74, 0x1a, 0xe9, 0x13, 0xc0, 0x20,
450 0x82, 0x65, 0xbb, 0x42, 0x3b, 0xed, 0x08, 0x6a, 0x84, 0x4f, 0xea, 0x77,
451 0x14, 0x32, 0xf9, 0xed, 0xc2, 0x12, 0xd6, 0xc5, 0xc6, 0xb3, 0xe5, 0xf2,
452 0x6e, 0xf6, 0x16, 0x7f, 0x37, 0xde, 0xbc, 0x09, 0xc7, 0x06, 0x6b, 0x12,
453 0xbc, 0xad, 0x2d, 0x49, 0x25, 0xd5, 0xdc, 0xf4, 0x18, 0x14, 0xd2, 0xf0,
454 0xf1, 0x1d, 0x1f, 0x3a, 0xaa, 0x15, 0x55, 0xbb, 0x0d, 0x7f, 0xbe, 0x67,
455 0xa1, 0xa7, 0xf0, 0xaa, 0xb3, 0xfb, 0x41, 0x82, 0x39, 0x49, 0x93, 0xbc,
456 0xa8, 0xee, 0x72, 0x13, 0x45, 0x65, 0x15, 0x42, 0x17, 0xaa, 0xd8, 0xab,
457 0xcf, 0x33, 0x42, 0x83, 0x42
6ae5543c 458 };
7165593c
SL
459 static const char group_name[] = "ffdhe2048";
460
461 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
462 || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
463 || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
464 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
023b188c 465 OSSL_PKEY_PARAM_GROUP_NAME,
7165593c
SL
466 group_name, 0))
467 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY, pub))
468 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, priv))
469 || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
470 goto err;
6ae5543c 471
e683582b 472 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL)))
6ae5543c
RL
473 goto err;
474
475 if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
81a624f2 476 || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
7165593c
SL
477 || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
478 || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
479 || !TEST_int_eq(EVP_PKEY_size(pk), 256))
480 goto err;
481
023b188c 482 if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
7165593c
SL
483 name_out, sizeof(name_out),
484 &len))
485 || !TEST_str_eq(name_out, group_name)
486 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
487 &pub_out))
488
489 || !TEST_BN_eq(pub, pub_out)
490 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
491 &priv_out))
492 || !TEST_BN_eq(priv, priv_out)
493 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
494 || !TEST_BN_eq(&_bignum_ffdhe2048_p, p)
495 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
496 || !TEST_ptr(q)
497 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
498 || !TEST_BN_eq(&_bignum_const_2, g)
499 || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
500 &j))
501 || !TEST_ptr_null(j)
502 || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
503 OSSL_PKEY_PARAM_FFC_SEED,
504 seed_out,
505 sizeof(seed_out), &len))
506 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
507 &gindex))
508 || !TEST_int_eq(gindex, -1)
509 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H, &hindex))
510 || !TEST_int_eq(hindex, 0)
511 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
512 &pcounter))
513 || !TEST_int_eq(pcounter, -1))
514 goto err;
515
516 if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
517 goto err;
518
519 if (!TEST_true(EVP_PKEY_check(key_ctx))
520 || !TEST_true(EVP_PKEY_public_check(key_ctx))
521 || !TEST_true(EVP_PKEY_private_check(key_ctx))
522 || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
6ae5543c
RL
523 goto err;
524
ff7262b4
RL
525 if (!TEST_ptr(copy_pk = EVP_PKEY_new())
526 || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
527 goto err;
528
7165593c 529 ret = test_print_key_using_pem("DH", pk)
ece9304c 530 && test_print_key_using_encoder("DH", pk);
7165593c
SL
531err:
532 BN_free(p);
533 BN_free(q);
534 BN_free(g);
535 BN_free(j);
536 BN_free(pub);
537 BN_free(priv);
538 BN_free(pub_out);
539 BN_free(priv_out);
540 EVP_PKEY_free(copy_pk);
541 EVP_PKEY_free(pk);
542 EVP_PKEY_CTX_free(ctx);
543 EVP_PKEY_CTX_free(key_ctx);
544 OSSL_PARAM_BLD_free_params(fromdata_params);
545 OSSL_PARAM_BLD_free(bld);
546
547 return ret;
548}
549
550static int test_fromdata_dh_fips186_4(void)
551{
552 int ret = 0;
553 int gindex = 0, pcounter = 0, hindex = 0;
554 EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
555 EVP_PKEY *pk = NULL;
556 size_t len;
557 BIGNUM *pub = NULL, *priv = NULL;
558 BIGNUM *pub_out = NULL, *priv_out = NULL;
559 BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
560 OSSL_PARAM_BLD *bld = NULL;
561 OSSL_PARAM *fromdata_params = NULL;
562 char name_out[80];
563 unsigned char seed_out[32];
564
565 /*
566 * DH key data was generated using the following:
738ee181
SL
567 * openssl genpkey -algorithm DH
568 * -pkeyopt group:ffdhe2048 -pkeyopt priv_len:224 -text
7165593c
SL
569 */
570 static const unsigned char priv_data[] = {
571 0x88, 0x85, 0xe7, 0x9f, 0xee, 0x6d, 0xc5, 0x7c, 0x78, 0xaf, 0x63, 0x5d,
572 0x38, 0x2a, 0xd0, 0xed, 0x56, 0x4b, 0x47, 0x21, 0x2b, 0xfa, 0x55, 0xfa,
573 0x87, 0xe8, 0xa9, 0x7b,
574 };
575 static const unsigned char pub_data[] = {
576 0xd6, 0x2d, 0x77, 0xe0, 0xd3, 0x7d, 0xf8, 0xeb, 0x98, 0x50, 0xa1, 0x82,
577 0x22, 0x65, 0xd5, 0xd9, 0xfe, 0xc9, 0x3f, 0xbe, 0x16, 0x83, 0xbd, 0x33,
578 0xe9, 0xc6, 0x93, 0xcf, 0x08, 0xaf, 0x83, 0xfa, 0x80, 0x8a, 0x6c, 0x64,
579 0xdf, 0x70, 0x64, 0xd5, 0x0a, 0x7c, 0x5a, 0x72, 0xda, 0x66, 0xe6, 0xf9,
580 0xf5, 0x31, 0x21, 0x92, 0xb0, 0x60, 0x1a, 0xb5, 0xd3, 0xf0, 0xa5, 0xfa,
581 0x48, 0x95, 0x2e, 0x38, 0xd9, 0xc5, 0xe6, 0xda, 0xfb, 0x6c, 0x03, 0x9d,
582 0x4b, 0x69, 0xb7, 0x95, 0xe4, 0x5c, 0xc0, 0x93, 0x4f, 0x48, 0xd9, 0x7e,
583 0x06, 0x22, 0xb2, 0xde, 0xf3, 0x79, 0x24, 0xed, 0xe1, 0xd1, 0x4a, 0x57,
584 0xf1, 0x40, 0x86, 0x70, 0x42, 0x25, 0xc5, 0x27, 0x68, 0xc9, 0xfa, 0xe5,
585 0x8e, 0x62, 0x7e, 0xff, 0x49, 0x6c, 0x5b, 0xb5, 0xba, 0xf9, 0xef, 0x9a,
586 0x1a, 0x10, 0xd4, 0x81, 0x53, 0xcf, 0x83, 0x04, 0x18, 0x1c, 0xe1, 0xdb,
587 0xe1, 0x65, 0xa9, 0x7f, 0xe1, 0x33, 0xeb, 0xc3, 0x4f, 0xe3, 0xb7, 0x22,
588 0xf7, 0x1c, 0x09, 0x4f, 0xed, 0xc6, 0x07, 0x8e, 0x78, 0x05, 0x8f, 0x7c,
589 0x96, 0xd9, 0x12, 0xe0, 0x81, 0x74, 0x1a, 0xe9, 0x13, 0xc0, 0x20, 0x82,
590 0x65, 0xbb, 0x42, 0x3b, 0xed, 0x08, 0x6a, 0x84, 0x4f, 0xea, 0x77, 0x14,
591 0x32, 0xf9, 0xed, 0xc2, 0x12, 0xd6, 0xc5, 0xc6, 0xb3, 0xe5, 0xf2, 0x6e,
592 0xf6, 0x16, 0x7f, 0x37, 0xde, 0xbc, 0x09, 0xc7, 0x06, 0x6b, 0x12, 0xbc,
593 0xad, 0x2d, 0x49, 0x25, 0xd5, 0xdc, 0xf4, 0x18, 0x14, 0xd2, 0xf0, 0xf1,
594 0x1d, 0x1f, 0x3a, 0xaa, 0x15, 0x55, 0xbb, 0x0d, 0x7f, 0xbe, 0x67, 0xa1,
595 0xa7, 0xf0, 0xaa, 0xb3, 0xfb, 0x41, 0x82, 0x39, 0x49, 0x93, 0xbc, 0xa8,
596 0xee, 0x72, 0x13, 0x45, 0x65, 0x15, 0x42, 0x17, 0xaa, 0xd8, 0xab, 0xcf,
597 0x33, 0x42, 0x83, 0x42
598 };
599 static const char group_name[] = "ffdhe2048";
600
601
602 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
603 || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
604 || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
605 || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
023b188c 606 OSSL_PKEY_PARAM_GROUP_NAME,
7165593c
SL
607 group_name, 0))
608 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY, pub))
609 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, priv))
610 || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
611 goto err;
612
613 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL)))
614 goto err;
615
616 if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
617 || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
618 || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
619 || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
620 || !TEST_int_eq(EVP_PKEY_size(pk), 256))
621 goto err;
622
023b188c 623 if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
7165593c
SL
624 name_out, sizeof(name_out),
625 &len))
626 || !TEST_str_eq(name_out, group_name)
627 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
628 &pub_out))
629 || !TEST_BN_eq(pub, pub_out)
630 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
631 &priv_out))
632 || !TEST_BN_eq(priv, priv_out)
633 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
634 || !TEST_BN_eq(&_bignum_ffdhe2048_p, p)
635 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
636 || !TEST_ptr(q)
637 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
638 || !TEST_BN_eq(&_bignum_const_2, g)
639 || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
640 &j))
641 || !TEST_ptr_null(j)
642 || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
643 OSSL_PKEY_PARAM_FFC_SEED,
644 seed_out,
645 sizeof(seed_out), &len))
646 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
647 &gindex))
648 || !TEST_int_eq(gindex, -1)
649 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H, &hindex))
650 || !TEST_int_eq(hindex, 0)
651 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
652 &pcounter))
653 || !TEST_int_eq(pcounter, -1))
654 goto err;
655
a54ff473
SL
656 if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
657 goto err;
658
7165593c 659 if (!TEST_true(EVP_PKEY_check(key_ctx))
a54ff473 660 || !TEST_true(EVP_PKEY_public_check(key_ctx))
7165593c
SL
661 || !TEST_true(EVP_PKEY_private_check(key_ctx))
662 || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
a54ff473
SL
663 goto err;
664
b03ec3b5 665 ret = test_print_key_using_pem("DH", pk)
ece9304c 666 && test_print_key_using_encoder("DH", pk);
7165593c
SL
667err:
668 BN_free(p);
669 BN_free(q);
670 BN_free(g);
671 BN_free(j);
672 BN_free(pub);
673 BN_free(priv);
674 BN_free(pub_out);
675 BN_free(priv_out);
8efc4a9c
MC
676 EVP_PKEY_free(pk);
677 EVP_PKEY_CTX_free(ctx);
a54ff473 678 EVP_PKEY_CTX_free(key_ctx);
7165593c
SL
679 OSSL_PARAM_BLD_free_params(fromdata_params);
680 OSSL_PARAM_BLD_free(bld);
8efc4a9c
MC
681
682 return ret;
683}
7165593c 684
8efc4a9c
MC
685#endif
686
7165593c
SL
687
688
8efc4a9c
MC
689#ifndef OPENSSL_NO_EC
690/* Array indexes used in test_fromdata_ecx */
691# define PRIV_KEY 0
692# define PUB_KEY 1
693
694# define X25519_IDX 0
695# define X448_IDX 1
244bc297
MC
696# define ED25519_IDX 2
697# define ED448_IDX 3
8efc4a9c
MC
698
699static int test_fromdata_ecx(int tst)
700{
701 int ret = 0;
702 EVP_PKEY_CTX *ctx = NULL;
ff7262b4 703 EVP_PKEY *pk = NULL, *copy_pk = NULL;
244bc297 704 const char *alg = NULL;
96ebe52e
SL
705 size_t len;
706 unsigned char out_pub[ED448_KEYLEN];
707 unsigned char out_priv[ED448_KEYLEN];
8efc4a9c 708
244bc297
MC
709 /* ED448_KEYLEN > X448_KEYLEN > X25519_KEYLEN == ED25519_KEYLEN */
710 static unsigned char key_numbers[4][2][ED448_KEYLEN] = {
8efc4a9c
MC
711 /* X25519: Keys from RFC 7748 6.1 */
712 {
713 /* Private Key */
714 {
715 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16,
716 0xc1, 0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87,
717 0xeb, 0xc0, 0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9,
718 0x2c, 0x2a
719 },
720 /* Public Key */
721 {
722 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54, 0x74, 0x8b,
723 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a, 0x0d, 0xbf, 0x3a, 0x0d,
724 0x26, 0x38, 0x1a, 0xf4, 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b,
725 0x4e, 0x6a
726 }
727 },
728 /* X448: Keys from RFC 7748 6.2 */
729 {
730 /* Private Key */
731 {
732 0x9a, 0x8f, 0x49, 0x25, 0xd1, 0x51, 0x9f, 0x57, 0x75, 0xcf,
733 0x46, 0xb0, 0x4b, 0x58, 0x00, 0xd4, 0xee, 0x9e, 0xe8, 0xba,
734 0xe8, 0xbc, 0x55, 0x65, 0xd4, 0x98, 0xc2, 0x8d, 0xd9, 0xc9,
735 0xba, 0xf5, 0x74, 0xa9, 0x41, 0x97, 0x44, 0x89, 0x73, 0x91,
736 0x00, 0x63, 0x82, 0xa6, 0xf1, 0x27, 0xab, 0x1d, 0x9a, 0xc2,
737 0xd8, 0xc0, 0xa5, 0x98, 0x72, 0x6b
738 },
739 /* Public Key */
740 {
741 0x9b, 0x08, 0xf7, 0xcc, 0x31, 0xb7, 0xe3, 0xe6, 0x7d, 0x22,
742 0xd5, 0xae, 0xa1, 0x21, 0x07, 0x4a, 0x27, 0x3b, 0xd2, 0xb8,
743 0x3d, 0xe0, 0x9c, 0x63, 0xfa, 0xa7, 0x3d, 0x2c, 0x22, 0xc5,
744 0xd9, 0xbb, 0xc8, 0x36, 0x64, 0x72, 0x41, 0xd9, 0x53, 0xd4,
745 0x0c, 0x5b, 0x12, 0xda, 0x88, 0x12, 0x0d, 0x53, 0x17, 0x7f,
746 0x80, 0xe5, 0x32, 0xc4, 0x1f, 0xa0
747 }
244bc297
MC
748 },
749 /* ED25519: Keys from RFC 8032 */
750 {
751 /* Private Key */
752 {
753 0x9d, 0x61, 0xb1, 0x9d, 0xef, 0xfd, 0x5a, 0x60, 0xba, 0x84,
754 0x4a, 0xf4, 0x92, 0xec, 0x2c, 0xc4, 0x44, 0x49, 0xc5, 0x69,
755 0x7b, 0x32, 0x69, 0x19, 0x70, 0x3b, 0xac, 0x03, 0x1c, 0xae,
756 0x7f, 0x60
757 },
758 /* Public Key */
759 {
760 0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, 0xd5, 0x4b,
761 0xfe, 0xd3, 0xc9, 0x64, 0x07, 0x3a, 0x0e, 0xe1, 0x72, 0xf3,
762 0xda, 0xa6, 0x23, 0x25, 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07,
763 0x51, 0x1a
764 }
765 },
766 /* ED448: Keys from RFC 8032 */
767 {
768 /* Private Key */
769 {
770 0x6c, 0x82, 0xa5, 0x62, 0xcb, 0x80, 0x8d, 0x10, 0xd6, 0x32,
771 0xbe, 0x89, 0xc8, 0x51, 0x3e, 0xbf, 0x6c, 0x92, 0x9f, 0x34,
772 0xdd, 0xfa, 0x8c, 0x9f, 0x63, 0xc9, 0x96, 0x0e, 0xf6, 0xe3,
773 0x48, 0xa3, 0x52, 0x8c, 0x8a, 0x3f, 0xcc, 0x2f, 0x04, 0x4e,
774 0x39, 0xa3, 0xfc, 0x5b, 0x94, 0x49, 0x2f, 0x8f, 0x03, 0x2e,
775 0x75, 0x49, 0xa2, 0x00, 0x98, 0xf9, 0x5b
776 },
777 /* Public Key */
778 {
779 0x5f, 0xd7, 0x44, 0x9b, 0x59, 0xb4, 0x61, 0xfd, 0x2c, 0xe7,
780 0x87, 0xec, 0x61, 0x6a, 0xd4, 0x6a, 0x1d, 0xa1, 0x34, 0x24,
781 0x85, 0xa7, 0x0e, 0x1f, 0x8a, 0x0e, 0xa7, 0x5d, 0x80, 0xe9,
782 0x67, 0x78, 0xed, 0xf1, 0x24, 0x76, 0x9b, 0x46, 0xc7, 0x06,
783 0x1b, 0xd6, 0x78, 0x3d, 0xf1, 0xe5, 0x0f, 0x6c, 0xd1, 0xfa,
784 0x1a, 0xbe, 0xaf, 0xe8, 0x25, 0x61, 0x80
785 }
8efc4a9c
MC
786 }
787 };
788 OSSL_PARAM x25519_fromdata_params[] = {
789 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
790 key_numbers[X25519_IDX][PRIV_KEY],
791 X25519_KEYLEN),
792 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
793 key_numbers[X25519_IDX][PUB_KEY],
794 X25519_KEYLEN),
795 OSSL_PARAM_END
796 };
797 OSSL_PARAM x448_fromdata_params[] = {
798 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
799 key_numbers[X448_IDX][PRIV_KEY],
800 X448_KEYLEN),
801 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
802 key_numbers[X448_IDX][PUB_KEY],
803 X448_KEYLEN),
804 OSSL_PARAM_END
805 };
244bc297
MC
806 OSSL_PARAM ed25519_fromdata_params[] = {
807 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
808 key_numbers[ED25519_IDX][PRIV_KEY],
809 ED25519_KEYLEN),
810 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
811 key_numbers[ED25519_IDX][PUB_KEY],
812 ED25519_KEYLEN),
813 OSSL_PARAM_END
814 };
815 OSSL_PARAM ed448_fromdata_params[] = {
816 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
817 key_numbers[ED448_IDX][PRIV_KEY],
818 ED448_KEYLEN),
819 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
820 key_numbers[ED448_IDX][PUB_KEY],
821 ED448_KEYLEN),
822 OSSL_PARAM_END
823 };
824 OSSL_PARAM *fromdata_params = NULL;
825 int bits = 0, security_bits = 0, size = 0;
8efc4a9c 826
244bc297
MC
827 switch (tst) {
828 case X25519_IDX:
8efc4a9c
MC
829 fromdata_params = x25519_fromdata_params;
830 bits = X25519_BITS;
831 security_bits = X25519_SECURITY_BITS;
832 size = X25519_KEYLEN;
244bc297
MC
833 alg = "X25519";
834 break;
835
836 case X448_IDX:
8efc4a9c
MC
837 fromdata_params = x448_fromdata_params;
838 bits = X448_BITS;
839 security_bits = X448_SECURITY_BITS;
840 size = X448_KEYLEN;
244bc297
MC
841 alg = "X448";
842 break;
843
844 case ED25519_IDX:
845 fromdata_params = ed25519_fromdata_params;
846 bits = ED25519_BITS;
847 security_bits = ED25519_SECURITY_BITS;
848 size = ED25519_KEYLEN;
849 alg = "ED25519";
850 break;
851
852 case ED448_IDX:
853 fromdata_params = ed448_fromdata_params;
854 bits = ED448_BITS;
855 security_bits = ED448_SECURITY_BITS;
856 size = ED448_KEYLEN;
857 alg = "ED448";
858 break;
fd7d574d
SL
859 default:
860 goto err;
8efc4a9c
MC
861 }
862
863 ctx = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL);
864 if (!TEST_ptr(ctx))
865 goto err;
866
867 if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
868 || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
869 || !TEST_int_eq(EVP_PKEY_bits(pk), bits)
870 || !TEST_int_eq(EVP_PKEY_security_bits(pk), security_bits)
871 || !TEST_int_eq(EVP_PKEY_size(pk), size))
872 goto err;
873
ff7262b4 874 if (!TEST_ptr(copy_pk = EVP_PKEY_new())
7fa2b267
MC
875 /* This should succeed because there are no parameters to copy */
876 || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
ff7262b4
RL
877 goto err;
878
96ebe52e
SL
879 if (!TEST_true(EVP_PKEY_get_octet_string_param(
880 pk, fromdata_params[PRIV_KEY].key,
881 out_priv, sizeof(out_priv), &len))
882 || !TEST_mem_eq(out_priv, len,
883 fromdata_params[PRIV_KEY].data,
884 fromdata_params[PRIV_KEY].data_size)
885 || !TEST_true(EVP_PKEY_get_octet_string_param(
886 pk, fromdata_params[PUB_KEY].key,
887 out_pub, sizeof(out_pub), &len))
888 || !TEST_mem_eq(out_pub, len,
889 fromdata_params[PUB_KEY].data,
890 fromdata_params[PUB_KEY].data_size))
891 goto err;
892
8efc4a9c 893 ret = test_print_key_using_pem(alg, pk)
ece9304c 894 && test_print_key_using_encoder(alg, pk);
6ae5543c 895
f552d900 896err:
6ae5543c 897 EVP_PKEY_free(pk);
ff7262b4 898 EVP_PKEY_free(copy_pk);
6ae5543c
RL
899 EVP_PKEY_CTX_free(ctx);
900
901 return ret;
902}
f552d900 903
96ebe52e
SL
904#define CURVE_NAME 2
905
f552d900
SL
906static int test_fromdata_ec(void)
907{
908 int ret = 0;
909 EVP_PKEY_CTX *ctx = NULL;
ff7262b4 910 EVP_PKEY *pk = NULL, *copy_pk = NULL;
7165593c 911 OSSL_PARAM_BLD *bld = NULL;
f552d900 912 BIGNUM *ec_priv_bn = NULL;
96ebe52e 913 BIGNUM *bn_priv = NULL;
f552d900
SL
914 OSSL_PARAM *fromdata_params = NULL;
915 const char *alg = "EC";
96ebe52e
SL
916 const char *curve = "prime256v1";
917 /* UNCOMPRESSED FORMAT */
f552d900 918 static const unsigned char ec_pub_keydata[] = {
96ebe52e 919 POINT_CONVERSION_UNCOMPRESSED,
f552d900
SL
920 0x1b, 0x93, 0x67, 0x55, 0x1c, 0x55, 0x9f, 0x63,
921 0xd1, 0x22, 0xa4, 0xd8, 0xd1, 0x0a, 0x60, 0x6d,
922 0x02, 0xa5, 0x77, 0x57, 0xc8, 0xa3, 0x47, 0x73,
923 0x3a, 0x6a, 0x08, 0x28, 0x39, 0xbd, 0xc9, 0xd2,
924 0x80, 0xec, 0xe9, 0xa7, 0x08, 0x29, 0x71, 0x2f,
925 0xc9, 0x56, 0x82, 0xee, 0x9a, 0x85, 0x0f, 0x6d,
926 0x7f, 0x59, 0x5f, 0x8c, 0xd1, 0x96, 0x0b, 0xdf,
927 0x29, 0x3e, 0x49, 0x07, 0x88, 0x3f, 0x9a, 0x29
928 };
929 static const unsigned char ec_priv_keydata[] = {
930 0x33, 0xd0, 0x43, 0x83, 0xa9, 0x89, 0x56, 0x03,
931 0xd2, 0xd7, 0xfe, 0x6b, 0x01, 0x6f, 0xe4, 0x59,
932 0xcc, 0x0d, 0x9a, 0x24, 0x6c, 0x86, 0x1b, 0x2e,
933 0xdc, 0x4b, 0x4d, 0x35, 0x43, 0xe1, 0x1b, 0xad
934 };
96ebe52e
SL
935 const int compressed_sz = 1 + (sizeof(ec_pub_keydata) - 1) / 2;
936 unsigned char out_pub[sizeof(ec_pub_keydata)];
937 char out_curve_name[80];
938 const OSSL_PARAM *gettable = NULL;
939 size_t len;
940
f552d900 941
7165593c 942 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new()))
6d4e6009 943 goto err;
f552d900
SL
944 if (!TEST_ptr(ec_priv_bn = BN_bin2bn(ec_priv_keydata,
945 sizeof(ec_priv_keydata), NULL)))
946 goto err;
947
11a1b341 948 if (OSSL_PARAM_BLD_push_utf8_string(bld, OSSL_PKEY_PARAM_GROUP_NAME,
96ebe52e 949 curve, 0) <= 0)
f552d900 950 goto err;
6d4e6009 951 if (OSSL_PARAM_BLD_push_octet_string(bld, OSSL_PKEY_PARAM_PUB_KEY,
f552d900
SL
952 ec_pub_keydata,
953 sizeof(ec_pub_keydata)) <= 0)
954 goto err;
6d4e6009 955 if (OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, ec_priv_bn) <= 0)
f552d900 956 goto err;
6d4e6009 957 if (!TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
f552d900
SL
958 goto err;
959 ctx = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL);
960 if (!TEST_ptr(ctx))
961 goto err;
962
963 if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
964 || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
965 || !TEST_int_eq(EVP_PKEY_bits(pk), 256)
966 || !TEST_int_eq(EVP_PKEY_security_bits(pk), 128)
967 || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 35 * 2))
968 goto err;
969
ff7262b4
RL
970 if (!TEST_ptr(copy_pk = EVP_PKEY_new())
971 || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
972 goto err;
973
96ebe52e 974 if (!TEST_ptr(gettable = EVP_PKEY_gettable_params(pk))
11a1b341 975 || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_GROUP_NAME))
96ebe52e
SL
976 || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_PUB_KEY))
977 || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_PRIV_KEY)))
978 goto err;
979
11a1b341 980 if (!EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
96ebe52e
SL
981 out_curve_name, sizeof(out_curve_name),
982 &len)
983 || !TEST_str_eq(out_curve_name, curve)
984 || !EVP_PKEY_get_octet_string_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
985 out_pub, sizeof(out_pub), &len)
986 || !TEST_true(out_pub[0] == (POINT_CONVERSION_COMPRESSED + 1))
987 || !TEST_mem_eq(out_pub + 1, len - 1,
988 ec_pub_keydata + 1, compressed_sz - 1)
989 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
990 &bn_priv))
991 || !TEST_BN_eq(ec_priv_bn, bn_priv))
992 goto err;
993
f552d900 994 ret = test_print_key_using_pem(alg, pk)
ece9304c 995 && test_print_key_using_encoder(alg, pk);
f552d900 996err:
96ebe52e 997 BN_free(bn_priv);
f552d900 998 BN_free(ec_priv_bn);
6d4e6009
P
999 OSSL_PARAM_BLD_free_params(fromdata_params);
1000 OSSL_PARAM_BLD_free(bld);
f552d900 1001 EVP_PKEY_free(pk);
ff7262b4 1002 EVP_PKEY_free(copy_pk);
f552d900
SL
1003 EVP_PKEY_CTX_free(ctx);
1004 return ret;
1005}
1006
1007#endif /* OPENSSL_NO_EC */
6ae5543c 1008
b03ec3b5
SL
1009#ifndef OPENSSL_NO_DSA
1010static int test_fromdata_dsa_fips186_4(void)
1011{
1012 int ret = 0;
1013 EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
1014 EVP_PKEY *pk = NULL, *copy_pk = NULL;
1015 BIGNUM *pub = NULL, *priv = NULL;
1016 BIGNUM *p = NULL, *q = NULL, *g = NULL;
1017 BIGNUM *pub_out = NULL, *priv_out = NULL;
1018 BIGNUM *p_out = NULL, *q_out = NULL, *g_out = NULL, *j_out = NULL;
1019 int gindex_out = 0, pcounter_out = 0, hindex_out = 0;
1020 char name_out[80];
1021 unsigned char seed_out[32];
1022 size_t len;
1023 OSSL_PARAM_BLD *bld = NULL;
1024 OSSL_PARAM *fromdata_params = NULL;
1025
1026 /*
1027 * DSA parameter data was generated using the following:
1028 * openssl genpkey -genparam -algorithm DSA -pkeyopt pbits:2048 \
1029 * -pkeyopt qbits:256 -pkeyopt type:0 \
1030 * -pkeyopt gindex:1 -out dsa_params.pem -text
1031 */
1032 static const unsigned char p_data[] = {
1033 0x00, 0xa0, 0xb7, 0x02, 0xc4, 0xac, 0xa6, 0x42, 0xab, 0xf2, 0x34, 0x0b,
1034 0x22, 0x47, 0x1f, 0x33, 0xcf, 0xd5, 0x04, 0xe4, 0x3e, 0xec, 0xa1, 0x21,
1035 0xc8, 0x41, 0x2b, 0xef, 0xb8, 0x1f, 0x0b, 0x5b, 0x88, 0x8b, 0x67, 0xf8,
1036 0x68, 0x6d, 0x7c, 0x4d, 0x96, 0x5f, 0x3c, 0x66, 0xef, 0x58, 0x34, 0xd7,
1037 0xf6, 0xa2, 0x1b, 0xad, 0xc8, 0x12, 0x52, 0xb8, 0xe8, 0x2a, 0x63, 0xcc,
1038 0xea, 0xe7, 0x4e, 0xc8, 0x34, 0x4c, 0x58, 0x59, 0x0a, 0xc2, 0x4a, 0xe4,
1039 0xb4, 0x64, 0x20, 0xf4, 0xf6, 0x0a, 0xcf, 0x86, 0x01, 0x6c, 0x7f, 0x23,
1040 0x4a, 0x51, 0x07, 0x99, 0x42, 0x28, 0x7a, 0xff, 0x18, 0x67, 0x52, 0x64,
1041 0xf2, 0x9a, 0x62, 0x30, 0xc3, 0x00, 0xde, 0x23, 0xe9, 0x11, 0x95, 0x7e,
1042 0xd1, 0x3d, 0x8d, 0xb4, 0x0e, 0x9f, 0x9e, 0xb1, 0x30, 0x03, 0xf0, 0x73,
1043 0xa8, 0x40, 0x48, 0x42, 0x7b, 0x60, 0xa0, 0xc4, 0xf2, 0x3b, 0x2d, 0x0a,
1044 0x0c, 0xb8, 0x19, 0xfb, 0xb4, 0xf8, 0xe0, 0x2a, 0xc7, 0xf1, 0xc0, 0xc6,
1045 0x86, 0x14, 0x60, 0x12, 0x0f, 0xc0, 0xde, 0x4a, 0x67, 0xec, 0xc7, 0xde,
1046 0x76, 0x21, 0x1a, 0x55, 0x7f, 0x86, 0xc3, 0x97, 0x98, 0xce, 0xf5, 0xcd,
1047 0xf0, 0xe7, 0x12, 0xd6, 0x93, 0xee, 0x1b, 0x9b, 0x61, 0xef, 0x05, 0x8c,
1048 0x45, 0x46, 0xd9, 0x64, 0x6f, 0xbe, 0x27, 0xaa, 0x67, 0x01, 0xcc, 0x71,
1049 0xb1, 0x60, 0xce, 0x21, 0xd8, 0x51, 0x17, 0x27, 0x0d, 0x90, 0x3d, 0x18,
1050 0x7c, 0x87, 0x15, 0x8e, 0x48, 0x4c, 0x6c, 0xc5, 0x72, 0xeb, 0xb7, 0x56,
1051 0xf5, 0x6b, 0x60, 0x8f, 0xc2, 0xfd, 0x3f, 0x46, 0x5c, 0x00, 0x91, 0x85,
1052 0x79, 0x45, 0x5b, 0x1c, 0x82, 0xc4, 0x87, 0x50, 0x79, 0xba, 0xcc, 0x1c,
1053 0x32, 0x7e, 0x2e, 0xb8, 0x2e, 0xc5, 0x4e, 0xd1, 0x9b, 0xdb, 0x66, 0x79,
1054 0x7c, 0xfe, 0xaf, 0x6a, 0x05
1055 };
1056 static const unsigned char q_data[] = {
1057 0xa8, 0xcd, 0xf4, 0x33, 0x7b, 0x13, 0x0a, 0x24, 0xc1, 0xde, 0x4a, 0x04,
1058 0x7b, 0x4b, 0x71, 0x51, 0x32, 0xe9, 0x47, 0x74, 0xbd, 0x0c, 0x21, 0x40,
1059 0x84, 0x12, 0x0a, 0x17, 0x73, 0xdb, 0x29, 0xc7
1060 };
1061 static const unsigned char g_data[] = {
1062 0x6c, 0xc6, 0xa4, 0x3e, 0x61, 0x84, 0xc1, 0xff, 0x6f, 0x4a, 0x1a, 0x6b,
1063 0xb0, 0x24, 0x4b, 0xd2, 0x92, 0x5b, 0x29, 0x5c, 0x61, 0xb8, 0xc9, 0x2b,
1064 0xd6, 0xf7, 0x59, 0xfd, 0xd8, 0x70, 0x66, 0x77, 0xfc, 0xc1, 0xa4, 0xd4,
1065 0xb0, 0x1e, 0xd5, 0xbf, 0x59, 0x98, 0xb3, 0x66, 0x8b, 0xf4, 0x2e, 0xe6,
1066 0x12, 0x3e, 0xcc, 0xf8, 0x02, 0xb8, 0xc6, 0xc3, 0x47, 0xd2, 0xf5, 0xaa,
1067 0x0c, 0x5f, 0x51, 0xf5, 0xd0, 0x4c, 0x55, 0x3d, 0x07, 0x73, 0xa6, 0x57,
1068 0xce, 0x5a, 0xad, 0x42, 0x0c, 0x13, 0x0f, 0xe2, 0x31, 0x25, 0x8e, 0x72,
1069 0x12, 0x73, 0x10, 0xdb, 0x7f, 0x79, 0xeb, 0x59, 0xfc, 0xfe, 0xf7, 0x0c,
1070 0x1a, 0x81, 0x53, 0x96, 0x22, 0xb8, 0xe7, 0x58, 0xd8, 0x67, 0x80, 0x60,
1071 0xad, 0x8b, 0x55, 0x1c, 0x91, 0xf0, 0x72, 0x9a, 0x7e, 0xad, 0x37, 0xf1,
1072 0x77, 0x18, 0x96, 0x8a, 0x68, 0x70, 0xfc, 0x71, 0xa9, 0xa2, 0xe8, 0x35,
1073 0x27, 0x78, 0xf2, 0xef, 0x59, 0x36, 0x6d, 0x7c, 0xb6, 0x98, 0xd8, 0x1e,
1074 0xfa, 0x25, 0x73, 0x97, 0x45, 0x58, 0xe3, 0xae, 0xbd, 0x52, 0x54, 0x05,
1075 0xd8, 0x26, 0x26, 0xba, 0xba, 0x05, 0xb5, 0xe9, 0xe5, 0x76, 0xae, 0x25,
1076 0xdd, 0xfc, 0x10, 0x89, 0x5a, 0xa9, 0xee, 0x59, 0xc5, 0x79, 0x8b, 0xeb,
1077 0x1e, 0x2c, 0x61, 0xab, 0x0d, 0xd1, 0x10, 0x04, 0x91, 0x32, 0x77, 0x4a,
1078 0xa6, 0x64, 0x53, 0xda, 0x4c, 0xd7, 0x3a, 0x29, 0xd4, 0xf3, 0x82, 0x25,
1079 0x1d, 0x6f, 0x4a, 0x7f, 0xd3, 0x08, 0x3b, 0x42, 0x30, 0x10, 0xd8, 0xd0,
1080 0x97, 0x3a, 0xeb, 0x92, 0x63, 0xec, 0x93, 0x2b, 0x6f, 0x32, 0xd8, 0xcd,
1081 0x80, 0xd3, 0xc0, 0x4c, 0x03, 0xd5, 0xca, 0xbc, 0x8f, 0xc7, 0x43, 0x53,
1082 0x64, 0x66, 0x1c, 0x82, 0x2d, 0xfb, 0xff, 0x39, 0xba, 0xd6, 0x42, 0x62,
1083 0x02, 0x6f, 0x96, 0x36
1084 };
1085 static const unsigned char seed_data[] = {
1086 0x64, 0x46, 0x07, 0x32, 0x8d, 0x70, 0x9c, 0xb3, 0x8a, 0x35, 0xde, 0x62,
1087 0x00, 0xf2, 0x6d, 0x52, 0x37, 0x4d, 0xb3, 0x84, 0xe1, 0x9d, 0x41, 0x04,
1088 0xda, 0x7b, 0xdc, 0x0d, 0x8b, 0x5e, 0xe0, 0x84
1089 };
1090 const int gindex = 1;
1091 const int pcounter = 53;
1092 /*
1093 * The keypair was generated using
1094 * openssl genpkey -paramfile dsa_params.pem --pkeyopt pcounter:53 \
1095 * -pkeyopt gindex:1 \
1096 * -pkeyopt hexseed:644607328d709cb38a35de6200f26d -text
1097 */
1098 static const unsigned char priv_data[] = {
1099 0x00, 0x8f, 0xc5, 0x9e, 0xd0, 0xf7, 0x2a, 0x0b, 0x66, 0xf1, 0x32, 0x73,
1100 0xae, 0xf6, 0xd9, 0xd4, 0xdb, 0x2d, 0x96, 0x55, 0x89, 0xff, 0xef, 0xa8,
1101 0x5f, 0x47, 0x8f, 0xca, 0x02, 0x8a, 0xe1, 0x35, 0x90
1102 };
1103 static const unsigned char pub_data[] = {
1104 0x44, 0x19, 0xc9, 0x46, 0x45, 0x57, 0xc1, 0xa9, 0xd8, 0x30, 0x99, 0x29,
1105 0x6a, 0x4b, 0x63, 0x71, 0x69, 0x96, 0x35, 0x17, 0xb2, 0x62, 0x9b, 0x80,
1106 0x0a, 0x95, 0x9d, 0x6a, 0xc0, 0x32, 0x0d, 0x07, 0x5f, 0x19, 0x44, 0x02,
1107 0xf1, 0xbd, 0xce, 0xdf, 0x10, 0xf8, 0x02, 0x5d, 0x7d, 0x98, 0x8a, 0x73,
1108 0x89, 0x00, 0xb6, 0x24, 0xd6, 0x33, 0xe7, 0xcf, 0x8b, 0x49, 0x2a, 0xaf,
1109 0x13, 0x1c, 0xb2, 0x52, 0x15, 0xfd, 0x9b, 0xd5, 0x40, 0x4a, 0x1a, 0xda,
1110 0x29, 0x4c, 0x92, 0x7e, 0x66, 0x06, 0xdb, 0x61, 0x86, 0xac, 0xb5, 0xda,
1111 0x3c, 0x7d, 0x73, 0x7e, 0x54, 0x32, 0x68, 0xa5, 0x02, 0xbc, 0x59, 0x47,
1112 0x84, 0xd3, 0x87, 0x71, 0x5f, 0xeb, 0x43, 0x45, 0x24, 0xd3, 0xec, 0x08,
1113 0x52, 0xc2, 0x89, 0x2d, 0x9c, 0x1a, 0xcc, 0x91, 0x65, 0x5d, 0xa3, 0xa1,
1114 0x35, 0x31, 0x10, 0x1c, 0x3a, 0xa8, 0x4d, 0x18, 0xd5, 0x06, 0xaf, 0xb2,
1115 0xec, 0x5c, 0x89, 0x9e, 0x90, 0x86, 0x10, 0x01, 0xeb, 0x51, 0xd5, 0x1b,
1116 0x9c, 0xcb, 0x66, 0x07, 0x3f, 0xc4, 0x6e, 0x0a, 0x1b, 0x73, 0xa0, 0x4b,
1117 0x5f, 0x4d, 0xab, 0x35, 0x28, 0xfa, 0xda, 0x3a, 0x0c, 0x08, 0xe8, 0xf3,
1118 0xef, 0x42, 0x67, 0xbc, 0x21, 0xf2, 0xc2, 0xb8, 0xff, 0x1a, 0x81, 0x05,
1119 0x68, 0x73, 0x62, 0xdf, 0xd7, 0xab, 0x0f, 0x22, 0x89, 0x57, 0x96, 0xd4,
1120 0x93, 0xaf, 0xa1, 0x21, 0xa3, 0x48, 0xe9, 0xf0, 0x97, 0x47, 0xa0, 0x27,
1121 0xba, 0x87, 0xb8, 0x15, 0x5f, 0xff, 0x2c, 0x50, 0x41, 0xf1, 0x7e, 0xc6,
1122 0x81, 0xc4, 0x51, 0xf1, 0xfd, 0xd6, 0x86, 0xf7, 0x69, 0x97, 0xf1, 0x49,
1123 0xc9, 0xf9, 0xf4, 0x9b, 0xf4, 0xe8, 0x85, 0xa7, 0xbd, 0x36, 0x55, 0x4a,
1124 0x3d, 0xe8, 0x65, 0x09, 0x7b, 0xb7, 0x12, 0x64, 0xd2, 0x0a, 0x53, 0x60,
1125 0x48, 0xd1, 0x8a, 0xbd
1126 };
1127
1128 if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
1129 || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
1130 || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
1131 || !TEST_ptr(p = BN_bin2bn(p_data, sizeof(p_data), NULL))
1132 || !TEST_ptr(q = BN_bin2bn(q_data, sizeof(q_data), NULL))
1133 || !TEST_ptr(g = BN_bin2bn(g_data, sizeof(g_data), NULL))
1134
1135 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
1136 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
1137 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
1138 || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
1139 OSSL_PKEY_PARAM_FFC_SEED,
1140 seed_data,
1141 sizeof(seed_data)))
1142 || !TEST_true(OSSL_PARAM_BLD_push_int(bld, OSSL_PKEY_PARAM_FFC_GINDEX,
1143 gindex))
1144 || !TEST_true(OSSL_PARAM_BLD_push_int(bld,
1145 OSSL_PKEY_PARAM_FFC_PCOUNTER,
1146 pcounter))
1147 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
1148 pub))
1149 || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
1150 priv))
1151 || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
1152 goto err;
1153
1154 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL)))
1155 goto err;
1156
1157 if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
1158 || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
1159 || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
1160 || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
1161 || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 2 * (3 + sizeof(q_data))))
1162 goto err;
1163
023b188c 1164 if (!TEST_false(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
b03ec3b5
SL
1165 name_out, sizeof(name_out),
1166 &len))
1167 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
1168 &pub_out))
1169 || !TEST_BN_eq(pub, pub_out)
1170 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
1171 &priv_out))
1172 || !TEST_BN_eq(priv, priv_out)
1173 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p_out))
1174 || !TEST_BN_eq(p, p_out)
1175 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q_out))
1176 || !TEST_BN_eq(q, q_out)
1177 || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g_out))
1178 || !TEST_BN_eq(g, g_out)
1179 || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
1180 &j_out))
1181 || !TEST_ptr_null(j_out)
1182 || !TEST_true(EVP_PKEY_get_octet_string_param(pk,
1183 OSSL_PKEY_PARAM_FFC_SEED,
1184 seed_out, sizeof(seed_out),
1185 &len))
1186 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
1187 &gindex_out))
1188 || !TEST_int_eq(gindex, gindex_out)
1189 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
1190 &hindex_out))
1191 || !TEST_int_eq(hindex_out, 0)
1192 || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
1193 &pcounter_out))
1194 || !TEST_int_eq(pcounter, pcounter_out))
1195 goto err;
1196
1197 if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
1198 goto err;
1199
1200 if (!TEST_true(EVP_PKEY_check(key_ctx))
1201 || !TEST_true(EVP_PKEY_public_check(key_ctx))
1202 || !TEST_true(EVP_PKEY_private_check(key_ctx))
1203 || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
1204 goto err;
1205
1206 if (!TEST_ptr(copy_pk = EVP_PKEY_new())
1207 || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
1208 goto err;
1209
1210 ret = test_print_key_using_pem("DSA", pk)
ece9304c 1211 && test_print_key_using_encoder("DSA", pk);
b03ec3b5
SL
1212 err:
1213 OSSL_PARAM_BLD_free_params(fromdata_params);
1214 OSSL_PARAM_BLD_free(bld);
1215 BN_free(p);
1216 BN_free(q);
1217 BN_free(g);
1218 BN_free(pub);
1219 BN_free(priv);
1220 BN_free(p_out);
1221 BN_free(q_out);
1222 BN_free(g_out);
1223 BN_free(pub_out);
1224 BN_free(priv_out);
1225 BN_free(j_out);
1226 EVP_PKEY_free(pk);
1227 EVP_PKEY_free(copy_pk);
1228 EVP_PKEY_CTX_free(ctx);
1229 EVP_PKEY_CTX_free(key_ctx);
1230
1231 return ret;
1232}
90113096
MB
1233
1234static int test_check_dsa(void)
1235{
1236 int ret = 0;
1237 EVP_PKEY_CTX *ctx = NULL;
1238
1239 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL))
1240 || !TEST_false(EVP_PKEY_check(ctx))
1241 || !TEST_false(EVP_PKEY_public_check(ctx))
1242 || !TEST_false(EVP_PKEY_private_check(ctx))
1243 || !TEST_false(EVP_PKEY_pairwise_check(ctx)))
1244 goto err;
1245
1246 ret = 1;
1247 err:
1248 EVP_PKEY_CTX_free(ctx);
1249
1250 return ret;
1251}
b03ec3b5
SL
1252#endif /* OPENSSL_NO_DSA */
1253
1254
6ae5543c
RL
1255int setup_tests(void)
1256{
8efc4a9c
MC
1257 if (!test_skip_common_options()) {
1258 TEST_error("Error parsing test options\n");
1259 return 0;
1260 }
1261
1262 if (!TEST_ptr(datadir = test_get_argument(0)))
1263 return 0;
1264
96ebe52e 1265 ADD_TEST(test_evp_pkey_get_bn_param_large);
6ae5543c 1266 ADD_TEST(test_fromdata_rsa);
285c6913 1267#ifndef OPENSSL_NO_DH
7165593c
SL
1268 ADD_TEST(test_fromdata_dh_fips186_4);
1269 ADD_TEST(test_fromdata_dh_named_group);
8efc4a9c 1270#endif
b03ec3b5 1271#ifndef OPENSSL_NO_DSA
90113096 1272 ADD_TEST(test_check_dsa);
b03ec3b5
SL
1273 ADD_TEST(test_fromdata_dsa_fips186_4);
1274#endif
8efc4a9c 1275#ifndef OPENSSL_NO_EC
244bc297 1276 ADD_ALL_TESTS(test_fromdata_ecx, 4);
f552d900 1277 ADD_TEST(test_fromdata_ec);
285c6913 1278#endif
6ae5543c
RL
1279 return 1;
1280}