summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2011-03-16 21:46:13 +0100
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2011-03-16 21:46:13 +0100
commit5d5719b3e3aa328af245dc79ed7fc8dacb088bca (patch)
tree641d874b0b8343eaa9b49bd4654c756fb65dd229 /tests
parente322d6be54c6014887b7c023d01247c4b5b2b6a3 (diff)
downloadgnutls-5d5719b3e3aa328af245dc79ed7fc8dacb088bca.tar.gz
Corrected nettle's RNG behavior on fork and added a test case.
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/rng-fork.c100
2 files changed, 101 insertions, 1 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 09c4052bd8..54447e71c4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -60,7 +60,7 @@ ctests = simple gc set_pkcs12_cred certder certuniqueid mpi \
crq_key_id x509sign-verify cve-2009-1415 cve-2009-1416 \
crq_apis init_roundtrip pkcs12_s2k_pem dn2 mini-eagain \
nul-in-x509-names x509_altname pkcs12_encode mini-x509 \
- mini-x509-rehandshake #gendh
+ mini-x509-rehandshake rng-fork #gendh
if ENABLE_OPENSSL
ctests += openssl
diff --git a/tests/rng-fork.c b/tests/rng-fork.c
new file mode 100644
index 0000000000..1e4b5e531d
--- /dev/null
+++ b/tests/rng-fork.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2008, 2010 Free Software Foundation, Inc.
+ *
+ * Author: Nikos Mavrogiannopoulos
+ *
+ * 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 General Public License
+ * along with GnuTLS. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "utils.h"
+#include <gnutls/gnutls.h>
+#include <gnutls/crypto.h>
+#include "../lib/random.h"
+
+static void dump(const char* name, unsigned char* buf, int buf_size)
+{
+int i;
+ printf("%s: ", name);
+ for(i=0;i<buf_size;i++)
+ printf("%.2x:", buf[i]);
+ printf("\n");
+}
+
+
+
+void
+doit (void)
+{
+ unsigned char buf1[32];
+ unsigned char buf2[32];
+ pid_t pid;
+ int ret;
+ FILE* fp;
+
+
+ gnutls_global_init ();
+
+ pid = fork();
+ if (pid == 0)
+ {
+ fp = fopen("/tmp/rng-test", "w");
+ if (fp == NULL)
+ fail("cannot open file");
+
+ _gnutls_rnd (GNUTLS_RND_RANDOM, buf1, sizeof (buf1));
+ if (debug) dump("buf1", buf1, sizeof(buf1));
+
+ fwrite(buf1, 1, sizeof(buf1), fp);
+ fclose(fp);
+ }
+ else
+ {
+ /* daddy */
+ _gnutls_rnd (GNUTLS_RND_RANDOM, buf2, sizeof (buf2));
+ if (debug) dump("buf2", buf2, sizeof(buf2));
+ waitpid(pid, NULL, 0);
+
+ fp = fopen("/tmp/rng-test", "r");
+ if (fp == NULL)
+ fail("cannot open file");
+
+ ret = fread(buf1, 1, sizeof(buf1), fp);
+
+ if (ret != sizeof(buf1))
+ {
+ fail("error testing the random generator.");
+ return;
+ }
+
+ if (memcmp(buf1, buf2, sizeof(buf1))==0)
+ {
+ fail("error in the random generator. Produces same valus after fork()");
+ return;
+ }
+
+ success("success");
+ }
+}