Home | History | Annotate | Line # | Download | only in test
      1 /*
      2  * Copyright 2007-2025 The OpenSSL Project Authors. All Rights Reserved.
      3  * Copyright Nokia 2007-2019
      4  * Copyright Siemens AG 2015-2019
      5  *
      6  * Licensed under the Apache License 2.0 (the "License").  You may not use
      7  * this file except in compliance with the License.  You can obtain a copy
      8  * in the file LICENSE in the source distribution or at
      9  * https://www.openssl.org/source/license.html
     10  */
     11 
     12 #include "helpers/cmp_testlib.h"
     13 
     14 static const char *ir_protected_f;
     15 static const char *genm_prot_Ed_f;
     16 static const char *ir_unprotected_f;
     17 static const char *ip_PBM_f;
     18 
     19 typedef struct test_fixture {
     20     const char *test_case_name;
     21     OSSL_CMP_CTX *cmp_ctx;
     22     /* for protection tests */
     23     OSSL_CMP_MSG *msg;
     24     OSSL_CMP_PKISI *si; /* for error and response messages */
     25     EVP_PKEY *pubkey;
     26     unsigned char *mem;
     27     int memlen;
     28     X509 *cert;
     29     STACK_OF(X509) *certs;
     30     STACK_OF(X509) *chain;
     31     int with_ss;
     32     int callback_arg;
     33     int expected;
     34 } CMP_PROTECT_TEST_FIXTURE;
     35 
     36 static OSSL_LIB_CTX *libctx = NULL;
     37 static OSSL_PROVIDER *default_null_provider = NULL, *provider = NULL;
     38 
     39 static void tear_down(CMP_PROTECT_TEST_FIXTURE *fixture)
     40 {
     41     if (fixture != NULL) {
     42         OSSL_CMP_CTX_free(fixture->cmp_ctx);
     43         OSSL_CMP_MSG_free(fixture->msg);
     44         OSSL_CMP_PKISI_free(fixture->si);
     45 
     46         OPENSSL_free(fixture->mem);
     47         sk_X509_free(fixture->certs);
     48         sk_X509_free(fixture->chain);
     49 
     50         OPENSSL_free(fixture);
     51     }
     52 }
     53 
     54 static CMP_PROTECT_TEST_FIXTURE *set_up(const char *const test_case_name)
     55 {
     56     CMP_PROTECT_TEST_FIXTURE *fixture;
     57 
     58     if (!TEST_ptr(fixture = OPENSSL_zalloc(sizeof(*fixture))))
     59         return NULL;
     60     fixture->test_case_name = test_case_name;
     61     if (!TEST_ptr(fixture->cmp_ctx = OSSL_CMP_CTX_new(libctx, NULL))) {
     62         tear_down(fixture);
     63         return NULL;
     64     }
     65     return fixture;
     66 }
     67 
     68 static EVP_PKEY *prot_RSA_key = NULL;
     69 #ifndef OPENSSL_NO_ECX
     70 static EVP_PKEY *prot_Ed_key = NULL;
     71 static OSSL_CMP_MSG *genm_protected_Ed;
     72 #endif
     73 static EVP_PKEY *server_key = NULL;
     74 static X509 *server_cert = NULL;
     75 static unsigned char rand_data[OSSL_CMP_TRANSACTIONID_LENGTH];
     76 static OSSL_CMP_MSG *ir_unprotected, *ir_protected;
     77 static X509 *endentity1 = NULL, *endentity2 = NULL,
     78             *root = NULL, *intermediate = NULL;
     79 
     80 static int execute_calc_protection_fails_test(CMP_PROTECT_TEST_FIXTURE *fixture)
     81 {
     82     ASN1_BIT_STRING *protection = ossl_cmp_calc_protection(fixture->cmp_ctx, fixture->msg);
     83     int res = TEST_ptr_null(protection);
     84 
     85     ASN1_BIT_STRING_free(protection);
     86     return res;
     87 }
     88 
     89 static int execute_calc_protection_pbmac_test(CMP_PROTECT_TEST_FIXTURE *fixture)
     90 {
     91     ASN1_BIT_STRING *protection = ossl_cmp_calc_protection(fixture->cmp_ctx, fixture->msg);
     92     int res = TEST_ptr(protection)
     93         && TEST_true(ASN1_STRING_cmp(protection,
     94                          fixture->msg->protection)
     95             == 0);
     96 
     97     ASN1_BIT_STRING_free(protection);
     98     return res;
     99 }
    100 
    101 /*
    102  * This function works similarly to parts of verify_signature in cmp_vfy.c,
    103  * but without the need for an OSSL_CMP_CTX or an X509 certificate.
    104  */
    105 static int verify_signature(OSSL_CMP_MSG *msg,
    106     ASN1_BIT_STRING *protection,
    107     EVP_PKEY *pkey, EVP_MD *digest)
    108 {
    109     OSSL_CMP_PROTECTEDPART prot_part;
    110 
    111     prot_part.header = OSSL_CMP_MSG_get0_header(msg);
    112     prot_part.body = msg->body;
    113     return ASN1_item_verify_ex(ASN1_ITEM_rptr(OSSL_CMP_PROTECTEDPART),
    114                msg->header->protectionAlg, protection,
    115                &prot_part, NULL, pkey, libctx, NULL)
    116         > 0;
    117 }
    118 
    119 /* Calls OSSL_CMP_calc_protection and compares and verifies signature */
    120 static int execute_calc_protection_signature_test(CMP_PROTECT_TEST_FIXTURE *
    121         fixture)
    122 {
    123     ASN1_BIT_STRING *protection = ossl_cmp_calc_protection(fixture->cmp_ctx, fixture->msg);
    124     int ret = (TEST_ptr(protection)
    125         && TEST_true(verify_signature(fixture->msg, protection,
    126             fixture->pubkey,
    127             fixture->cmp_ctx->digest)));
    128 
    129     ASN1_BIT_STRING_free(protection);
    130     return ret;
    131 }
    132 
    133 static int test_cmp_calc_protection_no_key_no_secret(void)
    134 {
    135     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    136     if (!TEST_ptr(fixture->msg = load_pkimsg(ir_unprotected_f, libctx))
    137         || !TEST_ptr(fixture->msg->header->protectionAlg = X509_ALGOR_new() /* no specific alg needed here */)) {
    138         tear_down(fixture);
    139         fixture = NULL;
    140     }
    141 
    142     EXECUTE_TEST(execute_calc_protection_fails_test, tear_down);
    143     return result;
    144 }
    145 
    146 static int test_cmp_calc_protection_pkey(void)
    147 {
    148     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    149     fixture->pubkey = prot_RSA_key;
    150     if (!TEST_true(OSSL_CMP_CTX_set1_pkey(fixture->cmp_ctx, prot_RSA_key))
    151         || !TEST_ptr(fixture->msg = load_pkimsg(ir_protected_f, libctx))) {
    152         tear_down(fixture);
    153         fixture = NULL;
    154     }
    155     EXECUTE_TEST(execute_calc_protection_signature_test, tear_down);
    156     return result;
    157 }
    158 
    159 #ifndef OPENSSL_NO_ECX
    160 static int test_cmp_calc_protection_pkey_Ed(void)
    161 {
    162     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    163     fixture->pubkey = prot_Ed_key;
    164     if (!TEST_true(OSSL_CMP_CTX_set1_pkey(fixture->cmp_ctx, prot_Ed_key))
    165         || !TEST_ptr(fixture->msg = load_pkimsg(genm_prot_Ed_f, libctx))) {
    166         tear_down(fixture);
    167         fixture = NULL;
    168     }
    169     EXECUTE_TEST(execute_calc_protection_signature_test, tear_down);
    170     return result;
    171 }
    172 #endif
    173 
    174 static int test_cmp_calc_protection_pbmac(void)
    175 {
    176     unsigned char sec_insta[] = { 'i', 'n', 's', 't', 'a' };
    177 
    178     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    179     if (!TEST_true(OSSL_CMP_CTX_set1_secretValue(fixture->cmp_ctx,
    180             sec_insta, sizeof(sec_insta)))
    181         || !TEST_ptr(fixture->msg = load_pkimsg(ip_PBM_f, libctx))) {
    182         tear_down(fixture);
    183         fixture = NULL;
    184     }
    185     EXECUTE_TEST(execute_calc_protection_pbmac_test, tear_down);
    186     return result;
    187 }
    188 static int execute_MSG_protect_test(CMP_PROTECT_TEST_FIXTURE *fixture)
    189 {
    190     return TEST_int_eq(fixture->expected,
    191         ossl_cmp_msg_protect(fixture->cmp_ctx, fixture->msg));
    192 }
    193 
    194 #define SET_OPT_UNPROTECTED_SEND(ctx, val) \
    195     OSSL_CMP_CTX_set_option((ctx), OSSL_CMP_OPT_UNPROTECTED_SEND, (val))
    196 static int test_MSG_protect_unprotected_request(void)
    197 {
    198     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    199 
    200     fixture->expected = 1;
    201     if (!TEST_ptr(fixture->msg = OSSL_CMP_MSG_dup(ir_unprotected))
    202         || !TEST_true(SET_OPT_UNPROTECTED_SEND(fixture->cmp_ctx, 1))) {
    203         tear_down(fixture);
    204         fixture = NULL;
    205     }
    206     EXECUTE_TEST(execute_MSG_protect_test, tear_down);
    207     return result;
    208 }
    209 
    210 static int test_MSG_protect_with_msg_sig_alg_protection_plus_rsa_key(void)
    211 {
    212     const size_t size = sizeof(rand_data) / 2;
    213 
    214     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    215     fixture->expected = 1;
    216 
    217     if (!TEST_ptr(fixture->msg = OSSL_CMP_MSG_dup(ir_unprotected))
    218         || !TEST_true(SET_OPT_UNPROTECTED_SEND(fixture->cmp_ctx, 0))
    219         /*
    220          * Use half of the 16 bytes of random input
    221          * for each reference and secret value
    222          */
    223         || !TEST_true(OSSL_CMP_CTX_set1_referenceValue(fixture->cmp_ctx,
    224             rand_data, size))
    225         || !TEST_true(OSSL_CMP_CTX_set1_secretValue(fixture->cmp_ctx,
    226             rand_data + size,
    227             size))) {
    228         tear_down(fixture);
    229         fixture = NULL;
    230     }
    231     EXECUTE_TEST(execute_MSG_protect_test, tear_down);
    232     return result;
    233 }
    234 
    235 static int test_MSG_protect_with_certificate_and_key(void)
    236 {
    237     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    238     fixture->expected = 1;
    239 
    240     if (!TEST_ptr(fixture->msg = OSSL_CMP_MSG_dup(ir_unprotected))
    241         || !TEST_true(SET_OPT_UNPROTECTED_SEND(fixture->cmp_ctx, 0))
    242         || !TEST_true(OSSL_CMP_CTX_set1_pkey(fixture->cmp_ctx, server_key))
    243         || !TEST_true(OSSL_CMP_CTX_set1_cert(fixture->cmp_ctx,
    244             server_cert))) {
    245         tear_down(fixture);
    246         fixture = NULL;
    247     }
    248     EXECUTE_TEST(execute_MSG_protect_test, tear_down);
    249     return result;
    250 }
    251 
    252 static int test_MSG_protect_certificate_based_without_cert(void)
    253 {
    254     OSSL_CMP_CTX *ctx;
    255 
    256     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    257     ctx = fixture->cmp_ctx;
    258     fixture->expected = 0;
    259     if (!TEST_ptr(fixture->msg = OSSL_CMP_MSG_dup(ir_unprotected))
    260         || !TEST_true(SET_OPT_UNPROTECTED_SEND(ctx, 0))
    261         || !TEST_true(EVP_PKEY_up_ref(server_key))
    262         || !TEST_true(OSSL_CMP_CTX_set0_newPkey(ctx, 1, server_key))) {
    263         tear_down(fixture);
    264         fixture = NULL;
    265     }
    266     EXECUTE_TEST(execute_MSG_protect_test, tear_down);
    267     return result;
    268 }
    269 
    270 static int test_MSG_protect_no_key_no_secret(void)
    271 {
    272     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    273     fixture->expected = 0;
    274     if (!TEST_ptr(fixture->msg = OSSL_CMP_MSG_dup(ir_unprotected))
    275         || !TEST_true(SET_OPT_UNPROTECTED_SEND(fixture->cmp_ctx, 0))) {
    276         tear_down(fixture);
    277         fixture = NULL;
    278     }
    279     EXECUTE_TEST(execute_MSG_protect_test, tear_down);
    280     return result;
    281 }
    282 
    283 static int test_MSG_protect_pbmac_no_sender(int with_ref)
    284 {
    285     static unsigned char secret[] = { 47, 11, 8, 15 };
    286     static unsigned char ref[] = { 0xca, 0xfe, 0xba, 0xbe };
    287 
    288     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    289     fixture->expected = with_ref;
    290     if (!TEST_ptr(fixture->msg = OSSL_CMP_MSG_dup(ir_unprotected))
    291         || !SET_OPT_UNPROTECTED_SEND(fixture->cmp_ctx, 0)
    292         || !ossl_cmp_hdr_set1_sender(fixture->msg->header, NULL)
    293         || !OSSL_CMP_CTX_set1_secretValue(fixture->cmp_ctx,
    294             secret, sizeof(secret))
    295         || (!OSSL_CMP_CTX_set1_referenceValue(fixture->cmp_ctx,
    296             with_ref ? ref : NULL,
    297             sizeof(ref)))) {
    298         tear_down(fixture);
    299         fixture = NULL;
    300     }
    301     EXECUTE_TEST(execute_MSG_protect_test, tear_down);
    302     return result;
    303 }
    304 
    305 static int test_MSG_protect_pbmac_no_sender_with_ref(void)
    306 {
    307     return test_MSG_protect_pbmac_no_sender(1);
    308 }
    309 
    310 static int test_MSG_protect_pbmac_no_sender_no_ref(void)
    311 {
    312     return test_MSG_protect_pbmac_no_sender(0);
    313 }
    314 
    315 static int execute_MSG_add_extraCerts_test(CMP_PROTECT_TEST_FIXTURE *fixture)
    316 {
    317     return TEST_true(ossl_cmp_msg_add_extraCerts(fixture->cmp_ctx,
    318         fixture->msg));
    319 }
    320 
    321 static int test_MSG_add_extraCerts(void)
    322 {
    323     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    324     if (!TEST_ptr(fixture->msg = OSSL_CMP_MSG_dup(ir_protected))) {
    325         tear_down(fixture);
    326         fixture = NULL;
    327     }
    328     EXECUTE_TEST(execute_MSG_add_extraCerts_test, tear_down);
    329     return result;
    330 }
    331 
    332 #ifndef OPENSSL_NO_EC
    333 /* The cert chain tests use EC certs so we skip them in no-ec builds */
    334 static int execute_cmp_build_cert_chain_test(CMP_PROTECT_TEST_FIXTURE *fixture)
    335 {
    336     int ret = 0;
    337     OSSL_CMP_CTX *ctx = fixture->cmp_ctx;
    338     X509_STORE *store;
    339     STACK_OF(X509) *chain = X509_build_chain(fixture->cert, fixture->certs, NULL,
    340         fixture->with_ss, ctx->libctx, ctx->propq);
    341 
    342     if (TEST_ptr(chain)) {
    343         /* Check whether chain built is equal to the expected one */
    344         ret = TEST_int_eq(0, STACK_OF_X509_cmp(chain, fixture->chain));
    345         OSSL_STACK_OF_X509_free(chain);
    346     }
    347     if (!ret)
    348         return 0;
    349 
    350     if (TEST_ptr(store = X509_STORE_new())
    351         && TEST_true(X509_STORE_add_cert(store, root))) {
    352         X509_VERIFY_PARAM_set_flags(X509_STORE_get0_param(store),
    353             X509_V_FLAG_NO_CHECK_TIME);
    354         chain = X509_build_chain(fixture->cert, fixture->certs, store,
    355             fixture->with_ss, ctx->libctx, ctx->propq);
    356         ret = TEST_int_eq(fixture->expected, chain != NULL);
    357         if (ret && chain != NULL) {
    358             /* Check whether chain built is equal to the expected one */
    359             ret = TEST_int_eq(0, STACK_OF_X509_cmp(chain, fixture->chain));
    360             OSSL_STACK_OF_X509_free(chain);
    361         }
    362     }
    363     X509_STORE_free(store);
    364     return ret;
    365 }
    366 
    367 static int test_cmp_build_cert_chain(void)
    368 {
    369     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    370     fixture->expected = 1;
    371     fixture->with_ss = 0;
    372     fixture->cert = endentity2;
    373     if (!TEST_ptr(fixture->certs = sk_X509_new_null())
    374         || !TEST_ptr(fixture->chain = sk_X509_new_null())
    375         || !TEST_true(sk_X509_push(fixture->certs, endentity1))
    376         || !TEST_true(sk_X509_push(fixture->certs, root))
    377         || !TEST_true(sk_X509_push(fixture->certs, intermediate))
    378         || !TEST_true(sk_X509_push(fixture->chain, endentity2))
    379         || !TEST_true(sk_X509_push(fixture->chain, intermediate))) {
    380         tear_down(fixture);
    381         fixture = NULL;
    382     }
    383     if (fixture != NULL) {
    384         result = execute_cmp_build_cert_chain_test(fixture);
    385         fixture->with_ss = 1;
    386         if (result && TEST_true(sk_X509_push(fixture->chain, root)))
    387             result = execute_cmp_build_cert_chain_test(fixture);
    388     }
    389     tear_down(fixture);
    390     return result;
    391 }
    392 
    393 static int test_cmp_build_cert_chain_missing_intermediate(void)
    394 {
    395     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    396     fixture->expected = 0;
    397     fixture->with_ss = 0;
    398     fixture->cert = endentity2;
    399     if (!TEST_ptr(fixture->certs = sk_X509_new_null())
    400         || !TEST_ptr(fixture->chain = sk_X509_new_null())
    401         || !TEST_true(sk_X509_push(fixture->certs, endentity1))
    402         || !TEST_true(sk_X509_push(fixture->certs, root))
    403         || !TEST_true(sk_X509_push(fixture->chain, endentity2))) {
    404         tear_down(fixture);
    405         fixture = NULL;
    406     }
    407     EXECUTE_TEST(execute_cmp_build_cert_chain_test, tear_down);
    408     return result;
    409 }
    410 
    411 static int test_cmp_build_cert_chain_no_root(void)
    412 {
    413     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    414     fixture->expected = 1;
    415     fixture->with_ss = 0;
    416     fixture->cert = endentity2;
    417     if (!TEST_ptr(fixture->certs = sk_X509_new_null())
    418         || !TEST_ptr(fixture->chain = sk_X509_new_null())
    419         || !TEST_true(sk_X509_push(fixture->certs, endentity1))
    420         || !TEST_true(sk_X509_push(fixture->certs, intermediate))
    421         || !TEST_true(sk_X509_push(fixture->chain, endentity2))
    422         || !TEST_true(sk_X509_push(fixture->chain, intermediate))) {
    423         tear_down(fixture);
    424         fixture = NULL;
    425     }
    426     EXECUTE_TEST(execute_cmp_build_cert_chain_test, tear_down);
    427     return result;
    428 }
    429 
    430 static int test_cmp_build_cert_chain_only_root(void)
    431 {
    432     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    433     fixture->expected = 1;
    434     fixture->with_ss = 0; /* still chain must include the only cert (root) */
    435     fixture->cert = root;
    436     if (!TEST_ptr(fixture->certs = sk_X509_new_null())
    437         || !TEST_ptr(fixture->chain = sk_X509_new_null())
    438         || !TEST_true(sk_X509_push(fixture->certs, root))
    439         || !TEST_true(sk_X509_push(fixture->chain, root))) {
    440         tear_down(fixture);
    441         fixture = NULL;
    442     }
    443     EXECUTE_TEST(execute_cmp_build_cert_chain_test, tear_down);
    444     return result;
    445 }
    446 
    447 static int test_cmp_build_cert_chain_no_certs(void)
    448 {
    449     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    450     fixture->expected = 0;
    451     fixture->with_ss = 0;
    452     fixture->cert = endentity2;
    453     if (!TEST_ptr(fixture->certs = sk_X509_new_null())
    454         || !TEST_ptr(fixture->chain = sk_X509_new_null())
    455         || !TEST_true(sk_X509_push(fixture->chain, endentity2))) {
    456         tear_down(fixture);
    457         fixture = NULL;
    458     }
    459     EXECUTE_TEST(execute_cmp_build_cert_chain_test, tear_down);
    460     return result;
    461 }
    462 #endif /* OPENSSL_NO_EC */
    463 
    464 static int execute_X509_STORE_test(CMP_PROTECT_TEST_FIXTURE *fixture)
    465 {
    466     X509_STORE *store = X509_STORE_new();
    467     STACK_OF(X509) *sk = NULL;
    468     int res = 0;
    469 
    470     if (!TEST_true(ossl_cmp_X509_STORE_add1_certs(store,
    471             fixture->certs,
    472             fixture->callback_arg)))
    473         goto err;
    474     sk = X509_STORE_get1_all_certs(store);
    475     if (!TEST_int_eq(0, STACK_OF_X509_cmp(sk, fixture->chain)))
    476         goto err;
    477     res = 1;
    478 err:
    479     X509_STORE_free(store);
    480     OSSL_STACK_OF_X509_free(sk);
    481     return res;
    482 }
    483 
    484 static int test_X509_STORE(void)
    485 {
    486     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    487     fixture->callback_arg = 0; /* self-issued allowed */
    488     if (!TEST_ptr(fixture->certs = sk_X509_new_null())
    489         || !sk_X509_push(fixture->certs, endentity1)
    490         || !sk_X509_push(fixture->certs, endentity2)
    491         || !sk_X509_push(fixture->certs, root)
    492         || !sk_X509_push(fixture->certs, intermediate)
    493         || !TEST_ptr(fixture->chain = sk_X509_dup(fixture->certs))) {
    494         tear_down(fixture);
    495         fixture = NULL;
    496     }
    497     EXECUTE_TEST(execute_X509_STORE_test, tear_down);
    498     return result;
    499 }
    500 
    501 static int test_X509_STORE_only_self_issued(void)
    502 {
    503     SETUP_TEST_FIXTURE(CMP_PROTECT_TEST_FIXTURE, set_up);
    504     fixture->certs = sk_X509_new_null();
    505     fixture->chain = sk_X509_new_null();
    506     fixture->callback_arg = 1; /* only self-issued */
    507     if (!TEST_true(sk_X509_push(fixture->certs, endentity1))
    508         || !TEST_true(sk_X509_push(fixture->certs, endentity2))
    509         || !TEST_true(sk_X509_push(fixture->certs, root))
    510         || !TEST_true(sk_X509_push(fixture->certs, intermediate))
    511         || !TEST_true(sk_X509_push(fixture->chain, root))) {
    512         tear_down(fixture);
    513         fixture = NULL;
    514     }
    515     EXECUTE_TEST(execute_X509_STORE_test, tear_down);
    516     return result;
    517 }
    518 
    519 void cleanup_tests(void)
    520 {
    521     EVP_PKEY_free(prot_RSA_key);
    522 #ifndef OPENSSL_NO_ECX
    523     EVP_PKEY_free(prot_Ed_key);
    524     OSSL_CMP_MSG_free(genm_protected_Ed);
    525 #endif
    526     EVP_PKEY_free(server_key);
    527     X509_free(server_cert);
    528     X509_free(endentity1);
    529     X509_free(endentity2);
    530     X509_free(root);
    531     X509_free(intermediate);
    532     OSSL_CMP_MSG_free(ir_protected);
    533     OSSL_CMP_MSG_free(ir_unprotected);
    534     OSSL_PROVIDER_unload(default_null_provider);
    535     OSSL_PROVIDER_unload(provider);
    536     OSSL_LIB_CTX_free(libctx);
    537 }
    538 
    539 #define USAGE "prot_RSA.pem IR_protected.der prot_Ed.pem "                       \
    540               "GENM_protected_Ed.der IR_unprotected.der IP_PBM.der "             \
    541               "server.crt server.pem EndEntity1.crt EndEntity2.crt Root_CA.crt " \
    542               "Intermediate_CA.crt module_name [module_conf_file]\n"
    543 OPT_TEST_DECLARE_USAGE(USAGE)
    544 
    545 int setup_tests(void)
    546 {
    547     char *prot_RSA_f;
    548     char *prot_Ed_f;
    549     char *server_key_f;
    550     char *server_cert_f;
    551     char *endentity1_f;
    552     char *endentity2_f;
    553     char *root_f;
    554     char *intermediate_f;
    555 
    556     if (!test_skip_common_options()) {
    557         TEST_error("Error parsing test options\n");
    558         return 0;
    559     }
    560 
    561     RAND_bytes(rand_data, OSSL_CMP_TRANSACTIONID_LENGTH);
    562     if (!TEST_ptr(prot_RSA_f = test_get_argument(0))
    563         || !TEST_ptr(ir_protected_f = test_get_argument(1))
    564         || !TEST_ptr(prot_Ed_f = test_get_argument(2))
    565         || !TEST_ptr(genm_prot_Ed_f = test_get_argument(3))
    566         || !TEST_ptr(ir_unprotected_f = test_get_argument(4))
    567         || !TEST_ptr(ip_PBM_f = test_get_argument(5))
    568         || !TEST_ptr(server_cert_f = test_get_argument(6))
    569         || !TEST_ptr(server_key_f = test_get_argument(7))
    570         || !TEST_ptr(endentity1_f = test_get_argument(8))
    571         || !TEST_ptr(endentity2_f = test_get_argument(9))
    572         || !TEST_ptr(root_f = test_get_argument(10))
    573         || !TEST_ptr(intermediate_f = test_get_argument(11))) {
    574         TEST_error("usage: cmp_protect_test %s", USAGE);
    575         return 0;
    576     }
    577 
    578     if (!test_arg_libctx(&libctx, &default_null_provider, &provider, 12, USAGE))
    579         return 0;
    580 
    581     if (!TEST_ptr(server_key = load_pkey_pem(server_key_f, libctx))
    582         || !TEST_ptr(server_cert = load_cert_pem(server_cert_f, libctx)))
    583         return 0;
    584 
    585     if (!TEST_ptr(prot_RSA_key = load_pkey_pem(prot_RSA_f, libctx)))
    586         return 0;
    587 #ifndef OPENSSL_NO_ECX
    588     if (!TEST_ptr(prot_Ed_key = load_pkey_pem(prot_Ed_f, libctx)))
    589         return 0;
    590 #endif
    591     if (!TEST_ptr(ir_protected = load_pkimsg(ir_protected_f, libctx))
    592 #ifndef OPENSSL_NO_ECX
    593         || !TEST_ptr(genm_protected_Ed = load_pkimsg(genm_prot_Ed_f, libctx))
    594 #endif
    595         || !TEST_ptr(ir_unprotected = load_pkimsg(ir_unprotected_f, libctx)))
    596         return 0;
    597     if (!TEST_ptr(endentity1 = load_cert_pem(endentity1_f, libctx))
    598         || !TEST_ptr(endentity2 = load_cert_pem(endentity2_f, libctx))
    599         || !TEST_ptr(root = load_cert_pem(root_f, libctx))
    600         || !TEST_ptr(intermediate = load_cert_pem(intermediate_f, libctx)))
    601         return 0;
    602     if (!TEST_int_eq(1, RAND_bytes(rand_data, OSSL_CMP_TRANSACTIONID_LENGTH)))
    603         return 0;
    604 
    605     /* Message protection tests */
    606     ADD_TEST(test_cmp_calc_protection_no_key_no_secret);
    607     ADD_TEST(test_cmp_calc_protection_pkey);
    608 #ifndef OPENSSL_NO_ECX
    609     ADD_TEST(test_cmp_calc_protection_pkey_Ed);
    610 #endif
    611     ADD_TEST(test_cmp_calc_protection_pbmac);
    612 
    613     ADD_TEST(test_MSG_protect_with_msg_sig_alg_protection_plus_rsa_key);
    614     ADD_TEST(test_MSG_protect_with_certificate_and_key);
    615     ADD_TEST(test_MSG_protect_certificate_based_without_cert);
    616     ADD_TEST(test_MSG_protect_unprotected_request);
    617     ADD_TEST(test_MSG_protect_no_key_no_secret);
    618     ADD_TEST(test_MSG_protect_pbmac_no_sender_with_ref);
    619     ADD_TEST(test_MSG_protect_pbmac_no_sender_no_ref);
    620     ADD_TEST(test_MSG_add_extraCerts);
    621 
    622 #ifndef OPENSSL_NO_EC
    623     ADD_TEST(test_cmp_build_cert_chain);
    624     ADD_TEST(test_cmp_build_cert_chain_only_root);
    625     ADD_TEST(test_cmp_build_cert_chain_no_root);
    626     ADD_TEST(test_cmp_build_cert_chain_missing_intermediate);
    627     ADD_TEST(test_cmp_build_cert_chain_no_certs);
    628 #endif
    629 
    630     ADD_TEST(test_X509_STORE);
    631     ADD_TEST(test_X509_STORE_only_self_issued);
    632 
    633     return 1;
    634 }
    635