Blame tests/mini-eagain-dtls.c

Packit aea12f
/*
Packit aea12f
 * Copyright (C) 2008-2012 Free Software Foundation, Inc.
Packit aea12f
 *
Packit aea12f
 * Author: Simon Josefsson, Nikos Mavrogiannopoulos
Packit aea12f
 *
Packit aea12f
 * This file is part of GnuTLS.
Packit aea12f
 *
Packit aea12f
 * GnuTLS is free software; you can redistribute it and/or modify it
Packit aea12f
 * under the terms of the GNU General Public License as published by
Packit aea12f
 * the Free Software Foundation; either version 3 of the License, or
Packit aea12f
 * (at your option) any later version.
Packit aea12f
 *
Packit aea12f
 * GnuTLS is distributed in the hope that it will be useful, but
Packit aea12f
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit aea12f
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit aea12f
 * General Public License for more details.
Packit aea12f
 *
Packit aea12f
 * You should have received a copy of the GNU General Public License
Packit aea12f
 * along with GnuTLS; if not, write to the Free Software Foundation,
Packit aea12f
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Packit aea12f
 */
Packit aea12f
Packit aea12f
#ifdef HAVE_CONFIG_H
Packit aea12f
#include <config.h>
Packit aea12f
#endif
Packit aea12f
Packit aea12f
#include <stdio.h>
Packit aea12f
#include <stdlib.h>
Packit aea12f
#include <string.h>
Packit aea12f
#include <errno.h>
Packit aea12f
#include <gnutls/gnutls.h>
Packit aea12f
#include <gnutls/crypto.h>
Packit aea12f
#include "utils.h"
Packit aea12f
#define RANDOMIZE
Packit aea12f
#include "eagain-common.h"
Packit aea12f
Packit aea12f
const char *side = "";
Packit aea12f
Packit aea12f
static void tls_log_func(int level, const char *str)
Packit aea12f
{
Packit aea12f
	fprintf(stderr, "%s|<%d>| %s", side, level, str);
Packit aea12f
}
Packit aea12f
Packit aea12f
static int handshake = 0;
Packit aea12f
Packit aea12f
#define MAX_BUF 1024
Packit aea12f
#define MSG "Hello TLS, and hi and how are you and more data here... and more... and even more and even more more data..."
Packit aea12f
Packit aea12f
void doit(void)
Packit aea12f
{
Packit aea12f
	/* Server stuff. */
Packit aea12f
	gnutls_anon_server_credentials_t s_anoncred;
Packit aea12f
	const gnutls_datum_t p3 = { (void *) pkcs3, strlen(pkcs3) };
Packit aea12f
	static gnutls_dh_params_t dh_params;
Packit aea12f
	gnutls_session_t server;
Packit aea12f
	int sret, cret;
Packit aea12f
	/* Client stuff. */
Packit aea12f
	gnutls_anon_client_credentials_t c_anoncred;
Packit aea12f
	gnutls_session_t client;
Packit aea12f
	/* Need to enable anonymous KX specifically. */
Packit aea12f
	char buffer[MAX_BUF + 1];
Packit aea12f
	int ret, transferred = 0, msglen;
Packit aea12f
Packit aea12f
	/* General init. */
Packit aea12f
	global_init();
Packit aea12f
	gnutls_global_set_log_function(tls_log_func);
Packit aea12f
	if (debug)
Packit aea12f
		gnutls_global_set_log_level(99);
Packit aea12f
Packit aea12f
	/* Init server */
Packit aea12f
	gnutls_anon_allocate_server_credentials(&s_anoncred);
Packit aea12f
	gnutls_dh_params_init(&dh_params);
Packit aea12f
	gnutls_dh_params_import_pkcs3(dh_params, &p3, GNUTLS_X509_FMT_PEM);
Packit aea12f
	gnutls_anon_set_server_dh_params(s_anoncred, dh_params);
Packit aea12f
	gnutls_init(&server,
Packit aea12f
		    GNUTLS_SERVER | GNUTLS_DATAGRAM | GNUTLS_NONBLOCK);
Packit aea12f
	ret =
Packit aea12f
	    gnutls_priority_set_direct(server,
Packit aea12f
					"NONE:+VERS-DTLS1.0:+CIPHER-ALL:+MAC-ALL:+SIGN-ALL:+COMP-ALL:+ANON-DH",
Packit aea12f
					NULL);
Packit aea12f
	if (ret < 0)
Packit aea12f
		exit(1);
Packit aea12f
	gnutls_credentials_set(server, GNUTLS_CRD_ANON, s_anoncred);
Packit aea12f
	gnutls_transport_set_push_function(server, server_push);
Packit aea12f
	gnutls_transport_set_pull_function(server, server_pull);
Packit aea12f
	gnutls_transport_set_pull_timeout_function(server,
Packit aea12f
						   server_pull_timeout_func);
Packit aea12f
	gnutls_transport_set_ptr(server, server);
Packit aea12f
Packit aea12f
	/* Init client */
Packit aea12f
	gnutls_anon_allocate_client_credentials(&c_anoncred);
Packit aea12f
	gnutls_init(&client,
Packit aea12f
		    GNUTLS_CLIENT | GNUTLS_DATAGRAM | GNUTLS_NONBLOCK);
Packit aea12f
	cret =
Packit aea12f
	    gnutls_priority_set_direct(client,
Packit aea12f
					"NONE:+VERS-DTLS1.0:+CIPHER-ALL:+MAC-ALL:+SIGN-ALL:+COMP-ALL:+ANON-DH",
Packit aea12f
					NULL);
Packit aea12f
	if (cret < 0)
Packit aea12f
		exit(1);
Packit aea12f
	gnutls_credentials_set(client, GNUTLS_CRD_ANON, c_anoncred);
Packit aea12f
	gnutls_transport_set_push_function(client, client_push);
Packit aea12f
	gnutls_transport_set_pull_function(client, client_pull);
Packit aea12f
	gnutls_transport_set_pull_timeout_function(client,
Packit aea12f
						   client_pull_timeout_func);
Packit aea12f
	gnutls_transport_set_ptr(client, client);
Packit aea12f
Packit aea12f
	handshake = 1;
Packit aea12f
	HANDSHAKE(client, server);
Packit aea12f
Packit aea12f
	handshake = 0;
Packit aea12f
	if (debug)
Packit aea12f
		success("Handshake established\n");
Packit aea12f
Packit aea12f
	do {
Packit aea12f
		ret = gnutls_record_send(client, MSG, strlen(MSG));
Packit aea12f
	}
Packit aea12f
	while (ret == GNUTLS_E_AGAIN);
Packit aea12f
Packit aea12f
	msglen = strlen(MSG);
Packit aea12f
	TRANSFER(client, server, MSG, msglen, buffer, MAX_BUF);
Packit aea12f
Packit aea12f
	if (debug)
Packit aea12f
		fputs("\n", stdout);
Packit aea12f
Packit aea12f
	gnutls_bye(client, GNUTLS_SHUT_WR);
Packit aea12f
	gnutls_bye(server, GNUTLS_SHUT_WR);
Packit aea12f
Packit aea12f
	gnutls_deinit(client);
Packit aea12f
	gnutls_deinit(server);
Packit aea12f
Packit aea12f
	gnutls_anon_free_client_credentials(c_anoncred);
Packit aea12f
	gnutls_anon_free_server_credentials(s_anoncred);
Packit aea12f
Packit aea12f
	gnutls_dh_params_deinit(dh_params);
Packit aea12f
Packit aea12f
	gnutls_global_deinit();
Packit aea12f
}