Home | History | Annotate | Line # | Download | only in test
      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