Handle krb5 libraries separately and make sure only libssl.so depends
[openssl.git] / apps / ocsp.c
index cc20bfe529b41b7972bd2efa4f8b133d6b1d7aa3..f05ec0e65540dffa0c32cc4f83189ee7e0e32a40 100644 (file)
  * Hudson (tjh@cryptsoft.com).
  *
  */
+#ifndef OPENSSL_NO_OCSP
 
 #include <stdio.h>
 #include <string.h>
+#include "apps.h"
 #include <openssl/pem.h>
 #include <openssl/ocsp.h>
 #include <openssl/err.h>
 #include <openssl/ssl.h>
-#include "apps.h"
 
 /* Maximum leeway in validity period: default 5 minutes */
 #define MAX_VALIDITY_PERIOD    (5 * 60)
@@ -145,6 +146,9 @@ int MAIN(int argc, char **argv)
        int nmin = 0, ndays = -1;
 
        if (bio_err == NULL) bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
+
+       if (!load_config(bio_err, NULL))
+               goto end;
        SSL_load_error_strings();
        args = argv + 1;
        reqnames = sk_new_null();
@@ -547,10 +551,11 @@ int MAIN(int argc, char **argv)
                BIO_printf (bio_err, "-no_cert_verify    don't check signing certificate\n");
                BIO_printf (bio_err, "-no_chain          don't chain verify response\n");
                BIO_printf (bio_err, "-no_cert_checks    don't do additional checks on signing certificate\n");
+               BIO_printf (bio_err, "-port num          port to run responder on\n");
                BIO_printf (bio_err, "-index file        certificate status index file\n");
                BIO_printf (bio_err, "-CA file           CA certificate\n");
-               BIO_printf (bio_err, "-rsigner file      responder certificate to sign requests with\n");
-               BIO_printf (bio_err, "-rkey file         responder key to sign requests with\n");
+               BIO_printf (bio_err, "-rsigner file      responder certificate to sign responses with\n");
+               BIO_printf (bio_err, "-rkey file         responder key to sign responses with\n");
                BIO_printf (bio_err, "-rother file       other certificates to include in response\n");
                BIO_printf (bio_err, "-resp_no_certs     don't include any certificates in response\n");
                BIO_printf (bio_err, "-nmin n            number of minutes before next update\n");
@@ -595,6 +600,32 @@ int MAIN(int argc, char **argv)
                        goto end;
                }
 
+       if (rsignfile && !rdb)
+               {
+               if (!rkeyfile) rkeyfile = rsignfile;
+               rsigner = load_cert(bio_err, rsignfile, FORMAT_PEM,
+                       NULL, e, "responder certificate");
+               if (!rsigner)
+                       {
+                       BIO_printf(bio_err, "Error loading responder certificate\n");
+                       goto end;
+                       }
+               rca_cert = load_cert(bio_err, rca_filename, FORMAT_PEM,
+                       NULL, e, "CA certificate");
+               if (rcertfile)
+                       {
+                       rother = load_certs(bio_err, rcertfile, FORMAT_PEM,
+                               NULL, e, "responder other certificates");
+                       if (!rother) goto end;
+                       }
+               rkey = load_key(bio_err, rkeyfile, FORMAT_PEM, 0, NULL, NULL,
+                       "responder private key");
+               if (!rkey)
+                       goto end;
+               }
+       if(acbio)
+               BIO_printf(bio_err, "Waiting for OCSP client connections...\n");
+
        redo_accept:
 
        if (acbio)
@@ -633,7 +664,7 @@ int MAIN(int argc, char **argv)
                                NULL, e, "signer certificates");
                        if (!sign_other) goto end;
                        }
