Blame tests/mini-eagain-dtls.c

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