Make sure prototypes are always included, make some functions static and
[samba.git] / source4 / lib / tls / tls.c
index 73b39f8c2a691d514668b17d122973de6e42a466..f72aafe542fc271e0e67cc9a14b05ab3bed91c82 100644 (file)
@@ -9,7 +9,7 @@
  
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 #include "lib/events/events.h"
 #include "lib/socket/socket.h"
+#include "lib/tls/tls.h"
+#include "param/param.h"
 
-#if HAVE_LIBGNUTLS
+#if ENABLE_GNUTLS
 #include "gnutls/gnutls.h"
 
 #define DH_BITS 1024
@@ -39,7 +40,7 @@ typedef gnutls_datum gnutls_datum_t;
 struct tls_params {
        gnutls_certificate_credentials x509_cred;
        gnutls_dh_params dh_params;
-       BOOL tls_enabled;
+       bool tls_enabled;
 };
 #endif
 
@@ -47,38 +48,38 @@ struct tls_params {
 struct tls_context {
        struct socket_context *socket;
        struct fd_event *fde;
-       BOOL tls_enabled;
-#if HAVE_LIBGNUTLS
+       bool tls_enabled;
+#if ENABLE_GNUTLS
        gnutls_session session;
-       BOOL done_handshake;
-       BOOL have_first_byte;
+       bool done_handshake;
+       bool have_first_byte;
        uint8_t first_byte;
-       BOOL tls_detect;
+       bool tls_detect;
        const char *plain_chars;
-       BOOL output_pending;
+       bool output_pending;
        gnutls_certificate_credentials xcred;
-       BOOL interrupted;
+       bool interrupted;
 #endif
 };
 
-BOOL tls_enabled(struct socket_context *sock)
+bool tls_enabled(struct socket_context *sock)
 {
        struct tls_context *tls;
        if (!sock) {
-               return False;
+               return false;
        }
        if (strcmp(sock->backend_name, "tls") != 0) {
-               return False;
+               return false;
        }
        tls = talloc_get_type(sock->private_data, struct tls_context);
        if (!tls) {
-               return False;
+               return false;
        }
        return tls->tls_enabled;
 }
 
 
-#if HAVE_LIBGNUTLS
+#if ENABLE_GNUTLS
 
 static const struct socket_ops tls_socket_ops;
 
@@ -116,7 +117,7 @@ static ssize_t tls_pull(gnutls_transport_ptr ptr, void *buf, size_t size)
        
        if (tls->have_first_byte) {
                *(uint8_t *)buf = tls->first_byte;
-               tls->have_first_byte = False;
+               tls->have_first_byte = false;
                return 1;
        }
 
@@ -212,7 +213,7 @@ static NTSTATUS tls_handshake(struct tls_context *tls)
                DEBUG(0,("TLS gnutls_handshake failed - %s\n", gnutls_strerror(ret)));
                return NT_STATUS_UNEXPECTED_NETWORK_ERROR;
        }
-       tls->done_handshake = True;
+       tls->done_handshake = true;
        return NT_STATUS_OK;
 }
 
@@ -234,7 +235,7 @@ static NTSTATUS tls_interrupted(struct tls_context *tls)
        if (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) {
                return STATUS_MORE_ENTRIES;
        }
-       tls->interrupted = False;
+       tls->interrupted = false;
        return NT_STATUS_OK;
 }
 
