ssl/libcrypto/src/crypto/x509v3/v3_sxnet.c
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 /* v3_sxnet.c */
       
     2 /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL
       
     3  * project 1999.
       
     4  */
       
     5 /* ====================================================================
       
     6  * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
       
     7  *
       
     8  * Redistribution and use in source and binary forms, with or without
       
     9  * modification, are permitted provided that the following conditions
       
    10  * are met:
       
    11  *
       
    12  * 1. Redistributions of source code must retain the above copyright
       
    13  *    notice, this list of conditions and the following disclaimer. 
       
    14  *
       
    15  * 2. Redistributions in binary form must reproduce the above copyright
       
    16  *    notice, this list of conditions and the following disclaimer in
       
    17  *    the documentation and/or other materials provided with the
       
    18  *    distribution.
       
    19  *
       
    20  * 3. All advertising materials mentioning features or use of this
       
    21  *    software must display the following acknowledgment:
       
    22  *    "This product includes software developed by the OpenSSL Project
       
    23  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
       
    24  *
       
    25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
       
    26  *    endorse or promote products derived from this software without
       
    27  *    prior written permission. For written permission, please contact
       
    28  *    licensing@OpenSSL.org.
       
    29  *
       
    30  * 5. Products derived from this software may not be called "OpenSSL"
       
    31  *    nor may "OpenSSL" appear in their names without prior written
       
    32  *    permission of the OpenSSL Project.
       
    33  *
       
    34  * 6. Redistributions of any form whatsoever must retain the following
       
    35  *    acknowledgment:
       
    36  *    "This product includes software developed by the OpenSSL Project
       
    37  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
       
    38  *
       
    39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
       
    40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
       
    43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
    44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
       
    45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
       
    46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       
    47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
       
    48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
       
    49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
       
    50  * OF THE POSSIBILITY OF SUCH DAMAGE.
       
    51  * ====================================================================
       
    52  *
       
    53  * This product includes cryptographic software written by Eric Young
       
    54  * (eay@cryptsoft.com).  This product includes software written by Tim
       
    55  * Hudson (tjh@cryptsoft.com).
       
    56  *
       
    57  */
       
    58  /*
       
    59  © Portions copyright (c) 2006 Nokia Corporation.  All rights reserved.
       
    60  */
       
    61 
       
    62 #include <stdio.h>
       
    63 #include "cryptlib.h"
       
    64 #include <openssl/conf.h>
       
    65 #include <openssl/asn1.h>
       
    66 #include <openssl/asn1t.h>
       
    67 #include <openssl/x509v3.h>
       
    68 #if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__)))
       
    69 #include "libcrypto_wsd_macros.h"
       
    70 #include "libcrypto_wsd.h"
       
    71 #endif
       
    72 
       
    73 
       
    74 /* Support for Thawte strong extranet extension */
       
    75 
       
    76 #define SXNET_TEST
       
    77 
       
    78 static int sxnet_i2r(X509V3_EXT_METHOD *method, SXNET *sx, BIO *out, int indent);
       
    79 #ifdef SXNET_TEST
       
    80 static SXNET * sxnet_v2i(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
       
    81 						STACK_OF(CONF_VALUE) *nval);
       
    82 #endif
       
    83 #ifndef EMULATOR
       
    84 X509V3_EXT_METHOD v3_sxnet = {
       
    85 NID_sxnet, X509V3_EXT_MULTILINE, ASN1_ITEM_ref(SXNET),
       
    86 0,0,0,0,
       
    87 0,0,
       
    88 0, 
       
    89 #ifdef SXNET_TEST
       
    90 (X509V3_EXT_V2I)sxnet_v2i,
       
    91 #else
       
    92 0,
       
    93 #endif
       
    94 (X509V3_EXT_I2R)sxnet_i2r,
       
    95 0,
       
    96 NULL
       
    97 };
       
    98 #else
       
    99 const X509V3_EXT_METHOD v3_sxnet = {
       
   100 NID_sxnet, X509V3_EXT_MULTILINE, ASN1_ITEM_ref(SXNET),
       
   101 0,0,0,0,
       
   102 0,0,
       
   103 0, 
       
   104 #ifdef SXNET_TEST
       
   105 (X509V3_EXT_V2I)sxnet_v2i,
       
   106 #else
       
   107 0,
       
   108 #endif
       
   109 (X509V3_EXT_I2R)sxnet_i2r,
       
   110 0,
       
   111 NULL
       
   112 };
       
   113 #endif
       
   114 
       
   115 ASN1_SEQUENCE(SXNETID) = {
       
   116 	ASN1_SIMPLE(SXNETID, zone, ASN1_INTEGER),
       
   117 	ASN1_SIMPLE(SXNETID, user, ASN1_OCTET_STRING)
       
   118 } ASN1_SEQUENCE_END(SXNETID)
       
   119 
       
   120 IMPLEMENT_ASN1_FUNCTIONS(SXNETID)
       
   121 
       
   122 ASN1_SEQUENCE(SXNET) = {
       
   123 	ASN1_SIMPLE(SXNET, version, ASN1_INTEGER),
       
   124 	ASN1_SEQUENCE_OF(SXNET, ids, SXNETID)
       
   125 } ASN1_SEQUENCE_END(SXNET)
       
   126 
       
   127 IMPLEMENT_ASN1_FUNCTIONS(SXNET)
       
   128 
       
   129 static int sxnet_i2r(X509V3_EXT_METHOD *method, SXNET *sx, BIO *out,
       
   130 	     int indent)
       
   131 {
       
   132 	long v;
       
   133 	char *tmp;
       
   134 	SXNETID *id;
       
   135 	int i;
       
   136 	v = ASN1_INTEGER_get(sx->version);
       
   137 	BIO_printf(out, "%*sVersion: %ld (0x%lX)", indent, "", v + 1, v);
       
   138 	for(i = 0; i < sk_SXNETID_num(sx->ids); i++) {
       
   139 		id = sk_SXNETID_value(sx->ids, i);
       
   140 		tmp = i2s_ASN1_INTEGER(NULL, id->zone);
       
   141 		BIO_printf(out, "\n%*sZone: %s, User: ", indent, "", tmp);
       
   142 		OPENSSL_free(tmp);
       
   143 		M_ASN1_OCTET_STRING_print(out, id->user);
       
   144 	}
       
   145 	return 1;
       
   146 }
       
   147 
       
   148 #ifdef SXNET_TEST
       
   149 
       
   150 /* NBB: this is used for testing only. It should *not* be used for anything
       
   151  * else because it will just take static IDs from the configuration file and
       
   152  * they should really be separate values for each user.
       
   153  */
       
   154 
       
   155 
       
   156 static SXNET * sxnet_v2i(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
       
   157 	     STACK_OF(CONF_VALUE) *nval)
       
   158 {
       
   159 	CONF_VALUE *cnf;
       
   160 	SXNET *sx = NULL;
       
   161 	int i;
       
   162 	for(i = 0; i < sk_CONF_VALUE_num(nval); i++) {
       
   163 		cnf = sk_CONF_VALUE_value(nval, i);
       
   164 		if(!SXNET_add_id_asc(&sx, cnf->name, cnf->value, -1))
       
   165 								 return NULL;
       
   166 	}
       
   167 	return sx;
       
   168 }
       
   169 		
       
   170 	
       
   171 #endif
       
   172 
       
   173 /* Strong Extranet utility functions */
       
   174 
       
   175 /* Add an id given the zone as an ASCII number */
       
   176 
       
   177 EXPORT_C int SXNET_add_id_asc(SXNET **psx, char *zone, char *user,
       
   178 	     int userlen)
       
   179 {
       
   180 	ASN1_INTEGER *izone = NULL;
       
   181 	if(!(izone = s2i_ASN1_INTEGER(NULL, zone))) {
       
   182 		X509V3err(X509V3_F_SXNET_ADD_ID_ASC,X509V3_R_ERROR_CONVERTING_ZONE);
       
   183 		return 0;
       
   184 	}
       
   185 	return SXNET_add_id_INTEGER(psx, izone, user, userlen);
       
   186 }
       
   187 
       
   188 /* Add an id given the zone as an unsigned long */
       
   189 
       
   190 EXPORT_C int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, char *user,
       
   191 	     int userlen)
       
   192 {
       
   193 	ASN1_INTEGER *izone = NULL;
       
   194 	if(!(izone = M_ASN1_INTEGER_new()) || !ASN1_INTEGER_set(izone, lzone)) {
       
   195 		X509V3err(X509V3_F_SXNET_ADD_ID_ULONG,ERR_R_MALLOC_FAILURE);
       
   196 		M_ASN1_INTEGER_free(izone);
       
   197 		return 0;
       
   198 	}
       
   199 	return SXNET_add_id_INTEGER(psx, izone, user, userlen);
       
   200 	
       
   201 }
       
   202 
       
   203 /* Add an id given the zone as an ASN1_INTEGER.
       
   204  * Note this version uses the passed integer and doesn't make a copy so don't
       
   205  * free it up afterwards.
       
   206  */
       
   207 
       
   208 EXPORT_C int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *zone, char *user,
       
   209 	     int userlen)
       
   210 {
       
   211 	SXNET *sx = NULL;
       
   212 	SXNETID *id = NULL;
       
   213 	if(!psx || !zone || !user) {
       
   214 		X509V3err(X509V3_F_SXNET_ADD_ID_INTEGER,X509V3_R_INVALID_NULL_ARGUMENT);
       
   215 		return 0;
       
   216 	}
       
   217 	if(userlen == -1) userlen = strlen(user);
       
   218 	if(userlen > 64) {
       
   219 		X509V3err(X509V3_F_SXNET_ADD_ID_INTEGER,X509V3_R_USER_TOO_LONG);
       
   220 		return 0;
       
   221 	}
       
   222 	if(!*psx) {
       
   223 		if(!(sx = SXNET_new())) goto err;
       
   224 		if(!ASN1_INTEGER_set(sx->version, 0)) goto err;
       
   225 		*psx = sx;
       
   226 	} else sx = *psx;
       
   227 	if(SXNET_get_id_INTEGER(sx, zone)) {
       
   228 		X509V3err(X509V3_F_SXNET_ADD_ID_INTEGER,X509V3_R_DUPLICATE_ZONE_ID);
       
   229 		return 0;
       
   230 	}
       
   231 
       
   232 	if(!(id = SXNETID_new())) goto err;
       
   233 	if(userlen == -1) userlen = strlen(user);
       
   234 		
       
   235 	if(!M_ASN1_OCTET_STRING_set(id->user, user, userlen)) goto err;
       
   236 	if(!sk_SXNETID_push(sx->ids, id)) goto err;
       
   237 	id->zone = zone;
       
   238 	return 1;
       
   239 	
       
   240 	err:
       
   241 	X509V3err(X509V3_F_SXNET_ADD_ID_INTEGER,ERR_R_MALLOC_FAILURE);
       
   242 	SXNETID_free(id);
       
   243 	SXNET_free(sx);
       
   244 	*psx = NULL;
       
   245 	return 0;
       
   246 }
       
   247 
       
   248 EXPORT_C ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, char *zone)
       
   249 {
       
   250 	ASN1_INTEGER *izone = NULL;
       
   251 	ASN1_OCTET_STRING *oct;
       
   252 	if(!(izone = s2i_ASN1_INTEGER(NULL, zone))) {
       
   253 		X509V3err(X509V3_F_SXNET_GET_ID_ASC,X509V3_R_ERROR_CONVERTING_ZONE);
       
   254 		return NULL;
       
   255 	}
       
   256 	oct = SXNET_get_id_INTEGER(sx, izone);
       
   257 	M_ASN1_INTEGER_free(izone);
       
   258 	return oct;
       
   259 }
       
   260 
       
   261 EXPORT_C ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone)
       
   262 {
       
   263 	ASN1_INTEGER *izone = NULL;
       
   264 	ASN1_OCTET_STRING *oct;
       
   265 	if(!(izone = M_ASN1_INTEGER_new()) || !ASN1_INTEGER_set(izone, lzone)) {
       
   266 		X509V3err(X509V3_F_SXNET_GET_ID_ULONG,ERR_R_MALLOC_FAILURE);
       
   267 		M_ASN1_INTEGER_free(izone);
       
   268 		return NULL;
       
   269 	}
       
   270 	oct = SXNET_get_id_INTEGER(sx, izone);
       
   271 	M_ASN1_INTEGER_free(izone);
       
   272 	return oct;
       
   273 }
       
   274 
       
   275 EXPORT_C ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone)
       
   276 {
       
   277 	SXNETID *id;
       
   278 	int i;
       
   279 	for(i = 0; i < sk_SXNETID_num(sx->ids); i++) {
       
   280 		id = sk_SXNETID_value(sx->ids, i);
       
   281 		if(!M_ASN1_INTEGER_cmp(id->zone, zone)) return id->user;
       
   282 	}
       
   283 	return NULL;
       
   284 }
       
   285 
       
   286 IMPLEMENT_STACK_OF(SXNETID)
       
   287 IMPLEMENT_ASN1_SET_OF(SXNETID)