#!/bin/sh
#
# Copyright (c) 2004 - 2008 Kungliga Tekniska Högskolan
# (Royal Institute of Technology, Stockholm, Sweden). 
# All rights reserved. 
#
# Redistribution and use in source and binary forms, with or without 
# modification, are permitted provided that the following conditions 
# are met: 
#
# 1. Redistributions of source code must retain the above copyright 
#    notice, this list of conditions and the following disclaimer. 
#
# 2. Redistributions in binary form must reproduce the above copyright 
#    notice, this list of conditions and the following disclaimer in the 
#    documentation and/or other materials provided with the distribution. 
#
# 3. Neither the name of the Institute nor the names of its contributors 
#    may be used to endorse or promote products derived from this software 
#    without specific prior written permission. 
#
# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
# ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
# SUCH DAMAGE. 
#
# Id: test_nist.in 21787 2007-08-02 08:50:24Z lha 
#

srcdir="@srcdir@"
objdir="@objdir@"
nistdir=${objdir}/PKITS_data
nistzip=${srcdir}/data/PKITS_data.zip
egrep="@egrep@"

limit="${1:-nolimit}"

stat="--statistic-file=${objdir}/statfile"

hxtool="${TESTS_ENVIRONMENT} ./hxtool ${stat}"

# nistzip is not distributed part of the distribution
test -f "$nistzip" || exit 77

if ${hxtool} info | grep 'rsa: hcrypto null RSA' > /dev/null ; then
    exit 77
fi
if ${hxtool} info | grep 'rand: not available' > /dev/null ; then
    exit 77
fi

#--------- Try to find unzip

oldifs=$IFS
IFS=:
set -- $PATH
IFS=$oldifs
found=

for p in "$@" ; do
    test -x "$p/unzip" && { found=1 ; break; }
done
test "X$found" = "X" && exit 77

#---------


echo "nist tests, version 2"

if [ ! -d "$nistdir" ] ; then
    ( mkdir "$nistdir" && unzip -d "${nistdir}" "${nistzip}" ) >/dev/null || \
	{ rm -rf "$nistdir" ; exit 1; }
fi

ec=
name=
description=
while read result cert other ; do
    if expr "$result" : "#" > /dev/null; then
	name=${cert}
	description="${other}"
	continue
    fi
    
    test nolimit != "${limit}" && ! expr "$name" : "$limit" > /dev/null && continue

    test "$result" = "end" && break

    args=
    args="$args cert:FILE:$nistdir/certs/$cert"
    args="$args chain:DIR:$nistdir/certs"
    args="$args anchor:FILE:$nistdir/certs/TrustAnchorRootCertificate.crt"

    for a in $nistdir/crls/*.crl; do
	args="$args crl:FILE:$a"
    done

    cmd="${hxtool} verify --time=2008-05-20 $args"
    eval ${cmd} > /dev/null
    res=$?

    case "${result},${res}" in
    0,0) r="PASSs";;
    0,*) r="FAILs";;
    [123],0) r="FAILf";;
    [123],*) r="PASSf";;
    *) echo="unknown result ${result},${res}" ; exit 1 ;;
    esac
    if ${egrep} "^${name} FAIL" $srcdir/data/nist-result2 > /dev/null; then
	if expr "$r" : "PASS" >/dev/null; then
	    echo "${name} passed when expected not to"
	    echo "# ${description}" > nist2-passed-${name}.tmp
	    ec=1
	fi
    elif ${egrep} "^${name} EITHER" $srcdir/data/nist-result2 > /dev/null; then
	:
    elif expr "$r" : "FAIL.*" >/dev/null ; then
	echo "$r ${name} ${description}"
	echo "# ${description}" > nist2-failed-${name}.tmp
	echo "$cmd" >> nist2-failed-${name}.tmp
	ec=1
    fi

done < $srcdir/data/nist-data2


echo "done!"

exit $ec
