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

Add some utilities to support SXNet extension also add support in DEF files

generator to typesafe stacks.
parent d91f8c3c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -5,6 +5,10 @@

 Changes between 0.9.2b and 0.9.3

  *) Various utility functions to handle SXNet extension. Modify mkdef.pl to
     support typesafe stack.
     [Steve Henson]

  *) Fix typo in SSL_[gs]et_options().
     [Nils Frostberg <nils@medcom.se>]

+2 −2
Original line number Diff line number Diff line
@@ -71,11 +71,11 @@ int X509V3_EXT_add(ext)
X509V3_EXT_METHOD *ext;
{
	if(!ext_list && !(ext_list = sk_new(ext_cmp))) {
		X509V3err(X509V3_F_X509V3_ADD_EXT,ERR_R_MALLOC_FAILURE);
		X509V3err(X509V3_F_X509V3_EXT_ADD,ERR_R_MALLOC_FAILURE);
		return 0;
	}
	if(!sk_push(ext_list, (char *)ext)) {
		X509V3err(X509V3_F_X509V3_ADD_EXT,ERR_R_MALLOC_FAILURE);
		X509V3err(X509V3_F_X509V3_EXT_ADD,ERR_R_MALLOC_FAILURE);
		return 0;
	}
	return 1;
+168 −5
Original line number Diff line number Diff line
@@ -65,8 +65,13 @@

/* Support for Thawte strong extranet extension */

#define SXNET_TEST

#ifndef NOPROTO
static int sxnet_i2r(X509V3_EXT_METHOD *method, SXNET *sx, BIO *out, int indent);
#ifdef SXNET_TEST
static SXNET * sxnet_v2i(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK *nval);
#endif
#else
static int sxnet_i2r();
#endif
@@ -78,7 +83,12 @@ SXNET_free,
(X509V3_EXT_D2I)d2i_SXNET,
i2d_SXNET,
NULL, NULL,
NULL, NULL,
NULL, 
#ifdef SXNET_TEST
(X509V3_EXT_V2I)sxnet_v2i,
#else
NULL,
#endif
(X509V3_EXT_I2R)sxnet_i2r,
NULL,
NULL
@@ -114,8 +124,8 @@ SXNET *SXNET_new()
	SXNET *ret=NULL;
	ASN1_CTX c;
	M_ASN1_New_Malloc(ret, SXNET);
	ret->version = NULL;
	ret->ids = NULL;
	M_ASN1_New(ret->version,ASN1_INTEGER_new);
	M_ASN1_New(ret->ids,sk_new_null);
	return (ret);
	M_ASN1_New_Error(ASN1_F_SXNET_NEW);
}
@@ -142,8 +152,6 @@ SXNET *a;
	Free ((char *)a);
}



int i2d_SXNETID(a,pp)
SXNETID *a;
unsigned char **pp;
@@ -215,3 +223,158 @@ int indent;
	}
	return 1;
}

#ifdef SXNET_TEST

/* NBB: this is used for testing only. It should *not* be used for anything
 * else because it will just take static IDs from the configuration file and
 * they should really be separate values for each user.
 */


static SXNET * sxnet_v2i(method, ctx, nval)
X509V3_EXT_METHOD *method;
X509V3_CTX *ctx;
STACK *nval;
{
	CONF_VALUE *cnf;
	SXNET *sx = NULL;
	int i;
	for(i = 0; i < sk_num(nval); i++) {
		cnf = (CONF_VALUE *)sk_value(nval, i);
		if(!SXNET_add_id_asc(&sx, cnf->name, cnf->value, -1))
								 return NULL;
	}
	return sx;
}
		
	
#endif

/* Strong Extranet utility functions */

/* Add an id given the zone as an ASCII number */

int SXNET_add_id_asc(psx, zone, user, userlen)
SXNET **psx;
char *zone;
unsigned char *user;
int userlen;
{
	ASN1_INTEGER *izone = NULL;
	if(!(izone = s2i_ASN1_INTEGER(NULL, zone))) {
		X509V3err(X509V3_F_SXNET_ADD_ASC,X509V3_R_ERROR_CONVERTING_ZONE);
		return 0;
	}
	return SXNET_add_id_INTEGER(psx, izone, user, userlen);
}

