Fix the S/MIME code so it now works again and
[openssl.git] / apps / ca.c
index 8184f2efca1c63663758e3480f04f331dbdf679e..1e70de9a6ae1d71455b23d4c00ed5ad32231dc41 100644 (file)
--- a/apps/ca.c
+++ b/apps/ca.c
@@ -180,11 +180,11 @@ extern int EF_ALIGNMENT;
 #endif
 
 static void lookup_fail(char *name,char *tag);
-static unsigned long index_serial_hash(char **a);
-static int index_serial_cmp(char **a, char **b);
-static unsigned long index_name_hash(char **a);
+static unsigned long index_serial_hash(const char **a);
+static int index_serial_cmp(const char **a, const char **b);
+static unsigned long index_name_hash(const char **a);
 static int index_name_qual(char **a);
-static int index_name_cmp(char **a,char **b);
+static int index_name_cmp(const char **a,const char **b);
 static BIGNUM *load_serial(char *serialfile);
 static int save_serial(char *serialfile, BIGNUM *serial);
 static int certify(X509 **xret, char *infile,EVP_PKEY *pkey,X509 *x509,
@@ -215,6 +215,12 @@ static char *section=NULL;
 static int preserve=0;
 static int msie_hack=0;
 
+static IMPLEMENT_LHASH_HASH_FN(index_serial_hash,const char **)
+static IMPLEMENT_LHASH_COMP_FN(index_serial_cmp,const char **)
+static IMPLEMENT_LHASH_HASH_FN(index_name_hash,const char **)
+static IMPLEMENT_LHASH_COMP_FN(index_name_cmp,const char **)
+
+
 int MAIN(int, char **);
 
 int MAIN(int argc, char **argv)
@@ -517,6 +523,8 @@ bad:
        if (conf != NULL)
                {
                p=CONF_get_string(conf,NULL,"oid_file");
+               if (p == NULL)
+                       ERR_clear_error();
                if (p != NULL)
                        {
                        BIO *oid_bio;
@@ -544,6 +552,8 @@ bad:
                }
 
        randfile = CONF_get_string(conf, BASE_SECTION, "RANDFILE");
+       if (randfile == NULL)
+               ERR_clear_error();
        app_RAND_load_file(randfile, bio_err, 0);
        
        in=BIO_new(BIO_s_file());
@@ -629,9 +639,13 @@ bad:
                }
 
        f=CONF_get_string(conf,BASE_SECTION,ENV_PRESERVE);
+       if (f == NULL)
+               ERR_clear_error();
        if ((f != NULL) && ((*f == 'y') || (*f == 'Y')))
                preserve=1;
        f=CONF_get_string(conf,BASE_SECTION,ENV_MSIE_HACK);
+       if (f == NULL)
+               ERR_clear_error();
        if ((f != NULL) && ((*f == 'y') || (*f == 'Y')))
                msie_hack=1;
 
@@ -753,15 +767,17 @@ bad:
                BIO_printf(bio_err,"generating index\n");
                }
        
-       if (!TXT_DB_create_index(db,DB_serial,NULL,index_serial_hash,
-               index_serial_cmp))
+       if (!TXT_DB_create_index(db, DB_serial, NULL,
+                       LHASH_HASH_FN(index_serial_hash),
+                       LHASH_COMP_FN(index_serial_cmp)))
                {
                BIO_printf(bio_err,"error creating serial number index:(%ld,%ld,%ld)\n",db->error,db->arg1,db->arg2);
                goto err;
                }
 
-       if (!TXT_DB_create_index(db,DB_name,index_name_qual,index_name_hash,
-               index_name_cmp))
+       if (!TXT_DB_create_index(db, DB_name, index_name_qual,
+                       LHASH_HASH_FN(index_name_hash),
+                       LHASH_COMP_FN(index_name_cmp)))
                {
                BIO_printf(bio_err,"error creating name index:(%ld,%ld,%ld)\n",
                        db->error,db->arg1,db->arg2);
@@ -823,26 +839,34 @@ bad:
                        lookup_fail(section,ENV_SERIAL);
                        goto err;
                        }
