Navigation


source: freeDiameter/libfdcore/config.c @ 686:f83d9878bf66

Last change on this file since 686:f83d9878bf66 was 686:f83d9878bf66, checked in by Sebastien Decugis <sdecugis@nict.go.jp>, 11 years ago

Fixed in case of termination of several modules (before initialization completed)

File size: 19.1 KB
Line 
1/*********************************************************************************************************
2* Software License Agreement (BSD License)                                                               *
3* Author: Sebastien Decugis <sdecugis@nict.go.jp>                                                        *
4*                                                                                                        *
5* Copyright (c) 2011, WIDE Project and NICT                                                              *
6* All rights reserved.                                                                                   *
7*                                                                                                        *
8* Redistribution and use of this software in source and binary forms, with or without modification, are  *
9* permitted provided that the following conditions are met:                                              *
10*                                                                                                        *
11* * Redistributions of source code must retain the above                                                 *
12*   copyright notice, this list of conditions and the                                                    *
13*   following disclaimer.                                                                                *
14*                                                                                                        *
15* * Redistributions in binary form must reproduce the above                                              *
16*   copyright notice, this list of conditions and the                                                    *
17*   following disclaimer in the documentation and/or other                                               *
18*   materials provided with the distribution.                                                            *
19*                                                                                                        *
20* * Neither the name of the WIDE Project or NICT nor the                                                 *
21*   names of its contributors may be used to endorse or                                                  *
22*   promote products derived from this software without                                                  *
23*   specific prior written permission of WIDE Project and                                                *
24*   NICT.                                                                                                *
25*                                                                                                        *
26* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
27* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
28* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
29* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT     *
30* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS    *
31* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
32* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
33* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                             *
34*********************************************************************************************************/
35
36#include "fdcore-internal.h"
37#include <sys/stat.h>
38
39/* Configuration management */
40
41#ifndef GNUTLS_DEFAULT_PRIORITY
42# define GNUTLS_DEFAULT_PRIORITY "NORMAL"
43#endif /* GNUTLS_DEFAULT_PRIORITY */
44#ifndef GNUTLS_DEFAULT_DHBITS
45# define GNUTLS_DEFAULT_DHBITS 1024
46#endif /* GNUTLS_DEFAULT_DHBITS */
47
48/* Initialize the fd_g_config structure to default values -- it should already have been initialized to all-0 */
49int fd_conf_init()
50{
51        TRACE_ENTRY();
52       
53        fd_g_config->cnf_eyec = EYEC_CONFIG;
54       
55        fd_g_config->cnf_timer_tc = 30;
56        fd_g_config->cnf_timer_tw = 30;
57       
58        fd_g_config->cnf_port     = 3868;
59        fd_g_config->cnf_port_tls = 3869;
60        fd_g_config->cnf_sctp_str = 30;
61        fd_g_config->cnf_dispthr  = 4;
62        fd_list_init(&fd_g_config->cnf_endpoints, NULL);
63        fd_list_init(&fd_g_config->cnf_apps, NULL);
64        #ifdef DISABLE_SCTP
65        fd_g_config->cnf_flags.no_sctp = 1;
66        #endif /* DISABLE_SCTP */
67       
68        fd_g_config->cnf_orstateid = (uint32_t) time(NULL);
69       
70        CHECK_FCT( fd_dict_init(&fd_g_config->cnf_dict) );
71        CHECK_FCT( fd_fifo_new(&fd_g_config->cnf_main_ev) );
72       
73        /* TLS parameters */
74        CHECK_GNUTLS_DO( gnutls_certificate_allocate_credentials (&fd_g_config->cnf_sec_data.credentials), return ENOMEM );
75        CHECK_GNUTLS_DO( gnutls_dh_params_init (&fd_g_config->cnf_sec_data.dh_cache), return ENOMEM );
76
77        return 0;
78}
79
80void fd_conf_dump()
81{
82        if (!TRACE_BOOL(INFO))
83                return;
84       
85        fd_log_debug("-- Configuration :\n");
86        fd_log_debug("  Debug trace level ...... : %+d\n", fd_g_debug_lvl);
87        fd_log_debug("  Configuration file ..... : %s\n", fd_g_config->cnf_file);
88        fd_log_debug("  Diameter Identity ...... : %s (l:%Zi)\n", fd_g_config->cnf_diamid, fd_g_config->cnf_diamid_len);
89        fd_log_debug("  Diameter Realm ......... : %s (l:%Zi)\n", fd_g_config->cnf_diamrlm, fd_g_config->cnf_diamrlm_len);
90        fd_log_debug("  Tc Timer ............... : %u\n", fd_g_config->cnf_timer_tc);
91        fd_log_debug("  Tw Timer ............... : %u\n", fd_g_config->cnf_timer_tw);
92        fd_log_debug("  Local port ............. : %hu\n", fd_g_config->cnf_port);
93        fd_log_debug("  Local secure port ...... : %hu\n", fd_g_config->cnf_port_tls);
94        fd_log_debug("  Number of SCTP streams . : %hu\n", fd_g_config->cnf_sctp_str);
95        fd_log_debug("  Number of server threads : %hu\n", fd_g_config->cnf_dispthr);
96        if (FD_IS_LIST_EMPTY(&fd_g_config->cnf_endpoints)) {
97                fd_log_debug("  Local endpoints ........ : Default (use all available)\n");
98        } else {
99                fd_log_debug("  Local endpoints ........ : \n");
100                fd_ep_dump( 29, &fd_g_config->cnf_endpoints );
101        }
102        if (FD_IS_LIST_EMPTY(&fd_g_config->cnf_apps)) {
103                fd_log_debug("  Local applications ..... : (none)\n");
104        } else {
105                struct fd_list * li = fd_g_config->cnf_apps.next;
106                fd_log_debug("  Local applications ..... : ");
107                while (li != &fd_g_config->cnf_apps) {
108                        struct fd_app * app = (struct fd_app *)li;
109                        if (li != fd_g_config->cnf_apps.next) fd_log_debug("                             ");
110                        fd_log_debug("App: %u\t%s%s\tVnd: %u\n", 
111                                        app->appid,
112                                        app->flags.auth ? "Au" : "--",
113                                        app->flags.acct ? "Ac" : "--",
114                                        app->vndid);
115                        li = li->next;
116                }
117        }
118       
119        fd_log_debug("  Flags : - IP ........... : %s\n", fd_g_config->cnf_flags.no_ip4 ? "DISABLED" : "Enabled");
120        fd_log_debug("          - IPv6 ......... : %s\n", fd_g_config->cnf_flags.no_ip6 ? "DISABLED" : "Enabled");
121        fd_log_debug("          - Relay app .... : %s\n", fd_g_config->cnf_flags.no_fwd ? "DISABLED" : "Enabled");
122        fd_log_debug("          - TCP .......... : %s\n", fd_g_config->cnf_flags.no_tcp ? "DISABLED" : "Enabled");
123        #ifdef DISABLE_SCTP
124        fd_log_debug("          - SCTP ......... : DISABLED (at compilation)\n");
125        #else /* DISABLE_SCTP */
126        fd_log_debug("          - SCTP ......... : %s\n", fd_g_config->cnf_flags.no_sctp ? "DISABLED" : "Enabled");
127        #endif /* DISABLE_SCTP */
128        fd_log_debug("          - Pref. proto .. : %s\n", fd_g_config->cnf_flags.pr_tcp ? "TCP" : "SCTP");
129        fd_log_debug("          - TLS method ... : %s\n", fd_g_config->cnf_flags.tls_alg ? "INBAND" : "Separate port");
130       
131        fd_log_debug("  TLS :   - Certificate .. : %s\n", fd_g_config->cnf_sec_data.cert_file ?: "(NONE)");
132        fd_log_debug("          - Private key .. : %s\n", fd_g_config->cnf_sec_data.key_file ?: "(NONE)");
133        fd_log_debug("          - CA (trust) ... : %s (%d certs)\n", fd_g_config->cnf_sec_data.ca_file ?: "(none)", fd_g_config->cnf_sec_data.ca_file_nr);
134        fd_log_debug("          - CRL .......... : %s\n", fd_g_config->cnf_sec_data.crl_file ?: "(none)");
135        fd_log_debug("          - Priority ..... : %s\n", fd_g_config->cnf_sec_data.prio_string ?: "(default: '" GNUTLS_DEFAULT_PRIORITY "')");
136        if (fd_g_config->cnf_sec_data.dh_file)
137                fd_log_debug("          - DH file ...... : %s\n", fd_g_config->cnf_sec_data.dh_file);
138        else
139                fd_log_debug("          - DH bits ...... : %d\n", fd_g_config->cnf_sec_data.dh_bits ?: GNUTLS_DEFAULT_DHBITS);
140       
141        fd_log_debug("  Origin-State-Id ........ : %u\n", fd_g_config->cnf_orstateid);
142}
143
144/* Parse the configuration file (using the yacc parser) */
145int fd_conf_parse()
146{
147        extern FILE * fddin;
148       
149        /* Attempt to find the configuration file */
150        if (!fd_g_config->cnf_file)
151                fd_g_config->cnf_file = FD_DEFAULT_CONF_FILENAME;
152       
153        fddin = fopen(fd_g_config->cnf_file, "r");
154        if ((fddin == NULL) && (*fd_g_config->cnf_file != '/')) {
155                /* We got a relative path, attempt to add the default directory prefix */
156                char * bkp = fd_g_config->cnf_file;
157                CHECK_MALLOC( fd_g_config->cnf_file = malloc(strlen(bkp) + strlen(DEFAULT_CONF_PATH) + 2) ); /* we will not free it, but not important */
158                sprintf( fd_g_config->cnf_file, DEFAULT_CONF_PATH "/%s", bkp );
159                fddin = fopen(fd_g_config->cnf_file, "r");
160        }
161        if (fddin == NULL) {
162                int ret = errno;
163                fprintf(stderr, "Unable to open configuration file %s for reading: %s\n", fd_g_config->cnf_file, strerror(ret));
164                return ret;
165        }
166       
167        /* call yacc parser */
168        TRACE_DEBUG (FULL, "Parsing configuration file: %s", fd_g_config->cnf_file);
169        CHECK_FCT(  fddparse(fd_g_config)  );
170       
171        /* close the file */
172        fclose(fddin);
173       
174        /* Check that TLS private key was given */
175        if (! fd_g_config->cnf_sec_data.key_file) {
176                fprintf(stderr, "Missing private key configuration for TLS. Please provide the TLS_cred configuration directive.\n");
177                return EINVAL;
178        }
179       
180        /* Resolve hostname if not provided */
181        if (fd_g_config->cnf_diamid == NULL) {
182#ifndef HOST_NAME_MAX
183#define HOST_NAME_MAX 1024
184#endif /* HOST_NAME_MAX */
185                char buf[HOST_NAME_MAX + 1];
186                struct addrinfo hints, *info;
187                int ret;
188               
189                /* local host name */
190                CHECK_SYS(gethostname(buf, sizeof(buf)));
191               
192                /* get FQDN */
193                memset(&hints, 0, sizeof hints);
194                hints.ai_flags = AI_CANONNAME;
195
196                ret = getaddrinfo(buf, NULL, &hints, &info);
197                if (ret != 0) {
198                        fprintf(stderr, "Error resolving local FQDN :\n"
199                                        " '%s' : %s\n"
200                                        "Please provide Identity in configuration file.\n",
201                                        buf, gai_strerror(ret));
202                        return EINVAL;
203                }
204                CHECK_MALLOC( fd_g_config->cnf_diamid = strdup(info->ai_canonname) );
205                freeaddrinfo(info);
206        }
207       
208        /* cache the length of the diameter id for the session module */
209        fd_g_config->cnf_diamid_len = strlen(fd_g_config->cnf_diamid);
210       
211        /* Handle the realm part */
212        if (fd_g_config->cnf_diamrlm == NULL) {
213                char * start = NULL;
214               
215                /* Check the diameter identity is a fqdn */
216                start = strchr(fd_g_config->cnf_diamid, '.');
217                if ((start == NULL) || (start[1] == '\0')) {
218                        fprintf(stderr, "Unable to extract realm from the Identity '%s'.\n"
219                                        "Please fix your Identity setting or provide Realm.\n",
220                                        fd_g_config->cnf_diamid);
221                        return EINVAL;
222                }               
223               
224                CHECK_MALLOC( fd_g_config->cnf_diamrlm = strdup( start + 1 )  ); 
225        }
226        fd_g_config->cnf_diamrlm_len = strlen(fd_g_config->cnf_diamrlm);
227       
228        /* Validate some flags */
229        if (fd_g_config->cnf_flags.no_ip4 && fd_g_config->cnf_flags.no_ip6) {
230                fprintf(stderr, "IP and IPv6 cannot be disabled at the same time.\n");
231                return EINVAL;
232        }
233        if (fd_g_config->cnf_flags.no_tcp && fd_g_config->cnf_flags.no_sctp) {
234                fprintf(stderr, "TCP and SCTP cannot be disabled at the same time.\n");
235                return EINVAL;
236        }
237       
238        /* Validate local endpoints */
239        if ((!FD_IS_LIST_EMPTY(&fd_g_config->cnf_endpoints)) && (fd_g_config->cnf_flags.no_ip4 || fd_g_config->cnf_flags.no_ip6)) {
240                struct fd_list * li;
241                for ( li = fd_g_config->cnf_endpoints.next; li != &fd_g_config->cnf_endpoints; li = li->next) {
242                        struct fd_endpoint * ep = (struct fd_endpoint *)li;
243                        if ( (fd_g_config->cnf_flags.no_ip4 && (ep->sa.sa_family == AF_INET))
244                           ||(fd_g_config->cnf_flags.no_ip6 && (ep->sa.sa_family == AF_INET6)) ) {
245                                li = li->prev;
246                                fd_list_unlink(&ep->chain);
247                                if (TRACE_BOOL(INFO)) {
248                                        fd_log_debug("Info: Removing local address conflicting with the flags no_IP / no_IP6 : ");
249                                        sSA_DUMP_NODE( &ep->sa, NI_NUMERICHOST );
250                                        fd_log_debug("\n");
251                                }
252                                free(ep);
253                        }
254                }
255        }
256       
257        /* Configure TLS default parameters */
258        if (! fd_g_config->cnf_sec_data.prio_string) {
259                const char * err_pos = NULL;
260                CHECK_GNUTLS_DO( gnutls_priority_init( 
261                                        &fd_g_config->cnf_sec_data.prio_cache,
262                                        GNUTLS_DEFAULT_PRIORITY,
263                                        &err_pos),
264                                 { TRACE_DEBUG(INFO, "Error in priority string at position : %s", err_pos); return EINVAL; } );
265        }
266       
267        /* Verify that our certificate is valid -- otherwise remote peers will reject it */
268        {
269                int ret = 0, i;
270               
271                gnutls_datum_t certfile;
272                size_t alloc = 0;
273               
274                gnutls_x509_crt_t * certs = NULL;
275                unsigned int cert_max = 0;
276               
277                gnutls_x509_crt_t * CA_list;
278                int CA_list_length;
279               
280                gnutls_x509_crl_t * CRL_list;
281                int CRL_list_length;
282               
283                unsigned int verify;
284                time_t now;
285               
286                memset(&certfile, 0, sizeof(certfile));
287               
288                /* Read the certificate file */
289                FILE *stream = fopen (fd_g_config->cnf_sec_data.cert_file, "rb");
290                if (!stream) {
291                        int err = errno;
292                        TRACE_DEBUG(INFO, "An error occurred while opening '%s': %s\n", fd_g_config->cnf_sec_data.cert_file, strerror(err));
293                        return err; 
294                }
295                do {
296                        uint8_t * realloced = NULL;
297                        size_t read = 0;
298                       
299                        if (alloc < certfile.size + BUFSIZ + 1) {
300                                alloc += alloc / 2 + BUFSIZ + 1;
301                                CHECK_MALLOC_DO( realloced = realloc(certfile.data, alloc),
302                                        {
303                                                free(certfile.data);
304                                                return ENOMEM;
305                                        } )
306                                certfile.data = realloced;
307                        }
308                       
309                        read = fread( certfile.data + certfile.size, 1, alloc - certfile.size - 1, stream );
310                        certfile.size += read;
311                       
312                        if (ferror(stream)) {
313                                int err = errno;
314                                TRACE_DEBUG(INFO, "An error occurred while reading '%s': %s\n", fd_g_config->cnf_sec_data.cert_file, strerror(err));
315                                return err; 
316                        }
317                } while (!feof(stream));
318                certfile.data[certfile.size] = '\0';
319                fclose(stream);
320               
321                /* Import the certificate(s) */
322                GNUTLS_TRACE( ret = gnutls_x509_crt_list_import(NULL, &cert_max, &certfile, GNUTLS_X509_FMT_PEM, GNUTLS_X509_CRT_LIST_IMPORT_FAIL_IF_EXCEED) );
323                if (ret != GNUTLS_E_SHORT_MEMORY_BUFFER) {
324                        CHECK_GNUTLS_DO(ret, return EINVAL);
325                }
326               
327                CHECK_MALLOC( certs = calloc(cert_max, sizeof(gnutls_x509_crt_t)) );
328                CHECK_GNUTLS_DO( gnutls_x509_crt_list_import(certs, &cert_max, &certfile, GNUTLS_X509_FMT_PEM, 0),
329                        {
330                                TRACE_DEBUG(INFO, "Failed to import the data from file '%s'", fd_g_config->cnf_sec_data.cert_file);
331                                free(certfile.data);
332                                return EINVAL;
333                        } );
334                free(certfile.data);
335               
336                ASSERT(cert_max >= 1);
337               
338                /* Now, verify the list against the local CA and CRL */
339                GNUTLS_TRACE( gnutls_certificate_get_x509_cas (fd_g_config->cnf_sec_data.credentials, &CA_list, (unsigned int *) &CA_list_length) );
340                GNUTLS_TRACE( gnutls_certificate_get_x509_crls (fd_g_config->cnf_sec_data.credentials, &CRL_list, (unsigned int *) &CRL_list_length) );
341                CHECK_GNUTLS_DO( gnutls_x509_crt_list_verify(certs, cert_max, CA_list, CA_list_length, CRL_list, CRL_list_length, 0, &verify),
342                        {
343                                TRACE_DEBUG(INFO, "Failed to verify the local certificate '%s' against local credentials. Please check your certificate is valid.", fd_g_config->cnf_sec_data.cert_file);
344                                return EINVAL;
345                        } );
346                if (verify) {
347                        fd_log_debug("TLS: Local certificate chain '%s' is invalid :\n", fd_g_config->cnf_sec_data.cert_file);
348                        if (verify & GNUTLS_CERT_INVALID)
349                                fd_log_debug(" - The certificate is not trusted (unknown CA? expired?)\n");
350                        if (verify & GNUTLS_CERT_REVOKED)
351                                fd_log_debug(" - The certificate has been revoked.\n");
352                        if (verify & GNUTLS_CERT_SIGNER_NOT_FOUND)
353                                fd_log_debug(" - The certificate hasn't got a known issuer.\n");
354                        if (verify & GNUTLS_CERT_SIGNER_NOT_CA)
355                                fd_log_debug(" - The certificate signer is not a CA, or uses version 1, or 3 without basic constraints.\n");
356                        if (verify & GNUTLS_CERT_INSECURE_ALGORITHM)
357                                fd_log_debug(" - The certificate signature uses a weak algorithm.\n");
358                        return EINVAL;
359                }
360       
361                /* Check the local Identity is valid with the certificate */
362                if (!gnutls_x509_crt_check_hostname (certs[0], fd_g_config->cnf_diamid)) {
363                        fd_log_debug("TLS: Local certificate '%s' is invalid :\n", fd_g_config->cnf_sec_data.cert_file);
364                        fd_log_debug(" - The certificate hostname does not match '%s'\n", fd_g_config->cnf_diamid);
365                        return EINVAL;
366                }
367               
368                /* Check validity of all the certificates in the chain */
369                now = time(NULL);
370                for (i = 0; i < cert_max; i++)
371                {
372                        time_t deadline;
373
374                        GNUTLS_TRACE( deadline = gnutls_x509_crt_get_expiration_time(certs[i]) );
375                        if ((deadline != (time_t)-1) && (deadline < now)) {
376                                fd_log_debug("TLS: Local certificate chain '%s' is invalid :\n", fd_g_config->cnf_sec_data.cert_file);
377                                fd_log_debug(" - The certificate %d in the chain is expired\n", i);
378                                return EINVAL;
379                        }
380
381                        GNUTLS_TRACE( deadline = gnutls_x509_crt_get_activation_time(certs[i]) );
382                        if ((deadline != (time_t)-1) && (deadline > now)) {
383                                fd_log_debug("TLS: Local certificate chain '%s' is invalid :\n", fd_g_config->cnf_sec_data.cert_file);
384                                fd_log_debug(" - The certificate %d in the chain is not yet activated\n", i);
385                                return EINVAL;
386                        }
387                }
388               
389                /* Everything checked OK, free the certificate list */
390                for (i = 0; i < cert_max; i++)
391                {
392                        GNUTLS_TRACE( gnutls_x509_crt_deinit (certs[i]) );
393                }
394                free(certs);
395        }
396       
397       
398        /* gnutls_certificate_set_verify_limits -- so far the default values are fine... */
399       
400        /* DH */
401        if (fd_g_config->cnf_sec_data.dh_file) {
402                gnutls_datum_t dhparams = { NULL, 0 };
403                size_t alloc = 0;
404                FILE *stream = fopen (fd_g_config->cnf_sec_data.dh_file, "rb");
405                if (!stream) {
406                        int err = errno;
407                        TRACE_DEBUG(INFO, "An error occurred while opening '%s': %s\n", fd_g_config->cnf_sec_data.dh_file, strerror(err));
408                        return err; 
409                }
410                do {
411                        uint8_t * realloced = NULL;
412                        size_t read = 0;
413                       
414                        if (alloc < dhparams.size + BUFSIZ + 1) {
415                                alloc += alloc / 2 + BUFSIZ + 1;
416                                CHECK_MALLOC_DO( realloced = realloc(dhparams.data, alloc),
417                                        {
418                                                free(dhparams.data);
419                                                return ENOMEM;
420                                        } )
421                                dhparams.data = realloced;
422                        }
423                       
424                        read = fread( dhparams.data + dhparams.size, 1, alloc - dhparams.size - 1, stream );
425                        dhparams.size += read;
426                       
427                        if (ferror(stream)) {
428                                int err = errno;
429                                TRACE_DEBUG(INFO, "An error occurred while reading '%s': %s\n", fd_g_config->cnf_sec_data.dh_file, strerror(err));
430                                return err; 
431                        }
432                } while (!feof(stream));
433                dhparams.data[dhparams.size] = '\0';
434                fclose(stream);
435                CHECK_GNUTLS_DO( gnutls_dh_params_import_pkcs3( 
436                                        fd_g_config->cnf_sec_data.dh_cache,
437                                        &dhparams,
438                                        GNUTLS_X509_FMT_PEM),
439                                         { TRACE_DEBUG(INFO, "Error in DH bits value : %d", fd_g_config->cnf_sec_data.dh_bits ?: GNUTLS_DEFAULT_DHBITS); return EINVAL; } );
440                free(dhparams.data);
441               
442        } else {
443                TRACE_DEBUG(INFO, "Generating fresh Diffie-Hellman parameters of size %d (this takes some time)... ", fd_g_config->cnf_sec_data.dh_bits ?: GNUTLS_DEFAULT_DHBITS);
444                CHECK_GNUTLS_DO( gnutls_dh_params_generate2( 
445                                        fd_g_config->cnf_sec_data.dh_cache,
446                                        fd_g_config->cnf_sec_data.dh_bits ?: GNUTLS_DEFAULT_DHBITS),
447                                         { TRACE_DEBUG(INFO, "Error in DH bits value : %d", fd_g_config->cnf_sec_data.dh_bits ?: GNUTLS_DEFAULT_DHBITS); return EINVAL; } );
448        }                       
449       
450        return 0;
451}
452
453
454/* Destroy contents of fd_g_config structure */
455int fd_conf_deinit()
456{
457        TRACE_ENTRY();
458       
459        if (!fd_g_config)
460                return 0;
461       
462        /* Free the TLS parameters */
463        gnutls_priority_deinit(fd_g_config->cnf_sec_data.prio_cache);
464        gnutls_dh_params_deinit(fd_g_config->cnf_sec_data.dh_cache);
465        gnutls_certificate_free_credentials(fd_g_config->cnf_sec_data.credentials);
466       
467        free(fd_g_config->cnf_sec_data.cert_file); fd_g_config->cnf_sec_data.cert_file = NULL;
468        free(fd_g_config->cnf_sec_data.key_file); fd_g_config->cnf_sec_data.key_file = NULL;
469        free(fd_g_config->cnf_sec_data.ca_file); fd_g_config->cnf_sec_data.ca_file = NULL;
470        free(fd_g_config->cnf_sec_data.crl_file); fd_g_config->cnf_sec_data.crl_file = NULL;
471        free(fd_g_config->cnf_sec_data.prio_string); fd_g_config->cnf_sec_data.prio_string = NULL;
472        free(fd_g_config->cnf_sec_data.dh_file); fd_g_config->cnf_sec_data.dh_file = NULL;
473       
474        /* Destroy dictionary */
475        CHECK_FCT_DO( fd_dict_fini(&fd_g_config->cnf_dict), );
476       
477        /* Destroy the main event queue */
478        CHECK_FCT_DO( fd_fifo_del(&fd_g_config->cnf_main_ev), );
479       
480        /* Destroy the local endpoints and applications */
481        CHECK_FCT_DO(fd_ep_filter(&fd_g_config->cnf_endpoints, 0 ), );
482        CHECK_FCT_DO(fd_app_empty(&fd_g_config->cnf_apps ), );
483       
484        /* Destroy the local identity */       
485        free(fd_g_config->cnf_diamid); fd_g_config->cnf_diamid = NULL;
486        free(fd_g_config->cnf_diamrlm); fd_g_config->cnf_diamrlm = NULL;
487       
488        return 0;
489}
490
491
Note: See TracBrowser for help on using the repository browser.