Blame tests/slow/hash-large.c

Packit aea12f
/*
Packit aea12f
 * Copyright (C) 2016 Nikos Mavrogiannopoulos
Packit aea12f
 * Copyright (C) 2017 Red Hat, Inc.
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
Packit aea12f
 * it 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,
Packit aea12f
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit aea12f
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit aea12f
 * GNU General Public License for more details.
Packit aea12f
 *
Packit aea12f
 * You should have received a copy of the GNU Lesser General Public License
Packit aea12f
 * along with this program.  If not, see <https://www.gnu.org/licenses/>
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 <gnutls/gnutls.h>
Packit aea12f
#include <gnutls/crypto.h>
Packit aea12f
#include <limits.h>
Packit aea12f
#include "utils.h"
Packit aea12f
Packit aea12f
#if defined(__FreeBSD__) || !defined(HAVE_MMAP)
Packit aea12f
void doit(void)
Packit aea12f
{
Packit aea12f
	exit(77);
Packit aea12f
}
Packit aea12f
Packit aea12f
#else /* working test */
Packit aea12f
Packit aea12f
/* Test hashing on very large buffers >= 2^31 */
Packit aea12f
Packit aea12f
#if !defined(_WIN32)
Packit aea12f
# include <signal.h>
Packit aea12f
# include <unistd.h>
Packit aea12f
Packit aea12f
static void exit_77(int signo)
Packit aea12f
{
Packit aea12f
	_exit(77);
Packit aea12f
}
Packit aea12f
#endif
Packit aea12f
Packit aea12f
#define MIN(x,y) ((x)<(y))?(x):(y)
Packit aea12f
Packit aea12f
#include <sys/mman.h>
Packit aea12f
Packit aea12f
static size_t _mmap_size;
Packit aea12f
static void *get_mem(size_t size)
Packit aea12f
{
Packit aea12f
	void *p;
Packit aea12f
	_mmap_size = size;
Packit aea12f
	p = mmap(NULL, size, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
Packit aea12f
	if (p == MAP_FAILED)
Packit aea12f
		return NULL;
Packit aea12f
	return p;
Packit aea12f
}
Packit aea12f
Packit aea12f
static void put_mem(void *mem)
Packit aea12f
{
Packit aea12f
	munmap(mem, _mmap_size);
Packit aea12f
}
Packit aea12f
Packit aea12f
void doit(void)
Packit aea12f
{
Packit aea12f
	unsigned char digest[32];
Packit aea12f
	int err;
Packit aea12f
	char *buf, *p;
Packit aea12f
	ssize_t size, left, size2;
Packit aea12f
	gnutls_hash_hd_t td;
Packit aea12f
Packit aea12f
	if (sizeof(size) <= 4)
Packit aea12f
		exit(77);
Packit aea12f
Packit aea12f
#if !defined(_WIN32)
Packit aea12f
	signal(SIGSEGV, exit_77);
Packit aea12f
	signal(SIGBUS, exit_77);
Packit aea12f
#endif
Packit aea12f
Packit aea12f
	global_init();
Packit aea12f
Packit aea12f
	size = (ssize_t)UINT_MAX + (ssize_t)64*1024;
Packit aea12f
	buf = get_mem(size);
Packit aea12f
	if (buf == NULL)
Packit aea12f
		exit(77);
Packit aea12f
Packit aea12f
	if (size < (ssize_t)UINT_MAX)
Packit aea12f
		exit(77);
Packit aea12f
Packit aea12f
Packit aea12f
	err =
Packit aea12f
	    gnutls_hash_fast(GNUTLS_DIG_SHA256, buf, size,
Packit aea12f
			     digest);
Packit aea12f
	if (err < 0)
Packit aea12f
		fail("gnutls_hash_fast(SHA256) failed: %d\n", err);
Packit aea12f
	else {
Packit aea12f
#define SHA256_HASH "\x80\x92\xd9\xbe\x54\xa0\xe9\xd7\x7c\xb8\xe4\x2d\xd3\x7c\x19\xfe\x4e\x68\x84\x33\x71\xef\x1c\x81\xd6\x44\x36\x52\x06\xd8\x4b\x8a"
Packit aea12f
		if (memcmp(digest, SHA256_HASH, 32) == 0) {
Packit aea12f
			if (debug)
Packit aea12f
				success("gnutls_hash_fast(SHA256) %lu OK\n", (unsigned long)size);
Packit aea12f
		} else {
Packit aea12f
			hexprint(digest, 32);
Packit aea12f
			fail("gnutls_hash_fast(SHA256) failure\n");
Packit aea12f
		}
Packit aea12f
	}
Packit aea12f
Packit aea12f
	err = gnutls_hash_init(&td, GNUTLS_DIG_SHA256);
Packit aea12f
	if (err < 0) {
Packit aea12f
		fail("failed in %d\n", __LINE__);
Packit aea12f
	}
Packit aea12f
Packit aea12f
	size2 = size;
Packit aea12f
	p = buf;
Packit aea12f
	while(size2 > 0) {
Packit aea12f
		left = MIN(64*1024, size2);
Packit aea12f
		gnutls_hash(td, p, left);
Packit aea12f
		size2 -= left;
Packit aea12f
		p += left;
Packit aea12f
	}
Packit aea12f
Packit aea12f
	gnutls_hash_output(td, digest);
Packit aea12f
	gnutls_hash_deinit(td, NULL);
Packit aea12f
	if (memcmp(digest, SHA256_HASH, 32) == 0) {
Packit aea12f
		if (debug)
Packit aea12f
			success("gnutls_hash_fast(SHA256) %lu OK\n", (unsigned long)size);
Packit aea12f
	} else {
Packit aea12f
		hexprint(digest, 32);
Packit aea12f
		fail("gnutls_hash(SHA256) failure\n");
Packit aea12f
	}
Packit aea12f
Packit aea12f
	/* SHA1 */
Packit aea12f
Packit aea12f
	err =
Packit aea12f
	    gnutls_hash_fast(GNUTLS_MAC_SHA1, buf, size,
Packit aea12f
			     digest);
Packit aea12f
	if (err < 0)
Packit aea12f
		fail("gnutls_hash_fast(SHA1) failed: %d\n", err);
Packit aea12f
	else {
Packit aea12f
#define SHA1_HASH "\x75\xd2\x67\x3f\xec\x73\xe4\x57\xb8\x40\xb3\xb5\xf1\xc7\xa8\x1a\x2d\x11\x7e\xd9"
Packit aea12f
		if (memcmp(digest, SHA1_HASH, 20) == 0) {
Packit aea12f
			if (debug)
Packit aea12f
				success("gnutls_hash_fast(SHA1) OK\n");
Packit aea12f
		} else {
Packit aea12f
			hexprint(digest, 20);
Packit aea12f
			fail("gnutls_hash_fast(SHA1) failure\n");
Packit aea12f
		}
Packit aea12f
	}
Packit aea12f
Packit aea12f
	err =
Packit aea12f
	    gnutls_hmac_fast(GNUTLS_MAC_SHA1, "keykeykey", 9, buf, size,
Packit aea12f
			     digest);
Packit aea12f
	if (err < 0)
Packit aea12f
		fail("gnutls_hmac_fast(SHA1) failed: %d\n", err);
Packit aea12f
	else {
Packit aea12f
#define SHA1_MAC "\xe2\xe9\x84\x48\x53\xe3\x0b\xfe\x45\x04\xf6\x6b\x5b\x6d\x4d\x2c\xa3\x0f\xcf\x23"
Packit aea12f
		if (memcmp(digest, SHA1_MAC, 20) == 0) {
Packit aea12f
			if (debug)
Packit aea12f
				success("gnutls_hmac_fast(SHA1) OK\n");
Packit aea12f
		} else {
Packit aea12f
			hexprint(digest, 20);
Packit aea12f
			fail("gnutls_hmac_fast(SHA1) failure\n");
Packit aea12f
		}
Packit aea12f
	}
Packit aea12f
Packit aea12f
	put_mem(buf);
Packit aea12f
	gnutls_global_deinit();
Packit aea12f
}
Packit aea12f
#endif