-               key = load_key(bio_err, keyfile, FORMAT_PEM, NULL, NULL,
+               key = load_key(bio_err, keyfile, FORMAT_PEM, 0, NULL, NULL,
                        "signer private key");
                if (!key)
                        goto end;
@@ -646,28 +677,16 @@ int MAIN(int argc, char **argv)
 
        if (req_text && req) OCSP_REQUEST_print(out, req, 0);
 
-       if (rsignfile && !rdb)
+       if (reqout)
                {
-               if (!rkeyfile) rkeyfile = rsignfile;
-               rsigner = load_cert(bio_err, rsignfile, FORMAT_PEM,
-                       NULL, e, "responder certificate");
-               if (!rsigner)
+               derbio = BIO_new_file(reqout, "wb");
+               if(!derbio)
                        {
-                       BIO_printf(bio_err, "Error loading responder certificate\n");
+                       BIO_printf(bio_err, "Error opening file %s\n", reqout);
                        goto end;
                        }
-               rca_cert = load_cert(bio_err, rca_filename, FORMAT_PEM,
-                       NULL, e, "CA certificate");
-               if (rcertfile)
-                       {
-                       rother = load_certs(bio_err, sign_certfile, FORMAT_PEM,
-                               NULL, e, "responder other certificates");
-                       if (!sign_other) goto end;
-                       }
-               rkey = load_key(bio_err, rkeyfile, FORMAT_PEM, NULL, NULL,
-                       "responder private key");
-               if (!rkey)
-                       goto end;
+               i2d_OCSP_REQUEST_bio(derbio, req);
+               BIO_free(derbio);
                }
 
        if (ridx_filename && (!rkey || !rsigner || !rca_cert))
@@ -704,7 +723,12 @@ int MAIN(int argc, char **argv)
                }
        else if (host)
                {
+#ifndef OPENSSL_NO_SOCK
                cbio = BIO_new_connect(host);
+#else
+               BIO_printf(bio_err, "Error creating connect BIO - sockets not supported.\n");
+               goto end;
+#endif
                if (!cbio)
                        {
                        BIO_printf(bio_err, "Error creating connect BIO\n");
@@ -714,7 +738,16 @@ int MAIN(int argc, char **argv)
                if (use_ssl == 1)
                        {
                        BIO *sbio;
+#if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
                        ctx = SSL_CTX_new(SSLv23_client_method());
+#elif !defined(OPENSSL_NO_SSL3)
+                       ctx = SSL_CTX_new(SSLv3_client_method());
+#elif !defined(OPENSSL_NO_SSL2)
+                       ctx = SSL_CTX_new(SSLv2_client_method());
+#else
+                       BIO_printf(bio_err, "SSL is disabled\n");
+                       goto end;
+#endif
                        SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
                        sbio = BIO_new_ssl(ctx, 1);
                        cbio = BIO_push(sbio, cbio);
@@ -803,6 +836,8 @@ int MAIN(int argc, char **argv)
 
        if (!store)
                store = setup_verify(bio_err, CAfile, CApath);
+       if (!store)
+               goto end;
        if (verify_certfile)
                {
                verify_other = load_certs(bio_err, verify_certfile, FORMAT_PEM,
@@ -879,7 +914,7 @@ end:
                SSL_CTX_free(ctx);
                }
 
-       EXIT(ret);
+       OPENSSL_EXIT(ret);
 }
 
 static int add_ocsp_cert(OCSP_REQUEST **req, X509 *cert, X509 *issuer,
@@ -1100,7 +1135,10 @@ static char **lookup_serial(TXT_DB *db, ASN1_INTEGER *ser)
        char *itmp, *row[DB_NUMBER],**rrow;
        for (i = 0; i < DB_NUMBER; i++) row[i] = NULL;
        bn = ASN1_INTEGER_to_BN(ser,NULL);
-       itmp = BN_bn2hex(bn);
+       if (BN_is_zero(bn))
+               itmp = BUF_strdup("00");
+       else
+               itmp = BN_bn2hex(bn);
        row[DB_serial] = itmp;
        BN_free(bn);
        rrow=TXT_DB_get_by_index(db,DB_serial,row);
@@ -1116,7 +1154,11 @@ static BIO *init_responder(char *port)
        bufbio = BIO_new(BIO_f_buffer());
        if (!bufbio) 
                goto err;
+#ifndef OPENSSL_NO_SOCK
        acbio = BIO_new_accept(port);
+#else
+       BIO_printf(bio_err, "Error setting up accept BIO - sockets not supported.\n");
+#endif
        if (!acbio)
                goto err;
        BIO_set_accept_bios(acbio, bufbio);
@@ -1128,7 +1170,6 @@ static BIO *init_responder(char *port)
                        ERR_print_errors(bio_err);
                        goto err;
                }
-       BIO_printf(bio_err, "Waiting for OCSP client connections...\n");
 
        return acbio;
 
@@ -1157,7 +1198,7 @@ static int do_responder(OCSP_REQUEST **preq, BIO **pcbio, BIO *acbio, char *port
 
        for(;;)
                {
-               len = BIO_gets(cbio, inbuf, 1024);
+               len = BIO_gets(cbio, inbuf, sizeof inbuf);
                if (len <= 0)
                        return 1;
                /* Look for "POST" signalling start of query */
@@ -1204,3 +1245,4 @@ static int send_ocsp_response(BIO *cbio, OCSP_RESPONSE *resp)
        return 1;
        }
 
+#endif