diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-03-16 21:46:13 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2011-03-16 21:46:13 +0100 |
commit | 5d5719b3e3aa328af245dc79ed7fc8dacb088bca (patch) | |
tree | 641d874b0b8343eaa9b49bd4654c756fb65dd229 /tests | |
parent | e322d6be54c6014887b7c023d01247c4b5b2b6a3 (diff) | |
download | gnutls-5d5719b3e3aa328af245dc79ed7fc8dacb088bca.tar.gz |
Corrected nettle's RNG behavior on fork and added a test case.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/rng-fork.c | 100 |
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"); + } +} |