Navigation


Changeset 578:7c9a00bfd115 in freeDiameter for freeDiameter/config.c


Ignore:
Timestamp:
Oct 27, 2010, 10:52:30 AM (14 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Allow TLS Diffie-Hellmann parameters to be loaded from a file (ticket #17)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • freeDiameter/config.c

    r542 r578  
    134134        fd_log_debug("          - CRL .......... : %s\n", fd_g_config->cnf_sec_data.crl_file ?: "(none)");
    135135        fd_log_debug("          - Priority ..... : %s\n", fd_g_config->cnf_sec_data.prio_string ?: "(default: '" GNUTLS_DEFAULT_PRIORITY "')");
    136         fd_log_debug("          - DH bits ...... : %d\n", fd_g_config->cnf_sec_data.dh_bits ?: GNUTLS_DEFAULT_DHBITS);
     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);
    137140       
    138141        fd_log_debug("  Origin-State-Id ........ : %u\n", fd_g_config->cnf_orstateid);
     
    261264                                 { TRACE_DEBUG(INFO, "Error in priority string at position : %s", err_pos); return EINVAL; } );
    262265        }
    263         if (! fd_g_config->cnf_sec_data.dh_bits) {
    264                 TRACE_DEBUG(INFO, "Generating Diffie-Hellman parameters of size %d (this takes a few seconds)... ", GNUTLS_DEFAULT_DHBITS);
    265                 CHECK_GNUTLS_DO( gnutls_dh_params_generate2(
    266                                         fd_g_config->cnf_sec_data.dh_cache,
    267                                         GNUTLS_DEFAULT_DHBITS),
    268                                  { TRACE_DEBUG(INFO, "Error in DH bits value : %d", GNUTLS_DEFAULT_DHBITS); return EINVAL; } );
    269         }
    270        
    271266       
    272267        /* Verify that our certificate is valid -- otherwise remote peers will reject it */
     
    403398        /* gnutls_certificate_set_verify_limits -- so far the default values are fine... */
    404399       
     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       
    405450        return 0;
    406451}
     
    422467        free(fd_g_config->cnf_sec_data.crl_file); fd_g_config->cnf_sec_data.crl_file = NULL;
    423468        free(fd_g_config->cnf_sec_data.prio_string); fd_g_config->cnf_sec_data.prio_string = NULL;
     469        free(fd_g_config->cnf_sec_data.dh_file); fd_g_config->cnf_sec_data.dh_file = NULL;
    424470       
    425471        /* Destroy dictionary */
Note: See TracChangeset for help on using the changeset viewer.