LCOV - code coverage report
Current view: top level - home/mbr/git/openssl.git/apps - ocsp.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 180 757 23.8 %
Date: 2014-08-02 Functions: 2 11 18.2 %
Branches: 98 544 18.0 %

           Branch data     Line data    Source code
       1                 :            : /* ocsp.c */
       2                 :            : /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
       3                 :            :  * project 2000.
       4                 :            :  */
       5                 :            : /* ====================================================================
       6                 :            :  * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
       7                 :            :  *
       8                 :            :  * Redistribution and use in source and binary forms, with or without
       9                 :            :  * modification, are permitted provided that the following conditions
      10                 :            :  * are met:
      11                 :            :  *
      12                 :            :  * 1. Redistributions of source code must retain the above copyright
      13                 :            :  *    notice, this list of conditions and the following disclaimer. 
      14                 :            :  *
      15                 :            :  * 2. Redistributions in binary form must reproduce the above copyright
      16                 :            :  *    notice, this list of conditions and the following disclaimer in
      17                 :            :  *    the documentation and/or other materials provided with the
      18                 :            :  *    distribution.
      19                 :            :  *
      20                 :            :  * 3. All advertising materials mentioning features or use of this
      21                 :            :  *    software must display the following acknowledgment:
      22                 :            :  *    "This product includes software developed by the OpenSSL Project
      23                 :            :  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
      24                 :            :  *
      25                 :            :  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
      26                 :            :  *    endorse or promote products derived from this software without
      27                 :            :  *    prior written permission. For written permission, please contact
      28                 :            :  *    licensing@OpenSSL.org.
      29                 :            :  *
      30                 :            :  * 5. Products derived from this software may not be called "OpenSSL"
      31                 :            :  *    nor may "OpenSSL" appear in their names without prior written
      32                 :            :  *    permission of the OpenSSL Project.
      33                 :            :  *
      34                 :            :  * 6. Redistributions of any form whatsoever must retain the following
      35                 :            :  *    acknowledgment:
      36                 :            :  *    "This product includes software developed by the OpenSSL Project
      37                 :            :  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
      38                 :            :  *
      39                 :            :  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
      40                 :            :  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      41                 :            :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      42                 :            :  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
      43                 :            :  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      44                 :            :  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
      45                 :            :  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
      46                 :            :  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      47                 :            :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      48                 :            :  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      49                 :            :  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      50                 :            :  * OF THE POSSIBILITY OF SUCH DAMAGE.
      51                 :            :  * ====================================================================
      52                 :            :  *
      53                 :            :  * This product includes cryptographic software written by Eric Young
      54                 :            :  * (eay@cryptsoft.com).  This product includes software written by Tim
      55                 :            :  * Hudson (tjh@cryptsoft.com).
      56                 :            :  *
      57                 :            :  */
      58                 :            : #ifndef OPENSSL_NO_OCSP
      59                 :            : 
      60                 :            : #ifdef OPENSSL_SYS_VMS
      61                 :            : #define _XOPEN_SOURCE_EXTENDED  /* So fd_set and friends get properly defined
      62                 :            :                                    on OpenVMS */
      63                 :            : #endif
      64                 :            : 
      65                 :            : #define USE_SOCKETS
      66                 :            : 
      67                 :            : #include <stdio.h>
      68                 :            : #include <stdlib.h>
      69                 :            : #include <string.h>
      70                 :            : #include <time.h>
      71                 :            : #include "apps.h" /* needs to be included before the openssl headers! */
      72                 :            : #include <openssl/e_os2.h>
      73                 :            : #include <openssl/crypto.h>
      74                 :            : #include <openssl/err.h>
      75                 :            : #include <openssl/ssl.h>
      76                 :            : #include <openssl/evp.h>
      77                 :            : #include <openssl/bn.h>
      78                 :            : #include <openssl/x509v3.h>
      79                 :            : 
      80                 :            : #if defined(NETWARE_CLIB)
      81                 :            : #  ifdef NETWARE_BSDSOCK
      82                 :            : #    include <sys/socket.h>
      83                 :            : #    include <sys/bsdskt.h>
      84                 :            : #  else
      85                 :            : #    include <novsock2.h>
      86                 :            : #  endif
      87                 :            : #elif defined(NETWARE_LIBC)
      88                 :            : #  ifdef NETWARE_BSDSOCK
      89                 :            : #    include <sys/select.h>
      90                 :            : #  else
      91                 :            : #    include <novsock2.h>
      92                 :            : #  endif
      93                 :            : #endif
      94                 :            :   
      95                 :            : /* Maximum leeway in validity period: default 5 minutes */
      96                 :            : #define MAX_VALIDITY_PERIOD     (5 * 60)
      97                 :            : 
      98                 :            : static int add_ocsp_cert(OCSP_REQUEST **req, X509 *cert, const EVP_MD *cert_id_md, X509 *issuer,
      99                 :            :                                 STACK_OF(OCSP_CERTID) *ids);
     100                 :            : static int add_ocsp_serial(OCSP_REQUEST **req, char *serial, const EVP_MD * cert_id_md, X509 *issuer,
     101                 :            :                                 STACK_OF(OCSP_CERTID) *ids);
     102                 :            : static int print_ocsp_summary(BIO *out, OCSP_BASICRESP *bs, OCSP_REQUEST *req,
     103                 :            :                               STACK_OF(OPENSSL_STRING) *names,
     104                 :            :                               STACK_OF(OCSP_CERTID) *ids, long nsec,
     105                 :            :                               long maxage);
     106                 :            : 
     107                 :            : static int make_ocsp_response(OCSP_RESPONSE **resp, OCSP_REQUEST *req, CA_DB *db,
     108                 :            :                         X509 *ca, X509 *rcert, EVP_PKEY *rkey, const EVP_MD *md,
     109                 :            :                         STACK_OF(X509) *rother, unsigned long flags,
     110                 :            :                         int nmin, int ndays, int badsig);
     111                 :            : 
     112                 :            : static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser);
     113                 :            : static BIO *init_responder(const char *port);
     114                 :            : static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, const char *port);
     115                 :            : static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp);
     116                 :            : static OCSP_RESPONSE *query_responder(BIO *err, BIO *cbio, const char *path,
     117                 :            :                                       const STACK_OF(CONF_VALUE) *headers,
     118                 :            :                                       OCSP_REQUEST *req, int req_timeout);
     119                 :            : 
     120                 :            : #undef PROG
     121                 :            : #define PROG ocsp_main
     122                 :            : 
     123                 :            : int MAIN(int, char **);
     124                 :            : 
     125                 :         54 : int MAIN(int argc, char **argv)
     126                 :            :         {
     127                 :         54 :         ENGINE *e = NULL;
     128                 :            :         char **args;
     129                 :         54 :         char *host = NULL, *port = NULL, *path = "/";
     130                 :         54 :         char *thost = NULL, *tport = NULL, *tpath = NULL;
     131                 :         54 :         char *reqin = NULL, *respin = NULL;
     132                 :         54 :         char *reqout = NULL, *respout = NULL;
     133                 :         54 :         char *signfile = NULL, *keyfile = NULL;
     134                 :         54 :         char *rsignfile = NULL, *rkeyfile = NULL;
     135                 :         54 :         char *outfile = NULL;
     136                 :         54 :         int add_nonce = 1, noverify = 0, use_ssl = -1;
     137                 :         54 :         STACK_OF(CONF_VALUE) *headers = NULL;
     138                 :         54 :         OCSP_REQUEST *req = NULL;
     139                 :         54 :         OCSP_RESPONSE *resp = NULL;
     140                 :         54 :         OCSP_BASICRESP *bs = NULL;
     141                 :         54 :         X509 *issuer = NULL, *cert = NULL;
     142                 :         54 :         X509 *signer = NULL, *rsigner = NULL;
     143                 :         54 :         EVP_PKEY *key = NULL, *rkey = NULL;
     144                 :         54 :         BIO *acbio = NULL, *cbio = NULL;
     145                 :         54 :         BIO *derbio = NULL;
     146                 :         54 :         BIO *out = NULL;
     147                 :         54 :         int req_timeout = -1;
     148                 :         54 :         int req_text = 0, resp_text = 0;
     149                 :         54 :         long nsec = MAX_VALIDITY_PERIOD, maxage = -1;
     150                 :         54 :         char *CAfile = NULL, *CApath = NULL;
     151                 :         54 :         X509_STORE *store = NULL;
     152                 :         54 :         X509_VERIFY_PARAM *vpm = NULL;
     153                 :         54 :         STACK_OF(X509) *sign_other = NULL, *verify_other = NULL, *rother = NULL;
     154                 :         54 :         char *sign_certfile = NULL, *verify_certfile = NULL, *rcertfile = NULL;
     155                 :         54 :         unsigned long sign_flags = 0, verify_flags = 0, rflags = 0;
     156                 :         54 :         int ret = 1;
     157                 :         54 :         int accept_count = -1;
     158                 :         54 :         int badarg = 0;
     159                 :         54 :         int badsig = 0;
     160                 :            :         int i;
     161                 :         54 :         int ignore_err = 0;
     162                 :         54 :         STACK_OF(OPENSSL_STRING) *reqnames = NULL;
     163                 :         54 :         STACK_OF(OCSP_CERTID) *ids = NULL;
     164                 :            : 
     165                 :         54 :         X509 *rca_cert = NULL;
     166                 :         54 :         char *ridx_filename = NULL;
     167                 :         54 :         char *rca_filename = NULL;
     168                 :         54 :         CA_DB *rdb = NULL;
     169                 :         54 :         int nmin = 0, ndays = -1;
     170                 :         54 :         const EVP_MD *cert_id_md = NULL, *rsign_md = NULL;
     171                 :            : 
     172         [ -  + ]:         54 :         if (bio_err == NULL) bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
     173                 :            : 
     174         [ +  - ]:         54 :         if (!load_config(bio_err, NULL))
     175                 :            :                 goto end;
     176                 :         54 :         SSL_load_error_strings();
     177                 :         54 :         OpenSSL_add_ssl_algorithms();
     178                 :         54 :         args = argv + 1;
     179                 :         54 :         reqnames = sk_OPENSSL_STRING_new_null();
     180                 :         54 :         ids = sk_OCSP_CERTID_new_null();
     181 [ +  - ][ +  + ]:        378 :         while (!badarg && *args && *args[0] == '-')
                 [ +  - ]
     182                 :            :                 {
     183         [ -  + ]:        324 :                 if (!strcmp(*args, "-out"))
     184                 :            :                         {
     185         [ #  # ]:          0 :                         if (args[1])
     186                 :            :                                 {
     187                 :          0 :                                 args++;
     188                 :          0 :                                 outfile = *args;
     189                 :            :                                 }
     190                 :          0 :                         else badarg = 1;
     191                 :            :                         }
     192         [ -  + ]:        324 :                 else if (!strcmp(*args, "-timeout"))
     193                 :            :                         {
     194         [ #  # ]:          0 :                         if (args[1])
     195                 :            :                                 {
     196                 :          0 :                                 args++;
     197                 :          0 :                                 req_timeout = atol(*args);
     198         [ #  # ]:          0 :                                 if (req_timeout < 0)
     199                 :            :                                         {
     200                 :          0 :                                         BIO_printf(bio_err,
     201                 :            :                                                 "Illegal timeout value %s\n",
     202                 :            :                                                 *args);
     203                 :          0 :                                         badarg = 1;
     204                 :            :                                         }
     205                 :            :                                 }
     206                 :          0 :                         else badarg = 1;
     207                 :            :                         }
     208         [ -  + ]:        324 :                 else if (!strcmp(*args, "-url"))
     209                 :            :                         {
     210         [ #  # ]:          0 :                         if (thost)
     211                 :          0 :                                 OPENSSL_free(thost);
     212         [ #  # ]:          0 :                         if (tport)
     213                 :          0 :                                 OPENSSL_free(tport);
     214         [ #  # ]:          0 :                         if (tpath)
     215                 :          0 :                                 OPENSSL_free(tpath);
     216         [ #  # ]:          0 :                         if (args[1])
     217                 :            :                                 {
     218                 :          0 :                                 args++;
     219         [ #  # ]:          0 :                                 if (!OCSP_parse_url(*args, &host, &port, &path, &use_ssl))
     220                 :            :                                         {
     221                 :          0 :                                         BIO_printf(bio_err, "Error parsing URL\n");
     222                 :          0 :                                         badarg = 1;
     223                 :            :                                         }
     224                 :          0 :                                 thost = host;
     225                 :          0 :                                 tport = port;
     226                 :          0 :                                 tpath = path;
     227                 :            :                                 }
     228                 :          0 :                         else badarg = 1;
     229                 :            :                         }
     230         [ -  + ]:        324 :                 else if (!strcmp(*args, "-host"))
     231                 :            :                         {
     232         [ #  # ]:          0 :                         if (args[1])
     233                 :            :                                 {
     234                 :          0 :                                 args++;
     235                 :          0 :                                 host = *args;
     236                 :            :                                 }
     237                 :          0 :                         else badarg = 1;
     238                 :            :                         }
     239         [ -  + ]:        324 :                 else if (!strcmp(*args, "-port"))
     240                 :            :                         {
     241         [ #  # ]:          0 :                         if (args[1])
     242                 :            :                                 {
     243                 :          0 :                                 args++;
     244                 :          0 :                                 port = *args;
     245                 :            :                                 }
     246                 :          0 :                         else badarg = 1;
     247                 :            :                         }
     248         [ -  + ]:        324 :                 else if (!strcmp(*args, "-header"))
     249                 :            :                         {
     250 [ #  # ][ #  # ]:          0 :                         if (args[1] && args[2])
     251                 :            :                                 {
     252         [ #  # ]:          0 :                                 if (!X509V3_add_value(args[1], args[2], &headers))
     253                 :            :                                         goto end;
     254                 :          0 :                                 args += 2;
     255                 :            :                                 }
     256                 :          0 :                         else badarg = 1;
     257                 :            :                         }
     258         [ +  - ]:        324 :                 else if (!strcmp(*args, "-ignore_err"))
     259                 :            :                         ignore_err = 1;
     260         [ +  - ]:        324 :                 else if (!strcmp(*args, "-noverify"))
     261                 :            :                         noverify = 1;
     262         [ +  - ]:        324 :                 else if (!strcmp(*args, "-nonce"))
     263                 :            :                         add_nonce = 2;
     264         [ +  - ]:        324 :                 else if (!strcmp(*args, "-no_nonce"))
     265                 :            :                         add_nonce = 0;
     266         [ -  + ]:        324 :                 else if (!strcmp(*args, "-resp_no_certs"))
     267                 :          0 :                         rflags |= OCSP_NOCERTS;
     268         [ -  + ]:        324 :                 else if (!strcmp(*args, "-resp_key_id"))
     269                 :          0 :                         rflags |= OCSP_RESPID_KEY;
     270         [ +  - ]:        324 :                 else if (!strcmp(*args, "-no_certs"))
     271                 :            :                         sign_flags |= OCSP_NOCERTS;
     272         [ -  + ]:        324 :                 else if (!strcmp(*args, "-no_signature_verify"))
     273                 :          0 :                         verify_flags |= OCSP_NOSIGS;
     274         [ -  + ]:        324 :                 else if (!strcmp(*args, "-no_cert_verify"))
     275                 :          0 :                         verify_flags |= OCSP_NOVERIFY;
     276         [ -  + ]:        324 :                 else if (!strcmp(*args, "-no_chain"))
     277                 :          0 :                         verify_flags |= OCSP_NOCHAIN;
     278         [ -  + ]:        324 :                 else if (!strcmp(*args, "-no_cert_checks"))
     279                 :          0 :                         verify_flags |= OCSP_NOCHECKS;
     280         [ -  + ]:        324 :                 else if (!strcmp(*args, "-no_explicit"))
     281                 :          0 :                         verify_flags |= OCSP_NOEXPLICIT;
     282         [ -  + ]:        324 :                 else if (!strcmp(*args, "-trust_other"))
     283                 :          0 :                         verify_flags |= OCSP_TRUSTOTHER;
     284         [ -  + ]:        324 :                 else if (!strcmp(*args, "-no_intern"))
     285                 :          0 :                         verify_flags |= OCSP_NOINTERN;
     286         [ +  - ]:        324 :                 else if (!strcmp(*args, "-badsig"))
     287                 :            :                         badsig = 1;
     288         [ +  - ]:        324 :                 else if (!strcmp(*args, "-text"))
     289                 :            :                         {
     290                 :            :                         req_text = 1;
     291                 :            :                         resp_text = 1;
     292                 :            :                         }
     293         [ +  - ]:        324 :                 else if (!strcmp(*args, "-req_text"))
     294                 :            :                         req_text = 1;
     295         [ +  - ]:        324 :                 else if (!strcmp(*args, "-resp_text"))
     296                 :            :                         resp_text = 1;
     297         [ -  + ]:        324 :                 else if (!strcmp(*args, "-reqin"))
     298                 :            :                         {
     299         [ #  # ]:          0 :                         if (args[1])
     300                 :            :                                 {
     301                 :          0 :                                 args++;
     302                 :          0 :                                 reqin = *args;
     303                 :            :                                 }
     304                 :          0 :                         else badarg = 1;
     305                 :            :                         }
     306         [ +  + ]:        324 :                 else if (!strcmp(*args, "-respin"))
     307                 :            :                         {
     308         [ +  - ]:         54 :                         if (args[1])
     309                 :            :                                 {
     310                 :         54 :                                 args++;
     311                 :         54 :                                 respin = *args;
     312                 :            :                                 }
     313                 :          0 :                         else badarg = 1;
     314                 :            :                         }
     315         [ -  + ]:        270 :                 else if (!strcmp(*args, "-signer"))
     316                 :            :                         {
     317         [ #  # ]:          0 :                         if (args[1])
     318                 :            :                                 {
     319                 :          0 :                                 args++;
     320                 :          0 :                                 signfile = *args;
     321                 :            :                                 }
     322                 :          0 :                         else badarg = 1;
     323                 :            :                         }
     324         [ -  + ]:        270 :                 else if (!strcmp (*args, "-VAfile"))
     325                 :            :                         {
     326         [ #  # ]:          0 :                         if (args[1])
     327                 :            :                                 {
     328                 :          0 :                                 args++;
     329                 :          0 :                                 verify_certfile = *args;
     330                 :          0 :                                 verify_flags |= OCSP_TRUSTOTHER;
     331                 :            :                                 }
     332                 :          0 :                         else badarg = 1;
     333                 :            :                         }
     334         [ -  + ]:        270 :                 else if (!strcmp(*args, "-sign_other"))
     335                 :            :                         {
     336         [ #  # ]:          0 :                         if (args[1])
     337                 :            :                                 {
     338                 :          0 :                                 args++;
     339                 :          0 :                                 sign_certfile = *args;
     340                 :            :                                 }
     341                 :          0 :                         else badarg = 1;
     342                 :            :                         }
     343         [ +  + ]:        270 :                 else if (!strcmp(*args, "-verify_other"))
     344                 :            :                         {
     345         [ +  - ]:         54 :                         if (args[1])
     346                 :            :                                 {
     347                 :         54 :                                 args++;
     348                 :         54 :                                 verify_certfile = *args;
     349                 :            :                                 }
     350                 :          0 :                         else badarg = 1;
     351                 :            :                         }
     352         [ +  + ]:        216 :                 else if (!strcmp (*args, "-CAfile"))
     353                 :            :                         {
     354         [ +  - ]:         54 :                         if (args[1])
     355                 :            :                                 {
     356                 :         54 :                                 args++;
     357                 :         54 :                                 CAfile = *args;
     358                 :            :                                 }
     359                 :          0 :                         else badarg = 1;
     360                 :            :                         }
     361         [ +  + ]:        162 :                 else if (!strcmp (*args, "-CApath"))
     362                 :            :                         {
     363         [ +  - ]:         54 :                         if (args[1])
     364                 :            :                                 {
     365                 :         54 :                                 args++;
     366                 :         54 :                                 CApath = *args;
     367                 :            :                                 }
     368                 :          0 :                         else badarg = 1;
     369                 :            :                         }
     370         [ +  - ]:        108 :                 else if (args_verify(&args, NULL, &badarg, bio_err, &vpm))
     371                 :            :                         {
     372         [ +  - ]:        108 :                         if (badarg)
     373                 :            :                                 goto end;
     374                 :        108 :                         continue;
     375                 :            :                         }
     376         [ #  # ]:          0 :                 else if (!strcmp (*args, "-validity_period"))
     377                 :            :                         {
     378         [ #  # ]:          0 :                         if (args[1])
     379                 :            :                                 {
     380                 :          0 :                                 args++;
     381                 :          0 :                                 nsec = atol(*args);
     382         [ #  # ]:          0 :                                 if (nsec < 0)
     383                 :            :                                         {
     384                 :          0 :                                         BIO_printf(bio_err,
     385                 :            :                                                 "Illegal validity period %s\n",
     386                 :            :                                                 *args);
     387                 :          0 :                                         badarg = 1;
     388                 :            :                                         }
     389                 :            :                                 }
     390                 :          0 :                         else badarg = 1;
     391                 :            :                         }
     392         [ #  # ]:          0 :                 else if (!strcmp (*args, "-status_age"))
     393                 :            :                         {
     394         [ #  # ]:          0 :                         if (args[1])
     395                 :            :                                 {
     396                 :          0 :                                 args++;
     397                 :          0 :                                 maxage = atol(*args);
     398         [ #  # ]:          0 :                                 if (maxage < 0)
     399                 :            :                                         {
     400                 :          0 :                                         BIO_printf(bio_err,
     401                 :            :                                                 "Illegal validity age %s\n",
     402                 :            :                                                 *args);
     403                 :          0 :                                         badarg = 1;
     404                 :            :                                         }
     405                 :            :                                 }
     406                 :          0 :                         else badarg = 1;
     407                 :            :                         }
     408         [ #  # ]:          0 :                  else if (!strcmp(*args, "-signkey"))
     409                 :            :                         {
     410         [ #  # ]:          0 :                         if (args[1])
     411                 :            :                                 {
     412                 :          0 :                                 args++;
     413                 :          0 :                                 keyfile = *args;
     414                 :            :                                 }
     415                 :          0 :                         else badarg = 1;
     416                 :            :                         }
     417         [ #  # ]:          0 :                 else if (!strcmp(*args, "-reqout"))
     418                 :            :                         {
     419         [ #  # ]:          0 :                         if (args[1])
     420                 :            :                                 {
     421                 :          0 :                                 args++;
     422                 :          0 :                                 reqout = *args;
     423                 :            :                                 }
     424                 :          0 :                         else badarg = 1;
     425                 :            :                         }
     426         [ #  # ]:          0 :                 else if (!strcmp(*args, "-respout"))
     427                 :            :                         {
     428         [ #  # ]:          0 :                         if (args[1])
     429                 :            :                                 {
     430                 :          0 :                                 args++;
     431                 :          0 :                                 respout = *args;
     432                 :            :                                 }
     433                 :          0 :                         else badarg = 1;
     434                 :            :                         }
     435         [ #  # ]:          0 :                  else if (!strcmp(*args, "-path"))
     436                 :            :                         {
     437         [ #  # ]:          0 :                         if (args[1])
     438                 :            :                                 {
     439                 :          0 :                                 args++;
     440                 :          0 :                                 path = *args;
     441                 :            :                                 }
     442                 :          0 :                         else badarg = 1;
     443                 :            :                         }
     444         [ #  # ]:          0 :                 else if (!strcmp(*args, "-issuer"))
     445                 :            :                         {
     446         [ #  # ]:          0 :                         if (args[1])
     447                 :            :                                 {
     448                 :          0 :                                 args++;
     449                 :          0 :                                 X509_free(issuer);
     450                 :          0 :                                 issuer = load_cert(bio_err, *args, FORMAT_PEM,
     451                 :            :                                         NULL, e, "issuer certificate");
     452         [ #  # ]:          0 :                                 if(!issuer) goto end;
     453                 :            :                                 }
     454                 :          0 :                         else badarg = 1;
     455                 :            :                         }
     456         [ #  # ]:          0 :                 else if (!strcmp (*args, "-cert"))
     457                 :            :                         {
     458         [ #  # ]:          0 :                         if (args[1])
     459                 :            :                                 {
     460                 :          0 :                                 args++;
     461                 :          0 :                                 X509_free(cert);
     462                 :          0 :                                 cert = load_cert(bio_err, *args, FORMAT_PEM,
     463                 :            :                                         NULL, e, "certificate");
     464         [ #  # ]:          0 :                                 if(!cert) goto end;
     465         [ #  # ]:          0 :                                 if (!cert_id_md) cert_id_md = EVP_sha1();
     466         [ #  # ]:          0 :                                 if(!add_ocsp_cert(&req, cert, cert_id_md, issuer, ids))
     467                 :            :                                         goto end;
     468         [ #  # ]:          0 :                                 if(!sk_OPENSSL_STRING_push(reqnames, *args))
     469                 :            :                                         goto end;
     470                 :            :                                 }
     471                 :          0 :                         else badarg = 1;
     472                 :            :                         }
     473         [ #  # ]:          0 :                 else if (!strcmp(*args, "-serial"))
     474                 :            :                         {
     475         [ #  # ]:          0 :                         if (args[1])
     476                 :            :                                 {
     477                 :          0 :                                 args++;
     478         [ #  # ]:          0 :                                 if (!cert_id_md) cert_id_md = EVP_sha1();
     479         [ #  # ]:          0 :                                 if(!add_ocsp_serial(&req, *args, cert_id_md, issuer, ids))
     480                 :            :                                         goto end;
     481         [ #  # ]:          0 :                                 if(!sk_OPENSSL_STRING_push(reqnames, *args))
     482                 :            :                                         goto end;
     483                 :            :                                 }
     484                 :          0 :                         else badarg = 1;
     485                 :            :                         }
     486         [ #  # ]:          0 :                 else if (!strcmp(*args, "-index"))
     487                 :            :                         {
     488         [ #  # ]:          0 :                         if (args[1])
     489                 :            :                                 {
     490                 :          0 :                                 args++;
     491                 :          0 :                                 ridx_filename = *args;
     492                 :            :                                 }
     493                 :          0 :                         else badarg = 1;
     494                 :            :                         }
     495         [ #  # ]:          0 :                 else if (!strcmp(*args, "-CA"))
     496                 :            :                         {
     497         [ #  # ]:          0 :                         if (args[1])
     498                 :            :                                 {
     499                 :          0 :                                 args++;
     500                 :          0 :                                 rca_filename = *args;
     501                 :            :                                 }
     502                 :          0 :                         else badarg = 1;
     503                 :            :                         }
     504         [ #  # ]:          0 :                 else if (!strcmp (*args, "-nmin"))
     505                 :            :                         {
     506         [ #  # ]:          0 :                         if (args[1])
     507                 :            :                                 {
     508                 :          0 :                                 args++;
     509                 :          0 :                                 nmin = atol(*args);
     510         [ #  # ]:          0 :                                 if (nmin < 0)
     511                 :            :                                         {
     512                 :          0 :                                         BIO_printf(bio_err,
     513                 :            :                                                 "Illegal update period %s\n",
     514                 :            :                                                 *args);
     515                 :          0 :                                         badarg = 1;
     516                 :            :                                         }
     517                 :            :                                 }
     518         [ #  # ]:          0 :                                 if (ndays == -1)
     519                 :            :                                         ndays = 0;
     520                 :          0 :                         else badarg = 1;
     521                 :            :                         }
     522         [ #  # ]:          0 :                 else if (!strcmp (*args, "-nrequest"))
     523                 :            :                         {
     524         [ #  # ]:          0 :                         if (args[1])
     525                 :            :                                 {
     526                 :          0 :                                 args++;
     527                 :          0 :                                 accept_count = atol(*args);
     528         [ #  # ]:          0 :                                 if (accept_count < 0)
     529                 :            :                                         {
     530                 :          0 :                                         BIO_printf(bio_err,
     531                 :            :                                                 "Illegal accept count %s\n",
     532                 :            :                                                 *args);
     533                 :          0 :                                         badarg = 1;
     534                 :            :                                         }
     535                 :            :                                 }
     536                 :          0 :                         else badarg = 1;
     537                 :            :                         }
     538         [ #  # ]:          0 :                 else if (!strcmp (*args, "-ndays"))
     539                 :            :                         {
     540         [ #  # ]:          0 :                         if (args[1])
     541                 :            :                                 {
     542                 :          0 :                                 args++;
     543                 :          0 :                                 ndays = atol(*args);
     544         [ #  # ]:          0 :                                 if (ndays < 0)
     545                 :            :                                         {
     546                 :          0 :                                         BIO_printf(bio_err,
     547                 :            :                                                 "Illegal update period %s\n",
     548                 :            :                                                 *args);
     549                 :          0 :                                         badarg = 1;
     550                 :            :                                         }
     551                 :            :                                 }
     552                 :          0 :                         else badarg = 1;
     553                 :            :                         }
     554         [ #  # ]:          0 :                 else if (!strcmp(*args, "-rsigner"))
     555                 :            :                         {
     556         [ #  # ]:          0 :                         if (args[1])
     557                 :            :                                 {
     558                 :          0 :                                 args++;
     559                 :          0 :                                 rsignfile = *args;
     560                 :            :                                 }
     561                 :          0 :                         else badarg = 1;
     562                 :            :                         }
     563         [ #  # ]:          0 :                 else if (!strcmp(*args, "-rkey"))
     564                 :            :                         {
     565         [ #  # ]:          0 :                         if (args[1])
     566                 :            :                                 {
     567                 :          0 :                                 args++;
     568                 :          0 :                                 rkeyfile = *args;
     569                 :            :                                 }
     570                 :          0 :                         else badarg = 1;
     571                 :            :                         }
     572         [ #  # ]:          0 :                 else if (!strcmp(*args, "-rother"))
     573                 :            :                         {
     574         [ #  # ]:          0 :                         if (args[1])
     575                 :            :                                 {
     576                 :          0 :                                 args++;
     577                 :          0 :                                 rcertfile = *args;
     578                 :            :                                 }
     579                 :          0 :                         else badarg = 1;
     580                 :            :                         }
     581         [ #  # ]:          0 :                 else if (!strcmp(*args, "-rmd"))
     582                 :            :                         {
     583         [ #  # ]:          0 :                         if (args[1])
     584                 :            :                                 {
     585                 :          0 :                                 args++;
     586                 :          0 :                                 rsign_md = EVP_get_digestbyname(*args);
     587         [ #  # ]:          0 :                                 if (!rsign_md)
     588                 :          0 :                                         badarg = 1;
     589                 :            :                                 }
     590                 :          0 :                         else badarg = 1;
     591                 :            :                         }
     592         [ #  # ]:          0 :                 else if ((cert_id_md = EVP_get_digestbyname((*args)+1))==NULL)
     593                 :            :                         {
     594                 :          0 :                         badarg = 1;
     595                 :            :                         }
     596                 :        324 :                 args++;
     597                 :            :                 }
     598                 :            : 
     599                 :            :         /* Have we anything to do? */
     600 [ +  - ][ -  + ]:         54 :         if (!req && !reqin && !respin && !(port && ridx_filename)) badarg = 1;
         [ #  # ][ #  # ]
     601                 :            : 
     602         [ -  + ]:         54 :         if (badarg)
     603                 :            :                 {
     604                 :          0 :                 BIO_printf (bio_err, "OCSP utility\n");
     605                 :          0 :                 BIO_printf (bio_err, "Usage ocsp [options]\n");
     606                 :          0 :                 BIO_printf (bio_err, "where options are\n");
     607                 :          0 :                 BIO_printf (bio_err, "-out file          output filename\n");
     608                 :          0 :                 BIO_printf (bio_err, "-issuer file       issuer certificate\n");
     609                 :          0 :                 BIO_printf (bio_err, "-cert file         certificate to check\n");
     610                 :          0 :                 BIO_printf (bio_err, "-serial n          serial number to check\n");
     611                 :          0 :                 BIO_printf (bio_err, "-signer file       certificate to sign OCSP request with\n");
     612                 :          0 :                 BIO_printf (bio_err, "-signkey file      private key to sign OCSP request with\n");
     613                 :          0 :                 BIO_printf (bio_err, "-sign_other file   additional certificates to include in signed request\n");
     614                 :          0 :                 BIO_printf (bio_err, "-no_certs          don't include any certificates in signed request\n");
     615                 :          0 :                 BIO_printf (bio_err, "-req_text          print text form of request\n");
     616                 :          0 :                 BIO_printf (bio_err, "-resp_text         print text form of response\n");
     617                 :          0 :                 BIO_printf (bio_err, "-text              print text form of request and response\n");
     618                 :          0 :                 BIO_printf (bio_err, "-reqout file       write DER encoded OCSP request to \"file\"\n");
     619                 :          0 :                 BIO_printf (bio_err, "-respout file      write DER encoded OCSP reponse to \"file\"\n");
     620                 :          0 :                 BIO_printf (bio_err, "-reqin file        read DER encoded OCSP request from \"file\"\n");
     621                 :          0 :                 BIO_printf (bio_err, "-respin file       read DER encoded OCSP reponse from \"file\"\n");
     622                 :          0 :                 BIO_printf (bio_err, "-nonce             add OCSP nonce to request\n");
     623                 :          0 :                 BIO_printf (bio_err, "-no_nonce          don't add OCSP nonce to request\n");
     624                 :          0 :                 BIO_printf (bio_err, "-url URL           OCSP responder URL\n");
     625                 :          0 :                 BIO_printf (bio_err, "-host host:n       send OCSP request to host on port n\n");
     626                 :          0 :                 BIO_printf (bio_err, "-path              path to use in OCSP request\n");
     627                 :          0 :                 BIO_printf (bio_err, "-CApath dir        trusted certificates directory\n");
     628                 :          0 :                 BIO_printf (bio_err, "-CAfile file       trusted certificates file\n");
     629                 :          0 :                 BIO_printf (bio_err, "-trusted_first     use locally trusted CA's first when building trust chain\n");
     630                 :          0 :                 BIO_printf (bio_err, "-VAfile file       validator certificates file\n");
     631                 :          0 :                 BIO_printf (bio_err, "-validity_period n maximum validity discrepancy in seconds\n");
     632                 :          0 :                 BIO_printf (bio_err, "-status_age n      maximum status age in seconds\n");
     633                 :          0 :                 BIO_printf (bio_err, "-noverify          don't verify response at all\n");
     634                 :          0 :                 BIO_printf (bio_err, "-verify_other file additional certificates to search for signer\n");
     635                 :          0 :                 BIO_printf (bio_err, "-trust_other       don't verify additional certificates\n");
     636                 :          0 :                 BIO_printf (bio_err, "-no_intern         don't search certificates contained in response for signer\n");
     637                 :          0 :                 BIO_printf (bio_err, "-no_signature_verify don't check signature on response\n");
     638                 :          0 :                 BIO_printf (bio_err, "-no_cert_verify    don't check signing certificate\n");
     639                 :          0 :                 BIO_printf (bio_err, "-no_chain          don't chain verify response\n");
     640                 :          0 :                 BIO_printf (bio_err, "-no_cert_checks    don't do additional checks on signing certificate\n");
     641                 :          0 :                 BIO_printf (bio_err, "-port num             port to run responder on\n");
     642                 :          0 :                 BIO_printf (bio_err, "-index file   certificate status index file\n");
     643                 :          0 :                 BIO_printf (bio_err, "-CA file              CA certificate\n");
     644                 :          0 :                 BIO_printf (bio_err, "-rsigner file         responder certificate to sign responses with\n");
     645                 :          0 :                 BIO_printf (bio_err, "-rkey file    responder key to sign responses with\n");
     646                 :          0 :                 BIO_printf (bio_err, "-rother file  other certificates to include in response\n");
     647                 :          0 :                 BIO_printf (bio_err, "-resp_no_certs     don't include any certificates in response\n");
     648                 :          0 :                 BIO_printf (bio_err, "-nmin n               number of minutes before next update\n");
     649                 :          0 :                 BIO_printf (bio_err, "-ndays n              number of days before next update\n");
     650                 :          0 :                 BIO_printf (bio_err, "-resp_key_id       identify reponse by signing certificate key ID\n");
     651                 :          0 :                 BIO_printf (bio_err, "-nrequest n        number of requests to accept (default unlimited)\n");
     652                 :          0 :                 BIO_printf (bio_err, "-<dgst alg>     use specified digest in the request\n");
     653                 :          0 :                 goto end;
     654                 :            :                 }
     655                 :            : 
     656         [ -  + ]:         54 :         if(outfile) out = BIO_new_file(outfile, "w");
     657                 :         54 :         else out = BIO_new_fp(stdout, BIO_NOCLOSE);
     658                 :            : 
     659         [ -  + ]:         54 :         if(!out)
     660                 :            :                 {
     661                 :          0 :                 BIO_printf(bio_err, "Error opening output file\n");
     662                 :          0 :                 goto end;
     663                 :            :                 }
     664                 :            : 
     665 [ +  - ][ +  - ]:         54 :         if (!req && (add_nonce != 2)) add_nonce = 0;
     666                 :            : 
     667 [ +  - ][ -  + ]:         54 :         if (!req && reqin)
     668                 :            :                 {
     669         [ #  # ]:          0 :                 if (!strcmp(reqin, "-"))
     670                 :          0 :                         derbio = BIO_new_fp(stdin, BIO_NOCLOSE);
     671                 :            :                 else
     672                 :          0 :                         derbio = BIO_new_file(reqin, "rb");
     673         [ #  # ]:          0 :                 if (!derbio)
     674                 :            :                         {
     675                 :          0 :                         BIO_printf(bio_err, "Error Opening OCSP request file\n");
     676                 :          0 :                         goto end;
     677                 :            :                         }
     678                 :          0 :                 req = d2i_OCSP_REQUEST_bio(derbio, NULL);
     679                 :          0 :                 BIO_free(derbio);
     680         [ #  # ]:          0 :                 if(!req)
     681                 :            :                         {
     682                 :          0 :                         BIO_printf(bio_err, "Error reading OCSP request\n");
     683                 :          0 :                         goto end;
     684                 :            :                         }
     685                 :            :                 }
     686                 :            : 
     687 [ +  - ][ -  + ]:         54 :         if (!req && port)
     688                 :            :                 {
     689                 :          0 :                 acbio = init_responder(port);
     690         [ #  # ]:          0 :                 if (!acbio)
     691                 :            :                         goto end;
     692                 :            :                 }
     693                 :            : 
     694         [ -  + ]:         54 :         if (rsignfile && !rdb)
     695                 :            :                 {
     696         [ #  # ]:          0 :                 if (!rkeyfile) rkeyfile = rsignfile;
     697                 :          0 :                 rsigner = load_cert(bio_err, rsignfile, FORMAT_PEM,
     698                 :            :                         NULL, e, "responder certificate");
     699         [ #  # ]:          0 :                 if (!rsigner)
     700                 :            :                         {
     701                 :          0 :                         BIO_printf(bio_err, "Error loading responder certificate\n");
     702                 :          0 :                         goto end;
     703                 :            :                         }
     704                 :          0 :                 rca_cert = load_cert(bio_err, rca_filename, FORMAT_PEM,
     705                 :            :                         NULL, e, "CA certificate");
     706         [ #  # ]:          0 :                 if (rcertfile)
     707                 :            :                         {
     708                 :          0 :                         rother = load_certs(bio_err, rcertfile, FORMAT_PEM,
     709                 :            :                                 NULL, e, "responder other certificates");
     710         [ #  # ]:          0 :                         if (!rother) goto end;
     711                 :            :                         }
     712                 :          0 :                 rkey = load_key(bio_err, rkeyfile, FORMAT_PEM, 0, NULL, NULL,
     713                 :            :                         "responder private key");
     714         [ #  # ]:          0 :                 if (!rkey)
     715                 :            :                         goto end;
     716                 :            :                 }
     717         [ -  + ]:         54 :         if(acbio)
     718                 :         54 :                 BIO_printf(bio_err, "Waiting for OCSP client connections...\n");
     719                 :            : 
     720                 :            :         redo_accept:
     721                 :            : 
     722         [ -  + ]:         54 :         if (acbio)
     723                 :            :                 {
     724         [ #  # ]:          0 :                 if (!do_responder(&req, &cbio, acbio, port))
     725                 :            :                         goto end;
     726         [ #  # ]:          0 :                 if (!req)
     727                 :            :                         {
     728                 :          0 :                         resp = OCSP_response_create(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, NULL);
     729                 :          0 :                         send_ocsp_response(cbio, resp);
     730                 :          0 :                         goto done_resp;
     731                 :            :                         }
     732                 :            :                 }
     733                 :            : 
     734 [ +  - ][ +  - ]:         54 :         if (!req && (signfile || reqout || host || add_nonce || ridx_filename))
         [ +  - ][ -  + ]
     735                 :            :                 {
     736                 :          0 :                 BIO_printf(bio_err, "Need an OCSP request for this operation!\n");
     737                 :          0 :                 goto end;
     738                 :            :                 }
     739                 :            : 
     740 [ -  + ][ #  # ]:         54 :         if (req && add_nonce) OCSP_request_add1_nonce(req, NULL, -1);
     741                 :            : 
     742         [ -  + ]:         54 :         if (signfile)
     743                 :            :                 {
     744         [ #  # ]:          0 :                 if (!keyfile) keyfile = signfile;
     745                 :          0 :                 signer = load_cert(bio_err, signfile, FORMAT_PEM,
     746                 :            :                         NULL, e, "signer certificate");
     747         [ #  # ]:          0 :                 if (!signer)
     748                 :            :                         {
     749                 :          0 :                         BIO_printf(bio_err, "Error loading signer certificate\n");
     750                 :          0 :                         goto end;
     751                 :            :                         }
     752         [ #  # ]:          0 :                 if (sign_certfile)
     753                 :            :                         {
     754                 :          0 :                         sign_other = load_certs(bio_err, sign_certfile, FORMAT_PEM,
     755                 :            :                                 NULL, e, "signer certificates");
     756         [ #  # ]:          0 :                         if (!sign_other) goto end;
     757                 :            :                         }
     758                 :          0 :                 key = load_key(bio_err, keyfile, FORMAT_PEM, 0, NULL, NULL,
     759                 :            :                         "signer private key");
     760         [ #  # ]:          0 :                 if (!key)
     761                 :            :                         goto end;
     762                 :            : 
     763         [ #  # ]:          0 :                 if (!OCSP_request_sign(req, signer, key, NULL, sign_other, sign_flags))
     764                 :            :                         {
     765                 :          0 :                         BIO_printf(bio_err, "Error signing OCSP request\n");
     766                 :          0 :                         goto end;
     767                 :            :                         }
     768                 :            :                 }
     769                 :            : 
     770 [ -  + ][ #  # ]:         54 :         if (req_text && req) OCSP_REQUEST_print(out, req, 0);
     771                 :            : 
     772         [ -  + ]:         54 :         if (reqout)
     773                 :            :                 {
     774         [ #  # ]:          0 :                 if (!strcmp(reqout, "-"))
     775                 :          0 :                         derbio = BIO_new_fp(stdout, BIO_NOCLOSE);
     776                 :            :                 else
     777                 :          0 :                         derbio = BIO_new_file(reqout, "wb");
     778         [ #  # ]:          0 :                 if(!derbio)
     779                 :            :                         {
     780                 :          0 :                         BIO_printf(bio_err, "Error opening file %s\n", reqout);
     781                 :          0 :                         goto end;
     782                 :            :                         }
     783                 :          0 :                 i2d_OCSP_REQUEST_bio(derbio, req);
     784                 :          0 :                 BIO_free(derbio);
     785                 :            :                 }
     786                 :            : 
     787 [ -  + ][ #  # ]:         54 :         if (ridx_filename && (!rkey || !rsigner || !rca_cert))
                 [ #  # ]
     788                 :            :                 {
     789                 :          0 :                 BIO_printf(bio_err, "Need a responder certificate, key and CA for this operation!\n");
     790                 :          0 :                 goto end;
     791                 :            :                 }
     792                 :            : 
     793         [ -  + ]:         54 :         if (ridx_filename && !rdb)
     794                 :            :                 {
     795                 :          0 :                 rdb = load_index(ridx_filename, NULL);
     796         [ #  # ]:          0 :                 if (!rdb) goto end;
     797         [ #  # ]:          0 :                 if (!index_index(rdb)) goto end;
     798                 :            :                 }
     799                 :            : 
     800         [ -  + ]:         54 :         if (rdb)
     801                 :            :                 {
     802                 :          0 :                 i = make_ocsp_response(&resp, req, rdb, rca_cert, rsigner, rkey,rsign_md, rother, rflags, nmin, ndays, badsig);
     803         [ #  # ]:          0 :                 if (cbio)
     804                 :          0 :                         send_ocsp_response(cbio, resp);
     805                 :            :                 }
     806         [ -  + ]:         54 :         else if (host)
     807                 :            :                 {
     808                 :            : #ifndef OPENSSL_NO_SOCK
     809                 :          0 :                 resp = process_responder(bio_err, req, host, path,
     810                 :            :                                         port, use_ssl, headers, req_timeout);
     811         [ #  # ]:          0 :                 if (!resp)
     812                 :            :                         goto end;
     813                 :            : #else
     814                 :            :                 BIO_printf(bio_err, "Error creating connect BIO - sockets not supported.\n");
     815                 :            :                 goto end;
     816                 :            : #endif
     817                 :            :                 }
     818         [ +  - ]:         54 :         else if (respin)
     819                 :            :                 {
     820         [ +  - ]:         54 :                 if (!strcmp(respin, "-"))
     821                 :         54 :                         derbio = BIO_new_fp(stdin, BIO_NOCLOSE);
     822                 :            :                 else
     823                 :          0 :                         derbio = BIO_new_file(respin, "rb");
     824         [ -  + ]:         54 :                 if (!derbio)
     825                 :            :                         {
     826                 :          0 :                         BIO_printf(bio_err, "Error Opening OCSP response file\n");
     827                 :          0 :                         goto end;
     828                 :            :                         }
     829                 :         54 :                 resp = d2i_OCSP_RESPONSE_bio(derbio, NULL);
     830                 :         54 :                 BIO_free(derbio);
     831         [ -  + ]:         54 :                 if(!resp)
     832                 :            :                         {
     833                 :          0 :                         BIO_printf(bio_err, "Error reading OCSP response\n");
     834                 :          0 :                         goto end;
     835                 :            :                         }
     836                 :            :         
     837                 :            :                 }
     838                 :            :         else
     839                 :            :                 {
     840                 :            :                 ret = 0;
     841                 :            :                 goto end;
     842                 :            :                 }
     843                 :            : 
     844                 :            :         done_resp:
     845                 :            : 
     846         [ -  + ]:         54 :         if (respout)
     847                 :            :                 {
     848         [ #  # ]:          0 :                 if (!strcmp(respout, "-"))
     849                 :          0 :                         derbio = BIO_new_fp(stdout, BIO_NOCLOSE);
     850                 :            :                 else
     851                 :          0 :                         derbio = BIO_new_file(respout, "wb");
     852         [ #  # ]:          0 :                 if(!derbio)
     853                 :            :                         {
     854                 :          0 :                         BIO_printf(bio_err, "Error opening file %s\n", respout);
     855                 :          0 :                         goto end;
     856                 :            :                         }
     857                 :          0 :                 i2d_OCSP_RESPONSE_bio(derbio, resp);
     858                 :          0 :                 BIO_free(derbio);
     859                 :            :                 }
     860                 :            : 
     861                 :         54 :         i = OCSP_response_status(resp);
     862                 :            : 
     863         [ -  + ]:         54 :         if (i != OCSP_RESPONSE_STATUS_SUCCESSFUL)
     864                 :            :                 {
     865                 :          0 :                 BIO_printf(out, "Responder Error: %s (%d)\n",
     866                 :            :                                 OCSP_response_status_str(i), i);
     867         [ #  # ]:          0 :                 if (ignore_err)
     868                 :            :                         goto redo_accept;
     869                 :            :                 ret = 0;
     870                 :            :                 goto end;
     871                 :            :                 }
     872                 :            : 
     873         [ -  + ]:         54 :         if (resp_text) OCSP_RESPONSE_print(out, resp, 0);
     874                 :            : 
     875                 :            :         /* If running as responder don't verify our own response */
     876         [ -  + ]:         54 :         if (cbio)
     877                 :            :                 {
     878         [ #  # ]:          0 :                 if (accept_count > 0)
     879                 :          0 :                         accept_count--;
     880                 :            :                 /* Redo if more connections needed */
     881         [ #  # ]:          0 :                 if (accept_count)
     882                 :            :                         {
     883                 :          0 :                         BIO_free_all(cbio);
     884                 :          0 :                         cbio = NULL;
     885                 :          0 :                         OCSP_REQUEST_free(req);
     886                 :          0 :                         req = NULL;
     887                 :          0 :                         OCSP_RESPONSE_free(resp);
     888                 :          0 :                         resp = NULL;
     889                 :          0 :                         goto redo_accept;
     890                 :            :                         }
     891                 :            :                 ret = 0;
     892                 :            :                 goto end;
     893                 :            :                 }
     894         [ +  - ]:         54 :         else if (ridx_filename)
     895                 :            :                 {
     896                 :            :                 ret = 0;
     897                 :            :                 goto end;
     898                 :            :                 }
     899                 :            : 
     900                 :            :         if (!store)
     901                 :         54 :                 store = setup_verify(bio_err, CAfile, CApath);
     902         [ +  - ]:         54 :         if (!store)
     903                 :            :                 goto end;
     904         [ +  - ]:         54 :         if (vpm)
     905                 :         54 :                 X509_STORE_set1_param(store, vpm);
     906         [ +  - ]:         54 :         if (verify_certfile)
     907                 :            :                 {
     908                 :         54 :                 verify_other = load_certs(bio_err, verify_certfile, FORMAT_PEM,
     909                 :            :                         NULL, e, "validator certificate");
     910         [ +  - ]:         54 :                 if (!verify_other) goto end;
     911                 :            :                 }
     912                 :            : 
     913                 :         54 :         bs = OCSP_response_get1_basic(resp);
     914                 :            : 
     915         [ -  + ]:         54 :         if (!bs)
     916                 :            :                 {
     917                 :          0 :                 BIO_printf(bio_err, "Error parsing response\n");
     918                 :          0 :                 goto end;
     919                 :            :                 }
     920                 :            : 
     921                 :         54 :         ret = 0;
     922                 :            : 
     923         [ +  - ]:         54 :         if (!noverify)
     924                 :            :                 {
     925 [ -  + ][ #  # ]:         54 :                 if (req && ((i = OCSP_check_nonce(req, bs)) <= 0))
     926                 :            :                         {
     927         [ #  # ]:          0 :                         if (i == -1)
     928                 :          0 :                                 BIO_printf(bio_err, "WARNING: no nonce in response\n");
     929                 :            :                         else
     930                 :            :                                 {
     931                 :          0 :                                 BIO_printf(bio_err, "Nonce Verify error\n");
     932                 :          0 :                                 ret = 1;
     933                 :          0 :                                 goto end;
     934                 :            :                                 }
     935                 :            :                         }
     936                 :            : 
     937                 :         54 :                 i = OCSP_basic_verify(bs, verify_other, store, verify_flags);
     938         [ +  + ]:         54 :                 if(i <= 0)
     939                 :            :                         {
     940                 :         42 :                         BIO_printf(bio_err, "Response Verify Failure\n");
     941                 :         42 :                         ERR_print_errors(bio_err);
     942                 :         42 :                         ret = 1;
     943                 :            :                         }
     944                 :            :                 else
     945                 :         12 :                         BIO_printf(bio_err, "Response verify OK\n");
     946                 :            : 
     947                 :            :                 }
     948                 :            : 
     949         [ -  + ]:         54 :         if (!print_ocsp_summary(out, bs, req, reqnames, ids, nsec, maxage))
     950                 :          0 :                 ret = 1;
     951                 :            : 
     952                 :            : end:
     953                 :         54 :         ERR_print_errors(bio_err);
     954                 :         54 :         X509_free(signer);
     955                 :         54 :         X509_STORE_free(store);
     956         [ +  - ]:         54 :         if (vpm)
     957                 :         54 :                 X509_VERIFY_PARAM_free(vpm);
     958                 :         54 :         EVP_PKEY_free(key);
     959                 :         54 :         EVP_PKEY_free(rkey);
     960                 :         54 :         X509_free(issuer);
     961                 :         54 :         X509_free(cert);
     962                 :         54 :         X509_free(rsigner);
     963                 :         54 :         X509_free(rca_cert);
     964                 :         54 :         free_index(rdb);
     965                 :         54 :         BIO_free_all(cbio);
     966                 :         54 :         BIO_free_all(acbio);
     967                 :         54 :         BIO_free(out);
     968                 :         54 :         OCSP_REQUEST_free(req);
     969                 :         54 :         OCSP_RESPONSE_free(resp);
     970                 :         54 :         OCSP_BASICRESP_free(bs);
     971                 :         54 :         sk_OPENSSL_STRING_free(reqnames);
     972                 :         54 :         sk_OCSP_CERTID_free(ids);
     973                 :         54 :         sk_X509_pop_free(sign_other, X509_free);
     974                 :         54 :         sk_X509_pop_free(verify_other, X509_free);
     975                 :         54 :         sk_CONF_VALUE_pop_free(headers, X509V3_conf_free);
     976                 :            : 
     977         [ -  + ]:         54 :         if (thost)
     978                 :          0 :                 OPENSSL_free(thost);
     979         [ -  + ]:         54 :         if (tport)
     980                 :          0 :                 OPENSSL_free(tport);
     981         [ -  + ]:         54 :         if (tpath)
     982                 :          0 :                 OPENSSL_free(tpath);
     983                 :            : 
     984                 :         54 :         OPENSSL_EXIT(ret);
     985                 :            : }
     986                 :            : 
     987                 :          0 : static int add_ocsp_cert(OCSP_REQUEST **req, X509 *cert, const EVP_MD *cert_id_md,X509 *issuer,
     988                 :            :                                 STACK_OF(OCSP_CERTID) *ids)
     989                 :            :         {
     990                 :            :         OCSP_CERTID *id;
     991         [ #  # ]:          0 :         if(!issuer)
     992                 :            :                 {
     993                 :          0 :                 BIO_printf(bio_err, "No issuer certificate specified\n");
     994                 :          0 :                 return 0;
     995                 :            :                 }
     996         [ #  # ]:          0 :         if(!*req) *req = OCSP_REQUEST_new();
     997         [ #  # ]:          0 :         if(!*req) goto err;
     998                 :          0 :         id = OCSP_cert_to_id(cert_id_md, cert, issuer);
     999 [ #  # ][ #  # ]:          0 :         if(!id || !sk_OCSP_CERTID_push(ids, id)) goto err;
    1000         [ #  # ]:          0 :         if(!OCSP_request_add0_id(*req, id)) goto err;
    1001                 :            :         return 1;
    1002                 :            : 
    1003                 :            :         err:
    1004                 :          0 :         BIO_printf(bio_err, "Error Creating OCSP request\n");
    1005                 :          0 :         return 0;
    1006                 :            :         }
    1007                 :            : 
    1008                 :          0 : static int add_ocsp_serial(OCSP_REQUEST **req, char *serial,const EVP_MD *cert_id_md, X509 *issuer,
    1009                 :            :                                 STACK_OF(OCSP_CERTID) *ids)
    1010                 :            :         {
    1011                 :            :         OCSP_CERTID *id;
    1012                 :            :         X509_NAME *iname;
    1013                 :            :         ASN1_BIT_STRING *ikey;
    1014                 :            :         ASN1_INTEGER *sno;
    1015         [ #  # ]:          0 :         if(!issuer)
    1016                 :            :                 {
    1017                 :          0 :                 BIO_printf(bio_err, "No issuer certificate specified\n");
    1018                 :          0 :                 return 0;
    1019                 :            :                 }
    1020         [ #  # ]:          0 :         if(!*req) *req = OCSP_REQUEST_new();
    1021         [ #  # ]:          0 :         if(!*req) goto err;
    1022                 :          0 :         iname = X509_get_subject_name(issuer);
    1023                 :          0 :         ikey = X509_get0_pubkey_bitstr(issuer);
    1024                 :          0 :         sno = s2i_ASN1_INTEGER(NULL, serial);
    1025         [ #  # ]:          0 :         if(!sno)
    1026                 :            :                 {
    1027                 :          0 :                 BIO_printf(bio_err, "Error converting serial number %s\n", serial);
    1028                 :          0 :                 return 0;
    1029                 :            :                 }
    1030                 :          0 :         id = OCSP_cert_id_new(cert_id_md, iname, ikey, sno);
    1031                 :          0 :         ASN1_INTEGER_free(sno);
    1032 [ #  # ][ #  # ]:          0 :         if(!id || !sk_OCSP_CERTID_push(ids, id)) goto err;
    1033         [ #  # ]:          0 :         if(!OCSP_request_add0_id(*req, id)) goto err;
    1034                 :            :         return 1;
    1035                 :            : 
    1036                 :            :         err:
    1037                 :          0 :         BIO_printf(bio_err, "Error Creating OCSP request\n");
    1038                 :          0 :         return 0;
    1039                 :            :         }
    1040                 :            : 
    1041                 :         54 : static int print_ocsp_summary(BIO *out, OCSP_BASICRESP *bs, OCSP_REQUEST *req,
    1042                 :            :                               STACK_OF(OPENSSL_STRING) *names,
    1043                 :            :                               STACK_OF(OCSP_CERTID) *ids, long nsec,
    1044                 :            :                               long maxage)
    1045                 :            :         {
    1046                 :            :         OCSP_CERTID *id;
    1047                 :            :         char *name;
    1048                 :            :         int i;
    1049                 :            : 
    1050                 :            :         int status, reason;
    1051                 :            : 
    1052                 :            :         ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
    1053                 :            : 
    1054 [ -  + ][ #  # ]:         54 :         if (!bs || !req || !sk_OPENSSL_STRING_num(names) || !sk_OCSP_CERTID_num(ids))
                 [ #  # ]
    1055                 :            :                 return 1;
    1056                 :            : 
    1057         [ #  # ]:          0 :         for (i = 0; i < sk_OCSP_CERTID_num(ids); i++)
    1058                 :            :                 {
    1059                 :          0 :                 id = sk_OCSP_CERTID_value(ids, i);
    1060                 :          0 :                 name = sk_OPENSSL_STRING_value(names, i);
    1061                 :          0 :                 BIO_printf(out, "%s: ", name);
    1062                 :            : 
    1063         [ #  # ]:          0 :                 if(!OCSP_resp_find_status(bs, id, &status, &reason,
    1064                 :            :                                         &rev, &thisupd, &nextupd))
    1065                 :            :                         {
    1066                 :          0 :                         BIO_puts(out, "ERROR: No Status found.\n");
    1067                 :          0 :                         continue;
    1068                 :            :                         }
    1069                 :            : 
    1070                 :            :                 /* Check validity: if invalid write to output BIO so we
    1071                 :            :                  * know which response this refers to.
    1072                 :            :                  */
    1073         [ #  # ]:          0 :                 if (!OCSP_check_validity(thisupd, nextupd, nsec, maxage))
    1074                 :            :                         {
    1075                 :          0 :                         BIO_puts(out, "WARNING: Status times invalid.\n");
    1076                 :          0 :                         ERR_print_errors(out);
    1077                 :            :                         }
    1078                 :          0 :                 BIO_printf(out, "%s\n", OCSP_cert_status_str(status));
    1079                 :            : 
    1080                 :          0 :                 BIO_puts(out, "\tThis Update: ");
    1081                 :          0 :                 ASN1_GENERALIZEDTIME_print(out, thisupd);
    1082                 :          0 :                 BIO_puts(out, "\n");
    1083                 :            : 
    1084         [ #  # ]:          0 :                 if(nextupd)
    1085                 :            :                         {
    1086                 :          0 :                         BIO_puts(out, "\tNext Update: ");
    1087                 :          0 :                         ASN1_GENERALIZEDTIME_print(out, nextupd);
    1088                 :          0 :                         BIO_puts(out, "\n");
    1089                 :            :                         }
    1090                 :            : 
    1091         [ #  # ]:          0 :                 if (status != V_OCSP_CERTSTATUS_REVOKED)
    1092                 :          0 :                         continue;
    1093                 :            : 
    1094         [ #  # ]:          0 :                 if (reason != -1)
    1095                 :          0 :                         BIO_printf(out, "\tReason: %s\n",
    1096                 :            :                                 OCSP_crl_reason_str(reason));
    1097                 :            : 
    1098                 :          0 :                 BIO_puts(out, "\tRevocation Time: ");
    1099                 :          0 :                 ASN1_GENERALIZEDTIME_print(out, rev);
    1100                 :          0 :                 BIO_puts(out, "\n");
    1101                 :            :                 }
    1102                 :            : 
    1103                 :            :         return 1;
    1104                 :            :         }
    1105                 :            : 
    1106                 :            : 
    1107                 :          0 : static int make_ocsp_response(OCSP_RESPONSE **resp, OCSP_REQUEST *req, CA_DB *db,
    1108                 :            :                         X509 *ca, X509 *rcert,
    1109                 :            :                         EVP_PKEY *rkey, const EVP_MD *rmd,
    1110                 :            :                         STACK_OF(X509) *rother, unsigned long flags,
    1111                 :            :                         int nmin, int ndays, int badsig)
    1112                 :            :         {
    1113                 :          0 :         ASN1_TIME *thisupd = NULL, *nextupd = NULL;
    1114                 :          0 :         OCSP_CERTID *cid, *ca_id = NULL;
    1115                 :          0 :         OCSP_BASICRESP *bs = NULL;
    1116                 :          0 :         int i, id_count, ret = 1;
    1117                 :            : 
    1118                 :          0 :         id_count = OCSP_request_onereq_count(req);
    1119                 :            : 
    1120         [ #  # ]:          0 :         if (id_count <= 0)
    1121                 :            :                 {
    1122                 :          0 :                 *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, NULL);
    1123                 :          0 :                 goto end;
    1124                 :            :                 }
    1125                 :            : 
    1126                 :            : 
    1127                 :          0 :         bs = OCSP_BASICRESP_new();
    1128                 :          0 :         thisupd = X509_gmtime_adj(NULL, 0);
    1129         [ #  # ]:          0 :         if (ndays != -1)
    1130                 :          0 :                 nextupd = X509_gmtime_adj(NULL, nmin * 60 + ndays * 3600 * 24 );
    1131                 :            : 
    1132                 :            :         /* Examine each certificate id in the request */
    1133         [ #  # ]:          0 :         for (i = 0; i < id_count; i++)
    1134                 :            :                 {
    1135                 :            :                 OCSP_ONEREQ *one;
    1136                 :            :                 ASN1_INTEGER *serial;
    1137                 :            :                 char **inf;
    1138                 :            :                 ASN1_OBJECT *cert_id_md_oid;
    1139                 :            :                 const EVP_MD *cert_id_md;
    1140                 :          0 :                 one = OCSP_request_onereq_get0(req, i);
    1141                 :          0 :                 cid = OCSP_onereq_get0_id(one);
    1142                 :            : 
    1143                 :          0 :                 OCSP_id_get0_info(NULL,&cert_id_md_oid, NULL,NULL, cid);
    1144                 :            : 
    1145                 :          0 :                 cert_id_md = EVP_get_digestbyobj(cert_id_md_oid);       
    1146         [ #  # ]:          0 :                 if (! cert_id_md) 
    1147                 :            :                         {
    1148                 :          0 :                         *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_INTERNALERROR,
    1149                 :            :                                 NULL);
    1150                 :          0 :                                 goto end;
    1151                 :            :                         }       
    1152         [ #  # ]:          0 :                 if (ca_id) OCSP_CERTID_free(ca_id);
    1153                 :          0 :                 ca_id = OCSP_cert_to_id(cert_id_md, NULL, ca);
    1154                 :            : 
    1155                 :            :                 /* Is this request about our CA? */
    1156         [ #  # ]:          0 :                 if (OCSP_id_issuer_cmp(ca_id, cid))
    1157                 :            :                         {
    1158                 :          0 :                         OCSP_basic_add1_status(bs, cid,
    1159                 :            :                                                 V_OCSP_CERTSTATUS_UNKNOWN,
    1160                 :            :                                                 0, NULL,
    1161                 :            :                                                 thisupd, nextupd);
    1162                 :          0 :                         continue;
    1163                 :            :                         }
    1164                 :          0 :                 OCSP_id_get0_info(NULL, NULL, NULL, &serial, cid);
    1165                 :          0 :                 inf = lookup_serial(db, serial);
    1166         [ #  # ]:          0 :                 if (!inf)
    1167                 :          0 :                         OCSP_basic_add1_status(bs, cid,
    1168                 :            :                                                 V_OCSP_CERTSTATUS_UNKNOWN,
    1169                 :            :                                                 0, NULL,
    1170                 :            :                                                 thisupd, nextupd);
    1171         [ #  # ]:          0 :                 else if (inf[DB_type][0] == DB_TYPE_VAL)
    1172                 :          0 :                         OCSP_basic_add1_status(bs, cid,
    1173                 :            :                                                 V_OCSP_CERTSTATUS_GOOD,
    1174                 :            :                                                 0, NULL,
    1175                 :            :                                                 thisupd, nextupd);
    1176         [ #  # ]:          0 :                 else if (inf[DB_type][0] == DB_TYPE_REV)
    1177                 :            :                         {
    1178                 :          0 :                         ASN1_OBJECT *inst = NULL;
    1179                 :          0 :                         ASN1_TIME *revtm = NULL;
    1180                 :          0 :                         ASN1_GENERALIZEDTIME *invtm = NULL;
    1181                 :            :                         OCSP_SINGLERESP *single;
    1182                 :          0 :                         int reason = -1;
    1183                 :          0 :                         unpack_revinfo(&revtm, &reason, &inst, &invtm, inf[DB_rev_date]);
    1184                 :          0 :                         single = OCSP_basic_add1_status(bs, cid,
    1185                 :            :                                                 V_OCSP_CERTSTATUS_REVOKED,
    1186                 :            :                                                 reason, revtm,
    1187                 :            :                                                 thisupd, nextupd);
    1188         [ #  # ]:          0 :                         if (invtm)
    1189                 :          0 :                                 OCSP_SINGLERESP_add1_ext_i2d(single, NID_invalidity_date, invtm, 0, 0);
    1190         [ #  # ]:          0 :                         else if (inst)
    1191                 :          0 :                                 OCSP_SINGLERESP_add1_ext_i2d(single, NID_hold_instruction_code, inst, 0, 0);
    1192                 :          0 :                         ASN1_OBJECT_free(inst);
    1193                 :          0 :                         ASN1_TIME_free(revtm);
    1194                 :          0 :                         ASN1_GENERALIZEDTIME_free(invtm);
    1195                 :            :                         }
    1196                 :            :                 }
    1197                 :            : 
    1198                 :          0 :         OCSP_copy_nonce(bs, req);
    1199                 :            :         
    1200                 :          0 :         OCSP_basic_sign(bs, rcert, rkey, rmd, rother, flags);
    1201                 :            : 
    1202         [ #  # ]:          0 :         if (badsig)
    1203                 :          0 :                 bs->signature->data[bs->signature->length -1] ^= 0x1;
    1204                 :            : 
    1205                 :          0 :         *resp = OCSP_response_create(OCSP_RESPONSE_STATUS_SUCCESSFUL, bs);
    1206                 :            : 
    1207                 :            :         end:
    1208                 :          0 :         ASN1_TIME_free(thisupd);
    1209                 :          0 :         ASN1_TIME_free(nextupd);
    1210                 :          0 :         OCSP_CERTID_free(ca_id);
    1211                 :          0 :         OCSP_BASICRESP_free(bs);
    1212                 :          0 :         return ret;
    1213                 :            : 
    1214                 :            :         }
    1215                 :            : 
    1216                 :          0 : static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser)
    1217                 :            :         {
    1218                 :            :         int i;
    1219                 :          0 :         BIGNUM *bn = NULL;
    1220                 :            :         char *itmp, *row[DB_NUMBER],**rrow;
    1221         [ #  # ]:          0 :         for (i = 0; i < DB_NUMBER; i++) row[i] = NULL;
    1222                 :          0 :         bn = ASN1_INTEGER_to_BN(ser,NULL);
    1223         [ #  # ]:          0 :         OPENSSL_assert(bn); /* FIXME: should report an error at this point and abort */
    1224         [ #  # ]:          0 :         if (BN_is_zero(bn))
    1225                 :          0 :                 itmp = BUF_strdup("00");
    1226                 :            :         else
    1227                 :          0 :                 itmp = BN_bn2hex(bn);
    1228                 :          0 :         row[DB_serial] = itmp;
    1229                 :          0 :         BN_free(bn);
    1230                 :          0 :         rrow=TXT_DB_get_by_index(db->db,DB_serial,row);
    1231                 :          0 :         OPENSSL_free(itmp);
    1232                 :          0 :         return rrow;
    1233                 :            :         }
    1234                 :            : 
    1235                 :            : /* Quick and dirty OCSP server: read in and parse input request */
    1236                 :            : 
    1237                 :          0 : static BIO *init_responder(const char *port)
    1238                 :            :         {
    1239                 :          0 :         BIO *acbio = NULL, *bufbio = NULL;
    1240                 :          0 :         bufbio = BIO_new(BIO_f_buffer());
    1241         [ #  # ]:          0 :         if (!bufbio) 
    1242                 :            :                 goto err;
    1243                 :            : #ifndef OPENSSL_NO_SOCK
    1244                 :          0 :         acbio = BIO_new_accept(port);
    1245                 :            : #else
    1246                 :            :         BIO_printf(bio_err, "Error setting up accept BIO - sockets not supported.\n");
    1247                 :            : #endif
    1248         [ #  # ]:          0 :         if (!acbio)
    1249                 :            :                 goto err;
    1250                 :          0 :         BIO_set_accept_bios(acbio, bufbio);
    1251                 :          0 :         bufbio = NULL;
    1252                 :            : 
    1253         [ #  # ]:          0 :         if (BIO_do_accept(acbio) <= 0)
    1254                 :            :                 {
    1255                 :          0 :                         BIO_printf(bio_err, "Error setting up accept BIO\n");
    1256                 :          0 :                         ERR_print_errors(bio_err);
    1257                 :          0 :                         goto err;
    1258                 :            :                 }
    1259                 :            : 
    1260                 :            :         return acbio;
    1261                 :            : 
    1262                 :            :         err:
    1263                 :          0 :         BIO_free_all(acbio);
    1264                 :          0 :         BIO_free(bufbio);
    1265                 :          0 :         return NULL;
    1266                 :            :         }
    1267                 :            : 
    1268                 :          0 : static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio,
    1269                 :            :                         const char *port)
    1270                 :            :         {
    1271                 :          0 :         int have_post = 0, len;
    1272                 :          0 :         OCSP_REQUEST *req = NULL;
    1273                 :            :         char inbuf[1024];
    1274                 :          0 :         BIO *cbio = NULL;
    1275                 :            : 
    1276         [ #  # ]:          0 :         if (BIO_do_accept(acbio) <= 0)
    1277                 :            :                 {
    1278                 :          0 :                         BIO_printf(bio_err, "Error accepting connection\n");
    1279                 :          0 :                         ERR_print_errors(bio_err);
    1280                 :            :                         return 0;
    1281                 :            :                 }
    1282                 :            : 
    1283                 :          0 :         cbio = BIO_pop(acbio);
    1284                 :          0 :         *pcbio = cbio;
    1285                 :            : 
    1286                 :            :         for(;;)
    1287                 :            :                 {
    1288                 :          0 :                 len = BIO_gets(cbio, inbuf, sizeof inbuf);
    1289         [ #  # ]:          0 :                 if (len <= 0)
    1290                 :            :                         return 1;
    1291                 :            :                 /* Look for "POST" signalling start of query */
    1292         [ #  # ]:          0 :                 if (!have_post)
    1293                 :            :                         {
    1294         [ #  # ]:          0 :                         if(strncmp(inbuf, "POST", 4))
    1295                 :            :                                 {
    1296                 :          0 :                                 BIO_printf(bio_err, "Invalid request\n");
    1297                 :            :                                 return 1;
    1298                 :            :                                 }
    1299                 :            :                         have_post = 1;
    1300                 :            :                         }
    1301                 :            :                 /* Look for end of headers */
    1302         [ #  # ]:          0 :                 if ((inbuf[0] == '\r') || (inbuf[0] == '\n'))
    1303                 :            :                         break;
    1304                 :            :                 }
    1305                 :            : 
    1306                 :            :         /* Try to read OCSP request */
    1307                 :            : 
    1308                 :          0 :         req = d2i_OCSP_REQUEST_bio(cbio, NULL);
    1309                 :            : 
    1310         [ #  # ]:          0 :         if (!req)
    1311                 :            :                 {
    1312                 :          0 :                 BIO_printf(bio_err, "Error parsing OCSP request\n");
    1313                 :          0 :                 ERR_print_errors(bio_err);
    1314                 :            :                 }
    1315                 :            : 
    1316                 :          0 :         *preq = req;
    1317                 :            : 
    1318                 :            :         return 1;
    1319                 :            : 
    1320                 :            :         }
    1321                 :            : 
    1322                 :          0 : static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp)
    1323                 :            :         {
    1324                 :          0 :         char http_resp[] = 
    1325                 :            :                 "HTTP/1.0 200 OK\r\nContent-type: application/ocsp-response\r\n"
    1326                 :            :                 "Content-Length: %d\r\n\r\n";
    1327         [ #  # ]:          0 :         if (!cbio)
    1328                 :            :                 return 0;
    1329                 :          0 :         BIO_printf(cbio, http_resp, i2d_OCSP_RESPONSE(resp, NULL));
    1330                 :          0 :         i2d_OCSP_RESPONSE_bio(cbio, resp);
    1331                 :          0 :         (void)BIO_flush(cbio);
    1332                 :          0 :         return 1;
    1333                 :            :         }
    1334                 :            : 
    1335                 :          0 : static OCSP_RESPONSE *query_responder(BIO *err, BIO *cbio, const char *path,
    1336                 :            :                                       const STACK_OF(CONF_VALUE) *headers,
    1337                 :            :                                       OCSP_REQUEST *req, int req_timeout)
    1338                 :            :         {
    1339                 :            :         int fd;
    1340                 :            :         int rv;
    1341                 :            :         int i;
    1342                 :          0 :         OCSP_REQ_CTX *ctx = NULL;
    1343                 :          0 :         OCSP_RESPONSE *rsp = NULL;
    1344                 :            :         fd_set confds;
    1345                 :            :         struct timeval tv;
    1346                 :            : 
    1347         [ #  # ]:          0 :         if (req_timeout != -1)
    1348                 :          0 :                 BIO_set_nbio(cbio, 1);
    1349                 :            : 
    1350                 :          0 :         rv = BIO_do_connect(cbio);
    1351                 :            : 
    1352 [ #  # ][ #  # ]:          0 :         if ((rv <= 0) && ((req_timeout == -1) || !BIO_should_retry(cbio)))
                 [ #  # ]
    1353                 :            :                 {
    1354                 :          0 :                 BIO_puts(err, "Error connecting BIO\n");
    1355                 :          0 :                 return NULL;
    1356                 :            :                 }
    1357                 :            : 
    1358         [ #  # ]:          0 :         if (BIO_get_fd(cbio, &fd) <= 0)
    1359                 :            :                 {
    1360                 :          0 :                 BIO_puts(err, "Can't get connection fd\n");
    1361                 :          0 :                 goto err;
    1362                 :            :                 }
    1363                 :            : 
    1364         [ #  # ]:          0 :         if (req_timeout != -1 && rv <= 0)
    1365                 :            :                 {
    1366                 :          0 :                 FD_ZERO(&confds);
    1367 [ #  # ][ #  # ]:          0 :                 openssl_fdset(fd, &confds);
    1368                 :          0 :                 tv.tv_usec = 0;
    1369                 :          0 :                 tv.tv_sec = req_timeout;
    1370                 :          0 :                 rv = select(fd + 1, NULL, (void *)&confds, NULL, &tv);
    1371         [ #  # ]:          0 :                 if (rv == 0)
    1372                 :            :                         {
    1373                 :          0 :                         BIO_puts(err, "Timeout on connect\n");
    1374                 :          0 :                         return NULL;
    1375                 :            :                         }
    1376                 :            :                 }
    1377                 :            : 
    1378                 :            : 
    1379                 :          0 :         ctx = OCSP_sendreq_new(cbio, path, NULL, -1);
    1380         [ #  # ]:          0 :         if (!ctx)
    1381                 :            :                 return NULL;
    1382                 :            : 
    1383         [ #  # ]:          0 :         for (i = 0; i < sk_CONF_VALUE_num(headers); i++)
    1384                 :            :                 {
    1385                 :          0 :                 CONF_VALUE *hdr = sk_CONF_VALUE_value(headers, i);
    1386         [ #  # ]:          0 :                 if (!OCSP_REQ_CTX_add1_header(ctx, hdr->name, hdr->value))
    1387                 :            :                         goto err;
    1388                 :            :                 }
    1389                 :            : 
    1390         [ #  # ]:          0 :         if (!OCSP_REQ_CTX_set1_req(ctx, req))
    1391                 :            :                 goto err;
    1392                 :            :         
    1393                 :            :         for (;;)
    1394                 :            :                 {
    1395                 :          0 :                 rv = OCSP_sendreq_nbio(&rsp, ctx);
    1396         [ #  # ]:          0 :                 if (rv != -1)
    1397                 :            :                         break;
    1398         [ #  # ]:          0 :                 if (req_timeout == -1)
    1399                 :          0 :                         continue;
    1400                 :          0 :                 FD_ZERO(&confds);
    1401 [ #  # ][ #  # ]:          0 :                 openssl_fdset(fd, &confds);
    1402                 :          0 :                 tv.tv_usec = 0;
    1403                 :          0 :                 tv.tv_sec = req_timeout;
    1404         [ #  # ]:          0 :                 if (BIO_should_read(cbio))
    1405                 :          0 :                         rv = select(fd + 1, (void *)&confds, NULL, NULL, &tv);
    1406         [ #  # ]:          0 :                 else if (BIO_should_write(cbio))
    1407                 :          0 :                         rv = select(fd + 1, NULL, (void *)&confds, NULL, &tv);
    1408                 :            :                 else
    1409                 :            :                         {
    1410                 :          0 :                         BIO_puts(err, "Unexpected retry condition\n");
    1411                 :          0 :                         goto err;
    1412                 :            :                         }
    1413         [ #  # ]:          0 :                 if (rv == 0)
    1414                 :            :                         {
    1415                 :          0 :                         BIO_puts(err, "Timeout on request\n");
    1416                 :          0 :                         break;
    1417                 :            :                         }
    1418         [ #  # ]:          0 :                 if (rv == -1)
    1419                 :            :                         {
    1420                 :          0 :                         BIO_puts(err, "Select error\n");
    1421                 :          0 :                         break;
    1422                 :            :                         }
    1423                 :            : 
    1424                 :            :                 }
    1425                 :            :         err:
    1426         [ #  # ]:          0 :         if (ctx)
    1427                 :          0 :                 OCSP_REQ_CTX_free(ctx);
    1428                 :            : 
    1429                 :          0 :         return rsp;
    1430                 :            :         }
    1431                 :            : 
    1432                 :          0 : OCSP_RESPONSE *process_responder(BIO *err, OCSP_REQUEST *req,
    1433                 :            :                                  const char *host, const char *path,
    1434                 :            :                                  const char *port, int use_ssl,
    1435                 :            :                                  const STACK_OF(CONF_VALUE) *headers,
    1436                 :            :                                  int req_timeout)
    1437                 :            :         {
    1438                 :          0 :         BIO *cbio = NULL;
    1439                 :          0 :         SSL_CTX *ctx = NULL;
    1440                 :          0 :         OCSP_RESPONSE *resp = NULL;
    1441                 :          0 :         cbio = BIO_new_connect(host);
    1442         [ #  # ]:          0 :         if (!cbio)
    1443                 :            :                 {
    1444                 :          0 :                 BIO_printf(err, "Error creating connect BIO\n");
    1445                 :          0 :                 goto end;
    1446                 :            :                 }
    1447         [ #  # ]:          0 :         if (port) BIO_set_conn_port(cbio, port);
    1448         [ #  # ]:          0 :         if (use_ssl == 1)
    1449                 :            :                 {
    1450                 :            :                 BIO *sbio;
    1451                 :            : #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
    1452                 :          0 :                 ctx = SSL_CTX_new(SSLv23_client_method());
    1453                 :            : #elif !defined(OPENSSL_NO_SSL3)
    1454                 :            :                 ctx = SSL_CTX_new(SSLv3_client_method());
    1455                 :            : #elif !defined(OPENSSL_NO_SSL2)
    1456                 :            :                 ctx = SSL_CTX_new(SSLv2_client_method());
    1457                 :            : #else
    1458                 :            :                 BIO_printf(err, "SSL is disabled\n");
    1459                 :            :                         goto end;
    1460                 :            : #endif
    1461         [ #  # ]:          0 :                 if (ctx == NULL)
    1462                 :            :                         {
    1463                 :          0 :                         BIO_printf(err, "Error creating SSL context.\n");
    1464                 :          0 :                         goto end;
    1465                 :            :                         }
    1466                 :          0 :                 SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
    1467                 :          0 :                 sbio = BIO_new_ssl(ctx, 1);
    1468                 :          0 :                 cbio = BIO_push(sbio, cbio);
    1469                 :            :                 }
    1470                 :          0 :         resp = query_responder(err, cbio, path, headers, req, req_timeout);
    1471         [ #  # ]:          0 :         if (!resp)
    1472                 :          0 :                 BIO_printf(bio_err, "Error querying OCSP responder\n");
    1473                 :            :         end:
    1474         [ #  # ]:          0 :         if (cbio)
    1475                 :          0 :                 BIO_free_all(cbio);
    1476         [ #  # ]:          0 :         if (ctx)
    1477                 :          0 :                 SSL_CTX_free(ctx);
    1478                 :          0 :         return resp;
    1479                 :            :         }
    1480                 :            : 
    1481                 :            : #endif

Generated by: LCOV version 1.9