18edacedfSDaniel Fojt /* $OpenBSD: x509_sxnet.c,v 1.1 2020/06/04 15:19:32 jsing Exp $ */
28edacedfSDaniel Fojt /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
38edacedfSDaniel Fojt  * project 1999.
48edacedfSDaniel Fojt  */
58edacedfSDaniel Fojt /* ====================================================================
68edacedfSDaniel Fojt  * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
78edacedfSDaniel Fojt  *
88edacedfSDaniel Fojt  * Redistribution and use in source and binary forms, with or without
98edacedfSDaniel Fojt  * modification, are permitted provided that the following conditions
108edacedfSDaniel Fojt  * are met:
118edacedfSDaniel Fojt  *
128edacedfSDaniel Fojt  * 1. Redistributions of source code must retain the above copyright
138edacedfSDaniel Fojt  *    notice, this list of conditions and the following disclaimer.
148edacedfSDaniel Fojt  *
158edacedfSDaniel Fojt  * 2. Redistributions in binary form must reproduce the above copyright
168edacedfSDaniel Fojt  *    notice, this list of conditions and the following disclaimer in
178edacedfSDaniel Fojt  *    the documentation and/or other materials provided with the
188edacedfSDaniel Fojt  *    distribution.
198edacedfSDaniel Fojt  *
208edacedfSDaniel Fojt  * 3. All advertising materials mentioning features or use of this
218edacedfSDaniel Fojt  *    software must display the following acknowledgment:
228edacedfSDaniel Fojt  *    "This product includes software developed by the OpenSSL Project
238edacedfSDaniel Fojt  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
248edacedfSDaniel Fojt  *
258edacedfSDaniel Fojt  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
268edacedfSDaniel Fojt  *    endorse or promote products derived from this software without
278edacedfSDaniel Fojt  *    prior written permission. For written permission, please contact
288edacedfSDaniel Fojt  *    licensing@OpenSSL.org.
298edacedfSDaniel Fojt  *
308edacedfSDaniel Fojt  * 5. Products derived from this software may not be called "OpenSSL"
318edacedfSDaniel Fojt  *    nor may "OpenSSL" appear in their names without prior written
328edacedfSDaniel Fojt  *    permission of the OpenSSL Project.
338edacedfSDaniel Fojt  *
348edacedfSDaniel Fojt  * 6. Redistributions of any form whatsoever must retain the following
358edacedfSDaniel Fojt  *    acknowledgment:
368edacedfSDaniel Fojt  *    "This product includes software developed by the OpenSSL Project
378edacedfSDaniel Fojt  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
388edacedfSDaniel Fojt  *
398edacedfSDaniel Fojt  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
408edacedfSDaniel Fojt  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
418edacedfSDaniel Fojt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
428edacedfSDaniel Fojt  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
438edacedfSDaniel Fojt  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
448edacedfSDaniel Fojt  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
458edacedfSDaniel Fojt  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
468edacedfSDaniel Fojt  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
478edacedfSDaniel Fojt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
488edacedfSDaniel Fojt  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
498edacedfSDaniel Fojt  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
508edacedfSDaniel Fojt  * OF THE POSSIBILITY OF SUCH DAMAGE.
518edacedfSDaniel Fojt  * ====================================================================
528edacedfSDaniel Fojt  *
538edacedfSDaniel Fojt  * This product includes cryptographic software written by Eric Young
548edacedfSDaniel Fojt  * (eay@cryptsoft.com).  This product includes software written by Tim
558edacedfSDaniel Fojt  * Hudson (tjh@cryptsoft.com).
568edacedfSDaniel Fojt  *
578edacedfSDaniel Fojt  */
588edacedfSDaniel Fojt 
598edacedfSDaniel Fojt #include <stdio.h>
608edacedfSDaniel Fojt #include <string.h>
618edacedfSDaniel Fojt 
628edacedfSDaniel Fojt #include <openssl/asn1.h>
638edacedfSDaniel Fojt #include <openssl/asn1t.h>
648edacedfSDaniel Fojt #include <openssl/conf.h>
658edacedfSDaniel Fojt #include <openssl/err.h>
668edacedfSDaniel Fojt #include <openssl/x509v3.h>
678edacedfSDaniel Fojt 
688edacedfSDaniel Fojt /* Support for Thawte strong extranet extension */
698edacedfSDaniel Fojt 
708edacedfSDaniel Fojt #define SXNET_TEST
718edacedfSDaniel Fojt 
728edacedfSDaniel Fojt static int sxnet_i2r(X509V3_EXT_METHOD *method, SXNET *sx, BIO *out,
738edacedfSDaniel Fojt     int indent);
748edacedfSDaniel Fojt #ifdef SXNET_TEST
758edacedfSDaniel Fojt static SXNET * sxnet_v2i(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
768edacedfSDaniel Fojt     STACK_OF(CONF_VALUE) *nval);
778edacedfSDaniel Fojt #endif
788edacedfSDaniel Fojt 
798edacedfSDaniel Fojt const X509V3_EXT_METHOD v3_sxnet = {
808edacedfSDaniel Fojt 	.ext_nid = NID_sxnet,
818edacedfSDaniel Fojt 	.ext_flags = X509V3_EXT_MULTILINE,
828edacedfSDaniel Fojt 	.it = &SXNET_it,
838edacedfSDaniel Fojt 	.ext_new = NULL,
848edacedfSDaniel Fojt 	.ext_free = NULL,
858edacedfSDaniel Fojt 	.d2i = NULL,
868edacedfSDaniel Fojt 	.i2d = NULL,
878edacedfSDaniel Fojt 	.i2s = NULL,
888edacedfSDaniel Fojt 	.s2i = NULL,
898edacedfSDaniel Fojt 	.i2v = NULL,
908edacedfSDaniel Fojt #ifdef SXNET_TEST
918edacedfSDaniel Fojt 	.v2i = (X509V3_EXT_V2I)sxnet_v2i,
928edacedfSDaniel Fojt #else
938edacedfSDaniel Fojt 	.v2i = NULL,
948edacedfSDaniel Fojt #endif
958edacedfSDaniel Fojt 	.i2r = (X509V3_EXT_I2R)sxnet_i2r,
968edacedfSDaniel Fojt 	.r2i = NULL,
978edacedfSDaniel Fojt 	.usr_data = NULL,
988edacedfSDaniel Fojt };
998edacedfSDaniel Fojt 
1008edacedfSDaniel Fojt static const ASN1_TEMPLATE SXNETID_seq_tt[] = {
1018edacedfSDaniel Fojt 	{
1028edacedfSDaniel Fojt 		.flags = 0,
1038edacedfSDaniel Fojt 		.tag = 0,
1048edacedfSDaniel Fojt 		.offset = offsetof(SXNETID, zone),
1058edacedfSDaniel Fojt 		.field_name = "zone",
1068edacedfSDaniel Fojt 		.item = &ASN1_INTEGER_it,
1078edacedfSDaniel Fojt 	},
1088edacedfSDaniel Fojt 	{
1098edacedfSDaniel Fojt 		.flags = 0,
1108edacedfSDaniel Fojt 		.tag = 0,
1118edacedfSDaniel Fojt 		.offset = offsetof(SXNETID, user),
1128edacedfSDaniel Fojt 		.field_name = "user",
1138edacedfSDaniel Fojt 		.item = &ASN1_OCTET_STRING_it,
1148edacedfSDaniel Fojt 	},
1158edacedfSDaniel Fojt };
1168edacedfSDaniel Fojt 
1178edacedfSDaniel Fojt const ASN1_ITEM SXNETID_it = {
1188edacedfSDaniel Fojt 	.itype = ASN1_ITYPE_SEQUENCE,
1198edacedfSDaniel Fojt 	.utype = V_ASN1_SEQUENCE,
1208edacedfSDaniel Fojt 	.templates = SXNETID_seq_tt,
1218edacedfSDaniel Fojt 	.tcount = sizeof(SXNETID_seq_tt) / sizeof(ASN1_TEMPLATE),
1228edacedfSDaniel Fojt 	.funcs = NULL,
1238edacedfSDaniel Fojt 	.size = sizeof(SXNETID),
1248edacedfSDaniel Fojt 	.sname = "SXNETID",
1258edacedfSDaniel Fojt };
1268edacedfSDaniel Fojt 
1278edacedfSDaniel Fojt 
1288edacedfSDaniel Fojt SXNETID *
d2i_SXNETID(SXNETID ** a,const unsigned char ** in,long len)1298edacedfSDaniel Fojt d2i_SXNETID(SXNETID **a, const unsigned char **in, long len)
1308edacedfSDaniel Fojt {
1318edacedfSDaniel Fojt 	return (SXNETID *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
1328edacedfSDaniel Fojt 	    &SXNETID_it);
1338edacedfSDaniel Fojt }
1348edacedfSDaniel Fojt 
1358edacedfSDaniel Fojt int
i2d_SXNETID(SXNETID * a,unsigned char ** out)1368edacedfSDaniel Fojt i2d_SXNETID(SXNETID *a, unsigned char **out)
1378edacedfSDaniel Fojt {
1388edacedfSDaniel Fojt 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &SXNETID_it);
1398edacedfSDaniel Fojt }
1408edacedfSDaniel Fojt 
1418edacedfSDaniel Fojt SXNETID *
SXNETID_new(void)1428edacedfSDaniel Fojt SXNETID_new(void)
1438edacedfSDaniel Fojt {
1448edacedfSDaniel Fojt 	return (SXNETID *)ASN1_item_new(&SXNETID_it);
1458edacedfSDaniel Fojt }
1468edacedfSDaniel Fojt 
1478edacedfSDaniel Fojt void
SXNETID_free(SXNETID * a)1488edacedfSDaniel Fojt SXNETID_free(SXNETID *a)
1498edacedfSDaniel Fojt {
1508edacedfSDaniel Fojt 	ASN1_item_free((ASN1_VALUE *)a, &SXNETID_it);
1518edacedfSDaniel Fojt }
1528edacedfSDaniel Fojt 
1538edacedfSDaniel Fojt static const ASN1_TEMPLATE SXNET_seq_tt[] = {
1548edacedfSDaniel Fojt 	{
1558edacedfSDaniel Fojt 		.flags = 0,
1568edacedfSDaniel Fojt 		.tag = 0,
1578edacedfSDaniel Fojt 		.offset = offsetof(SXNET, version),
1588edacedfSDaniel Fojt 		.field_name = "version",
1598edacedfSDaniel Fojt 		.item = &ASN1_INTEGER_it,
1608edacedfSDaniel Fojt 	},
1618edacedfSDaniel Fojt 	{
1628edacedfSDaniel Fojt 		.flags = ASN1_TFLG_SEQUENCE_OF,
1638edacedfSDaniel Fojt 		.tag = 0,
1648edacedfSDaniel Fojt 		.offset = offsetof(SXNET, ids),
1658edacedfSDaniel Fojt 		.field_name = "ids",
1668edacedfSDaniel Fojt 		.item = &SXNETID_it,
1678edacedfSDaniel Fojt 	},
1688edacedfSDaniel Fojt };
1698edacedfSDaniel Fojt 
1708edacedfSDaniel Fojt const ASN1_ITEM SXNET_it = {
1718edacedfSDaniel Fojt 	.itype = ASN1_ITYPE_SEQUENCE,
1728edacedfSDaniel Fojt 	.utype = V_ASN1_SEQUENCE,
1738edacedfSDaniel Fojt 	.templates = SXNET_seq_tt,
1748edacedfSDaniel Fojt 	.tcount = sizeof(SXNET_seq_tt) / sizeof(ASN1_TEMPLATE),
1758edacedfSDaniel Fojt 	.funcs = NULL,
1768edacedfSDaniel Fojt 	.size = sizeof(SXNET),
1778edacedfSDaniel Fojt 	.sname = "SXNET",
1788edacedfSDaniel Fojt };
1798edacedfSDaniel Fojt 
1808edacedfSDaniel Fojt 
1818edacedfSDaniel Fojt SXNET *
d2i_SXNET(SXNET ** a,const unsigned char ** in,long len)1828edacedfSDaniel Fojt d2i_SXNET(SXNET **a, const unsigned char **in, long len)
1838edacedfSDaniel Fojt {
1848edacedfSDaniel Fojt 	return (SXNET *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
1858edacedfSDaniel Fojt 	    &SXNET_it);
1868edacedfSDaniel Fojt }
1878edacedfSDaniel Fojt 
1888edacedfSDaniel Fojt int
i2d_SXNET(SXNET * a,unsigned char ** out)1898edacedfSDaniel Fojt i2d_SXNET(SXNET *a, unsigned char **out)
1908edacedfSDaniel Fojt {
1918edacedfSDaniel Fojt 	return ASN1_item_i2d((ASN1_VALUE *)a, out, &SXNET_it);
1928edacedfSDaniel Fojt }
1938edacedfSDaniel Fojt 
1948edacedfSDaniel Fojt SXNET *
SXNET_new(void)1958edacedfSDaniel Fojt SXNET_new(void)
1968edacedfSDaniel Fojt {
1978edacedfSDaniel Fojt 	return (SXNET *)ASN1_item_new(&SXNET_it);
1988edacedfSDaniel Fojt }
1998edacedfSDaniel Fojt 
2008edacedfSDaniel Fojt void
SXNET_free(SXNET * a)2018edacedfSDaniel Fojt SXNET_free(SXNET *a)
2028edacedfSDaniel Fojt {
2038edacedfSDaniel Fojt 	ASN1_item_free((ASN1_VALUE *)a, &SXNET_it);
2048edacedfSDaniel Fojt }
2058edacedfSDaniel Fojt 
2068edacedfSDaniel Fojt static int
sxnet_i2r(X509V3_EXT_METHOD * method,SXNET * sx,BIO * out,int indent)2078edacedfSDaniel Fojt sxnet_i2r(X509V3_EXT_METHOD *method, SXNET *sx, BIO *out, int indent)
2088edacedfSDaniel Fojt {
2098edacedfSDaniel Fojt 	long v;
2108edacedfSDaniel Fojt 	char *tmp;
2118edacedfSDaniel Fojt 	SXNETID *id;
2128edacedfSDaniel Fojt 	int i;
2138edacedfSDaniel Fojt 
2148edacedfSDaniel Fojt 	v = ASN1_INTEGER_get(sx->version);
2158edacedfSDaniel Fojt 	BIO_printf(out, "%*sVersion: %ld (0x%lX)", indent, "", v + 1, v);
2168edacedfSDaniel Fojt 	for (i = 0; i < sk_SXNETID_num(sx->ids); i++) {
2178edacedfSDaniel Fojt 		id = sk_SXNETID_value(sx->ids, i);
2188edacedfSDaniel Fojt 		tmp = i2s_ASN1_INTEGER(NULL, id->zone);
2198edacedfSDaniel Fojt 		BIO_printf(out, "\n%*sZone: %s, User: ", indent, "", tmp);
2208edacedfSDaniel Fojt 		free(tmp);
2218edacedfSDaniel Fojt 		ASN1_STRING_print(out, id->user);
2228edacedfSDaniel Fojt 	}
2238edacedfSDaniel Fojt 	return 1;
2248edacedfSDaniel Fojt }
2258edacedfSDaniel Fojt 
2268edacedfSDaniel Fojt #ifdef SXNET_TEST
2278edacedfSDaniel Fojt 
2288edacedfSDaniel Fojt /* NBB: this is used for testing only. It should *not* be used for anything
2298edacedfSDaniel Fojt  * else because it will just take static IDs from the configuration file and
2308edacedfSDaniel Fojt  * they should really be separate values for each user.
2318edacedfSDaniel Fojt  */
2328edacedfSDaniel Fojt 
2338edacedfSDaniel Fojt static SXNET *
sxnet_v2i(X509V3_EXT_METHOD * method,X509V3_CTX * ctx,STACK_OF (CONF_VALUE)* nval)2348edacedfSDaniel Fojt sxnet_v2i(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
2358edacedfSDaniel Fojt     STACK_OF(CONF_VALUE) *nval)
2368edacedfSDaniel Fojt {
2378edacedfSDaniel Fojt 	CONF_VALUE *cnf;
2388edacedfSDaniel Fojt 	SXNET *sx = NULL;
2398edacedfSDaniel Fojt 	int i;
2408edacedfSDaniel Fojt 
2418edacedfSDaniel Fojt 	for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
2428edacedfSDaniel Fojt 		cnf = sk_CONF_VALUE_value(nval, i);
2438edacedfSDaniel Fojt 		if (!SXNET_add_id_asc(&sx, cnf->name, cnf->value, -1))
2448edacedfSDaniel Fojt 			return NULL;
2458edacedfSDaniel Fojt 	}
2468edacedfSDaniel Fojt 	return sx;
2478edacedfSDaniel Fojt }
2488edacedfSDaniel Fojt 
2498edacedfSDaniel Fojt #endif
2508edacedfSDaniel Fojt 
2518edacedfSDaniel Fojt /* Strong Extranet utility functions */
2528edacedfSDaniel Fojt 
2538edacedfSDaniel Fojt /* Add an id given the zone as an ASCII number */
2548edacedfSDaniel Fojt 
2558edacedfSDaniel Fojt int
SXNET_add_id_asc(SXNET ** psx,const char * zone,const char * user,int userlen)2568edacedfSDaniel Fojt SXNET_add_id_asc(SXNET **psx, const char *zone, const char *user, int userlen)
2578edacedfSDaniel Fojt {
2588edacedfSDaniel Fojt 	ASN1_INTEGER *izone = NULL;
2598edacedfSDaniel Fojt 
2608edacedfSDaniel Fojt 	if (!(izone = s2i_ASN1_INTEGER(NULL, zone))) {
2618edacedfSDaniel Fojt 		X509V3error(X509V3_R_ERROR_CONVERTING_ZONE);
2628edacedfSDaniel Fojt 		return 0;
2638edacedfSDaniel Fojt 	}
2648edacedfSDaniel Fojt 	return SXNET_add_id_INTEGER(psx, izone, user, userlen);
2658edacedfSDaniel Fojt }
2668edacedfSDaniel Fojt 
2678edacedfSDaniel Fojt /* Add an id given the zone as an unsigned long */
2688edacedfSDaniel Fojt 
2698edacedfSDaniel Fojt int
SXNET_add_id_ulong(SXNET ** psx,unsigned long lzone,const char * user,int userlen)2708edacedfSDaniel Fojt SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, const char *user,
2718edacedfSDaniel Fojt     int userlen)
2728edacedfSDaniel Fojt {
2738edacedfSDaniel Fojt 	ASN1_INTEGER *izone = NULL;
2748edacedfSDaniel Fojt 
2758edacedfSDaniel Fojt 	if (!(izone = ASN1_INTEGER_new()) ||
2768edacedfSDaniel Fojt 	    !ASN1_INTEGER_set(izone, lzone)) {
2778edacedfSDaniel Fojt 		X509V3error(ERR_R_MALLOC_FAILURE);
2788edacedfSDaniel Fojt 		ASN1_INTEGER_free(izone);
2798edacedfSDaniel Fojt 		return 0;
2808edacedfSDaniel Fojt 	}
2818edacedfSDaniel Fojt 	return SXNET_add_id_INTEGER(psx, izone, user, userlen);
2828edacedfSDaniel Fojt }
2838edacedfSDaniel Fojt 
2848edacedfSDaniel Fojt /* Add an id given the zone as an ASN1_INTEGER.
2858edacedfSDaniel Fojt  * Note this version uses the passed integer and doesn't make a copy so don't
2868edacedfSDaniel Fojt  * free it up afterwards.
2878edacedfSDaniel Fojt  */
2888edacedfSDaniel Fojt 
2898edacedfSDaniel Fojt int
SXNET_add_id_INTEGER(SXNET ** psx,ASN1_INTEGER * zone,const char * user,int userlen)2908edacedfSDaniel Fojt SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *zone, const char *user,
2918edacedfSDaniel Fojt     int userlen)
2928edacedfSDaniel Fojt {
2938edacedfSDaniel Fojt 	SXNET *sx = NULL;
2948edacedfSDaniel Fojt 	SXNETID *id = NULL;
2958edacedfSDaniel Fojt 
2968edacedfSDaniel Fojt 	if (!psx || !zone || !user) {
2978edacedfSDaniel Fojt 		X509V3error(X509V3_R_INVALID_NULL_ARGUMENT);
2988edacedfSDaniel Fojt 		return 0;
2998edacedfSDaniel Fojt 	}
3008edacedfSDaniel Fojt 	if (userlen == -1)
3018edacedfSDaniel Fojt 		userlen = strlen(user);
3028edacedfSDaniel Fojt 	if (userlen > 64) {
3038edacedfSDaniel Fojt 		X509V3error(X509V3_R_USER_TOO_LONG);
3048edacedfSDaniel Fojt 		return 0;
3058edacedfSDaniel Fojt 	}
3068edacedfSDaniel Fojt 	if (!*psx) {
3078edacedfSDaniel Fojt 		if (!(sx = SXNET_new()))
3088edacedfSDaniel Fojt 			goto err;
3098edacedfSDaniel Fojt 		if (!ASN1_INTEGER_set(sx->version, 0))
3108edacedfSDaniel Fojt 			goto err;
3118edacedfSDaniel Fojt 		*psx = sx;
3128edacedfSDaniel Fojt 	} else
3138edacedfSDaniel Fojt 		sx = *psx;
3148edacedfSDaniel Fojt 	if (SXNET_get_id_INTEGER(sx, zone)) {
3158edacedfSDaniel Fojt 		X509V3error(X509V3_R_DUPLICATE_ZONE_ID);
3168edacedfSDaniel Fojt 		return 0;
3178edacedfSDaniel Fojt 	}
3188edacedfSDaniel Fojt 
3198edacedfSDaniel Fojt 	if (!(id = SXNETID_new()))
3208edacedfSDaniel Fojt 		goto err;
3218edacedfSDaniel Fojt 	if (userlen == -1)
3228edacedfSDaniel Fojt 		userlen = strlen(user);
3238edacedfSDaniel Fojt 
3248edacedfSDaniel Fojt 	if (!ASN1_STRING_set(id->user, user, userlen))
3258edacedfSDaniel Fojt 		goto err;
3268edacedfSDaniel Fojt 	if (!sk_SXNETID_push(sx->ids, id))
3278edacedfSDaniel Fojt 		goto err;
3288edacedfSDaniel Fojt 	id->zone = zone;
3298edacedfSDaniel Fojt 	return 1;
3308edacedfSDaniel Fojt 
3318edacedfSDaniel Fojt err:
3328edacedfSDaniel Fojt 	X509V3error(ERR_R_MALLOC_FAILURE);
3338edacedfSDaniel Fojt 	SXNETID_free(id);
3348edacedfSDaniel Fojt 	SXNET_free(sx);
3358edacedfSDaniel Fojt 	*psx = NULL;
3368edacedfSDaniel Fojt 	return 0;
3378edacedfSDaniel Fojt }
3388edacedfSDaniel Fojt 
3398edacedfSDaniel Fojt ASN1_OCTET_STRING *
SXNET_get_id_asc(SXNET * sx,const char * zone)3408edacedfSDaniel Fojt SXNET_get_id_asc(SXNET *sx, const char *zone)
3418edacedfSDaniel Fojt {
3428edacedfSDaniel Fojt 	ASN1_INTEGER *izone = NULL;
3438edacedfSDaniel Fojt 	ASN1_OCTET_STRING *oct;
3448edacedfSDaniel Fojt 
3458edacedfSDaniel Fojt 	if (!(izone = s2i_ASN1_INTEGER(NULL, zone))) {
3468edacedfSDaniel Fojt 		X509V3error(X509V3_R_ERROR_CONVERTING_ZONE);
3478edacedfSDaniel Fojt 		return NULL;
3488edacedfSDaniel Fojt 	}
3498edacedfSDaniel Fojt 	oct = SXNET_get_id_INTEGER(sx, izone);
3508edacedfSDaniel Fojt 	ASN1_INTEGER_free(izone);
3518edacedfSDaniel Fojt 	return oct;
3528edacedfSDaniel Fojt }
3538edacedfSDaniel Fojt 
3548edacedfSDaniel Fojt ASN1_OCTET_STRING *
SXNET_get_id_ulong(SXNET * sx,unsigned long lzone)3558edacedfSDaniel Fojt SXNET_get_id_ulong(SXNET *sx, unsigned long lzone)
3568edacedfSDaniel Fojt {
3578edacedfSDaniel Fojt 	ASN1_INTEGER *izone = NULL;
3588edacedfSDaniel Fojt 	ASN1_OCTET_STRING *oct;
3598edacedfSDaniel Fojt 
3608edacedfSDaniel Fojt 	if (!(izone = ASN1_INTEGER_new()) ||
3618edacedfSDaniel Fojt 	    !ASN1_INTEGER_set(izone, lzone)) {
3628edacedfSDaniel Fojt 		X509V3error(ERR_R_MALLOC_FAILURE);
3638edacedfSDaniel Fojt 		ASN1_INTEGER_free(izone);
3648edacedfSDaniel Fojt 		return NULL;
3658edacedfSDaniel Fojt 	}
3668edacedfSDaniel Fojt 	oct = SXNET_get_id_INTEGER(sx, izone);
3678edacedfSDaniel Fojt 	ASN1_INTEGER_free(izone);
3688edacedfSDaniel Fojt 	return oct;
3698edacedfSDaniel Fojt }
3708edacedfSDaniel Fojt 
3718edacedfSDaniel Fojt ASN1_OCTET_STRING *
SXNET_get_id_INTEGER(SXNET * sx,ASN1_INTEGER * zone)3728edacedfSDaniel Fojt SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone)
3738edacedfSDaniel Fojt {
3748edacedfSDaniel Fojt 	SXNETID *id;
3758edacedfSDaniel Fojt 	int i;
3768edacedfSDaniel Fojt 
3778edacedfSDaniel Fojt 	for (i = 0; i < sk_SXNETID_num(sx->ids); i++) {
3788edacedfSDaniel Fojt 		id = sk_SXNETID_value(sx->ids, i);
3798edacedfSDaniel Fojt 		if (!ASN1_INTEGER_cmp(id->zone, zone))
3808edacedfSDaniel Fojt 			return id->user;
3818edacedfSDaniel Fojt 	}
3828edacedfSDaniel Fojt 	return NULL;
3838edacedfSDaniel Fojt }
384