]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Combined the safe renegotiation tests with the again-common lib.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 10 Apr 2011 22:00:49 +0000 (00:00 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 10 Apr 2011 22:00:49 +0000 (00:00 +0200)
tests/eagain-common.h
tests/safe-renegotiation/Makefile.am
tests/safe-renegotiation/srn0.c
tests/safe-renegotiation/srn1.c
tests/safe-renegotiation/srn2.c
tests/safe-renegotiation/srn3.c
tests/safe-renegotiation/srn4.c
tests/safe-renegotiation/srn5.c

index 473e236c21ee47cd2b9620fbdcfea464460aff37..d75e78782fa60c56ac9848423a593436631b73f6 100644 (file)
@@ -1,7 +1,7 @@
 #define min(x,y) ((x)<(y)?(x):(y))
 //#define EAGAIN_DEBUG
 
-#define HANDSHAKE(c, s) \
+#define HANDSHAKE_EXPECT(c, s, clierr, serverr) \
   sret = cret = GNUTLS_E_AGAIN; \
   do \
     { \
@@ -14,8 +14,8 @@
           sret = gnutls_handshake (s); \
         } \
     } \
-  while (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN); \
-  if (cret < 0 || sret < 0) \
+  while ((cret == GNUTLS_E_AGAIN || (cret == 0 && sret == GNUTLS_E_AGAIN)) && (sret == GNUTLS_E_AGAIN || (sret == 0 && cret == GNUTLS_E_AGAIN))); \
+  if (cret != clierr || sret != serverr) \
     { \
       fprintf(stderr, "client: %s\n", gnutls_strerror(cret)); \
       fprintf(stderr, "server: %s\n", gnutls_strerror(sret)); \
@@ -23,6 +23,9 @@
       exit(1); \
     }
 
+#define HANDSHAKE(c, s) \
+  HANDSHAKE_EXPECT(c,s,0,0)
+
 #define TRANSFER(c, s, msg, msglen, buf, buflen) \
   do \
     { \
@@ -131,7 +134,7 @@ client_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
 #ifdef EAGAIN_DEBUG
       fprintf(stderr, "eagain: Not enough data by server (asked for: %d, have: %d)\n", (int)len, (int)to_client_len);
 #endif
-      gnutls_transport_set_global_errno (EAGAIN);
+      gnutls_transport_set_errno ((gnutls_session_t)tr, EAGAIN);
       return -1;
     }
 
@@ -158,7 +161,7 @@ server_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
 #ifdef EAGAIN_DEBUG
       fprintf(stderr, "eagain: Not enough data by client (asked for: %d, have: %d)\n", (int)len, (int)to_server_len);
 #endif
-      gnutls_transport_set_global_errno (EAGAIN);
+      gnutls_transport_set_errno ((gnutls_session_t)tr, EAGAIN);
       return -1;
     }
 
index d6a5593ca60e897a47a63e4541f4ce342b2c9cd9..8b0c65833aaeac8bd7e480b078f462b3e08be163 100644 (file)
@@ -23,7 +23,8 @@ AM_CPPFLAGS = \
        -I$(top_builddir)/lib/includes
 
 AM_LDFLAGS = -no-install
-LDADD = ../../lib/libgnutls.la $(LTLIBGCRYPT) $(LIBSOCKET)
+LDADD = ../libutils.la \
+       ../../lib/libgnutls.la $(LTLIBGCRYPT) $(LIBSOCKET)
 
 ctests = srn0 srn1 srn2 srn3 srn4 srn5
 
index 629fd7664ba082b816ad1709a6b8eb8abb6df0c8..71839f738def04e18c9b663a7e1bea774c4ab123 100644 (file)
@@ -37,6 +37,8 @@
 #include <string.h>
 #include <errno.h>
 #include <gnutls/gnutls.h>
+#include "../eagain-common.h"
+#include "../utils.h"
 
 static void
 tls_log_func (int level, const char *str)
@@ -44,80 +46,6 @@ tls_log_func (int level, const char *str)
   fprintf (stderr, "|<%d>| %s", level, str);
 }
 
-static char *to_server;
-static size_t to_server_len;
-
-static char *to_client;
-static size_t to_client_len;
-
-static ssize_t
-client_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_client_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_client, len);
-
-  memmove (to_client, to_client + len, to_client_len - len);
-  to_client_len -= len;
-
-  return len;
-}
-
-static ssize_t
-client_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_server_len + len;
-  char *tmp;
-
-  tmp = realloc (to_server, newlen);
-  if (!tmp)
-    abort ();
-  to_server = tmp;
-
-  memcpy (to_server + to_server_len, data, len);
-  to_server_len = newlen;
-
-  return len;
-}
-
-static ssize_t
-server_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_server_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_server, len);
-
-  memmove (to_server, to_server + len, to_server_len - len);
-  to_server_len -= len;
-
-  return len;
-}
-
-static ssize_t
-server_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_client_len + len;
-  char *tmp;
-
-  tmp = realloc (to_client, newlen);
-  if (!tmp)
-    abort ();
-  to_client = tmp;
-
-  memcpy (to_client + to_client_len, data, len);
-  to_client_len = newlen;
-
-  return len;
-}
-
 static unsigned char server_cert_pem[] =
   "-----BEGIN CERTIFICATE-----\n"
   "MIICVjCCAcGgAwIBAgIERiYdMTALBgkqhkiG9w0BAQUwGTEXMBUGA1UEAxMOR251\n"
