/* apps/ca.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
#include "txt_db.h"
#include "evp.h"
#include "x509.h"
+#include "x509v3.h"
#include "objects.h"
#include "pem.h"
#include "conf.h"
#define PROG ca_main
#define BASE_SECTION "ca"
-#define CONFIG_FILE "lib/ssleay.cnf"
+#define CONFIG_FILE "lib/openssl.cnf"
#define ENV_DEFAULT_CA "default_ca"
#define ENV_PRIVATE_KEY "private_key"
#define ENV_RANDFILE "RANDFILE"
#define ENV_DEFAULT_DAYS "default_days"
+#define ENV_DEFAULT_STARTDATE "default_startdate"
#define ENV_DEFAULT_CRL_DAYS "default_crl_days"
#define ENV_DEFAULT_CRL_HOURS "default_crl_hours"
#define ENV_DEFAULT_MD "default_md"
" -policy arg - The CA 'policy' to support\n",
" -keyfile arg - PEM private key file\n",
" -key arg - key to decode the private key if it is encrypted\n",
-" -cert - The CA certificate\n",
+" -cert file - The CA certificate\n",
" -in file - The input PEM encoded certificate request(s)\n",
" -out file - Where to put the output file(s)\n",
" -outdir dir - Where to put output certificates\n",
" -infiles .... - The last argument, requests to process\n",
" -spkac file - File contains DN and signed public key and challenge\n",
+" -ss_cert file - File contains a self signed cert to sign\n",
" -preserveDN - Don't re-order the DN\n",
" -batch - Don't ask questions\n",
-" -msie_hack - msie modifications to handle all thos universal strings\n",
+" -msie_hack - msie modifications to handle all those universal strings\n",
NULL
};
#endif
#ifndef NOPROTO
-static STACK *load_extensions(char *section);
+static int add_oid_section(LHASH *conf);
static void lookup_fail(char *name,char *tag);
static int MS_CALLBACK key_callback(char *buf,int len,int verify);
static unsigned long index_serial_hash(char **a);
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,
- EVP_MD *dgst,STACK *policy,TXT_DB *db,BIGNUM *serial,int days,
- int batch, STACK *extensions,int verbose);
+ EVP_MD *dgst,STACK *policy,TXT_DB *db,BIGNUM *serial,char *startdate,
+ int days, int batch, char *ext_sect, LHASH *conf,int verbose);
+static int certify_cert(X509 **xret, char *infile,EVP_PKEY *pkey,X509 *x509,
+ EVP_MD *dgst,STACK *policy,TXT_DB *db,BIGNUM *serial,char *startdate,
+ int days,int batch,char *ext_sect, LHASH *conf,int verbose);
static int certify_spkac(X509 **xret, char *infile,EVP_PKEY *pkey,X509 *x509,
- EVP_MD *dgst,STACK *policy,TXT_DB *db,BIGNUM *serial,int days,
- STACK *extensions,int verbose);
+ EVP_MD *dgst,STACK *policy,TXT_DB *db,BIGNUM *serial,char *startdate,
+ int days,char *ext_sect,LHASH *conf,int verbose);
static int fix_data(int nid, int *type);
static void write_new_certificate(BIO *bp, X509 *x, int output_der);
static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, EVP_MD *dgst,
- STACK *policy, TXT_DB *db, BIGNUM *serial, int days, int batch,
- int verbose, X509_REQ *req, STACK *extensions);
+ STACK *policy, TXT_DB *db, BIGNUM *serial, char *startdate,
+ int days, int batch, int verbose, X509_REQ *req, char *ext_sect,
+ LHASH *conf);
static int check_time_format(char *str);
#else
-static STACK *load_extensions();
+static int add_oid_section();
static void lookup_fail();
static int MS_CALLBACK key_callback();
static unsigned long index_serial_hash();
static BIGNUM *load_serial();
static int save_serial();
static int certify();
+static int certify_cert();
static int certify_spkac();
static void write_new_certificate();
static int do_body();
char *certfile=NULL;
char *infile=NULL;
char *spkac_file=NULL;
+ char *ss_cert_file=NULL;
EVP_PKEY *pkey=NULL;
int output_der = 0;
char *outfile=NULL;
char *serialfile=NULL;
char *extensions=NULL;
BIGNUM *serial=NULL;
+ char *startdate=NULL;
int days=0;
int batch=0;
X509 *x509=NULL;
long l;
EVP_MD *dgst=NULL;
STACK *attribs=NULL;
- STACK *extensions_sk=NULL;
STACK *cert_sk=NULL;
BIO *hex=NULL;
#undef BSIZE
apps_startup();
- X509v3_add_netscape_extensions();
+ X509V3_add_standard_extensions();
preserve=0;
if (bio_err == NULL)
if ((bio_err=BIO_new(BIO_s_file())) != NULL)
- BIO_set_fp(bio_err,stderr,BIO_NOCLOSE);
+ BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
argc--;
argv++;
if (--argc < 1) goto bad;
section= *(++argv);
}
+ else if (strcmp(*argv,"-startdate") == 0)
+ {
+ if (--argc < 1) goto bad;
+ startdate= *(++argv);
+ }
else if (strcmp(*argv,"-days") == 0)
{
if (--argc < 1) goto bad;
req=1;
break;
}
+ else if (strcmp(*argv, "-ss_cert") == 0)
+ {
+ if (--argc < 1) goto bad;
+ ss_cert_file = *(++argv);
+ req=1;
+ }
else if (strcmp(*argv, "-spkac") == 0)
{
if (--argc < 1) goto bad;
}
}
+ if (conf != NULL)
+ {
+ p=CONF_get_string(conf,NULL,"oid_file");
+ if (p != NULL)
+ {
+ BIO *oid_bio;
+
+ oid_bio=BIO_new_file(p,"r");
+ if (oid_bio == NULL)
+ {
+ /*
+ BIO_printf(bio_err,"problems opening %s for extra oid's\n",p);
+ ERR_print_errors(bio_err);
+ */
+ ERR_clear_error();
+ }
+ else
+ {
+ OBJ_create_objects(oid_bio);
+ BIO_free(oid_bio);
+ }
+ }
+ }
+ if(!add_oid_section(conf)) {
+ ERR_print_errors(bio_err);
+ goto err;
+ }
+
in=BIO_new(BIO_s_file());
out=BIO_new(BIO_s_file());
Sout=BIO_new(BIO_s_file());
goto err;
}
+ if (!X509_check_private_key(x509,pkey))
+ {
+ BIO_printf(bio_err,"CA certificate and CA private key do not match\n");
+ goto err;
+ }
+
f=CONF_get_string(conf,BASE_SECTION,ENV_PRESERVE);
if ((f != NULL) && ((*f == 'y') || (*f == 'Y')))
preserve=1;
}
if (verbose)
{
- BIO_set_fp(out,stdout,BIO_NOCLOSE); /* cannot fail */
+ BIO_set_fp(out,stdout,BIO_NOCLOSE|BIO_FP_TEXT); /* cannot fail */
TXT_DB_write(out,db);
BIO_printf(bio_err,"%d entries loaded from the database\n",
db->data->num);
}
}
else
- BIO_set_fp(Sout,stdout,BIO_NOCLOSE);
+ BIO_set_fp(Sout,stdout,BIO_NOCLOSE|BIO_FP_TEXT);
}
if (req)
goto err;
}
- if ((extensions=CONF_get_string(conf,section,ENV_EXTENSIONS))
- != NULL)
- {
- if ((extensions_sk=load_extensions(extensions)) == NULL)
+ extensions=CONF_get_string(conf,section,ENV_EXTENSIONS);
+ if(extensions) {
+ /* Check syntax of file */
+ if(!X509V3_EXT_check_conf(conf, extensions)) {
+ BIO_printf(bio_err,
+ "Error Loading extension section %s\n",
+ extensions);
+ ret = 1;
goto err;
}
+ }
+
+ if (startdate == NULL)
+ {
+ startdate=(char *)CONF_get_string(conf,section,
+ ENV_DEFAULT_STARTDATE);
+ if (startdate == NULL)
+ startdate="today";
+ else
+ {
+ if (!ASN1_UTCTIME_set_string(NULL,startdate))
+ {
+ BIO_printf(bio_err,"start date is invalid, it should be YYMMDDHHMMSS\n");
+ goto err;
+ }
+ }
+ }
if (days == 0)
{
}
if (verbose)
{
- if ((f=BN_bn2ascii(serial)) == NULL) goto err;
+ if ((f=BN_bn2hex(serial)) == NULL) goto err;
BIO_printf(bio_err,"next serial number is %s\n",f);
Free(f);
}
{
total++;
j=certify_spkac(&x,spkac_file,pkey,x509,dgst,attribs,db,
- serial,days,extensions_sk,verbose);
+ serial,startdate,days,extensions,conf,verbose);
if (j < 0) goto err;
if (j > 0)
{
}
}
}
+ if (ss_cert_file != NULL)
+ {
+ total++;
+ j=certify_cert(&x,ss_cert_file,pkey,x509,dgst,attribs,
+ db,serial,startdate,days,batch,
+ extensions,conf,verbose);
+ if (j < 0) goto err;
+ if (j > 0)
+ {
+ total_done++;
+ BIO_printf(bio_err,"\n");
+ if (!BN_add_word(serial,1)) goto err;
+ if (!sk_push(cert_sk,(char *)x))
+ {
+ BIO_printf(bio_err,"Malloc failure\n");
+ goto err;
+ }
+ }
+ }
if (infile != NULL)
{
total++;
j=certify(&x,infile,pkey,x509,dgst,attribs,db,
- serial,days,batch,extensions_sk,verbose);
+ serial,startdate,days,batch,
+ extensions,conf,verbose);
if (j < 0) goto err;
if (j > 0)
{
{
total++;
j=certify(&x,argv[i],pkey,x509,dgst,attribs,db,
- serial,days,batch,extensions_sk,verbose);
+ serial,startdate,days,batch,
+ extensions,conf,verbose);
if (j < 0) goto err;
if (j > 0)
{
{
for (k=0; k<j; k++)
{
- sprintf((char *)n,"%02X",*(p++));
+ sprintf((char *)n,"%02X",(unsigned char)*(p++));
n+=2;
}
}
if (ci->issuer == NULL) goto err;
X509_gmtime_adj(ci->lastUpdate,0);
+ if (ci->nextUpdate == NULL)
+ ci->nextUpdate=ASN1_UTCTIME_new();
X509_gmtime_adj(ci->nextUpdate,(crldays*24+crlhours)*60*60);
for (i=0; i<sk_num(db->data); i++)
r->sequence=i;
}
- /* we how have a CRL */
+ /* we now have a CRL */
if (verbose) BIO_printf(bio_err,"signing CRL\n");
if (md != NULL)
{
}
}
else
+ {
+#ifndef NO_DSA
+ if (pkey->type == EVP_PKEY_DSA)
+ dgst=EVP_dss1();
+ else
+#endif
dgst=EVP_md5();
+ }
+
if (!X509_CRL_sign(crl,pkey,dgst)) goto err;
PEM_write_bio_X509_CRL(Sout,crl);
/*****************************************************************/
ret=0;
err:
- if (hex != NULL) BIO_free(hex);
- if (Cout != NULL) BIO_free(Cout);
- if (Sout != NULL) BIO_free(Sout);
- if (out != NULL) BIO_free(out);
- if (in != NULL) BIO_free(in);
+ BIO_free(hex);
+ BIO_free(Cout);
+ BIO_free(Sout);
+ BIO_free(out);
+ BIO_free(in);
- if (cert_sk != NULL) sk_pop_free(cert_sk,X509_free);
- if (extensions_sk != NULL)
- sk_pop_free(extensions_sk,X509_EXTENSION_free);
+ sk_pop_free(cert_sk,X509_free);
if (ret) ERR_print_errors(bio_err);
- if (serial != NULL) BN_free(serial);
- if (db != NULL) TXT_DB_free(db);
- if (pkey != NULL) EVP_PKEY_free(pkey);
- if (x509 != NULL) X509_free(x509);
- if (crl != NULL) X509_CRL_free(crl);
- if (conf != NULL) CONF_free(conf);
- X509v3_cleanup_extensions();
+ BN_free(serial);
+ TXT_DB_free(db);
+ EVP_PKEY_free(pkey);
+ X509_free(x509);
+ X509_CRL_free(crl);
+ CONF_free(conf);
+ X509V3_EXT_cleanup();
+ OBJ_cleanup();
EXIT(ret);
}
return(ret);
}
-static int certify(xret,infile,pkey,x509,dgst,policy,db,serial,days,
- batch,extensions,verbose)
+static int certify(xret,infile,pkey,x509,dgst,policy,db,serial,startdate,days,
+ batch,ext_sect,lconf,verbose)
X509 **xret;
char *infile;
EVP_PKEY *pkey;
STACK *policy;
TXT_DB *db;
BIGNUM *serial;
+char *startdate;
int days;
int batch;
-STACK *extensions;
+char *ext_sect;
+LHASH *lconf;
int verbose;
{
X509_REQ *req=NULL;
BIO_printf(bio_err,"Check that the request matches the signature\n");
- if ( (req->req_info == NULL) ||
- (req->req_info->pubkey == NULL) ||
- (req->req_info->pubkey->public_key == NULL) ||
- (req->req_info->pubkey->public_key->data == NULL))
- {
- BIO_printf(bio_err,"The certificate request appears to corrupted\n");
- BIO_printf(bio_err,"It does not contain a public key\n");
- goto err;
- }
if ((pktmp=X509_REQ_get_pubkey(req)) == NULL)
{
BIO_printf(bio_err,"error unpacking public key\n");
goto err;
}
i=X509_REQ_verify(req,pktmp);
+ EVP_PKEY_free(pktmp);
if (i < 0)
{
ok=0;
else
BIO_printf(bio_err,"Signature ok\n");
- ok=do_body(xret,pkey,x509,dgst,policy,db,serial,days,batch,verbose,req,
- extensions);
+ ok=do_body(xret,pkey,x509,dgst,policy,db,serial,startdate,
+ days,batch,verbose,req,ext_sect,lconf);
err:
if (req != NULL) X509_REQ_free(req);
return(ok);
}
-static int do_body(xret,pkey,x509,dgst,policy,db,serial,days,batch,verbose,req,
- extensions)
+static int certify_cert(xret,infile,pkey,x509,dgst,policy,db,serial,startdate,
+ days,batch,ext_sect,lconf,verbose)
X509 **xret;
+char *infile;
EVP_PKEY *pkey;
X509 *x509;
EVP_MD *dgst;
STACK *policy;
TXT_DB *db;
BIGNUM *serial;
+char *startdate;
+int days;
+int batch;
+char *ext_sect;
+LHASH *lconf;
+int verbose;
+ {
+ X509 *req=NULL;
+ X509_REQ *rreq=NULL;
+ BIO *in=NULL;
+ EVP_PKEY *pktmp=NULL;
+ int ok= -1,i;
+
+ in=BIO_new(BIO_s_file());
+
+ if (BIO_read_filename(in,infile) <= 0)
+ {
+ perror(infile);
+ goto err;
+ }
+ if ((req=PEM_read_bio_X509(in,NULL,NULL)) == NULL)
+ {
+ BIO_printf(bio_err,"Error reading self signed certificate in %s\n",infile);
+ goto err;
+ }
+ if (verbose)
+ X509_print(bio_err,req);
+
+ BIO_printf(bio_err,"Check that the request matches the signature\n");
+
+ if ((pktmp=X509_get_pubkey(req)) == NULL)
+ {
+ BIO_printf(bio_err,"error unpacking public key\n");
+ goto err;
+ }
+ i=X509_verify(req,pktmp);
+ EVP_PKEY_free(pktmp);
+ if (i < 0)
+ {
+ ok=0;
+ BIO_printf(bio_err,"Signature verification problems....\n");
+ goto err;
+ }
+ if (i == 0)
+ {
+ ok=0;
+ BIO_printf(bio_err,"Signature did not match the certificate\n");
+ goto err;
+ }
+ else
+ BIO_printf(bio_err,"Signature ok\n");
+
+ if ((rreq=X509_to_X509_REQ(req,NULL,EVP_md5())) == NULL)
+ goto err;
+
+ ok=do_body(xret,pkey,x509,dgst,policy,db,serial,startdate,days,
+ batch,verbose,rreq,ext_sect,lconf);
+
+err:
+ if (rreq != NULL) X509_REQ_free(rreq);
+ if (req != NULL) X509_free(req);
+ if (in != NULL) BIO_free(in);
+ return(ok);
+ }
+
+static int do_body(xret,pkey,x509,dgst,policy,db,serial,startdate,days,
+ batch,verbose,req,ext_sect,lconf)
+X509 **xret;
+EVP_PKEY *pkey;
+X509 *x509;
+EVP_MD *dgst;
+STACK *policy;
+TXT_DB *db;
+BIGNUM *serial;
+char *startdate;
int days;
int batch;
int verbose;
X509_REQ *req;
-STACK *extensions;
+char *ext_sect;
+LHASH *lconf;
{
X509_NAME *name=NULL,*CAname=NULL,*subject=NULL;
- ASN1_UTCTIME *tm;
+ ASN1_UTCTIME *tm,*tmptm;
ASN1_STRING *str,*str2;
ASN1_OBJECT *obj;
X509 *ret=NULL;
X509_CINF *ci;
X509_NAME_ENTRY *ne;
X509_NAME_ENTRY *tne,*push;
- X509_EXTENSION *ex=NULL;
EVP_PKEY *pktmp;
int ok= -1,i,j,last,nid;
char *p;
char *row[DB_NUMBER],**rrow,**irow=NULL;
char buf[25],*pbuf;
+ tmptm=ASN1_UTCTIME_new();
+ if (tmptm == NULL)
+ {
+ BIO_printf(bio_err,"malloc error\n");
+ return(0);
+ }
+
for (i=0; i<DB_NUMBER; i++)
row[i]=NULL;
BIO_printf(bio_err,"The subject name apears to be ok, checking data base for clashes\n");
row[DB_name]=X509_NAME_oneline(subject,NULL,0);
- row[DB_serial]=BN_bn2ascii(serial);
+ row[DB_serial]=BN_bn2hex(serial);
if ((row[DB_name] == NULL) || (row[DB_serial] == NULL))
{
BIO_printf(bio_err,"Malloc failure\n");
goto err;
BIO_printf(bio_err,"Certificate is to be certified until ");
- X509_gmtime_adj(X509_get_notBefore(ret),0);
- X509_gmtime_adj(X509_get_notAfter(ret),(long)60*60*24*days);
+ if (strcmp(startdate,"today") == 0)
+ {
+ X509_gmtime_adj(X509_get_notBefore(ret),0);
+ X509_gmtime_adj(X509_get_notAfter(ret),(long)60*60*24*days);
+ }
+ else
+ {
+ /*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
+ ASN1_UTCTIME_set_string(X509_get_notBefore(ret),startdate);
+ }
ASN1_UTCTIME_print(bio_err,X509_get_notAfter(ret));
BIO_printf(bio_err," (%d days)\n",days);
if (!X509_set_subject_name(ret,subject)) goto err;
pktmp=X509_REQ_get_pubkey(req);
- if (!X509_set_pubkey(ret,pktmp)) goto err;
+ i = X509_set_pubkey(ret,pktmp);
+ EVP_PKEY_free(pktmp);
+ if (!i) goto err;
/* Lets add the extensions, if there are any */
- if ((extensions != NULL) && (sk_num(extensions) > 0))
+ if (ext_sect)
{
+ X509V3_CTX ctx;
if (ci->version == NULL)
if ((ci->version=ASN1_INTEGER_new()) == NULL)
goto err;
if (ci->extensions != NULL)
sk_pop_free(ci->extensions,X509_EXTENSION_free);
- if ((ci->extensions=sk_new_null()) == NULL)
- goto err;
+ ci->extensions = NULL;
+
+ ctx.subject_cert = ret;
+ ctx.issuer_cert = x509;
+ ctx.subject_req = req;
+ ctx.crl = NULL;
+ ctx.flags = 0;
+
+ if(!X509V3_EXT_add_conf(lconf, &ctx, ext_sect, ret)) goto err;
- /* Lets 'copy' in the new ones */
- for (i=0; i<sk_num(extensions); i++)
- {
- ex=X509_EXTENSION_dup((X509_EXTENSION *)
- sk_value(extensions,i));
- if (ex == NULL) goto err;
- if (!sk_push(ci->extensions,(char *)ex)) goto err;
- }
}
}
}
+
#ifndef 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
if (!X509_sign(ret,pkey,dgst))
BIO_puts(bp,"\n");
}
-static int certify_spkac(xret,infile,pkey,x509,dgst,policy,db,serial,days,
- extensions,verbose)
+static int certify_spkac(xret,infile,pkey,x509,dgst,policy,db,serial,
+ startdate,days,ext_sect,lconf,verbose)
X509 **xret;
char *infile;
EVP_PKEY *pkey;
STACK *policy;
TXT_DB *db;
BIGNUM *serial;
+char *startdate;
int days;
-STACK *extensions;
+char *ext_sect;
+LHASH *lconf;
int verbose;
{
STACK *sk=NULL;
BIO_printf(bio_err,"Signature ok\n");
X509_REQ_set_pubkey(req,pktmp);
- ok=do_body(xret,pkey,x509,dgst,policy,db,serial,days,1,verbose,req,
- extensions);
+ EVP_PKEY_free(pktmp);
+ ok=do_body(xret,pkey,x509,dgst,policy,db,serial,startdate,
+ days,1,verbose,req,ext_sect,lconf);
err:
if (req != NULL) X509_REQ_free(req);
if (parms != NULL) CONF_free(parms);
return(1);
}
-
-static STACK *load_extensions(sec)
-char *sec;
- {
- STACK *ext;
- STACK *ret=NULL;
- CONF_VALUE *cv;
- ASN1_OCTET_STRING *str=NULL;
- ASN1_STRING *tmp=NULL;
- X509_EXTENSION *x;
- BIO *mem=NULL;
- BUF_MEM *buf=NULL;
- int i,nid,len;
- unsigned char *ptr;
- int pack_type;
- int data_type;
-
- if ((ext=CONF_get_section(conf,sec)) == NULL)
- {
- BIO_printf(bio_err,"unable to find extension section called '%s'\n",sec);
- return(NULL);
- }
-
- if ((ret=sk_new_null()) == NULL) return(NULL);
-
- for (i=0; i<sk_num(ext); i++)
- {
- cv=(CONF_VALUE *)sk_value(ext,i); /* get the object id */
- if ((nid=OBJ_txt2nid(cv->name)) == NID_undef)
- {
- BIO_printf(bio_err,"%s:unknown object type in section, '%s'\n",sec,cv->name);
- goto err;
- }
-
- pack_type=X509v3_pack_type_by_NID(nid);
- data_type=X509v3_data_type_by_NID(nid);
-
- /* pack up the input bytes */
- ptr=(unsigned char *)cv->value;
- len=strlen((char *)ptr);
- if ((len > 2) && (cv->value[0] == '0') &&
- (cv->value[1] == 'x'))
- {
- if (data_type == V_ASN1_UNDEF)
- {
- BIO_printf(bio_err,"data type for extension %s is unknown\n",cv->name);
- goto err;
- }
- if (mem == NULL)
- if ((mem=BIO_new(BIO_s_mem())) == NULL)
- goto err;
- if (((buf=BUF_MEM_new()) == NULL) ||
- !BUF_MEM_grow(buf,128))
- goto err;
- if ((tmp=ASN1_STRING_new()) == NULL) goto err;
-
- BIO_reset(mem);
- BIO_write(mem,(char *)&(ptr[2]),len-2);
- if (!a2i_ASN1_STRING(mem,tmp,buf->data,buf->max))
- goto err;
- len=tmp->length;
- ptr=tmp->data;
- }
-
- switch (pack_type)
- {
- case X509_EXT_PACK_STRING:
- if ((str=X509v3_pack_string(&str,
- data_type,ptr,len)) == NULL)
- goto err;
- break;
- case X509_EXT_PACK_UNKNOWN:
- default:
- BIO_printf(bio_err,"Don't know how to pack extension %s\n",cv->name);
- goto err;
- break;
- }
-
- if ((x=X509_EXTENSION_create_by_NID(NULL,nid,0,str)) == NULL)
- goto err;
- sk_push(ret,(char *)x);
- }
-
- if (0)
- {
-err:
- if (ret != NULL) sk_pop_free(ret,X509_EXTENSION_free);
- ret=NULL;
- }
- if (str != NULL) ASN1_OCTET_STRING_free(str);
- if (tmp != NULL) ASN1_STRING_free(tmp);
- if (buf != NULL) BUF_MEM_free(buf);
- if (mem != NULL) BIO_free(mem);
- return(ret);
- }
-
static int check_time_format(str)
char *str;
{
return(ASN1_UTCTIME_check(&tm));
}
+static int add_oid_section(conf)
+LHASH *conf;
+{
+ char *p;
+ STACK *sktmp;
+ CONF_VALUE *cnf;
+ int i;
+ if(!(p=CONF_get_string(conf,NULL,"oid_section"))) return 1;
+ if(!(sktmp = CONF_get_section(conf, p))) {
+ BIO_printf(bio_err, "problem loading oid section %s\n", p);
+ return 0;
+ }
+ for(i = 0; i < sk_num(sktmp); i++) {
+ cnf = (CONF_VALUE *)sk_value(sktmp, i);
+ if(OBJ_create(cnf->value, cnf->name, cnf->name) == NID_undef) {
+ BIO_printf(bio_err, "problem creating object %s=%s\n",
+ cnf->name, cnf->value);
+ return 0;
+ }
+ }
+ return 1;
+}