/*
- * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2001-2023 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
#include <openssl/bn.h>
#include <openssl/x509v3.h>
-#if defined(__TANDEM)
-# if defined(OPENSSL_TANDEM_FLOSS)
-# include <floss.h(floss_fork)>
-# endif
-#endif
-
#if defined(OPENSSL_SYS_VXWORKS)
/* not supported */
int setpgid(pid_t pid, pid_t pgid)
{"no_certs", OPT_NO_CERTS, '-',
"Don't include any certificates in signed request"},
{"badsig", OPT_BADSIG, '-',
- "Corrupt last byte of loaded OSCP response signature (for test)"},
- {"CA", OPT_CA, '<', "CA certificate"},
+ "Corrupt last byte of loaded OCSP response signature (for test)"},
+ {"CA", OPT_CA, '<', "CA certificates"},
{"nmin", OPT_NMIN, 'p', "Number of minutes before next update"},
{"nrequest", OPT_REQUEST, 'p',
"Number of requests to accept (default unlimited)"},
{"VAfile", OPT_VAFILE, '<', "Validator certificates file"},
{"verify_other", OPT_VERIFY_OTHER, '<',
"Additional certificates to search for signer"},
- {"cert", OPT_CERT, '<', "Certificate to check"},
- {"serial", OPT_SERIAL, 's', "Serial number to check"},
+ {"cert", OPT_CERT, '<',
+ "Certificate to check; may be given multiple times"},
+ {"serial", OPT_SERIAL, 's',
+ "Serial number to check; may be given multiple times"},
{"validity_period", OPT_VALIDITY_PERIOD, 'u',
"Maximum validity discrepancy in seconds"},
{"signkey", OPT_SIGNKEY, 's', "Private key to sign OCSP request with"},
STACK_OF(X509) *sign_other = NULL, *verify_other = NULL, *rother = NULL;
STACK_OF(X509) *issuers = NULL;
X509 *issuer = NULL, *cert = NULL;
- STACK_OF(X509) *rca_cert = NULL;
+ STACK_OF(X509) *rca_certs = NULL;
EVP_MD *resp_certid_md = NULL;
X509 *signer = NULL, *rsigner = NULL;
X509_STORE *store = NULL;
|| (vpm = X509_VERIFY_PARAM_new()) == NULL)
goto end;
+ opt_set_unknown_name("digest");
prog = opt_init(argc, argv, ocsp_options);
while ((o = opt_next()) != OPT_EOF) {
switch (o) {
goto end;
break;
case OPT_CERT:
+ reset_unknown();
X509_free(cert);
cert = load_cert(opt_arg(), FORMAT_UNDEF, "certificate");
if (cert == NULL)
trailing_md = 0;
break;
case OPT_SERIAL:
+ reset_unknown();
if (cert_id_md == NULL)
cert_id_md = (EVP_MD *)EVP_sha1();
if (!add_ocsp_serial(&req, opt_arg(), cert_id_md, issuer, ids))
break;
case OPT_MULTI:
#ifdef HTTP_DAEMON
- multi = atoi(opt_arg());
+ n_responders = atoi(opt_arg());
#endif
break;
case OPT_PROV_CASES:
}
/* No extra arguments. */
- argc = opt_num_rest();
- if (argc != 0)
+ if (!opt_check_rest_arg(NULL))
goto opthelp;
if (trailing_md) {
BIO_printf(bio_err, "Error loading responder certificate\n");
goto end;
}
- if (!load_certs(rca_filename, 0, &rca_cert, NULL, "CA certificates"))
+ if (!load_certs(rca_filename, 0, &rca_certs, NULL, "CA certificates"))
goto end;
if (rcertfile != NULL) {
if (!load_certs(rcertfile, 0, &rother, NULL,
}
if (ridx_filename != NULL
- && (rkey == NULL || rsigner == NULL || rca_cert == NULL)) {
+ && (rkey == NULL || rsigner == NULL || rca_certs == NULL)) {
BIO_printf(bio_err,
"Responder mode requires certificate, key, and CA.\n");
goto end;
}
#ifdef HTTP_DAEMON
- if (multi && acbio != NULL)
+ if (n_responders != 0 && acbio != NULL)
spawn_loop(prog);
if (acbio != NULL && req_timeout > 0)
signal(SIGALRM, socket_timeout);
#endif
if (acbio != NULL)
- log_message(prog, LOG_INFO, "waiting for OCSP client connections...");
+ trace_log_message(-1, prog,
+ LOG_INFO, "waiting for OCSP client connections...");
redo_accept:
rdb = newrdb;
} else {
free_index(newrdb);
- log_message(prog, LOG_ERR, "error reloading updated index: %s",
- ridx_filename);
+ trace_log_message(-1, prog,
+ LOG_ERR, "error reloading updated index: %s",
+ ridx_filename);
}
}
#endif
}
if (rdb != NULL) {
- make_ocsp_response(bio_err, &resp, req, rdb, rca_cert, rsigner, rkey,
+ make_ocsp_response(bio_err, &resp, req, rdb, rca_certs, rsigner, rkey,
rsign_md, rsign_sigopts, rother, rflags, nmin, ndays,
badsig, resp_certid_md);
+ if (resp == NULL)
+ goto end;
if (cbio != NULL)
send_ocsp_response(cbio, resp);
} else if (host != NULL) {
EVP_MD_free(rsign_md);
EVP_MD_free(resp_certid_md);
X509_free(cert);
- sk_X509_pop_free(issuers, X509_free);
+ OSSL_STACK_OF_X509_free(issuers);
X509_free(rsigner);
- sk_X509_pop_free(rca_cert, X509_free);
+ OSSL_STACK_OF_X509_free(rca_certs);
free_index(rdb);
BIO_free_all(cbio);
BIO_free_all(acbio);
OCSP_BASICRESP_free(bs);
sk_OPENSSL_STRING_free(reqnames);
sk_OCSP_CERTID_free(ids);
- sk_X509_pop_free(sign_other, X509_free);
- sk_X509_pop_free(verify_other, X509_free);
+ OSSL_STACK_OF_X509_free(sign_other);
+ OSSL_STACK_OF_X509_free(verify_other);
sk_CONF_VALUE_pop_free(headers, X509V3_conf_free);
OPENSSL_free(thost);
OPENSSL_free(tport);
single = OCSP_basic_add1_status(bs, cid,
V_OCSP_CERTSTATUS_REVOKED,
reason, revtm, thisupd, nextupd);
+ if (single == NULL) {
+ *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_INTERNALERROR,
+ NULL);
+ goto end;
+ }
if (invtm != NULL)
OCSP_SINGLERESP_add1_ext_i2d(single, NID_invalidity_date,
invtm, 0, 0);
bn = ASN1_INTEGER_to_BN(ser, NULL);
OPENSSL_assert(bn); /* FIXME: should report an error at this
* point and abort */
- if (BN_is_zero(bn))
+ if (BN_is_zero(bn)) {
itmp = OPENSSL_strdup("00");
- else
+ OPENSSL_assert(itmp);
+ } else {
itmp = BN_bn2hex(bn);
+ }
row[DB_serial] = itmp;
BN_free(bn);
rrow = TXT_DB_get_by_index(db->db, DB_serial, row);
static int send_ocsp_response(BIO *cbio, const OCSP_RESPONSE *resp)
{
#ifndef OPENSSL_NO_SOCK
- return http_server_send_asn1_resp(cbio,
+ return http_server_send_asn1_resp(prog, cbio,
0 /* no keep-alive */,
"application/ocsp-response",
ASN1_ITEM_rptr(OCSP_RESPONSE),