@@ -159,11 +87,8 @@ const gnutls_datum_t server_key = { server_key_pem,
   sizeof (server_key_pem)
 };
 
-int
-main (int argc, char *argv[])
+void doit(void)
 {
-  int debug_level = argc - 1;
-  int exit_code = EXIT_SUCCESS;
   /* Server stuff. */
   gnutls_certificate_credentials_t serverx509cred;
   gnutls_session_t server;
@@ -176,7 +101,7 @@ main (int argc, char *argv[])
   /* General init. */
   gnutls_global_init ();
   gnutls_global_set_log_function (tls_log_func);
-  gnutls_global_set_log_level (debug_level);
+  if (debug) gnutls_global_set_log_level (2);
 
   /* Init server */
   gnutls_certificate_allocate_credentials (&serverx509cred);
@@ -188,6 +113,7 @@ main (int argc, char *argv[])
   gnutls_priority_set_direct (server, "NORMAL", NULL);
   gnutls_transport_set_push_function (server, server_push);
   gnutls_transport_set_pull_function (server, server_pull);
+  gnutls_transport_set_ptr (server, (gnutls_transport_ptr_t)server);
 
   /* Init client */
   gnutls_certificate_allocate_credentials (&clientx509cred);
@@ -196,53 +122,19 @@ main (int argc, char *argv[])
   gnutls_priority_set_direct (client, "NORMAL", NULL);
   gnutls_transport_set_push_function (client, client_push);
   gnutls_transport_set_pull_function (client, client_pull);
+  gnutls_transport_set_ptr (client, (gnutls_transport_ptr_t)client);
 
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_SUCCESS && sret == GNUTLS_E_SUCCESS)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SUCCESS)
-    exit_code = EXIT_FAILURE;
+  HANDSHAKE(client, server);
 
   if (!gnutls_safe_renegotiation_status (client) ||
       !gnutls_safe_renegotiation_status (server))
     {
       tls_log_func (0, "Session not using safe renegotiation!\n");
-      exit_code = EXIT_FAILURE;
+      exit(1);
     }
 
   sret = gnutls_rehandshake (server);
-  if (debug_level > 0)
+  if (debug)
     {
       tls_log_func (0, "gnutls_rehandshake (server)...\n");
       tls_log_func (0, gnutls_strerror (sret));
@@ -257,52 +149,14 @@ main (int argc, char *argv[])
       abort ();
   }
 
-  cret = GNUTLS_E_AGAIN;
-  sret = GNUTLS_E_AGAIN;
-
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_SUCCESS && sret == GNUTLS_E_SUCCESS)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SUCCESS)
-    exit_code = 1;
+  HANDSHAKE(client, server);
 
   if (!gnutls_safe_renegotiation_status (client) ||
       !gnutls_safe_renegotiation_status (server))
     {
       tls_log_func (0,
                     "Rehandshaked session not using safe renegotiation!\n");
-      exit_code = EXIT_FAILURE;
+      exit(1);
     }
 
   gnutls_bye (client, GNUTLS_SHUT_RDWR);
@@ -311,20 +165,15 @@ main (int argc, char *argv[])
   gnutls_deinit (client);
   gnutls_deinit (server);
 
-  free (to_server);
-  free (to_client);
-
   gnutls_certificate_free_credentials (serverx509cred);
+  gnutls_certificate_free_credentials (clientx509cred);
 
   gnutls_global_deinit ();
 
-  if (debug_level > 0)
+  if (debug)
     {
-      if (exit_code == 0)
-        puts ("Self-test successful");
-      else
-        puts ("Self-test failed");
+      puts ("Self-test successful");
     }
 
-  return exit_code;
+  return;
 }
index 2b996b0c9483c34220dc453c82049c2d6738d3eb..6907d85164877996e78f54a4239e8c3fb7f606e5 100644 (file)
@@ -36,6 +36,8 @@
 #include <string.h>
 #include <errno.h>
 #include <gnutls/gnutls.h>
+#include "../eagain-common.h"
+#include "../utils.h"
 
 static void
 tls_log_func (int level, const char *str)
@@ -43,80 +45,6 @@ tls_log_func (int level, const char *str)
   fprintf (stderr, "|<%d>| %s", level, str);
 }
 
