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

Various fixes so Win32 compile may work. Convert GeneralNames to use safe stack.

parent e4aac1cb
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -78,7 +78,8 @@ void sk_##type##_delete_ptr(STACK_OF(type) *sk,type *v); \
void sk_##type##_set_cmp_func(STACK_OF(type) *sk,int (*cmp)(type **,type **)); \
STACK_OF(type) *sk_##type##_dup(STACK_OF(type) *sk); \
void sk_##type##_pop_free(STACK_OF(type) *sk,void (*func)(type *)); \
type *sk_##type##_shift(STACK_OF(type) *sk);
type *sk_##type##_shift(STACK_OF(type) *sk); \
type *sk_##type##_pop(STACK_OF(type) *sk);

#define IMPLEMENT_STACK_OF(type) \
STACK_OF(type) *sk_##type##_new(int (*cmp)(type **,type **)) \
@@ -110,6 +111,8 @@ STACK_OF(type) *sk_##type##_dup(STACK_OF(type) *sk) \
void sk_##type##_pop_free(STACK_OF(type) *sk,void (*func)(type *)) \
    { sk_pop_free((STACK *)sk,func); } \
type *sk_##type##_shift(STACK_OF(type) *sk) \
    { return (type *)sk_shift((STACK *)sk); }
    { return (type *)sk_shift((STACK *)sk); } \
type *sk_##type##_pop(STACK_OF(type) *sk) \
    { return (type *)sk_pop((STACK *)sk); }

#endif /* ndef HEADER_SAFESTACK_H */
+0 −6
Original line number Diff line number Diff line
@@ -847,10 +847,6 @@ int X509_EXTENSION_set_data(X509_EXTENSION *ex,
ASN1_OBJECT *	X509_EXTENSION_get_object(X509_EXTENSION *ex);
ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne);
int		X509_EXTENSION_get_critical(X509_EXTENSION *ex);
ASN1_OCTET_STRING *X509v3_pack_string(ASN1_OCTET_STRING **ex,int type,
			unsigned char *bytes, int len);
ASN1_STRING *	X509v3_unpack_string(ASN1_STRING **ex,int type,
			ASN1_OCTET_STRING *os);

int		X509_verify_cert(X509_STORE_CTX *ctx);

@@ -1179,8 +1175,6 @@ int X509_EXTENSION_set_data();
ASN1_OBJECT *	X509_EXTENSION_get_object();
ASN1_OCTET_STRING *X509_EXTENSION_get_data();
int		X509_EXTENSION_get_critical();
ASN1_OCTET_STRING *X509v3_pack_string();
ASN1_STRING *	X509v3_unpack_string();

