|
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
|