-static char *to_server;
-static size_t to_server_len;
-
-static char *to_client;
-static size_t to_client_len;
-
-static ssize_t
-client_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_client_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_client, len);
-
-  memmove (to_client, to_client + len, to_client_len - len);
-  to_client_len -= len;
-
-  return len;
-}
-
-static ssize_t
-client_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_server_len + len;
-  char *tmp;
-
-  tmp = realloc (to_server, newlen);
-  if (!tmp)
-    abort ();
-  to_server = tmp;
-
-  memcpy (to_server + to_server_len, data, len);
-  to_server_len = newlen;
-
-  return len;
-}
-
-static ssize_t
-server_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_server_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_server, len);
-
-  memmove (to_server, to_server + len, to_server_len - len);
-  to_server_len -= len;
-
-  return len;
-}
-
-static ssize_t
-server_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_client_len + len;
-  char *tmp;
-
-  tmp = realloc (to_client, newlen);
-  if (!tmp)
-    abort ();
-  to_client = tmp;
-
-  memcpy (to_client + to_client_len, data, len);
-  to_client_len = newlen;
-
-  return len;
-}
-
 static unsigned char server_cert_pem[] =
   "-----BEGIN CERTIFICATE-----\n"
   "MIICVjCCAcGgAwIBAgIERiYdMTALBgkqhkiG9w0BAQUwGTEXMBUGA1UEAxMOR251\n"
@@ -158,11 +86,8 @@ const gnutls_datum_t server_key = { server_key_pem,
   sizeof (server_key_pem)
 };
 
-int
-main (int argc, char *argv[])
+void doit(void)
 {
-  int debug_level = argc - 1;
-  int exit_code = EXIT_SUCCESS;
   /* Server stuff. */
   gnutls_certificate_credentials_t serverx509cred;
   gnutls_session_t server;
@@ -175,7 +100,7 @@ main (int argc, char *argv[])
   /* General init. */
   gnutls_global_init ();
   gnutls_global_set_log_function (tls_log_func);
-  gnutls_global_set_log_level (debug_level);
+  if (debug) gnutls_global_set_log_level (5);
 
   /* Init server */
   gnutls_certificate_allocate_credentials (&serverx509cred);
@@ -187,6 +112,7 @@ main (int argc, char *argv[])
   gnutls_priority_set_direct (server, "NORMAL:%SAFE_RENEGOTIATION", NULL);
   gnutls_transport_set_push_function (server, server_push);
   gnutls_transport_set_pull_function (server, server_pull);
+  gnutls_transport_set_ptr (server, (gnutls_transport_ptr_t)server);
 
   /* Init client */
   gnutls_certificate_allocate_credentials (&clientx509cred);
@@ -196,6 +122,7 @@ main (int argc, char *argv[])
                               NULL);
   gnutls_transport_set_push_function (client, client_push);
   gnutls_transport_set_pull_function (client, client_pull);
+  gnutls_transport_set_ptr (client, (gnutls_transport_ptr_t)client);
 
   /* Check that initially no session use the extension. */
   if (gnutls_safe_renegotiation_status (server)
@@ -205,39 +132,7 @@ main (int argc, char *argv[])
       abort ();
     }
 
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while ((cret == GNUTLS_E_AGAIN || cret == GNUTLS_E_SUCCESS)
-         && (sret == GNUTLS_E_AGAIN || sret == GNUTLS_E_SUCCESS));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SAFE_RENEGOTIATION_FAILED)
-    exit_code = EXIT_FAILURE;
+  HANDSHAKE_EXPECT(client, server, GNUTLS_E_AGAIN, GNUTLS_E_SAFE_RENEGOTIATION_FAILED);
 
   gnutls_bye (client, GNUTLS_SHUT_RDWR);
   gnutls_bye (server, GNUTLS_SHUT_RDWR);
@@ -245,20 +140,15 @@ main (int argc, char *argv[])
   gnutls_deinit (client);
   gnutls_deinit (server);
 
-  free (to_server);
-  free (to_client);
-
   gnutls_certificate_free_credentials (serverx509cred);
+  gnutls_certificate_free_credentials (clientx509cred);
 
   gnutls_global_deinit ();
 
-  if (debug_level > 0)
+  if (debug)
     {
-      if (exit_code == 0)
-        puts ("Self-test successful");
-      else
-        puts ("Self-test failed");
+      puts ("Self-test successful");
     }
 
-  return exit_code;
+  return;
 }
index 8c9d444c6bd1a8ccf750ed582305e169c308d706..d006aaa90a4a34f1db3c3b67e8e6ff4199d72bb4 100644 (file)
@@ -34,6 +34,8 @@
 #include <string.h>
 #include <errno.h>
 #include <gnutls/gnutls.h>
+#include "../eagain-common.h"
+#include "../utils.h"
 
 static void
 tls_log_func (int level, const char *str)
@@ -41,80 +43,6 @@ tls_log_func (int level, const char *str)
   fprintf (stderr, "|<%d>| %s", level, str);
 }
 