int		X509_verify_cert();
char *          X509_verify_cert_error_string();
+1 −0
Original line number Diff line number Diff line
@@ -635,3 +635,4 @@ void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, STACK_OF(X509) *sk)
IMPLEMENT_STACK_OF(X509)
IMPLEMENT_ASN1_SET_OF(X509)
IMPLEMENT_STACK_OF(X509_NAME)
IMPLEMENT_STACK_OF(X509_ATTRIBUTE)
+5 −5
Original line number Diff line number Diff line
@@ -141,7 +141,7 @@ void AUTHORITY_KEYID_free(AUTHORITY_KEYID *a)
{
	if (a == NULL) return;
	ASN1_OCTET_STRING_free(a->keyid);
	sk_pop_free(a->issuer, GENERAL_NAME_free);
	sk_GENERAL_NAME_pop_free(a->issuer, GENERAL_NAME_free);
	ASN1_INTEGER_free (a->serial);
	Free ((char *)a);
}
@@ -182,7 +182,7 @@ int i;
CONF_VALUE *cnf;
ASN1_OCTET_STRING *ikeyid = NULL;
X509_NAME *isname = NULL;
STACK * gens = NULL;
STACK_OF(GENERAL_NAME) * gens = NULL;
GENERAL_NAME *gen = NULL;
ASN1_INTEGER *serial = NULL;
X509_EXTENSION *ext;
@@ -216,7 +216,7 @@ cert = ctx->issuer_cert;
if(keyid) {
	i = X509_get_ext_by_NID(cert, NID_subject_key_identifier, -1);
	if((i >= 0)  && (ext = X509_get_ext(cert, i)))
			ikeyid = (ASN1_OCTET_STRING *) X509V3_EXT_d2i(ext);
						 ikeyid = X509V3_EXT_d2i(ext);
	if(keyid==2 && !ikeyid) {
		X509V3err(X509V3_F_V2I_AUTHORITY_KEYID,X509V3_R_UNABLE_TO_GET_ISSUER_KEYID);
		return NULL;
@@ -235,8 +235,8 @@ if((issuer && !ikeyid) || (issuer == 2)) {
if(!(akeyid = AUTHORITY_KEYID_new())) goto err;

if(isname) {
	if(!(gens = sk_new(NULL)) || !(gen = GENERAL_NAME_new())
		|| !sk_push(gens, (char *)gen)) {
	if(!(gens = sk_GENERAL_NAME_new(NULL)) || !(gen = GENERAL_NAME_new())
		|| !sk_GENERAL_NAME_push(gens, gen)) {
		X509V3err(X509V3_F_V2I_AUTHORITY_KEYID,ERR_R_MALLOC_FAILURE);
		goto err;
	}
+38 −37
Original line number Diff line number Diff line
@@ -62,10 +62,10 @@
#include "x509v3.h"

#ifndef NOPROTO
static STACK *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK *nval);
static STACK *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK *nval);
static int copy_email(X509V3_CTX *ctx, STACK *gens);
static int copy_issuer(X509V3_CTX *ctx, STACK *gens);
static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK *nval);
static STACK_OF(GENERAL_NAME) *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK *nval);
static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens);
static int copy_issuer(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens);
#else
static STACK *v2i_issuer_alt();
static STACK *v2i_subject_alt();
@@ -95,12 +95,13 @@ NULL, NULL, NULL},
EXT_END
};

STACK *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, STACK *gens, STACK *ret)
STACK *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method,
				 STACK_OF(GENERAL_NAME) *gens, STACK *ret)
{
	int i;
	GENERAL_NAME *gen;
	for(i = 0; i < sk_num(gens); i++) {
		gen = (GENERAL_NAME *)sk_value(gens, i);
	for(i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
		gen = sk_GENERAL_NAME_value(gens, i);
		ret = i2v_GENERAL_NAME(method, gen, ret);
	}
	return ret;
@@ -161,13 +162,13 @@ STACK *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, GENERAL_NAME *gen,
	return ret;
}

static STACK *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
	     STACK *nval)
static STACK_OF(GENERAL_NAME) *v2i_issuer_alt(X509V3_EXT_METHOD *method,
						 X509V3_CTX *ctx, STACK *nval)
{
	STACK *gens = NULL;
	STACK_OF(GENERAL_NAME) *gens = NULL;
	CONF_VALUE *cnf;
	int i;
	if(!(gens = sk_new(NULL))) {
	if(!(gens = sk_GENERAL_NAME_new(NULL))) {
		X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE);
		return NULL;
	}
@@ -180,21 +181,21 @@ static STACK *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
			GENERAL_NAME *gen;
			if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
								 goto err; 
			sk_push(gens, (char *)gen);
			sk_GENERAL_NAME_push(gens, gen);
		}
	}
	return gens;
	err:
	sk_pop_free(gens, GENERAL_NAME_free);
	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
	return NULL;
}

/* Append subject altname of issuer to issuer alt name of subject */

