#!/bin/sh

# Copyright (C) 2014 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 <https://www.gnu.org/licenses/>.

: ${srcdir=.}

if ! test -x "/usr/bin/dieharder"; then
	exit 77
fi

VERSION=`dieharder -l|grep version|cut -d ' ' -f 6`

if test "$1" = "full"; then
	OPTIONS="-a"
else
	if test "${VERSION}" = "2.28.1"; then
		OPTIONS="-d 5"
		OPTIONS2="-d 10"
	else
		OPTIONS="-d 202"
		OPTIONS2="-d 10"
	fi
fi

OUTFILE=rng.log
RNGFILE=rng.out
RNGFILE2=rng2.out

rm -f "${OUTFILE}"
rm -f "${RNGFILE}"
rm -f "${RNGFILE2}"

. "${srcdir}/../scripts/common.sh"


RINPUTNO=`dieharder -g -1|grep file_input_raw|cut -d '|' -f 2|cut -d ' ' -f 1`

if test -z "${RINPUTNO}"; then
	echo "Cannot determine dieharder option for raw file input, assuming 201"
	RINPUTNO=201
fi

echo ""
echo "Testing nonce PRNG"

./rng nonce 64 "${RNGFILE}"
./rng nonce 64 "${RNGFILE2}"
cmp "${RNGFILE}" "${RNGFILE2}"  >/dev/null 2>&1
ret=$?

if test ${ret} = 0; then
	echo "numbers are repeated in nonce!"
	exit 1
fi

./rng nonce 100000000 "${RNGFILE}"

dieharder -f "${RNGFILE}" -g ${RINPUTNO} ${OPTIONS} >"${OUTFILE}" 2>&1
if ! test -z "${OPTIONS2}"; then
	dieharder -f "${RNGFILE}" -g ${RINPUTNO} ${OPTIONS2} >>"${OUTFILE}" 2>&1
fi
grep FAILED "${OUTFILE}" >/dev/null 2>&1
ret=$?

if test "${ret}" = "0"; then
	echo "test failed for nonce"
	exit 1
fi

grep PASSED "${OUTFILE}" >/dev/null 2>&1
ret=$?

if test "${ret}" != "0"; then
	echo "could not run dieharder test?"
	exit 1
fi

cat "${OUTFILE}"
rm -f "${OUTFILE}"
echo ""
echo "Testing key PRNG"

./rng key 64 "${RNGFILE}"
./rng key 64 "${RNGFILE2}"
cmp "${RNGFILE}" "${RNGFILE2}" >/dev/null 2>&1
ret=$?

if test ${ret} = 0; then
	echo "numbers are repeated in nonce!"
	exit 1
fi

./rng key 100000000 "${RNGFILE}"

dieharder -f "${RNGFILE}" -g ${RINPUTNO} ${OPTIONS} >"${OUTFILE}" 2>&1
if ! test -z "${OPTIONS2}"; then
	dieharder -f "${RNGFILE}" -g ${RINPUTNO} ${OPTIONS2} >>"${OUTFILE}" 2>&1
fi
grep FAILED "${OUTFILE}" >/dev/null 2>&1 
ret=$?


if test "${ret}" = "0"; then
	echo "test failed for key"
	exit 1
fi

grep PASSED "${OUTFILE}" >/dev/null 2>&1
ret=$?

if test "${ret}" != "0"; then
	echo "could not run dieharder test?"
	exit 1
fi

cat "${OUTFILE}"
rm -f "${OUTFILE}"
echo ""
echo "Testing /dev/zero PRNG"
dd if=/dev/zero of="${RNGFILE}" bs=4 count=10000000 >/dev/null 2>&1

dieharder -f "${RNGFILE}" -g ${RINPUTNO} ${OPTIONS} >"${OUTFILE}" 2>&1
if ! test -z "${OPTIONS2}"; then
	dieharder -f "${RNGFILE}" -g ${RINPUTNO} ${OPTIONS2} >>"${OUTFILE}" 2>&1
fi
grep PASSED "${OUTFILE}" >/dev/null 2>&1 
ret=$?

if test "${ret}" = "0"; then
	echo "test succeeded for /dev/zero!!!"
	exit 1
fi

grep FAILED "${OUTFILE}" >/dev/null 2>&1
ret=$?

if test "${ret}" != "0"; then
	echo "could not run dieharder test?"
	exit 1
fi

cat "${OUTFILE}"
rm -f "${OUTFILE}"
rm -f "${RNGFILE}"
rm -f "${RNGFILE2}"

exit 0