-static char *to_server;
-static size_t to_server_len;
-
-static char *to_client;
-static size_t to_client_len;
-
-static ssize_t
-client_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_client_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_client, len);
-
-  memmove (to_client, to_client + len, to_client_len - len);
-  to_client_len -= len;
-
-  return len;
-}
-
-static ssize_t
-client_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_server_len + len;
-  char *tmp;
-
-  tmp = realloc (to_server, newlen);
-  if (!tmp)
-    abort ();
-  to_server = tmp;
-
-  memcpy (to_server + to_server_len, data, len);
-  to_server_len = newlen;
-
-  return len;
-}
-
-static ssize_t
-server_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_server_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_server, len);
-
-  memmove (to_server, to_server + len, to_server_len - len);
-  to_server_len -= len;
-
-  return len;
-}
-
-static ssize_t
-server_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_client_len + len;
-  char *tmp;
-
-  tmp = realloc (to_client, newlen);
-  if (!tmp)
-    abort ();
-  to_client = tmp;
-
-  memcpy (to_client + to_client_len, data, len);
-  to_client_len = newlen;
-
-  return len;
-}
-
 static unsigned char server_cert_pem[] =
   "-----BEGIN CERTIFICATE-----\n"
   "MIICVjCCAcGgAwIBAgIERiYdMTALBgkqhkiG9w0BAQUwGTEXMBUGA1UEAxMOR251\n"
@@ -156,11 +84,8 @@ const gnutls_datum_t server_key = { server_key_pem,
   sizeof (server_key_pem)
 };
 
-int
-main (int argc, char *argv[])
+void doit(void)
 {
-  int debug_level = argc - 1;
-  int exit_code = EXIT_SUCCESS;
   /* Server stuff. */
   gnutls_certificate_credentials_t serverx509cred;
   gnutls_session_t server;
@@ -173,7 +98,7 @@ main (int argc, char *argv[])
   /* General init. */
   gnutls_global_init ();
   gnutls_global_set_log_function (tls_log_func);
-  gnutls_global_set_log_level (debug_level);
+  if (debug) gnutls_global_set_log_level (2);
 
   /* Init server */
   gnutls_certificate_allocate_credentials (&serverx509cred);
@@ -185,6 +110,7 @@ main (int argc, char *argv[])
   gnutls_priority_set_direct (server, "NORMAL", NULL);
   gnutls_transport_set_push_function (server, server_push);
   gnutls_transport_set_pull_function (server, server_pull);
+  gnutls_transport_set_ptr (server, (gnutls_transport_ptr_t)server);
 
   /* Init client */
   gnutls_certificate_allocate_credentials (&clientx509cred);
@@ -193,6 +119,7 @@ main (int argc, char *argv[])
   gnutls_priority_set_direct (client, "NORMAL", NULL);
   gnutls_transport_set_push_function (client, client_push);
   gnutls_transport_set_pull_function (client, client_pull);
+  gnutls_transport_set_ptr (client, (gnutls_transport_ptr_t)client);
 
   /* Check that initially no session use the extension. */
   if (gnutls_safe_renegotiation_status (server)
@@ -202,42 +129,7 @@ main (int argc, char *argv[])
       abort ();
     }
 
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_SUCCESS && sret == GNUTLS_E_SUCCESS)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SUCCESS)
-    exit_code = EXIT_FAILURE;
+  HANDSHAKE(client, server);
 
   /* Check that both sessions use the extension. */
   if (!gnutls_safe_renegotiation_status (server)
@@ -248,7 +140,7 @@ main (int argc, char *argv[])
     }
 
   sret = gnutls_rehandshake (server);
-  if (debug_level > 0)
+  if (debug)
     {
       tls_log_func (0, "gnutls_rehandshake (server)...\n");
       tls_log_func (0, gnutls_strerror (sret));
@@ -263,45 +155,7 @@ main (int argc, char *argv[])
       abort ();
   }
 
-  cret = GNUTLS_E_AGAIN;
-  sret = GNUTLS_E_AGAIN;
-
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_SUCCESS && sret == GNUTLS_E_SUCCESS)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SUCCESS)
-    exit_code = 1;
+  HANDSHAKE(client, server);
 
   /* Check that session still use the extension. */
   if (!gnutls_safe_renegotiation_status (server)
@@ -316,7 +170,7 @@ main (int argc, char *argv[])
      gnutls_safe_negotiation_set_initial (server, 0); */
 
   sret = gnutls_rehandshake (server);
-  if (debug_level > 0)
+  if (debug)
     {
       tls_log_func (0, "gnutls_rehandshake (server)...\n");
       tls_log_func (0, gnutls_strerror (sret));
@@ -331,51 +185,13 @@ main (int argc, char *argv[])
       abort ();
   }
 
-  cret = GNUTLS_E_AGAIN;
-  sret = GNUTLS_E_AGAIN;
-
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_SUCCESS && sret == GNUTLS_E_SUCCESS)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SUCCESS)
-    exit_code = 1;
+  HANDSHAKE(client, server);
 
   /* Check that disabling the extension will break rehandshakes.
      gnutls_safe_renegotiation_set (client, 0); */
 
   sret = gnutls_rehandshake (server);
