xref: /onnv-gate/usr/src/common/openssl/crypto/asn1/asn_moid.c (revision 2139:6243c3338933)
10Sstevel@tonic-gate /* asn_moid.c */
20Sstevel@tonic-gate /* Written by Stephen Henson (shenson@bigfoot.com) for the OpenSSL
30Sstevel@tonic-gate  * project 2001.
40Sstevel@tonic-gate  */
50Sstevel@tonic-gate /* ====================================================================
6*2139Sjp161948  * Copyright (c) 2001-2004 The OpenSSL Project.  All rights reserved.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * Redistribution and use in source and binary forms, with or without
90Sstevel@tonic-gate  * modification, are permitted provided that the following conditions
100Sstevel@tonic-gate  * are met:
110Sstevel@tonic-gate  *
120Sstevel@tonic-gate  * 1. Redistributions of source code must retain the above copyright
130Sstevel@tonic-gate  *    notice, this list of conditions and the following disclaimer.
140Sstevel@tonic-gate  *
150Sstevel@tonic-gate  * 2. Redistributions in binary form must reproduce the above copyright
160Sstevel@tonic-gate  *    notice, this list of conditions and the following disclaimer in
170Sstevel@tonic-gate  *    the documentation and/or other materials provided with the
180Sstevel@tonic-gate  *    distribution.
190Sstevel@tonic-gate  *
200Sstevel@tonic-gate  * 3. All advertising materials mentioning features or use of this
210Sstevel@tonic-gate  *    software must display the following acknowledgment:
220Sstevel@tonic-gate  *    "This product includes software developed by the OpenSSL Project
230Sstevel@tonic-gate  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
240Sstevel@tonic-gate  *
250Sstevel@tonic-gate  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
260Sstevel@tonic-gate  *    endorse or promote products derived from this software without
270Sstevel@tonic-gate  *    prior written permission. For written permission, please contact
280Sstevel@tonic-gate  *    licensing@OpenSSL.org.
290Sstevel@tonic-gate  *
300Sstevel@tonic-gate  * 5. Products derived from this software may not be called "OpenSSL"
310Sstevel@tonic-gate  *    nor may "OpenSSL" appear in their names without prior written
320Sstevel@tonic-gate  *    permission of the OpenSSL Project.
330Sstevel@tonic-gate  *
340Sstevel@tonic-gate  * 6. Redistributions of any form whatsoever must retain the following
350Sstevel@tonic-gate  *    acknowledgment:
360Sstevel@tonic-gate  *    "This product includes software developed by the OpenSSL Project
370Sstevel@tonic-gate  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
380Sstevel@tonic-gate  *
390Sstevel@tonic-gate  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
400Sstevel@tonic-gate  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
410Sstevel@tonic-gate  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
420Sstevel@tonic-gate  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
430Sstevel@tonic-gate  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
440Sstevel@tonic-gate  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
450Sstevel@tonic-gate  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
460Sstevel@tonic-gate  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
470Sstevel@tonic-gate  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
480Sstevel@tonic-gate  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
490Sstevel@tonic-gate  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
500Sstevel@tonic-gate  * OF THE POSSIBILITY OF SUCH DAMAGE.
510Sstevel@tonic-gate  * ====================================================================
520Sstevel@tonic-gate  *
530Sstevel@tonic-gate  * This product includes cryptographic software written by Eric Young
540Sstevel@tonic-gate  * (eay@cryptsoft.com).  This product includes software written by Tim
550Sstevel@tonic-gate  * Hudson (tjh@cryptsoft.com).
560Sstevel@tonic-gate  *
570Sstevel@tonic-gate  */
580Sstevel@tonic-gate 
590Sstevel@tonic-gate #include <stdio.h>
60*2139Sjp161948 #include <ctype.h>
610Sstevel@tonic-gate #include <openssl/crypto.h>
620Sstevel@tonic-gate #include "cryptlib.h"
630Sstevel@tonic-gate #include <openssl/conf.h>
640Sstevel@tonic-gate #include <openssl/dso.h>
650Sstevel@tonic-gate #include <openssl/x509.h>
660Sstevel@tonic-gate 
670Sstevel@tonic-gate /* Simple ASN1 OID module: add all objects in a given section */
680Sstevel@tonic-gate 
69*2139Sjp161948 static int do_create(char *value, char *name);
70*2139Sjp161948 
oid_module_init(CONF_IMODULE * md,const CONF * cnf)710Sstevel@tonic-gate static int oid_module_init(CONF_IMODULE *md, const CONF *cnf)
720Sstevel@tonic-gate 	{
730Sstevel@tonic-gate 	int i;
740Sstevel@tonic-gate 	const char *oid_section;
750Sstevel@tonic-gate 	STACK_OF(CONF_VALUE) *sktmp;
760Sstevel@tonic-gate 	CONF_VALUE *oval;
770Sstevel@tonic-gate 	oid_section = CONF_imodule_get_value(md);
780Sstevel@tonic-gate 	if(!(sktmp = NCONF_get_section(cnf, oid_section)))
790Sstevel@tonic-gate 		{
800Sstevel@tonic-gate 		ASN1err(ASN1_F_OID_MODULE_INIT, ASN1_R_ERROR_LOADING_SECTION);
810Sstevel@tonic-gate 		return 0;
820Sstevel@tonic-gate 		}
830Sstevel@tonic-gate 	for(i = 0; i < sk_CONF_VALUE_num(sktmp); i++)
840Sstevel@tonic-gate 		{
850Sstevel@tonic-gate 		oval = sk_CONF_VALUE_value(sktmp, i);
86*2139Sjp161948 		if(!do_create(oval->value, oval->name))
870Sstevel@tonic-gate 			{
880Sstevel@tonic-gate 			ASN1err(ASN1_F_OID_MODULE_INIT, ASN1_R_ADDING_OBJECT);
890Sstevel@tonic-gate 			return 0;
900Sstevel@tonic-gate 			}
910Sstevel@tonic-gate 		}
920Sstevel@tonic-gate 	return 1;
930Sstevel@tonic-gate 	}
940Sstevel@tonic-gate 
oid_module_finish(CONF_IMODULE * md)950Sstevel@tonic-gate static void oid_module_finish(CONF_IMODULE *md)
960Sstevel@tonic-gate 	{
970Sstevel@tonic-gate 	OBJ_cleanup();
980Sstevel@tonic-gate 	}
990Sstevel@tonic-gate 
ASN1_add_oid_module(void)1000Sstevel@tonic-gate void ASN1_add_oid_module(void)
1010Sstevel@tonic-gate 	{
1020Sstevel@tonic-gate 	CONF_module_add("oid_section", oid_module_init, oid_module_finish);
1030Sstevel@tonic-gate 	}
104*2139Sjp161948 
105*2139Sjp161948 /* Create an OID based on a name value pair. Accept two formats.
106*2139Sjp161948  * shortname = 1.2.3.4
107*2139Sjp161948  * shortname = some long name, 1.2.3.4
108*2139Sjp161948  */
109*2139Sjp161948 
110*2139Sjp161948 
do_create(char * value,char * name)111*2139Sjp161948 static int do_create(char *value, char *name)
112*2139Sjp161948 	{
113*2139Sjp161948 	int nid;
114*2139Sjp161948 	ASN1_OBJECT *oid;
115*2139Sjp161948 	char *ln, *ostr, *p, *lntmp;
116*2139Sjp161948 	p = strrchr(value, ',');
117*2139Sjp161948 	if (!p)
118*2139Sjp161948 		{
119*2139Sjp161948 		ln = name;
120*2139Sjp161948 		ostr = value;
121*2139Sjp161948 		}
122*2139Sjp161948 	else
123*2139Sjp161948 		{
124*2139Sjp161948 		ln = NULL;
125*2139Sjp161948 		ostr = p + 1;
126*2139Sjp161948 		if (!*ostr)
127*2139Sjp161948 			return 0;
128*2139Sjp161948 		while(isspace((unsigned char)*ostr)) ostr++;
129*2139Sjp161948 		}
130*2139Sjp161948 
131*2139Sjp161948 	nid = OBJ_create(ostr, name, ln);
132*2139Sjp161948 
133*2139Sjp161948 	if (nid == NID_undef)
134*2139Sjp161948 		return 0;
135*2139Sjp161948 
136*2139Sjp161948 	if (p)
137*2139Sjp161948 		{
138*2139Sjp161948 		ln = value;
139*2139Sjp161948 		while(isspace((unsigned char)*ln)) ln++;
140*2139Sjp161948 		p--;
141*2139Sjp161948 		while(isspace((unsigned char)*p))
142*2139Sjp161948 			{
143*2139Sjp161948 			if (p == ln)
144*2139Sjp161948 				return 0;
145*2139Sjp161948 			p--;
146*2139Sjp161948 			}
147*2139Sjp161948 		p++;
148*2139Sjp161948 		lntmp = OPENSSL_malloc((p - ln) + 1);
149*2139Sjp161948 		if (lntmp == NULL)
150*2139Sjp161948 			return 0;
151*2139Sjp161948 		memcpy(lntmp, ln, p - ln);
152*2139Sjp161948 		lntmp[p - ln + 1] = 0;
153*2139Sjp161948 		oid = OBJ_nid2obj(nid);
154*2139Sjp161948 		oid->ln = lntmp;
155*2139Sjp161948 		}
156*2139Sjp161948 
157*2139Sjp161948 	return 1;
158*2139Sjp161948 	}
159*2139Sjp161948 
160*2139Sjp161948 
161