Changeset fcb122d in mod_gnutls for src/mod_gnutls.c


Ignore:
Timestamp:
Apr 5, 2005, 12:39:18 PM (14 years ago)
Author:
Paul Querna <chip@…>
Branches:
debian/master, debian/stretch-backports, jessie-backports, master, msva, upstream
Children:
42307a9
Parents:
6e0bfd6
Message:

checkpoint the work so far. The DBM cache needs a little more work.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/mod_gnutls.c

    r6e0bfd6 rfcb122d  
    1 /* ====================================================================
    2  *  Copyright 2004 Paul Querna
     1/**
     2 *  Copyright 2004-2005 Paul Querna
    33 *
    44 *  Licensed under the Apache License, Version 2.0 (the "License");
     
    2222#endif
    2323
     24static apr_file_t* debug_log_fp;
     25
    2426static apr_status_t mod_gnutls_cleanup_pre_config(void *data)
    2527{
     
    2830}
    2931
     32static void gnutls_debug_log_all( int level, const char* str)
     33{
     34    apr_file_printf(debug_log_fp, "<%d> %s\n", level, str);
     35}
     36
    3037static int mod_gnutls_hook_pre_config(apr_pool_t * pconf,
    3138                                      apr_pool_t * plog, apr_pool_t * ptemp)
     
    3340
    3441#if APR_HAS_THREADS
     42    /* TODO: Check MPM Type here */
    3543    gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
    3644#endif
     
    4149                              apr_pool_cleanup_null);
    4250
     51    apr_file_open(&debug_log_fp, "/tmp/gnutls_debug",
     52                  APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT, pconf);
     53
     54    gnutls_global_set_log_level(9);
     55    gnutls_global_set_log_function(gnutls_debug_log_all);
     56
    4357    return OK;
    4458}
    4559
    46 #define DH_BITS 1024
    47 #ifdef USE_RSA
    48 #define RSA_BITS 512
    49 #endif
     60
     61static gnutls_datum load_params(const char* file, server_rec* s,
     62                                apr_pool_t* pool)
     63{
     64    gnutls_datum ret = { NULL, 0 };
     65    apr_file_t* fp;
     66    apr_finfo_t finfo;
     67    apr_status_t rv;
     68    apr_size_t br = 0;
     69
     70    rv = apr_file_open(&fp, file, APR_READ|APR_BINARY, APR_OS_DEFAULT,
     71                       pool);
     72    if (rv != APR_SUCCESS) {
     73        ap_log_error(APLOG_MARK, APLOG_STARTUP, rv, s,
     74                     "GnuTLS failed to load params file at: %s", file);
     75        return ret;
     76    }
     77
     78    rv = apr_file_info_get(&finfo, APR_FINFO_SIZE, fp);
     79
     80    if (rv != APR_SUCCESS) {
     81        ap_log_error(APLOG_MARK, APLOG_STARTUP, rv, s,
     82                     "GnuTLS failed to stat params file at: %s", file);
     83        return ret;
     84    }
     85
     86    ret.data = apr_palloc(pool, finfo.size+1);
     87    rv = apr_file_read_full(fp, ret.data, finfo.size, &br);
     88
     89    if (rv != APR_SUCCESS) {
     90        ap_log_error(APLOG_MARK, APLOG_STARTUP, rv, s,
     91                     "GnuTLS failed to read params file at: %s", file);
     92        return ret;
     93    }
     94
     95    ret.data[br] = '\0';
     96    ret.size = br;
     97
     98    return ret;
     99}
     100
    50101static int mod_gnutls_hook_post_config(apr_pool_t * p, apr_pool_t * plog,
    51102                                       apr_pool_t * ptemp,
    52103                                       server_rec * base_server)
    53104{
     105    int rv;
     106    server_rec *s;
     107    gnutls_dh_params_t dh_params;
     108    gnutls_rsa_params_t rsa_params;
    54109    mod_gnutls_srvconf_rec *sc;
     110    mod_gnutls_srvconf_rec *sc_base;
    55111    void *data = NULL;
    56112    int first_run = 0;
    57     server_rec *s;
    58     gnutls_dh_params_t dh_params;
    59 #ifdef USE_RSA
    60     gnutls_rsa_params_t rsa_params;
    61 #endif
    62113    const char *userdata_key = "mod_gnutls_init";
    63114         
     
    71122
    72123
    73 //    if(first_run) {
    74         /* TODO: Should we regenerate these after X requests / X time ? */
     124    if (!first_run) {
     125        gnutls_datum pdata;
     126        apr_pool_t* tpool;
     127        s = base_server;
     128        sc_base = (mod_gnutls_srvconf_rec *) ap_get_module_config(s->module_config,
     129                                                             &gnutls_module);
     130
     131        apr_pool_create(&tpool, p);
     132
    75133        gnutls_dh_params_init(&dh_params);
    76         gnutls_dh_params_generate2(dh_params, DH_BITS);
    77 #ifdef USE_RSA
     134
     135        pdata = load_params(sc_base->dh_params_file, s, tpool);
     136
     137        if (pdata.size != 0) {
     138            rv = gnutls_dh_params_import_pkcs3(dh_params, &pdata,
     139                                               GNUTLS_X509_FMT_PEM);
     140            if (rv != 0) {
     141                ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, s,
     142                             "GnuTLS: Unable to load DH Params: (%d) %s",
     143                             rv, gnutls_strerror(rv));
     144                exit(rv);
     145            }
     146        }
     147        else {
     148            ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, s,
     149                         "GnuTLS: Unable to load DH Params."
     150                         " Shutting Down.");
     151            exit(-1);
     152        }
     153        apr_pool_clear(tpool);
     154
    78155        gnutls_rsa_params_init(&rsa_params);
    79         gnutls_rsa_params_generate2(rsa_params, RSA_BITS);
    80 #endif
    81 //    }
    82 
    83     for (s = base_server; s; s = s->next) {
    84         sc = (mod_gnutls_srvconf_rec *) ap_get_module_config(s->module_config,
    85                                                              &gnutls_module);
    86         if (sc->cert_file != NULL && sc->key_file != NULL) {
    87             gnutls_certificate_set_x509_key_file(sc->certs, sc->cert_file,
     156
     157        pdata = load_params(sc_base->rsa_params_file, s, tpool);
     158
     159        if (pdata.size != 0) {
     160            rv = gnutls_rsa_params_import_pkcs1(rsa_params, &pdata,
     161                                                GNUTLS_X509_FMT_PEM);
     162            if (rv != 0) {
     163                ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, s,
     164                             "GnuTLS: Unable to load RSA Params: (%d) %s",
     165                             rv, gnutls_strerror(rv));
     166                exit(rv);
     167            }
     168        }
     169        else {
     170            ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, s,
     171                         "GnuTLS: Unable to load RSA Params."
     172                         " Shutting Down.");
     173            exit(-1);
     174        }
     175
     176        apr_pool_destroy(tpool);
     177        rv = mod_gnutls_cache_post_config(p, s, sc_base);
     178        if (rv != 0) {
     179            ap_log_error(APLOG_MARK, APLOG_STARTUP, rv, s,
     180                         "GnuTLS: Post Config for GnuTLSCache Failed."
     181                         " Shutting Down.");
     182            exit(-1);
     183        }
     184         
     185        for (s = base_server; s; s = s->next) {
     186            sc = (mod_gnutls_srvconf_rec *) ap_get_module_config(s->module_config,
     187                                                                 &gnutls_module);
     188            sc->cache_type = sc_base->cache_type;
     189            sc->cache_config = sc_base->cache_config;
     190
     191            if (sc->cert_file != NULL && sc->key_file != NULL) {
     192                rv = gnutls_certificate_set_x509_key_file(sc->certs, sc->cert_file,
    88193                                                 sc->key_file,
    89194                                                 GNUTLS_X509_FMT_PEM);
    90 #ifdef USE_RSA
    91           gnutls_certificate_set_rsa_export_params(sc->certs, rsa_params);
    92 #endif
    93           gnutls_certificate_set_dh_params(sc->certs, dh_params);
    94         }
    95         else if (sc->enabled == GNUTLS_ENABLED_TRUE) {
    96             ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s,
    97                          "[GnuTLS] - Host '%s:%d' is missing a Cert and Key File!",
     195                if (rv != 0) {
     196                    ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s,
     197                         "[GnuTLS] - Host '%s:%d' has an invalid key or certificate:"
     198                         "(%s,%s) (%d) %s",
     199                         s->server_hostname, s->port, sc->cert_file, sc->key_file,
     200                         rv, gnutls_strerror(rv));
     201                }
     202                else {
     203                    gnutls_certificate_set_rsa_export_params(sc->certs,
     204                                                     rsa_params);
     205                    gnutls_certificate_set_dh_params(sc->certs, dh_params);
     206                }
     207            }
     208            else if (sc->enabled == GNUTLS_ENABLED_TRUE) {
     209                ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s,
     210                             "[GnuTLS] - Host '%s:%d' is missing a "
     211                             "Cert and Key File!",
    98212                         s->server_hostname, s->port);
    99         }
    100     }
    101 
     213            }
     214        }
     215    } /* first_run */
    102216
    103217    ap_add_version_component(p, "GnuTLS/" LIBGNUTLS_VERSION);
     
    112226                                                      &gnutls_module);
    113227
    114     if(sc->cache_config != NULL) {
     228    if (sc->cache_type != mod_gnutls_cache_none) {
    115229        rv = mod_gnutls_cache_child_init(p, s, sc);
    116230        if(rv != APR_SUCCESS) {
     
    120234    }
    121235    else {
    122             ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s,
    123                              "[GnuTLS] - No Cache Configured. Hint: GnuTLSCache");
     236        ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s,
     237                     "[GnuTLS] - No Cache Configured. Hint: GnuTLSCache");
    124238    }
    125239}
     
    177291    gnutls_init(&ctxt->session, GNUTLS_SERVER);
    178292
     293    gnutls_protocol_set_priority(ctxt->session, sc->protocol);
    179294    gnutls_cipher_set_priority(ctxt->session, sc->ciphers);
    180295    gnutls_compression_set_priority(ctxt->session, sc->compression);
    181296    gnutls_kx_set_priority(ctxt->session, sc->key_exchange);
    182     gnutls_protocol_set_priority(ctxt->session, sc->protocol);
    183297    gnutls_mac_set_priority(ctxt->session, sc->macs);
     298    gnutls_certificate_type_set_priority(ctxt->session, sc->cert_types);
    184299
    185300    gnutls_credentials_set(ctxt->session, GNUTLS_CRD_CERTIFICATE, sc->certs);
     301
    186302//  if(anon) {
    187303//    gnutls_credentials_set(ctxt->session, GNUTLS_CRD_ANON, sc->anoncred);
     
    189305
    190306    gnutls_certificate_server_set_request(ctxt->session, GNUTLS_CERT_IGNORE);
    191 
    192     gnutls_dh_set_prime_bits(ctxt->session, DH_BITS);
    193307
    194308    mod_gnutls_cache_session_init(ctxt);
     
    217331                                       mod_gnutls_transport_write);
    218332    gnutls_transport_set_ptr(ctxt->session, ctxt);
    219     ctxt->input_filter = ap_add_input_filter(GNUTLS_INPUT_FILTER_NAME, ctxt, NULL, c);
    220     ctxt->output_filter = ap_add_output_filter(GNUTLS_OUTPUT_FILTER_NAME, ctxt, NULL, c);
     333   
     334    ctxt->input_filter = ap_add_input_filter(GNUTLS_INPUT_FILTER_NAME, ctxt,
     335                                             NULL, c);
     336    ctxt->output_filter = ap_add_output_filter(GNUTLS_OUTPUT_FILTER_NAME, ctxt,
     337                                               NULL, c);
    221338
    222339    return OK;
     
    234351        return DECLINED;
    235352    }
     353
    236354    apr_table_setn(env, "HTTPS", "on");
    237355    apr_table_setn(env, "SSL_PROTOCOL",
     
    272390
    273391static const char *gnutls_set_cache(cmd_parms * parms, void *dummy,
    274                                        const char *arg)
     392                                       const char *type, const char* arg)
    275393{
    276394    const char* err;
     
    282400    }
    283401
    284     sc->cache_config = apr_pstrdup(parms->pool, arg);
     402    if (strcasecmp("none", type) == 0) {
     403        sc->cache_type = mod_gnutls_cache_none;
     404    }
     405    else if (strcasecmp("dbm", type) == 0) {
     406        sc->cache_type = mod_gnutls_cache_dbm;
     407    }
     408#if HAVE_APR_MEMCACHE
     409    else if (strcasecmp("memcache", type) == 0) {
     410        sc->cache_type = mod_gnutls_cache_memcache;
     411    }
     412#endif
     413    else {
     414        return "Invalid Type for GnuTLSCache!";
     415    }
     416
     417    if (sc->cache_type == mod_gnutls_cache_dbm) {
     418        sc->cache_config = ap_server_root_relative(parms->pool, arg);
     419    }
     420    else {
     421        sc->cache_config = apr_pstrdup(parms->pool, arg);
     422    }
     423
    285424    return NULL;
    286425}
     
    315454                  RSRC_CONF,
    316455                  "SSL Server Certificate file"),
    317     AP_INIT_TAKE1("GnuTLSCache", gnutls_set_cache,
     456    AP_INIT_TAKE2("GnuTLSCache", gnutls_set_cache,
    318457                  NULL,
    319458                  RSRC_CONF,
    320                   "SSL Server Certificate file"),
     459                  "Cache Configuration"),
    321460    AP_INIT_TAKE1("GnuTLSEnable", gnutls_set_enabled,
    322461                  NULL, RSRC_CONF,
     
    373512    sc->key_file = NULL;
    374513    sc->cert_file = NULL;
    375     sc->cache_config = NULL;
    376 
     514    sc->cache_timeout = apr_time_from_sec(3600);
     515    sc->cache_type = mod_gnutls_cache_dbm;
     516    sc->cache_config = ap_server_root_relative(p, "conf/gnutls_cache");
     517
     518    /* TODO: Make this Configurable ! */
     519    sc->dh_params_file = ap_server_root_relative(p, "conf/dhfile");
     520    sc->rsa_params_file = ap_server_root_relative(p, "conf/rsafile");
     521
     522    /* TODO: Make this Configurable ! */
     523    /* meh. mod_ssl uses a flex based parser for this part.. sigh */
    377524    i = 0;
    378525    sc->ciphers[i++] = GNUTLS_CIPHER_AES_256_CBC;
     
    384531
    385532    i = 0;
    386     sc->key_exchange[i++] = GNUTLS_KX_DHE_DSS;
    387533    sc->key_exchange[i++] = GNUTLS_KX_RSA;
    388     sc->key_exchange[i++] = GNUTLS_KX_DHE_RSA;
    389534    sc->key_exchange[i++] = GNUTLS_KX_RSA_EXPORT;
    390535    sc->key_exchange[i++] = GNUTLS_KX_DHE_DSS;
     536    sc->key_exchange[i++] = GNUTLS_KX_DHE_RSA;
     537    sc->key_exchange[i++] = GNUTLS_KX_ANON_DH;
     538    sc->key_exchange[i++] = GNUTLS_KX_SRP;
     539    sc->key_exchange[i++] = GNUTLS_KX_SRP_RSA;
     540    sc->key_exchange[i++] = GNUTLS_KX_SRP_DSS;
    391541    sc->key_exchange[i] = 0;
    392542
     
    409559    sc->compression[i] = 0;
    410560
     561    i = 0;
     562    sc->cert_types[i++] = GNUTLS_CRT_X509;
     563    sc->cert_types[i] = 0;
     564 
    411565    return sc;
    412566}
Note: See TracChangeset for help on using the changeset viewer.