-  if (debug_level > 0)
+  if (debug)
     {
       tls_log_func (0, "gnutls_rehandshake (server)...\n");
       tls_log_func (0, gnutls_strerror (sret));
@@ -390,45 +206,7 @@ main (int argc, char *argv[])
       abort ();
   }
 
-  cret = GNUTLS_E_AGAIN;
-  sret = GNUTLS_E_AGAIN;
-
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_SUCCESS && sret == GNUTLS_E_SUCCESS)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SUCCESS)
-    exit_code = 1;
+  HANDSHAKE(client, server);
 
   gnutls_bye (client, GNUTLS_SHUT_RDWR);
   gnutls_bye (server, GNUTLS_SHUT_RDWR);
@@ -436,20 +214,15 @@ main (int argc, char *argv[])
   gnutls_deinit (client);
   gnutls_deinit (server);
 
-  free (to_server);
-  free (to_client);
-
   gnutls_certificate_free_credentials (serverx509cred);
+  gnutls_certificate_free_credentials (clientx509cred);
 
   gnutls_global_deinit ();
 
-  if (debug_level > 0)
+  if (debug)
     {
-      if (exit_code == 0)
-        puts ("Self-test successful");
-      else
-        puts ("Self-test failed");
+      puts ("Self-test successful");
     }
 
-  return exit_code;
+  return;
 }
index 71f0ac31ca0d11c466e4f29e920ba8528540c23e..45a89802fa0723603552a3b67ad3e445f6f60a32 100644 (file)
@@ -36,6 +36,8 @@
 #include <string.h>
 #include <errno.h>
 #include <gnutls/gnutls.h>
+#include "../eagain-common.h"
+#include "../utils.h"
 
 static void
 tls_log_func (int level, const char *str)
@@ -43,80 +45,6 @@ tls_log_func (int level, const char *str)
   fprintf (stderr, "|<%d>| %s", level, str);
 }
 
-static char *to_server;
-static size_t to_server_len;
-
-static char *to_client;
-static size_t to_client_len;
-
-static ssize_t
-client_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_client_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_client, len);
-
-  memmove (to_client, to_client + len, to_client_len - len);
-  to_client_len -= len;
-
-  return len;
-}
-
-static ssize_t
-client_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_server_len + len;
-  char *tmp;
-
-  tmp = realloc (to_server, newlen);
-  if (!tmp)
-    abort ();
-  to_server = tmp;
-
-  memcpy (to_server + to_server_len, data, len);
-  to_server_len = newlen;
-
-  return len;
-}
-
-static ssize_t
-server_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_server_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_server, len);
-
-  memmove (to_server, to_server + len, to_server_len - len);
-  to_server_len -= len;
-
-  return len;
-}
-
-static ssize_t
-server_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_client_len + len;
-  char *tmp;
-
-  tmp = realloc (to_client, newlen);
-  if (!tmp)
-    abort ();
-  to_client = tmp;
-
-  memcpy (to_client + to_client_len, data, len);
-  to_client_len = newlen;
-
-  return len;
-}
-
 static unsigned char server_cert_pem[] =
   "-----BEGIN CERTIFICATE-----\n"
   "MIICVjCCAcGgAwIBAgIERiYdMTALBgkqhkiG9w0BAQUwGTEXMBUGA1UEAxMOR251\n"
@@ -158,11 +86,8 @@ const gnutls_datum_t server_key = { server_key_pem,
   sizeof (server_key_pem)
 };
 
-int
-main (int argc, char *argv[])
+void doit(void)
 {
-  int debug_level = argc - 1;
-  int exit_code = EXIT_SUCCESS;
   /* Server stuff. */
   gnutls_certificate_credentials_t serverx509cred;
   gnutls_session_t server;
@@ -175,7 +100,7 @@ main (int argc, char *argv[])
   /* General init. */
   gnutls_global_init ();
   gnutls_global_set_log_function (tls_log_func);
-  gnutls_global_set_log_level (debug_level);
+  if (debug) gnutls_global_set_log_level (2);
 
   /* Init server */
   gnutls_certificate_allocate_credentials (&serverx509cred);
@@ -188,6 +113,7 @@ main (int argc, char *argv[])
                               NULL);
   gnutls_transport_set_push_function (server, server_push);
   gnutls_transport_set_pull_function (server, server_pull);
+  gnutls_transport_set_ptr (server, (gnutls_transport_ptr_t)server);
 
   /* Init client */
   gnutls_certificate_allocate_credentials (&clientx509cred);
