Fix ECB mode test
[libgcrypt.git] / tests / cavs_tests.sh
1 #!/bin/sh
2 # Run FIPS CAVS tests
3 # Copyright 2008 Free Software Foundation, Inc.
4 #
5 # This file is free software; as a special exception the author gives
6 # unlimited permission to copy and/or distribute it, with or without
7 # modifications, as long as this notice is preserved.
8 #
9 # This file is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
11 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 #
13 # Instructions:
14 #
15 # 1. Cd to the libgcrypt/tests directory
16 #
17 # 2. Unpack the test vector tarball into subdirectory named "cavs". 
18 #    An example directory layout after unpacking might be:
19 #      libgcrypt/tests/cavs/AES/req/CBCGFSbox128.req
20 #      libgcrypt/tests/cavs/AES/req/CFB128MCT128.req
21 #
22 #    Note that below the "cavs" directory there should only be one
23 #    directory part named "req".  Further avoid directory part
24 #    names "resp".
25 #
26 # 3. Run this script from the libgcrypt/tests directory:
27 #      ./cavs_tests.sh
28 #
29 # 4. Send the result file cavs/CAVS_results-*.zip to the testing lab.
30 #
31
32 # Stop script if something unexpected happens.
33 set -e
34
35 # A global flag to keep track of errors.
36 errors_seen_file="$(pwd)/.#cavs_test.errors_seen.tmp"
37 [ -f "$errors_seen_file" ] && rm "$errors_seen_file"
38 continue_mode=no
39 [ "$1" = "--continue" ] && continue_mode=yes
40
41
42 # Function to run one test.  
43 # The argument is the request file name.
44 function run_one_test () {
45     local reqfile="$1"
46     local rspfile
47     local tmprspfile
48     local respdir
49
50     tmprspfile=$(echo "$reqfile" | sed 's,.req$,.rsp,')
51     rspfile=$(echo "$tmprspfile" | sed 's,/req/,/resp/,' )
52     respdir=$(dirname "$rspfile")
53     [ -f "$tmprspfile" ] && rm "$tmprspfile"
54     [ -d "$respdir" ] || mkdir "$respdir"
55     [ -f "$rspfile" ] &&  rm "$rspfile"
56     
57     if ./cavs_driver.pl -I libgcrypt "$reqfile"; then
58       if [ -f "$tmprspfile" ]; then
59           mv "$tmprspfile" "$rspfile"
60       else 
61           echo "failed test: $reqfile" >&2
62           : >"$errors_seen_file"
63       fi
64     else
65         echo "failed test: $reqfile rc=$?" >&2
66         : >"$errors_seen_file"
67     fi
68 }
69
70
71
72 # Save date and system architecure to construct the output archive name
73 DATE=$(date +%Y%m%d)
74 ARCH=$(arch || echo unknown)
75 result_file="CAVS_results-$ARCH-$DATE.zip"
76
77 for f in fipsdrv cavs_driver.pl; do
78     if [ ! -f "./$f" ]; then
79       echo "required program \"$f\" missing in current directory" >&2
80       exit 2
81     fi
82 done
83 if [ ! -d cavs ]; then
84     echo "required directory \"cavs\" missing below current directory" >&2
85     exit 2
86 fi
87 if [ ! zip -h >/dev/null 2>&1 ]; then
88     echo "required program \"zip\" is not installed on this system" >&2
89     exit 2
90 fi
91
92 # Set the PATH to this directory so that the perl script is able to
93 # find the test drivers.
94 PATH=.:$PATH
95
96 # Check whether there are any stale response files
97 find cavs -type f -name "*.rsp" | ( while read f ; do
98     echo "Stale response file: $f" >&2
99     any=yes
100 done
101 if [ "$any" = "yes" ]; then
102     echo "Stale response files found" >&2
103     if [ "$continue_mode" != "yes" ]; then
104        echo "use option --continue if that is not a problem" >&2
105        exit 1
106     fi
107 fi
108 ) || exit 1
109
110
111 # Find all test files and run the tests.
112 find cavs -type f -name "*.req" | while read f ; do
113     echo "Running test file $f" >&2
114     run_one_test "$f"
115     if [ -f "$errors_seen_file" ]; then
116         break;
117     fi
118 done
119
120 if [ -f "$errors_seen_file" ]; then
121     rm "$errors_seen_file"
122     echo "Error enountered - not packing up response file" >&2
123     exit 1
124 fi
125
126 echo "Packing up all response files" >&2
127 cd cavs
128 find . -type f -name "*rsp" -print | zip -@ "$result_file"
129
130 echo "Result file is: cavs/$result_file" >&2