source: mod_gnutls/src/gnutls_config.c @ a3c97d1

debian/masterdebian/stretch-backportsjessie-backportsmsvaupstream
Last change on this file since a3c97d1 was a3c97d1, checked in by Nokis Mavrogiannopoulos <nmav@…>, 12 years ago

better handling of RSAFile and DHFile

  • Property mode set to 100644
File size: 11.4 KB
RevLine 
[46b85d8]1/**
2 *  Copyright 2004-2005 Paul Querna
3 *
4 *  Licensed under the Apache License, Version 2.0 (the "License");
5 *  you may not use this file except in compliance with the License.
6 *  You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 *  Unless required by applicable law or agreed to in writing, software
11 *  distributed under the License is distributed on an "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 *  See the License for the specific language governing permissions and
14 *  limitations under the License.
15 *
16 */
17
18#include "mod_gnutls.h"
19
[7bebb42]20static int load_datum_from_file(apr_pool_t * pool,
21                                const char *file, gnutls_datum_t * data)
[46b85d8]22{
[7bebb42]23    apr_file_t *fp;
[46b85d8]24    apr_finfo_t finfo;
25    apr_status_t rv;
26    apr_size_t br = 0;
[7bebb42]27
28    rv = apr_file_open(&fp, file, APR_READ | APR_BINARY, APR_OS_DEFAULT,
29                       pool);
[46b85d8]30    if (rv != APR_SUCCESS) {
[7bebb42]31        return rv;
[46b85d8]32    }
[7bebb42]33
[46b85d8]34    rv = apr_file_info_get(&finfo, APR_FINFO_SIZE, fp);
[7bebb42]35
[46b85d8]36    if (rv != APR_SUCCESS) {
[7bebb42]37        return rv;
[46b85d8]38    }
[7bebb42]39
40    data->data = apr_palloc(pool, finfo.size + 1);
[46b85d8]41    rv = apr_file_read_full(fp, data->data, finfo.size, &br);
[7bebb42]42
[46b85d8]43    if (rv != APR_SUCCESS) {
[7bebb42]44        return rv;
[46b85d8]45    }
46    apr_file_close(fp);
[7bebb42]47
[46b85d8]48    data->data[br] = '\0';
49    data->size = br;
[7bebb42]50
[46b85d8]51    return 0;
52}
53
[7bebb42]54const char *mgs_set_dh_file(cmd_parms * parms, void *dummy,
55                            const char *arg)
56{
[a3c97d1]57    int ret;
58    gnutls_datum_t data;
59    const char *file;
60    apr_pool_t *spool;
[7bebb42]61    mgs_srvconf_rec *sc =
62        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
63                                                 module_config,
64                                                 &gnutls_module);
65
[a3c97d1]66    apr_pool_create(&spool, parms->pool);
67
68    file = ap_server_root_relative(spool, arg);
69
70    if (load_datum_from_file(spool, file, &data) != 0) {
71        return apr_psprintf(parms->pool, "GnuTLS: Error Reading "
72                            "DH params '%s'", file);
73    }
74
75    gnutls_dh_params_init(&sc->dh_params);
76    ret =
77        gnutls_dh_params_import_pkcs3(sc->dh_params, &data, GNUTLS_X509_FMT_PEM);
78    if (ret != 0) {
79        return apr_psprintf(parms->pool, "GnuTLS: Failed to Import "
80                            "DH params '%s': (%d) %s", file, ret,
81                            gnutls_strerror(ret));
82    }
83
84    apr_pool_destroy(spool);
[7bebb42]85
86    return NULL;
87}
88
89const char *mgs_set_rsa_export_file(cmd_parms * parms, void *dummy,
90                                    const char *arg)
91{
[a3c97d1]92    int ret;
93    gnutls_datum_t data;
94    const char *file;
95    apr_pool_t *spool;
[7bebb42]96    mgs_srvconf_rec *sc =
97        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
98                                                 module_config,
99                                                 &gnutls_module);
100
[a3c97d1]101    apr_pool_create(&spool, parms->pool);
102
103    file = ap_server_root_relative(spool, arg);
104
105    if (load_datum_from_file(spool, file, &data) != 0) {
106        return apr_psprintf(parms->pool, "GnuTLS: Error Reading "
107                            "RSA params '%s'", file);
108    }
109
110    gnutls_rsa_params_init(&sc->rsa_params);
111    ret =
112        gnutls_rsa_params_import_pkcs1(sc->rsa_params, &data, GNUTLS_X509_FMT_PEM);
113    if (ret != 0) {
114        return apr_psprintf(parms->pool, "GnuTLS: Failed to Import "
115                            "RSA params '%s': (%d) %s", file, ret,
116                            gnutls_strerror(ret));
117    }
[7bebb42]118
[a3c97d1]119    apr_pool_destroy(spool);
[7bebb42]120    return NULL;
121}
122
123
[46b85d8]124const char *mgs_set_cert_file(cmd_parms * parms, void *dummy,
[7bebb42]125                              const char *arg)
[46b85d8]126{
127    int ret;
128    gnutls_datum_t data;
[7bebb42]129    const char *file;
130    apr_pool_t *spool;
[c301152]131    mgs_srvconf_rec *sc =
[7bebb42]132        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
133                                                 module_config,
134                                                 &gnutls_module);
[46b85d8]135    apr_pool_create(&spool, parms->pool);
[7bebb42]136
[46b85d8]137    file = ap_server_root_relative(spool, arg);
138
139    if (load_datum_from_file(spool, file, &data) != 0) {
[7bebb42]140        return apr_psprintf(parms->pool, "GnuTLS: Error Reading "
141                            "Certificate '%s'", file);
[46b85d8]142    }
[7bebb42]143
[46b85d8]144    gnutls_x509_crt_init(&sc->cert_x509);
[7bebb42]145    ret =
146        gnutls_x509_crt_import(sc->cert_x509, &data, GNUTLS_X509_FMT_PEM);
[46b85d8]147    if (ret != 0) {
[7bebb42]148        return apr_psprintf(parms->pool, "GnuTLS: Failed to Import "
[a3c97d1]149                            "Certificate '%s': (%d) %s", file, ret,
[7bebb42]150                            gnutls_strerror(ret));
[46b85d8]151    }
[7bebb42]152
[46b85d8]153    apr_pool_destroy(spool);
154    return NULL;
155}
156
157const char *mgs_set_key_file(cmd_parms * parms, void *dummy,
[7bebb42]158                             const char *arg)
[46b85d8]159{
160    int ret;
161    gnutls_datum_t data;
[7bebb42]162    const char *file;
163    apr_pool_t *spool;
[c301152]164    mgs_srvconf_rec *sc =
[7bebb42]165        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
166                                                 module_config,
167                                                 &gnutls_module);
[46b85d8]168    apr_pool_create(&spool, parms->pool);
[7bebb42]169
[46b85d8]170    file = ap_server_root_relative(spool, arg);
[7bebb42]171
[46b85d8]172    if (load_datum_from_file(spool, file, &data) != 0) {
[7bebb42]173        return apr_psprintf(parms->pool, "GnuTLS: Error Reading "
174                            "Private Key '%s'", file);
[46b85d8]175    }
[7bebb42]176
[46b85d8]177    gnutls_x509_privkey_init(&sc->privkey_x509);
[7bebb42]178    ret =
179        gnutls_x509_privkey_import(sc->privkey_x509, &data,
180                                   GNUTLS_X509_FMT_PEM);
[46b85d8]181    if (ret != 0) {
[7bebb42]182        return apr_psprintf(parms->pool, "GnuTLS: Failed to Import "
183                            "Private Key '%s': (%d) %s", file, ret,
184                            gnutls_strerror(ret));
[46b85d8]185    }
186    apr_pool_destroy(spool);
187    return NULL;
188}
189
[7bebb42]190const char *mgs_set_srp_tpasswd_file(cmd_parms * parms, void *dummy,
191                                     const char *arg)
192{
193    mgs_srvconf_rec *sc =
194        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
195                                                 module_config,
196                                                 &gnutls_module);
197
198    sc->srp_tpasswd_file = ap_server_root_relative(parms->pool, arg);
199
200    return NULL;
201}
202
203const char *mgs_set_srp_tpasswd_conf_file(cmd_parms * parms, void *dummy,
204                                          const char *arg)
205{
206    mgs_srvconf_rec *sc =
207        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
208                                                 module_config,
209                                                 &gnutls_module);
210
211    sc->srp_tpasswd_conf_file = ap_server_root_relative(parms->pool, arg);
212
213    return NULL;
214}
215
[46b85d8]216const char *mgs_set_cache(cmd_parms * parms, void *dummy,
[7bebb42]217                          const char *type, const char *arg)
[46b85d8]218{
[7bebb42]219    const char *err;
[c301152]220    mgs_srvconf_rec *sc = ap_get_module_config(parms->server->
[7bebb42]221                                               module_config,
222                                               &gnutls_module);
[46b85d8]223    if ((err = ap_check_cmd_context(parms, GLOBAL_ONLY))) {
[7bebb42]224        return err;
[46b85d8]225    }
226
227    if (strcasecmp("none", type) == 0) {
[7bebb42]228        sc->cache_type = mgs_cache_none;
229    } else if (strcasecmp("dbm", type) == 0) {
230        sc->cache_type = mgs_cache_dbm;
[46b85d8]231    }
232#if HAVE_APR_MEMCACHE
233    else if (strcasecmp("memcache", type) == 0) {
[7bebb42]234        sc->cache_type = mgs_cache_memcache;
[46b85d8]235    }
236#endif
237    else {
[7bebb42]238        return "Invalid Type for GnuTLSCache!";
[46b85d8]239    }
240
[c301152]241    if (sc->cache_type == mgs_cache_dbm) {
[7bebb42]242        sc->cache_config = ap_server_root_relative(parms->pool, arg);
243    } else {
244        sc->cache_config = apr_pstrdup(parms->pool, arg);
[46b85d8]245    }
246
247    return NULL;
248}
249
250const char *mgs_set_cache_timeout(cmd_parms * parms, void *dummy,
[7bebb42]251                                  const char *arg)
[46b85d8]252{
253    int argint;
[c301152]254    mgs_srvconf_rec *sc =
[7bebb42]255        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
256                                                 module_config,
257                                                 &gnutls_module);
258
[46b85d8]259    argint = atoi(arg);
[7bebb42]260
[46b85d8]261    if (argint < 0) {
[7bebb42]262        return "GnuTLSCacheTimeout: Invalid argument";
263    } else if (argint == 0) {
264        sc->cache_timeout = 0;
265    } else {
266        sc->cache_timeout = apr_time_from_sec(argint);
[46b85d8]267    }
[7bebb42]268
[46b85d8]269    return NULL;
270}
271
272const char *mgs_set_client_verify(cmd_parms * parms, void *dummy,
[7bebb42]273                                  const char *arg)
[46b85d8]274{
275    int mode;
276
277    if (strcasecmp("none", arg) == 0 || strcasecmp("ignore", arg) == 0) {
[7bebb42]278        mode = GNUTLS_CERT_IGNORE;
279    } else if (strcasecmp("optional", arg) == 0
280               || strcasecmp("request", arg) == 0) {
281        mode = GNUTLS_CERT_REQUEST;
282    } else if (strcasecmp("require", arg) == 0) {
283        mode = GNUTLS_CERT_REQUIRE;
284    } else {
285        return "GnuTLSClientVerify: Invalid argument";
[46b85d8]286    }
[7bebb42]287
[46b85d8]288    /* This was set from a directory context */
289    if (parms->path) {
[7bebb42]290        mgs_dirconf_rec *dc = (mgs_dirconf_rec *) dummy;
291        dc->client_verify_mode = mode;
292    } else {
293        mgs_srvconf_rec *sc =
294            (mgs_srvconf_rec *) ap_get_module_config(parms->server->
295                                                     module_config,
296                                                     &gnutls_module);
297        sc->client_verify_mode = mode;
[46b85d8]298    }
299
300    return NULL;
301}
302
303const char *mgs_set_client_ca_file(cmd_parms * parms, void *dummy,
[7bebb42]304                                   const char *arg)
[46b85d8]305{
306    int rv;
[7bebb42]307    const char *file;
308    apr_pool_t *spool;
[836c2f9]309    gnutls_datum_t data;
310
[7bebb42]311    mgs_srvconf_rec *sc =
312        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
313                                                 module_config,
314                                                 &gnutls_module);
[836c2f9]315    apr_pool_create(&spool, parms->pool);
316
317    file = ap_server_root_relative(spool, arg);
318
[7bebb42]319    if (load_datum_from_file(spool, file, &data) != 0) {
320        return apr_psprintf(parms->pool, "GnuTLS: Error Reading "
321                            "Client CA File '%s'", file);
322    }
[836c2f9]323
[7bebb42]324    sc->ca_list_size = MAX_CA_CRTS;
325    rv = gnutls_x509_crt_list_import(sc->ca_list, &sc->ca_list_size,
326                                     &data, GNUTLS_X509_FMT_PEM,
327                                     GNUTLS_X509_CRT_LIST_IMPORT_FAIL_IF_EXCEED);
[46b85d8]328    if (rv < 0) {
[7bebb42]329        return apr_psprintf(parms->pool, "GnuTLS: Failed to load "
330                            "Client CA File '%s': (%d) %s", file, rv,
331                            gnutls_strerror(rv));
[46b85d8]332    }
[836c2f9]333
334    apr_pool_destroy(spool);
[46b85d8]335    return NULL;
336}
337
338const char *mgs_set_enabled(cmd_parms * parms, void *dummy,
[7bebb42]339                            const char *arg)
[46b85d8]340{
[c301152]341    mgs_srvconf_rec *sc =
[7bebb42]342        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
343                                                 module_config,
344                                                 &gnutls_module);
[46b85d8]345    if (!strcasecmp(arg, "On")) {
[7bebb42]346        sc->enabled = GNUTLS_ENABLED_TRUE;
347    } else if (!strcasecmp(arg, "Off")) {
348        sc->enabled = GNUTLS_ENABLED_FALSE;
349    } else {
350        return "GnuTLSEnable must be set to 'On' or 'Off'";
[46b85d8]351    }
[7bebb42]352
353    return NULL;
354}
355
356const char *mgs_set_export_certificates_enabled(cmd_parms * parms, void *dummy,
357                            const char *arg)
358{
359    mgs_srvconf_rec *sc =
360        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
361                                                 module_config,
362                                                 &gnutls_module);
363    if (!strcasecmp(arg, "On")) {
364        sc->export_certificates_enabled = GNUTLS_ENABLED_TRUE;
365    } else if (!strcasecmp(arg, "Off")) {
366        sc->export_certificates_enabled = GNUTLS_ENABLED_FALSE;
367    } else {
368        return "GnuTLSExportCertificates must be set to 'On' or 'Off'";
[46b85d8]369    }
[7bebb42]370
371    return NULL;
372}
373
374
375const char *mgs_set_priorities(cmd_parms * parms, void *dummy, const char *arg)
376{
377    int ret;
[fd73a08]378    const char *err;
[7bebb42]379    mgs_srvconf_rec *sc =
380        (mgs_srvconf_rec *) ap_get_module_config(parms->server->
381                                                 module_config,
382                                                 &gnutls_module);
383
384
385    ret = gnutls_priority_init( &sc->priorities, arg, &err);
386    if (ret < 0) {
387      if (ret == GNUTLS_E_INVALID_REQUEST)
388        return apr_psprintf(parms->pool, "GnuTLS: Syntax error parsing priorities string at: %s", err);
389      return "Error setting priorities";
[46b85d8]390    }
391
392    return NULL;
393}
394
395void *mgs_config_server_create(apr_pool_t * p, server_rec * s)
396{
[c301152]397    mgs_srvconf_rec *sc = apr_pcalloc(p, sizeof(*sc));
[7bebb42]398
[46b85d8]399    sc->enabled = GNUTLS_ENABLED_FALSE;
[7bebb42]400
[46b85d8]401    gnutls_certificate_allocate_credentials(&sc->certs);
[7bebb42]402    gnutls_anon_allocate_server_credentials(&sc->anon_creds);
403    gnutls_srp_allocate_server_credentials(&sc->srp_creds);
404
405    sc->srp_tpasswd_conf_file = NULL;
406    sc->srp_tpasswd_file = NULL;
[46b85d8]407    sc->privkey_x509 = NULL;
408    sc->cert_x509 = NULL;
409    sc->cache_timeout = apr_time_from_sec(300);
[c301152]410    sc->cache_type = mgs_cache_dbm;
[46b85d8]411    sc->cache_config = ap_server_root_relative(p, "conf/gnutls_cache");
[7bebb42]412
[46b85d8]413    sc->client_verify_mode = GNUTLS_CERT_IGNORE;
[7bebb42]414
[46b85d8]415    return sc;
416}
417
[7bebb42]418void *mgs_config_dir_merge(apr_pool_t * p, void *basev, void *addv)
[84cb5b2]419{
420    mgs_dirconf_rec *new;
[7bebb42]421/*    mgs_dirconf_rec *base = (mgs_dirconf_rec *) basev; */
[84cb5b2]422    mgs_dirconf_rec *add = (mgs_dirconf_rec *) addv;
[7bebb42]423
[84cb5b2]424    new = (mgs_dirconf_rec *) apr_pcalloc(p, sizeof(mgs_dirconf_rec));
425    new->lua_bytecode = apr_pstrmemdup(p, add->lua_bytecode,
[7bebb42]426                                       add->lua_bytecode_len);
[84cb5b2]427    new->lua_bytecode_len = add->lua_bytecode_len;
428    new->client_verify_mode = add->client_verify_mode;
429    return new;
430}
431
[7bebb42]432void *mgs_config_dir_create(apr_pool_t * p, char *dir)
[46b85d8]433{
[c301152]434    mgs_dirconf_rec *dc = apr_palloc(p, sizeof(*dc));
[7bebb42]435
[46b85d8]436    dc->client_verify_mode = -1;
[84cb5b2]437    dc->lua_bytecode = NULL;
438    dc->lua_bytecode_len = 0;
[46b85d8]439    return dc;
440}
Note: See TracBrowser for help on using the repository browser.