@@ -196,6 +122,7 @@ main (int argc, char *argv[])
   gnutls_priority_set_direct (client, "NORMAL:%SAFE_RENEGOTIATION", NULL);
   gnutls_transport_set_push_function (client, client_push);
   gnutls_transport_set_pull_function (client, client_pull);
+  gnutls_transport_set_ptr (client, (gnutls_transport_ptr_t)client);
 
   /* Check that initially no session use the extension. */
   if (gnutls_safe_renegotiation_status (server)
@@ -205,39 +132,7 @@ main (int argc, char *argv[])
       abort ();
     }
 
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while ((cret == GNUTLS_E_AGAIN || cret == GNUTLS_E_SUCCESS)
-         && (sret == GNUTLS_E_AGAIN || sret == GNUTLS_E_SUCCESS));
-
-  if (cret != GNUTLS_E_SAFE_RENEGOTIATION_FAILED && sret != GNUTLS_E_SUCCESS)
-    exit_code = EXIT_FAILURE;
+  HANDSHAKE_EXPECT(client, server, GNUTLS_E_SAFE_RENEGOTIATION_FAILED, GNUTLS_E_AGAIN);
 
   gnutls_bye (client, GNUTLS_SHUT_RDWR);
   gnutls_bye (server, GNUTLS_SHUT_RDWR);
@@ -245,20 +140,15 @@ main (int argc, char *argv[])
   gnutls_deinit (client);
   gnutls_deinit (server);
 
-  free (to_server);
-  free (to_client);
-
   gnutls_certificate_free_credentials (serverx509cred);
+  gnutls_certificate_free_credentials (clientx509cred);
 
   gnutls_global_deinit ();
 
-  if (debug_level > 0)
+  if (debug)
     {
-      if (exit_code == 0)
-        puts ("Self-test successful");
-      else
-        puts ("Self-test failed");
+      puts ("Self-test successful");
     }
 
-  return exit_code;
+  return;
 }
index 8ab1bb2ea60f0591b95833669c60176c51d17357..aa8ede4313ff5fead05e6683cf3864c1030e07f4 100644 (file)
@@ -36,6 +36,8 @@
 #include <string.h>
 #include <errno.h>
 #include <gnutls/gnutls.h>
+#include "../eagain-common.h"
+#include "../utils.h"
 
 static void
 tls_log_func (int level, const char *str)
@@ -43,80 +45,6 @@ tls_log_func (int level, const char *str)
   fprintf (stderr, "|<%d>| %s", level, str);
 }
 
-static char *to_server;
-static size_t to_server_len;
-
-static char *to_client;
-static size_t to_client_len;
-
-static ssize_t
-client_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_client_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_client, len);
-
-  memmove (to_client, to_client + len, to_client_len - len);
-  to_client_len -= len;
-
-  return len;
-}
-
-static ssize_t
-client_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_server_len + len;
-  char *tmp;
-
-  tmp = realloc (to_server, newlen);
-  if (!tmp)
-    abort ();
-  to_server = tmp;
-
-  memcpy (to_server + to_server_len, data, len);
-  to_server_len = newlen;
-
-  return len;
-}
-
-static ssize_t
-server_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_server_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_server, len);
-
-  memmove (to_server, to_server + len, to_server_len - len);
-  to_server_len -= len;
-
-  return len;
-}
-
-static ssize_t
-server_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_client_len + len;
-  char *tmp;
-
-  tmp = realloc (to_client, newlen);
-  if (!tmp)
-    abort ();
-  to_client = tmp;
-
-  memcpy (to_client + to_client_len, data, len);
-  to_client_len = newlen;
-
-  return len;
-}
-
 static unsigned char server_cert_pem[] =
   "-----BEGIN CERTIFICATE-----\n"
   "MIICVjCCAcGgAwIBAgIERiYdMTALBgkqhkiG9w0BAQUwGTEXMBUGA1UEAxMOR251\n"
@@ -158,11 +86,8 @@ const gnutls_datum_t server_key = { server_key_pem,
   sizeof (server_key_pem)
 };
 
-int
-main (int argc, char *argv[])
+void doit(void)
 {
-  int debug_level = argc - 1;
-  int exit_code = EXIT_SUCCESS;
   /* Server stuff. */
   gnutls_certificate_credentials_t serverx509cred;
   gnutls_session_t server;
@@ -175,7 +100,7 @@ main (int argc, char *argv[])
   /* General init. */
   gnutls_global_init ();
   gnutls_global_set_log_function (tls_log_func);
-  gnutls_global_set_log_level (debug_level);
+  if (debug) gnutls_global_set_log_level (2);
 
   /* Init server */
   gnutls_certificate_allocate_credentials (&serverx509cred);
@@ -187,6 +112,7 @@ main (int argc, char *argv[])
   gnutls_priority_set_direct (server, "NORMAL", NULL);
   gnutls_transport_set_push_function (server, server_push);
   gnutls_transport_set_pull_function (server, server_pull);
+  gnutls_transport_set_ptr (server, (gnutls_transport_ptr_t)server);
 
   /* Init client */
   gnutls_certificate_allocate_credentials (&clientx509cred);
@@ -196,53 +122,19 @@ main (int argc, char *argv[])
                               NULL);
   gnutls_transport_set_push_function (client, client_push);
   gnutls_transport_set_pull_function (client, client_pull);
