fix formatting of automatically generated error section
[openssl.git] / crypto / engine / eng_cnf.c
1 /* eng_cnf.c */
2 /* Written by Stephen Henson (shenson@bigfoot.com) for the OpenSSL
3  * project 2001.
4  */
5 /* ====================================================================
6  * Copyright (c) 2001 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  * This product includes cryptographic software written by Eric Young
54  * (eay@cryptsoft.com).  This product includes software written by Tim
55  * Hudson (tjh@cryptsoft.com).
56  *
57  */
58
59 #include <stdio.h>
60 #include <openssl/crypto.h>
61 #include "cryptlib.h"
62 #include <openssl/conf.h>
63 #include <openssl/engine.h>
64
65 /* #define ENGINE_CONF_DEBUG */
66
67 /* ENGINE config module */
68
69 static char *skip_dot(char *name)
70         {
71         char *p;
72         p = strchr(name, '.');
73         if (p)
74                 return p + 1;
75         return name;
76         }
77
78 int int_engine_configure(char *name, char *value, const CONF *cnf)
79         {
80         int i;
81         int ret = 0;
82         STACK_OF(CONF_VALUE) *ecmds;
83         CONF_VALUE *ecmd;
84         char *ctrlname, *ctrlvalue;
85         ENGINE *e = NULL;
86         name = skip_dot(name);
87 #ifdef ENGINE_CONF_DEBUG
88         fprintf(stderr, "Configuring engine %s\n", name);
89 #endif
90         /* Value is a section containing ENGINE commands */
91         ecmds = NCONF_get_section(cnf, value);
92
93         if (!ecmds)
94                 {
95                 ENGINEerr(ENGINE_F_INT_ENGINE_CONFIGURE, ENGINE_R_ENGINE_SECTION_ERROR);
96                 return 0;
97                 }
98
99         for (i = 0; i < sk_CONF_VALUE_num(ecmds); i++)
100                 {
101                 ecmd = sk_CONF_VALUE_value(ecmds, i);
102                 ctrlname = skip_dot(ecmd->name);
103                 ctrlvalue = ecmd->value;
104 #ifdef ENGINE_CONF_DEBUG
105         fprintf(stderr, "ENGINE conf: doing ctrl(%s,%s)\n", ctrlname, ctrlvalue);
106 #endif
107
108                 /* First handle some special pseudo ctrls */
109
110                 /* Override engine name to use */
111                 if (!strcmp(ctrlname, "engine_id"))
112                         name = ctrlvalue;
113                 /* Load a dynamic ENGINE */
114                 else if (!strcmp(ctrlname, "dynamic_path"))
115                         {
116                         e = ENGINE_by_id("dynamic");
117                         if (!e)
118                                 goto err;
119                         if (!ENGINE_ctrl_cmd_string(e, "SO_PATH", ctrlvalue, 0))
120                                 goto err;
121                         if (!ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0))
122                                 goto err;
123                         }
124                 /* ... add other pseudos here ... */
125                 else
126                         {
127                         /* At this point we need an ENGINE structural reference
128                          * if we don't already have one.
129                          */
130                         if (!e)
131                                 {
132                                 e = ENGINE_by_id(name);
133                                 if (!e)
134                                         return 0;
135                                 }
136                         /* Allow "EMPTY" to mean no value: this allows a valid
137                          * "value" to be passed to ctrls of type NO_INPUT
138                          */
139                         if (!strcmp(ctrlvalue, "EMPTY"))
140                                 ctrlvalue = NULL;
141                         if (!strcmp(ctrlname, "default_algorithms"))
142                                 {
143                                 if (!ENGINE_set_default_string(e, ctrlvalue))
144                                         goto err;
145                                 }
146                         else if (!ENGINE_ctrl_cmd_string(e,
147                                         ctrlname, ctrlvalue, 0))
148                                 return 0;
149                         }
150
151
152                 }
153         ret = 1;
154         err:
155         if (e)
156                 ENGINE_free(e);
157         return ret;
158         }
159
160
161 static int int_engine_module_init(CONF_IMODULE *md, const CONF *cnf)
162         {
163         STACK_OF(CONF_VALUE) *elist;
164         CONF_VALUE *cval;
165         int i;
166 #ifdef ENGINE_CONF_DEBUG
167         fprintf(stderr, "Called engine module: name %s, value %s\n",
168                         CONF_imodule_get_name(md), CONF_imodule_get_value(md));
169 #endif
170         /* Value is a section containing ENGINEs to configure */
171         elist = NCONF_get_section(cnf, CONF_imodule_get_value(md));
172
173         if (!elist)
174                 {
175                 ENGINEerr(ENGINE_F_ENGINE_MODULE_INIT, ENGINE_R_ENGINES_SECTION_ERROR);
176                 return 0;
177                 }
178
179         for (i = 0; i < sk_CONF_VALUE_num(elist); i++)
180                 {
181                 cval = sk_CONF_VALUE_value(elist, i);
182                 if (!int_engine_configure(cval->name, cval->value, cnf))
183                         return 0;
184                 }
185
186         return 1;
187         }
188
189 void ENGINE_add_conf_module(void)
190         {
191         CONF_module_add("engines", int_engine_module_init, 0);
192         }