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