+  gnutls_transport_set_ptr (client, (gnutls_transport_ptr_t)client);
 
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_SUCCESS && sret == GNUTLS_E_SUCCESS)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SUCCESS)
-    exit_code = EXIT_FAILURE;
+  HANDSHAKE(client, server);
 
   if (gnutls_safe_renegotiation_status (client) ||
       gnutls_safe_renegotiation_status (server))
     {
       tls_log_func (0, "Session using safe renegotiation but shouldn't!\n");
-      exit_code = EXIT_FAILURE;
+      exit(1);
     }
 
   sret = gnutls_rehandshake (server);
-  if (debug_level > 0)
+  if (debug)
     {
       tls_log_func (0, "gnutls_rehandshake (server)...\n");
       tls_log_func (0, gnutls_strerror (sret));
@@ -257,53 +149,14 @@ main (int argc, char *argv[])
       abort ();
   }
 
-  cret = GNUTLS_E_AGAIN;
-  sret = GNUTLS_E_AGAIN;
-
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_AGAIN
-            && sret == GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_AGAIN && sret != GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED)
-    exit_code = 1;
+  HANDSHAKE_EXPECT(client, server, GNUTLS_E_AGAIN, GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED);
 
   if (gnutls_safe_renegotiation_status (client) ||
       gnutls_safe_renegotiation_status (server))
     {
       tls_log_func (0,
                     "Rehandshaked session not using safe renegotiation!\n");
-      exit_code = EXIT_FAILURE;
+      exit(1);
     }
 
   gnutls_bye (client, GNUTLS_SHUT_RDWR);
@@ -312,20 +165,15 @@ main (int argc, char *argv[])
   gnutls_deinit (client);
   gnutls_deinit (server);
 
-  free (to_server);
-  free (to_client);
-
   gnutls_certificate_free_credentials (serverx509cred);
+  gnutls_certificate_free_credentials (clientx509cred);
 
   gnutls_global_deinit ();
 
-  if (debug_level > 0)
+  if (debug)
     {
-      if (exit_code == 0)
-        puts ("Self-test successful");
-      else
-        puts ("Self-test failed");
+      puts ("Self-test successful");
     }
 
-  return exit_code;
+  return;
 }
index 2eb197514356b7af6433654fca37057032a2a535..569d34cc7a7112246de896e321d9910ce4dbbdf0 100644 (file)
@@ -37,6 +37,8 @@
 #include <string.h>
 #include <errno.h>
 #include <gnutls/gnutls.h>
+#include "../eagain-common.h"
+#include "../utils.h"
 
 static void
 tls_log_func (int level, const char *str)
@@ -44,80 +46,6 @@ tls_log_func (int level, const char *str)
   fprintf (stderr, "|<%d>| %s", level, str);
 }
 
-static char *to_server;
-static size_t to_server_len;
-
-static char *to_client;
-static size_t to_client_len;
-
-static ssize_t
-client_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_client_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_client, len);
-
-  memmove (to_client, to_client + len, to_client_len - len);
-  to_client_len -= len;
-
-  return len;
-}
-
-static ssize_t
-client_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_server_len + len;
-  char *tmp;
-
-  tmp = realloc (to_server, newlen);
-  if (!tmp)
-    abort ();
-  to_server = tmp;
-
-  memcpy (to_server + to_server_len, data, len);
-  to_server_len = newlen;
-
-  return len;
-}
-
-static ssize_t
-server_pull (gnutls_transport_ptr_t tr, void *data, size_t len)
-{
-  if (to_server_len < len)
-    {
-      gnutls_transport_set_global_errno (EAGAIN);
-      return -1;
-    }
-
-  memcpy (data, to_server, len);
-
-  memmove (to_server, to_server + len, to_server_len - len);
-  to_server_len -= len;
-
-  return len;
-}
-
-static ssize_t
-server_push (gnutls_transport_ptr_t tr, const void *data, size_t len)
-{
-  size_t newlen = to_client_len + len;
-  char *tmp;
-
-  tmp = realloc (to_client, newlen);
-  if (!tmp)
-    abort ();
-  to_client = tmp;
-
-  memcpy (to_client + to_client_len, data, len);
-  to_client_len = newlen;
-
-  return len;
-}
-
 static unsigned char server_cert_pem[] =
   "-----BEGIN CERTIFICATE-----\n"
   "MIICVjCCAcGgAwIBAgIERiYdMTALBgkqhkiG9w0BAQUwGTEXMBUGA1UEAxMOR251\n"