-               if(!extensions)
+               if (!extensions)
+                       {
                        extensions=CONF_get_string(conf,section,ENV_EXTENSIONS);
-               if(extensions) {
+                       if (!extensions)
+                               ERR_clear_error();
+                       }
+               if (extensions)
+                       {
                        /* Check syntax of file */
                        X509V3_CTX ctx;
                        X509V3_set_ctx_test(&ctx);
                        X509V3_set_conf_lhash(&ctx, conf);
-                       if(!X509V3_EXT_add_conf(conf, &ctx, extensions, NULL)) {
+                       if (!X509V3_EXT_add_conf(conf, &ctx, extensions, NULL))
+                               {
                                BIO_printf(bio_err,
                                 "Error Loading extension section %s\n",
                                                                 extensions);
                                ret = 1;
                                goto err;
+                               }
                        }
-               }
 
                if (startdate == NULL)
                        {
                        startdate=CONF_get_string(conf,section,
                                ENV_DEFAULT_STARTDATE);
+                       if (startdate == NULL)
+                               ERR_clear_error();
                        }
                if (startdate && !ASN1_UTCTIME_set_string(NULL,startdate))
                        {
@@ -855,6 +879,8 @@ bad:
                        {
                        enddate=CONF_get_string(conf,section,
                                ENV_DEFAULT_ENDDATE);
+                       if (enddate == NULL)
+                               ERR_clear_error();
                        }
                if (enddate && !ASN1_UTCTIME_set_string(NULL,enddate))
                        {
@@ -1134,20 +1160,27 @@ bad:
        /*****************************************************************/
        if (gencrl)
                {
-               if(!crl_ext) crl_ext=CONF_get_string(conf,section,ENV_CRLEXT);
-               if(crl_ext) {
+               if (!crl_ext)
+                       {
+                       crl_ext=CONF_get_string(conf,section,ENV_CRLEXT);
+                       if (!crl_ext)
+                               ERR_clear_error();
+                       }
+               if (crl_ext)
+                       {
                        /* Check syntax of file */
                        X509V3_CTX ctx;
                        X509V3_set_ctx_test(&ctx);
                        X509V3_set_conf_lhash(&ctx, conf);
-                       if(!X509V3_EXT_add_conf(conf, &ctx, crl_ext, NULL)) {
+                       if(!X509V3_EXT_add_conf(conf, &ctx, crl_ext, NULL))
+                               {
                                BIO_printf(bio_err,
                                 "Error Loading CRL extension section %s\n",
                                                                 crl_ext);
                                ret = 1;
                                goto err;
+                               }
                        }
-               }
                if ((hex=BIO_new(BIO_s_mem())) == NULL) goto err;
 
                if (!crldays && !crlhours)
@@ -1193,7 +1226,7 @@ bad:
                                if (!a2i_ASN1_INTEGER(hex,r->serialNumber,
                                        buf[0],BSIZE)) goto err;
 
-                               sk_X509_REVOKED_push(ci->revoked,r);
+                               X509_CRL_add0_revoked(crl,r);
                                }
                        }
                /* sort the data so it will be written in serial
@@ -1326,31 +1359,31 @@ static void lookup_fail(char *name, char *tag)
        BIO_printf(bio_err,"variable lookup failed for %s::%s\n",name,tag);
        }
 
-static unsigned long index_serial_hash(char **a)
+static unsigned long index_serial_hash(const char **a)
        {
-       char *n;
+       const char *n;
 
        n=a[DB_serial];
        while (*n == '0') n++;
        return(lh_strhash(n));
        }
 
-static int index_serial_cmp(char **a, char **b)
+static int index_serial_cmp(const char **a, const char **b)
        {
-       char *aa,*bb;
+       const char *aa,*bb;
 
        for (aa=a[DB_serial]; *aa == '0'; aa++);
        for (bb=b[DB_serial]; *bb == '0'; bb++);
        return(strcmp(aa,bb));
        }
 
-static unsigned long index_name_hash(char **a)
+static unsigned long index_name_hash(const char **a)
        { return(lh_strhash(a[DB_name])); }
 
 static int index_name_qual(char **a)
        { return(a[0][0] == 'V'); }
 
-static int index_name_cmp(char **a, char **b)
+static int index_name_cmp(const char **a, const char **b)
        { return(strcmp(a[DB_name],
             b[DB_name])); }
 
@@ -2251,7 +2284,7 @@ static int do_revoke(X509 *x509, TXT_DB *db)
                goto err;
 
                }
-       else if (index_name_cmp(row,rrow))
+       else if (index_name_cmp((const char **)row,(const char **)rrow))
                {
                BIO_printf(bio_err,"ERROR:name does not match %s\n",
                           row[DB_name]);