1 /* 2 * Copyright 2002-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include "crypto/ctype.h" 12 #include <openssl/crypto.h> 13 #include "internal/cryptlib.h" 14 #include <openssl/conf.h> 15 #include <openssl/x509.h> 16 #include "crypto/asn1.h" 17 #include "crypto/objects.h" 18 19 /* Simple ASN1 OID module: add all objects in a given section */ 20 21 static int do_create(const char *value, const char *name); 22 23 static int oid_module_init(CONF_IMODULE *md, const CONF *cnf) 24 { 25 int i; 26 const char *oid_section; 27 STACK_OF(CONF_VALUE) *sktmp; 28 CONF_VALUE *oval; 29 30 oid_section = CONF_imodule_get_value(md); 31 if ((sktmp = NCONF_get_section(cnf, oid_section)) == NULL) { 32 ASN1err(ASN1_F_OID_MODULE_INIT, ASN1_R_ERROR_LOADING_SECTION); 33 return 0; 34 } 35 for (i = 0; i < sk_CONF_VALUE_num(sktmp); i++) { 36 oval = sk_CONF_VALUE_value(sktmp, i); 37 if (!do_create(oval->value, oval->name)) { 38 ASN1err(ASN1_F_OID_MODULE_INIT, ASN1_R_ADDING_OBJECT); 39 return 0; 40 } 41 } 42 return 1; 43 } 44 45 static void oid_module_finish(CONF_IMODULE *md) 46 { 47 } 48 49 void ASN1_add_oid_module(void) 50 { 51 CONF_module_add("oid_section", oid_module_init, oid_module_finish); 52 } 53 54 /*- 55 * Create an OID based on a name value pair. Accept two formats. 56 * shortname = 1.2.3.4 57 * shortname = some long name, 1.2.3.4 58 */ 59 60 static int do_create(const char *value, const char *name) 61 { 62 int nid; 63 const char *ln, *ostr, *p; 64 char *lntmp = NULL; 65 66 p = strrchr(value, ','); 67 if (p == NULL) { 68 ln = name; 69 ostr = value; 70 } else { 71 ln = value; 72 ostr = p + 1; 73 if (*ostr == '\0') 74 return 0; 75 while (ossl_isspace(*ostr)) 76 ostr++; 77 while (ossl_isspace(*ln)) 78 ln++; 79 p--; 80 while (ossl_isspace(*p)) { 81 if (p == ln) 82 return 0; 83 p--; 84 } 85 p++; 86 if ((lntmp = OPENSSL_malloc((p - ln) + 1)) == NULL) { 87 ASN1err(ASN1_F_DO_CREATE, ERR_R_MALLOC_FAILURE); 88 return 0; 89 } 90 memcpy(lntmp, ln, p - ln); 91 lntmp[p - ln] = '\0'; 92 ln = lntmp; 93 } 94 95 nid = OBJ_create(ostr, name, ln); 96 97 OPENSSL_free(lntmp); 98 99 return nid != NID_undef; 100 } 101