Blame tests/eagain.c

Packit Service 4684c1
/*
Packit Service 4684c1
 * Copyright (C) 2008-2012 Free Software Foundation, Inc.
Packit Service 4684c1
 * Copyright (C) 2018 Red Hat, 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 Lesser General Public License
Packit Service 4684c1
 * along with this program.  If not, see <https://www.gnu.org/licenses/>
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
Packit Service 4684c1
#define RANDOMIZE
Packit Service 4684c1
#include "cert-common.h"
Packit Service 4684c1
#include "cmocka-common.h"
Packit Service 4684c1
Packit Service 4684c1
/* This tests operation under non-blocking mode in TLS1.2/TLS1.3
Packit Service 4684c1
 * as well as operation under TLS1.2 re-handshake.
Packit Service 4684c1
 */
Packit Service 4684c1
static void tls_log_func(int level, const char *str)
Packit Service 4684c1
{
Packit Service 4684c1
	fprintf(stderr, "<%d>| %s", level, str);
Packit Service 4684c1
}
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
static void async_handshake(void **glob_state, const char *prio, unsigned rehsk)
Packit Service 4684c1
{
Packit Service 4684c1
	/* Server stuff. */
Packit Service 4684c1
	gnutls_certificate_credentials_t serverx509cred;
Packit Service 4684c1
	gnutls_session_t server;
Packit Service 4684c1
	int sret, cret;
Packit Service 4684c1
	/* Client stuff. */
Packit Service 4684c1
	gnutls_certificate_credentials_t clientx509cred;
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
	reset_buffers();
Packit Service 4684c1
	gnutls_global_init();
Packit Service 4684c1
	gnutls_global_set_log_function(tls_log_func);
Packit Service 4684c1
Packit Service 4684c1
	/* Init server */
Packit Service 4684c1
	assert_return_code(gnutls_certificate_allocate_credentials(&serverx509cred), 0);
Packit Service 4684c1
	assert_return_code(gnutls_certificate_set_x509_key_mem(serverx509cred,
Packit Service 4684c1
					    &server_cert, &server_key,
Packit Service 4684c1
					    GNUTLS_X509_FMT_PEM), 0);
Packit Service 4684c1
	ret = gnutls_init(&server, GNUTLS_SERVER);
Packit Service 4684c1
	assert_return_code(ret, 0);
Packit Service 4684c1
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    gnutls_priority_set_direct(server,
Packit Service 4684c1
					prio,
Packit Service 4684c1
					NULL);
Packit Service 4684c1
	assert_return_code(ret, 0);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_credentials_set(server, GNUTLS_CRD_CERTIFICATE, serverx509cred);
Packit Service 4684c1
	assert_return_code(ret, 0);
Packit Service 4684c1
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_ptr(server, server);
Packit Service 4684c1
Packit Service 4684c1
	/* Init client */
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_certificate_allocate_credentials(&clientx509cred);
Packit Service 4684c1
	assert_return_code(ret, 0);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_init(&client, GNUTLS_CLIENT);
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    gnutls_priority_set_direct(client,
Packit Service 4684c1
					prio,
Packit Service 4684c1
					NULL);
Packit Service 4684c1
	assert_return_code(ret, 0);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_credentials_set(client, GNUTLS_CRD_CERTIFICATE, clientx509cred);
Packit Service 4684c1
	assert_return_code(ret, 0);
Packit Service 4684c1
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_ptr(client, client);
Packit Service 4684c1
Packit Service 4684c1
	HANDSHAKE(client, server);
Packit Service 4684c1
Packit Service 4684c1
	if (rehsk == 1 || rehsk == 3) {
Packit Service 4684c1
		ssize_t n;
Packit Service 4684c1
		char b[1];
Packit Service 4684c1
Packit Service 4684c1
		do {
Packit Service 4684c1
			sret = gnutls_rehandshake(server);
Packit Service 4684c1
		} while (sret == GNUTLS_E_AGAIN);
Packit Service 4684c1
Packit Service 4684c1
		do {
Packit Service 4684c1
			n = gnutls_record_recv(client, b, 1);
Packit Service 4684c1
		} while(n == GNUTLS_E_AGAIN);
Packit Service 4684c1
Packit Service 4684c1
		assert_int_equal(n, GNUTLS_E_REHANDSHAKE);
Packit Service 4684c1
Packit Service 4684c1
		if (rehsk == 3) {
Packit Service 4684c1
			/* client sends app data and the server ignores them */
Packit Service 4684c1
			do {
Packit Service 4684c1
				cret = gnutls_record_send(client, "x", 1);
Packit Service 4684c1
			} while (cret == GNUTLS_E_AGAIN);
Packit Service 4684c1
Packit Service 4684c1
			do {
Packit Service 4684c1
				sret = gnutls_handshake(server);
Packit Service 4684c1
			} while (sret == GNUTLS_E_AGAIN);
Packit Service 4684c1
			assert_int_equal(sret, GNUTLS_E_GOT_APPLICATION_DATA);
Packit Service 4684c1
Packit Service 4684c1
			do {
Packit Service 4684c1
				n = gnutls_record_recv(server, buffer, sizeof(buffer));
Packit Service 4684c1
			} while(n == GNUTLS_E_AGAIN);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		HANDSHAKE(client, server);
Packit Service 4684c1
	} else if (rehsk == 2) {
Packit Service 4684c1
		HANDSHAKE(client, server);
Packit Service 4684c1
	}
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
	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_certificate_free_credentials(serverx509cred);
Packit Service 4684c1
	gnutls_certificate_free_credentials(clientx509cred);
Packit Service 4684c1
Packit Service 4684c1
	gnutls_global_deinit();
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void tls12_async_handshake(void **glob_state)
Packit Service 4684c1
{
Packit Service 4684c1
	async_handshake(glob_state, "NORMAL:-VERS-ALL:+VERS-TLS1.2", 0);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void tls12_async_rehandshake_client(void **glob_state)
Packit Service 4684c1
{
Packit Service 4684c1
	async_handshake(glob_state, "NORMAL:-VERS-ALL:+VERS-TLS1.2", 1);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void tls12_async_rehandshake_server(void **glob_state)
Packit Service 4684c1
{
Packit Service 4684c1
	async_handshake(glob_state, "NORMAL:-VERS-ALL:+VERS-TLS1.2", 2);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void tls12_async_rehandshake_server_appdata(void **glob_state)
Packit Service 4684c1
{
Packit Service 4684c1
	async_handshake(glob_state, "NORMAL:-VERS-ALL:+VERS-TLS1.2", 3);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void tls13_async_handshake(void **glob_state)
Packit Service 4684c1
{
Packit Service 4684c1
	async_handshake(glob_state, "NORMAL:-VERS-ALL:+VERS-TLS1.3", 0);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
int main(void)
Packit Service 4684c1
{
Packit Service 4684c1
	const struct CMUnitTest tests[] = {
Packit Service 4684c1
		cmocka_unit_test(tls12_async_handshake),
Packit Service 4684c1
		cmocka_unit_test(tls12_async_rehandshake_client),
Packit Service 4684c1
		cmocka_unit_test(tls12_async_rehandshake_server),
Packit Service 4684c1
		cmocka_unit_test(tls12_async_rehandshake_server_appdata),
Packit Service 4684c1
		cmocka_unit_test(tls13_async_handshake),
Packit Service 4684c1
	};
Packit Service 4684c1
	return cmocka_run_group_tests(tests, NULL, NULL);
Packit Service 4684c1
}