summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2007-07-30 06:41:15 -0400
committerSøren Sandmann <sandmann@redhat.com>2007-07-30 06:41:15 -0400
commit368a7df9bc400edbe9226838ebfde4ac98a8321c (patch)
tree22fdf3c8975ec9b7bebcba79c464bec8d9f4ece3
parent0c87c11dd40692a3d9edff224ac8b2b5f482e01a (diff)
Fix a couple of bugs
-rw-r--r--src/lactlsconnection.c71
-rwxr-xr-xtests/Makefile.am2
-rw-r--r--tests/simple-tls-test.c89
3 files changed, 149 insertions, 13 deletions
diff --git a/src/lactlsconnection.c b/src/lactlsconnection.c
index 45cf7fd..3fe235f 100644
--- a/src/lactlsconnection.c
+++ b/src/lactlsconnection.c
@@ -54,6 +54,18 @@ emit_error (LacTlsConnection *tls,
}
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)
{
if (!tls->need_handshake)
@@ -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 <stdio.h>
+#include <lac.h>
+#include <gnutls/gnutls.h>
+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:
+ ;
+}