/* Add an id given the zone as an unsigned long */

int SXNET_add_id_ulong(psx, lzone, user, userlen)
SXNET **psx;
unsigned long lzone;
unsigned char *user;
int userlen;
{
	ASN1_INTEGER *izone = NULL;
	if(!(izone = ASN1_INTEGER_new()) || !ASN1_INTEGER_set(izone, lzone)) {
		X509V3err(X509V3_F_SXNET_ADD_ID_ULONG,ERR_R_MALLOC_FAILURE);
		ASN1_INTEGER_free(izone);
		return 0;
	}
	return SXNET_add_id_INTEGER(psx, izone, user, userlen);
	
}

/* Add an id given the zone as an ASN1_INTEGER.
 * Note this version uses the passed integer and doesn't make a copy so don't
 * free it up afterwards.
 */

int SXNET_add_id_INTEGER(psx, zone, user, userlen)
SXNET **psx;
ASN1_INTEGER *zone;
unsigned char *user;
int userlen;
{
	SXNET *sx = NULL;
	SXNETID *id = NULL;
	if(!psx || !zone || !user) {
		X509V3err(X509V3_F_SXNET_ADD_ID_INTEGER,X509V3_R_INVALID_NULL_ARGUMENT);
		return 0;
	}
	if(userlen == -1) userlen = strlen(user);
	if(userlen > 64) {
		X509V3err(X509V3_F_SXNET_ADD_ID_INTEGER,X509V3_R_USER_TOO_LONG);
		return 0;
	}
	if(!*psx) {
		if(!(sx = SXNET_new())) goto err;
		if(!ASN1_INTEGER_set(sx->version, 0)) goto err;
		*psx = sx;
	} else sx = *psx;
	if(SXNET_get_id_INTEGER(sx, zone)) {
		X509V3err(X509V3_F_SXNET_ADD_ID_INTEGER,X509V3_R_DUPLICATE_ZONE_ID);
		return 0;
	}

	if(!(id = SXNETID_new())) goto err;
	if(userlen == -1) userlen = strlen(user);
		
	if(!ASN1_OCTET_STRING_set(id->user, user, userlen)) goto err;
	if(!sk_push(sx->ids, (char *)id)) goto err;
	id->zone = zone;
	return 1;
	
	err:
	X509V3err(X509V3_F_SXNET_ADD_ID_INTEGER,ERR_R_MALLOC_FAILURE);
	SXNETID_free(id);
	SXNET_free(sx);
	*psx = NULL;
	return 0;
}

ASN1_OCTET_STRING *SXNET_get_id_asc(sx, zone)
SXNET *sx;
char *zone;
{
	ASN1_INTEGER *izone = NULL;
	ASN1_OCTET_STRING *oct;
	if(!(izone = s2i_ASN1_INTEGER(NULL, zone))) {
		X509V3err(X509V3_F_SXNET_GET_ID_ASC,X509V3_R_ERROR_CONVERTING_ZONE);
		return NULL;
	}
	oct = SXNET_get_id_INTEGER(sx, izone);
	ASN1_INTEGER_free(oct);
	return oct;
}

ASN1_OCTET_STRING *SXNET_get_id_ulong(sx, lzone)
SXNET *sx;
unsigned long lzone;
{
	ASN1_INTEGER *izone = NULL;
	ASN1_OCTET_STRING *oct;
	if(!(izone = ASN1_INTEGER_new()) || !ASN1_INTEGER_set(izone, lzone)) {
		X509V3err(X509V3_F_SXNET_GET_ID_ULONG,ERR_R_MALLOC_FAILURE);
		ASN1_INTEGER_free(izone);
		return NULL;
	}
	oct = SXNET_get_id_INTEGER(sx, izone);
	ASN1_INTEGER_free(oct);
	return oct;
}

