From 368a7df9bc400edbe9226838ebfde4ac98a8321c Mon Sep 17 00:00:00 2001 From: Søren Sandmann Date: Mon, 30 Jul 2007 06:41:15 -0400 Subject: Fix a couple of bugs --- src/lactlsconnection.c | 71 +++++++++++++++++++++++++++++++-------- tests/Makefile.am | 2 ++ tests/simple-tls-test.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 13 deletions(-) create mode 100644 tests/simple-tls-test.c diff --git a/src/lactlsconnection.c b/src/lactlsconnection.c index 45cf7fd..3fe235f 100644 --- a/src/lactlsconnection.c +++ b/src/lactlsconnection.c @@ -53,6 +53,18 @@ emit_error (LacTlsConnection *tls, g_error_free (err); } +static void +print_alert (gnutls_session session) +{ + gnutls_alert_description_t d; + + d = gnutls_alert_get (session); + + g_print ("alert no: %d\n", d); + + g_print ("alert: %s\n", gnutls_alert_get_name (d)); +} + static void do_handshake (LacTlsConnection *tls) { @@ -75,15 +87,30 @@ do_handshake (LacTlsConnection *tls) if (res != GNUTLS_E_INTERRUPTED && res != GNUTLS_E_AGAIN) { - g_print (" handshake error\n"); + g_print (" handshake error: %d (%s)\n", + res, gnutls_strerror (res)); + + if (res == GNUTLS_E_WARNING_ALERT_RECEIVED) + { + print_alert (tls->session); + } + else if (res == GNUTLS_E_FATAL_ALERT_RECEIVED) + { + print_alert (tls->session); + } + /* FIXME: emit an error */ - lac_connection_close (tls->tcp_connection); - return; + if (gnutls_error_is_fatal (res)) + { + g_print ("fatal\n"); + lac_connection_close (tls->tcp_connection); + } + else + g_print (" not fatal\n"); } else { g_print (" insufficient data\n"); - return; } } else @@ -158,6 +185,17 @@ tcp_callback (LacConnection *connection, case LAC_CONNECTION_EVENT_READ: g_print ("READ HAPPENED \n"); /* add data to buffer */ + + g_print ("bytes read: %d bytes: %x %x %x %x %x %x %x\n", + event->read.len, + event->read.data[0], + event->read.data[1], + event->read.data[2], + event->read.data[3], + event->read.data[4], + event->read.data[5], + event->read.data[6]); + lac_byte_queue_append (tls->buffer, event->read.data, event->read.len); /* Writing sometimes requires data to be available for reading @@ -225,13 +263,22 @@ tcp_callback (LacConnection *connection, static ssize_t tls_push (gnutls_transport_ptr_t tptr, - const void *data, + const char *data, size_t n_bytes) { LacTlsConnection *tls = (LacTlsConnection *)tptr; - g_print ("pushing some data\n"); + g_print ("pushing some data (%d bytes)\n", n_bytes); + g_print ("bytes pushed: bytes: %x %x %x %x %x %x %x\n", + data[0], + data[1], + data[2], + data[3], + data[4], + data[5], + data[6]); + lac_connection_write (tls->tcp_connection, data, n_bytes); return n_bytes; @@ -239,15 +286,13 @@ tls_push (gnutls_transport_ptr_t tptr, static ssize_t tls_pull (gnutls_transport_ptr_t tptr, - void *data, + char *data, size_t n_bytes) { LacTlsConnection *tls = (LacTlsConnection *)tptr; const gchar *buf; gsize n_available; - g_print ("pulling data\n"); - buf = lac_byte_queue_peek (tls->buffer, &n_available); if (n_available > 0) @@ -258,11 +303,12 @@ tls_pull (gnutls_transport_ptr_t tptr, errno = 0; + lac_byte_queue_delete_head (tls->buffer, minimum); + return minimum; } else { - g_print (" nothing available\n"); errno = EAGAIN; return -1; @@ -291,13 +337,12 @@ lac_tls_connection_new (const LacAddress *address, gnutls_set_default_priority (tls->session); gnutls_kx_set_priority (tls->session, kx_prio); gnutls_credentials_set (tls->session, - GNUTLS_CRD_ANON, &tls->anoncred); - + GNUTLS_CRD_ANON, tls->anoncred); + gnutls_transport_set_ptr (tls->session, (gnutls_transport_ptr_t)tls); gnutls_transport_set_push_function (tls->session, tls_push); gnutls_transport_set_pull_function (tls->session, tls_pull); - return tls; } diff --git a/tests/Makefile.am b/tests/Makefile.am index ccf8b77..72faa51 100755 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -11,6 +11,7 @@ TESTPROGRAMS = \ connection2-test \ udp-test \ tls-test \ + simple-tls-test \ watch-test \ lacwget @@ -35,6 +36,7 @@ connection2_test_LDADD = $(top_builddir)/src/liblac-1.la http_test_LDADD = $(top_builddir)/src/liblac-1.la udp_test_LDADD = $(top_builddir)/src/liblac-1.la tls_test_LDADD = $(top_builddir)/src/liblac-1.la +simple_tls_test_LDADD = $(top_builddir)/src/liblac-1.la watch_test_LDADD = $(top_builddir)/src/liblac-1.la lacwget_LDADD = $(top_builddir)/src/liblac-1.la $(MODULES_XML_LIBS) lacwget_CFLAGS = $(MODULES_XML_CFLAGS) diff --git a/tests/simple-tls-test.c b/tests/simple-tls-test.c new file mode 100644 index 0000000..ea9c820 --- /dev/null +++ b/tests/simple-tls-test.c @@ -0,0 +1,89 @@ +#include +#include +#include +static ssize_t +tls_push (gnutls_transport_ptr_t tptr, + const char *data, + size_t n_bytes) +{ + int fd = tptr; + + g_print ("%x %x %x %x %x %x %x\n", + data[0], data[1], data[2], + data[3], data[4], data[5], data[6]); + + lac_send (fd, data, n_bytes, NULL); + + return n_bytes; +} + +static ssize_t +tls_pull (gnutls_transport_ptr_t tptr, + void *data, + size_t n_bytes) +{ + int fd = tptr; + int n_read; + + n_read = lac_recv (fd, data, n_bytes, NULL); + + return n_read; +} + +int +main (void) +{ + int fd; + int ret, sd, ii; + gnutls_session_t session; + char buffer[8192 + 1]; + gnutls_anon_client_credentials_t anoncred; + /* Need to enable anonymous KX specifically. */ + const int kx_prio[] = { GNUTLS_KX_ANON_DH, 0 }; + LacAddress *addr; + + gnutls_global_init (); + + gnutls_anon_allocate_client_credentials (&anoncred); + + /* Initialize TLS session + */ + gnutls_init (&session, GNUTLS_CLIENT); + + /* Use default priorities */ + gnutls_set_default_priority (session); + gnutls_kx_set_priority (session, kx_prio); + + /* put the anonymous credentials to the current session + */ + fd = lac_socket_tcp (NULL); + gnutls_credentials_set (session, GNUTLS_CRD_ANON, anoncred); + gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) fd); +#if 0 + gnutls_transport_set_push_function (session, tls_push); + gnutls_transport_set_pull_function (session, tls_pull); +#endif + + + /* connect to the peer + */ + addr = lac_address_new_from_name_wait ("www.google.com", NULL); + sd = lac_connect (fd, addr, 443, NULL); + + /* Perform the TLS handshake + */ + ret = gnutls_handshake (session); + + if (ret < 0) + { + fprintf (stderr, "*** Handshake failed (%d)\n", ret); + gnutls_perror (ret); + goto end; + } + else + { + printf ("- Handshake was completed\n"); + } +end: + ; +} -- cgit v1.2.3