static int copy_issuer(X509V3_CTX *ctx, STACK *gens)
static int copy_issuer(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens)
{
	STACK *ialt;
	char *gen;
	STACK_OF(GENERAL_NAME) *ialt;
	GENERAL_NAME *gen;
	X509_EXTENSION *ext;
	int i;
	if(ctx && (ctx->flags == CTX_TEST)) return 1;
@@ -205,19 +206,19 @@ static int copy_issuer(X509V3_CTX *ctx, STACK *gens)
        i = X509_get_ext_by_NID(ctx->issuer_cert, NID_subject_alt_name, -1);
	if(i < 0) return 1;
        if(!(ext = X509_get_ext(ctx->issuer_cert, i)) ||
                        !(ialt = (STACK *) X509V3_EXT_d2i(ext)) ) {
                        !(ialt = X509V3_EXT_d2i(ext)) ) {
		X509V3err(X509V3_F_COPY_ISSUER,X509V3_R_ISSUER_DECODE_ERROR);
		goto err;
	}

	for(i = 0; i < sk_num(ialt); i++) {
		gen = sk_value(ialt, i);
		if(!sk_push(gens, gen)) {
	for(i = 0; i < sk_GENERAL_NAME_num(ialt); i++) {
		gen = sk_GENERAL_NAME_value(ialt, i);
		if(!sk_GENERAL_NAME_push(gens, gen)) {
			X509V3err(X509V3_F_COPY_ISSUER,ERR_R_MALLOC_FAILURE);
			goto err;
		}
	}
	sk_free(ialt);
	sk_GENERAL_NAME_free(ialt);

	return 1;
		
@@ -226,13 +227,13 @@ static int copy_issuer(X509V3_CTX *ctx, STACK *gens)
	
}

static STACK *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
	     STACK *nval)
static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method,
						 X509V3_CTX *ctx, STACK *nval)
{
	STACK *gens = NULL;
	STACK_OF(GENERAL_NAME) *gens = NULL;
	CONF_VALUE *cnf;
	int i;
	if(!(gens = sk_new(NULL))) {
	if(!(gens = sk_GENERAL_NAME_new(NULL))) {
		X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE);
		return NULL;
	}
@@ -245,12 +246,12 @@ static STACK *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
			GENERAL_NAME *gen;
			if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf)))
								 goto err; 
			sk_push(gens, (char *)gen);
			sk_GENERAL_NAME_push(gens, gen);
		}
	}
	return gens;
	err:
	sk_pop_free(gens, GENERAL_NAME_free);
	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
	return NULL;
}

@@ -258,7 +259,7 @@ static STACK *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
 * GENERAL_NAMES
 */

static int copy_email(X509V3_CTX *ctx, STACK *gens)
static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens)
{
	X509_NAME *nm;
	ASN1_IA5STRING *email = NULL;
@@ -287,7 +288,7 @@ static int copy_email(X509V3_CTX *ctx, STACK *gens)
		gen->d.ia5 = email;
		email = NULL;
		gen->type = GEN_EMAIL;
		if(!sk_push(gens, (char *)gen)) {
		if(!sk_GENERAL_NAME_push(gens, gen)) {
			X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE);
			goto err;
		}
@@ -304,25 +305,25 @@ static int copy_email(X509V3_CTX *ctx, STACK *gens)
	
}

STACK *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
	     STACK *nval)
STACK_OF(GENERAL_NAME) *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method,
						 X509V3_CTX *ctx, STACK *nval)
{
	GENERAL_NAME *gen;
	STACK *gens = NULL;
	STACK_OF(GENERAL_NAME) *gens = NULL;
	CONF_VALUE *cnf;
	int i;
	if(!(gens = sk_new(NULL))) {
	if(!(gens = sk_GENERAL_NAME_new(NULL))) {
		X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE);
		return NULL;
	}
	for(i = 0; i < sk_num(nval); i++) {
		cnf = (CONF_VALUE *)sk_value(nval, i);
		if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) goto err; 
		sk_push(gens, (char *)gen);
		sk_GENERAL_NAME_push(gens, gen);
	}
	return gens;
	err:
	sk_pop_free(gens, GENERAL_NAME_free);
	sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
	return NULL;
}

Loading