ASN1_OCTET_STRING *SXNET_get_id_INTEGER(sx, zone)
SXNET *sx;
ASN1_INTEGER *zone;
{
	SXNETID *id;
	int i;
	for(i = 0; i < sk_num(sx->ids); i++) {
		id = (SXNETID *)sk_value(sx->ids, i);
		if(!ASN1_INTEGER_cmp(id->zone, zone)) return id->user;
	}
	return NULL;
}
+28 −17
Original line number Diff line number Diff line
@@ -151,6 +151,30 @@ ASN1_INTEGER *a;
	return strtmp;
}

ASN1_INTEGER *s2i_ASN1_INTEGER(method, value)
X509V3_EXT_METHOD *method;
char *value;
{
	BIGNUM *bn = NULL;
	ASN1_INTEGER *aint;
	bn = BN_new();
	if(!value) {
		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_INVALID_NULL_VALUE);
		return 0;
	}
	if(!BN_dec2bn(&bn, value)) {
		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_BN_DEC2BN_ERROR);
		return 0;
	}

	if(!(aint = BN_to_ASN1_INTEGER(bn, NULL))) {
		X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
		return 0;
	}
	BN_free(bn);
	return aint;
}

int X509V3_add_value_int(name, aint, extlist)
char *name;
ASN1_INTEGER *aint;
@@ -183,7 +207,7 @@ int *asn1_bool;
		return 1;
	}
	err:
	X509V3err(X509V3_F_X509V3_VALUE_GET_BOOL,X509V3_R_INVALID_BOOLEAN_STRING);
	X509V3err(X509V3_F_X509V3_GET_VALUE_BOOL,X509V3_R_INVALID_BOOLEAN_STRING);
	X509V3_conf_err(value);
	return 0;
}
@@ -192,25 +216,12 @@ int X509V3_get_value_int(value, aint)
CONF_VALUE *value;
ASN1_INTEGER **aint;
{
	BIGNUM *bn = NULL;
	bn = BN_new();
	if(!value->value) {
		X509V3err(X509V3_F_X509V3_GET_VALUE_INT,X509V3_R_INVALID_NULL_VALUE);
	ASN1_INTEGER *itmp;
	if(!(itmp = s2i_ASN1_INTEGER(NULL, value->value))) {
		X509V3_conf_err(value);
		return 0;
	}
	if(!BN_dec2bn(&bn, value->value)) {
		X509V3err(X509V3_F_X509V3_GET_VALUE_INT,X509V3_R_BN_DEC2BN_ERROR);
		X509V3_conf_err(value);
		return 0;
	}

	if(!(*aint = BN_to_ASN1_INTEGER(bn, NULL))) {
		X509V3err(X509V3_F_X509V3_GET_VALUE_INT,X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
		X509V3_conf_err(value);
		return 0;
	}
	BN_free(bn);
	*aint = itmp;
	return 1;
}

+11 −3
Original line number Diff line number Diff line
@@ -70,10 +70,16 @@ static ERR_STRING_DATA X509V3_str_functs[]=
{ERR_PACK(0,X509V3_F_I2S_ASN1_ENUMERATED,0),	"i2s_ASN1_ENUMERATED"},
{ERR_PACK(0,X509V3_F_I2S_ASN1_INTEGER,0),	"i2s_ASN1_INTEGER"},
{ERR_PACK(0,X509V3_F_S2I_ASN1_IA5STRING,0),	"S2I_ASN1_IA5STRING"},
{ERR_PACK(0,X509V3_F_S2I_ASN1_INTEGER,0),	"s2i_ASN1_INTEGER"},
{ERR_PACK(0,X509V3_F_S2I_ASN1_OCTET_STRING,0),	"s2i_ASN1_OCTET_STRING"},
{ERR_PACK(0,X509V3_F_S2I_ASN1_SKEY_ID,0),	"S2I_ASN1_SKEY_ID"},
{ERR_PACK(0,X509V3_F_S2I_S2I_SKEY_ID,0),	"S2I_S2I_SKEY_ID"},
{ERR_PACK(0,X509V3_F_STRING_TO_HEX,0),	"string_to_hex"},
{ERR_PACK(0,X509V3_F_SXNET_ADD_ASC,0),	"SXNET_ADD_ASC"},
{ERR_PACK(0,X509V3_F_SXNET_ADD_ID_INTEGER,0),	"SXNET_add_id_INTEGER"},
{ERR_PACK(0,X509V3_F_SXNET_ADD_ID_ULONG,0),	"SXNET_add_id_ulong"},
{ERR_PACK(0,X509V3_F_SXNET_GET_ID_ASC,0),	"SXNET_get_id_asc"},
{ERR_PACK(0,X509V3_F_SXNET_GET_ID_ULONG,0),	"SXNET_get_id_ulong"},
{ERR_PACK(0,X509V3_F_V2I_ASN1_BIT_STRING,0),	"V2I_ASN1_BIT_STRING"},
{ERR_PACK(0,X509V3_F_V2I_AUTHORITY_KEYID,0),	"V2I_AUTHORITY_KEYID"},
{ERR_PACK(0,X509V3_F_V2I_BASIC_CONSTRAINTS,0),	"V2I_BASIC_CONSTRAINTS"},
@@ -81,13 +87,12 @@ static ERR_STRING_DATA X509V3_str_functs[]=
{ERR_PACK(0,X509V3_F_V2I_GENERAL_NAME,0),	"v2i_GENERAL_NAME"},
{ERR_PACK(0,X509V3_F_V2I_GENERAL_NAMES,0),	"v2i_GENERAL_NAMES"},
{ERR_PACK(0,X509V3_F_V3_GENERIC_EXTENSION,0),	"V3_GENERIC_EXTENSION"},
{ERR_PACK(0,X509V3_F_X509V3_ADD_EXT,0),	"X509V3_ADD_EXT"},
{ERR_PACK(0,X509V3_F_X509V3_EXT_ADD,0),	"X509V3_EXT_add"},
{ERR_PACK(0,X509V3_F_X509V3_ADD_VALUE,0),	"X509V3_add_value"},
{ERR_PACK(0,X509V3_F_X509V3_EXT_ADD_ALIAS,0),	"X509V3_EXT_add_alias"},
{ERR_PACK(0,X509V3_F_X509V3_EXT_CONF,0),	"X509V3_EXT_conf"},
{ERR_PACK(0,X509V3_F_X509V3_GET_VALUE_INT,0),	"X509V3_get_value_int"},
{ERR_PACK(0,X509V3_F_X509V3_PARSE_LIST,0),	"X509V3_parse_list"},
{ERR_PACK(0,X509V3_F_X509V3_VALUE_GET_BOOL,0),	"X509V3_VALUE_GET_BOOL"},
{ERR_PACK(0,X509V3_F_X509V3_GET_VALUE_BOOL,0),	"X509V3_get_value_bool"},
{0,NULL},
	};

@@ -97,6 +102,8 @@ static ERR_STRING_DATA X509V3_str_reasons[]=
{X509V3_R_BAD_OBJECT                     ,"bad object"},
{X509V3_R_BN_DEC2BN_ERROR                ,"bn dec2bn error"},
{X509V3_R_BN_TO_ASN1_INTEGER_ERROR       ,"bn to asn1 integer error"},
{X509V3_R_DUPLICATE_ZONE_ID              ,"duplicate zone id"},
{X509V3_R_ERROR_CONVERTING_ZONE          ,"error converting zone"},
{X509V3_R_ERROR_IN_EXTENSION             ,"error in extension"},
{X509V3_R_EXTENSION_NAME_ERROR           ,"extension name error"},
{X509V3_R_EXTENSION_NOT_FOUND            ,"extension not found"},
@@ -124,6 +131,7 @@ static ERR_STRING_DATA X509V3_str_reasons[]=
{X509V3_R_UNKNOWN_EXTENSION_NAME         ,"unknown extension name"},
{X509V3_R_UNKNOWN_OPTION                 ,"unknown option"},
{X509V3_R_UNSUPPORTED_OPTION             ,"unsupported option"},
{X509V3_R_USER_TOO_LONG                  ,"user too long"},
{0,NULL},
	};

Loading