Home | History | Annotate | Line # | Download | only in apps
cmp.c revision 1.4
      1 /*
      2  * Copyright 2007-2023 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 /* This app is disabled when OPENSSL_NO_CMP is defined. */
     13 
     14 #include <string.h>
     15 #include <ctype.h>
     16 
     17 #include "apps.h"
     18 #include "http_server.h"
     19 #include "s_apps.h"
     20 #include "progs.h"
     21 
     22 #include "cmp_mock_srv.h"
     23 
     24 /* tweaks needed due to missing unistd.h on Windows */
     25 #if defined(_WIN32) && !defined(__BORLANDC__)
     26 # define access _access
     27 #endif
     28 #ifndef F_OK
     29 # define F_OK 0
     30 #endif
     31 
     32 #include <openssl/ui.h>
     33 #include <openssl/pkcs12.h>
     34 #include <openssl/ssl.h>
     35 
     36 /* explicit #includes not strictly needed since implied by the above: */
     37 #include <stdlib.h>
     38 #include <openssl/cmp.h>
     39 #include <openssl/cmp_util.h>
     40 #include <openssl/crmf.h>
     41 #include <openssl/crypto.h>
     42 #include <openssl/err.h>
     43 #include <openssl/store.h>
     44 #include <openssl/objects.h>
     45 #include <openssl/x509.h>
     46 
     47 static char *prog;
     48 static char *opt_config = NULL;
     49 #define CMP_SECTION "cmp"
     50 #define SECTION_NAME_MAX 40 /* max length of section name */
     51 #define DEFAULT_SECTION "default"
     52 static char *opt_section = CMP_SECTION;
     53 static int opt_verbosity = OSSL_CMP_LOG_INFO;
     54 
     55 static int read_config(void);
     56 
     57 static CONF *conf = NULL; /* OpenSSL config file context structure */
     58 static OSSL_CMP_CTX *cmp_ctx = NULL; /* the client-side CMP context */
     59 
     60 /* the type of cmp command we want to send */
     61 typedef enum {
     62     CMP_IR,
     63     CMP_KUR,
     64     CMP_CR,
     65     CMP_P10CR,
     66     CMP_RR,
     67     CMP_GENM
     68 } cmp_cmd_t;
     69 
     70 /* message transfer */
     71 #ifndef OPENSSL_NO_SOCK
     72 static char *opt_server = NULL;
     73 static char *opt_proxy = NULL;
     74 static char *opt_no_proxy = NULL;
     75 #endif
     76 static char *opt_recipient = NULL;
     77 static char *opt_path = NULL;
     78 static int opt_keep_alive = 1;
     79 static int opt_msg_timeout = -1;
     80 static int opt_total_timeout = -1;
     81 
     82 /* server authentication */
     83 static char *opt_trusted = NULL;
     84 static char *opt_untrusted = NULL;
     85 static char *opt_srvcert = NULL;
     86 static char *opt_expect_sender = NULL;
     87 static int opt_ignore_keyusage = 0;
     88 static int opt_unprotected_errors = 0;
     89 static char *opt_extracertsout = NULL;
     90 static char *opt_cacertsout = NULL;
     91 
     92 /* client authentication */
     93 static char *opt_ref = NULL;
     94 static char *opt_secret = NULL;
     95 static char *opt_cert = NULL;
     96 static char *opt_own_trusted = NULL;
     97 static char *opt_key = NULL;
     98 static char *opt_keypass = NULL;
     99 static char *opt_digest = NULL;
    100 static char *opt_mac = NULL;
    101 static char *opt_extracerts = NULL;
    102 static int opt_unprotected_requests = 0;
    103 
    104 /* generic message */
    105 static char *opt_cmd_s = NULL;
    106 static int opt_cmd = -1;
    107 static char *opt_geninfo = NULL;
    108 static char *opt_infotype_s = NULL;
    109 static int opt_infotype = NID_undef;
    110 
    111 /* certificate enrollment */
    112 static char *opt_newkey = NULL;
    113 static char *opt_newkeypass = NULL;
    114 static char *opt_subject = NULL;
    115 static char *opt_issuer = NULL;
    116 static int opt_days = 0;
    117 static char *opt_reqexts = NULL;
    118 static char *opt_sans = NULL;
    119 static int opt_san_nodefault = 0;
    120 static char *opt_policies = NULL;
    121 static char *opt_policy_oids = NULL;
    122 static int opt_policy_oids_critical = 0;
    123 static int opt_popo = OSSL_CRMF_POPO_NONE - 1;
    124 static char *opt_csr = NULL;
    125 static char *opt_out_trusted = NULL;
    126 static int opt_implicit_confirm = 0;
    127 static int opt_disable_confirm = 0;
    128 static char *opt_certout = NULL;
    129 static char *opt_chainout = NULL;
    130 
    131 /* certificate enrollment and revocation */
    132 static char *opt_oldcert = NULL;
    133 static int opt_revreason = CRL_REASON_NONE;
    134 
    135 /* credentials format */
    136 static char *opt_certform_s = "PEM";
    137 static int opt_certform = FORMAT_PEM;
    138 static char *opt_keyform_s = NULL;
    139 static int opt_keyform = FORMAT_UNDEF;
    140 static char *opt_otherpass = NULL;
    141 static char *opt_engine = NULL;
    142 
    143 #ifndef OPENSSL_NO_SOCK
    144 /* TLS connection */
    145 static int opt_tls_used = 0;
    146 static char *opt_tls_cert = NULL;
    147 static char *opt_tls_key = NULL;
    148 static char *opt_tls_keypass = NULL;
    149 static char *opt_tls_extra = NULL;
    150 static char *opt_tls_trusted = NULL;
    151 static char *opt_tls_host = NULL;
    152 #endif
    153 
    154 /* client-side debugging */
    155 static int opt_batch = 0;
    156 static int opt_repeat = 1;
    157 static char *opt_reqin = NULL;
    158 static int opt_reqin_new_tid = 0;
    159 static char *opt_reqout = NULL;
    160 static char *opt_rspin = NULL;
    161 static int rspin_in_use = 0;
    162 static char *opt_rspout = NULL;
    163 static int opt_use_mock_srv = 0;
    164 
    165 /* mock server */
    166 #ifndef OPENSSL_NO_SOCK
    167 static char *opt_port = NULL;
    168 static int opt_max_msgs = 0;
    169 #endif
    170 static char *opt_srv_ref = NULL;
    171 static char *opt_srv_secret = NULL;
    172 static char *opt_srv_cert = NULL;
    173 static char *opt_srv_key = NULL;
    174 static char *opt_srv_keypass = NULL;
    175 
    176 static char *opt_srv_trusted = NULL;
    177 static char *opt_srv_untrusted = NULL;
    178 static char *opt_rsp_cert = NULL;
    179 static char *opt_rsp_extracerts = NULL;
    180 static char *opt_rsp_capubs = NULL;
    181 static int opt_poll_count = 0;
    182 static int opt_check_after = 1;
    183 static int opt_grant_implicitconf = 0;
    184 
    185 static int opt_pkistatus = OSSL_CMP_PKISTATUS_accepted;
    186 static int opt_failure = INT_MIN;
    187 static int opt_failurebits = 0;
    188 static char *opt_statusstring = NULL;
    189 static int opt_send_error = 0;
    190 static int opt_send_unprotected = 0;
    191 static int opt_send_unprot_err = 0;
    192 static int opt_accept_unprotected = 0;
    193 static int opt_accept_unprot_err = 0;
    194 static int opt_accept_raverified = 0;
    195 
    196 static X509_VERIFY_PARAM *vpm = NULL;
    197 
    198 typedef enum OPTION_choice {
    199     OPT_COMMON,
    200     OPT_CONFIG, OPT_SECTION, OPT_VERBOSITY,
    201 
    202     OPT_CMD, OPT_INFOTYPE, OPT_GENINFO,
    203 
    204     OPT_NEWKEY, OPT_NEWKEYPASS, OPT_SUBJECT, OPT_ISSUER,
    205     OPT_DAYS, OPT_REQEXTS,
    206     OPT_SANS, OPT_SAN_NODEFAULT,
    207     OPT_POLICIES, OPT_POLICY_OIDS, OPT_POLICY_OIDS_CRITICAL,
    208     OPT_POPO, OPT_CSR,
    209     OPT_OUT_TRUSTED, OPT_IMPLICIT_CONFIRM, OPT_DISABLE_CONFIRM,
    210     OPT_CERTOUT, OPT_CHAINOUT,
    211 
    212     OPT_OLDCERT, OPT_REVREASON,
    213 
    214 #ifndef OPENSSL_NO_SOCK
    215     OPT_SERVER, OPT_PROXY, OPT_NO_PROXY,
    216 #endif
    217     OPT_RECIPIENT, OPT_PATH,
    218     OPT_KEEP_ALIVE, OPT_MSG_TIMEOUT, OPT_TOTAL_TIMEOUT,
    219 
    220     OPT_TRUSTED, OPT_UNTRUSTED, OPT_SRVCERT,
    221     OPT_EXPECT_SENDER,
    222     OPT_IGNORE_KEYUSAGE, OPT_UNPROTECTED_ERRORS,
    223     OPT_EXTRACERTSOUT, OPT_CACERTSOUT,
    224 
    225     OPT_REF, OPT_SECRET, OPT_CERT, OPT_OWN_TRUSTED, OPT_KEY, OPT_KEYPASS,
    226     OPT_DIGEST, OPT_MAC, OPT_EXTRACERTS,
    227     OPT_UNPROTECTED_REQUESTS,
    228 
    229     OPT_CERTFORM, OPT_KEYFORM,
    230     OPT_OTHERPASS,
    231 #ifndef OPENSSL_NO_ENGINE
    232     OPT_ENGINE,
    233 #endif
    234     OPT_PROV_ENUM,
    235     OPT_R_ENUM,
    236 
    237 #ifndef OPENSSL_NO_SOCK
    238     OPT_TLS_USED, OPT_TLS_CERT, OPT_TLS_KEY,
    239     OPT_TLS_KEYPASS,
    240     OPT_TLS_EXTRA, OPT_TLS_TRUSTED, OPT_TLS_HOST,
    241 #endif
    242 
    243     OPT_BATCH, OPT_REPEAT,
    244     OPT_REQIN, OPT_REQIN_NEW_TID, OPT_REQOUT, OPT_RSPIN, OPT_RSPOUT,
    245     OPT_USE_MOCK_SRV,
    246 
    247 #ifndef OPENSSL_NO_SOCK
    248     OPT_PORT, OPT_MAX_MSGS,
    249 #endif
    250     OPT_SRV_REF, OPT_SRV_SECRET,
    251     OPT_SRV_CERT, OPT_SRV_KEY, OPT_SRV_KEYPASS,
    252     OPT_SRV_TRUSTED, OPT_SRV_UNTRUSTED,
    253     OPT_RSP_CERT, OPT_RSP_EXTRACERTS, OPT_RSP_CAPUBS,
    254     OPT_POLL_COUNT, OPT_CHECK_AFTER,
    255     OPT_GRANT_IMPLICITCONF,
    256     OPT_PKISTATUS, OPT_FAILURE,
    257     OPT_FAILUREBITS, OPT_STATUSSTRING,
    258     OPT_SEND_ERROR, OPT_SEND_UNPROTECTED,
    259     OPT_SEND_UNPROT_ERR, OPT_ACCEPT_UNPROTECTED,
    260     OPT_ACCEPT_UNPROT_ERR, OPT_ACCEPT_RAVERIFIED,
    261 
    262     OPT_V_ENUM
    263 } OPTION_CHOICE;
    264 
    265 const OPTIONS cmp_options[] = {
    266     /* entries must be in the same order as enumerated above!! */
    267     {"help", OPT_HELP, '-', "Display this summary"},
    268     {"config", OPT_CONFIG, 's',
    269      "Configuration file to use. \"\" = none. Default from env variable OPENSSL_CONF"},
    270     {"section", OPT_SECTION, 's',
    271      "Section(s) in config file to get options from. \"\" = 'default'. Default 'cmp'"},
    272     {"verbosity", OPT_VERBOSITY, 'N',
    273      "Log level; 3=ERR, 4=WARN, 6=INFO, 7=DEBUG, 8=TRACE. Default 6 = INFO"},
    274 
    275     OPT_SECTION("Generic message"),
    276     {"cmd", OPT_CMD, 's', "CMP request to send: ir/cr/kur/p10cr/rr/genm"},
    277     {"infotype", OPT_INFOTYPE, 's',
    278      "InfoType name for requesting specific info in genm, e.g. 'signKeyPairTypes'"},
    279     {"geninfo", OPT_GENINFO, 's',
    280      "generalInfo integer values to place in request PKIHeader with given OID"},
    281     {OPT_MORE_STR, 0, 0,
    282      "specified in the form <OID>:int:<n>, e.g. \"1.2.3.4:int:56789\""},
    283 
    284     OPT_SECTION("Certificate enrollment"),
    285     {"newkey", OPT_NEWKEY, 's',
    286      "Private or public key for the requested cert. Default: CSR key or client key"},
    287     {"newkeypass", OPT_NEWKEYPASS, 's', "New private key pass phrase source"},
    288     {"subject", OPT_SUBJECT, 's',
    289      "Distinguished Name (DN) of subject to use in the requested cert template"},
    290     {OPT_MORE_STR, 0, 0,
    291      "For kur, default is subject of -csr arg or reference cert (see -oldcert)"},
    292     {OPT_MORE_STR, 0, 0,
    293      "this default is used for ir and cr only if no Subject Alt Names are set"},
    294     {"issuer", OPT_ISSUER, 's',
    295      "DN of the issuer to place in the requested certificate template"},
    296     {OPT_MORE_STR, 0, 0,
    297      "also used as recipient if neither -recipient nor -srvcert are given"},
    298     {"days", OPT_DAYS, 'N',
    299      "Requested validity time of the new certificate in number of days"},
    300     {"reqexts", OPT_REQEXTS, 's',
    301      "Name of config file section defining certificate request extensions."},
    302     {OPT_MORE_STR, 0, 0,
    303      "Augments or replaces any extensions contained CSR given with -csr"},
    304     {"sans", OPT_SANS, 's',
    305      "Subject Alt Names (IPADDR/DNS/URI) to add as (critical) cert req extension"},
    306     {"san_nodefault", OPT_SAN_NODEFAULT, '-',
    307      "Do not take default SANs from reference certificate (see -oldcert)"},
    308     {"policies", OPT_POLICIES, 's',
    309      "Name of config file section defining policies certificate request extension"},
    310     {"policy_oids", OPT_POLICY_OIDS, 's',
    311      "Policy OID(s) to add as policies certificate request extension"},
    312     {"policy_oids_critical", OPT_POLICY_OIDS_CRITICAL, '-',
    313      "Flag the policy OID(s) given with -policy_oids as critical"},
    314     {"popo", OPT_POPO, 'n',
    315      "Proof-of-Possession (POPO) method to use for ir/cr/kur where"},
    316     {OPT_MORE_STR, 0, 0,
    317      "-1 = NONE, 0 = RAVERIFIED, 1 = SIGNATURE (default), 2 = KEYENC"},
    318     {"csr", OPT_CSR, 's',
    319      "PKCS#10 CSR file in PEM or DER format to convert or to use in p10cr"},
    320     {"out_trusted", OPT_OUT_TRUSTED, 's',
    321      "Certificates to trust when verifying newly enrolled certificates"},
    322     {"implicit_confirm", OPT_IMPLICIT_CONFIRM, '-',
    323      "Request implicit confirmation of newly enrolled certificates"},
    324     {"disable_confirm", OPT_DISABLE_CONFIRM, '-',
    325      "Do not confirm newly enrolled certificate w/o requesting implicit"},
    326     {OPT_MORE_STR, 0, 0,
    327      "confirmation. WARNING: This leads to behavior violating RFC 4210"},
    328     {"certout", OPT_CERTOUT, 's',
    329      "File to save newly enrolled certificate"},
    330     {"chainout", OPT_CHAINOUT, 's',
    331      "File to save the chain of newly enrolled certificate"},
    332 
    333     OPT_SECTION("Certificate enrollment and revocation"),
    334 
    335     {"oldcert", OPT_OLDCERT, 's',
    336      "Certificate to be updated (defaulting to -cert) or to be revoked in rr;"},
    337     {OPT_MORE_STR, 0, 0,
    338      "also used as reference (defaulting to -cert) for subject DN and SANs."},
    339     {OPT_MORE_STR, 0, 0,
    340      "Issuer is used as recipient unless -recipient, -srvcert, or -issuer given"},
    341     {"revreason", OPT_REVREASON, 'n',
    342      "Reason code to include in revocation request (rr); possible values:"},
    343     {OPT_MORE_STR, 0, 0,
    344      "0..6, 8..10 (see RFC5280, 5.3.1) or -1. Default -1 = none included"},
    345 
    346     OPT_SECTION("Message transfer"),
    347 #ifdef OPENSSL_NO_SOCK
    348     {OPT_MORE_STR, 0, 0,
    349      "NOTE: -server, -proxy, and -no_proxy not supported due to no-sock build"},
    350 #else
    351     {"server", OPT_SERVER, 's',
    352      "[http[s]://]address[:port][/path] of CMP server. Default port 80 or 443."},
    353     {OPT_MORE_STR, 0, 0,
    354      "address may be a DNS name or an IP address; path can be overridden by -path"},
    355     {"proxy", OPT_PROXY, 's',
    356      "[http[s]://]address[:port][/path] of HTTP(S) proxy to use; path is ignored"},
    357     {"no_proxy", OPT_NO_PROXY, 's',
    358      "List of addresses of servers not to use HTTP(S) proxy for"},
    359     {OPT_MORE_STR, 0, 0,
    360      "Default from environment variable 'no_proxy', else 'NO_PROXY', else none"},
    361 #endif
    362     {"recipient", OPT_RECIPIENT, 's',
    363      "DN of CA. Default: subject of -srvcert, -issuer, issuer of -oldcert or -cert"},
    364     {"path", OPT_PATH, 's',
    365      "HTTP path (aka CMP alias) at the CMP server. Default from -server, else \"/\""},
    366     {"keep_alive", OPT_KEEP_ALIVE, 'N',
    367      "Persistent HTTP connections. 0: no, 1 (the default): request, 2: require"},
    368     {"msg_timeout", OPT_MSG_TIMEOUT, 'N',
    369      "Number of seconds allowed per CMP message round trip, or 0 for infinite"},
    370     {"total_timeout", OPT_TOTAL_TIMEOUT, 'N',
    371      "Overall time an enrollment incl. polling may take. Default 0 = infinite"},
    372 
    373     OPT_SECTION("Server authentication"),
    374     {"trusted", OPT_TRUSTED, 's',
    375      "Certificates to use as trust anchors when verifying signed CMP responses"},
    376     {OPT_MORE_STR, 0, 0, "unless -srvcert is given"},
    377     {"untrusted", OPT_UNTRUSTED, 's',
    378      "Intermediate CA certs for chain construction for CMP/TLS/enrolled certs"},
    379     {"srvcert", OPT_SRVCERT, 's',
    380      "Server cert to pin and trust directly when verifying signed CMP responses"},
    381     {"expect_sender", OPT_EXPECT_SENDER, 's',
    382      "DN of expected sender of responses. Defaults to subject of -srvcert, if any"},
    383     {"ignore_keyusage", OPT_IGNORE_KEYUSAGE, '-',
    384      "Ignore CMP signer cert key usage, else 'digitalSignature' must be allowed"},
    385     {"unprotected_errors", OPT_UNPROTECTED_ERRORS, '-',
    386      "Accept missing or invalid protection of regular error messages and negative"},
    387     {OPT_MORE_STR, 0, 0,
    388      "certificate responses (ip/cp/kup), revocation responses (rp), and PKIConf"},
    389     {OPT_MORE_STR, 0, 0,
    390      "WARNING: This setting leads to behavior allowing violation of RFC 4210"},
    391     {"extracertsout", OPT_EXTRACERTSOUT, 's',
    392      "File to save extra certificates received in the extraCerts field"},
    393     {"cacertsout", OPT_CACERTSOUT, 's',
    394      "File to save CA certificates received in the caPubs field of 'ip' messages"},
    395 
    396     OPT_SECTION("Client authentication"),
    397     {"ref", OPT_REF, 's',
    398      "Reference value to use as senderKID in case no -cert is given"},
    399     {"secret", OPT_SECRET, 's',
    400      "Prefer PBM (over signatures) for protecting msgs with given password source"},
    401     {"cert", OPT_CERT, 's',
    402      "Client's CMP signer certificate; its public key must match the -key argument"},
    403     {OPT_MORE_STR, 0, 0,
    404      "This also used as default reference for subject DN and SANs."},
    405     {OPT_MORE_STR, 0, 0,
    406      "Any further certs included are appended to the untrusted certs"},
    407     {"own_trusted", OPT_OWN_TRUSTED, 's',
    408      "Optional certs to verify chain building for own CMP signer cert"},
    409     {"key", OPT_KEY, 's', "CMP signer private key, not used when -secret given"},
    410     {"keypass", OPT_KEYPASS, 's',
    411      "Client private key (and cert and old cert) pass phrase source"},
    412     {"digest", OPT_DIGEST, 's',
    413      "Digest to use in message protection and POPO signatures. Default \"sha256\""},
    414     {"mac", OPT_MAC, 's',
    415      "MAC algorithm to use in PBM-based message protection. Default \"hmac-sha1\""},
    416     {"extracerts", OPT_EXTRACERTS, 's',
    417      "Certificates to append in extraCerts field of outgoing messages."},
    418     {OPT_MORE_STR, 0, 0,
    419      "This can be used as the default CMP signer cert chain to include"},
    420     {"unprotected_requests", OPT_UNPROTECTED_REQUESTS, '-',
    421      "Send request messages without CMP-level protection"},
    422 
    423     OPT_SECTION("Credentials format"),
    424     {"certform", OPT_CERTFORM, 's',
    425      "Format (PEM or DER) to use when saving a certificate to a file. Default PEM"},
    426     {"keyform", OPT_KEYFORM, 's',
    427      "Format of the key input (ENGINE, other values ignored)"},
    428     {"otherpass", OPT_OTHERPASS, 's',
    429      "Pass phrase source potentially needed for loading certificates of others"},
    430 #ifndef OPENSSL_NO_ENGINE
    431     {"engine", OPT_ENGINE, 's',
    432      "Use crypto engine with given identifier, possibly a hardware device."},
    433     {OPT_MORE_STR, 0, 0,
    434      "Engines may also be defined in OpenSSL config file engine section."},
    435 #endif
    436     OPT_PROV_OPTIONS,
    437     OPT_R_OPTIONS,
    438 
    439     OPT_SECTION("TLS connection"),
    440 #ifdef OPENSSL_NO_SOCK
    441     {OPT_MORE_STR, 0, 0,
    442      "NOTE: -tls_used and all other TLS options not supported due to no-sock build"},
    443 #else
    444     {"tls_used", OPT_TLS_USED, '-',
    445      "Enable using TLS (also when other TLS options are not set)"},
    446     {"tls_cert", OPT_TLS_CERT, 's',
    447      "Client's TLS certificate. May include chain to be provided to TLS server"},
    448     {"tls_key", OPT_TLS_KEY, 's',
    449      "Private key for the client's TLS certificate"},
    450     {"tls_keypass", OPT_TLS_KEYPASS, 's',
    451      "Pass phrase source for the client's private TLS key (and TLS cert)"},
    452     {"tls_extra", OPT_TLS_EXTRA, 's',
    453      "Extra certificates to provide to TLS server during TLS handshake"},
    454     {"tls_trusted", OPT_TLS_TRUSTED, 's',
    455      "Trusted certificates to use for verifying the TLS server certificate;"},
    456     {OPT_MORE_STR, 0, 0, "this implies host name validation"},
    457     {"tls_host", OPT_TLS_HOST, 's',
    458      "Address to be checked (rather than -server) during TLS host name validation"},
    459 #endif
    460 
    461     OPT_SECTION("Client-side debugging"),
    462     {"batch", OPT_BATCH, '-',
    463      "Do not interactively prompt for input when a password is required etc."},
    464     {"repeat", OPT_REPEAT, 'p',
    465      "Invoke the transaction the given positive number of times. Default 1"},
    466     {"reqin", OPT_REQIN, 's',
    467      "Take sequence of CMP requests to send to server from file(s)"},
    468     {"reqin_new_tid", OPT_REQIN_NEW_TID, '-',
    469      "Use fresh transactionID for CMP requests read from -reqin"},
    470     {"reqout", OPT_REQOUT, 's',
    471      "Save sequence of CMP requests created by the client to file(s)"},
    472     {"rspin", OPT_RSPIN, 's',
    473      "Process sequence of CMP responses provided in file(s), skipping server"},
    474     {"rspout", OPT_RSPOUT, 's',
    475      "Save sequence of actually used CMP responses to file(s)"},
    476 
    477     {"use_mock_srv", OPT_USE_MOCK_SRV, '-',
    478      "Use internal mock server at API level, bypassing socket-based HTTP"},
    479 
    480     OPT_SECTION("Mock server"),
    481 #ifdef OPENSSL_NO_SOCK
    482     {OPT_MORE_STR, 0, 0,
    483      "NOTE: -port and -max_msgs not supported due to no-sock build"},
    484 #else
    485     {"port", OPT_PORT, 's',
    486      "Act as HTTP-based mock server listening on given port"},
    487     {"max_msgs", OPT_MAX_MSGS, 'N',
    488      "max number of messages handled by HTTP mock server. Default: 0 = unlimited"},
    489 #endif
    490 
    491     {"srv_ref", OPT_SRV_REF, 's',
    492      "Reference value to use as senderKID of server in case no -srv_cert is given"},
    493     {"srv_secret", OPT_SRV_SECRET, 's',
    494      "Password source for server authentication with a pre-shared key (secret)"},
    495     {"srv_cert", OPT_SRV_CERT, 's', "Certificate of the server"},
    496     {"srv_key", OPT_SRV_KEY, 's',
    497      "Private key used by the server for signing messages"},
    498     {"srv_keypass", OPT_SRV_KEYPASS, 's',
    499      "Server private key (and cert) pass phrase source"},
    500 
    501     {"srv_trusted", OPT_SRV_TRUSTED, 's',
    502      "Trusted certificates for client authentication"},
    503     {"srv_untrusted", OPT_SRV_UNTRUSTED, 's',
    504      "Intermediate certs that may be useful for verifying CMP protection"},
    505     {"rsp_cert", OPT_RSP_CERT, 's',
    506      "Certificate to be returned as mock enrollment result"},
    507     {"rsp_extracerts", OPT_RSP_EXTRACERTS, 's',
    508      "Extra certificates to be included in mock certification responses"},
    509     {"rsp_capubs", OPT_RSP_CAPUBS, 's',
    510      "CA certificates to be included in mock ip response"},
    511     {"poll_count", OPT_POLL_COUNT, 'N',
    512      "Number of times the client must poll before receiving a certificate"},
    513     {"check_after", OPT_CHECK_AFTER, 'N',
    514      "The check_after value (time to wait) to include in poll response"},
    515     {"grant_implicitconf", OPT_GRANT_IMPLICITCONF, '-',
    516      "Grant implicit confirmation of newly enrolled certificate"},
    517 
    518     {"pkistatus", OPT_PKISTATUS, 'N',
    519      "PKIStatus to be included in server response. Possible values: 0..6"},
    520     {"failure", OPT_FAILURE, 'N',
    521      "A single failure info bit number to include in server response, 0..26"},
    522     {"failurebits", OPT_FAILUREBITS, 'N',
    523      "Number representing failure bits to include in server response, 0..2^27 - 1"},
    524     {"statusstring", OPT_STATUSSTRING, 's',
    525      "Status string to be included in server response"},
    526     {"send_error", OPT_SEND_ERROR, '-',
    527      "Force server to reply with error message"},
    528     {"send_unprotected", OPT_SEND_UNPROTECTED, '-',
    529      "Send response messages without CMP-level protection"},
    530     {"send_unprot_err", OPT_SEND_UNPROT_ERR, '-',
    531      "In case of negative responses, server shall send unprotected error messages,"},
    532     {OPT_MORE_STR, 0, 0,
    533      "certificate responses (ip/cp/kup), and revocation responses (rp)."},
    534     {OPT_MORE_STR, 0, 0,
    535      "WARNING: This setting leads to behavior violating RFC 4210"},
    536     {"accept_unprotected", OPT_ACCEPT_UNPROTECTED, '-',
    537      "Accept missing or invalid protection of requests"},
    538     {"accept_unprot_err", OPT_ACCEPT_UNPROT_ERR, '-',
    539      "Accept unprotected error messages from client"},
    540     {"accept_raverified", OPT_ACCEPT_RAVERIFIED, '-',
    541      "Accept RAVERIFIED as proof-of-possession (POPO)"},
    542 
    543     OPT_V_OPTIONS,
    544     {NULL}
    545 };
    546 
    547 typedef union {
    548     char **txt;
    549     int *num;
    550     long *num_long;
    551 } varref;
    552 static varref cmp_vars[] = { /* must be in same order as enumerated above! */
    553     {&opt_config}, {&opt_section}, {(char **)&opt_verbosity},
    554 
    555     {&opt_cmd_s}, {&opt_infotype_s}, {&opt_geninfo},
    556 
    557     {&opt_newkey}, {&opt_newkeypass}, {&opt_subject}, {&opt_issuer},
    558     {(char **)&opt_days}, {&opt_reqexts},
    559     {&opt_sans}, {(char **)&opt_san_nodefault},
    560     {&opt_policies}, {&opt_policy_oids}, {(char **)&opt_policy_oids_critical},
    561     {(char **)&opt_popo}, {&opt_csr},
    562     {&opt_out_trusted},
    563     {(char **)&opt_implicit_confirm}, {(char **)&opt_disable_confirm},
    564     {&opt_certout}, {&opt_chainout},
    565 
    566     {&opt_oldcert}, {(char **)&opt_revreason},
    567 
    568 #ifndef OPENSSL_NO_SOCK
    569     {&opt_server}, {&opt_proxy}, {&opt_no_proxy},
    570 #endif
    571     {&opt_recipient}, {&opt_path}, {(char **)&opt_keep_alive},
    572     {(char **)&opt_msg_timeout}, {(char **)&opt_total_timeout},
    573 
    574     {&opt_trusted}, {&opt_untrusted}, {&opt_srvcert},
    575     {&opt_expect_sender},
    576     {(char **)&opt_ignore_keyusage}, {(char **)&opt_unprotected_errors},
    577     {&opt_extracertsout}, {&opt_cacertsout},
    578 
    579     {&opt_ref}, {&opt_secret},
    580     {&opt_cert}, {&opt_own_trusted}, {&opt_key}, {&opt_keypass},
    581     {&opt_digest}, {&opt_mac}, {&opt_extracerts},
    582     {(char **)&opt_unprotected_requests},
    583 
    584     {&opt_certform_s}, {&opt_keyform_s},
    585     {&opt_otherpass},
    586 #ifndef OPENSSL_NO_ENGINE
    587     {&opt_engine},
    588 #endif
    589 
    590 #ifndef OPENSSL_NO_SOCK
    591     {(char **)&opt_tls_used}, {&opt_tls_cert}, {&opt_tls_key},
    592     {&opt_tls_keypass},
    593     {&opt_tls_extra}, {&opt_tls_trusted}, {&opt_tls_host},
    594 #endif
    595 
    596     {(char **)&opt_batch}, {(char **)&opt_repeat},
    597     {&opt_reqin}, {(char **)&opt_reqin_new_tid},
    598     {&opt_reqout}, {&opt_rspin}, {&opt_rspout},
    599 
    600     {(char **)&opt_use_mock_srv},
    601 #ifndef OPENSSL_NO_SOCK
    602     {&opt_port}, {(char **)&opt_max_msgs},
    603 #endif
    604     {&opt_srv_ref}, {&opt_srv_secret},
    605     {&opt_srv_cert}, {&opt_srv_key}, {&opt_srv_keypass},
    606     {&opt_srv_trusted}, {&opt_srv_untrusted},
    607     {&opt_rsp_cert}, {&opt_rsp_extracerts}, {&opt_rsp_capubs},
    608     {(char **)&opt_poll_count}, {(char **)&opt_check_after},
    609     {(char **)&opt_grant_implicitconf},
    610     {(char **)&opt_pkistatus}, {(char **)&opt_failure},
    611     {(char **)&opt_failurebits}, {&opt_statusstring},
    612     {(char **)&opt_send_error}, {(char **)&opt_send_unprotected},
    613     {(char **)&opt_send_unprot_err}, {(char **)&opt_accept_unprotected},
    614     {(char **)&opt_accept_unprot_err}, {(char **)&opt_accept_raverified},
    615 
    616     {NULL}
    617 };
    618 
    619 #define FUNC (strcmp(OPENSSL_FUNC, "(unknown function)") == 0   \
    620               ? "CMP" : OPENSSL_FUNC)
    621 #define CMP_print(bio, level, prefix, msg, a1, a2, a3) \
    622     ((void)(level > opt_verbosity ? 0 : \
    623             (BIO_printf(bio, "%s:%s:%d:CMP %s: " msg "\n", \
    624                         FUNC, OPENSSL_FILE, OPENSSL_LINE, prefix, a1, a2, a3))))
    625 #define CMP_DEBUG(m, a1, a2, a3) \
    626     CMP_print(bio_out, OSSL_CMP_LOG_DEBUG, "debug", m, a1, a2, a3)
    627 #define CMP_debug(msg)             CMP_DEBUG(msg"%s%s%s", "", "", "")
    628 #define CMP_debug1(msg, a1)        CMP_DEBUG(msg"%s%s",   a1, "", "")
    629 #define CMP_debug2(msg, a1, a2)    CMP_DEBUG(msg"%s",     a1, a2, "")
    630 #define CMP_debug3(msg, a1, a2, a3) CMP_DEBUG(msg,        a1, a2, a3)
    631 #define CMP_INFO(msg, a1, a2, a3) \
    632     CMP_print(bio_out, OSSL_CMP_LOG_INFO, "info", msg, a1, a2, a3)
    633 #define CMP_info(msg)              CMP_INFO(msg"%s%s%s", "", "", "")
    634 #define CMP_info1(msg, a1)         CMP_INFO(msg"%s%s",   a1, "", "")
    635 #define CMP_info2(msg, a1, a2)     CMP_INFO(msg"%s",     a1, a2, "")
    636 #define CMP_info3(msg, a1, a2, a3) CMP_INFO(msg,         a1, a2, a3)
    637 #define CMP_WARN(m, a1, a2, a3) \
    638     CMP_print(bio_out, OSSL_CMP_LOG_WARNING, "warning", m, a1, a2, a3)
    639 #define CMP_warn(msg)              CMP_WARN(msg"%s%s%s", "", "", "")
    640 #define CMP_warn1(msg, a1)         CMP_WARN(msg"%s%s",   a1, "", "")
    641 #define CMP_warn2(msg, a1, a2)     CMP_WARN(msg"%s",     a1, a2, "")
    642 #define CMP_warn3(msg, a1, a2, a3) CMP_WARN(msg,         a1, a2, a3)
    643 #define CMP_ERR(msg, a1, a2, a3) \
    644     CMP_print(bio_err, OSSL_CMP_LOG_ERR, "error", msg, a1, a2, a3)
    645 #define CMP_err(msg)               CMP_ERR(msg"%s%s%s", "", "", "")
    646 #define CMP_err1(msg, a1)          CMP_ERR(msg"%s%s",   a1, "", "")
    647 #define CMP_err2(msg, a1, a2)      CMP_ERR(msg"%s",     a1, a2, "")
    648 #define CMP_err3(msg, a1, a2, a3)  CMP_ERR(msg,         a1, a2, a3)
    649 
    650 static int print_to_bio_out(const char *func, const char *file, int line,
    651                             OSSL_CMP_severity level, const char *msg)
    652 {
    653     return OSSL_CMP_print_to_bio(bio_out, func, file, line, level, msg);
    654 }
    655 
    656 static int print_to_bio_err(const char *func, const char *file, int line,
    657                             OSSL_CMP_severity level, const char *msg)
    658 {
    659     return OSSL_CMP_print_to_bio(bio_err, func, file, line, level, msg);
    660 }
    661 
    662 static int set_verbosity(int level)
    663 {
    664     if (level < OSSL_CMP_LOG_EMERG || level > OSSL_CMP_LOG_MAX) {
    665         CMP_err1("Logging verbosity level %d out of range (0 .. 8)", level);
    666         return 0;
    667     }
    668     opt_verbosity = level;
    669     return 1;
    670 }
    671 
    672 static EVP_PKEY *load_key_pwd(const char *uri, int format,
    673                               const char *pass, ENGINE *eng, const char *desc)
    674 {
    675     char *pass_string = get_passwd(pass, desc);
    676     EVP_PKEY *pkey = load_key(uri, format, 0, pass_string, eng, desc);
    677 
    678     clear_free(pass_string);
    679     return pkey;
    680 }
    681 
    682 static X509 *load_cert_pwd(const char *uri, const char *pass, const char *desc)
    683 {
    684     X509 *cert;
    685     char *pass_string = get_passwd(pass, desc);
    686 
    687     cert = load_cert_pass(uri, FORMAT_UNDEF, 0, pass_string, desc);
    688     clear_free(pass_string);
    689     return cert;
    690 }
    691 
    692 static X509_REQ *load_csr_autofmt(const char *infile, const char *desc)
    693 {
    694     X509_REQ *csr;
    695     BIO *bio_bak = bio_err;
    696 
    697     bio_err = NULL; /* do not show errors on more than one try */
    698     csr = load_csr(infile, FORMAT_PEM, desc);
    699     bio_err = bio_bak;
    700     if (csr == NULL) {
    701         ERR_clear_error();
    702         csr = load_csr(infile, FORMAT_ASN1, desc);
    703     }
    704     if (csr == NULL) {
    705         ERR_print_errors(bio_err);
    706         BIO_printf(bio_err, "error: unable to load %s from file '%s'\n", desc,
    707                    infile);
    708     } else {
    709         EVP_PKEY *pkey = X509_REQ_get0_pubkey(csr);
    710         int ret = do_X509_REQ_verify(csr, pkey, NULL /* vfyopts */);
    711 
    712         if (pkey == NULL || ret < 0)
    713             CMP_warn("error while verifying CSR self-signature");
    714         else if (ret == 0)
    715             CMP_warn("CSR self-signature does not match the contents");
    716     }
    717     return csr;
    718 }
    719 
    720 /* set expected host name/IP addr and clears the email addr in the given ts */
    721 static int truststore_set_host_etc(X509_STORE *ts, const char *host)
    722 {
    723     X509_VERIFY_PARAM *ts_vpm = X509_STORE_get0_param(ts);
    724 
    725     /* first clear any host names, IP, and email addresses */
    726     if (!X509_VERIFY_PARAM_set1_host(ts_vpm, NULL, 0)
    727             || !X509_VERIFY_PARAM_set1_ip(ts_vpm, NULL, 0)
    728             || !X509_VERIFY_PARAM_set1_email(ts_vpm, NULL, 0))
    729         return 0;
    730     X509_VERIFY_PARAM_set_hostflags(ts_vpm,
    731                                     X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT |
    732                                     X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
    733     return (host != NULL && X509_VERIFY_PARAM_set1_ip_asc(ts_vpm, host))
    734         || X509_VERIFY_PARAM_set1_host(ts_vpm, host, 0);
    735 }
    736 
    737 /* write OSSL_CMP_MSG DER-encoded to the specified file name item */
    738 static int write_PKIMESSAGE(const OSSL_CMP_MSG *msg, char **filenames)
    739 {
    740     char *file;
    741 
    742     if (msg == NULL || filenames == NULL) {
    743         CMP_err("NULL arg to write_PKIMESSAGE");
    744         return 0;
    745     }
    746     if (*filenames == NULL) {
    747         CMP_err("not enough file names provided for writing PKIMessage");
    748         return 0;
    749     }
    750 
    751     file = *filenames;
    752     *filenames = next_item(file);
    753     if (OSSL_CMP_MSG_write(file, msg) < 0) {
    754         CMP_err1("cannot write PKIMessage to file '%s'", file);
    755         return 0;
    756     }
    757     return 1;
    758 }
    759 
    760 /* read DER-encoded OSSL_CMP_MSG from the specified file name item */
    761 static OSSL_CMP_MSG *read_PKIMESSAGE(const char *desc, char **filenames)
    762 {
    763     char *file;
    764     OSSL_CMP_MSG *ret;
    765 
    766     if (filenames == NULL || desc == NULL) {
    767         CMP_err("NULL arg to read_PKIMESSAGE");
    768         return NULL;
    769     }
    770     if (*filenames == NULL) {
    771         CMP_err("not enough file names provided for reading PKIMessage");
    772         return NULL;
    773     }
    774 
    775     file = *filenames;
    776     *filenames = next_item(file);
    777 
    778     ret = OSSL_CMP_MSG_read(file, app_get0_libctx(), app_get0_propq());
    779     if (ret == NULL)
    780         CMP_err1("cannot read PKIMessage from file '%s'", file);
    781     else
    782         CMP_info2("%s %s", desc, file);
    783     return ret;
    784 }
    785 
    786 /*-
    787  * Sends the PKIMessage req and on success place the response in *res
    788  * basically like OSSL_CMP_MSG_http_perform(), but in addition allows
    789  * to dump the sequence of requests and responses to files and/or
    790  * to take the sequence of requests and responses from files.
    791  */
    792 static OSSL_CMP_MSG *read_write_req_resp(OSSL_CMP_CTX *ctx,
    793                                          const OSSL_CMP_MSG *req)
    794 {
    795     OSSL_CMP_MSG *req_new = NULL;
    796     OSSL_CMP_MSG *res = NULL;
    797     OSSL_CMP_PKIHEADER *hdr;
    798     const char *prev_opt_rspin = opt_rspin;
    799 
    800     if (req != NULL && opt_reqout != NULL
    801             && !write_PKIMESSAGE(req, &opt_reqout))
    802         goto err;
    803     if (opt_reqin != NULL && opt_rspin == NULL) {
    804         if ((req_new = read_PKIMESSAGE("actually sending", &opt_reqin)) == NULL)
    805             goto err;
    806         /*-
    807          * The transaction ID in req_new read from opt_reqin may not be fresh.
    808          * In this case the server may complain "Transaction id already in use."
    809          * The following workaround unfortunately requires re-protection.
    810          */
    811         if (opt_reqin_new_tid
    812                 && !OSSL_CMP_MSG_update_transactionID(ctx, req_new))
    813             goto err;
    814 
    815         /*
    816          * Except for first request, need to satisfy recipNonce check by server.
    817          * Unfortunately requires re-protection if protection is required.
    818          */
    819         if (!OSSL_CMP_MSG_update_recipNonce(ctx, req_new))
    820             goto err;
    821     }
    822 
    823     if (opt_rspin != NULL) {
    824         res = read_PKIMESSAGE("actually using", &opt_rspin);
    825     } else {
    826         const OSSL_CMP_MSG *actual_req = req_new != NULL ? req_new : req;
    827 
    828         if (opt_use_mock_srv) {
    829             if (rspin_in_use)
    830                 CMP_warn("too few -rspin filename arguments; resorting to using mock server");
    831             res = OSSL_CMP_CTX_server_perform(ctx, actual_req);
    832         } else {
    833 #ifndef OPENSSL_NO_SOCK
    834             if (opt_server == NULL) {
    835                 CMP_err("missing -server or -use_mock_srv option, or too few -rspin filename arguments");
    836                 goto err;
    837             }
    838             if (rspin_in_use)
    839                 CMP_warn("too few -rspin filename arguments; resorting to contacting server");
    840             res = OSSL_CMP_MSG_http_perform(ctx, actual_req);
    841 #else
    842             CMP_err("-server not supported on no-sock build; missing -use_mock_srv option or too few -rspin filename arguments");
    843 #endif
    844         }
    845         rspin_in_use = 0;
    846     }
    847     if (res == NULL)
    848         goto err;
    849 
    850     if (req_new != NULL || prev_opt_rspin != NULL) {
    851         /* need to satisfy nonce and transactionID checks by client */
    852         ASN1_OCTET_STRING *nonce;
    853         ASN1_OCTET_STRING *tid;
    854 
    855         hdr = OSSL_CMP_MSG_get0_header(res);
    856         nonce = OSSL_CMP_HDR_get0_recipNonce(hdr);
    857         tid = OSSL_CMP_HDR_get0_transactionID(hdr);
    858         if (!OSSL_CMP_CTX_set1_senderNonce(ctx, nonce)
    859                 || !OSSL_CMP_CTX_set1_transactionID(ctx, tid)) {
    860             OSSL_CMP_MSG_free(res);
    861             res = NULL;
    862             goto err;
    863         }
    864     }
    865 
    866     if (opt_rspout != NULL && !write_PKIMESSAGE(res, &opt_rspout)) {
    867         OSSL_CMP_MSG_free(res);
    868         res = NULL;
    869     }
    870 
    871  err:
    872     OSSL_CMP_MSG_free(req_new);
    873     return res;
    874 }
    875 
    876 static int set_name(const char *str,
    877                     int (*set_fn) (OSSL_CMP_CTX *ctx, const X509_NAME *name),
    878                     OSSL_CMP_CTX *ctx, const char *desc)
    879 {
    880     if (str != NULL) {
    881         X509_NAME *n = parse_name(str, MBSTRING_ASC, 1, desc);
    882 
    883         if (n == NULL)
    884             return 0;
    885         if (!(*set_fn) (ctx, n)) {
    886             X509_NAME_free(n);
    887             CMP_err("out of memory");
    888             return 0;
    889         }
    890         X509_NAME_free(n);
    891     }
    892     return 1;
    893 }
    894 
    895 static int set_gennames(OSSL_CMP_CTX *ctx, char *names, const char *desc)
    896 {
    897     char *next;
    898 
    899     for (; names != NULL; names = next) {
    900         GENERAL_NAME *n;
    901 
    902         next = next_item(names);
    903         if (strcmp(names, "critical") == 0) {
    904             (void)OSSL_CMP_CTX_set_option(ctx,
    905                                           OSSL_CMP_OPT_SUBJECTALTNAME_CRITICAL,
    906                                           1);
    907             continue;
    908         }
    909 
    910         /* try IP address first, then URI or domain name */
    911         (void)ERR_set_mark();
    912         n = a2i_GENERAL_NAME(NULL, NULL, NULL, GEN_IPADD, names, 0);
    913         if (n == NULL)
    914             n = a2i_GENERAL_NAME(NULL, NULL, NULL,
    915                                  strchr(names, ':') != NULL ? GEN_URI : GEN_DNS,
    916                                  names, 0);
    917         (void)ERR_pop_to_mark();
    918 
    919         if (n == NULL) {
    920             CMP_err2("bad syntax of %s '%s'", desc, names);
    921             return 0;
    922         }
    923         if (!OSSL_CMP_CTX_push1_subjectAltName(ctx, n)) {
    924             GENERAL_NAME_free(n);
    925             CMP_err("out of memory");
    926             return 0;
    927         }
    928         GENERAL_NAME_free(n);
    929     }
    930     return 1;
    931 }
    932 
    933 static X509_STORE *load_trusted(char *input, int for_new_cert, const char *desc)
    934 {
    935     X509_STORE *ts = load_certstore(input, opt_otherpass, desc, vpm);
    936 
    937     if (ts == NULL)
    938         return NULL;
    939     X509_STORE_set_verify_cb(ts, X509_STORE_CTX_print_verify_cb);
    940 
    941     /* copy vpm to store */
    942     if (X509_STORE_set1_param(ts, vpm /* may be NULL */)
    943             && (for_new_cert || truststore_set_host_etc(ts, NULL)))
    944         return ts;
    945     BIO_printf(bio_err, "error setting verification parameters for %s\n", desc);
    946     OSSL_CMP_CTX_print_errors(cmp_ctx);
    947     X509_STORE_free(ts);
    948     return NULL;
    949 }
    950 
    951 typedef int (*add_X509_stack_fn_t)(void *ctx, const STACK_OF(X509) *certs);
    952 
    953 static int setup_certs(char *files, const char *desc, void *ctx,
    954                        add_X509_stack_fn_t set1_fn)
    955 {
    956     STACK_OF(X509) *certs;
    957     int ok;
    958 
    959     if (files == NULL)
    960         return 1;
    961     if ((certs = load_certs_multifile(files, opt_otherpass, desc, vpm)) == NULL)
    962         return 0;
    963     ok = (*set1_fn)(ctx, certs);
    964     sk_X509_pop_free(certs, X509_free);
    965     return ok;
    966 }
    967 
    968 
    969 /*
    970  * parse and transform some options, checking their syntax.
    971  * Returns 1 on success, 0 on error
    972  */
    973 static int transform_opts(void)
    974 {
    975     if (opt_cmd_s != NULL) {
    976         if (!strcmp(opt_cmd_s, "ir")) {
    977             opt_cmd = CMP_IR;
    978         } else if (!strcmp(opt_cmd_s, "kur")) {
    979             opt_cmd = CMP_KUR;
    980         } else if (!strcmp(opt_cmd_s, "cr")) {
    981             opt_cmd = CMP_CR;
    982         } else if (!strcmp(opt_cmd_s, "p10cr")) {
    983             opt_cmd = CMP_P10CR;
    984         } else if (!strcmp(opt_cmd_s, "rr")) {
    985             opt_cmd = CMP_RR;
    986         } else if (!strcmp(opt_cmd_s, "genm")) {
    987             opt_cmd = CMP_GENM;
    988         } else {
    989             CMP_err1("unknown cmp command '%s'", opt_cmd_s);
    990             return 0;
    991         }
    992     } else {
    993         CMP_err("no cmp command to execute");
    994         return 0;
    995     }
    996 
    997 #ifndef OPENSSL_NO_ENGINE
    998 # define FORMAT_OPTIONS (OPT_FMT_PEMDER | OPT_FMT_PKCS12 | OPT_FMT_ENGINE)
    999 #else
   1000 # define FORMAT_OPTIONS (OPT_FMT_PEMDER | OPT_FMT_PKCS12)
   1001 #endif
   1002 
   1003     if (opt_keyform_s != NULL
   1004             && !opt_format(opt_keyform_s, FORMAT_OPTIONS, &opt_keyform)) {
   1005         CMP_err("unknown option given for key loading format");
   1006         return 0;
   1007     }
   1008 
   1009 #undef FORMAT_OPTIONS
   1010 
   1011     if (opt_certform_s != NULL
   1012             && !opt_format(opt_certform_s, OPT_FMT_PEMDER, &opt_certform)) {
   1013         CMP_err("unknown option given for certificate storing format");
   1014         return 0;
   1015     }
   1016 
   1017     return 1;
   1018 }
   1019 
   1020 static OSSL_CMP_SRV_CTX *setup_srv_ctx(ENGINE *engine)
   1021 {
   1022     OSSL_CMP_CTX *ctx; /* extra CMP (client) ctx partly used by server */
   1023     OSSL_CMP_SRV_CTX *srv_ctx = ossl_cmp_mock_srv_new(app_get0_libctx(),
   1024                                                       app_get0_propq());
   1025 
   1026     if (srv_ctx == NULL)
   1027         return NULL;
   1028     ctx = OSSL_CMP_SRV_CTX_get0_cmp_ctx(srv_ctx);
   1029 
   1030     if (opt_srv_ref == NULL) {
   1031         if (opt_srv_cert == NULL) {
   1032             /* opt_srv_cert should determine the sender */
   1033             CMP_err("must give -srv_ref for mock server if no -srv_cert given");
   1034             goto err;
   1035         }
   1036     } else {
   1037         if (!OSSL_CMP_CTX_set1_referenceValue(ctx, (unsigned char *)opt_srv_ref,
   1038                                               strlen(opt_srv_ref)))
   1039             goto err;
   1040     }
   1041 
   1042     if (opt_srv_secret != NULL) {
   1043         int res;
   1044         char *pass_str = get_passwd(opt_srv_secret, "PBMAC secret of mock server");
   1045 
   1046         if (pass_str != NULL) {
   1047             cleanse(opt_srv_secret);
   1048             res = OSSL_CMP_CTX_set1_secretValue(ctx, (unsigned char *)pass_str,
   1049                                                 strlen(pass_str));
   1050             clear_free(pass_str);
   1051             if (res == 0)
   1052                 goto err;
   1053         }
   1054     } else if (opt_srv_cert == NULL) {
   1055         CMP_err("server credentials (-srv_secret or -srv_cert) must be given if -use_mock_srv or -port is used");
   1056         goto err;
   1057     } else {
   1058         CMP_warn("server will not be able to handle PBM-protected requests since -srv_secret is not given");
   1059     }
   1060 
   1061     if (opt_srv_secret == NULL
   1062             && ((opt_srv_cert == NULL) != (opt_srv_key == NULL))) {
   1063         CMP_err("must give both -srv_cert and -srv_key options or neither");
   1064         goto err;
   1065     }
   1066     if (opt_srv_cert != NULL) {
   1067         X509 *srv_cert = load_cert_pwd(opt_srv_cert, opt_srv_keypass,
   1068                                        "certificate of the mock server");
   1069 
   1070         if (srv_cert == NULL || !OSSL_CMP_CTX_set1_cert(ctx, srv_cert)) {
   1071             X509_free(srv_cert);
   1072             goto err;
   1073         }
   1074         X509_free(srv_cert);
   1075     }
   1076     if (opt_srv_key != NULL) {
   1077         EVP_PKEY *pkey = load_key_pwd(opt_srv_key, opt_keyform,
   1078                                       opt_srv_keypass,
   1079                                       engine, "private key for mock server cert");
   1080 
   1081         if (pkey == NULL || !OSSL_CMP_CTX_set1_pkey(ctx, pkey)) {
   1082             EVP_PKEY_free(pkey);
   1083             goto err;
   1084         }
   1085         EVP_PKEY_free(pkey);
   1086     }
   1087     cleanse(opt_srv_keypass);
   1088 
   1089     if (opt_srv_trusted != NULL) {
   1090         X509_STORE *ts =
   1091             load_trusted(opt_srv_trusted, 0, "certs trusted by mock server");
   1092 
   1093         if (ts == NULL || !OSSL_CMP_CTX_set0_trustedStore(ctx, ts)) {
   1094             X509_STORE_free(ts);
   1095             goto err;
   1096         }
   1097     } else {
   1098         CMP_warn("mock server will not be able to handle signature-protected requests since -srv_trusted is not given");
   1099     }
   1100     if (!setup_certs(opt_srv_untrusted,
   1101                      "untrusted certificates for mock server", ctx,
   1102                      (add_X509_stack_fn_t)OSSL_CMP_CTX_set1_untrusted))
   1103         goto err;
   1104 
   1105     if (opt_rsp_cert == NULL) {
   1106         CMP_warn("no -rsp_cert given for mock server");
   1107     } else {
   1108         X509 *cert = load_cert_pwd(opt_rsp_cert, opt_keypass,
   1109                                    "cert to be returned by the mock server");
   1110 
   1111         if (cert == NULL)
   1112             goto err;
   1113         /* from server perspective the server is the client */
   1114         if (!ossl_cmp_mock_srv_set1_certOut(srv_ctx, cert)) {
   1115             X509_free(cert);
   1116             goto err;
   1117         }
   1118         X509_free(cert);
   1119     }
   1120     if (!setup_certs(opt_rsp_extracerts,
   1121                      "CMP extra certificates for mock server", srv_ctx,
   1122                      (add_X509_stack_fn_t)ossl_cmp_mock_srv_set1_chainOut))
   1123         goto err;
   1124     if (!setup_certs(opt_rsp_capubs, "caPubs for mock server", srv_ctx,
   1125                      (add_X509_stack_fn_t)ossl_cmp_mock_srv_set1_caPubsOut))
   1126         goto err;
   1127     (void)ossl_cmp_mock_srv_set_pollCount(srv_ctx, opt_poll_count);
   1128     (void)ossl_cmp_mock_srv_set_checkAfterTime(srv_ctx, opt_check_after);
   1129     if (opt_grant_implicitconf)
   1130         (void)OSSL_CMP_SRV_CTX_set_grant_implicit_confirm(srv_ctx, 1);
   1131 
   1132     if (opt_failure != INT_MIN) { /* option has been set explicity */
   1133         if (opt_failure < 0 || OSSL_CMP_PKIFAILUREINFO_MAX < opt_failure) {
   1134             CMP_err1("-failure out of range, should be >= 0 and <= %d",
   1135                      OSSL_CMP_PKIFAILUREINFO_MAX);
   1136             goto err;
   1137         }
   1138         if (opt_failurebits != 0)
   1139             CMP_warn("-failurebits overrides -failure");
   1140         else
   1141             opt_failurebits = 1 << opt_failure;
   1142     }
   1143     if ((unsigned)opt_failurebits > OSSL_CMP_PKIFAILUREINFO_MAX_BIT_PATTERN) {
   1144         CMP_err("-failurebits out of range");
   1145         goto err;
   1146     }
   1147     if (!ossl_cmp_mock_srv_set_statusInfo(srv_ctx, opt_pkistatus,
   1148                                           opt_failurebits, opt_statusstring))
   1149         goto err;
   1150 
   1151     if (opt_send_error)
   1152         (void)ossl_cmp_mock_srv_set_sendError(srv_ctx, 1);
   1153 
   1154     if (opt_send_unprotected)
   1155         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_UNPROTECTED_SEND, 1);
   1156     if (opt_send_unprot_err)
   1157         (void)OSSL_CMP_SRV_CTX_set_send_unprotected_errors(srv_ctx, 1);
   1158     if (opt_accept_unprotected)
   1159         (void)OSSL_CMP_SRV_CTX_set_accept_unprotected(srv_ctx, 1);
   1160     if (opt_accept_unprot_err)
   1161         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_UNPROTECTED_ERRORS, 1);
   1162     if (opt_accept_raverified)
   1163         (void)OSSL_CMP_SRV_CTX_set_accept_raverified(srv_ctx, 1);
   1164 
   1165     return srv_ctx;
   1166 
   1167  err:
   1168     ossl_cmp_mock_srv_free(srv_ctx);
   1169     return NULL;
   1170 }
   1171 
   1172 /*
   1173  * set up verification aspects of OSSL_CMP_CTX w.r.t. opts from config file/CLI.
   1174  * Returns pointer on success, NULL on error
   1175  */
   1176 static int setup_verification_ctx(OSSL_CMP_CTX *ctx)
   1177 {
   1178     if (!setup_certs(opt_untrusted, "untrusted certificates", ctx,
   1179                      (add_X509_stack_fn_t)OSSL_CMP_CTX_set1_untrusted))
   1180         return 0;
   1181 
   1182     if (opt_srvcert != NULL || opt_trusted != NULL) {
   1183         X509 *srvcert;
   1184         X509_STORE *ts;
   1185         int ok;
   1186 
   1187         if (opt_srvcert != NULL) {
   1188             if (opt_trusted != NULL) {
   1189                 CMP_warn("-trusted option is ignored since -srvcert option is present");
   1190                 opt_trusted = NULL;
   1191             }
   1192             if (opt_recipient != NULL) {
   1193                 CMP_warn("-recipient option is ignored since -srvcert option is present");
   1194                 opt_recipient = NULL;
   1195             }
   1196             srvcert = load_cert_pwd(opt_srvcert, opt_otherpass,
   1197                                     "directly trusted CMP server certificate");
   1198             ok = srvcert != NULL && OSSL_CMP_CTX_set1_srvCert(ctx, srvcert);
   1199             X509_free(srvcert);
   1200             if (!ok)
   1201                 return 0;
   1202         }
   1203         if (opt_trusted != NULL) {
   1204             /*
   1205              * the 0 arg below clears any expected host/ip/email address;
   1206              * opt_expect_sender is used instead
   1207              */
   1208             ts = load_trusted(opt_trusted, 0, "certs trusted by client");
   1209 
   1210             if (ts == NULL || !OSSL_CMP_CTX_set0_trustedStore(ctx, ts)) {
   1211                 X509_STORE_free(ts);
   1212                 return 0;
   1213             }
   1214         }
   1215     }
   1216 
   1217     if (opt_ignore_keyusage)
   1218         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_IGNORE_KEYUSAGE, 1);
   1219 
   1220     if (opt_unprotected_errors)
   1221         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_UNPROTECTED_ERRORS, 1);
   1222 
   1223     if (opt_out_trusted != NULL) { /* for use in OSSL_CMP_certConf_cb() */
   1224         X509_VERIFY_PARAM *out_vpm = NULL;
   1225         X509_STORE *out_trusted =
   1226             load_trusted(opt_out_trusted, 1,
   1227                          "trusted certs for verifying newly enrolled cert");
   1228 
   1229         if (out_trusted == NULL)
   1230             return 0;
   1231         /* ignore any -attime here, new certs are current anyway */
   1232         out_vpm = X509_STORE_get0_param(out_trusted);
   1233         X509_VERIFY_PARAM_clear_flags(out_vpm, X509_V_FLAG_USE_CHECK_TIME);
   1234 
   1235         (void)OSSL_CMP_CTX_set_certConf_cb_arg(ctx, out_trusted);
   1236     }
   1237 
   1238     if (opt_disable_confirm)
   1239         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_DISABLE_CONFIRM, 1);
   1240 
   1241     if (opt_implicit_confirm)
   1242         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_IMPLICIT_CONFIRM, 1);
   1243 
   1244     return 1;
   1245 }
   1246 
   1247 #ifndef OPENSSL_NO_SOCK
   1248 /*
   1249  * set up ssl_ctx for the OSSL_CMP_CTX based on options from config file/CLI.
   1250  * Returns pointer on success, NULL on error
   1251  */
   1252 static SSL_CTX *setup_ssl_ctx(OSSL_CMP_CTX *ctx, const char *host,
   1253                               ENGINE *engine)
   1254 {
   1255     STACK_OF(X509) *untrusted = OSSL_CMP_CTX_get0_untrusted(ctx);
   1256     EVP_PKEY *pkey = NULL;
   1257     X509_STORE *trust_store = NULL;
   1258     SSL_CTX *ssl_ctx;
   1259     int i;
   1260 
   1261     ssl_ctx = SSL_CTX_new(TLS_client_method());
   1262     if (ssl_ctx == NULL)
   1263         return NULL;
   1264 
   1265     if (opt_tls_trusted != NULL) {
   1266         trust_store = load_trusted(opt_tls_trusted, 0, "trusted TLS certs");
   1267         if (trust_store == NULL)
   1268             goto err;
   1269         SSL_CTX_set_cert_store(ssl_ctx, trust_store);
   1270     }
   1271 
   1272     if (opt_tls_cert != NULL && opt_tls_key != NULL) {
   1273         X509 *cert;
   1274         STACK_OF(X509) *certs = NULL;
   1275         int ok;
   1276 
   1277         if (!load_cert_certs(opt_tls_cert, &cert, &certs, 0, opt_tls_keypass,
   1278                              "TLS client certificate (optionally with chain)",
   1279                              vpm))
   1280             /* need opt_tls_keypass if opt_tls_cert is encrypted PKCS#12 file */
   1281             goto err;
   1282 
   1283         ok = SSL_CTX_use_certificate(ssl_ctx, cert) > 0;
   1284         X509_free(cert);
   1285 
   1286         /*
   1287          * Any further certs and any untrusted certs are used for constructing
   1288          * the chain to be provided with the TLS client cert to the TLS server.
   1289          */
   1290         if (!ok || !SSL_CTX_set0_chain(ssl_ctx, certs)) {
   1291             CMP_err1("unable to use client TLS certificate file '%s'",
   1292                      opt_tls_cert);
   1293             sk_X509_pop_free(certs, X509_free);
   1294             goto err;
   1295         }
   1296         for (i = 0; i < sk_X509_num(untrusted); i++) {
   1297             cert = sk_X509_value(untrusted, i);
   1298             if (!SSL_CTX_add1_chain_cert(ssl_ctx, cert)) {
   1299                 CMP_err("could not add untrusted cert to TLS client cert chain");
   1300                 goto err;
   1301             }
   1302         }
   1303 
   1304         {
   1305             X509_VERIFY_PARAM *tls_vpm = NULL;
   1306             unsigned long bak_flags = 0; /* compiler warns without init */
   1307 
   1308             if (trust_store != NULL) {
   1309                 tls_vpm = X509_STORE_get0_param(trust_store);
   1310                 bak_flags = X509_VERIFY_PARAM_get_flags(tls_vpm);
   1311                 /* disable any cert status/revocation checking etc. */
   1312                 X509_VERIFY_PARAM_clear_flags(tls_vpm,
   1313                                               ~(X509_V_FLAG_USE_CHECK_TIME
   1314                                                 | X509_V_FLAG_NO_CHECK_TIME
   1315                                                 | X509_V_FLAG_PARTIAL_CHAIN
   1316                                                 | X509_V_FLAG_POLICY_CHECK));
   1317             }
   1318             CMP_debug("trying to build cert chain for own TLS cert");
   1319             if (SSL_CTX_build_cert_chain(ssl_ctx,
   1320                                          SSL_BUILD_CHAIN_FLAG_UNTRUSTED |
   1321                                          SSL_BUILD_CHAIN_FLAG_NO_ROOT)) {
   1322                 CMP_debug("success building cert chain for own TLS cert");
   1323             } else {
   1324                 OSSL_CMP_CTX_print_errors(ctx);
   1325                 CMP_warn("could not build cert chain for own TLS cert");
   1326             }
   1327             if (trust_store != NULL)
   1328                 X509_VERIFY_PARAM_set_flags(tls_vpm, bak_flags);
   1329         }
   1330 
   1331         /* If present we append to the list also the certs from opt_tls_extra */
   1332         if (opt_tls_extra != NULL) {
   1333             STACK_OF(X509) *tls_extra = load_certs_multifile(opt_tls_extra,
   1334                                                              opt_otherpass,
   1335                                                              "extra certificates for TLS",
   1336                                                              vpm);
   1337             int res = 1;
   1338 
   1339             if (tls_extra == NULL)
   1340                 goto err;
   1341             for (i = 0; i < sk_X509_num(tls_extra); i++) {
   1342                 cert = sk_X509_value(tls_extra, i);
   1343                 if (res != 0)
   1344                     res = SSL_CTX_add_extra_chain_cert(ssl_ctx, cert);
   1345                 if (res == 0)
   1346                     X509_free(cert);
   1347             }
   1348             sk_X509_free(tls_extra);
   1349             if (res == 0) {
   1350                 BIO_printf(bio_err, "error: unable to add TLS extra certs\n");
   1351                 goto err;
   1352             }
   1353         }
   1354 
   1355         pkey = load_key_pwd(opt_tls_key, opt_keyform, opt_tls_keypass,
   1356                             engine, "TLS client private key");
   1357         cleanse(opt_tls_keypass);
   1358         if (pkey == NULL)
   1359             goto err;
   1360         /*
   1361          * verify the key matches the cert,
   1362          * not using SSL_CTX_check_private_key(ssl_ctx)
   1363          * because it gives poor and sometimes misleading diagnostics
   1364          */
   1365         if (!X509_check_private_key(SSL_CTX_get0_certificate(ssl_ctx),
   1366                                     pkey)) {
   1367             CMP_err2("TLS private key '%s' does not match the TLS certificate '%s'\n",
   1368                      opt_tls_key, opt_tls_cert);
   1369             EVP_PKEY_free(pkey);
   1370             pkey = NULL; /* otherwise, for some reason double free! */
   1371             goto err;
   1372         }
   1373         if (SSL_CTX_use_PrivateKey(ssl_ctx, pkey) <= 0) {
   1374             CMP_err1("unable to use TLS client private key '%s'", opt_tls_key);
   1375             EVP_PKEY_free(pkey);
   1376             pkey = NULL; /* otherwise, for some reason double free! */
   1377             goto err;
   1378         }
   1379         EVP_PKEY_free(pkey); /* we do not need the handle any more */
   1380     }
   1381     if (opt_tls_trusted != NULL) {
   1382         /* enable and parameterize server hostname/IP address check */
   1383         if (!truststore_set_host_etc(trust_store,
   1384                                      opt_tls_host != NULL ? opt_tls_host : host))
   1385             goto err;
   1386         SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, NULL);
   1387     }
   1388     return ssl_ctx;
   1389  err:
   1390     SSL_CTX_free(ssl_ctx);
   1391     return NULL;
   1392 }
   1393 #endif /* OPENSSL_NO_SOCK */
   1394 
   1395 /*
   1396  * set up protection aspects of OSSL_CMP_CTX based on options from config
   1397  * file/CLI while parsing options and checking their consistency.
   1398  * Returns 1 on success, 0 on error
   1399  */
   1400 static int setup_protection_ctx(OSSL_CMP_CTX *ctx, ENGINE *engine)
   1401 {
   1402     if (!opt_unprotected_requests && opt_secret == NULL && opt_key == NULL) {
   1403         CMP_err("must give -key or -secret unless -unprotected_requests is used");
   1404         return 0;
   1405     }
   1406 
   1407     if (opt_ref == NULL && opt_cert == NULL && opt_subject == NULL) {
   1408         /* cert or subject should determine the sender */
   1409         CMP_err("must give -ref if no -cert and no -subject given");
   1410         return 0;
   1411     }
   1412     if (!opt_secret && ((opt_cert == NULL) != (opt_key == NULL))) {
   1413         CMP_err("must give both -cert and -key options or neither");
   1414         return 0;
   1415     }
   1416     if (opt_secret != NULL) {
   1417         char *pass_string = get_passwd(opt_secret, "PBMAC");
   1418         int res;
   1419 
   1420         if (pass_string != NULL) {
   1421             cleanse(opt_secret);
   1422             res = OSSL_CMP_CTX_set1_secretValue(ctx,
   1423                                                 (unsigned char *)pass_string,
   1424                                                 strlen(pass_string));
   1425             clear_free(pass_string);
   1426             if (res == 0)
   1427                 return 0;
   1428         }
   1429         if (opt_cert != NULL || opt_key != NULL)
   1430             CMP_warn("-cert and -key not used for protection since -secret is given");
   1431     }
   1432     if (opt_ref != NULL
   1433             && !OSSL_CMP_CTX_set1_referenceValue(ctx, (unsigned char *)opt_ref,
   1434                                                  strlen(opt_ref)))
   1435         return 0;
   1436 
   1437     if (opt_key != NULL) {
   1438         EVP_PKEY *pkey = load_key_pwd(opt_key, opt_keyform, opt_keypass, engine,
   1439                                       "private key for CMP client certificate");
   1440 
   1441         if (pkey == NULL || !OSSL_CMP_CTX_set1_pkey(ctx, pkey)) {
   1442             EVP_PKEY_free(pkey);
   1443             return 0;
   1444         }
   1445         EVP_PKEY_free(pkey);
   1446     }
   1447     if (opt_secret == NULL && opt_srvcert == NULL && opt_trusted == NULL)
   1448         CMP_warn("will not authenticate server due to missing -secret, -trusted, or -srvcert");
   1449 
   1450     if (opt_cert != NULL) {
   1451         X509 *cert;
   1452         STACK_OF(X509) *certs = NULL;
   1453         X509_STORE *own_trusted = NULL;
   1454         int ok;
   1455 
   1456         if (!load_cert_certs(opt_cert, &cert, &certs, 0, opt_keypass,
   1457                              "CMP client certificate (optionally with chain)",
   1458                              vpm))
   1459             /* opt_keypass is needed if opt_cert is an encrypted PKCS#12 file */
   1460             return 0;
   1461         ok = OSSL_CMP_CTX_set1_cert(ctx, cert);
   1462         X509_free(cert);
   1463         if (!ok) {
   1464             CMP_err("out of memory");
   1465         } else {
   1466             if (opt_own_trusted != NULL) {
   1467                 own_trusted = load_trusted(opt_own_trusted, 0,
   1468                                            "trusted certs for verifying own CMP signer cert");
   1469                 ok = own_trusted != NULL;
   1470             }
   1471             ok = ok && OSSL_CMP_CTX_build_cert_chain(ctx, own_trusted, certs);
   1472         }
   1473         X509_STORE_free(own_trusted);
   1474         sk_X509_pop_free(certs, X509_free);
   1475         if (!ok)
   1476             return 0;
   1477     } else if (opt_own_trusted != NULL) {
   1478         CMP_warn("-own_trusted option is ignored without -cert");
   1479     }
   1480 
   1481     if (!setup_certs(opt_extracerts, "extra certificates for CMP", ctx,
   1482                      (add_X509_stack_fn_t)OSSL_CMP_CTX_set1_extraCertsOut))
   1483         return 0;
   1484     cleanse(opt_otherpass);
   1485 
   1486     if (opt_unprotected_requests)
   1487         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_UNPROTECTED_SEND, 1);
   1488 
   1489     if (opt_digest != NULL) {
   1490         int digest = OBJ_ln2nid(opt_digest);
   1491 
   1492         if (digest == NID_undef) {
   1493             CMP_err1("digest algorithm name not recognized: '%s'", opt_digest);
   1494             return 0;
   1495         }
   1496         if (!OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_DIGEST_ALGNID, digest)
   1497             || !OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_OWF_ALGNID, digest)) {
   1498             CMP_err1("digest algorithm name not supported: '%s'", opt_digest);
   1499             return 0;
   1500         }
   1501     }
   1502 
   1503     if (opt_mac != NULL) {
   1504         int mac = OBJ_ln2nid(opt_mac);
   1505         if (mac == NID_undef) {
   1506             CMP_err1("MAC algorithm name not recognized: '%s'", opt_mac);
   1507             return 0;
   1508         }
   1509         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_MAC_ALGNID, mac);
   1510     }
   1511     return 1;
   1512 }
   1513 
   1514 /*
   1515  * set up IR/CR/KUR/CertConf/RR specific parts of the OSSL_CMP_CTX
   1516  * based on options from config file/CLI.
   1517  * Returns pointer on success, NULL on error
   1518  */
   1519 static int setup_request_ctx(OSSL_CMP_CTX *ctx, ENGINE *engine)
   1520 {
   1521     X509_REQ *csr = NULL;
   1522     X509_EXTENSIONS *exts = NULL;
   1523     X509V3_CTX ext_ctx;
   1524 
   1525     if (opt_subject == NULL
   1526             && opt_csr == NULL && opt_oldcert == NULL && opt_cert == NULL
   1527             && opt_cmd != CMP_RR && opt_cmd != CMP_GENM)
   1528         CMP_warn("no -subject given; no -csr or -oldcert or -cert available for fallback");
   1529 
   1530     if (opt_cmd == CMP_IR || opt_cmd == CMP_CR || opt_cmd == CMP_KUR) {
   1531         if (opt_newkey == NULL
   1532             && opt_key == NULL && opt_csr == NULL && opt_oldcert == NULL) {
   1533             CMP_err("missing -newkey (or -key) to be certified and no -csr, -oldcert, or -cert given for fallback public key");
   1534             return 0;
   1535         }
   1536         if (opt_newkey == NULL
   1537             && opt_popo != OSSL_CRMF_POPO_NONE
   1538             && opt_popo != OSSL_CRMF_POPO_RAVERIFIED) {
   1539             if (opt_csr != NULL) {
   1540                 CMP_err1("no -newkey option given with private key for POPO, -csr option only provides public key%s",
   1541                         opt_key == NULL ? "" :
   1542                         ", and -key option superseded by by -csr");
   1543                 return 0;
   1544             }
   1545             if (opt_key == NULL) {
   1546                 CMP_err("missing -newkey (or -key) option for POPO");
   1547                 return 0;
   1548             }
   1549         }
   1550         if (opt_certout == NULL) {
   1551             CMP_err("-certout not given, nowhere to save newly enrolled certificate");
   1552             return 0;
   1553         }
   1554         if (!set_name(opt_subject, OSSL_CMP_CTX_set1_subjectName, ctx, "subject")
   1555                 || !set_name(opt_issuer, OSSL_CMP_CTX_set1_issuer, ctx, "issuer"))
   1556             return 0;
   1557     } else {
   1558         const char *msg = "option is ignored for commands other than 'ir', 'cr', and 'kur'";
   1559 
   1560         if (opt_subject != NULL) {
   1561             if (opt_ref == NULL && opt_cert == NULL) {
   1562                 /* use subject as default sender unless oldcert subject is used */
   1563                 if (!set_name(opt_subject, OSSL_CMP_CTX_set1_subjectName, ctx, "subject"))
   1564                     return 0;
   1565             } else {
   1566                 CMP_warn1("-subject %s since -ref or -cert is given", msg);
   1567             }
   1568         }
   1569         if (opt_issuer != NULL)
   1570             CMP_warn1("-issuer %s", msg);
   1571         if (opt_reqexts != NULL)
   1572             CMP_warn1("-reqexts %s", msg);
   1573         if (opt_san_nodefault)
   1574             CMP_warn1("-san_nodefault %s", msg);
   1575         if (opt_sans != NULL)
   1576             CMP_warn1("-sans %s", msg);
   1577         if (opt_policies != NULL)
   1578             CMP_warn1("-policies %s", msg);
   1579         if (opt_policy_oids != NULL)
   1580             CMP_warn1("-policy_oids %s", msg);
   1581     }
   1582     if (opt_cmd == CMP_KUR) {
   1583         char *ref_cert = opt_oldcert != NULL ? opt_oldcert : opt_cert;
   1584 
   1585         if (ref_cert == NULL && opt_csr == NULL) {
   1586             CMP_err("missing -oldcert for certificate to be updated and no -csr given");
   1587             return 0;
   1588         }
   1589         if (opt_subject != NULL)
   1590             CMP_warn2("given -subject '%s' overrides the subject of '%s' for KUR",
   1591                       opt_subject, ref_cert != NULL ? ref_cert : opt_csr);
   1592     }
   1593     if (opt_cmd == CMP_RR) {
   1594         if (opt_oldcert == NULL && opt_csr == NULL) {
   1595             CMP_err("missing -oldcert for certificate to be revoked and no -csr given");
   1596             return 0;
   1597         }
   1598         if (opt_oldcert != NULL && opt_csr != NULL)
   1599             CMP_warn("ignoring -csr since certificate to be revoked is given");
   1600     }
   1601     if (opt_cmd == CMP_P10CR && opt_csr == NULL) {
   1602         CMP_err("missing PKCS#10 CSR for p10cr");
   1603         return 0;
   1604     }
   1605 
   1606     if (opt_recipient == NULL && opt_srvcert == NULL && opt_issuer == NULL
   1607             && opt_oldcert == NULL && opt_cert == NULL)
   1608         CMP_warn("missing -recipient, -srvcert, -issuer, -oldcert or -cert; recipient will be set to \"NULL-DN\"");
   1609 
   1610     if (opt_cmd == CMP_P10CR || opt_cmd == CMP_RR) {
   1611         const char *msg = "option is ignored for 'p10cr' and 'rr' commands";
   1612 
   1613         if (opt_newkeypass != NULL)
   1614             CMP_warn1("-newkeytype %s", msg);
   1615         if (opt_newkey != NULL)
   1616             CMP_warn1("-newkey %s", msg);
   1617         if (opt_days != 0)
   1618             CMP_warn1("-days %s", msg);
   1619         if (opt_popo != OSSL_CRMF_POPO_NONE - 1)
   1620             CMP_warn1("-popo %s", msg);
   1621     } else if (opt_newkey != NULL) {
   1622         const char *file = opt_newkey;
   1623         const int format = opt_keyform;
   1624         const char *pass = opt_newkeypass;
   1625         const char *desc = "new private key for cert to be enrolled";
   1626         EVP_PKEY *pkey;
   1627         int priv = 1;
   1628         BIO *bio_bak = bio_err;
   1629 
   1630         bio_err = NULL; /* suppress diagnostics on first try loading key */
   1631         pkey = load_key_pwd(file, format, pass, engine, desc);
   1632         bio_err = bio_bak;
   1633         if (pkey == NULL) {
   1634             ERR_clear_error();
   1635             desc = opt_csr == NULL
   1636             ? "fallback public key for cert to be enrolled"
   1637             : "public key for checking cert resulting from p10cr";
   1638             pkey = load_pubkey(file, format, 0, pass, engine, desc);
   1639             priv = 0;
   1640         }
   1641         cleanse(opt_newkeypass);
   1642         if (pkey == NULL || !OSSL_CMP_CTX_set0_newPkey(ctx, priv, pkey)) {
   1643             EVP_PKEY_free(pkey);
   1644             return 0;
   1645         }
   1646     }
   1647 
   1648     if (opt_days > 0
   1649             && !OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_VALIDITY_DAYS,
   1650                                         opt_days)) {
   1651         CMP_err("could not set requested cert validity period");
   1652         return 0;
   1653     }
   1654 
   1655     if (opt_policies != NULL && opt_policy_oids != NULL) {
   1656         CMP_err("cannot have policies both via -policies and via -policy_oids");
   1657         return 0;
   1658     }
   1659 
   1660     if (opt_csr != NULL) {
   1661         if (opt_cmd == CMP_GENM) {
   1662             CMP_warn("-csr option is ignored for command 'genm'");
   1663         } else {
   1664             if ((csr = load_csr_autofmt(opt_csr, "PKCS#10 CSR")) == NULL)
   1665                 return 0;
   1666             if (!OSSL_CMP_CTX_set1_p10CSR(ctx, csr))
   1667                 goto oom;
   1668         }
   1669     }
   1670     if (opt_reqexts != NULL || opt_policies != NULL) {
   1671         if ((exts = sk_X509_EXTENSION_new_null()) == NULL)
   1672             goto oom;
   1673         X509V3_set_ctx(&ext_ctx, NULL, NULL, csr, NULL, X509V3_CTX_REPLACE);
   1674         X509V3_set_nconf(&ext_ctx, conf);
   1675         if (opt_reqexts != NULL
   1676             && !X509V3_EXT_add_nconf_sk(conf, &ext_ctx, opt_reqexts, &exts)) {
   1677             CMP_err1("cannot load certificate request extension section '%s'",
   1678                      opt_reqexts);
   1679             goto exts_err;
   1680         }
   1681         if (opt_policies != NULL
   1682             && !X509V3_EXT_add_nconf_sk(conf, &ext_ctx, opt_policies, &exts)) {
   1683             CMP_err1("cannot load policy cert request extension section '%s'",
   1684                      opt_policies);
   1685             goto exts_err;
   1686         }
   1687         OSSL_CMP_CTX_set0_reqExtensions(ctx, exts);
   1688     }
   1689     X509_REQ_free(csr);
   1690     /* After here, must not goto oom/exts_err */
   1691 
   1692     if (OSSL_CMP_CTX_reqExtensions_have_SAN(ctx) && opt_sans != NULL) {
   1693         CMP_err("cannot have Subject Alternative Names both via -reqexts and via -sans");
   1694         return 0;
   1695     }
   1696     if (!set_gennames(ctx, opt_sans, "Subject Alternative Name"))
   1697         return 0;
   1698 
   1699     if (opt_san_nodefault) {
   1700         if (opt_sans != NULL)
   1701             CMP_warn("-opt_san_nodefault has no effect when -sans is used");
   1702         (void)OSSL_CMP_CTX_set_option(ctx,
   1703                                       OSSL_CMP_OPT_SUBJECTALTNAME_NODEFAULT, 1);
   1704     }
   1705 
   1706     if (opt_policy_oids_critical) {
   1707         if (opt_policy_oids == NULL)
   1708             CMP_warn("-opt_policy_oids_critical has no effect unless -policy_oids is given");
   1709         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_POLICIES_CRITICAL, 1);
   1710     }
   1711 
   1712     while (opt_policy_oids != NULL) {
   1713         ASN1_OBJECT *policy;
   1714         POLICYINFO *pinfo;
   1715         char *next = next_item(opt_policy_oids);
   1716 
   1717         if ((policy = OBJ_txt2obj(opt_policy_oids, 1)) == 0) {
   1718             CMP_err1("unknown policy OID '%s'", opt_policy_oids);
   1719             return 0;
   1720         }
   1721 
   1722         if ((pinfo = POLICYINFO_new()) == NULL) {
   1723             ASN1_OBJECT_free(policy);
   1724             return 0;
   1725         }
   1726         pinfo->policyid = policy;
   1727 
   1728         if (!OSSL_CMP_CTX_push0_policy(ctx, pinfo)) {
   1729             CMP_err1("cannot add policy with OID '%s'", opt_policy_oids);
   1730             POLICYINFO_free(pinfo);
   1731             return 0;
   1732         }
   1733         opt_policy_oids = next;
   1734     }
   1735 
   1736     if (opt_popo >= OSSL_CRMF_POPO_NONE)
   1737         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_POPO_METHOD, opt_popo);
   1738 
   1739     if (opt_oldcert != NULL) {
   1740         if (opt_cmd == CMP_GENM) {
   1741             CMP_warn("-oldcert option is ignored for command 'genm'");
   1742         } else {
   1743             X509 *oldcert = load_cert_pwd(opt_oldcert, opt_keypass,
   1744                                           opt_cmd == CMP_KUR ?
   1745                                           "certificate to be updated" :
   1746                                           opt_cmd == CMP_RR ?
   1747                                           "certificate to be revoked" :
   1748                                           "reference certificate (oldcert)");
   1749             /* opt_keypass needed if opt_oldcert is an encrypted PKCS#12 file */
   1750 
   1751             if (oldcert == NULL)
   1752                 return 0;
   1753             if (!OSSL_CMP_CTX_set1_oldCert(ctx, oldcert)) {
   1754                 X509_free(oldcert);
   1755                 CMP_err("out of memory");
   1756                 return 0;
   1757             }
   1758             X509_free(oldcert);
   1759         }
   1760     }
   1761     cleanse(opt_keypass);
   1762     if (opt_revreason > CRL_REASON_NONE)
   1763         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_REVOCATION_REASON,
   1764                                       opt_revreason);
   1765 
   1766     return 1;
   1767 
   1768  oom:
   1769     CMP_err("out of memory");
   1770  exts_err:
   1771     sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
   1772     X509_REQ_free(csr);
   1773     return 0;
   1774 }
   1775 
   1776 static int handle_opt_geninfo(OSSL_CMP_CTX *ctx)
   1777 {
   1778     long value;
   1779     ASN1_OBJECT *type;
   1780     ASN1_INTEGER *aint;
   1781     ASN1_TYPE *val;
   1782     OSSL_CMP_ITAV *itav;
   1783     char *endstr;
   1784     char *valptr = strchr(opt_geninfo, ':');
   1785 
   1786     if (valptr == NULL) {
   1787         CMP_err("missing ':' in -geninfo option");
   1788         return 0;
   1789     }
   1790     valptr[0] = '\0';
   1791     valptr++;
   1792 
   1793     if (OPENSSL_strncasecmp(valptr, "int:", 4) != 0) {
   1794         CMP_err("missing 'int:' in -geninfo option");
   1795         return 0;
   1796     }
   1797     valptr += 4;
   1798 
   1799     value = strtol(valptr, &endstr, 10);
   1800     if (endstr == valptr || *endstr != '\0') {
   1801         CMP_err("cannot parse int in -geninfo option");
   1802         return 0;
   1803     }
   1804 
   1805     type = OBJ_txt2obj(opt_geninfo, 1);
   1806     if (type == NULL) {
   1807         CMP_err("cannot parse OID in -geninfo option");
   1808         return 0;
   1809     }
   1810 
   1811     if ((aint = ASN1_INTEGER_new()) == NULL)
   1812         goto oom;
   1813 
   1814     val = ASN1_TYPE_new();
   1815     if (!ASN1_INTEGER_set(aint, value) || val == NULL) {
   1816         ASN1_INTEGER_free(aint);
   1817         goto oom;
   1818     }
   1819     ASN1_TYPE_set(val, V_ASN1_INTEGER, aint);
   1820     itav = OSSL_CMP_ITAV_create(type, val);
   1821     if (itav == NULL) {
   1822         ASN1_TYPE_free(val);
   1823         goto oom;
   1824     }
   1825 
   1826     if (!OSSL_CMP_CTX_push0_geninfo_ITAV(ctx, itav)) {
   1827         OSSL_CMP_ITAV_free(itav);
   1828         return 0;
   1829     }
   1830     return 1;
   1831 
   1832  oom:
   1833     ASN1_OBJECT_free(type);
   1834     CMP_err("out of memory");
   1835     return 0;
   1836 }
   1837 
   1838 
   1839 /*
   1840  * set up the client-side OSSL_CMP_CTX based on options from config file/CLI
   1841  * while parsing options and checking their consistency.
   1842  * Prints reason for error to bio_err.
   1843  * Returns 1 on success, 0 on error
   1844  */
   1845 static int setup_client_ctx(OSSL_CMP_CTX *ctx, ENGINE *engine)
   1846 {
   1847     int ret = 0;
   1848     char *host = NULL, *port = NULL, *path = NULL, *used_path = opt_path;
   1849 #ifndef OPENSSL_NO_SOCK
   1850     int portnum, ssl;
   1851     static char server_port[32] = { '\0' };
   1852     const char *proxy_host = NULL;
   1853 #endif
   1854     char server_buf[200] = "mock server";
   1855     char proxy_buf[200] = "";
   1856 
   1857     if (!opt_use_mock_srv && opt_rspin == NULL) { /* note: -port is not given */
   1858 #ifndef OPENSSL_NO_SOCK
   1859         if (opt_server == NULL) {
   1860             CMP_err("missing -server or -use_mock_srv or -rspin option");
   1861             goto err;
   1862         }
   1863 #else
   1864         CMP_err("missing -use_mock_srv or -rspin option; -server option is not supported due to no-sock build");
   1865         goto err;
   1866 #endif
   1867     }
   1868 #ifndef OPENSSL_NO_SOCK
   1869     if (opt_server == NULL) {
   1870         if (opt_proxy != NULL)
   1871             CMP_warn("ignoring -proxy option since -server is not given");
   1872         if (opt_no_proxy != NULL)
   1873             CMP_warn("ignoring -no_proxy option since -server is not given");
   1874         if (opt_tls_used) {
   1875             CMP_warn("ignoring -tls_used option since -server is not given");
   1876             opt_tls_used = 0;
   1877         }
   1878         goto set_path;
   1879     }
   1880     if (!OSSL_HTTP_parse_url(opt_server, &ssl, NULL /* user */, &host, &port,
   1881                              &portnum, &path, NULL /* q */, NULL /* frag */)) {
   1882         CMP_err1("cannot parse -server URL: %s", opt_server);
   1883         goto err;
   1884     }
   1885     if (ssl && !opt_tls_used) {
   1886         CMP_err("missing -tls_used option since -server URL indicates https");
   1887         goto err;
   1888     }
   1889 
   1890     BIO_snprintf(server_port, sizeof(server_port), "%s", port);
   1891     if (opt_path == NULL)
   1892         used_path = path;
   1893     if (!OSSL_CMP_CTX_set1_server(ctx, host)
   1894             || !OSSL_CMP_CTX_set_serverPort(ctx, portnum))
   1895         goto oom;
   1896     if (opt_proxy != NULL && !OSSL_CMP_CTX_set1_proxy(ctx, opt_proxy))
   1897         goto oom;
   1898     if (opt_no_proxy != NULL && !OSSL_CMP_CTX_set1_no_proxy(ctx, opt_no_proxy))
   1899         goto oom;
   1900     (void)BIO_snprintf(server_buf, sizeof(server_buf), "http%s://%s:%s/%s",
   1901                        opt_tls_used ? "s" : "", host, port,
   1902                        *used_path == '/' ? used_path + 1 : used_path);
   1903 
   1904     proxy_host = OSSL_HTTP_adapt_proxy(opt_proxy, opt_no_proxy, host, ssl);
   1905     if (proxy_host != NULL)
   1906         (void)BIO_snprintf(proxy_buf, sizeof(proxy_buf), " via %s", proxy_host);
   1907 
   1908  set_path:
   1909 #endif
   1910 
   1911     if (!OSSL_CMP_CTX_set1_serverPath(ctx, used_path))
   1912         goto oom;
   1913     if (!transform_opts())
   1914         goto err;
   1915 
   1916     if (opt_infotype_s != NULL) {
   1917         char id_buf[100] = "id-it-";
   1918 
   1919         strncat(id_buf, opt_infotype_s, sizeof(id_buf) - strlen(id_buf) - 1);
   1920         if ((opt_infotype = OBJ_sn2nid(id_buf)) == NID_undef) {
   1921             CMP_err("unknown OID name in -infotype option");
   1922             goto err;
   1923         }
   1924     }
   1925 
   1926     if (!setup_verification_ctx(ctx))
   1927         goto err;
   1928 
   1929     if (opt_keep_alive != 1)
   1930         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_KEEP_ALIVE,
   1931                                       opt_keep_alive);
   1932     if (opt_total_timeout > 0 && opt_msg_timeout > 0
   1933             && opt_total_timeout < opt_msg_timeout) {
   1934         CMP_err2("-total_timeout argument = %d must not be < %d (-msg_timeout)",
   1935                  opt_total_timeout, opt_msg_timeout);
   1936         goto err;
   1937     }
   1938     if (opt_msg_timeout >= 0) /* must do this before setup_ssl_ctx() */
   1939         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_MSG_TIMEOUT,
   1940                                       opt_msg_timeout);
   1941     if (opt_total_timeout >= 0)
   1942         (void)OSSL_CMP_CTX_set_option(ctx, OSSL_CMP_OPT_TOTAL_TIMEOUT,
   1943                                       opt_total_timeout);
   1944 
   1945     if (opt_rspin != NULL) {
   1946         rspin_in_use = 1;
   1947         if (opt_reqin != NULL)
   1948             CMP_warn("-reqin is ignored since -rspin is present");
   1949     }
   1950     if (opt_reqin_new_tid && opt_reqin == NULL)
   1951         CMP_warn("-reqin_new_tid is ignored since -reqin is not present");
   1952     if (opt_reqin != NULL || opt_reqout != NULL
   1953             || opt_rspin != NULL || opt_rspout != NULL || opt_use_mock_srv)
   1954         (void)OSSL_CMP_CTX_set_transfer_cb(ctx, read_write_req_resp);
   1955 
   1956 #ifndef OPENSSL_NO_SOCK
   1957     if (opt_tls_used) {
   1958         APP_HTTP_TLS_INFO *info;
   1959 
   1960         if (opt_tls_cert != NULL
   1961             || opt_tls_key != NULL || opt_tls_keypass != NULL) {
   1962             if (opt_tls_key == NULL) {
   1963                 CMP_err("missing -tls_key option");
   1964                 goto err;
   1965             } else if (opt_tls_cert == NULL) {
   1966                 CMP_err("missing -tls_cert option");
   1967                 goto err;
   1968             }
   1969         }
   1970 
   1971         if ((info = OPENSSL_zalloc(sizeof(*info))) == NULL)
   1972             goto err;
   1973         (void)OSSL_CMP_CTX_set_http_cb_arg(ctx, info);
   1974         info->ssl_ctx = setup_ssl_ctx(ctx, host, engine);
   1975         info->server = host;
   1976         host = NULL; /* prevent deallocation */
   1977         if ((info->port = OPENSSL_strdup(server_port)) == NULL)
   1978             goto err;
   1979         /* workaround for callback design flaw, see #17088: */
   1980         info->use_proxy = proxy_host != NULL;
   1981         info->timeout = OSSL_CMP_CTX_get_option(ctx, OSSL_CMP_OPT_MSG_TIMEOUT);
   1982 
   1983         if (info->ssl_ctx == NULL)
   1984             goto err;
   1985         (void)OSSL_CMP_CTX_set_http_cb(ctx, app_http_tls_cb);
   1986     }
   1987 #endif
   1988 
   1989     if (!setup_protection_ctx(ctx, engine))
   1990         goto err;
   1991 
   1992     if (!setup_request_ctx(ctx, engine))
   1993         goto err;
   1994 
   1995     if (!set_name(opt_recipient, OSSL_CMP_CTX_set1_recipient, ctx, "recipient")
   1996             || !set_name(opt_expect_sender, OSSL_CMP_CTX_set1_expected_sender,
   1997                          ctx, "expected sender"))
   1998         goto err;
   1999 
   2000     if (opt_geninfo != NULL && !handle_opt_geninfo(ctx))
   2001         goto err;
   2002 
   2003     /* not printing earlier, to minimize confusion in case setup fails before */
   2004     if (opt_rspin != NULL)
   2005         CMP_info2("will contact %s%s "
   2006                   "only if -rspin argument gives too few filenames",
   2007                   server_buf, proxy_buf);
   2008     else
   2009         CMP_info2("will contact %s%s", server_buf, proxy_buf);
   2010 
   2011     ret = 1;
   2012 
   2013  err:
   2014     OPENSSL_free(host);
   2015     OPENSSL_free(port);
   2016     OPENSSL_free(path);
   2017     return ret;
   2018  oom:
   2019     CMP_err("out of memory");
   2020     goto err;
   2021 }
   2022 
   2023 /*
   2024  * write out the given certificate to the output specified by bio.
   2025  * Depending on options use either PEM or DER format.
   2026  * Returns 1 on success, 0 on error
   2027  */
   2028 static int write_cert(BIO *bio, X509 *cert)
   2029 {
   2030     if ((opt_certform == FORMAT_PEM && PEM_write_bio_X509(bio, cert))
   2031             || (opt_certform == FORMAT_ASN1 && i2d_X509_bio(bio, cert)))
   2032         return 1;
   2033     if (opt_certform != FORMAT_PEM && opt_certform != FORMAT_ASN1)
   2034         BIO_printf(bio_err,
   2035                    "error: unsupported type '%s' for writing certificates\n",
   2036                    opt_certform_s);
   2037     return 0;
   2038 }
   2039 
   2040 /*
   2041  * If destFile != NULL writes out a stack of certs to the given file.
   2042  * In any case frees the certs.
   2043  * Depending on options use either PEM or DER format,
   2044  * where DER does not make much sense for writing more than one cert!
   2045  * Returns number of written certificates on success, -1 on error.
   2046  */
   2047 static int save_free_certs(OSSL_CMP_CTX *ctx,
   2048                            STACK_OF(X509) *certs, char *destFile, char *desc)
   2049 {
   2050     BIO *bio = NULL;
   2051     int i;
   2052     int n = sk_X509_num(certs);
   2053 
   2054     if (destFile == NULL)
   2055         goto end;
   2056     CMP_info3("received %d %s certificate(s), saving to file '%s'",
   2057               n, desc, destFile);
   2058     if (n > 1 && opt_certform != FORMAT_PEM)
   2059         CMP_warn("saving more than one certificate in non-PEM format");
   2060 
   2061     if (destFile == NULL || (bio = BIO_new(BIO_s_file())) == NULL
   2062             || !BIO_write_filename(bio, (char *)destFile)) {
   2063         CMP_err1("could not open file '%s' for writing", destFile);
   2064         n = -1;
   2065         goto end;
   2066     }
   2067 
   2068     for (i = 0; i < n; i++) {
   2069         if (!write_cert(bio, sk_X509_value(certs, i))) {
   2070             CMP_err1("cannot write certificate to file '%s'", destFile);
   2071             n = -1;
   2072             goto end;
   2073         }
   2074     }
   2075 
   2076  end:
   2077     BIO_free(bio);
   2078     sk_X509_pop_free(certs, X509_free);
   2079     return n;
   2080 }
   2081 
   2082 static void print_itavs(STACK_OF(OSSL_CMP_ITAV) *itavs)
   2083 {
   2084     OSSL_CMP_ITAV *itav = NULL;
   2085     char buf[128];
   2086     int i, r;
   2087     int n = sk_OSSL_CMP_ITAV_num(itavs); /* itavs == NULL leads to 0 */
   2088 
   2089     if (n == 0) {
   2090         CMP_info("genp contains no ITAV");
   2091         return;
   2092     }
   2093 
   2094     for (i = 0; i < n; i++) {
   2095         itav = sk_OSSL_CMP_ITAV_value(itavs, i);
   2096         r = OBJ_obj2txt(buf, 128, OSSL_CMP_ITAV_get0_type(itav), 0);
   2097         if (r < 0)
   2098             CMP_err("could not get ITAV details");
   2099         else if (r == 0)
   2100             CMP_info("genp contains empty ITAV");
   2101         else
   2102             CMP_info1("genp contains ITAV of type: %s", buf);
   2103     }
   2104 }
   2105 
   2106 static char opt_item[SECTION_NAME_MAX + 1];
   2107 /* get previous name from a comma or space-separated list of names */
   2108 static const char *prev_item(const char *opt, const char *end)
   2109 {
   2110     const char *beg;
   2111     size_t len;
   2112 
   2113     if (end == opt)
   2114         return NULL;
   2115     beg = end;
   2116     while (beg > opt) {
   2117         --beg;
   2118         if (beg[0] == ',' || isspace(_UC(beg[0]))) {
   2119             ++beg;
   2120             break;
   2121         }
   2122     }
   2123     len = end - beg;
   2124     if (len > SECTION_NAME_MAX) {
   2125         CMP_warn3("using only first %d characters of section name starting with \"%.*s\"",
   2126                   SECTION_NAME_MAX, SECTION_NAME_MAX, beg);
   2127         len = SECTION_NAME_MAX;
   2128     }
   2129     memcpy(opt_item, beg, len);
   2130     opt_item[len] = '\0';
   2131     while (beg > opt) {
   2132         --beg;
   2133         if (beg[0] != ',' && !isspace(_UC(beg[0]))) {
   2134             ++beg;
   2135             break;
   2136         }
   2137     }
   2138     return beg;
   2139 }
   2140 
   2141 /* get str value for name from a comma-separated hierarchy of config sections */
   2142 static char *conf_get_string(const CONF *src_conf, const char *groups,
   2143                              const char *name)
   2144 {
   2145     char *res = NULL;
   2146     const char *end = groups + strlen(groups);
   2147 
   2148     while ((end = prev_item(groups, end)) != NULL) {
   2149         if ((res = NCONF_get_string(src_conf, opt_item, name)) != NULL)
   2150             return res;
   2151         ERR_clear_error();
   2152     }
   2153     return res;
   2154 }
   2155 
   2156 /* get long val for name from a comma-separated hierarchy of config sections */
   2157 static int conf_get_number_e(const CONF *conf_, const char *groups,
   2158                              const char *name, long *result)
   2159 {
   2160     char *str = conf_get_string(conf_, groups, name);
   2161     char *tailptr;
   2162     long res;
   2163 
   2164     if (str == NULL || *str == '\0')
   2165         return 0;
   2166 
   2167     res = strtol(str, &tailptr, 10);
   2168     if (res == LONG_MIN || res == LONG_MAX || *tailptr != '\0')
   2169         return 0;
   2170 
   2171     *result = res;
   2172     return 1;
   2173 }
   2174 
   2175 /*
   2176  * use the command line option table to read values from the CMP section
   2177  * of openssl.cnf.  Defaults are taken from the config file, they can be
   2178  * overwritten on the command line.
   2179  */
   2180 static int read_config(void)
   2181 {
   2182     unsigned int i;
   2183     long num = 0;
   2184     char *txt = NULL;
   2185     const OPTIONS *opt;
   2186     int start_opt = OPT_VERBOSITY - OPT_HELP;
   2187     int start_idx = OPT_VERBOSITY - 2;
   2188     /*
   2189      * starting with offset OPT_VERBOSITY because OPT_CONFIG and OPT_SECTION
   2190      * would not make sense within the config file.
   2191      */
   2192     int n_options = OSSL_NELEM(cmp_options) - 1;
   2193 
   2194     for (opt = &cmp_options[start_opt], i = start_idx;
   2195          opt->name != NULL; i++, opt++)
   2196         if (!strcmp(opt->name, OPT_SECTION_STR)
   2197                 || !strcmp(opt->name, OPT_MORE_STR))
   2198             n_options--;
   2199     OPENSSL_assert(OSSL_NELEM(cmp_vars) == n_options
   2200                  + OPT_PROV__FIRST + 1 - OPT_PROV__LAST
   2201                  + OPT_R__FIRST + 1 - OPT_R__LAST
   2202                  + OPT_V__FIRST + 1 - OPT_V__LAST);
   2203     for (opt = &cmp_options[start_opt], i = start_idx;
   2204          opt->name != NULL; i++, opt++) {
   2205         int provider_option = (OPT_PROV__FIRST <= opt->retval
   2206                                && opt->retval < OPT_PROV__LAST);
   2207         int rand_state_option = (OPT_R__FIRST <= opt->retval
   2208                                  && opt->retval < OPT_R__LAST);
   2209         int verification_option = (OPT_V__FIRST <= opt->retval
   2210                                    && opt->retval < OPT_V__LAST);
   2211 
   2212         if (strcmp(opt->name, OPT_SECTION_STR) == 0
   2213                 || strcmp(opt->name, OPT_MORE_STR) == 0) {
   2214             i--;
   2215             continue;
   2216         }
   2217         if (provider_option || rand_state_option || verification_option)
   2218             i--;
   2219         switch (opt->valtype) {
   2220         case '-':
   2221         case 'p':
   2222         case 'n':
   2223         case 'N':
   2224         case 'l':
   2225             if (!conf_get_number_e(conf, opt_section, opt->name, &num)) {
   2226                 ERR_clear_error();
   2227                 continue; /* option not provided */
   2228             }
   2229             if (opt->valtype == 'p' && num <= 0) {
   2230                 opt_printf_stderr("Non-positive number \"%ld\" for config option -%s\n",
   2231                                   num, opt->name);
   2232                 return -1;
   2233             }
   2234             if (opt->valtype == 'N' && num < 0) {
   2235                 opt_printf_stderr("Negative number \"%ld\" for config option -%s\n",
   2236                                   num, opt->name);
   2237                 return -1;
   2238             }
   2239             break;
   2240         case 's':
   2241         case '>':
   2242         case 'M':
   2243             txt = conf_get_string(conf, opt_section, opt->name);
   2244             if (txt == NULL) {
   2245                 ERR_clear_error();
   2246                 continue; /* option not provided */
   2247             }
   2248             break;
   2249         default:
   2250             CMP_err2("internal: unsupported type '%c' for option '%s'",
   2251                      opt->valtype, opt->name);
   2252             return 0;
   2253             break;
   2254         }
   2255         if (provider_option || verification_option) {
   2256             int conf_argc = 1;
   2257             char *conf_argv[3];
   2258             char arg1[82];
   2259 
   2260             BIO_snprintf(arg1, 81, "-%s", (char *)opt->name);
   2261             conf_argv[0] = prog;
   2262             conf_argv[1] = arg1;
   2263             if (opt->valtype == '-') {
   2264                 if (num != 0)
   2265                     conf_argc = 2;
   2266             } else {
   2267                 conf_argc = 3;
   2268                 conf_argv[2] = conf_get_string(conf, opt_section, opt->name);
   2269                 /* not NULL */
   2270             }
   2271             if (conf_argc > 1) {
   2272                 (void)opt_init(conf_argc, conf_argv, cmp_options);
   2273 
   2274                 if (provider_option
   2275                     ? !opt_provider(opt_next())
   2276                     : !opt_verify(opt_next(), vpm)) {
   2277                     CMP_err2("for option '%s' in config file section '%s'",
   2278                              opt->name, opt_section);
   2279                     return 0;
   2280                 }
   2281             }
   2282         } else {
   2283             switch (opt->valtype) {
   2284             case '-':
   2285             case 'p':
   2286             case 'n':
   2287             case 'N':
   2288                 if (num < INT_MIN || INT_MAX < num) {
   2289                     BIO_printf(bio_err,
   2290                                "integer value out of range for option '%s'\n",
   2291                                opt->name);
   2292                     return 0;
   2293                 }
   2294                 *cmp_vars[i].num = (int)num;
   2295                 break;
   2296             case 'l':
   2297                 *cmp_vars[i].num_long = num;
   2298                 break;
   2299             default:
   2300                 if (txt != NULL && txt[0] == '\0')
   2301                     txt = NULL; /* reset option on empty string input */
   2302                 *cmp_vars[i].txt = txt;
   2303                 break;
   2304             }
   2305         }
   2306     }
   2307 
   2308     return 1;
   2309 }
   2310 
   2311 static char *opt_str(void)
   2312 {
   2313     char *arg = opt_arg();
   2314 
   2315     if (arg[0] == '\0') {
   2316         CMP_warn1("%s option argument is empty string, resetting option",
   2317                   opt_flag());
   2318         arg = NULL;
   2319     } else if (arg[0] == '-') {
   2320         CMP_warn1("%s option argument starts with hyphen", opt_flag());
   2321     }
   2322     return arg;
   2323 }
   2324 
   2325 /* returns 1 on success, 0 on error, -1 on -help (i.e., stop with success) */
   2326 static int get_opts(int argc, char **argv)
   2327 {
   2328     OPTION_CHOICE o;
   2329 
   2330     prog = opt_init(argc, argv, cmp_options);
   2331 
   2332     while ((o = opt_next()) != OPT_EOF) {
   2333         switch (o) {
   2334         case OPT_EOF:
   2335         case OPT_ERR:
   2336  opthelp:
   2337             BIO_printf(bio_err, "%s: Use -help for summary.\n", prog);
   2338             return 0;
   2339         case OPT_HELP:
   2340             opt_help(cmp_options);
   2341             return -1;
   2342         case OPT_CONFIG: /* has already been handled */
   2343         case OPT_SECTION: /* has already been handled */
   2344             break;
   2345         case OPT_VERBOSITY:
   2346             if (!set_verbosity(opt_int_arg()))
   2347                 goto opthelp;
   2348             break;
   2349 #ifndef OPENSSL_NO_SOCK
   2350         case OPT_SERVER:
   2351             opt_server = opt_str();
   2352             break;
   2353         case OPT_PROXY:
   2354             opt_proxy = opt_str();
   2355             break;
   2356         case OPT_NO_PROXY:
   2357             opt_no_proxy = opt_str();
   2358             break;
   2359 #endif
   2360         case OPT_RECIPIENT:
   2361             opt_recipient = opt_str();
   2362             break;
   2363         case OPT_PATH:
   2364             opt_path = opt_str();
   2365             break;
   2366         case OPT_KEEP_ALIVE:
   2367             opt_keep_alive = opt_int_arg();
   2368             if (opt_keep_alive > 2) {
   2369                 CMP_err("-keep_alive argument must be 0, 1, or 2");
   2370                 goto opthelp;
   2371             }
   2372             break;
   2373         case OPT_MSG_TIMEOUT:
   2374             opt_msg_timeout = opt_int_arg();
   2375             break;
   2376         case OPT_TOTAL_TIMEOUT:
   2377             opt_total_timeout = opt_int_arg();
   2378             break;
   2379 #ifndef OPENSSL_NO_SOCK
   2380         case OPT_TLS_USED:
   2381             opt_tls_used = 1;
   2382             break;
   2383         case OPT_TLS_CERT:
   2384             opt_tls_cert = opt_str();
   2385             break;
   2386         case OPT_TLS_KEY:
   2387             opt_tls_key = opt_str();
   2388             break;
   2389         case OPT_TLS_KEYPASS:
   2390             opt_tls_keypass = opt_str();
   2391             break;
   2392         case OPT_TLS_EXTRA:
   2393             opt_tls_extra = opt_str();
   2394             break;
   2395         case OPT_TLS_TRUSTED:
   2396             opt_tls_trusted = opt_str();
   2397             break;
   2398         case OPT_TLS_HOST:
   2399             opt_tls_host = opt_str();
   2400             break;
   2401 #endif
   2402 
   2403         case OPT_REF:
   2404             opt_ref = opt_str();
   2405             break;
   2406         case OPT_SECRET:
   2407             opt_secret = opt_str();
   2408             break;
   2409         case OPT_CERT:
   2410             opt_cert = opt_str();
   2411             break;
   2412         case OPT_OWN_TRUSTED:
   2413             opt_own_trusted = opt_str();
   2414             break;
   2415         case OPT_KEY:
   2416             opt_key = opt_str();
   2417             break;
   2418         case OPT_KEYPASS:
   2419             opt_keypass = opt_str();
   2420             break;
   2421         case OPT_DIGEST:
   2422             opt_digest = opt_str();
   2423             break;
   2424         case OPT_MAC:
   2425             opt_mac = opt_str();
   2426             break;
   2427         case OPT_EXTRACERTS:
   2428             opt_extracerts = opt_str();
   2429             break;
   2430         case OPT_UNPROTECTED_REQUESTS:
   2431             opt_unprotected_requests = 1;
   2432             break;
   2433 
   2434         case OPT_TRUSTED:
   2435             opt_trusted = opt_str();
   2436             break;
   2437         case OPT_UNTRUSTED:
   2438             opt_untrusted = opt_str();
   2439             break;
   2440         case OPT_SRVCERT:
   2441             opt_srvcert = opt_str();
   2442             break;
   2443         case OPT_EXPECT_SENDER:
   2444             opt_expect_sender = opt_str();
   2445             break;
   2446         case OPT_IGNORE_KEYUSAGE:
   2447             opt_ignore_keyusage = 1;
   2448             break;
   2449         case OPT_UNPROTECTED_ERRORS:
   2450             opt_unprotected_errors = 1;
   2451             break;
   2452         case OPT_EXTRACERTSOUT:
   2453             opt_extracertsout = opt_str();
   2454             break;
   2455         case OPT_CACERTSOUT:
   2456             opt_cacertsout = opt_str();
   2457             break;
   2458 
   2459         case OPT_V_CASES:
   2460             if (!opt_verify(o, vpm))
   2461                 goto opthelp;
   2462             break;
   2463         case OPT_CMD:
   2464             opt_cmd_s = opt_str();
   2465             break;
   2466         case OPT_INFOTYPE:
   2467             opt_infotype_s = opt_str();
   2468             break;
   2469         case OPT_GENINFO:
   2470             opt_geninfo = opt_str();
   2471             break;
   2472 
   2473         case OPT_NEWKEY:
   2474             opt_newkey = opt_str();
   2475             break;
   2476         case OPT_NEWKEYPASS:
   2477             opt_newkeypass = opt_str();
   2478             break;
   2479         case OPT_SUBJECT:
   2480             opt_subject = opt_str();
   2481             break;
   2482         case OPT_ISSUER:
   2483             opt_issuer = opt_str();
   2484             break;
   2485         case OPT_DAYS:
   2486             opt_days = opt_int_arg();
   2487             break;
   2488         case OPT_REQEXTS:
   2489             opt_reqexts = opt_str();
   2490             break;
   2491         case OPT_SANS:
   2492             opt_sans = opt_str();
   2493             break;
   2494         case OPT_SAN_NODEFAULT:
   2495             opt_san_nodefault = 1;
   2496             break;
   2497         case OPT_POLICIES:
   2498             opt_policies = opt_str();
   2499             break;
   2500         case OPT_POLICY_OIDS:
   2501             opt_policy_oids = opt_str();
   2502             break;
   2503         case OPT_POLICY_OIDS_CRITICAL:
   2504             opt_policy_oids_critical = 1;
   2505             break;
   2506         case OPT_POPO:
   2507             opt_popo = opt_int_arg();
   2508             if (opt_popo < OSSL_CRMF_POPO_NONE
   2509                     || opt_popo > OSSL_CRMF_POPO_KEYENC) {
   2510                 CMP_err("invalid popo spec. Valid values are -1 .. 2");
   2511                 goto opthelp;
   2512             }
   2513             break;
   2514         case OPT_CSR:
   2515             opt_csr = opt_str();
   2516             break;
   2517         case OPT_OUT_TRUSTED:
   2518             opt_out_trusted = opt_str();
   2519             break;
   2520         case OPT_IMPLICIT_CONFIRM:
   2521             opt_implicit_confirm = 1;
   2522             break;
   2523         case OPT_DISABLE_CONFIRM:
   2524             opt_disable_confirm = 1;
   2525             break;
   2526         case OPT_CERTOUT:
   2527             opt_certout = opt_str();
   2528             break;
   2529         case OPT_CHAINOUT:
   2530             opt_chainout = opt_str();
   2531             break;
   2532         case OPT_OLDCERT:
   2533             opt_oldcert = opt_str();
   2534             break;
   2535         case OPT_REVREASON:
   2536             opt_revreason = opt_int_arg();
   2537                 if (opt_revreason < CRL_REASON_NONE
   2538                     || opt_revreason > CRL_REASON_AA_COMPROMISE
   2539                     || opt_revreason == 7) {
   2540                 CMP_err("invalid revreason. Valid values are -1 .. 6, 8 .. 10");
   2541                 goto opthelp;
   2542             }
   2543             break;
   2544         case OPT_CERTFORM:
   2545             opt_certform_s = opt_str();
   2546             break;
   2547         case OPT_KEYFORM:
   2548             opt_keyform_s = opt_str();
   2549             break;
   2550         case OPT_OTHERPASS:
   2551             opt_otherpass = opt_str();
   2552             break;
   2553 #ifndef OPENSSL_NO_ENGINE
   2554         case OPT_ENGINE:
   2555             opt_engine = opt_str();
   2556             break;
   2557 #endif
   2558         case OPT_PROV_CASES:
   2559             if (!opt_provider(o))
   2560                 goto opthelp;
   2561             break;
   2562         case OPT_R_CASES:
   2563             if (!opt_rand(o))
   2564                 goto opthelp;
   2565             break;
   2566 
   2567         case OPT_BATCH:
   2568             opt_batch = 1;
   2569             break;
   2570         case OPT_REPEAT:
   2571             opt_repeat = opt_int_arg();
   2572             break;
   2573         case OPT_REQIN:
   2574             opt_reqin = opt_str();
   2575             break;
   2576         case OPT_REQIN_NEW_TID:
   2577             opt_reqin_new_tid = 1;
   2578             break;
   2579         case OPT_REQOUT:
   2580             opt_reqout = opt_str();
   2581             break;
   2582         case OPT_RSPIN:
   2583             opt_rspin = opt_str();
   2584             break;
   2585         case OPT_RSPOUT:
   2586             opt_rspout = opt_str();
   2587             break;
   2588         case OPT_USE_MOCK_SRV:
   2589             opt_use_mock_srv = 1;
   2590             break;
   2591 
   2592 #ifndef OPENSSL_NO_SOCK
   2593         case OPT_PORT:
   2594             opt_port = opt_str();
   2595             break;
   2596         case OPT_MAX_MSGS:
   2597             opt_max_msgs = opt_int_arg();
   2598             break;
   2599 #endif
   2600         case OPT_SRV_REF:
   2601             opt_srv_ref = opt_str();
   2602             break;
   2603         case OPT_SRV_SECRET:
   2604             opt_srv_secret = opt_str();
   2605             break;
   2606         case OPT_SRV_CERT:
   2607             opt_srv_cert = opt_str();
   2608             break;
   2609         case OPT_SRV_KEY:
   2610             opt_srv_key = opt_str();
   2611             break;
   2612         case OPT_SRV_KEYPASS:
   2613             opt_srv_keypass = opt_str();
   2614             break;
   2615         case OPT_SRV_TRUSTED:
   2616             opt_srv_trusted = opt_str();
   2617             break;
   2618         case OPT_SRV_UNTRUSTED:
   2619             opt_srv_untrusted = opt_str();
   2620             break;
   2621         case OPT_RSP_CERT:
   2622             opt_rsp_cert = opt_str();
   2623             break;
   2624         case OPT_RSP_EXTRACERTS:
   2625             opt_rsp_extracerts = opt_str();
   2626             break;
   2627         case OPT_RSP_CAPUBS:
   2628             opt_rsp_capubs = opt_str();
   2629             break;
   2630         case OPT_POLL_COUNT:
   2631             opt_poll_count = opt_int_arg();
   2632             break;
   2633         case OPT_CHECK_AFTER:
   2634             opt_check_after = opt_int_arg();
   2635             break;
   2636         case OPT_GRANT_IMPLICITCONF:
   2637             opt_grant_implicitconf = 1;
   2638             break;
   2639         case OPT_PKISTATUS:
   2640             opt_pkistatus = opt_int_arg();
   2641             break;
   2642         case OPT_FAILURE:
   2643             opt_failure = opt_int_arg();
   2644             break;
   2645         case OPT_FAILUREBITS:
   2646             opt_failurebits = opt_int_arg();
   2647             break;
   2648         case OPT_STATUSSTRING:
   2649             opt_statusstring = opt_str();
   2650             break;
   2651         case OPT_SEND_ERROR:
   2652             opt_send_error = 1;
   2653             break;
   2654         case OPT_SEND_UNPROTECTED:
   2655             opt_send_unprotected = 1;
   2656             break;
   2657         case OPT_SEND_UNPROT_ERR:
   2658             opt_send_unprot_err = 1;
   2659             break;
   2660         case OPT_ACCEPT_UNPROTECTED:
   2661             opt_accept_unprotected = 1;
   2662             break;
   2663         case OPT_ACCEPT_UNPROT_ERR:
   2664             opt_accept_unprot_err = 1;
   2665             break;
   2666         case OPT_ACCEPT_RAVERIFIED:
   2667             opt_accept_raverified = 1;
   2668             break;
   2669         }
   2670     }
   2671 
   2672     /* No extra args. */
   2673     argc = opt_num_rest();
   2674     argv = opt_rest();
   2675     if (argc != 0)
   2676         goto opthelp;
   2677     return 1;
   2678 }
   2679 
   2680 #ifndef OPENSSL_NO_SOCK
   2681 static int cmp_server(OSSL_CMP_CTX *srv_cmp_ctx) {
   2682     BIO *acbio;
   2683     BIO *cbio = NULL;
   2684     int keep_alive = 0;
   2685     int msgs = 0;
   2686     int retry = 1;
   2687     int ret = 1;
   2688 
   2689     if ((acbio = http_server_init_bio(prog, opt_port)) == NULL)
   2690         return 0;
   2691     while (opt_max_msgs <= 0 || msgs < opt_max_msgs) {
   2692         char *path = NULL;
   2693         OSSL_CMP_MSG *req = NULL;
   2694         OSSL_CMP_MSG *resp = NULL;
   2695 
   2696         ret = http_server_get_asn1_req(ASN1_ITEM_rptr(OSSL_CMP_MSG),
   2697                                        (ASN1_VALUE **)&req, &path,
   2698                                        &cbio, acbio, &keep_alive,
   2699                                        prog, opt_port, 0, 0);
   2700         if (ret == 0) { /* no request yet */
   2701             if (retry) {
   2702                 ossl_sleep(1000);
   2703                 retry = 0;
   2704                 continue;
   2705             }
   2706             ret = 0;
   2707             goto next;
   2708         }
   2709         if (ret++ == -1) /* fatal error */
   2710             break;
   2711 
   2712         ret = 0;
   2713         msgs++;
   2714         if (req != NULL) {
   2715             if (strcmp(path, "") != 0 && strcmp(path, "pkix/") != 0) {
   2716                 (void)http_server_send_status(cbio, 404, "Not Found");
   2717                 CMP_err1("expecting empty path or 'pkix/' but got '%s'",
   2718                          path);
   2719                 OPENSSL_free(path);
   2720                 OSSL_CMP_MSG_free(req);
   2721                 goto next;
   2722             }
   2723             OPENSSL_free(path);
   2724             resp = OSSL_CMP_CTX_server_perform(cmp_ctx, req);
   2725             OSSL_CMP_MSG_free(req);
   2726             if (resp == NULL) {
   2727                 (void)http_server_send_status(cbio,
   2728                                               500, "Internal Server Error");
   2729                 break; /* treated as fatal error */
   2730             }
   2731             ret = http_server_send_asn1_resp(cbio, keep_alive,
   2732                                              "application/pkixcmp",
   2733                                              ASN1_ITEM_rptr(OSSL_CMP_MSG),
   2734                                              (const ASN1_VALUE *)resp);
   2735             OSSL_CMP_MSG_free(resp);
   2736             if (!ret)
   2737                 break; /* treated as fatal error */
   2738         }
   2739     next:
   2740         if (!ret) { /* on transmission error, cancel CMP transaction */
   2741             (void)OSSL_CMP_CTX_set1_transactionID(srv_cmp_ctx, NULL);
   2742             (void)OSSL_CMP_CTX_set1_senderNonce(srv_cmp_ctx, NULL);
   2743         }
   2744         if (!ret || !keep_alive
   2745             || OSSL_CMP_CTX_get_status(srv_cmp_ctx) != OSSL_CMP_PKISTATUS_trans
   2746             /* transaction closed by OSSL_CMP_CTX_server_perform() */) {
   2747             BIO_free_all(cbio);
   2748             cbio = NULL;
   2749         }
   2750     }
   2751 
   2752     BIO_free_all(cbio);
   2753     BIO_free_all(acbio);
   2754     return ret;
   2755 }
   2756 #endif
   2757 
   2758 static void print_status(void)
   2759 {
   2760     /* print PKIStatusInfo */
   2761     int status = OSSL_CMP_CTX_get_status(cmp_ctx);
   2762     char *buf = app_malloc(OSSL_CMP_PKISI_BUFLEN, "PKIStatusInfo buf");
   2763     const char *string =
   2764         OSSL_CMP_CTX_snprint_PKIStatus(cmp_ctx, buf, OSSL_CMP_PKISI_BUFLEN);
   2765     const char *from = "", *server = "";
   2766 
   2767 #ifndef OPENSSL_NO_SOCK
   2768     if (opt_server != NULL) {
   2769         from = " from ";
   2770         server = opt_server;
   2771     }
   2772 #endif
   2773     CMP_print(bio_err,
   2774               status == OSSL_CMP_PKISTATUS_accepted
   2775               ? OSSL_CMP_LOG_INFO :
   2776               status == OSSL_CMP_PKISTATUS_rejection
   2777               || status == OSSL_CMP_PKISTATUS_waiting
   2778               ? OSSL_CMP_LOG_ERR : OSSL_CMP_LOG_WARNING,
   2779               status == OSSL_CMP_PKISTATUS_accepted ? "info" :
   2780               status == OSSL_CMP_PKISTATUS_rejection ? "server error" :
   2781               status == OSSL_CMP_PKISTATUS_waiting ? "internal error"
   2782               : "warning", "received%s%s %s", from, server,
   2783               string != NULL ? string : "<unknown PKIStatus>");
   2784     OPENSSL_free(buf);
   2785 }
   2786 
   2787 int cmp_main(int argc, char **argv)
   2788 {
   2789     char *configfile = NULL;
   2790     int i;
   2791     X509 *newcert = NULL;
   2792     ENGINE *engine = NULL;
   2793     OSSL_CMP_CTX *srv_cmp_ctx = NULL;
   2794     int ret = 0; /* default: failure */
   2795 
   2796     prog = opt_appname(argv[0]);
   2797     if (argc <= 1) {
   2798         opt_help(cmp_options);
   2799         goto err;
   2800     }
   2801 
   2802     /*
   2803      * handle options -config, -section, and -verbosity upfront
   2804      * to take effect for other options
   2805      */
   2806     for (i = 1; i < argc - 1; i++) {
   2807         if (*argv[i] == '-') {
   2808             if (!strcmp(argv[i] + 1, cmp_options[OPT_CONFIG - OPT_HELP].name))
   2809                 opt_config = argv[++i];
   2810             else if (!strcmp(argv[i] + 1,
   2811                              cmp_options[OPT_SECTION - OPT_HELP].name))
   2812                 opt_section = argv[++i];
   2813             else if (strcmp(argv[i] + 1,
   2814                             cmp_options[OPT_VERBOSITY - OPT_HELP].name) == 0
   2815                      && !set_verbosity(atoi(argv[++i])))
   2816                 goto err;
   2817         }
   2818     }
   2819     if (opt_section[0] == '\0') /* empty string */
   2820         opt_section = DEFAULT_SECTION;
   2821 
   2822     vpm = X509_VERIFY_PARAM_new();
   2823     if (vpm == NULL) {
   2824         CMP_err("out of memory");
   2825         goto err;
   2826     }
   2827 
   2828     /* read default values for options from config file */
   2829     configfile = opt_config != NULL ? opt_config : default_config_file;
   2830     if (configfile != NULL && configfile[0] != '\0' /* non-empty string */
   2831             && (configfile != default_config_file || access(configfile, F_OK) != -1)) {
   2832         CMP_info2("using section(s) '%s' of OpenSSL configuration file '%s'",
   2833                   opt_section, configfile);
   2834         conf = app_load_config(configfile);
   2835         if (conf == NULL) {
   2836             goto err;
   2837         } else {
   2838             if (strcmp(opt_section, CMP_SECTION) == 0) { /* default */
   2839                 if (!NCONF_get_section(conf, opt_section))
   2840                     CMP_info2("no [%s] section found in config file '%s';"
   2841                               " will thus use just [default] and unnamed section if present",
   2842                               opt_section, configfile);
   2843             } else {
   2844                 const char *end = opt_section + strlen(opt_section);
   2845                 while ((end = prev_item(opt_section, end)) != NULL) {
   2846                     if (!NCONF_get_section(conf, opt_item)) {
   2847                         CMP_err2("no [%s] section found in config file '%s'",
   2848                                  opt_item, configfile);
   2849                         goto err;
   2850                     }
   2851                 }
   2852             }
   2853             ret = read_config();
   2854             if (!set_verbosity(opt_verbosity)) /* just for checking range */
   2855                 ret = -1;
   2856             if (ret <= 0) {
   2857                 if (ret == -1)
   2858                     BIO_printf(bio_err, "Use -help for summary.\n");
   2859                 goto err;
   2860             }
   2861         }
   2862     }
   2863     (void)BIO_flush(bio_err); /* prevent interference with opt_help() */
   2864 
   2865     ret = get_opts(argc, argv);
   2866     if (ret <= 0)
   2867         goto err;
   2868     ret = 0;
   2869     if (!app_RAND_load())
   2870         goto err;
   2871 
   2872     if (opt_batch)
   2873         set_base_ui_method(UI_null());
   2874 
   2875     if (opt_engine != NULL) {
   2876         engine = setup_engine_methods(opt_engine, 0 /* not: ENGINE_METHOD_ALL */, 0);
   2877         if (engine == NULL) {
   2878             CMP_err1("cannot load engine %s", opt_engine);
   2879             goto err;
   2880         }
   2881     }
   2882 
   2883     cmp_ctx = OSSL_CMP_CTX_new(app_get0_libctx(), app_get0_propq());
   2884     if (cmp_ctx == NULL)
   2885         goto err;
   2886     OSSL_CMP_CTX_set_log_verbosity(cmp_ctx, opt_verbosity);
   2887     if (!OSSL_CMP_CTX_set_log_cb(cmp_ctx, print_to_bio_out)) {
   2888         CMP_err1("cannot set up error reporting and logging for %s", prog);
   2889         goto err;
   2890     }
   2891 
   2892 #ifndef OPENSSL_NO_SOCK
   2893     if ((opt_tls_cert != NULL || opt_tls_key != NULL
   2894          || opt_tls_keypass != NULL || opt_tls_extra != NULL
   2895          || opt_tls_trusted != NULL || opt_tls_host != NULL)
   2896             && !opt_tls_used)
   2897         CMP_warn("Ingnoring TLS options(s) since -tls_used is not given");
   2898     if (opt_port != NULL) {
   2899         if (opt_tls_used) {
   2900             CMP_err("-tls_used option not supported with -port option");
   2901             goto err;
   2902         }
   2903         if (opt_server != NULL || opt_use_mock_srv) {
   2904             CMP_err("The -port option excludes -server and -use_mock_srv");
   2905             goto err;
   2906         }
   2907         if (opt_reqin != NULL || opt_reqout != NULL) {
   2908             CMP_err("The -port option does not support -reqin and -reqout");
   2909             goto err;
   2910         }
   2911         if (opt_rspin != NULL || opt_rspout != NULL) {
   2912             CMP_err("The -port option does not support -rspin and -rspout");
   2913             goto err;
   2914         }
   2915     }
   2916     if (opt_server != NULL && opt_use_mock_srv) {
   2917         CMP_err("cannot use both -server and -use_mock_srv options");
   2918         goto err;
   2919     }
   2920 #endif
   2921 
   2922     if (opt_use_mock_srv
   2923 #ifndef OPENSSL_NO_SOCK
   2924         || opt_port != NULL
   2925 #endif
   2926         ) {
   2927         OSSL_CMP_SRV_CTX *srv_ctx;
   2928 
   2929         if ((srv_ctx = setup_srv_ctx(engine)) == NULL)
   2930             goto err;
   2931         srv_cmp_ctx = OSSL_CMP_SRV_CTX_get0_cmp_ctx(srv_ctx);
   2932         OSSL_CMP_CTX_set_transfer_cb_arg(cmp_ctx, srv_ctx);
   2933         if (!OSSL_CMP_CTX_set_log_cb(srv_cmp_ctx, print_to_bio_err)) {
   2934             CMP_err1("cannot set up error reporting and logging for %s", prog);
   2935             goto err;
   2936         }
   2937         OSSL_CMP_CTX_set_log_verbosity(srv_cmp_ctx, opt_verbosity);
   2938     }
   2939 
   2940 #ifndef OPENSSL_NO_SOCK
   2941     if (opt_tls_used && (opt_use_mock_srv || opt_server == NULL)) {
   2942         CMP_warn("ignoring -tls_used option since -use_mock_srv is given or -server is not given");
   2943         opt_tls_used = 0;
   2944     }
   2945 
   2946     if (opt_port != NULL) { /* act as very basic CMP HTTP server */
   2947         ret = cmp_server(srv_cmp_ctx);
   2948         goto err;
   2949     }
   2950 
   2951     /* act as CMP client, possibly using internal mock server */
   2952 
   2953     if (opt_rspin != NULL) {
   2954         if (opt_server != NULL)
   2955             CMP_warn("-server option is not used if enough filenames given for -rspin");
   2956         if (opt_use_mock_srv)
   2957             CMP_warn("-use_mock_srv option is not used if enough filenames given for -rspin");
   2958     }
   2959 #endif
   2960 
   2961     if (!setup_client_ctx(cmp_ctx, engine)) {
   2962         CMP_err("cannot set up CMP context");
   2963         goto err;
   2964     }
   2965     for (i = 0; i < opt_repeat; i++) {
   2966         /* everything is ready, now connect and perform the command! */
   2967         switch (opt_cmd) {
   2968         case CMP_IR:
   2969             newcert = OSSL_CMP_exec_IR_ses(cmp_ctx);
   2970             if (newcert != NULL)
   2971                 ret = 1;
   2972             break;
   2973         case CMP_KUR:
   2974             newcert = OSSL_CMP_exec_KUR_ses(cmp_ctx);
   2975             if (newcert != NULL)
   2976                 ret = 1;
   2977             break;
   2978         case CMP_CR:
   2979             newcert = OSSL_CMP_exec_CR_ses(cmp_ctx);
   2980             if (newcert != NULL)
   2981                 ret = 1;
   2982             break;
   2983         case CMP_P10CR:
   2984             newcert = OSSL_CMP_exec_P10CR_ses(cmp_ctx);
   2985             if (newcert != NULL)
   2986                 ret = 1;
   2987             break;
   2988         case CMP_RR:
   2989             ret = OSSL_CMP_exec_RR_ses(cmp_ctx);
   2990             break;
   2991         case CMP_GENM:
   2992             {
   2993                 STACK_OF(OSSL_CMP_ITAV) *itavs;
   2994 
   2995                 if (opt_infotype != NID_undef) {
   2996                     OSSL_CMP_ITAV *itav =
   2997                         OSSL_CMP_ITAV_create(OBJ_nid2obj(opt_infotype), NULL);
   2998                     if (itav == NULL)
   2999                         goto err;
   3000                     OSSL_CMP_CTX_push0_genm_ITAV(cmp_ctx, itav);
   3001                 }
   3002 
   3003                 if ((itavs = OSSL_CMP_exec_GENM_ses(cmp_ctx)) != NULL) {
   3004                     print_itavs(itavs);
   3005                     sk_OSSL_CMP_ITAV_pop_free(itavs, OSSL_CMP_ITAV_free);
   3006                     ret = 1;
   3007                 }
   3008                 break;
   3009             }
   3010         default:
   3011             break;
   3012         }
   3013         if (OSSL_CMP_CTX_get_status(cmp_ctx) < OSSL_CMP_PKISTATUS_accepted)
   3014             goto err; /* we got no response, maybe even did not send request */
   3015 
   3016         print_status();
   3017         if (save_free_certs(cmp_ctx, OSSL_CMP_CTX_get1_extraCertsIn(cmp_ctx),
   3018                             opt_extracertsout, "extra") < 0)
   3019             ret = 0;
   3020         if (!ret)
   3021             goto err;
   3022         ret = 0;
   3023         if (save_free_certs(cmp_ctx, OSSL_CMP_CTX_get1_caPubs(cmp_ctx),
   3024                             opt_cacertsout, "CA") < 0)
   3025             goto err;
   3026         if (newcert != NULL) {
   3027             STACK_OF(X509) *certs = sk_X509_new_null();
   3028 
   3029             if (!X509_add_cert(certs, newcert, X509_ADD_FLAG_UP_REF)) {
   3030                 sk_X509_free(certs);
   3031                 goto err;
   3032             }
   3033             if (save_free_certs(cmp_ctx, certs, opt_certout, "enrolled") < 0)
   3034                 goto err;
   3035         }
   3036         if (save_free_certs(cmp_ctx, OSSL_CMP_CTX_get1_newChain(cmp_ctx),
   3037                             opt_chainout, "chain") < 0)
   3038             goto err;
   3039 
   3040         if (!OSSL_CMP_CTX_reinit(cmp_ctx))
   3041             goto err;
   3042     }
   3043     ret = 1;
   3044 
   3045  err:
   3046     /* in case we ended up here on error without proper cleaning */
   3047     cleanse(opt_keypass);
   3048     cleanse(opt_newkeypass);
   3049     cleanse(opt_otherpass);
   3050 #ifndef OPENSSL_NO_SOCK
   3051     cleanse(opt_tls_keypass);
   3052 #endif
   3053     cleanse(opt_secret);
   3054     cleanse(opt_srv_keypass);
   3055     cleanse(opt_srv_secret);
   3056 
   3057     if (ret != 1)
   3058         OSSL_CMP_CTX_print_errors(cmp_ctx);
   3059 
   3060     if (cmp_ctx != NULL) {
   3061 #ifndef OPENSSL_NO_SOCK
   3062         APP_HTTP_TLS_INFO *info = OSSL_CMP_CTX_get_http_cb_arg(cmp_ctx);
   3063 
   3064 #endif
   3065         ossl_cmp_mock_srv_free(OSSL_CMP_CTX_get_transfer_cb_arg(cmp_ctx));
   3066         X509_STORE_free(OSSL_CMP_CTX_get_certConf_cb_arg(cmp_ctx));
   3067         /* cannot free info already here, as it may be used indirectly by: */
   3068         OSSL_CMP_CTX_free(cmp_ctx);
   3069 #ifndef OPENSSL_NO_SOCK
   3070         if (info != NULL) {
   3071             OPENSSL_free((char *)info->server);
   3072             OPENSSL_free((char *)info->port);
   3073             APP_HTTP_TLS_INFO_free(info);
   3074         }
   3075 #endif
   3076     }
   3077     X509_VERIFY_PARAM_free(vpm);
   3078     release_engine(engine);
   3079 
   3080     NCONF_free(conf); /* must not do as long as opt_... variables are used */
   3081     OSSL_CMP_log_close();
   3082 
   3083     return ret == 0 ? EXIT_FAILURE : EXIT_SUCCESS; /* ret == -1 for -help */
   3084 }
   3085