summaryrefslogtreecommitdiffstats
path: root/tests/slow/hash-large.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/slow/hash-large.c')
-rw-r--r--tests/slow/hash-large.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/tests/slow/hash-large.c b/tests/slow/hash-large.c
new file mode 100644
index 0000000..71312ef
--- /dev/null
+++ b/tests/slow/hash-large.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2016 Nikos Mavrogiannopoulos
+ * Copyright (C) 2017 Red Hat, Inc.
+ *
+ * This file is part of GnuTLS.
+ *
+ * GnuTLS is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GnuTLS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <gnutls/gnutls.h>
+#include <gnutls/crypto.h>
+#include <limits.h>
+#include "utils.h"
+
+#if defined(__FreeBSD__) || !defined(HAVE_MMAP)
+void doit(void)
+{
+ exit(77);
+}
+
+#else /* working test */
+
+/* Test hashing on very large buffers >= 2^31 */
+
+#if !defined(_WIN32)
+# include <signal.h>
+# include <unistd.h>
+
+static void exit_77(int signo)
+{
+ _exit(77);
+}
+#endif
+
+#define MIN(x,y) ((x)<(y))?(x):(y)
+
+#include <sys/mman.h>
+
+static size_t _mmap_size;
+static void *get_mem(size_t size)
+{
+ void *p;
+ _mmap_size = size;
+ p = mmap(NULL, size, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (p == MAP_FAILED)
+ return NULL;
+ return p;
+}
+
+static void put_mem(void *mem)
+{
+ munmap(mem, _mmap_size);
+}
+
+void doit(void)
+{
+ unsigned char digest[32];
+ int err;
+ char *buf, *p;
+ ssize_t size, left, size2;
+ gnutls_hash_hd_t td;
+
+ if (sizeof(size) <= 4)
+ exit(77);
+
+#if !defined(_WIN32)
+ signal(SIGSEGV, exit_77);
+ signal(SIGBUS, exit_77);
+#endif
+
+ global_init();
+
+ size = (ssize_t)UINT_MAX + (ssize_t)64*1024;
+ buf = get_mem(size);
+ if (buf == NULL)
+ exit(77);
+
+ if (size < (ssize_t)UINT_MAX)
+ exit(77);
+
+
+ err =
+ gnutls_hash_fast(GNUTLS_DIG_SHA256, buf, size,
+ digest);
+ if (err < 0)
+ fail("gnutls_hash_fast(SHA256) failed: %d\n", err);
+ else {
+#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"
+ if (memcmp(digest, SHA256_HASH, 32) == 0) {
+ if (debug)
+ success("gnutls_hash_fast(SHA256) %lu OK\n", (unsigned long)size);
+ } else {
+ hexprint(digest, 32);
+ fail("gnutls_hash_fast(SHA256) failure\n");
+ }
+ }
+
+ err = gnutls_hash_init(&td, GNUTLS_DIG_SHA256);
+ if (err < 0) {
+ fail("failed in %d\n", __LINE__);
+ }
+
+ size2 = size;
+ p = buf;
+ while(size2 > 0) {
+ left = MIN(64*1024, size2);
+ gnutls_hash(td, p, left);
+ size2 -= left;
+ p += left;
+ }
+
+ gnutls_hash_output(td, digest);
+ gnutls_hash_deinit(td, NULL);
+ if (memcmp(digest, SHA256_HASH, 32) == 0) {
+ if (debug)
+ success("gnutls_hash_fast(SHA256) %lu OK\n", (unsigned long)size);
+ } else {
+ hexprint(digest, 32);
+ fail("gnutls_hash(SHA256) failure\n");
+ }
+
+ /* SHA1 */
+
+ err =
+ gnutls_hash_fast(GNUTLS_DIG_SHA1, buf, size,
+ digest);
+ if (err < 0)
+ fail("gnutls_hash_fast(SHA1) failed: %d\n", err);
+ else {
+#define SHA1_HASH "\x75\xd2\x67\x3f\xec\x73\xe4\x57\xb8\x40\xb3\xb5\xf1\xc7\xa8\x1a\x2d\x11\x7e\xd9"
+ if (memcmp(digest, SHA1_HASH, 20) == 0) {
+ if (debug)
+ success("gnutls_hash_fast(SHA1) OK\n");
+ } else {
+ hexprint(digest, 20);
+ fail("gnutls_hash_fast(SHA1) failure\n");
+ }
+ }
+
+ err =
+ gnutls_hmac_fast(GNUTLS_MAC_SHA1, "keykeykey", 9, buf, size,
+ digest);
+ if (err < 0)
+ fail("gnutls_hmac_fast(SHA1) failed: %d\n", err);
+ else {
+#define SHA1_MAC "\xe2\xe9\x84\x48\x53\xe3\x0b\xfe\x45\x04\xf6\x6b\x5b\x6d\x4d\x2c\xa3\x0f\xcf\x23"
+ if (memcmp(digest, SHA1_MAC, 20) == 0) {
+ if (debug)
+ success("gnutls_hmac_fast(SHA1) OK\n");
+ } else {
+ hexprint(digest, 20);
+ fail("gnutls_hmac_fast(SHA1) failure\n");
+ }
+ }
+
+ put_mem(buf);
+ gnutls_global_deinit();
+}
+#endif