@@ -273,15 +274,15 @@ static NTSTATUS tls_socket_recv(struct socket_context *sock, void *buf,
                status = socket_recv(tls->socket, &tls->first_byte, 1, nread);
                NT_STATUS_NOT_OK_RETURN(status);
                if (*nread == 0) return NT_STATUS_OK;
-               tls->tls_detect = False;
+               tls->tls_detect = false;
                /* look for the first byte of a valid HTTP operation */
                if (strchr(tls->plain_chars, tls->first_byte)) {
                        /* not a tls link */
-                       tls->tls_enabled = False;
+                       tls->tls_enabled = false;
                        *(uint8_t *)buf = tls->first_byte;
                        return NT_STATUS_OK;
                }
-               tls->have_first_byte = True;
+               tls->have_first_byte = true;
        }
 
        if (!tls->tls_enabled) {
@@ -299,7 +300,7 @@ static NTSTATUS tls_socket_recv(struct socket_context *sock, void *buf,
                if (gnutls_record_get_direction(tls->session) == 1) {
                        EVENT_FD_WRITEABLE(tls->fde);
                }
-               tls->interrupted = True;
+               tls->interrupted = true;
                return STATUS_MORE_ENTRIES;
        }
        if (ret < 0) {
@@ -335,11 +336,11 @@ static NTSTATUS tls_socket_send(struct socket_context *sock,
                if (gnutls_record_get_direction(tls->session) == 1) {
                        EVENT_FD_WRITEABLE(tls->fde);
                }
-               tls->interrupted = True;
+               tls->interrupted = true;
                return STATUS_MORE_ENTRIES;
        }
        if (ret < 0) {
-               DEBUG(0,("gnutls_record_send of %d failed - %s\n", blob->length, gnutls_strerror(ret)));
+               DEBUG(0,("gnutls_record_send of %d failed - %s\n", (int)blob->length, gnutls_strerror(ret)));
                return NT_STATUS_UNEXPECTED_NETWORK_ERROR;
        }
        *sendlen = ret;
@@ -351,26 +352,25 @@ static NTSTATUS tls_socket_send(struct socket_context *sock,
 /*
   initialise global tls state
 */
-struct tls_params *tls_initialise(TALLOC_CTX *mem_ctx)
+struct tls_params *tls_initialise(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx)
 {
        struct tls_params *params;
        int ret;
        TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
-       const char *keyfile = private_path(tmp_ctx, lp_tls_keyfile());
-       const char *certfile = private_path(tmp_ctx, lp_tls_certfile());
-       const char *cafile = private_path(tmp_ctx, lp_tls_cafile());
-       const char *crlfile = private_path(tmp_ctx, lp_tls_crlfile());
-       const char *dhpfile = private_path(tmp_ctx, lp_tls_dhpfile());
+       const char *keyfile = private_path(tmp_ctx, lp_ctx, lp_tls_keyfile(lp_ctx));
+       const char *certfile = private_path(tmp_ctx, lp_ctx, lp_tls_certfile(lp_ctx));
+       const char *cafile = private_path(tmp_ctx, lp_ctx, lp_tls_cafile(lp_ctx));
+       const char *crlfile = private_path(tmp_ctx, lp_ctx, lp_tls_crlfile(lp_ctx));
+       const char *dhpfile = private_path(tmp_ctx, lp_ctx, lp_tls_dhpfile(lp_ctx));
        void tls_cert_generate(TALLOC_CTX *, const char *, const char *, const char *);
-
        params = talloc(mem_ctx, struct tls_params);
        if (params == NULL) {
                talloc_free(tmp_ctx);
                return NULL;
        }
 
-       if (!lp_tls_enabled() || keyfile == NULL || *keyfile == 0) {
-               params->tls_enabled = False;
+       if (!lp_tls_enabled(lp_ctx) || keyfile == NULL || *keyfile == 0) {
+               params->tls_enabled = false;
                talloc_free(tmp_ctx);
                return params;
        }
@@ -417,13 +417,16 @@ struct tls_params *tls_initialise(TALLOC_CTX *mem_ctx)
        ret = gnutls_dh_params_init(&params->dh_params);
        if (ret < 0) goto init_failed;
 
-       if (dhpfile) {
+       if (dhpfile && *dhpfile) {
                gnutls_datum_t dhparms;
-               dhparms.data = (uint8_t *)file_load(dhpfile, &dhparms.size, mem_ctx);
+               size_t size;
+               dhparms.data = (uint8_t *)file_load(dhpfile, &size, 0, mem_ctx);
 
                if (!dhparms.data) {
+                       DEBUG(0,("Failed to read DH Parms from %s\n", dhpfile));
                        goto init_failed;
                }
+               dhparms.size = size;
                        
                ret = gnutls_dh_params_import_pkcs3(params->dh_params, &dhparms, GNUTLS_X509_FMT_PEM);
                if (ret < 0) goto init_failed;
@@ -434,14 +437,14 @@ struct tls_params *tls_initialise(TALLOC_CTX *mem_ctx)
                
        gnutls_certificate_set_dh_params(params->x509_cred, params->dh_params);
 
-       params->tls_enabled = True;
+       params->tls_enabled = true;
 
        talloc_free(tmp_ctx);
        return params;
 
 init_failed:
        DEBUG(0,("GNUTLS failed to initialise - %s\n", gnutls_strerror(ret)));
-       params->tls_enabled = False;
+       params->tls_enabled = false;
        talloc_free(tmp_ctx);
        return params;
 }
@@ -506,16 +509,16 @@ struct socket_context *tls_init_server(struct tls_params *params,
 
        tls->plain_chars = plain_chars;
        if (plain_chars) {
-               tls->tls_detect = True;
+               tls->tls_detect = true;
        } else {
-               tls->tls_detect = False;
+               tls->tls_detect = false;
        }
 
-       tls->output_pending  = False;
-       tls->done_handshake  = False;
-       tls->have_first_byte = False;
-       tls->tls_enabled     = True;
-       tls->interrupted     = False;
+       tls->output_pending  = false;
+       tls->done_handshake  = false;
+       tls->have_first_byte = false;
+       tls->tls_enabled     = true;
+       tls->interrupted     = false;
        
        new_sock->state = SOCKET_STATE_SERVER_CONNECTED;
 
@@ -532,7 +535,8 @@ failed:
   setup for a new client connection
 */
 struct socket_context *tls_init_client(struct socket_context *socket,
-                                      struct fd_event *fde)
+                                      struct fd_event *fde,
+                                      const char *ca_path)
 {
        struct tls_context *tls;
        int ret = 0;
@@ -561,16 +565,10 @@ struct socket_context *tls_init_client(struct socket_context *socket,
        }
        new_sock->private_data    = tls;
 
-       cafile = private_path(tls, lp_tls_cafile());
-       if (!cafile || !*cafile) {
-               goto failed;
-       }
-
        gnutls_global_init();
 
        gnutls_certificate_allocate_credentials(&tls->xcred);
        gnutls_certificate_set_x509_trust_file(tls->xcred, cafile, GNUTLS_X509_FMT_PEM);
-       talloc_free(cafile);
        TLSCHECK(gnutls_init(&tls->session, GNUTLS_CLIENT));
        TLSCHECK(gnutls_set_default_priority(tls->session));
        gnutls_certificate_type_set_priority(tls->session, cert_type_priority);
@@ -582,13 +580,13 @@ struct socket_context *tls_init_client(struct socket_context *socket,
        gnutls_transport_set_pull_function(tls->session, (gnutls_pull_func)tls_pull);
        gnutls_transport_set_push_function(tls->session, (gnutls_push_func)tls_push);
        gnutls_transport_set_lowat(tls->session, 0);
-       tls->tls_detect = False;
+       tls->tls_detect = false;
 
-       tls->output_pending  = False;
-       tls->done_handshake  = False;
-       tls->have_first_byte = False;
-       tls->tls_enabled     = True;
-       tls->interrupted     = False;
+       tls->output_pending  = false;
+       tls->done_handshake  = false;
+       tls->have_first_byte = false;
+       tls->tls_enabled     = true;
+       tls->interrupted     = false;
        
        new_sock->state = SOCKET_STATE_CLIENT_CONNECTED;
 
@@ -596,7 +594,7 @@ struct socket_context *tls_init_client(struct socket_context *socket,
 
 failed:
        DEBUG(0,("TLS init connection failed - %s\n", gnutls_strerror(ret)));
-       tls->tls_enabled = False;
+       tls->tls_enabled = false;
        return new_sock;
 }
 
@@ -645,7 +643,7 @@ static const struct socket_ops tls_socket_ops = {
        .fn_get_fd              = tls_socket_get_fd
 };
 
-BOOL tls_support(struct tls_params *params)
+bool tls_support(struct tls_params *params)
 {
        return params->tls_enabled;
 }
@@ -655,7 +653,7 @@ BOOL tls_support(struct tls_params *params)
 /* for systems without tls we just fail the operations, and the caller
  * will retain the original socket */
 
-struct tls_params *tls_initialise(TALLOC_CTX *mem_ctx)
+struct tls_params *tls_initialise(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx)
 {
        return talloc_new(mem_ctx);
 }
@@ -676,14 +674,15 @@ struct socket_context *tls_init_server(struct tls_params *params,
   setup for a new client connection
 */
 struct socket_context *tls_init_client(struct socket_context *socket,
-                                      struct fd_event *fde)
+                                      struct fd_event *fde,
+                                      const char *ca_path)
 {
        return NULL;
 }
 
-BOOL tls_support(struct tls_params *params)
+bool tls_support(struct tls_params *params)
 {
-       return False;
+       return false;
 }
 
 #endif