| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2020-05-15 21:09:49 +08:00
										 |  |  |  * Copyright 2002-2020 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2002-01-05 09:37:16 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-12-06 20:17:34 +08:00
										 |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							| 
									
										
										
										
											2016-05-18 02:51:34 +08:00
										 |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											2002-01-05 09:37:16 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							| 
									
										
										
										
											2019-09-28 06:45:33 +08:00
										 |  |  | #include "crypto/ctype.h"
 | 
					
						
							| 
									
										
										
										
											2002-01-05 09:37:16 +08:00
										 |  |  | #include <openssl/crypto.h>
 | 
					
						
							| 
									
										
										
										
											2015-05-14 22:56:48 +08:00
										 |  |  | #include "internal/cryptlib.h"
 | 
					
						
							| 
									
										
										
										
											2002-01-05 09:37:16 +08:00
										 |  |  | #include <openssl/conf.h>
 | 
					
						
							|  |  |  | #include <openssl/x509.h>
 | 
					
						
							| 
									
										
										
										
											2019-09-28 06:45:33 +08:00
										 |  |  | #include "crypto/asn1.h"
 | 
					
						
							|  |  |  | #include "crypto/objects.h"
 | 
					
						
							| 
									
										
										
										
											2002-01-05 09:37:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Simple ASN1 OID module: add all objects in a given section */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 17:17:50 +08:00
										 |  |  | static int do_create(const char *value, const char *name); | 
					
						
							| 
									
										
										
										
											2004-03-27 21:30:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-19 00:51:05 +08:00
										 |  |  | static int oid_module_init(CONF_IMODULE *md, const CONF *cnf) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  |     const char *oid_section; | 
					
						
							|  |  |  |     STACK_OF(CONF_VALUE) *sktmp; | 
					
						
							|  |  |  |     CONF_VALUE *oval; | 
					
						
							| 
									
										
										
										
											2015-05-07 01:43:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     oid_section = CONF_imodule_get_value(md); | 
					
						
							| 
									
										
										
										
											2015-05-07 01:43:59 +08:00
										 |  |  |     if ((sktmp = NCONF_get_section(cnf, oid_section)) == NULL) { | 
					
						
							| 
									
										
										
										
											2020-11-04 19:23:19 +08:00
										 |  |  |         ERR_raise(ERR_LIB_ASN1, ASN1_R_ERROR_LOADING_SECTION); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     for (i = 0; i < sk_CONF_VALUE_num(sktmp); i++) { | 
					
						
							|  |  |  |         oval = sk_CONF_VALUE_value(sktmp, i); | 
					
						
							|  |  |  |         if (!do_create(oval->value, oval->name)) { | 
					
						
							| 
									
										
										
										
											2020-11-04 19:23:19 +08:00
										 |  |  |             ERR_raise(ERR_LIB_ASN1, ASN1_R_ADDING_OBJECT); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2004-03-06 07:47:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void oid_module_finish(CONF_IMODULE *md) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-01-05 09:37:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | void ASN1_add_oid_module(void) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     CONF_module_add("oid_section", oid_module_init, oid_module_finish); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2004-03-27 21:30:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-16 17:21:50 +08:00
										 |  |  | /*-
 | 
					
						
							|  |  |  |  * Create an OID based on a name value pair. Accept two formats. | 
					
						
							| 
									
										
										
										
											2004-03-27 21:30:14 +08:00
										 |  |  |  * shortname = 1.2.3.4 | 
					
						
							|  |  |  |  * shortname = some long name, 1.2.3.4 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-12 17:17:50 +08:00
										 |  |  | static int do_create(const char *value, const char *name) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     int nid; | 
					
						
							| 
									
										
										
										
											2016-06-12 17:17:50 +08:00
										 |  |  |     const char *ln, *ostr, *p; | 
					
						
							| 
									
										
										
										
											2018-08-18 05:04:03 +08:00
										 |  |  |     char *lntmp = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     p = strrchr(value, ','); | 
					
						
							| 
									
										
										
										
											2018-08-18 05:04:03 +08:00
										 |  |  |     if (p == NULL) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         ln = name; | 
					
						
							|  |  |  |         ostr = value; | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2018-08-18 05:04:03 +08:00
										 |  |  |         ln = value; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         ostr = p + 1; | 
					
						
							| 
									
										
										
										
											2018-08-18 05:04:03 +08:00
										 |  |  |         if (*ostr == '\0') | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             return 0; | 
					
						
							| 
									
										
										
										
											2017-08-21 05:19:17 +08:00
										 |  |  |         while (ossl_isspace(*ostr)) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             ostr++; | 
					
						
							| 
									
										
										
										
											2017-08-21 05:19:17 +08:00
										 |  |  |         while (ossl_isspace(*ln)) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             ln++; | 
					
						
							|  |  |  |         p--; | 
					
						
							| 
									
										
										
										
											2017-08-21 05:19:17 +08:00
										 |  |  |         while (ossl_isspace(*p)) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             if (p == ln) | 
					
						
							|  |  |  |                 return 0; | 
					
						
							|  |  |  |             p--; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         p++; | 
					
						
							| 
									
										
										
										
											2022-09-29 19:57:34 +08:00
										 |  |  |         if ((lntmp = OPENSSL_malloc((p - ln) + 1)) == NULL) | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         memcpy(lntmp, ln, p - ln); | 
					
						
							| 
									
										
										
										
											2018-08-18 05:04:03 +08:00
										 |  |  |         lntmp[p - ln] = '\0'; | 
					
						
							|  |  |  |         ln = lntmp; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-03-27 21:30:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-18 05:04:03 +08:00
										 |  |  |     nid = OBJ_create(ostr, name, ln); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     OPENSSL_free(lntmp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return nid != NID_undef; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | } |