Add suppot for ASCII with CRLF canonicalisation.
[openssl.git] / crypto / asn1 / asn_mstbl.c
1 /* asn_mstbl.c */
2 /* Written by Stephen Henson (steve@openssl.org) for the OpenSSL
3  * project 2012.
4  */
5 /* ====================================================================
6  * Copyright (c) 2012 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  */
54
55 #include <stdio.h>
56 #include <ctype.h>
57 #include <openssl/crypto.h>
58 #include "cryptlib.h"
59 #include <openssl/conf.h>
60 #include <openssl/x509v3.h>
61
62 /* Multi string module: add table enstries from a given section */
63
64 static int do_tcreate(char *value, char *name);
65
66 static int stbl_module_init(CONF_IMODULE *md, const CONF *cnf)
67         {
68         int i;
69         const char *stbl_section;
70         STACK_OF(CONF_VALUE) *sktmp;
71         CONF_VALUE *mval;
72         stbl_section = CONF_imodule_get_value(md);
73         if(!(sktmp = NCONF_get_section(cnf, stbl_section)))
74                 {
75                 ASN1err(ASN1_F_STBL_MODULE_INIT, ASN1_R_ERROR_LOADING_SECTION);
76                 return 0;
77                 }
78         for(i = 0; i < sk_CONF_VALUE_num(sktmp); i++)
79                 {
80                 mval = sk_CONF_VALUE_value(sktmp, i);
81                 if(!do_tcreate(mval->value, mval->name))
82                         {
83                         ASN1err(ASN1_F_STBL_MODULE_INIT, ASN1_R_INVALID_VALUE);
84                         return 0;
85                         }
86                 }
87         return 1;
88         }
89
90 static void stbl_module_finish(CONF_IMODULE *md)
91         {
92         ASN1_STRING_TABLE_cleanup();
93         }
94
95 void ASN1_add_stable_module(void)
96         {
97         CONF_module_add("stbl_section", stbl_module_init, stbl_module_finish);
98         }
99
100 /* Create an table entry based on a name value pair.
101  * format is oid_name = n1:v1, n2:v2,...
102  * where name is "min", "max", "mask" or "flags".
103  */
104
105
106 static int do_tcreate(char *value, char *name)
107         {
108         char *eptr;
109         int nid, i, rv = 0;
110         long tbl_min = -1, tbl_max = -1;
111         unsigned long tbl_mask = 0, tbl_flags = 0;
112         STACK_OF(CONF_VALUE) *lst = NULL;
113         CONF_VALUE *cnf = NULL;
114         nid = OBJ_sn2nid(name);
115         if (nid == NID_undef)
116                 nid = OBJ_ln2nid(name);
117         if (nid == NID_undef)
118                 goto err;
119         lst = X509V3_parse_list(value);
120         if (!lst)
121                 goto err;
122         for (i = 0; i < sk_CONF_VALUE_num(lst); i++)
123                 {
124                 cnf = sk_CONF_VALUE_value(lst, i);
125                 if (!strcmp(cnf->name, "min"))
126                         {
127                         tbl_min = strtoul(cnf->value, &eptr, 0);
128                         if (*eptr)
129                                 goto err;
130                         }
131                 else if (!strcmp(cnf->name, "max"))
132                         {
133                         tbl_max = strtoul(cnf->value, &eptr, 0);
134                         if (*eptr)
135                                 goto err;
136                         }
137                 else if (!strcmp(cnf->name, "mask"))
138                         {
139                         if (!ASN1_str2mask(cnf->value, &tbl_mask) || !tbl_mask)
140                                 goto err;
141                         }
142                 else if (!strcmp(cnf->name, "flags"))
143                         {
144                         if (!strcmp(cnf->value, "nomask"))
145                                 tbl_flags = STABLE_NO_MASK;
146                         else if (!strcmp(cnf->value, "none"))
147                                 tbl_flags = STABLE_FLAGS_CLEAR;
148                         else
149                                 goto err;       
150                         }
151                 else
152                         goto err;
153                 }
154         rv = 1;
155         err:
156         if (rv == 0)
157                 {
158                 ASN1err(ASN1_F_DO_TCREATE, ASN1_R_INVALID_STRING_TABLE_VALUE);
159                 if (cnf)
160                         ERR_add_error_data(4, "field=", cnf->name,
161                                                 ", value=", cnf->value);
162                 else
163                         ERR_add_error_data(4, "name=", name,
164                                                 ", value=", value);
165                 }
166         else
167                 {
168                 rv = ASN1_STRING_TABLE_add(nid, tbl_min, tbl_max,
169                                                         tbl_mask, tbl_flags);
170                 if (!rv)
171                         ASN1err(ASN1_F_DO_TCREATE, ERR_R_MALLOC_FAILURE);
172                 }
173         if (lst)
174                 sk_CONF_VALUE_pop_free(lst, X509V3_conf_free);
175         return rv;
176         }
177                 
178