Commit ba404b5e authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Convert the CONF library to use a typesafe stack: a STACK_OF(CONF_VALUE). It

seemed like a good idea at the time... several hours later it was rather
obvious that these are used all over the place making the changes rather
extensive.
parent 8623f693
Loading
Loading
Loading
Loading
+33 −32
Original line number Diff line number Diff line
@@ -182,23 +182,23 @@ static int index_name_cmp(char **a,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,
		   const 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,
			const EVP_MD *dgst,STACK *policy,TXT_DB *db,
		   const EVP_MD *dgst,STACK_OF(CONF_VALUE) *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,
			const EVP_MD *dgst,STACK_OF(CONF_VALUE) *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,
			 const EVP_MD *dgst,STACK *policy,TXT_DB *db,
			 BIGNUM *serial,char *startdate,int days,
			 const EVP_MD *dgst,STACK_OF(CONF_VALUE) *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, const EVP_MD *dgst,
	STACK *policy, TXT_DB *db, BIGNUM *serial, char *startdate,
	int days, int batch, int verbose, X509_REQ *req, char *ext_sect,
	LHASH *conf);
	STACK_OF(CONF_VALUE) *policy, TXT_DB *db, BIGNUM *serial,
	char *startdate, int days, int batch, int verbose, X509_REQ *req,
	char *ext_sect, LHASH *conf);
static int do_revoke(X509 *x509, TXT_DB *db);
static int check_time_format(char *str);
static LHASH *conf;
@@ -252,7 +252,7 @@ int MAIN(int argc, char **argv)
	int i,j;
	long l;
	const EVP_MD *dgst=NULL;
	STACK *attribs=NULL;
	STACK_OF(CONF_VALUE) *attribs=NULL;
	STACK *cert_sk=NULL;
	BIO *hex=NULL;
#undef BSIZE
@@ -1324,9 +1324,9 @@ err:
	}

static int certify(X509 **xret, char *infile, EVP_PKEY *pkey, X509 *x509,
	     const EVP_MD *dgst, STACK *policy, TXT_DB *db, BIGNUM *serial,
	     char *startdate, int days, int batch, char *ext_sect, LHASH *lconf,
		 int verbose)
	     const EVP_MD *dgst, STACK_OF(CONF_VALUE) *policy, TXT_DB *db,
	     BIGNUM *serial, char *startdate, int days, int batch,
	     char *ext_sect, LHASH *lconf, int verbose)
	{
	X509_REQ *req=NULL;
	BIO *in=NULL;
@@ -1383,10 +1383,9 @@ err:
	}

static int certify_cert(X509 **xret, char *infile, EVP_PKEY *pkey, X509 *x509,
	     const EVP_MD *dgst, STACK *policy, TXT_DB *db, BIGNUM *serial,
	     char *startdate, int days, int batch, char *ext_sect, LHASH *lconf,
		 int verbose)

	     const EVP_MD *dgst, STACK_OF(CONF_VALUE) *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;
@@ -1447,8 +1446,9 @@ err:
	}

