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