|
Packit |
aea12f |
/*
|
|
Packit |
aea12f |
* Copyright (C) 2008-2012 Free Software Foundation, Inc.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* Author: Nikos Mavrogiannopoulos
|
|
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 it
|
|
Packit |
aea12f |
* 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, but
|
|
Packit |
aea12f |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
aea12f |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
aea12f |
* General Public License for more details.
|
|
Packit |
aea12f |
*
|
|
Packit |
aea12f |
* You should have received a copy of the GNU General Public License
|
|
Packit |
aea12f |
* along with GnuTLS. If not, see <https://www.gnu.org/licenses/>.
|
|
Packit |
aea12f |
*
|
|
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 <unistd.h>
|
|
Packit |
aea12f |
#include <sys/types.h>
|
|
Packit |
aea12f |
#include <assert.h>
|
|
Packit |
aea12f |
#if !defined(_WIN32)
|
|
Packit |
aea12f |
#include <sys/wait.h>
|
|
Packit |
aea12f |
#endif
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
#include "utils.h"
|
|
Packit |
aea12f |
#include <gnutls/gnutls.h>
|
|
Packit |
aea12f |
#include <gnutls/crypto.h>
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
#if !defined(_WIN32)
|
|
Packit |
aea12f |
static void dump(const char *name, unsigned char *buf, int buf_size)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
int i;
|
|
Packit |
aea12f |
printf("%s: ", name);
|
|
Packit |
aea12f |
for (i = 0; i < buf_size; i++)
|
|
Packit |
aea12f |
printf("%.2x:", buf[i]);
|
|
Packit |
aea12f |
printf("\n");
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
#define FILENAME "./rng-test"
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
void doit(void)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
unsigned char buf1[64];
|
|
Packit |
aea12f |
unsigned char buf2[64];
|
|
Packit |
aea12f |
pid_t pid;
|
|
Packit |
aea12f |
int ret;
|
|
Packit |
aea12f |
FILE *fp;
|
|
Packit |
aea12f |
unsigned i;
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
global_init();
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
for (i = GNUTLS_RND_NONCE; i <= GNUTLS_RND_KEY; i++) {
|
|
Packit |
aea12f |
pid = fork();
|
|
Packit |
aea12f |
if (pid == 0) {
|
|
Packit |
aea12f |
fp = fopen(FILENAME, "w");
|
|
Packit |
aea12f |
if (fp == NULL)
|
|
Packit |
aea12f |
fail("cannot open file");
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
assert(gnutls_rnd(i, buf1, sizeof(buf1)) >= 0);
|
|
Packit |
aea12f |
if (debug)
|
|
Packit |
aea12f |
dump("buf1", buf1, sizeof(buf1));
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
fwrite(buf1, 1, sizeof(buf1), fp);
|
|
Packit |
aea12f |
fclose(fp);
|
|
Packit |
aea12f |
gnutls_global_deinit();
|
|
Packit |
aea12f |
exit(0);
|
|
Packit |
aea12f |
} else {
|
|
Packit |
aea12f |
/* daddy */
|
|
Packit |
aea12f |
assert(gnutls_rnd(i, buf2, sizeof(buf2)) >= 0);
|
|
Packit |
aea12f |
if (debug)
|
|
Packit |
aea12f |
dump("buf2", buf2, sizeof(buf2));
|
|
Packit |
aea12f |
waitpid(pid, NULL, 0);
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
fp = fopen(FILENAME, "r");
|
|
Packit |
aea12f |
if (fp == NULL)
|
|
Packit |
aea12f |
fail("cannot open file");
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
ret = fread(buf1, 1, sizeof(buf1), fp);
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
fclose(fp);
|
|
Packit |
aea12f |
remove(FILENAME);
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
if (ret != sizeof(buf1)) {
|
|
Packit |
aea12f |
fail("error testing the random generator (%u).\n", i);
|
|
Packit |
aea12f |
return;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
if (memcmp(buf1, buf2, sizeof(buf1)) == 0) {
|
|
Packit |
aea12f |
fail("error in the random generator (%u). Produces same valus after fork()\n", i);
|
|
Packit |
aea12f |
return;
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
if (debug)
|
|
Packit |
aea12f |
success("success\n");
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
|
|
Packit |
aea12f |
gnutls_global_deinit();
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
#else
|
|
Packit |
aea12f |
void doit(void)
|
|
Packit |
aea12f |
{
|
|
Packit |
aea12f |
exit(77);
|
|
Packit |
aea12f |
}
|
|
Packit |
aea12f |
#endif
|