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 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 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 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 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 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 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 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 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 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 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 730 void cleanup_tests(void) 731 { 732 OSSL_LIB_CTX_free(libctx); 733 } 734