summaryrefslogtreecommitdiff
path: root/tests/mini-dtls-record-asym.c
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2015-01-06 21:22:02 +0100
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2015-01-06 21:30:16 +0100
commit066db0b051a048e005f7bb344621b5ea931aeea3 (patch)
treea5fc4e42baf4f8fb520cd49cfee8c538b2349526 /tests/mini-dtls-record-asym.c
parentf2c7034c70ba0e2566b76b0f87a0cea0bf7fd950 (diff)
downloadgnutls-066db0b051a048e005f7bb344621b5ea931aeea3.tar.gz
tests: corrected asymmetric MTU test for DTLS and added caching
Diffstat (limited to 'tests/mini-dtls-record-asym.c')
-rw-r--r--tests/mini-dtls-record-asym.c88
1 files changed, 71 insertions, 17 deletions
diff --git a/tests/mini-dtls-record-asym.c b/tests/mini-dtls-record-asym.c
index d8a755fc69..bf86353532 100644
--- a/tests/mini-dtls-record-asym.c
+++ b/tests/mini-dtls-record-asym.c
@@ -33,6 +33,7 @@
#include <gnutls/dtls.h>
#include <signal.h>
#include <unistd.h>
+#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
@@ -58,6 +59,51 @@ static void tls_log_func(int level, const char *str)
fprintf(stderr, "%s|<%d>| %s", side, level, str);
}
+static ssize_t push(gnutls_transport_ptr_t tr, const void *data, size_t len)
+{
+ static uint8_t buffer[6 * 1024];
+ static unsigned buffer_size = 0;
+ const uint8_t *d = data;
+ int fd = (long int)tr;
+ int ret;
+
+ if (buffer_size + len > sizeof(buffer)) {
+ abort();
+ }
+
+ memcpy(&buffer[buffer_size], data, len);
+ buffer_size += len;
+//fprintf(stderr, "type: %d, %d, %s\n", (int)d[0], (int)d[13], gnutls_handshake_description_get_name(d[13]));
+ if (d[0] == 22) { /* handshake */
+ if (d[13] == GNUTLS_HANDSHAKE_CERTIFICATE_PKT ||
+ d[13] == GNUTLS_HANDSHAKE_CERTIFICATE_STATUS ||
+ d[13] == GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE ||
+ d[13] == GNUTLS_HANDSHAKE_SERVER_HELLO ||
+ d[13] == GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST ||
+ d[13] == GNUTLS_HANDSHAKE_NEW_SESSION_TICKET ||
+ d[13] == GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY ||
+ d[13] == GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE) {
+
+ fprintf(stderr, "caching: %s (buffer: %d)\n",
+ gnutls_handshake_description_get_name(d[13]),
+ buffer_size);
+ return len;
+ } else {
+ fprintf(stderr, "sending: %s\n",
+ gnutls_handshake_description_get_name(d[13]));
+
+ }
+ }
+
+ fprintf(stderr, "sending %d bytes\n", (int)buffer_size);
+ ret = send(fd, buffer, buffer_size, 0);
+ if (ret >= 0) {
+ fprintf(stderr, "reset cache\n");
+ buffer_size = 0;
+ }
+ return len;
+}
+
static unsigned char server_cert_pem[] =
"-----BEGIN CERTIFICATE-----\n"
"MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\n"
@@ -127,24 +173,24 @@ static void client(int fd)
gnutls_transport_set_int(session, fd);
- FD_ZERO(&rfds);
- FD_SET(fd, &rfds);
-
- /* Wait one second. */
- tv.tv_sec = 1;
- tv.tv_usec = 0;
-
/* Perform the TLS handshake
*/
do {
ret = gnutls_handshake(session);
if (ret == GNUTLS_E_AGAIN && gnutls_record_get_direction(session) == 0) {
- ret = select(1, &rfds, NULL, NULL, &tv);
- if (ret == -1)
+ int rv;
+ FD_ZERO(&rfds);
+ FD_SET(fd, &rfds);
+
+ tv.tv_sec = 2;
+ tv.tv_usec = 0;
+
+ rv = select(fd+1, &rfds, NULL, NULL, &tv);
+ if (rv == -1)
perror("select()");
- else if (!ret)
- fail("No data within one second.\n");
+ else if (!rv)
+ fail("No data were received.\n");
}
}
while (ret < 0 && gnutls_error_is_fatal(ret) == 0);
@@ -186,7 +232,7 @@ static void terminate(void)
exit(1);
}
-static void server(int fd)
+static void server(int fd, unsigned cache)
{
int ret;
gnutls_certificate_credentials_t x509_cred;
@@ -196,11 +242,13 @@ static void server(int fd)
*/
global_init();
+#if 0
if (debug) {
side = "server";
gnutls_global_set_log_function(tls_log_func);
gnutls_global_set_log_level(4711);
}
+#endif
gnutls_certificate_allocate_credentials(&x509_cred);
gnutls_certificate_set_x509_key_mem(x509_cred, &server_cert,
@@ -210,7 +258,8 @@ static void server(int fd)
gnutls_init(&session, GNUTLS_SERVER | GNUTLS_DATAGRAM);
gnutls_handshake_set_timeout(session, 20 * 1000);
gnutls_dtls_set_mtu(session, 400);
-// gnutls_transport_set_push_function(session, push);
+ if (cache != 0)
+ gnutls_transport_set_push_function(session, push);
/* avoid calling all the priority functions, since the defaults
* are adequate.
@@ -225,8 +274,7 @@ static void server(int fd)
do {
ret = gnutls_handshake(session);
- }
- while (ret < 0 && gnutls_error_is_fatal(ret) == 0);
+ } while (ret < 0 && gnutls_error_is_fatal(ret) == 0);
if (ret < 0) {
close(fd);
gnutls_deinit(session);
@@ -257,7 +305,8 @@ static void server(int fd)
success("server: finished\n");
}
-void doit(void)
+static
+void run(unsigned cache)
{
int fd[2];
int ret;
@@ -287,9 +336,14 @@ void doit(void)
WEXITSTATUS(status));
} else {
close(fd[0]);
- server(fd[1]);
+ server(fd[1], cache);
exit(0);
}
}
+void doit(void)
+{
+ run(0);
+ run(1);
+}
#endif /* _WIN32 */