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