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