static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
	     STACK *policy, TXT_DB *db, BIGNUM *serial, char *startdate, int days,
	     int batch, int verbose, X509_REQ *req, char *ext_sect, LHASH *lconf)
	     STACK_OF(CONF_VALUE) *policy, TXT_DB *db, BIGNUM *serial,
	     char *startdate, int days, int batch, int verbose, X509_REQ *req,
	     char *ext_sect, LHASH *lconf)
	{
	X509_NAME *name=NULL,*CAname=NULL,*subject=NULL;
	ASN1_UTCTIME *tm,*tmptm;
@@ -1562,9 +1562,9 @@ static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, const EVP_MD *dgst,
	if (CAname == NULL) goto err;
	str=str2=NULL;

	for (i=0; i<sk_num(policy); i++)
	for (i=0; i<sk_CONF_VALUE_num(policy); i++)
		{
		cv=(CONF_VALUE *)sk_value(policy,i); /* get the object id */
		cv=sk_CONF_VALUE_value(policy,i); /* get the object id */
		if ((j=OBJ_txt2nid(cv->name)) == NID_undef)
			{
			BIO_printf(bio_err,"%s:unknown object type in 'policy' configuration\n",cv->name);
@@ -1904,10 +1904,11 @@ static void write_new_certificate(BIO *bp, X509 *x, int output_der)
	}

static int certify_spkac(X509 **xret, char *infile, EVP_PKEY *pkey, X509 *x509,
	     const EVP_MD *dgst, STACK *policy, TXT_DB *db, BIGNUM *serial,
	     char *startdate, int days, char *ext_sect, LHASH *lconf, int verbose)
	     const EVP_MD *dgst, STACK_OF(CONF_VALUE) *policy, TXT_DB *db,
	     BIGNUM *serial, char *startdate, int days, char *ext_sect,
	     LHASH *lconf, int verbose)
	{
	STACK *sk=NULL;
	STACK_OF(CONF_VALUE) *sk=NULL;
	LHASH *parms=NULL;
	X509_REQ *req=NULL;
	CONF_VALUE *cv=NULL;
@@ -1936,7 +1937,7 @@ static int certify_spkac(X509 **xret, char *infile, EVP_PKEY *pkey, X509 *x509,
		}

	sk=CONF_get_section(parms, "default");
	if (sk_num(sk) == 0)
	if (sk_CONF_VALUE_num(sk) == 0)
		{
		BIO_printf(bio_err, "no name/value pairs found in %s\n", infile);
		CONF_free(parms);
@@ -1965,9 +1966,9 @@ static int certify_spkac(X509 **xret, char *infile, EVP_PKEY *pkey, X509 *x509,

	for (i = 0; ; i++)
		{
		if ((int)sk_num(sk) <= i) break;
		if (sk_CONF_VALUE_num(sk) <= i) break;

		cv=(CONF_VALUE *)sk_value(sk,i);
		cv=sk_CONF_VALUE_value(sk,i);
		type=cv->name;
		buf=cv->value;

@@ -2089,7 +2090,7 @@ static int check_time_format(char *str)
static int add_oid_section(LHASH *hconf)
{	
	char *p;
	STACK *sktmp;
	STACK_OF(CONF_VALUE) *sktmp;
	CONF_VALUE *cnf;
	int i;
	if(!(p=CONF_get_string(hconf,NULL,"oid_section"))) return 1;
@@ -2097,8 +2098,8 @@ static int add_oid_section(LHASH *hconf)
		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);
	for(i = 0; i < sk_CONF_VALUE_num(sktmp); i++) {
		cnf = sk_CONF_VALUE_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);
+11 −10
Original line number Diff line number Diff line
@@ -823,7 +823,7 @@ static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, int attribs)
	char buf[100];
	int nid,min,max;
	char *type,*def,*tmp,*value,*tmp_attr;
	STACK *sk,*attr=NULL;
	STACK_OF(CONF_VALUE) *sk, *attr=NULL;
	CONF_VALUE *v;
	
	tmp=CONF_get_string(req_conf,SECTION,DISTINGUISHED_NAME);
@@ -866,15 +866,15 @@ static int make_REQ(X509_REQ *req, EVP_PKEY *pkey, int attribs)
	/* setup version number */
	if (!ASN1_INTEGER_set(ri->version,0L)) goto err; /* version 1 */

	if (sk_num(sk))
	if (sk_CONF_VALUE_num(sk))
		{
		i= -1;
start:		for (;;)
			{
			i++;
			if ((int)sk_num(sk) <= i) break;
			if (sk_CONF_VALUE_num(sk) <= i) break;

			v=(CONF_VALUE *)sk_value(sk,i);
			v=sk_CONF_VALUE_value(sk,i);
			p=q=NULL;
			type=v->name;
			if(!check_end(type,"_min") || !check_end(type,"_max") ||
@@ -918,7 +918,7 @@ start: for (;;)

		if (attribs)
			{
			if ((attr != NULL) && (sk_num(attr) > 0))
			if ((attr != NULL) && (sk_CONF_VALUE_num(attr) > 0))
				{
				BIO_printf(bio_err,"\nPlease enter the following 'extra' attributes\n");
				BIO_printf(bio_err,"to be sent with your certificate request\n");
@@ -928,10 +928,11 @@ start: for (;;)
start2:			for (;;)
				{
				i++;
				if ((attr == NULL) || ((int)sk_num(attr) <= i))
				if ((attr == NULL) ||
					    (sk_CONF_VALUE_num(attr) <= i))
					break;

				v=(CONF_VALUE *)sk_value(attr,i);
				v=sk_CONF_VALUE_value(attr,i);
				type=v->name;
				if ((nid=OBJ_txt2nid(type)) == NID_undef)
					goto start2;
@@ -1176,7 +1177,7 @@ static int check_end(char *str, char *end)
static int add_oid_section(LHASH *conf)
{	
	char *p;
	STACK *sktmp;
	STACK_OF(CONF_VALUE) *sktmp;
	CONF_VALUE *cnf;
	int i;
	if(!(p=CONF_get_string(conf,NULL,"oid_section"))) return 1;
@@ -1184,8 +1185,8 @@ static int add_oid_section(LHASH *conf)
		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);
	for(i = 0; i < sk_CONF_VALUE_num(sktmp); i++) {
		cnf = sk_CONF_VALUE_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);
+12 −10
Original line number Diff line number Diff line
@@ -134,7 +134,7 @@ LHASH *CONF_load_bio(LHASH *h, BIO *in, long *line)
	CONF_VALUE *v=NULL,*vv,*tv;
	CONF_VALUE *sv=NULL;
	char *section=NULL,*buf;
	STACK *section_sk=NULL,*ts;
	STACK_OF(CONF_VALUE) *section_sk=NULL,*ts;
	char *start,*psection,*pname;

	if ((buff=BUF_MEM_new()) == NULL)
@@ -169,7 +169,7 @@ LHASH *CONF_load_bio(LHASH *h, BIO *in, long *line)
					CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
		goto err;
		}
	section_sk=(STACK *)sv->value;
	section_sk=(STACK_OF(CONF_VALUE) *)sv->value;

	bufnum=0;
	for (;;)
@@ -261,7 +261,7 @@ again:
					CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
				goto err;
				}
			section_sk=(STACK *)sv->value;
			section_sk=(STACK_OF(CONF_VALUE) *)sv->value;
			continue;
			}
		else
@@ -295,7 +295,7 @@ again:
			p++;
			*p='\0';

			if ((v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))) == NULL)
			if (!(v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))))
				{
				CONFerr(CONF_F_CONF_LOAD_BIO,
							ERR_R_MALLOC_FAILURE);
@@ -324,7 +324,7 @@ again:
					   CONF_R_UNABLE_TO_CREATE_NEW_SECTION);
					goto err;
					}
				ts=(STACK *)tv->value;
				ts=(STACK_OF(CONF_VALUE) *)tv->value;
				}
			else
				{
@@ -332,7 +332,7 @@ again:
				ts=section_sk;
				}
			v->section=tv->section;	
			if (!sk_push(ts,(char *)v))
			if (!sk_CONF_VALUE_push(ts,v))
				{
				CONFerr(CONF_F_CONF_LOAD_BIO,
							ERR_R_MALLOC_FAILURE);
@@ -341,7 +341,7 @@ again:
			vv=(CONF_VALUE *)lh_insert(ret,(char *)v);
			if (vv != NULL)
				{
				sk_delete_ptr(ts,(char *)vv);
				sk_CONF_VALUE_delete_ptr(ts,vv);
				Free(vv->name);
				Free(vv->value);
				Free(vv);
@@ -411,13 +411,13 @@ static CONF_VALUE *get_section(LHASH *conf, char *section)
	return(v);
	}

STACK *CONF_get_section(LHASH *conf, char *section)
STACK_OF(CONF_VALUE) *CONF_get_section(LHASH *conf, char *section)
	{
	CONF_VALUE *v;

	v=get_section(conf,section);
	if (v != NULL)
		return((STACK *)v->value);
		return((STACK_OF(CONF_VALUE) *)v->value);
	else
		return(NULL);
	}
@@ -728,3 +728,5 @@ err:
		}
	return(v);
	}

