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