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