IMPLEMENT_STACK_OF(CONF_VALUE)
+4 −1
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ extern "C" {
#include <openssl/bio.h>
#include <openssl/lhash.h>
#include <openssl/stack.h>
#include <openssl/safestack.h>

typedef struct
	{
@@ -74,16 +75,18 @@ typedef struct
	char *value;
	} CONF_VALUE;

DECLARE_STACK_OF(CONF_VALUE)

LHASH *CONF_load(LHASH *conf,const char *file,long *eline);
LHASH *CONF_load_fp(LHASH *conf, FILE *fp,long *eline);
LHASH *CONF_load_bio(LHASH *conf, BIO *bp,long *eline);
STACK *CONF_get_section(LHASH *conf,char *section);
STACK_OF(CONF_VALUE) *CONF_get_section(LHASH *conf,char *section);
char *CONF_get_string(LHASH *conf,char *group,char *name);
long CONF_get_number(LHASH *conf,char *group,char *name);
void CONF_free(LHASH *conf);
void ERR_load_CONF_strings(void );


/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
+9 −7
Original line number Diff line number Diff line
@@ -63,8 +63,10 @@
#include <openssl/asn1_mac.h>
#include <openssl/x509v3.h>

static STACK *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method, AUTHORITY_KEYID *akeyid, STACK *extlist);
static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK *values);
static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
			AUTHORITY_KEYID *akeyid, STACK_OF(CONF_VALUE) *extlist);
static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
			X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *values);

X509V3_EXT_METHOD v3_akey_id = {
NID_authority_key_identifier, X509V3_EXT_MULTILINE,
@@ -133,8 +135,8 @@ void AUTHORITY_KEYID_free(AUTHORITY_KEYID *a)
	Free ((char *)a);
}

static STACK *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
	     AUTHORITY_KEYID *akeyid, STACK *extlist)
static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
	     AUTHORITY_KEYID *akeyid, STACK_OF(CONF_VALUE) *extlist)
{
	char *tmp;
	if(akeyid->keyid) {
@@ -162,7 +164,7 @@ static STACK *i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
 */

static AUTHORITY_KEYID *v2i_AUTHORITY_KEYID(X509V3_EXT_METHOD *method,
	     X509V3_CTX *ctx, STACK *values)
	     X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *values)
{
char keyid=0, issuer=0;
int i;
@@ -175,8 +177,8 @@ ASN1_INTEGER *serial = NULL;
X509_EXTENSION *ext;
X509 *cert;
AUTHORITY_KEYID *akeyid;
for(i = 0; i < sk_num(values); i++) {
	cnf = (CONF_VALUE *)sk_value(values, i);
for(i = 0; i < sk_CONF_VALUE_num(values); i++) {
	cnf = sk_CONF_VALUE_value(values, i);
	if(!strcmp(cnf->name, "keyid")) {
		keyid = 1;
		if(cnf->value && !strcmp(cnf->value, "always")) keyid = 2;
Loading