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