Blame tests/server-sign-md5-rep.c

Packit 549fdc
/*
Packit 549fdc
 * Copyright (C) 2017 Red Hat, Inc.
Packit 549fdc
 *
Packit 549fdc
 * Author: 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 Lesser General Public License
Packit 549fdc
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
Packit 549fdc
 *
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
Packit 549fdc
/* This tests whether a server will reject a client advertising
Packit 549fdc
 * MD5 signature algorithms only */
Packit 549fdc
Packit 549fdc
#if defined(_WIN32) || !defined(ENABLE_SSL2)
Packit 549fdc
Packit 549fdc
/* socketpair isn't supported on Win32. */
Packit 549fdc
int main(int argc, char **argv)
Packit 549fdc
{
Packit 549fdc
	exit(77);
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
#else
Packit 549fdc
Packit 549fdc
#include <string.h>
Packit 549fdc
#include <sys/types.h>
Packit 549fdc
#include <sys/socket.h>
Packit 549fdc
#include <sys/wait.h>
Packit 549fdc
#include <unistd.h>
Packit 549fdc
#include <gnutls/gnutls.h>
Packit 549fdc
#include <signal.h>
Packit 549fdc
#include <poll.h>
Packit 549fdc
#include <errno.h>
Packit 549fdc
Packit 549fdc
#include "utils.h"
Packit 549fdc
#include "cert-common.h"
Packit 549fdc
Packit 549fdc
pid_t child;
Packit 549fdc
Packit 549fdc
static void tls_log_func(int level, const char *str)
Packit 549fdc
{
Packit 549fdc
	fprintf(stderr, "%s |<%d>| %s", child ? "server" : "client", level,
Packit 549fdc
		str);
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
Packit 549fdc
static unsigned char tls1_hello[] = {
Packit 549fdc
0x16, 0x03, 0x01, 0x01, 0x5E, 0x01, 0x00, 0x01, 0x5A, 0x03, 0x03, 0x59, 0x52, 0x41, 0x54, 0xD5,
Packit 549fdc
0x52, 0x62, 0x63, 0x69, 0x1B, 0x46, 0xBE, 0x33, 0xCC, 0xC4, 0xC3, 0xB3, 0x6C, 0xCD, 0xEC, 0x96,
Packit 549fdc
0xF7, 0x7A, 0xCA, 0xE9, 0xFB, 0x85, 0x95, 0x83, 0x51, 0xE4, 0x69, 0x00, 0x00, 0xD4, 0xC0, 0x30,
Packit 549fdc
0xCC, 0xA8, 0xC0, 0x8B, 0xC0, 0x14, 0xC0, 0x28, 0xC0, 0x77, 0xC0, 0x2F, 0xC0, 0x8A, 0xC0, 0x13,
Packit 549fdc
0xC0, 0x27, 0xC0, 0x76, 0xC0, 0x12, 0xC0, 0x2C, 0xC0, 0xAD, 0xCC, 0xA9, 0xC0, 0x87, 0xC0, 0x0A,
Packit 549fdc
0xC0, 0x24, 0xC0, 0x73, 0xC0, 0x2B, 0xC0, 0xAC, 0xC0, 0x86, 0xC0, 0x09, 0xC0, 0x23, 0xC0, 0x72,
Packit 549fdc
0xC0, 0x08, 0x00, 0x9D, 0xC0, 0x9D, 0xC0, 0x7B, 0x00, 0x35, 0x00, 0x3D, 0x00, 0x84, 0x00, 0xC0,
Packit 549fdc
0x00, 0x9C, 0xC0, 0x9C, 0xC0, 0x7A, 0x00, 0x2F, 0x00, 0x3C, 0x00, 0x41, 0x00, 0xBA, 0x00, 0x0A,
Packit 549fdc
0x00, 0x9F, 0xC0, 0x9F, 0xCC, 0xAA, 0xC0, 0x7D, 0x00, 0x39, 0x00, 0x6B, 0x00, 0x88, 0x00, 0xC4,
Packit 549fdc
0x00, 0x9E, 0xC0, 0x9E, 0xC0, 0x7C, 0x00, 0x33, 0x00, 0x67, 0x00, 0x45, 0x00, 0xBE, 0x00, 0x16,
Packit 549fdc
0x00, 0xA3, 0xC0, 0x81, 0x00, 0x38, 0x00, 0x6A, 0x00, 0x87, 0x00, 0xC3, 0x00, 0xA2, 0xC0, 0x80,
Packit 549fdc
0x00, 0x32, 0x00, 0x40, 0x00, 0x44, 0x00, 0xBD, 0x00, 0x13, 0x00, 0xA9, 0xC0, 0xA5, 0xCC, 0xAB,
Packit 549fdc
0xC0, 0x8F, 0x00, 0x8D, 0x00, 0xAF, 0xC0, 0x95, 0x00, 0xA8, 0xC0, 0xA4, 0xC0, 0x8E, 0x00, 0x8C,
Packit 549fdc
0x00, 0xAE, 0xC0, 0x94, 0x00, 0x8B, 0x00, 0xAB, 0xC0, 0xA7, 0xCC, 0xAD, 0xC0, 0x91, 0x00, 0x91,
Packit 549fdc
0x00, 0xB3, 0xC0, 0x97, 0x00, 0xAA, 0xC0, 0xA6, 0xC0, 0x90, 0x00, 0x90, 0x00, 0xB2, 0xC0, 0x96,
Packit 549fdc
0x00, 0x8F, 0xCC, 0xAC, 0xC0, 0x36, 0xC0, 0x38, 0xC0, 0x9B, 0xC0, 0x35, 0xC0, 0x37, 0xC0, 0x9A,
Packit 549fdc
0xC0, 0x34, 0x01, 0x00, 0x00, 0x5D, 0x00, 0x17, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x05,
Packit 549fdc
0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x11, 0x00, 0x00, 0x0E,
Packit 549fdc
0x77, 0x77, 0x77, 0x2E, 0x67, 0x6F, 0x6F, 0x67, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0xFF, 0x01,
Packit 549fdc
0x00, 0x01, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x06, 0x00, 0x17, 0x00,
Packit 549fdc
0x18, 0x00, 0x19, 0x00, 0x0B, 0x00, 0x02, 0x01, 0x00, 0x00, 0x0D, 0x00, 0x16, 0x00, 0x14, 0x01,
Packit 549fdc
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Packit 549fdc
0x01, 0x01, 0x01};
Packit 549fdc
Packit 549fdc
static void client(int sd)
Packit 549fdc
{
Packit 549fdc
	char buf[1024];
Packit 549fdc
	int ret;
Packit 549fdc
	struct pollfd pfd;
Packit 549fdc
Packit 549fdc
	/* send a TLS 1.x hello advertising RSA-MD5 */
Packit 549fdc
Packit 549fdc
	ret = send(sd, tls1_hello, sizeof(tls1_hello), 0);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		fail("error sending hello\n");
Packit 549fdc
Packit 549fdc
	pfd.fd = sd;
Packit 549fdc
	pfd.events = POLLIN;
Packit 549fdc
	pfd.revents = 0;
Packit 549fdc
Packit 549fdc
	do {
Packit 549fdc
		ret = poll(&pfd, 1, 10000);
Packit 549fdc
	} while (ret == -1 && errno == EINTR);
Packit 549fdc
Packit 549fdc
	if (ret == -1 || ret == 0) {
Packit 549fdc
		fail("timeout waiting for reply\n");
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	success("sent hello\n");
Packit 549fdc
	ret = recv(sd, buf, sizeof(buf), 0);
Packit 549fdc
	if (ret < 0)
Packit 549fdc
		fail("error receiving alert\n");
Packit 549fdc
Packit 549fdc
	success("received reply\n");
Packit 549fdc
Packit 549fdc
	if (ret < 7)
Packit 549fdc
		fail("error in size of received alert\n");
Packit 549fdc
Packit 549fdc
	if (buf[0] != 0x15 || buf[1] != 0x03)
Packit 549fdc
		fail("error in received alert data\n");
Packit 549fdc
Packit 549fdc
	success("all ok\n");
Packit 549fdc
Packit 549fdc
	close(sd);
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
static void server(int sd)
Packit 549fdc
{
Packit 549fdc
	gnutls_certificate_credentials_t x509_cred;
Packit 549fdc
	gnutls_session_t session;
Packit 549fdc
	int ret;
Packit 549fdc
Packit 549fdc
	/* this must be called once in the program
Packit 549fdc
	 */
Packit 549fdc
	global_init();
Packit 549fdc
Packit 549fdc
	gnutls_global_set_log_function(tls_log_func);
Packit 549fdc
	if (debug)
Packit 549fdc
		gnutls_global_set_log_level(6);
Packit 549fdc
Packit 549fdc
	gnutls_certificate_allocate_credentials(&x509_cred);
Packit 549fdc
	gnutls_certificate_set_x509_trust_mem(x509_cred, &ca3_cert,
Packit 549fdc
					      GNUTLS_X509_FMT_PEM);
Packit 549fdc
Packit 549fdc
	gnutls_certificate_set_x509_key_mem(x509_cred, &server_ca3_localhost_cert,
Packit 549fdc
					    &server_ca3_key,
Packit 549fdc
					    GNUTLS_X509_FMT_PEM);
Packit 549fdc
Packit 549fdc
	gnutls_init(&session, GNUTLS_SERVER);
Packit 549fdc
Packit 549fdc
	/* avoid calling all the priority functions, since the defaults
Packit 549fdc
	 * are adequate.
Packit 549fdc
	 */
Packit 549fdc
	gnutls_priority_set_direct(session, "NORMAL:-RSA", NULL);
Packit 549fdc
	gnutls_handshake_set_timeout(session, 20 * 1000);
Packit 549fdc
Packit 549fdc
	gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, x509_cred);
Packit 549fdc
Packit 549fdc
	gnutls_transport_set_int(session, sd);
Packit 549fdc
	do {
Packit 549fdc
		ret = gnutls_handshake(session);
Packit 549fdc
	} while(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
Packit 549fdc
Packit 549fdc
	if (ret != GNUTLS_E_NO_CIPHER_SUITES) {
Packit 549fdc
		fail("server: Handshake succeeded unexpectedly: %s\n", gnutls_strerror(ret));
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	gnutls_alert_send_appropriate(session, ret);
Packit 549fdc
Packit 549fdc
	close(sd);
Packit 549fdc
	gnutls_deinit(session);
Packit 549fdc
Packit 549fdc
	gnutls_certificate_free_credentials(x509_cred);
Packit 549fdc
Packit 549fdc
	gnutls_global_deinit();
Packit 549fdc
Packit 549fdc
	if (debug)
Packit 549fdc
		success("server: finished\n");
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
Packit 549fdc
void doit(void)
Packit 549fdc
{
Packit 549fdc
	int sockets[2];
Packit 549fdc
	int err;
Packit 549fdc
Packit 549fdc
	signal(SIGPIPE, SIG_IGN);
Packit 549fdc
Packit 549fdc
	err = socketpair(AF_UNIX, SOCK_STREAM, 0, sockets);
Packit 549fdc
	if (err == -1) {
Packit 549fdc
		perror("socketpair");
Packit 549fdc
		fail("socketpair failed\n");
Packit 549fdc
		return;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	child = fork();
Packit 549fdc
	if (child < 0) {
Packit 549fdc
		perror("fork");
Packit 549fdc
		fail("fork");
Packit 549fdc
		return;
Packit 549fdc
	}
Packit 549fdc
Packit 549fdc
	if (child) {
Packit 549fdc
		int status;
Packit 549fdc
Packit 549fdc
		client(sockets[1]);
Packit 549fdc
		wait(&status);
Packit 549fdc
		check_wait_status(status);
Packit 549fdc
	} else {
Packit 549fdc
		server(sockets[0]);
Packit 549fdc
		_exit(0);
Packit 549fdc
	}
Packit 549fdc
}
Packit 549fdc
Packit 549fdc
#endif				/* _WIN32 */