provider_pkey_test.c revision 1.1.1.2 1 /*
2 * Copyright 2021-2025 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 <stddef.h>
11 #include <string.h>
12 #include <openssl/provider.h>
13 #include <openssl/params.h>
14 #include <openssl/core_names.h>
15 #include <openssl/evp.h>
16 #include <openssl/store.h>
17 #include <openssl/ui.h>
18 #include "testutil.h"
19 #include "fake_rsaprov.h"
20
21 static OSSL_LIB_CTX *libctx = NULL;
22 extern int key_deleted; /* From fake_rsaprov.c */
23
24 /* Fetch SIGNATURE method using a libctx and propq */
25 static int fetch_sig(OSSL_LIB_CTX *ctx, const char *alg, const char *propq,
26 OSSL_PROVIDER *expected_prov)
27 {
28 OSSL_PROVIDER *prov;
29 EVP_SIGNATURE *sig = EVP_SIGNATURE_fetch(ctx, "RSA", propq);
30 int ret = 0;
31
32 if (!TEST_ptr(sig))
33 return 0;
34
35 if (!TEST_ptr(prov = EVP_SIGNATURE_get0_provider(sig)))
36 goto end;
37
38 if (!TEST_ptr_eq(prov, expected_prov)) {
39 TEST_info("Fetched provider: %s, Expected provider: %s",
40 OSSL_PROVIDER_get0_name(prov),
41 OSSL_PROVIDER_get0_name(expected_prov));
42 goto end;
43 }
44
45 ret = 1;
46 end:
47 EVP_SIGNATURE_free(sig);
48 return ret;
49 }
50
51 static int test_pkey_sig(void)
52 {
53 OSSL_PROVIDER *deflt = NULL;
54 OSSL_PROVIDER *fake_rsa = NULL;
55 int i, ret = 0;
56 EVP_PKEY *pkey = NULL;
57 EVP_PKEY_CTX *ctx = NULL;
58
59 if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
60 return 0;
61
62 if (!TEST_ptr(deflt = OSSL_PROVIDER_load(libctx, "default")))
63 goto end;
64
65 /* Do a direct fetch to see it works */
66 if (!TEST_true(fetch_sig(libctx, "RSA", "provider=fake-rsa", fake_rsa))
67 || !TEST_true(fetch_sig(libctx, "RSA", "?provider=fake-rsa", fake_rsa)))
68 goto end;
69
70 /* Construct a pkey using precise propq to use our provider */
71 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
72 "provider=fake-rsa"))
73 || !TEST_true(EVP_PKEY_fromdata_init(ctx))
74 || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey, EVP_PKEY_KEYPAIR, NULL))
75 || !TEST_ptr(pkey))
76 goto end;
77
78 EVP_PKEY_CTX_free(ctx);
79 ctx = NULL;
80
81 /* try exercising signature_init ops a few times */
82 for (i = 0; i < 3; i++) {
83 size_t siglen;
84
85 /*
86 * Create a signing context for our pkey with optional propq.
87 * The sign init should pick both keymgmt and signature from
88 * fake-rsa as the key is not exportable.
89 */
90 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey,
91 "?provider=default")))
92 goto end;
93
94 /*
95 * If this picks the wrong signature without realizing it
96 * we can get a segfault or some internal error. At least watch
97 * whether fake-rsa sign_init is exercised by calling sign.
98 */
99 if (!TEST_int_eq(EVP_PKEY_sign_init(ctx), 1))
100 goto end;
101
102 if (!TEST_int_eq(EVP_PKEY_sign(ctx, NULL, &siglen, NULL, 0), 1)
103 || !TEST_size_t_eq(siglen, 256))
104 goto end;
105
106 EVP_PKEY_CTX_free(ctx);
107 ctx = NULL;
108 }
109
110 ret = 1;
111
112 end:
113 fake_rsa_finish(fake_rsa);
114 OSSL_PROVIDER_unload(deflt);
115 EVP_PKEY_CTX_free(ctx);
116 EVP_PKEY_free(pkey);
117 return ret;
118 }
119
120 static int test_alternative_keygen_init(void)
121 {
122 EVP_PKEY_CTX *ctx = NULL;
123 OSSL_PROVIDER *deflt = NULL;
124 OSSL_PROVIDER *fake_rsa = NULL;
125 const OSSL_PROVIDER *provider;
126 const char *provname;
127 int ret = 0;
128
129 if (!TEST_ptr(deflt = OSSL_PROVIDER_load(libctx, "default")))
130 goto end;
131
132 /* first try without the fake RSA provider loaded */
133 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA", NULL)))
134 goto end;
135
136 if (!TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0))
137 goto end;
138
139 if (!TEST_ptr(provider = EVP_PKEY_CTX_get0_provider(ctx)))
140 goto end;
141
142 if (!TEST_ptr(provname = OSSL_PROVIDER_get0_name(provider)))
143 goto end;
144
145 if (!TEST_str_eq(provname, "default"))
146 goto end;
147
148 EVP_PKEY_CTX_free(ctx);
149 ctx = NULL;
150
151 /* now load fake RSA and try again */
152 if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
153 return 0;
154
155 if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
156 "?provider=fake-rsa")))
157 goto end;
158
159 if (!TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0))
160 goto end;
161
162 if (!TEST_ptr(provider = EVP_PKEY_CTX_get0_provider(ctx)))
163 goto end;
164
165 if (!TEST_ptr(provname = OSSL_PROVIDER_get0_name(provider)))
166 goto end;
167
168 if (!TEST_str_eq(provname, "fake-rsa"))
169 goto end;
170
171 ret = 1;
172
173 end:
174 fake_rsa_finish(fake_rsa);
175 OSSL_PROVIDER_unload(deflt);
176 EVP_PKEY_CTX_free(ctx);
177 return ret;
178 }
179
180 static int test_pkey_eq(void)
181 {
182 OSSL_PROVIDER *deflt = NULL;
183 OSSL_PROVIDER *fake_rsa = NULL;
184 EVP_PKEY *pkey_fake = NULL;
185 EVP_PKEY *pkey_dflt = NULL;
186 EVP_PKEY_CTX *ctx = NULL;
187 OSSL_PARAM *params = NULL;
188 int ret = 0;
189
190 if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
191 return 0;
192
193 if (!TEST_ptr(deflt = OSSL_PROVIDER_load(libctx, "default")))
194 goto end;
195
196 /* Construct a public key for fake-rsa */
197 if (!TEST_ptr(params = fake_rsa_key_params(0))
198 || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
199 "provider=fake-rsa"))
200 || !TEST_true(EVP_PKEY_fromdata_init(ctx))
201 || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey_fake, EVP_PKEY_PUBLIC_KEY,
202 params))
203 || !TEST_ptr(pkey_fake))
204 goto end;
205
206 EVP_PKEY_CTX_free(ctx);
207 ctx = NULL;
208 OSSL_PARAM_free(params);
209 params = NULL;
210
211 /* Construct a public key for default */
212 if (!TEST_ptr(params = fake_rsa_key_params(0))
213 || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
214 "provider=default"))
215 || !TEST_true(EVP_PKEY_fromdata_init(ctx))
216 || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey_dflt, EVP_PKEY_PUBLIC_KEY,
217 params))
218 || !TEST_ptr(pkey_dflt))
219 goto end;
220
221 EVP_PKEY_CTX_free(ctx);
222 ctx = NULL;
223 OSSL_PARAM_free(params);
224 params = NULL;
225
226 /* now test for equality */
227 if (!TEST_int_eq(EVP_PKEY_eq(pkey_fake, pkey_dflt), 1))
228 goto end;
229
230 ret = 1;
231 end:
232 fake_rsa_finish(fake_rsa);
233 OSSL_PROVIDER_unload(deflt);
234 EVP_PKEY_CTX_free(ctx);
235 EVP_PKEY_free(pkey_fake);
236 EVP_PKEY_free(pkey_dflt);
237 OSSL_PARAM_free(params);
238 return ret;
239 }
240
241 static int test_pkey_can_sign(void)
242 {
243 OSSL_PROVIDER *fake_rsa = NULL;
244 EVP_PKEY *pkey_fake = NULL;
245 EVP_PKEY_CTX *ctx = NULL;
246 OSSL_PARAM *params = NULL;
247 int ret = 0;
248
249 if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
250 return 0;
251
252 /*
253 * Ensure other tests did not forget to reset fake_rsa_query_operation_name
254 * to its default value: 0
255 */
256 if (!TEST_int_eq(fake_rsa_query_operation_name, 0))
257 goto end;
258
259 if (!TEST_ptr(params = fake_rsa_key_params(0))
260 || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
261 "provider=fake-rsa"))
262 || !TEST_true(EVP_PKEY_fromdata_init(ctx))
263 || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey_fake, EVP_PKEY_PUBLIC_KEY,
264 params))
265 || !TEST_true(EVP_PKEY_can_sign(pkey_fake))
266 || !TEST_ptr(pkey_fake))
267 goto end;
268
269 EVP_PKEY_CTX_free(ctx);
270 ctx = NULL;
271 EVP_PKEY_free(pkey_fake);
272 pkey_fake = NULL;
273 OSSL_PARAM_free(params);
274 params = NULL;
275
276 /*
277 * Documented behavior for OSSL_FUNC_keymgmt_query_operation_name()
278 * allows it to return NULL, in which case the fallback should be to use
279 * EVP_KEYMGMT_get0_name(). That is exactly the thing we are testing here.
280 */
281 fake_rsa_query_operation_name = 1;
282
283 if (!TEST_ptr(params = fake_rsa_key_params(0))
284 || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, "RSA",
285 "provider=fake-rsa"))
286 || !TEST_true(EVP_PKEY_fromdata_init(ctx))
287 || !TEST_true(EVP_PKEY_fromdata(ctx, &pkey_fake, EVP_PKEY_PUBLIC_KEY,
288 params))
289 || !TEST_true(EVP_PKEY_can_sign(pkey_fake))
290 || !TEST_ptr(pkey_fake))
291 goto end;
292
293 EVP_PKEY_CTX_free(ctx);
294 ctx = NULL;
295 EVP_PKEY_free(pkey_fake);
296 pkey_fake = NULL;
297 OSSL_PARAM_free(params);
298 params = NULL;
299
300 ret = 1;
301 end:
302
303 EVP_PKEY_CTX_free(ctx);
304 EVP_PKEY_free(pkey_fake);
305 OSSL_PARAM_free(params);
306 fake_rsa_query_operation_name = 0;
307
308 fake_rsa_finish(fake_rsa);
309 return ret;
310 }
311
312 static int test_pkey_store(int idx)
313 {
314 OSSL_PROVIDER *deflt = NULL;
315 OSSL_PROVIDER *fake_rsa = NULL;
316 int ret = 0;
317 EVP_PKEY *pkey = NULL;
318 OSSL_STORE_LOADER *loader = NULL;
319 OSSL_STORE_CTX *ctx = NULL;
320 OSSL_STORE_INFO *info;
321 const char *propq = idx == 0 ? "?provider=fake-rsa"
322 : "?provider=default";
323
324 /* It's important to load the default provider first for this test */
325 if (!TEST_ptr(deflt = OSSL_PROVIDER_load(libctx, "default")))
326 goto end;
327
328 if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
329 goto end;
330
331 if (!TEST_ptr(loader = OSSL_STORE_LOADER_fetch(libctx, "fake_rsa",
332 propq)))
333 goto end;
334
335 OSSL_STORE_LOADER_free(loader);
336
337 if (!TEST_ptr(ctx = OSSL_STORE_open_ex("fake_rsa:test", libctx, propq,
338 NULL, NULL, NULL, NULL, NULL)))
339 goto end;
340
341 while (!OSSL_STORE_eof(ctx)
342 && (info = OSSL_STORE_load(ctx)) != NULL
343 && pkey == NULL) {
344 if (OSSL_STORE_INFO_get_type(info) == OSSL_STORE_INFO_PKEY)
345 pkey = OSSL_STORE_INFO_get1_PKEY(info);
346 OSSL_STORE_INFO_free(info);
347 info = NULL;
348 }
349
350 if (!TEST_ptr(pkey) || !TEST_int_eq(EVP_PKEY_is_a(pkey, "RSA"), 1))
351 goto end;
352
353 ret = 1;
354
355 end:
356 fake_rsa_finish(fake_rsa);
357 OSSL_PROVIDER_unload(deflt);
358 OSSL_STORE_close(ctx);
359 EVP_PKEY_free(pkey);
360 return ret;
361 }
362
363 static int test_pkey_delete(void)
364 {
365 OSSL_PROVIDER *deflt = NULL;
366 OSSL_PROVIDER *fake_rsa = NULL;
367 int ret = 0;
368 EVP_PKEY *pkey = NULL;
369 OSSL_STORE_LOADER *loader = NULL;
370 OSSL_STORE_CTX *ctx = NULL;
371 OSSL_STORE_INFO *info;
372 const char *propq = "?provider=fake-rsa";
373
374 /* It's important to load the default provider first for this test */
375 if (!TEST_ptr(deflt = OSSL_PROVIDER_load(libctx, "default")))
376 goto end;
377
378 if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
379 goto end;
380
381 if (!TEST_ptr(loader = OSSL_STORE_LOADER_fetch(libctx, "fake_rsa",
382 propq)))
383 goto end;
384
385 OSSL_STORE_LOADER_free(loader);
386
387 /* First iteration: load key, check it, delete it */
388 if (!TEST_ptr(ctx = OSSL_STORE_open_ex("fake_rsa:test", libctx, propq,
389 NULL, NULL, NULL, NULL, NULL)))
390 goto end;
391
392 while (!OSSL_STORE_eof(ctx)
393 && (info = OSSL_STORE_load(ctx)) != NULL
394 && pkey == NULL) {
395 if (OSSL_STORE_INFO_get_type(info) == OSSL_STORE_INFO_PKEY)
396 pkey = OSSL_STORE_INFO_get1_PKEY(info);
397 OSSL_STORE_INFO_free(info);
398 info = NULL;
399 }
400
401 if (!TEST_ptr(pkey) || !TEST_int_eq(EVP_PKEY_is_a(pkey, "RSA"), 1))
402 goto end;
403 EVP_PKEY_free(pkey);
404 pkey = NULL;
405
406 if (!TEST_int_eq(OSSL_STORE_delete("fake_rsa:test", libctx, propq,
407 NULL, NULL, NULL),
408 1))
409 goto end;
410 if (!TEST_int_eq(OSSL_STORE_close(ctx), 1))
411 goto end;
412
413 /* Second iteration: load key should fail */
414 if (!TEST_ptr(ctx = OSSL_STORE_open_ex("fake_rsa:test", libctx, propq,
415 NULL, NULL, NULL, NULL, NULL)))
416 goto end;
417
418 while (!OSSL_STORE_eof(ctx)) {
419 info = OSSL_STORE_load(ctx);
420 if (!TEST_ptr_null(info))
421 goto end;
422 }
423
424 ret = 1;
425
426 end:
427 fake_rsa_finish(fake_rsa);
428 OSSL_PROVIDER_unload(deflt);
429 OSSL_STORE_close(ctx);
430 fake_rsa_restore_store_state();
431 return ret;
432 }
433
434 static int fake_pw_read_string(UI *ui, UI_STRING *uis)
435 {
436 const char *passphrase = FAKE_PASSPHRASE;
437
438 if (UI_get_string_type(uis) == UIT_PROMPT) {
439 UI_set_result(ui, uis, passphrase);
440 return 1;
441 }
442
443 return 0;
444 }
445
446 static int test_pkey_store_open_ex(void)
447 {
448 OSSL_PROVIDER *deflt = NULL;
449 OSSL_PROVIDER *fake_rsa = NULL;
450 int ret = 0;
451 EVP_PKEY *pkey = NULL;
452 OSSL_STORE_LOADER *loader = NULL;
453 OSSL_STORE_CTX *ctx = NULL;
454 const char *propq = "?provider=fake-rsa";
455 UI_METHOD *ui_method = NULL;
456
457 /* It's important to load the default provider first for this test */
458 if (!TEST_ptr(deflt = OSSL_PROVIDER_load(libctx, "default")))
459 goto end;
460
461 if (!TEST_ptr(fake_rsa = fake_rsa_start(libctx)))
462 goto end;
463
464 if (!TEST_ptr(loader = OSSL_STORE_LOADER_fetch(libctx, "fake_rsa",
465 propq)))
466 goto end;
467
468 OSSL_STORE_LOADER_free(loader);
469
470 if (!TEST_ptr(ui_method = UI_create_method("PW Callbacks")))
471 goto end;
472
473 if (UI_method_set_reader(ui_method, fake_pw_read_string))
474 goto end;
475
476 if (!TEST_ptr(ctx = OSSL_STORE_open_ex("fake_rsa:openpwtest", libctx, propq,
477 ui_method, NULL, NULL, NULL, NULL)))
478 goto end;
479
480 /* retry w/o ui_method to ensure we actually enter pw checks and fail */
481 OSSL_STORE_close(ctx);
482 if (!TEST_ptr_null(ctx = OSSL_STORE_open_ex("fake_rsa:openpwtest", libctx,
483 propq, NULL, NULL, NULL, NULL,
484 NULL)))
485 goto end;
486
487 ret = 1;
488
489 end:
490 UI_destroy_method(ui_method);
491 fake_rsa_finish(fake_rsa);
492 OSSL_PROVIDER_unload(deflt);
493 OSSL_STORE_close(ctx);
494 EVP_PKEY_free(pkey);
495 return ret;
496 }
497
498 #define DEFAULT_PROVIDER_IDX 0
499 #define FAKE_RSA_PROVIDER_IDX 1
500
501 static int reset_ctx_providers(OSSL_LIB_CTX **ctx, OSSL_PROVIDER *providers[2], const char *prop)
502 {
503 OSSL_PROVIDER_unload(providers[DEFAULT_PROVIDER_IDX]);
504 providers[DEFAULT_PROVIDER_IDX] = NULL;
505 fake_rsa_finish(providers[FAKE_RSA_PROVIDER_IDX]);
506 providers[FAKE_RSA_PROVIDER_IDX] = NULL;
507 OSSL_LIB_CTX_free(*ctx);
508 *ctx = NULL;
509
510 if (!TEST_ptr(*ctx = OSSL_LIB_CTX_new())
511 || !TEST_ptr(providers[DEFAULT_PROVIDER_IDX] = OSSL_PROVIDER_load(*ctx, "default"))
512 || !TEST_ptr(providers[FAKE_RSA_PROVIDER_IDX] = fake_rsa_start(*ctx))
513 || !TEST_true(EVP_set_default_properties(*ctx, prop)))
514 return 0;
515 return 1;
516 }
517
518 struct test_pkey_decoder_properties_t {
519 const char *provider_props;
520 const char *explicit_props;
521 int curr_provider_idx;
522 };
523
524 static int test_pkey_provider_decoder_props(void)
525 {
526 OSSL_LIB_CTX *my_libctx = NULL;
527 OSSL_PROVIDER *providers[2] = { NULL };
528 struct test_pkey_decoder_properties_t properties_test[] = {
529 { "?provider=fake-rsa", NULL, FAKE_RSA_PROVIDER_IDX },
530 { "?provider=default", NULL, DEFAULT_PROVIDER_IDX },
531 { NULL, "?provider=fake-rsa", FAKE_RSA_PROVIDER_IDX },
532 { NULL, "?provider=default", DEFAULT_PROVIDER_IDX },
533 { NULL, "provider=fake-rsa", FAKE_RSA_PROVIDER_IDX },
534 { NULL, "provider=default", DEFAULT_PROVIDER_IDX },
535 };
536 EVP_PKEY *pkey = NULL;
537 BIO *bio_priv = NULL;
538 unsigned char *encoded_pub = NULL;
539 int len_pub;
540 const unsigned char *p;
541 PKCS8_PRIV_KEY_INFO *p8 = NULL;
542 size_t i;
543 int ret = 0;
544 const char pem_rsa_priv_key[] = {
545 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x50,
546 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4B, 0x45, 0x59, 0x2D, 0x2D,
547 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x49, 0x49, 0x45, 0x76, 0x51, 0x49, 0x42,
548 0x41, 0x44, 0x41, 0x4E, 0x42, 0x67, 0x6B, 0x71, 0x68, 0x6B, 0x69, 0x47,
549 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x53, 0x43,
550 0x42, 0x4B, 0x63, 0x77, 0x67, 0x67, 0x53, 0x6A, 0x41, 0x67, 0x45, 0x41,
551 0x41, 0x6F, 0x49, 0x42, 0x41, 0x51, 0x44, 0x45, 0x6B, 0x43, 0x34, 0x5A,
552 0x57, 0x76, 0x33, 0x75, 0x63, 0x46, 0x62, 0x55, 0x0A, 0x46, 0x38, 0x59,
553 0x77, 0x6C, 0x55, 0x72, 0x6D, 0x51, 0x6C, 0x4C, 0x43, 0x5A, 0x77, 0x41,
554 0x67, 0x72, 0x34, 0x44, 0x50, 0x55, 0x41, 0x46, 0x56, 0x48, 0x6C, 0x2B,
555 0x77, 0x46, 0x63, 0x58, 0x79, 0x70, 0x56, 0x67, 0x53, 0x63, 0x56, 0x59,
556 0x34, 0x4B, 0x37, 0x51, 0x6D, 0x64, 0x57, 0x4B, 0x73, 0x59, 0x71, 0x62,
557 0x38, 0x74, 0x70, 0x4F, 0x78, 0x71, 0x77, 0x30, 0x4E, 0x77, 0x5A, 0x57,
558 0x58, 0x0A, 0x4F, 0x2B, 0x74, 0x61, 0x34, 0x2B, 0x79, 0x32, 0x37, 0x43,
559 0x4F, 0x75, 0x66, 0x6F, 0x4F, 0x68, 0x52, 0x54, 0x4D, 0x77, 0x4E, 0x79,
560 0x4E, 0x32, 0x4C, 0x77, 0x53, 0x4E, 0x54, 0x50, 0x4E, 0x33, 0x65, 0x45,
561 0x6B, 0x34, 0x65, 0x65, 0x35, 0x51, 0x6E, 0x70, 0x70, 0x45, 0x79, 0x44,
562 0x72, 0x71, 0x6F, 0x43, 0x67, 0x76, 0x54, 0x6C, 0x41, 0x41, 0x64, 0x54,
563 0x6F, 0x46, 0x61, 0x58, 0x76, 0x6A, 0x0A, 0x78, 0x31, 0x33, 0x59, 0x62,
564 0x6A, 0x37, 0x6A, 0x66, 0x68, 0x77, 0x4E, 0x37, 0x34, 0x71, 0x4B, 0x64,
565 0x71, 0x73, 0x53, 0x45, 0x74, 0x50, 0x57, 0x79, 0x67, 0x67, 0x65, 0x6F,
566 0x74, 0x69, 0x51, 0x53, 0x50, 0x79, 0x36, 0x4B, 0x79, 0x42, 0x49, 0x75,
567 0x57, 0x74, 0x49, 0x78, 0x50, 0x41, 0x41, 0x38, 0x6A, 0x41, 0x76, 0x66,
568 0x41, 0x6E, 0x51, 0x6A, 0x31, 0x65, 0x58, 0x68, 0x67, 0x68, 0x46, 0x0A,
569 0x4E, 0x32, 0x4E, 0x78, 0x6B, 0x71, 0x67, 0x78, 0x76, 0x42, 0x59, 0x64,
570 0x4E, 0x79, 0x31, 0x6D, 0x33, 0x2B, 0x6A, 0x58, 0x41, 0x43, 0x50, 0x4C,
571 0x52, 0x7A, 0x63, 0x31, 0x31, 0x5A, 0x62, 0x4E, 0x48, 0x4B, 0x69, 0x77,
572 0x68, 0x43, 0x59, 0x31, 0x2F, 0x48, 0x69, 0x53, 0x42, 0x6B, 0x77, 0x48,
573 0x6C, 0x49, 0x4B, 0x2B, 0x2F, 0x56, 0x4C, 0x6A, 0x32, 0x73, 0x6D, 0x43,
574 0x4B, 0x64, 0x55, 0x51, 0x0A, 0x67, 0x76, 0x4C, 0x58, 0x53, 0x6E, 0x6E,
575 0x56, 0x67, 0x51, 0x75, 0x6C, 0x48, 0x69, 0x6F, 0x44, 0x36, 0x55, 0x67,
576 0x59, 0x38, 0x78, 0x41, 0x32, 0x61, 0x34, 0x4D, 0x31, 0x72, 0x68, 0x59,
577 0x75, 0x54, 0x56, 0x38, 0x42, 0x72, 0x50, 0x52, 0x5A, 0x34, 0x42, 0x46,
578 0x78, 0x32, 0x6F, 0x30, 0x6A, 0x59, 0x57, 0x76, 0x47, 0x62, 0x41, 0x2F,
579 0x48, 0x6C, 0x70, 0x37, 0x66, 0x54, 0x4F, 0x79, 0x2B, 0x0A, 0x46, 0x35,
580 0x4F, 0x6B, 0x69, 0x48, 0x53, 0x37, 0x41, 0x67, 0x4D, 0x42, 0x41, 0x41,
581 0x45, 0x43, 0x67, 0x67, 0x45, 0x41, 0x59, 0x67, 0x43, 0x75, 0x38, 0x31,
582 0x5A, 0x69, 0x51, 0x42, 0x56, 0x44, 0x76, 0x57, 0x69, 0x44, 0x47, 0x4B,
583 0x72, 0x2B, 0x31, 0x70, 0x49, 0x66, 0x32, 0x43, 0x78, 0x70, 0x72, 0x47,
584 0x4A, 0x45, 0x6D, 0x31, 0x68, 0x38, 0x36, 0x5A, 0x63, 0x45, 0x78, 0x33,
585 0x4C, 0x37, 0x0A, 0x71, 0x46, 0x44, 0x57, 0x2B, 0x67, 0x38, 0x48, 0x47,
586 0x57, 0x64, 0x30, 0x34, 0x53, 0x33, 0x71, 0x76, 0x68, 0x39, 0x4C, 0x75,
587 0x62, 0x6C, 0x41, 0x4A, 0x7A, 0x65, 0x74, 0x41, 0x50, 0x78, 0x52, 0x58,
588 0x4C, 0x39, 0x7A, 0x78, 0x33, 0x50, 0x58, 0x6A, 0x4A, 0x5A, 0x73, 0x37,
589 0x65, 0x33, 0x48, 0x4C, 0x45, 0x75, 0x6E, 0x79, 0x33, 0x54, 0x61, 0x57,
590 0x65, 0x7A, 0x30, 0x58, 0x49, 0x30, 0x4F, 0x0A, 0x34, 0x4C, 0x53, 0x59,
591 0x38, 0x53, 0x38, 0x64, 0x36, 0x70, 0x56, 0x42, 0x50, 0x6D, 0x55, 0x45,
592 0x74, 0x77, 0x47, 0x57, 0x4E, 0x34, 0x76, 0x59, 0x71, 0x48, 0x6E, 0x4B,
593 0x4C, 0x58, 0x4F, 0x62, 0x34, 0x51, 0x51, 0x41, 0x58, 0x73, 0x34, 0x4D,
594 0x7A, 0x66, 0x6B, 0x4D, 0x2F, 0x4D, 0x65, 0x2F, 0x62, 0x2B, 0x7A, 0x64,
595 0x75, 0x31, 0x75, 0x6D, 0x77, 0x6A, 0x4D, 0x6C, 0x33, 0x44, 0x75, 0x64,
596 0x0A, 0x35, 0x72, 0x56, 0x68, 0x6B, 0x67, 0x76, 0x74, 0x38, 0x75, 0x68,
597 0x44, 0x55, 0x47, 0x33, 0x58, 0x53, 0x48, 0x65, 0x6F, 0x4A, 0x59, 0x42,
598 0x4D, 0x62, 0x54, 0x39, 0x69, 0x6B, 0x4A, 0x44, 0x56, 0x4D, 0x4A, 0x35,
599 0x31, 0x72, 0x72, 0x65, 0x2F, 0x31, 0x52, 0x69, 0x64, 0x64, 0x67, 0x78,
600 0x70, 0x38, 0x53, 0x6B, 0x74, 0x56, 0x6B, 0x76, 0x47, 0x6D, 0x4D, 0x6C,
601 0x39, 0x6B, 0x51, 0x52, 0x38, 0x0A, 0x38, 0x64, 0x76, 0x33, 0x50, 0x78,
602 0x2F, 0x6B, 0x54, 0x4E, 0x39, 0x34, 0x45, 0x75, 0x52, 0x67, 0x30, 0x43,
603 0x6B, 0x58, 0x42, 0x68, 0x48, 0x70, 0x6F, 0x47, 0x6F, 0x34, 0x71, 0x6E,
604 0x4D, 0x33, 0x51, 0x33, 0x42, 0x35, 0x50, 0x6C, 0x6D, 0x53, 0x4B, 0x35,
605 0x67, 0x6B, 0x75, 0x50, 0x76, 0x57, 0x79, 0x39, 0x6C, 0x38, 0x4C, 0x2F,
606 0x54, 0x56, 0x74, 0x38, 0x4C, 0x62, 0x36, 0x2F, 0x7A, 0x4C, 0x0A, 0x42,
607 0x79, 0x51, 0x57, 0x2B, 0x67, 0x30, 0x32, 0x77, 0x78, 0x65, 0x4E, 0x47,
608 0x68, 0x77, 0x31, 0x66, 0x6B, 0x44, 0x2B, 0x58, 0x46, 0x48, 0x37, 0x4B,
609 0x6B, 0x53, 0x65, 0x57, 0x6C, 0x2B, 0x51, 0x6E, 0x72, 0x4C, 0x63, 0x65,
610 0x50, 0x4D, 0x30, 0x68, 0x51, 0x4B, 0x42, 0x67, 0x51, 0x44, 0x78, 0x6F,
611 0x71, 0x55, 0x6B, 0x30, 0x50, 0x4C, 0x4F, 0x59, 0x35, 0x57, 0x67, 0x4F,
612 0x6B, 0x67, 0x72, 0x0A, 0x75, 0x6D, 0x67, 0x69, 0x65, 0x2F, 0x4B, 0x31,
613 0x57, 0x4B, 0x73, 0x2B, 0x69, 0x7A, 0x54, 0x74, 0x41, 0x70, 0x6A, 0x7A,
614 0x63, 0x4D, 0x37, 0x36, 0x73, 0x7A, 0x61, 0x36, 0x33, 0x62, 0x35, 0x52,
615 0x39, 0x77, 0x2B, 0x50, 0x2B, 0x4E, 0x73, 0x73, 0x4D, 0x56, 0x34, 0x61,
616 0x65, 0x56, 0x39, 0x65, 0x70, 0x45, 0x47, 0x5A, 0x4F, 0x36, 0x38, 0x49,
617 0x55, 0x6D, 0x69, 0x30, 0x51, 0x6A, 0x76, 0x51, 0x0A, 0x6E, 0x70, 0x6C,
618 0x75, 0x51, 0x6F, 0x61, 0x64, 0x46, 0x59, 0x77, 0x65, 0x46, 0x77, 0x53,
619 0x51, 0x31, 0x31, 0x42, 0x58, 0x48, 0x6F, 0x65, 0x51, 0x42, 0x41, 0x34,
620 0x6E, 0x4E, 0x70, 0x6B, 0x72, 0x56, 0x35, 0x38, 0x68, 0x67, 0x7A, 0x5A,
621 0x4E, 0x33, 0x6D, 0x39, 0x4A, 0x4C, 0x52, 0x37, 0x4A, 0x78, 0x79, 0x72,
622 0x49, 0x71, 0x58, 0x73, 0x52, 0x6E, 0x55, 0x7A, 0x6C, 0x31, 0x33, 0x4B,
623 0x6A, 0x0A, 0x47, 0x7A, 0x5A, 0x42, 0x43, 0x4A, 0x78, 0x43, 0x70, 0x4A,
624 0x6A, 0x66, 0x54, 0x7A, 0x65, 0x2F, 0x79, 0x6D, 0x65, 0x38, 0x64, 0x33,
625 0x70, 0x61, 0x35, 0x51, 0x4B, 0x42, 0x67, 0x51, 0x44, 0x51, 0x50, 0x35,
626 0x6D, 0x42, 0x34, 0x6A, 0x49, 0x2B, 0x67, 0x33, 0x58, 0x48, 0x33, 0x4D,
627 0x75, 0x4C, 0x79, 0x42, 0x6A, 0x4D, 0x6F, 0x54, 0x49, 0x76, 0x6F, 0x79,
628 0x37, 0x43, 0x59, 0x4D, 0x68, 0x5A, 0x0A, 0x36, 0x2F, 0x2B, 0x4B, 0x6B,
629 0x70, 0x77, 0x31, 0x33, 0x32, 0x4A, 0x31, 0x36, 0x6D, 0x71, 0x6B, 0x4C,
630 0x72, 0x77, 0x55, 0x4F, 0x5A, 0x66, 0x54, 0x30, 0x65, 0x31, 0x72, 0x4A,
631 0x42, 0x73, 0x43, 0x55, 0x6B, 0x45, 0x6F, 0x42, 0x6D, 0x67, 0x4B, 0x4E,
632 0x74, 0x52, 0x6B, 0x48, 0x6F, 0x33, 0x2F, 0x53, 0x6A, 0x55, 0x49, 0x2F,
633 0x39, 0x66, 0x48, 0x6A, 0x33, 0x75, 0x53, 0x74, 0x50, 0x48, 0x56, 0x0A,
634 0x6F, 0x50, 0x63, 0x66, 0x58, 0x6A, 0x2F, 0x67, 0x46, 0x52, 0x55, 0x6B,
635 0x44, 0x44, 0x7A, 0x59, 0x2B, 0x61, 0x75, 0x42, 0x33, 0x64, 0x48, 0x4F,
636 0x4E, 0x46, 0x31, 0x55, 0x31, 0x7A, 0x30, 0x36, 0x45, 0x41, 0x4E, 0x6B,
637 0x6B, 0x50, 0x43, 0x43, 0x33, 0x61, 0x35, 0x33, 0x38, 0x55, 0x41, 0x4E,
638 0x42, 0x49, 0x61, 0x50, 0x6A, 0x77, 0x70, 0x52, 0x64, 0x42, 0x7A, 0x4E,
639 0x77, 0x31, 0x78, 0x6C, 0x0A, 0x62, 0x76, 0x6E, 0x35, 0x61, 0x43, 0x74,
640 0x33, 0x48, 0x77, 0x4B, 0x42, 0x67, 0x42, 0x66, 0x4F, 0x6C, 0x34, 0x6A,
641 0x47, 0x45, 0x58, 0x59, 0x6D, 0x4E, 0x36, 0x4B, 0x2B, 0x75, 0x30, 0x65,
642 0x62, 0x71, 0x52, 0x44, 0x6B, 0x74, 0x32, 0x67, 0x49, 0x6F, 0x57, 0x36,
643 0x62, 0x46, 0x6F, 0x37, 0x58, 0x64, 0x36, 0x78, 0x63, 0x69, 0x2F, 0x67,
644 0x46, 0x57, 0x6A, 0x6F, 0x56, 0x43, 0x4F, 0x42, 0x59, 0x0A, 0x67, 0x43,
645 0x38, 0x47, 0x4C, 0x4D, 0x6E, 0x77, 0x33, 0x7A, 0x32, 0x71, 0x67, 0x61,
646 0x76, 0x34, 0x63, 0x51, 0x49, 0x67, 0x38, 0x45, 0x44, 0x59, 0x70, 0x62,
647 0x70, 0x45, 0x34, 0x46, 0x48, 0x51, 0x6E, 0x6E, 0x74, 0x50, 0x6B, 0x4B,
648 0x57, 0x2F, 0x62, 0x72, 0x75, 0x30, 0x4E, 0x74, 0x33, 0x79, 0x61, 0x4E,
649 0x62, 0x38, 0x69, 0x67, 0x79, 0x31, 0x61, 0x5A, 0x4F, 0x52, 0x66, 0x49,
650 0x76, 0x5A, 0x0A, 0x71, 0x54, 0x4D, 0x4C, 0x45, 0x33, 0x6D, 0x65, 0x6C,
651 0x63, 0x5A, 0x57, 0x37, 0x4C, 0x61, 0x69, 0x71, 0x65, 0x4E, 0x31, 0x56,
652 0x30, 0x76, 0x48, 0x2F, 0x4D, 0x43, 0x55, 0x64, 0x70, 0x58, 0x39, 0x59,
653 0x31, 0x34, 0x4B, 0x39, 0x43, 0x4A, 0x59, 0x78, 0x7A, 0x73, 0x52, 0x4F,
654 0x67, 0x50, 0x71, 0x64, 0x45, 0x67, 0x4D, 0x57, 0x59, 0x44, 0x46, 0x41,
655 0x6F, 0x47, 0x41, 0x41, 0x65, 0x39, 0x6C, 0x0A, 0x58, 0x4D, 0x69, 0x65,
656 0x55, 0x4F, 0x68, 0x6C, 0x30, 0x73, 0x71, 0x68, 0x64, 0x5A, 0x59, 0x52,
657 0x62, 0x4F, 0x31, 0x65, 0x69, 0x77, 0x54, 0x49, 0x4C, 0x58, 0x51, 0x36,
658 0x79, 0x47, 0x4D, 0x69, 0x42, 0x38, 0x61, 0x65, 0x2F, 0x76, 0x30, 0x70,
659 0x62, 0x42, 0x45, 0x57, 0x6C, 0x70, 0x6E, 0x38, 0x6B, 0x32, 0x2B, 0x4A,
660 0x6B, 0x71, 0x56, 0x54, 0x77, 0x48, 0x67, 0x67, 0x62, 0x43, 0x41, 0x5A,
661 0x0A, 0x6A, 0x4F, 0x61, 0x71, 0x56, 0x74, 0x58, 0x31, 0x6D, 0x55, 0x79,
662 0x54, 0x59, 0x7A, 0x6A, 0x73, 0x54, 0x7A, 0x34, 0x5A, 0x59, 0x6A, 0x68,
663 0x61, 0x48, 0x4A, 0x33, 0x6A, 0x31, 0x57, 0x6C, 0x65, 0x67, 0x6F, 0x4D,
664 0x63, 0x73, 0x74, 0x64, 0x66, 0x54, 0x2B, 0x74, 0x78, 0x4D, 0x55, 0x37,
665 0x34, 0x6F, 0x67, 0x64, 0x4F, 0x71, 0x4D, 0x7A, 0x68, 0x78, 0x53, 0x55,
666 0x4F, 0x34, 0x35, 0x67, 0x38, 0x0A, 0x66, 0x39, 0x57, 0x38, 0x39, 0x6D,
667 0x70, 0x61, 0x38, 0x62, 0x42, 0x6A, 0x4F, 0x50, 0x75, 0x2B, 0x79, 0x46,
668 0x79, 0x36, 0x36, 0x74, 0x44, 0x61, 0x5A, 0x36, 0x73, 0x57, 0x45, 0x37,
669 0x63, 0x35, 0x53, 0x58, 0x45, 0x48, 0x58, 0x6C, 0x38, 0x43, 0x67, 0x59,
670 0x45, 0x41, 0x74, 0x41, 0x57, 0x77, 0x46, 0x50, 0x6F, 0x44, 0x53, 0x54,
671 0x64, 0x7A, 0x6F, 0x58, 0x41, 0x77, 0x52, 0x6F, 0x66, 0x30, 0x0A, 0x51,
672 0x4D, 0x4F, 0x30, 0x38, 0x2B, 0x50, 0x6E, 0x51, 0x47, 0x6F, 0x50, 0x62,
673 0x4D, 0x4A, 0x54, 0x71, 0x72, 0x67, 0x78, 0x72, 0x48, 0x59, 0x43, 0x53,
674 0x38, 0x75, 0x34, 0x63, 0x59, 0x53, 0x48, 0x64, 0x44, 0x4D, 0x4A, 0x44,
675 0x43, 0x4F, 0x4D, 0x6F, 0x35, 0x67, 0x46, 0x58, 0x79, 0x43, 0x2B, 0x35,
676 0x46, 0x66, 0x54, 0x69, 0x47, 0x77, 0x42, 0x68, 0x79, 0x35, 0x38, 0x7A,
677 0x35, 0x62, 0x37, 0x0A, 0x67, 0x42, 0x77, 0x46, 0x4B, 0x49, 0x39, 0x52,
678 0x67, 0x52, 0x66, 0x56, 0x31, 0x44, 0x2F, 0x4E, 0x69, 0x6D, 0x78, 0x50,
679 0x72, 0x6C, 0x6A, 0x33, 0x57, 0x48, 0x79, 0x65, 0x63, 0x31, 0x2F, 0x43,
680 0x73, 0x2B, 0x42, 0x72, 0x2B, 0x2F, 0x76, 0x65, 0x6B, 0x4D, 0x56, 0x46,
681 0x67, 0x35, 0x67, 0x65, 0x6B, 0x65, 0x48, 0x72, 0x34, 0x61, 0x47, 0x53,
682 0x46, 0x34, 0x62, 0x6B, 0x30, 0x41, 0x6A, 0x56, 0x0A, 0x54, 0x76, 0x2F,
683 0x70, 0x51, 0x6A, 0x79, 0x52, 0x75, 0x5A, 0x41, 0x74, 0x36, 0x36, 0x49,
684 0x62, 0x52, 0x5A, 0x64, 0x6C, 0x32, 0x49, 0x49, 0x3D, 0x0A, 0x2D, 0x2D,
685 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41,
686 0x54, 0x45, 0x20, 0x4B, 0x45, 0x59, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D
687 };
688 /*
689 * PEM of pem_rsa_priv_key:
690 * -----BEGIN PRIVATE KEY-----
691 * MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEkC4ZWv3ucFbU
692 * F8YwlUrmQlLCZwAgr4DPUAFVHl+wFcXypVgScVY4K7QmdWKsYqb8tpOxqw0NwZWX
693 * O+ta4+y27COufoOhRTMwNyN2LwSNTPN3eEk4ee5QnppEyDrqoCgvTlAAdToFaXvj
694 * x13Ybj7jfhwN74qKdqsSEtPWyggeotiQSPy6KyBIuWtIxPAA8jAvfAnQj1eXhghF
695 * N2NxkqgxvBYdNy1m3+jXACPLRzc11ZbNHKiwhCY1/HiSBkwHlIK+/VLj2smCKdUQ
696 * gvLXSnnVgQulHioD6UgY8xA2a4M1rhYuTV8BrPRZ4BFx2o0jYWvGbA/Hlp7fTOy+
697 * F5OkiHS7AgMBAAECggEAYgCu81ZiQBVDvWiDGKr+1pIf2CxprGJEm1h86ZcEx3L7
698 * qFDW+g8HGWd04S3qvh9LublAJzetAPxRXL9zx3PXjJZs7e3HLEuny3TaWez0XI0O
699 * 4LSY8S8d6pVBPmUEtwGWN4vYqHnKLXOb4QQAXs4MzfkM/Me/b+zdu1umwjMl3Dud
700 * 5rVhkgvt8uhDUG3XSHeoJYBMbT9ikJDVMJ51rre/1Riddgxp8SktVkvGmMl9kQR8
701 * 8dv3Px/kTN94EuRg0CkXBhHpoGo4qnM3Q3B5PlmSK5gkuPvWy9l8L/TVt8Lb6/zL
702 * ByQW+g02wxeNGhw1fkD+XFH7KkSeWl+QnrLcePM0hQKBgQDxoqUk0PLOY5WgOkgr
703 * umgie/K1WKs+izTtApjzcM76sza63b5R9w+P+NssMV4aeV9epEGZO68IUmi0QjvQ
704 * npluQoadFYweFwSQ11BXHoeQBA4nNpkrV58hgzZN3m9JLR7JxyrIqXsRnUzl13Kj
705 * GzZBCJxCpJjfTze/yme8d3pa5QKBgQDQP5mB4jI+g3XH3MuLyBjMoTIvoy7CYMhZ
706 * 6/+Kkpw132J16mqkLrwUOZfT0e1rJBsCUkEoBmgKNtRkHo3/SjUI/9fHj3uStPHV
707 * oPcfXj/gFRUkDDzY+auB3dHONF1U1z06EANkkPCC3a538UANBIaPjwpRdBzNw1xl
708 * bvn5aCt3HwKBgBfOl4jGEXYmN6K+u0ebqRDkt2gIoW6bFo7Xd6xci/gFWjoVCOBY
709 * gC8GLMnw3z2qgav4cQIg8EDYpbpE4FHQnntPkKW/bru0Nt3yaNb8igy1aZORfIvZ
710 * qTMLE3melcZW7LaiqeN1V0vH/MCUdpX9Y14K9CJYxzsROgPqdEgMWYDFAoGAAe9l
711 * XMieUOhl0sqhdZYRbO1eiwTILXQ6yGMiB8ae/v0pbBEWlpn8k2+JkqVTwHggbCAZ
712 * jOaqVtX1mUyTYzjsTz4ZYjhaHJ3j1WlegoMcstdfT+txMU74ogdOqMzhxSUO45g8
713 * f9W89mpa8bBjOPu+yFy66tDaZ6sWE7c5SXEHXl8CgYEAtAWwFPoDSTdzoXAwRof0
714 * QMO08+PnQGoPbMJTqrgxrHYCS8u4cYSHdDMJDCOMo5gFXyC+5FfTiGwBhy58z5b7
715 * gBwFKI9RgRfV1D/NimxPrlj3WHyec1/Cs+Br+/vekMVFg5gekeHr4aGSF4bk0AjV
716 * Tv/pQjyRuZAt66IbRZdl2II=
717 * -----END PRIVATE KEY-----
718 */
719
720 /* Load private key BIO, DER-encoded public key and PKCS#8 private key for testing */
721 if (!TEST_ptr(bio_priv = BIO_new(BIO_s_mem()))
722 || !TEST_int_gt(BIO_write(bio_priv, pem_rsa_priv_key, sizeof(pem_rsa_priv_key)), 0)
723 || !TEST_ptr(pkey = PEM_read_bio_PrivateKey_ex(bio_priv, NULL, NULL, NULL, NULL, NULL))
724 || !TEST_int_ge(BIO_seek(bio_priv, 0), 0)
725 || !TEST_int_gt((len_pub = i2d_PUBKEY(pkey, &encoded_pub)), 0)
726 || !TEST_ptr(p8 = EVP_PKEY2PKCS8(pkey)))
727 goto end;
728 EVP_PKEY_free(pkey);
729 pkey = NULL;
730
731 for (i = 0; i < OSSL_NELEM(properties_test); i++) {
732 const char *libctx_prop = properties_test[i].provider_props;
733 const char *explicit_prop = properties_test[i].explicit_props;
734 /* *curr_provider will be updated in reset_ctx_providers */
735 OSSL_PROVIDER **curr_provider = &providers[properties_test[i].curr_provider_idx];
736
737 /*
738 * Decoding a PEM-encoded key uses the properties to select the right provider.
739 * Using a PEM-encoding adds an extra decoder before the key is created.
740 */
741 if (!TEST_int_eq(reset_ctx_providers(&my_libctx, providers, libctx_prop), 1))
742 goto end;
743 if (!TEST_int_ge(BIO_seek(bio_priv, 0), 0)
744 || !TEST_ptr(pkey = PEM_read_bio_PrivateKey_ex(bio_priv, NULL, NULL, NULL, my_libctx,
745 explicit_prop))
746 || !TEST_ptr_eq(EVP_PKEY_get0_provider(pkey), *curr_provider))
747 goto end;
748 EVP_PKEY_free(pkey);
749 pkey = NULL;
750
751 /* Decoding a DER-encoded X509_PUBKEY uses the properties to select the right provider */
752 if (!TEST_int_eq(reset_ctx_providers(&my_libctx, providers, libctx_prop), 1))
753 goto end;
754 p = encoded_pub;
755 if (!TEST_ptr(pkey = d2i_PUBKEY_ex(NULL, &p, len_pub, my_libctx, explicit_prop))
756 || !TEST_ptr_eq(EVP_PKEY_get0_provider(pkey), *curr_provider))
757 goto end;
758 EVP_PKEY_free(pkey);
759 pkey = NULL;
760
761 /* Decoding a PKCS8_PRIV_KEY_INFO uses the properties to select the right provider */
762 if (!TEST_int_eq(reset_ctx_providers(&my_libctx, providers, libctx_prop), 1))
763 goto end;
764 if (!TEST_ptr(pkey = EVP_PKCS82PKEY_ex(p8, my_libctx, explicit_prop))
765 || !TEST_ptr_eq(EVP_PKEY_get0_provider(pkey), *curr_provider))
766 goto end;
767 EVP_PKEY_free(pkey);
768 pkey = NULL;
769 }
770
771 ret = 1;
772
773 end:
774 PKCS8_PRIV_KEY_INFO_free(p8);
775 BIO_free(bio_priv);
776 OPENSSL_free(encoded_pub);
777 EVP_PKEY_free(pkey);
778 OSSL_PROVIDER_unload(providers[DEFAULT_PROVIDER_IDX]);
779 fake_rsa_finish(providers[FAKE_RSA_PROVIDER_IDX]);
780 OSSL_LIB_CTX_free(my_libctx);
781 return ret;
782 }
783
784 int setup_tests(void)
785 {
786 libctx = OSSL_LIB_CTX_new();
787 if (libctx == NULL)
788 return 0;
789
790 ADD_TEST(test_pkey_sig);
791 ADD_TEST(test_alternative_keygen_init);
792 ADD_TEST(test_pkey_eq);
793 ADD_TEST(test_pkey_can_sign);
794 ADD_ALL_TESTS(test_pkey_store, 2);
795 ADD_TEST(test_pkey_delete);
796 ADD_TEST(test_pkey_store_open_ex);
797 ADD_TEST(test_pkey_provider_decoder_props);
798
799 return 1;
800 }
801
802 void cleanup_tests(void)
803 {
804 OSSL_LIB_CTX_free(libctx);
805 }
806