| #!/bin/sh |
| # Run FIPS CAVS tests |
| # Copyright 2008 Free Software Foundation, Inc. |
| # |
| # This file is free software; as a special exception the author gives |
| # unlimited permission to copy and/or distribute it, with or without |
| # modifications, as long as this notice is preserved. |
| # |
| # This file is distributed in the hope that it will be useful, but |
| # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the |
| # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| # |
| # Instructions: |
| # |
| # 1. Cd to the libgcrypt/tests directory |
| # |
| # 2. Unpack the test vector tarball into subdirectory named "cavs". |
| # An example directory layout after unpacking might be: |
| # libgcrypt/tests/cavs/AES/req/CBCGFSbox128.req |
| # libgcrypt/tests/cavs/AES/req/CFB128MCT128.req |
| # |
| # Note that below the "cavs" directory there should only be one |
| # directory part named "req". Further avoid directory part |
| # names "resp". |
| # |
| # 3. Run this script from the libgcrypt/tests directory: |
| # ./cavs_tests.sh |
| # |
| # 4. Send the result file cavs/CAVS_results-*.zip to the testing lab. |
| # |
| |
| # Stop script if something unexpected happens. |
| set -e |
| |
| # A global flag to keep track of errors. |
| errors_seen_file="$(pwd)/.#cavs_test.errors_seen.tmp" |
| [ -f "$errors_seen_file" ] && rm "$errors_seen_file" |
| continue_mode=no |
| [ "$1" = "--continue" ] && continue_mode=yes |
| |
| |
| # Function to run one test. |
| # The argument is the request file name. |
| function run_one_test () { |
| local reqfile="$1" |
| local rspfile |
| local tmprspfile |
| local respdir |
| local dflag="" |
| |
| tmprspfile=$(echo "$reqfile" | sed 's,.req$,.rsp,') |
| rspfile=$(echo "$tmprspfile" | sed 's,/req/,/resp/,' ) |
| respdir=$(dirname "$rspfile") |
| [ -f "$tmprspfile" ] && rm "$tmprspfile" |
| [ -d "$respdir" ] || mkdir "$respdir" |
| [ -f "$rspfile" ] && rm "$rspfile" |
| |
| if echo "$reqfile" | grep '/DSA/req/' >/dev/null 2>/dev/null; then |
| dflag="-D" |
| fi |
| |
| if ./cavs_driver.pl -I libgcrypt $dflag "$reqfile"; then |
| if [ -f "$tmprspfile" ]; then |
| mv "$tmprspfile" "$rspfile" |
| else |
| echo "failed test: $reqfile" >&2 |
| : >"$errors_seen_file" |
| fi |
| else |
| echo "failed test: $reqfile rc=$?" >&2 |
| : >"$errors_seen_file" |
| fi |
| } |
| |
| |
| |
| # Save date and system architecure to construct the output archive name |
| DATE=$(date +%Y%m%d) |
| ARCH=$(arch || echo unknown) |
| result_file="CAVS_results-$ARCH-$DATE.zip" |
| |
| for f in fipsdrv cavs_driver.pl; do |
| if [ ! -f "./$f" ]; then |
| echo "required program \"$f\" missing in current directory" >&2 |
| exit 2 |
| fi |
| done |
| if [ ! -d cavs ]; then |
| echo "required directory \"cavs\" missing below current directory" >&2 |
| exit 2 |
| fi |
| if [ ! zip -h >/dev/null 2>&1 ]; then |
| echo "required program \"zip\" is not installed on this system" >&2 |
| exit 2 |
| fi |
| |
| # Set the PATH to this directory so that the perl script is able to |
| # find the test drivers. |
| PATH=.:$PATH |
| |
| # Check whether there are any stale response files |
| find cavs -type f -name "*.rsp" | ( while read f ; do |
| echo "Stale response file: $f" >&2 |
| any=yes |
| done |
| if [ "$any" = "yes" ]; then |
| echo "Stale response files found" >&2 |
| if [ "$continue_mode" != "yes" ]; then |
| echo "use option --continue if that is not a problem" >&2 |
| exit 1 |
| fi |
| fi |
| ) || exit 1 |
| |
| |
| # Find all test files and run the tests. |
| find cavs -type f -name "*.req" | while read f ; do |
| echo "Running test file $f" >&2 |
| run_one_test "$f" |
| if [ -f "$errors_seen_file" ]; then |
| break; |
| fi |
| done |
| |
| if [ -f "$errors_seen_file" ]; then |
| rm "$errors_seen_file" |
| echo "Error encountered - not packing up response file" >&2 |
| exit 1 |
| fi |
| |
| echo "Packing up all response files" >&2 |
| cd cavs |
| find . -type f -name "*rsp" -print | zip -@ "$result_file" |
| |
| echo "Result file is: cavs/$result_file" >&2 |