Blame tests/mini-eagain-dtls.c

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