ocsp.c revision 279264
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		BIO_printf (bio_err, "-timeout n           timeout connection to OCSP responder after n seconds\n");
632		goto end;
633		}
634
635	if(outfile) out = BIO_new_file(outfile, "w");
636	else out = BIO_new_fp(stdout, BIO_NOCLOSE);
637
638	if(!out)
639		{
640		BIO_printf(bio_err, "Error opening output file\n");
641		goto end;
642		}
643
644	if (!req && (add_nonce != 2)) add_nonce = 0;
645
646	if (!req && reqin)
647		{
648		derbio = BIO_new_file(reqin, "rb");
649		if (!derbio)
650			{
651			BIO_printf(bio_err, "Error Opening OCSP request file\n");
652			goto end;
653			}
654		req = d2i_OCSP_REQUEST_bio(derbio, NULL);
655		BIO_free(derbio);
656		if(!req)
657			{
658			BIO_printf(bio_err, "Error reading OCSP request\n");
659			goto end;
660			}
661		}
662
663	if (!req && port)
664		{
665		acbio = init_responder(port);
666		if (!acbio)
667			goto end;
668		}
669
670	if (rsignfile && !rdb)
671		{
672		if (!rkeyfile) rkeyfile = rsignfile;
673		rsigner = load_cert(bio_err, rsignfile, FORMAT_PEM,
674			NULL, e, "responder certificate");
675		if (!rsigner)
676			{
677			BIO_printf(bio_err, "Error loading responder certificate\n");
678			goto end;
679			}
680		rca_cert = load_cert(bio_err, rca_filename, FORMAT_PEM,
681			NULL, e, "CA certificate");
682		if (rcertfile)
683			{
684			rother = load_certs(bio_err, rcertfile, FORMAT_PEM,
685				NULL, e, "responder other certificates");
686			if (!rother) goto end;
687			}
688		rkey = load_key(bio_err, rkeyfile, FORMAT_PEM, 0, NULL, NULL,
689			"responder private key");
690		if (!rkey)
691			goto end;
692		}
693	if(acbio)
694		BIO_printf(bio_err, "Waiting for OCSP client connections...\n");
695
696	redo_accept:
697
698	if (acbio)
699		{
700		if (!do_responder(&req, &cbio, acbio, port))
701			goto end;
702		if (!req)
703			{
704			resp = OCSP_response_create(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, NULL);
705			send_ocsp_response(cbio, resp);
706			goto done_resp;
707			}
708		}
709
710	if (!req && (signfile || reqout || host || add_nonce || ridx_filename))
711		{
712		BIO_printf(bio_err, "Need an OCSP request for this operation!\n");
713		goto end;
714		}
715
716	if (req && add_nonce) OCSP_request_add1_nonce(req, NULL, -1);
717
718	if (signfile)
719		{
720		if (!keyfile) keyfile = signfile;
721		signer = load_cert(bio_err, signfile, FORMAT_PEM,
722			NULL, e, "signer certificate");
723		if (!signer)
724			{
725			BIO_printf(bio_err, "Error loading signer certificate\n");
726			goto end;
727			}
728		if (sign_certfile)
729			{
730			sign_other = load_certs(bio_err, sign_certfile, FORMAT_PEM,
731				NULL, e, "signer certificates");
732			if (!sign_other) goto end;
733			}
734		key = load_key(bio_err, keyfile, FORMAT_PEM, 0, NULL, NULL,
735			"signer private key");
736		if (!key)
737			goto end;
738
739		if (!OCSP_request_sign(req, signer, key, NULL, sign_other, sign_flags))
740			{
741			BIO_printf(bio_err, "Error signing OCSP request\n");
742			goto end;
743			}
744		}
745
746	if (req_text && req) OCSP_REQUEST_print(out, req, 0);
747
748	if (reqout)
749		{
750		derbio = BIO_new_file(reqout, "wb");
751		if(!derbio)
752			{
753			BIO_printf(bio_err, "Error opening file %s\n", reqout);
754			goto end;
755			}
756		i2d_OCSP_REQUEST_bio(derbio, req);
757		BIO_free(derbio);
758		}
759
760	if (ridx_filename && (!rkey || !rsigner || !rca_cert))
761		{
762		BIO_printf(bio_err, "Need a responder certificate, key and CA for this operation!\n");
763		goto end;
764		}
765
766	if (ridx_filename && !rdb)
767		{
768		rdb = load_index(ridx_filename, NULL);
769		if (!rdb) goto end;
770		if (!index_index(rdb)) goto end;
771		}
772
773	if (rdb)
774		{
775		i = make_ocsp_response(&resp, req, rdb, rca_cert, rsigner, rkey, rother, rflags, nmin, ndays);
776		if (cbio)
777			send_ocsp_response(cbio, resp);
778		}
779	else if (host)
780		{
781#ifndef OPENSSL_NO_SOCK
782		resp = process_responder(bio_err, req, host, path,
783					port, use_ssl, headers, req_timeout);
784		if (!resp)
785			goto end;
786#else
787		BIO_printf(bio_err, "Error creating connect BIO - sockets not supported.\n");
788		goto end;
789#endif
790		}
791	else if (respin)
792		{
793		derbio = BIO_new_file(respin, "rb");
794		if (!derbio)
795			{
796			BIO_printf(bio_err, "Error Opening OCSP response file\n");
797			goto end;
798			}
799		resp = d2i_OCSP_RESPONSE_bio(derbio, NULL);
800		BIO_free(derbio);
801		if(!resp)
802			{
803			BIO_printf(bio_err, "Error reading OCSP response\n");
804			goto end;
805			}
806
807		}
808	else
809		{
810		ret = 0;
811		goto end;
812		}
813
814	done_resp:
815
816	if (respout)
817		{
818		derbio = BIO_new_file(respout, "wb");
819		if(!derbio)
820			{
821			BIO_printf(bio_err, "Error opening file %s\n", respout);
822			goto end;
823			}
824		i2d_OCSP_RESPONSE_bio(derbio, resp);
825		BIO_free(derbio);
826		}
827
828	i = OCSP_response_status(resp);
829
830	if (i != OCSP_RESPONSE_STATUS_SUCCESSFUL)
831		{
832		BIO_printf(out, "Responder Error: %s (%d)\n",
833				OCSP_response_status_str(i), i);
834		if (ignore_err)
835			goto redo_accept;
836		ret = 0;
837		goto end;
838		}
839
840	if (resp_text) OCSP_RESPONSE_print(out, resp, 0);
841
842	/* If running as responder don't verify our own response */
843	if (cbio)
844		{
845		if (accept_count > 0)
846			accept_count--;
847		/* Redo if more connections needed */
848		if (accept_count)
849			{
850			BIO_free_all(cbio);
851			cbio = NULL;
852			OCSP_REQUEST_free(req);
853			req = NULL;
854			OCSP_RESPONSE_free(resp);
855			resp = NULL;
856			goto redo_accept;
857			}
858		goto end;
859		}
860
861	if (!store)
862		store = setup_verify(bio_err, CAfile, CApath);
863	if (!store)
864		goto end;
865	if (verify_certfile)
866		{
867		verify_other = load_certs(bio_err, verify_certfile, FORMAT_PEM,
868			NULL, e, "validator certificate");
869		if (!verify_other) goto end;
870		}
871
872	bs = OCSP_response_get1_basic(resp);
873
874	if (!bs)
875		{
876		BIO_printf(bio_err, "Error parsing response\n");
877		goto end;
878		}
879
880	if (!noverify)
881		{
882		if (req && ((i = OCSP_check_nonce(req, bs)) <= 0))
883			{
884			if (i == -1)
885				BIO_printf(bio_err, "WARNING: no nonce in response\n");
886			else
887				{
888				BIO_printf(bio_err, "Nonce Verify error\n");
889				goto end;
890				}
891			}
892
893		i = OCSP_basic_verify(bs, verify_other, store, verify_flags);
894                if (i < 0) i = OCSP_basic_verify(bs, NULL, store, 0);
895
896		if(i <= 0)
897			{
898			BIO_printf(bio_err, "Response Verify Failure\n");
899			ERR_print_errors(bio_err);
900			}
901		else
902			BIO_printf(bio_err, "Response verify OK\n");
903
904		}
905
906	if (!print_ocsp_summary(out, bs, req, reqnames, ids, nsec, maxage))
907		goto end;
908
909	ret = 0;
910
911end:
912	ERR_print_errors(bio_err);
913	X509_free(signer);
914	X509_STORE_free(store);
915	EVP_PKEY_free(key);
916	EVP_PKEY_free(rkey);
917	X509_free(issuer);
918	X509_free(cert);
919	X509_free(rsigner);
920	X509_free(rca_cert);
921	free_index(rdb);
922	BIO_free_all(cbio);
923	BIO_free_all(acbio);
924	BIO_free(out);
925	OCSP_REQUEST_free(req);
926	OCSP_RESPONSE_free(resp);
927	OCSP_BASICRESP_free(bs);
928	sk_OPENSSL_STRING_free(reqnames);
929	sk_OCSP_CERTID_free(ids);
930	sk_X509_pop_free(sign_other, X509_free);
931	sk_X509_pop_free(verify_other, X509_free);
932	sk_CONF_VALUE_pop_free(headers, X509V3_conf_free);
933
934	if (thost)
935		OPENSSL_free(thost);
936	if (tport)
937		OPENSSL_free(tport);
938	if (tpath)
939		OPENSSL_free(tpath);
940
941	OPENSSL_EXIT(ret);
942}
943
944static int add_ocsp_cert(OCSP_REQUEST **req, X509 *cert, const EVP_MD *cert_id_md,X509 *issuer,
945				STACK_OF(OCSP_CERTID) *ids)
946	{
947	OCSP_CERTID *id;
948	if(!issuer)
949		{
950		BIO_printf(bio_err, "No issuer certificate specified\n");
951		return 0;
952		}
953	if(!*req) *req = OCSP_REQUEST_new();
954	if(!*req) goto err;
955	id = OCSP_cert_to_id(cert_id_md, cert, issuer);
956	if(!id || !sk_OCSP_CERTID_push(ids, id)) goto err;
957	if(!OCSP_request_add0_id(*req, id)) goto err;
958	return 1;
959
960	err:
961	BIO_printf(bio_err, "Error Creating OCSP request\n");
962	return 0;
963	}
964
965static int add_ocsp_serial(OCSP_REQUEST **req, char *serial,const EVP_MD *cert_id_md, X509 *issuer,
966				STACK_OF(OCSP_CERTID) *ids)
967	{
968	OCSP_CERTID *id;
969	X509_NAME *iname;
970	ASN1_BIT_STRING *ikey;
971	ASN1_INTEGER *sno;
972	if(!issuer)
973		{
974		BIO_printf(bio_err, "No issuer certificate specified\n");
975		return 0;
976		}
977	if(!*req) *req = OCSP_REQUEST_new();
978	if(!*req) goto err;
979	iname = X509_get_subject_name(issuer);
980	ikey = X509_get0_pubkey_bitstr(issuer);
981	sno = s2i_ASN1_INTEGER(NULL, serial);
982	if(!sno)
983		{
984		BIO_printf(bio_err, "Error converting serial number %s\n", serial);
985		return 0;
986		}
987	id = OCSP_cert_id_new(cert_id_md, iname, ikey, sno);
988	ASN1_INTEGER_free(sno);
989	if(!id || !sk_OCSP_CERTID_push(ids, id)) goto err;
990	if(!OCSP_request_add0_id(*req, id)) goto err;
991	return 1;
992
993	err:
994	BIO_printf(bio_err, "Error Creating OCSP request\n");
995	return 0;
996	}
997
998static int print_ocsp_summary(BIO *out, OCSP_BASICRESP *bs, OCSP_REQUEST *req,
999			      STACK_OF(OPENSSL_STRING) *names,
1000			      STACK_OF(OCSP_CERTID) *ids, long nsec,
1001			      long maxage)
1002	{
1003	OCSP_CERTID *id;
1004	char *name;
1005	int i;
1006
1007	int status, reason;
1008
1009	ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
1010
1011	if (!bs || !req || !sk_OPENSSL_STRING_num(names) || !sk_OCSP_CERTID_num(ids))
1012		return 1;
1013
1014	for (i = 0; i < sk_OCSP_CERTID_num(ids); i++)
1015		{
1016		id = sk_OCSP_CERTID_value(ids, i);
1017		name = sk_OPENSSL_STRING_value(names, i);
1018		BIO_printf(out, "%s: ", name);
1019
1020		if(!OCSP_resp_find_status(bs, id, &status, &reason,
1021					&rev, &thisupd, &nextupd))
1022			{
1023			BIO_puts(out, "ERROR: No Status found.\n");
1024			continue;
1025			}
1026
1027		/* Check validity: if invalid write to output BIO so we
1028		 * know which response this refers to.
1029		 */
1030		if (!OCSP_check_validity(thisupd, nextupd, nsec, maxage))
1031			{
1032			BIO_puts(out, "WARNING: Status times invalid.\n");
1033			ERR_print_errors(out);
1034			}
1035		BIO_printf(out, "%s\n", OCSP_cert_status_str(status));
1036
1037		BIO_puts(out, "\tThis Update: ");
1038		ASN1_GENERALIZEDTIME_print(out, thisupd);
1039		BIO_puts(out, "\n");
1040
1041		if(nextupd)
1042			{
1043			BIO_puts(out, "\tNext Update: ");
1044			ASN1_GENERALIZEDTIME_print(out, nextupd);
1045			BIO_puts(out, "\n");
1046			}
1047
1048		if (status != V_OCSP_CERTSTATUS_REVOKED)
1049			continue;
1050
1051		if (reason != -1)
1052			BIO_printf(out, "\tReason: %s\n",
1053				OCSP_crl_reason_str(reason));
1054
1055		BIO_puts(out, "\tRevocation Time: ");
1056		ASN1_GENERALIZEDTIME_print(out, rev);
1057		BIO_puts(out, "\n");
1058		}
1059
1060	return 1;
1061	}
1062
1063
1064static int make_ocsp_response(OCSP_RESPONSE **resp, OCSP_REQUEST *req, CA_DB *db,
1065			X509 *ca, X509 *rcert, EVP_PKEY *rkey,
1066			STACK_OF(X509) *rother, unsigned long flags,
1067			int nmin, int ndays)
1068	{
1069	ASN1_TIME *thisupd = NULL, *nextupd = NULL;
1070	OCSP_CERTID *cid, *ca_id = NULL;
1071	OCSP_BASICRESP *bs = NULL;
1072	int i, id_count, ret = 1;
1073
1074	id_count = OCSP_request_onereq_count(req);
1075
1076	if (id_count <= 0)
1077		{
1078		*resp = OCSP_response_create(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST, NULL);
1079		goto end;
1080		}
1081
1082
1083	bs = OCSP_BASICRESP_new();
1084	thisupd = X509_gmtime_adj(NULL, 0);
1085	if (ndays != -1)
1086		nextupd = X509_gmtime_adj(NULL, nmin * 60 + ndays * 3600 * 24 );
1087
1088	/* Examine each certificate id in the request */
1089	for (i = 0; i < id_count; i++)
1090		{
1091		OCSP_ONEREQ *one;
1092		ASN1_INTEGER *serial;
1093		char **inf;
1094		ASN1_OBJECT *cert_id_md_oid;
1095		const EVP_MD *cert_id_md;
1096		one = OCSP_request_onereq_get0(req, i);
1097		cid = OCSP_onereq_get0_id(one);
1098
1099		OCSP_id_get0_info(NULL,&cert_id_md_oid, NULL,NULL, cid);
1100
1101		cert_id_md = EVP_get_digestbyobj(cert_id_md_oid);
1102		if (! cert_id_md)
1103			{
1104			*resp = OCSP_response_create(OCSP_RESPONSE_STATUS_INTERNALERROR,
1105				NULL);
1106				goto end;
1107			}
1108		if (ca_id) OCSP_CERTID_free(ca_id);
1109		ca_id = OCSP_cert_to_id(cert_id_md, NULL, ca);
1110
1111		/* Is this request about our CA? */
1112		if (OCSP_id_issuer_cmp(ca_id, cid))
1113			{
1114			OCSP_basic_add1_status(bs, cid,
1115						V_OCSP_CERTSTATUS_UNKNOWN,
1116						0, NULL,
1117						thisupd, nextupd);
1118			continue;
1119			}
1120		OCSP_id_get0_info(NULL, NULL, NULL, &serial, cid);
1121		inf = lookup_serial(db, serial);
1122		if (!inf)
1123			OCSP_basic_add1_status(bs, cid,
1124						V_OCSP_CERTSTATUS_UNKNOWN,
1125						0, NULL,
1126						thisupd, nextupd);
1127		else if (inf[DB_type][0] == DB_TYPE_VAL)
1128			OCSP_basic_add1_status(bs, cid,
1129						V_OCSP_CERTSTATUS_GOOD,
1130						0, NULL,
1131						thisupd, nextupd);
1132		else if (inf[DB_type][0] == DB_TYPE_REV)
1133			{
1134			ASN1_OBJECT *inst = NULL;
1135			ASN1_TIME *revtm = NULL;
1136			ASN1_GENERALIZEDTIME *invtm = NULL;
1137			OCSP_SINGLERESP *single;
1138			int reason = -1;
1139			unpack_revinfo(&revtm, &reason, &inst, &invtm, inf[DB_rev_date]);
1140			single = OCSP_basic_add1_status(bs, cid,
1141						V_OCSP_CERTSTATUS_REVOKED,
1142						reason, revtm,
1143						thisupd, nextupd);
1144			if (invtm)
1145				OCSP_SINGLERESP_add1_ext_i2d(single, NID_invalidity_date, invtm, 0, 0);
1146			else if (inst)
1147				OCSP_SINGLERESP_add1_ext_i2d(single, NID_hold_instruction_code, inst, 0, 0);
1148			ASN1_OBJECT_free(inst);
1149			ASN1_TIME_free(revtm);
1150			ASN1_GENERALIZEDTIME_free(invtm);
1151			}
1152		}
1153
1154	OCSP_copy_nonce(bs, req);
1155
1156	OCSP_basic_sign(bs, rcert, rkey, NULL, rother, flags);
1157
1158	*resp = OCSP_response_create(OCSP_RESPONSE_STATUS_SUCCESSFUL, bs);
1159
1160	end:
1161	ASN1_TIME_free(thisupd);
1162	ASN1_TIME_free(nextupd);
1163	OCSP_CERTID_free(ca_id);
1164	OCSP_BASICRESP_free(bs);
1165	return ret;
1166
1167	}
1168
1169static char **lookup_serial(CA_DB *db, ASN1_INTEGER *ser)
1170	{
1171	int i;
1172	BIGNUM *bn = NULL;
1173	char *itmp, *row[DB_NUMBER],**rrow;
1174	for (i = 0; i < DB_NUMBER; i++) row[i] = NULL;
1175	bn = ASN1_INTEGER_to_BN(ser,NULL);
1176	OPENSSL_assert(bn); /* FIXME: should report an error at this point and abort */
1177	if (BN_is_zero(bn))
1178		itmp = BUF_strdup("00");
1179	else
1180		itmp = BN_bn2hex(bn);
1181	row[DB_serial] = itmp;
1182	BN_free(bn);
1183	rrow=TXT_DB_get_by_index(db->db,DB_serial,row);
1184	OPENSSL_free(itmp);
1185	return rrow;
1186	}
1187
1188/* Quick and dirty OCSP server: read in and parse input request */
1189
1190static BIO *init_responder(char *port)
1191	{
1192	BIO *acbio = NULL, *bufbio = NULL;
1193	bufbio = BIO_new(BIO_f_buffer());
1194	if (!bufbio)
1195		goto err;
1196#ifndef OPENSSL_NO_SOCK
1197	acbio = BIO_new_accept(port);
1198#else
1199	BIO_printf(bio_err, "Error setting up accept BIO - sockets not supported.\n");
1200#endif
1201	if (!acbio)
1202		goto err;
1203	BIO_set_accept_bios(acbio, bufbio);
1204	bufbio = NULL;
1205
1206	if (BIO_do_accept(acbio) <= 0)
1207		{
1208			BIO_printf(bio_err, "Error setting up accept BIO\n");
1209			ERR_print_errors(bio_err);
1210			goto err;
1211		}
1212
1213	return acbio;
1214
1215	err:
1216	BIO_free_all(acbio);
1217	BIO_free(bufbio);
1218	return NULL;
1219	}
1220
1221static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, char *port)
1222	{
1223	int have_post = 0, len;
1224	OCSP_REQUEST *req = NULL;
1225	char inbuf[1024];
1226	BIO *cbio = NULL;
1227
1228	if (BIO_do_accept(acbio) <= 0)
1229		{
1230			BIO_printf(bio_err, "Error accepting connection\n");
1231			ERR_print_errors(bio_err);
1232			return 0;
1233		}
1234
1235	cbio = BIO_pop(acbio);
1236	*pcbio = cbio;
1237
1238	for(;;)
1239		{
1240		len = BIO_gets(cbio, inbuf, sizeof inbuf);
1241		if (len <= 0)
1242			return 1;
1243		/* Look for "POST" signalling start of query */
1244		if (!have_post)
1245			{
1246			if(strncmp(inbuf, "POST", 4))
1247				{
1248				BIO_printf(bio_err, "Invalid request\n");
1249				return 1;
1250				}
1251			have_post = 1;
1252			}
1253		/* Look for end of headers */
1254		if ((inbuf[0] == '\r') || (inbuf[0] == '\n'))
1255			break;
1256		}
1257
1258	/* Try to read OCSP request */
1259
1260	req = d2i_OCSP_REQUEST_bio(cbio, NULL);
1261
1262	if (!req)
1263		{
1264		BIO_printf(bio_err, "Error parsing OCSP request\n");
1265		ERR_print_errors(bio_err);
1266		}
1267
1268	*preq = req;
1269
1270	return 1;
1271
1272	}
1273
1274static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp)
1275	{
1276	char http_resp[] =
1277		"HTTP/1.0 200 OK\r\nContent-type: application/ocsp-response\r\n"
1278		"Content-Length: %d\r\n\r\n";
1279	if (!cbio)
1280		return 0;
1281	BIO_printf(cbio, http_resp, i2d_OCSP_RESPONSE(resp, NULL));
1282	i2d_OCSP_RESPONSE_bio(cbio, resp);
1283	(void)BIO_flush(cbio);
1284	return 1;
1285	}
1286
1287static OCSP_RESPONSE *query_responder(BIO *err, BIO *cbio, char *path,
1288				STACK_OF(CONF_VALUE) *headers,
1289				OCSP_REQUEST *req, int req_timeout)
1290	{
1291	int fd;
1292	int rv;
1293	int i;
1294	OCSP_REQ_CTX *ctx = NULL;
1295	OCSP_RESPONSE *rsp = NULL;
1296	fd_set confds;
1297	struct timeval tv;
1298
1299	if (req_timeout != -1)
1300		BIO_set_nbio(cbio, 1);
1301
1302	rv = BIO_do_connect(cbio);
1303
1304	if ((rv <= 0) && ((req_timeout == -1) || !BIO_should_retry(cbio)))
1305		{
1306		BIO_puts(err, "Error connecting BIO\n");
1307		return NULL;
1308		}
1309
1310	if (BIO_get_fd(cbio, &fd) <= 0)
1311		{
1312		BIO_puts(err, "Can't get connection fd\n");
1313		goto err;
1314		}
1315
1316	if (req_timeout != -1 && rv <= 0)
1317		{
1318		FD_ZERO(&confds);
1319		openssl_fdset(fd, &confds);
1320		tv.tv_usec = 0;
1321		tv.tv_sec = req_timeout;
1322		rv = select(fd + 1, NULL, (void *)&confds, NULL, &tv);
1323		if (rv == 0)
1324			{
1325			BIO_puts(err, "Timeout on connect\n");
1326			return NULL;
1327			}
1328		}
1329
1330
1331	ctx = OCSP_sendreq_new(cbio, path, NULL, -1);
1332	if (!ctx)
1333		return NULL;
1334
1335	for (i = 0; i < sk_CONF_VALUE_num(headers); i++)
1336		{
1337		CONF_VALUE *hdr = sk_CONF_VALUE_value(headers, i);
1338		if (!OCSP_REQ_CTX_add1_header(ctx, hdr->name, hdr->value))
1339			goto err;
1340		}
1341
1342	if (!OCSP_REQ_CTX_set1_req(ctx, req))
1343		goto err;
1344
1345	for (;;)
1346		{
1347		rv = OCSP_sendreq_nbio(&rsp, ctx);
1348		if (rv != -1)
1349			break;
1350		if (req_timeout == -1)
1351			continue;
1352		FD_ZERO(&confds);
1353		openssl_fdset(fd, &confds);
1354		tv.tv_usec = 0;
1355		tv.tv_sec = req_timeout;
1356		if (BIO_should_read(cbio))
1357			rv = select(fd + 1, (void *)&confds, NULL, NULL, &tv);
1358		else if (BIO_should_write(cbio))
1359			rv = select(fd + 1, NULL, (void *)&confds, NULL, &tv);
1360		else
1361			{
1362			BIO_puts(err, "Unexpected retry condition\n");
1363			goto err;
1364			}
1365		if (rv == 0)
1366			{
1367			BIO_puts(err, "Timeout on request\n");
1368			break;
1369			}
1370		if (rv == -1)
1371			{
1372			BIO_puts(err, "Select error\n");
1373			break;
1374			}
1375
1376		}
1377	err:
1378	if (ctx)
1379		OCSP_REQ_CTX_free(ctx);
1380
1381	return rsp;
1382	}
1383
1384OCSP_RESPONSE *process_responder(BIO *err, OCSP_REQUEST *req,
1385			char *host, char *path, char *port, int use_ssl,
1386			STACK_OF(CONF_VALUE) *headers,
1387			int req_timeout)
1388	{
1389	BIO *cbio = NULL;
1390	SSL_CTX *ctx = NULL;
1391	OCSP_RESPONSE *resp = NULL;
1392	cbio = BIO_new_connect(host);
1393	if (!cbio)
1394		{
1395		BIO_printf(err, "Error creating connect BIO\n");
1396		goto end;
1397		}
1398	if (port) BIO_set_conn_port(cbio, port);
1399	if (use_ssl == 1)
1400		{
1401		BIO *sbio;
1402		ctx = SSL_CTX_new(SSLv23_client_method());
1403		if (ctx == NULL)
1404			{
1405			BIO_printf(err, "Error creating SSL context.\n");
1406			goto end;
1407			}
1408		SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
1409		sbio = BIO_new_ssl(ctx, 1);
1410		cbio = BIO_push(sbio, cbio);
1411		}
1412	resp = query_responder(err, cbio, path, headers, req, req_timeout);
1413	if (!resp)
1414		BIO_printf(bio_err, "Error querying OCSP responder\n");
1415	end:
1416	if (cbio)
1417		BIO_free_all(cbio);
1418	if (ctx)
1419		SSL_CTX_free(ctx);
1420	return resp;
1421	}
1422
1423#endif
1424