| Index: openssl/apps/ca.c
|
| ===================================================================
|
| --- openssl/apps/ca.c (revision 105093)
|
| +++ openssl/apps/ca.c (working copy)
|
| @@ -63,7 +63,6 @@
|
| #include <string.h>
|
| #include <ctype.h>
|
| #include <sys/types.h>
|
| -#include <sys/stat.h>
|
| #include <openssl/conf.h>
|
| #include <openssl/bio.h>
|
| #include <openssl/err.h>
|
| @@ -83,7 +82,7 @@
|
| # else
|
| # include <unixlib.h>
|
| # endif
|
| -# elif !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_NETWARE) && !defined(__TANDEM)
|
| +# elif !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_NETWARE)
|
| # include <sys/file.h>
|
| # endif
|
| #endif
|
| @@ -258,6 +257,7 @@
|
| int doupdatedb=0;
|
| long crldays=0;
|
| long crlhours=0;
|
| + long crlsec=0;
|
| long errorline= -1;
|
| char *configfile=NULL;
|
| char *md=NULL;
|
| @@ -305,7 +305,8 @@
|
| ASN1_TIME *tmptm;
|
| ASN1_INTEGER *tmpser;
|
| char *f;
|
| - const char *p, **pp;
|
| + const char *p;
|
| + char * const *pp;
|
| int i,j;
|
| const EVP_MD *dgst=NULL;
|
| STACK_OF(CONF_VALUE) *attribs=NULL;
|
| @@ -456,6 +457,11 @@
|
| if (--argc < 1) goto bad;
|
| crlhours= atol(*(++argv));
|
| }
|
| + else if (strcmp(*argv,"-crlsec") == 0)
|
| + {
|
| + if (--argc < 1) goto bad;
|
| + crlsec = atol(*(++argv));
|
| + }
|
| else if (strcmp(*argv,"-infiles") == 0)
|
| {
|
| argc--;
|
| @@ -549,8 +555,10 @@
|
|
|
| if (badops)
|
| {
|
| - for (pp=ca_usage; (*pp != NULL); pp++)
|
| - BIO_printf(bio_err,"%s",*pp);
|
| + const char **pp2;
|
| +
|
| + for (pp2=ca_usage; (*pp2 != NULL); pp2++)
|
| + BIO_printf(bio_err,"%s",*pp2);
|
| goto err;
|
| }
|
|
|
| @@ -825,7 +833,6 @@
|
| /* lookup where to write new certificates */
|
| if ((outdir == NULL) && (req))
|
| {
|
| - struct stat sb;
|
|
|
| if ((outdir=NCONF_get_string(conf,section,ENV_NEW_CERTS_DIR))
|
| == NULL)
|
| @@ -844,28 +851,24 @@
|
| that to access(). However, time's too short to do that just
|
| now.
|
| */
|
| +#ifndef _WIN32
|
| if (access(outdir,R_OK|W_OK|X_OK) != 0)
|
| +#else
|
| + if (_access(outdir,R_OK|W_OK|X_OK) != 0)
|
| +#endif
|
| {
|
| BIO_printf(bio_err,"I am unable to access the %s directory\n",outdir);
|
| perror(outdir);
|
| goto err;
|
| }
|
|
|
| - if (stat(outdir,&sb) != 0)
|
| + if (app_isdir(outdir)<=0)
|
| {
|
| - BIO_printf(bio_err,"unable to stat(%s)\n",outdir);
|
| - perror(outdir);
|
| - goto err;
|
| - }
|
| -#ifdef S_ISDIR
|
| - if (!S_ISDIR(sb.st_mode))
|
| - {
|
| BIO_printf(bio_err,"%s need to be a directory\n",outdir);
|
| perror(outdir);
|
| goto err;
|
| }
|
| #endif
|
| -#endif
|
| }
|
|
|
| /*****************************************************************/
|
| @@ -879,9 +882,9 @@
|
| if (db == NULL) goto err;
|
|
|
| /* Lets check some fields */
|
| - for (i=0; i<sk_num(db->db->data); i++)
|
| + for (i=0; i<sk_OPENSSL_PSTRING_num(db->db->data); i++)
|
| {
|
| - pp=(const char **)sk_value(db->db->data,i);
|
| + pp=sk_OPENSSL_PSTRING_value(db->db->data,i);
|
| if ((pp[DB_type][0] != DB_TYPE_REV) &&
|
| (pp[DB_rev_date][0] != '\0'))
|
| {
|
| @@ -894,7 +897,7 @@
|
| BIO_printf(bio_err," in entry %d\n", i+1);
|
| goto err;
|
| }
|
| - if (!check_time_format(pp[DB_exp_date]))
|
| + if (!check_time_format((char *)pp[DB_exp_date]))
|
| {
|
| BIO_printf(bio_err,"entry %d: invalid expiry date\n",i+1);
|
| goto err;
|
| @@ -934,7 +937,7 @@
|
| #endif
|
| TXT_DB_write(out,db->db);
|
| BIO_printf(bio_err,"%d entries loaded from the database\n",
|
| - db->db->data->num);
|
| + sk_OPENSSL_PSTRING_num(db->db->data));
|
| BIO_printf(bio_err,"generating index\n");
|
| }
|
|
|
| @@ -1025,6 +1028,17 @@
|
| goto err;
|
| }
|
|
|
| + if (!strcmp(md, "default"))
|
| + {
|
| + int def_nid;
|
| + if (EVP_PKEY_get_default_digest_nid(pkey, &def_nid) <= 0)
|
| + {
|
| + BIO_puts(bio_err,"no default digest\n");
|
| + goto err;
|
| + }
|
| + md = (char *)OBJ_nid2sn(def_nid);
|
| + }
|
| +
|
| if ((dgst=EVP_get_digestbyname(md)) == NULL)
|
| {
|
| BIO_printf(bio_err,"%s is an unsupported message digest type\n",md);
|
| @@ -1094,9 +1108,9 @@
|
| if (startdate == NULL)
|
| ERR_clear_error();
|
| }
|
| - if (startdate && !ASN1_UTCTIME_set_string(NULL,startdate))
|
| + if (startdate && !ASN1_TIME_set_string(NULL, startdate))
|
| {
|
| - BIO_printf(bio_err,"start date is invalid, it should be YYMMDDHHMMSSZ\n");
|
| + BIO_printf(bio_err,"start date is invalid, it should be YYMMDDHHMMSSZ or YYYYMMDDHHMMSSZ\n");
|
| goto err;
|
| }
|
| if (startdate == NULL) startdate="today";
|
| @@ -1108,9 +1122,9 @@
|
| if (enddate == NULL)
|
| ERR_clear_error();
|
| }
|
| - if (enddate && !ASN1_UTCTIME_set_string(NULL,enddate))
|
| + if (enddate && !ASN1_TIME_set_string(NULL, enddate))
|
| {
|
| - BIO_printf(bio_err,"end date is invalid, it should be YYMMDDHHMMSSZ\n");
|
| + BIO_printf(bio_err,"end date is invalid, it should be YYMMDDHHMMSSZ or YYYYMMDDHHMMSSZ\n");
|
| goto err;
|
| }
|
|
|
| @@ -1370,7 +1384,7 @@
|
| goto err;
|
| }
|
|
|
| - if (!crldays && !crlhours)
|
| + if (!crldays && !crlhours && !crlsec)
|
| {
|
| if (!NCONF_get_number(conf,section,
|
| ENV_DEFAULT_CRL_DAYS, &crldays))
|
| @@ -1379,7 +1393,7 @@
|
| ENV_DEFAULT_CRL_HOURS, &crlhours))
|
| crlhours = 0;
|
| }
|
| - if ((crldays == 0) && (crlhours == 0))
|
| + if ((crldays == 0) && (crlhours == 0) && (crlsec == 0))
|
| {
|
| BIO_printf(bio_err,"cannot lookup how long until the next CRL is issued\n");
|
| goto err;
|
| @@ -1393,14 +1407,19 @@
|
| if (!tmptm) goto err;
|
| X509_gmtime_adj(tmptm,0);
|
| X509_CRL_set_lastUpdate(crl, tmptm);
|
| - X509_gmtime_adj(tmptm,(crldays*24+crlhours)*60*60);
|
| + if (!X509_time_adj_ex(tmptm, crldays, crlhours*60*60 + crlsec,
|
| + NULL))
|
| + {
|
| + BIO_puts(bio_err, "error setting CRL nextUpdate\n");
|
| + goto err;
|
| + }
|
| X509_CRL_set_nextUpdate(crl, tmptm);
|
|
|
| ASN1_TIME_free(tmptm);
|
|
|
| - for (i=0; i<sk_num(db->db->data); i++)
|
| + for (i=0; i<sk_OPENSSL_PSTRING_num(db->db->data); i++)
|
| {
|
| - pp=(const char **)sk_value(db->db->data,i);
|
| + pp=sk_OPENSSL_PSTRING_value(db->db->data,i);
|
| if (pp[DB_type][0] == DB_TYPE_REV)
|
| {
|
| if ((r=X509_REVOKED_new()) == NULL) goto err;
|
| @@ -1426,15 +1445,6 @@
|
|
|
| /* we now have a CRL */
|
| if (verbose) BIO_printf(bio_err,"signing CRL\n");
|
| -#ifndef OPENSSL_NO_DSA
|
| - if (pkey->type == EVP_PKEY_DSA)
|
| - dgst=EVP_dss1();
|
| - else
|
| -#endif
|
| -#ifndef OPENSSL_NO_ECDSA
|
| - if (pkey->type == EVP_PKEY_EC)
|
| - dgst=EVP_ecdsa();
|
| -#endif
|
|
|
| /* Add any extensions asked for */
|
|
|
| @@ -1467,6 +1477,12 @@
|
| if (crlnumberfile != NULL) /* we have a CRL number that need updating */
|
| if (!save_serial(crlnumberfile,"new",crlnumber,NULL)) goto err;
|
|
|
| + if (crlnumber)
|
| + {
|
| + BN_free(crlnumber);
|
| + crlnumber = NULL;
|
| + }
|
| +
|
| if (!X509_CRL_sign(crl,pkey,dgst)) goto err;
|
|
|
| PEM_write_bio_X509_CRL(Sout,crl);
|
| @@ -1519,6 +1535,7 @@
|
| if (free_key && key)
|
| OPENSSL_free(key);
|
| BN_free(serial);
|
| + BN_free(crlnumber);
|
| free_index(db);
|
| EVP_PKEY_free(pkey);
|
| if (x509) X509_free(x509);
|
| @@ -1677,7 +1694,9 @@
|
| int ok= -1,i,j,last,nid;
|
| const char *p;
|
| CONF_VALUE *cv;
|
| - char *row[DB_NUMBER],**rrow=NULL,**irow=NULL;
|
| + OPENSSL_STRING row[DB_NUMBER];
|
| + OPENSSL_STRING *irow=NULL;
|
| + OPENSSL_STRING *rrow=NULL;
|
| char buf[25];
|
|
|
| tmptm=ASN1_UTCTIME_new();
|
| @@ -1919,7 +1938,9 @@
|
|
|
| if (db->attributes.unique_subject)
|
| {
|
| - rrow=TXT_DB_get_by_index(db->db,DB_name,row);
|
| + OPENSSL_STRING *crow=row;
|
| +
|
| + rrow=TXT_DB_get_by_index(db->db,DB_name,crow);
|
| if (rrow != NULL)
|
| {
|
| BIO_printf(bio_err,
|
| @@ -1995,11 +2016,11 @@
|
|
|
| if (strcmp(startdate,"today") == 0)
|
| X509_gmtime_adj(X509_get_notBefore(ret),0);
|
| - else ASN1_UTCTIME_set_string(X509_get_notBefore(ret),startdate);
|
| + else ASN1_TIME_set_string(X509_get_notBefore(ret),startdate);
|
|
|
| if (enddate == NULL)
|
| - X509_gmtime_adj(X509_get_notAfter(ret),(long)60*60*24*days);
|
| - else ASN1_UTCTIME_set_string(X509_get_notAfter(ret),enddate);
|
| + X509_time_adj_ex(X509_get_notAfter(ret),days, 0, NULL);
|
| + else ASN1_TIME_set_string(X509_get_notAfter(ret),enddate);
|
|
|
| if (!X509_set_subject_name(ret,subject)) goto err;
|
|
|
| @@ -2119,26 +2140,12 @@
|
| }
|
| }
|
|
|
| -
|
| -#ifndef OPENSSL_NO_DSA
|
| - if (pkey->type == EVP_PKEY_DSA) dgst=EVP_dss1();
|
| pktmp=X509_get_pubkey(ret);
|
| if (EVP_PKEY_missing_parameters(pktmp) &&
|
| !EVP_PKEY_missing_parameters(pkey))
|
| EVP_PKEY_copy_parameters(pktmp,pkey);
|
| EVP_PKEY_free(pktmp);
|
| -#endif
|
| -#ifndef OPENSSL_NO_ECDSA
|
| - if (pkey->type == EVP_PKEY_EC)
|
| - dgst = EVP_ecdsa();
|
| - pktmp = X509_get_pubkey(ret);
|
| - if (EVP_PKEY_missing_parameters(pktmp) &&
|
| - !EVP_PKEY_missing_parameters(pkey))
|
| - EVP_PKEY_copy_parameters(pktmp, pkey);
|
| - EVP_PKEY_free(pktmp);
|
| -#endif
|
|
|
| -
|
| if (!X509_sign(ret,pkey,dgst))
|
| goto err;
|
|
|
| @@ -2239,7 +2246,7 @@
|
| unsigned long nameopt, int default_op, int ext_copy)
|
| {
|
| STACK_OF(CONF_VALUE) *sk=NULL;
|
| - LHASH *parms=NULL;
|
| + LHASH_OF(CONF_VALUE) *parms=NULL;
|
| X509_REQ *req=NULL;
|
| CONF_VALUE *cv=NULL;
|
| NETSCAPE_SPKI *spki = NULL;
|
| @@ -2373,15 +2380,7 @@
|
|
|
| static int check_time_format(const char *str)
|
| {
|
| - ASN1_TIME tm;
|
| -
|
| - tm.data=(unsigned char *)str;
|
| - tm.length=strlen(str);
|
| - tm.type=V_ASN1_UTCTIME;
|
| - if (ASN1_TIME_check(&tm))
|
| - return 1;
|
| - tm.type=V_ASN1_GENERALIZEDTIME;
|
| - return ASN1_TIME_check(&tm);
|
| + return ASN1_TIME_set_string(NULL, str);
|
| }
|
|
|
| static int do_revoke(X509 *x509, CA_DB *db, int type, char *value)
|
| @@ -2396,6 +2395,8 @@
|
| row[i]=NULL;
|
| row[DB_name]=X509_NAME_oneline(X509_get_subject_name(x509),NULL,0);
|
| bn = ASN1_INTEGER_to_BN(X509_get_serialNumber(x509),NULL);
|
| + if (!bn)
|
| + goto err;
|
| if (BN_is_zero(bn))
|
| row[DB_serial]=BUF_strdup("00");
|
| else
|
| @@ -2465,7 +2466,7 @@
|
| goto err;
|
|
|
| }
|
| - else if (index_name_cmp((const char **)row,(const char **)rrow))
|
| + else if (index_name_cmp_noconst(row, rrow))
|
| {
|
| BIO_printf(bio_err,"ERROR:name does not match %s\n",
|
| row[DB_name]);
|
| @@ -2614,9 +2615,9 @@
|
| else
|
| a_y2k = 0;
|
|
|
| - for (i = 0; i < sk_num(db->db->data); i++)
|
| + for (i = 0; i < sk_OPENSSL_PSTRING_num(db->db->data); i++)
|
| {
|
| - rrow = (char **) sk_value(db->db->data, i);
|
| + rrow = sk_OPENSSL_PSTRING_value(db->db->data, i);
|
|
|
| if (rrow[DB_type][0] == 'V')
|
| {
|
| @@ -2863,22 +2864,13 @@
|
| p=(char *)str->data;
|
| for (j=str->length; j>0; j--)
|
| {
|
| -#ifdef CHARSET_EBCDIC
|
| - if ((*p >= 0x20) && (*p <= 0x7e))
|
| - BIO_printf(bp,"%c",os_toebcdic[*p]);
|
| -#else
|
| if ((*p >= ' ') && (*p <= '~'))
|
| BIO_printf(bp,"%c",*p);
|
| -#endif
|
| else if (*p & 0x80)
|
| BIO_printf(bp,"\\0x%02X",*p);
|
| else if ((unsigned char)*p == 0xf7)
|
| BIO_printf(bp,"^?");
|
| -#ifdef CHARSET_EBCDIC
|
| - else BIO_printf(bp,"^%c",os_toebcdic[*p+0x40]);
|
| -#else
|
| else BIO_printf(bp,"^%c",*p+'@');
|
| -#endif
|
| p++;
|
| }
|
| BIO_printf(bp,"'\n");
|
|
|