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