@@ -159,11 +87,8 @@ const gnutls_datum_t server_key = { server_key_pem,
   sizeof (server_key_pem)
 };
 
-int
-main (int argc, char *argv[])
+void doit(void)
 {
-  int debug_level = argc - 1;
-  int exit_code = EXIT_SUCCESS;
   /* Server stuff. */
   gnutls_certificate_credentials_t serverx509cred;
   gnutls_session_t server;
@@ -176,7 +101,7 @@ main (int argc, char *argv[])
   /* General init. */
   gnutls_global_init ();
   gnutls_global_set_log_function (tls_log_func);
-  gnutls_global_set_log_level (debug_level);
+  if (debug) gnutls_global_set_log_level (2);
 
   /* Init server */
   gnutls_certificate_allocate_credentials (&serverx509cred);
@@ -189,6 +114,7 @@ main (int argc, char *argv[])
                               NULL);
   gnutls_transport_set_push_function (server, server_push);
   gnutls_transport_set_pull_function (server, server_pull);
+  gnutls_transport_set_ptr (server, (gnutls_transport_ptr_t)server);
 
   /* Init client */
   gnutls_certificate_allocate_credentials (&clientx509cred);
@@ -197,58 +123,24 @@ main (int argc, char *argv[])
   gnutls_priority_set_direct (client, "NORMAL", NULL);
   gnutls_transport_set_push_function (client, client_push);
   gnutls_transport_set_pull_function (client, client_pull);
+  gnutls_transport_set_ptr (client, (gnutls_transport_ptr_t)client);
 
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(cret == GNUTLS_E_SUCCESS && sret == GNUTLS_E_SUCCESS)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (cret != GNUTLS_E_SUCCESS && sret != GNUTLS_E_SUCCESS)
-    exit_code = EXIT_FAILURE;
+  HANDSHAKE(client, server);
 
   if (gnutls_safe_renegotiation_status (client))
     {
       tls_log_func (0, "Client thinks it is using safe renegotiation!\n");
-      exit_code = EXIT_FAILURE;
+      exit(1);
     }
 
   if (gnutls_safe_renegotiation_status (server))
     {
       tls_log_func (0, "Server thinks it is using safe renegotiation!\n");
-      exit_code = EXIT_FAILURE;
+      exit(1);
     }
 
   sret = gnutls_rehandshake (server);
-  if (debug_level > 0)
+  if (debug)
     {
       tls_log_func (0, "gnutls_rehandshake (server)...\n");
       tls_log_func (0, gnutls_strerror (sret));
@@ -263,53 +155,14 @@ main (int argc, char *argv[])
       abort ();
   }
 
-  cret = GNUTLS_E_AGAIN;
-  sret = GNUTLS_E_AGAIN;
-
-  do
-    {
-      static int max_iter = 0;
-      if (max_iter++ > 10)
-        abort ();
-
-      if (cret == GNUTLS_E_AGAIN)
-        {
-          cret = gnutls_handshake (client);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (client)...\n");
-              tls_log_func (0, gnutls_strerror (cret));
-              tls_log_func (0, "\n");
-            }
-        }
-
-      if (sret == GNUTLS_E_AGAIN)
-        {
-          sret = gnutls_handshake (server);
-          if (debug_level > 0)
-            {
-              tls_log_func (0, "second gnutls_handshake (server)...\n");
-              tls_log_func (0, gnutls_strerror (sret));
-              tls_log_func (0, "\n");
-            }
-        }
-    }
-  while (
-          /* Not done: */
-          !(sret == GNUTLS_E_AGAIN
-            && cret == GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED)
-          /* No error: */
-          && (cret == GNUTLS_E_AGAIN || sret == GNUTLS_E_AGAIN));
-
-  if (sret != GNUTLS_E_AGAIN && cret != GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED)
-    exit_code = 1;
+  HANDSHAKE_EXPECT(client, server, GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED, GNUTLS_E_AGAIN);
 
   if (gnutls_safe_renegotiation_status (client) ||
       gnutls_safe_renegotiation_status (server))
     {
       tls_log_func (0,
                     "Rehandshaked session not using safe renegotiation!\n");
-      exit_code = EXIT_FAILURE;
+      exit(1);
     }
 
   gnutls_bye (client, GNUTLS_SHUT_RDWR);
@@ -318,20 +171,15 @@ main (int argc, char *argv[])
   gnutls_deinit (client);
   gnutls_deinit (server);
 
-  free (to_server);
-  free (to_client);
-
   gnutls_certificate_free_credentials (serverx509cred);
+  gnutls_certificate_free_credentials (clientx509cred);
 
   gnutls_global_deinit ();
 
-  if (debug_level > 0)
+  if (debug)
     {
-      if (exit_code == 0)
-        puts ("Self-test successful");
-      else
-        puts ("Self-test failed");
+      puts ("Self-test successful");
     }
 
-  return exit_code;
+  return;
 }