1193645Ssimon#!/usr/local/bin/perl -w
2193645Ssimon# Quick & dirty utility to generate a script for executing the
3193645Ssimon# FIPS 140-2 CMVP algorithm tests based on the pathnames of
4193645Ssimon# input algorithm test files actually present (the unqualified
5193645Ssimon# file names are consistent but the pathnames are not).
6193645Ssimon#
7193645Ssimon
8193645Ssimon# List of all the unqualified file names we expect.
9193645Ssimonmy %fips_tests = (
10193645Ssimon
11193645Ssimon# FIPS test definitions
12193645Ssimon
13193645Ssimon# DSA tests
14193645Ssimon
15193645Ssimon"PQGGen" => "fips_dssvs pqg",
16193645Ssimon"KeyPair" => "fips_dssvs keypair",
17193645Ssimon"SigGen" => "fips_dssvs siggen",
18193645Ssimon"SigVer" => "fips_dssvs sigver",
19193645Ssimon
20193645Ssimon# SHA tests
21193645Ssimon
22193645Ssimon"SHA1LongMsg" => "fips_shatest",
23193645Ssimon"SHA1Monte" => "fips_shatest",
24193645Ssimon"SHA1ShortMsg" => "fips_shatest",
25193645Ssimon"SHA224LongMsg" => "fips_shatest",
26193645Ssimon"SHA224Monte" => "fips_shatest",
27193645Ssimon"SHA224ShortMsg" => "fips_shatest",
28193645Ssimon"SHA256LongMsg" => "fips_shatest",
29193645Ssimon"SHA256Monte" => "fips_shatest",
30193645Ssimon"SHA256ShortMsg" => "fips_shatest",
31193645Ssimon"SHA384LongMsg" => "fips_shatest",
32193645Ssimon"SHA384Monte" => "fips_shatest",
33193645Ssimon"SHA384ShortMsg" => "fips_shatest",
34193645Ssimon"SHA512LongMsg" => "fips_shatest",
35193645Ssimon"SHA512Monte" => "fips_shatest",
36193645Ssimon"SHA512ShortMsg" => "fips_shatest",
37193645Ssimon
38193645Ssimon# HMAC
39193645Ssimon
40193645Ssimon"HMAC" => "fips_hmactest",
41193645Ssimon
42193645Ssimon# RAND tests
43193645Ssimon
44193645Ssimon"ANSI931_AES128MCT" => "fips_rngvs mct",
45193645Ssimon"ANSI931_AES192MCT" => "fips_rngvs mct",
46193645Ssimon"ANSI931_AES256MCT" => "fips_rngvs mct",
47193645Ssimon"ANSI931_AES128VST" => "fips_rngvs vst",
48193645Ssimon"ANSI931_AES192VST" => "fips_rngvs vst",
49193645Ssimon"ANSI931_AES256VST" => "fips_rngvs vst",
50193645Ssimon
51193645Ssimon# RSA tests
52193645Ssimon
53193645Ssimon"SigGen15" => "fips_rsastest",
54193645Ssimon"SigVer15" => "fips_rsavtest",
55193645Ssimon"SigGenPSS" => "fips_rsastest -saltlen SALT",
56193645Ssimon"SigVerPSS" => "fips_rsavtest -saltlen SALT",
57193645Ssimon"SigGenRSA" => "fips_rsastest -x931",
58193645Ssimon"SigVerRSA" => "fips_rsavtest -x931",
59193645Ssimon"KeyGenRSA" => "fips_rsagtest",
60193645Ssimon
61193645Ssimon# AES tests
62193645Ssimon
63193645Ssimon"CBCGFSbox128" => "fips_aesavs -f",
64193645Ssimon"CBCGFSbox192" => "fips_aesavs -f",
65193645Ssimon"CBCGFSbox256" => "fips_aesavs -f",
66193645Ssimon"CBCKeySbox128" => "fips_aesavs -f",
67193645Ssimon"CBCKeySbox192" => "fips_aesavs -f",
68193645Ssimon"CBCKeySbox256" => "fips_aesavs -f",
69193645Ssimon"CBCMCT128" => "fips_aesavs -f",
70193645Ssimon"CBCMCT192" => "fips_aesavs -f",
71193645Ssimon"CBCMCT256" => "fips_aesavs -f",
72193645Ssimon"CBCMMT128" => "fips_aesavs -f",
73193645Ssimon"CBCMMT192" => "fips_aesavs -f",
74193645Ssimon"CBCMMT256" => "fips_aesavs -f",
75193645Ssimon"CBCVarKey128" => "fips_aesavs -f",
76193645Ssimon"CBCVarKey192" => "fips_aesavs -f",
77193645Ssimon"CBCVarKey256" => "fips_aesavs -f",
78193645Ssimon"CBCVarTxt128" => "fips_aesavs -f",
79193645Ssimon"CBCVarTxt192" => "fips_aesavs -f",
80193645Ssimon"CBCVarTxt256" => "fips_aesavs -f",
81193645Ssimon"CFB128GFSbox128" => "fips_aesavs -f",
82193645Ssimon"CFB128GFSbox192" => "fips_aesavs -f",
83193645Ssimon"CFB128GFSbox256" => "fips_aesavs -f",
84193645Ssimon"CFB128KeySbox128" => "fips_aesavs -f",
85193645Ssimon"CFB128KeySbox192" => "fips_aesavs -f",
86193645Ssimon"CFB128KeySbox256" => "fips_aesavs -f",
87193645Ssimon"CFB128MCT128" => "fips_aesavs -f",
88193645Ssimon"CFB128MCT192" => "fips_aesavs -f",
89193645Ssimon"CFB128MCT256" => "fips_aesavs -f",
90193645Ssimon"CFB128MMT128" => "fips_aesavs -f",
91193645Ssimon"CFB128MMT192" => "fips_aesavs -f",
92193645Ssimon"CFB128MMT256" => "fips_aesavs -f",
93193645Ssimon"CFB128VarKey128" => "fips_aesavs -f",
94193645Ssimon"CFB128VarKey192" => "fips_aesavs -f",
95193645Ssimon"CFB128VarKey256" => "fips_aesavs -f",
96193645Ssimon"CFB128VarTxt128" => "fips_aesavs -f",
97193645Ssimon"CFB128VarTxt192" => "fips_aesavs -f",
98193645Ssimon"CFB128VarTxt256" => "fips_aesavs -f",
99193645Ssimon"CFB8GFSbox128" => "fips_aesavs -f",
100193645Ssimon"CFB8GFSbox192" => "fips_aesavs -f",
101193645Ssimon"CFB8GFSbox256" => "fips_aesavs -f",
102193645Ssimon"CFB8KeySbox128" => "fips_aesavs -f",
103193645Ssimon"CFB8KeySbox192" => "fips_aesavs -f",
104193645Ssimon"CFB8KeySbox256" => "fips_aesavs -f",
105193645Ssimon"CFB8MCT128" => "fips_aesavs -f",
106193645Ssimon"CFB8MCT192" => "fips_aesavs -f",
107193645Ssimon"CFB8MCT256" => "fips_aesavs -f",
108193645Ssimon"CFB8MMT128" => "fips_aesavs -f",
109193645Ssimon"CFB8MMT192" => "fips_aesavs -f",
110193645Ssimon"CFB8MMT256" => "fips_aesavs -f",
111193645Ssimon"CFB8VarKey128" => "fips_aesavs -f",
112193645Ssimon"CFB8VarKey192" => "fips_aesavs -f",
113193645Ssimon"CFB8VarKey256" => "fips_aesavs -f",
114193645Ssimon"CFB8VarTxt128" => "fips_aesavs -f",
115193645Ssimon"CFB8VarTxt192" => "fips_aesavs -f",
116193645Ssimon"CFB8VarTxt256" => "fips_aesavs -f",
117193645Ssimon#"CFB1GFSbox128" => "fips_aesavs -f",
118193645Ssimon#"CFB1GFSbox192" => "fips_aesavs -f",
119193645Ssimon#"CFB1GFSbox256" => "fips_aesavs -f",
120193645Ssimon#"CFB1KeySbox128" => "fips_aesavs -f",
121193645Ssimon#"CFB1KeySbox192" => "fips_aesavs -f",
122193645Ssimon#"CFB1KeySbox256" => "fips_aesavs -f",
123193645Ssimon#"CFB1MCT128" => "fips_aesavs -f",
124193645Ssimon#"CFB1MCT192" => "fips_aesavs -f",
125193645Ssimon#"CFB1MCT256" => "fips_aesavs -f",
126193645Ssimon#"CFB1MMT128" => "fips_aesavs -f",
127193645Ssimon#"CFB1MMT192" => "fips_aesavs -f",
128193645Ssimon#"CFB1MMT256" => "fips_aesavs -f",
129193645Ssimon#"CFB1VarKey128" => "fips_aesavs -f",
130193645Ssimon#"CFB1VarKey192" => "fips_aesavs -f",
131193645Ssimon#"CFB1VarKey256" => "fips_aesavs -f",
132193645Ssimon#"CFB1VarTxt128" => "fips_aesavs -f",
133193645Ssimon#"CFB1VarTxt192" => "fips_aesavs -f",
134193645Ssimon#"CFB1VarTxt256" => "fips_aesavs -f",
135193645Ssimon"ECBGFSbox128" => "fips_aesavs -f",
136193645Ssimon"ECBGFSbox192" => "fips_aesavs -f",
137193645Ssimon"ECBGFSbox256" => "fips_aesavs -f",
138193645Ssimon"ECBKeySbox128" => "fips_aesavs -f",
139193645Ssimon"ECBKeySbox192" => "fips_aesavs -f",
140193645Ssimon"ECBKeySbox256" => "fips_aesavs -f",
141193645Ssimon"ECBMCT128" => "fips_aesavs -f",
142193645Ssimon"ECBMCT192" => "fips_aesavs -f",
143193645Ssimon"ECBMCT256" => "fips_aesavs -f",
144193645Ssimon"ECBMMT128" => "fips_aesavs -f",
145193645Ssimon"ECBMMT192" => "fips_aesavs -f",
146193645Ssimon"ECBMMT256" => "fips_aesavs -f",
147193645Ssimon"ECBVarKey128" => "fips_aesavs -f",
148193645Ssimon"ECBVarKey192" => "fips_aesavs -f",
149193645Ssimon"ECBVarKey256" => "fips_aesavs -f",
150193645Ssimon"ECBVarTxt128" => "fips_aesavs -f",
151193645Ssimon"ECBVarTxt192" => "fips_aesavs -f",
152193645Ssimon"ECBVarTxt256" => "fips_aesavs -f",
153193645Ssimon"OFBGFSbox128" => "fips_aesavs -f",
154193645Ssimon"OFBGFSbox192" => "fips_aesavs -f",
155193645Ssimon"OFBGFSbox256" => "fips_aesavs -f",
156193645Ssimon"OFBKeySbox128" => "fips_aesavs -f",
157193645Ssimon"OFBKeySbox192" => "fips_aesavs -f",
158193645Ssimon"OFBKeySbox256" => "fips_aesavs -f",
159193645Ssimon"OFBMCT128" => "fips_aesavs -f",
160193645Ssimon"OFBMCT192" => "fips_aesavs -f",
161193645Ssimon"OFBMCT256" => "fips_aesavs -f",
162193645Ssimon"OFBMMT128" => "fips_aesavs -f",
163193645Ssimon"OFBMMT192" => "fips_aesavs -f",
164193645Ssimon"OFBMMT256" => "fips_aesavs -f",
165193645Ssimon"OFBVarKey128" => "fips_aesavs -f",
166193645Ssimon"OFBVarKey192" => "fips_aesavs -f",
167193645Ssimon"OFBVarKey256" => "fips_aesavs -f",
168193645Ssimon"OFBVarTxt128" => "fips_aesavs -f",
169193645Ssimon"OFBVarTxt192" => "fips_aesavs -f",
170193645Ssimon"OFBVarTxt256" => "fips_aesavs -f",
171193645Ssimon
172193645Ssimon# Triple DES tests
173193645Ssimon
174193645Ssimon"TCBCinvperm" => "fips_desmovs -f",
175193645Ssimon"TCBCMMT1" => "fips_desmovs -f",
176193645Ssimon"TCBCMMT2" => "fips_desmovs -f",
177193645Ssimon"TCBCMMT3" => "fips_desmovs -f",
178193645Ssimon"TCBCMonte1" => "fips_desmovs -f",
179193645Ssimon"TCBCMonte2" => "fips_desmovs -f",
180193645Ssimon"TCBCMonte3" => "fips_desmovs -f",
181193645Ssimon"TCBCpermop" => "fips_desmovs -f",
182193645Ssimon"TCBCsubtab" => "fips_desmovs -f",
183193645Ssimon"TCBCvarkey" => "fips_desmovs -f",
184193645Ssimon"TCBCvartext" => "fips_desmovs -f",
185193645Ssimon"TCFB64invperm" => "fips_desmovs -f",
186193645Ssimon"TCFB64MMT1" => "fips_desmovs -f",
187193645Ssimon"TCFB64MMT2" => "fips_desmovs -f",
188193645Ssimon"TCFB64MMT3" => "fips_desmovs -f",
189193645Ssimon"TCFB64Monte1" => "fips_desmovs -f",
190193645Ssimon"TCFB64Monte2" => "fips_desmovs -f",
191193645Ssimon"TCFB64Monte3" => "fips_desmovs -f",
192193645Ssimon"TCFB64permop" => "fips_desmovs -f",
193193645Ssimon"TCFB64subtab" => "fips_desmovs -f",
194193645Ssimon"TCFB64varkey" => "fips_desmovs -f",
195193645Ssimon"TCFB64vartext" => "fips_desmovs -f",
196193645Ssimon"TCFB8invperm" => "fips_desmovs -f",
197193645Ssimon"TCFB8MMT1" => "fips_desmovs -f",
198193645Ssimon"TCFB8MMT2" => "fips_desmovs -f",
199193645Ssimon"TCFB8MMT3" => "fips_desmovs -f",
200193645Ssimon"TCFB8Monte1" => "fips_desmovs -f",
201193645Ssimon"TCFB8Monte2" => "fips_desmovs -f",
202193645Ssimon"TCFB8Monte3" => "fips_desmovs -f",
203193645Ssimon"TCFB8permop" => "fips_desmovs -f",
204193645Ssimon"TCFB8subtab" => "fips_desmovs -f",
205193645Ssimon"TCFB8varkey" => "fips_desmovs -f",
206193645Ssimon"TCFB8vartext" => "fips_desmovs -f",
207193645Ssimon"TECBinvperm" => "fips_desmovs -f",
208193645Ssimon"TECBMMT1" => "fips_desmovs -f",
209193645Ssimon"TECBMMT2" => "fips_desmovs -f",
210193645Ssimon"TECBMMT3" => "fips_desmovs -f",
211193645Ssimon"TECBMonte1" => "fips_desmovs -f",
212193645Ssimon"TECBMonte2" => "fips_desmovs -f",
213193645Ssimon"TECBMonte3" => "fips_desmovs -f",
214193645Ssimon"TECBpermop" => "fips_desmovs -f",
215193645Ssimon"TECBsubtab" => "fips_desmovs -f",
216193645Ssimon"TECBvarkey" => "fips_desmovs -f",
217193645Ssimon"TECBvartext" => "fips_desmovs -f",
218193645Ssimon"TOFBinvperm" => "fips_desmovs -f",
219193645Ssimon"TOFBMMT1" => "fips_desmovs -f",
220193645Ssimon"TOFBMMT2" => "fips_desmovs -f",
221193645Ssimon"TOFBMMT3" => "fips_desmovs -f",
222193645Ssimon"TOFBMonte1" => "fips_desmovs -f",
223193645Ssimon"TOFBMonte2" => "fips_desmovs -f",
224193645Ssimon"TOFBMonte3" => "fips_desmovs -f",
225193645Ssimon"TOFBpermop" => "fips_desmovs -f",
226193645Ssimon"TOFBsubtab" => "fips_desmovs -f",
227193645Ssimon"TOFBvarkey" => "fips_desmovs -f",
228193645Ssimon"TOFBvartext" => "fips_desmovs -f",
229193645Ssimon"TCBCinvperm" => "fips_desmovs -f",
230193645Ssimon"TCBCMMT1" => "fips_desmovs -f",
231193645Ssimon"TCBCMMT2" => "fips_desmovs -f",
232193645Ssimon"TCBCMMT3" => "fips_desmovs -f",
233193645Ssimon"TCBCMonte1" => "fips_desmovs -f",
234193645Ssimon"TCBCMonte2" => "fips_desmovs -f",
235193645Ssimon"TCBCMonte3" => "fips_desmovs -f",
236193645Ssimon"TCBCpermop" => "fips_desmovs -f",
237193645Ssimon"TCBCsubtab" => "fips_desmovs -f",
238193645Ssimon"TCBCvarkey" => "fips_desmovs -f",
239193645Ssimon"TCBCvartext" => "fips_desmovs -f",
240193645Ssimon"TCFB64invperm" => "fips_desmovs -f",
241193645Ssimon"TCFB64MMT1" => "fips_desmovs -f",
242193645Ssimon"TCFB64MMT2" => "fips_desmovs -f",
243193645Ssimon"TCFB64MMT3" => "fips_desmovs -f",
244193645Ssimon"TCFB64Monte1" => "fips_desmovs -f",
245193645Ssimon"TCFB64Monte2" => "fips_desmovs -f",
246193645Ssimon"TCFB64Monte3" => "fips_desmovs -f",
247193645Ssimon"TCFB64permop" => "fips_desmovs -f",
248193645Ssimon"TCFB64subtab" => "fips_desmovs -f",
249193645Ssimon"TCFB64varkey" => "fips_desmovs -f",
250193645Ssimon"TCFB64vartext" => "fips_desmovs -f",
251193645Ssimon"TCFB8invperm" => "fips_desmovs -f",
252193645Ssimon"TCFB8MMT1" => "fips_desmovs -f",
253193645Ssimon"TCFB8MMT2" => "fips_desmovs -f",
254193645Ssimon"TCFB8MMT3" => "fips_desmovs -f",
255193645Ssimon"TCFB8Monte1" => "fips_desmovs -f",
256193645Ssimon"TCFB8Monte2" => "fips_desmovs -f",
257193645Ssimon"TCFB8Monte3" => "fips_desmovs -f",
258193645Ssimon"TCFB8permop" => "fips_desmovs -f",
259193645Ssimon"TCFB8subtab" => "fips_desmovs -f",
260193645Ssimon"TCFB8varkey" => "fips_desmovs -f",
261193645Ssimon"TCFB8vartext" => "fips_desmovs -f",
262193645Ssimon"TECBinvperm" => "fips_desmovs -f",
263193645Ssimon"TECBMMT1" => "fips_desmovs -f",
264193645Ssimon"TECBMMT2" => "fips_desmovs -f",
265193645Ssimon"TECBMMT3" => "fips_desmovs -f",
266193645Ssimon"TECBMonte1" => "fips_desmovs -f",
267193645Ssimon"TECBMonte2" => "fips_desmovs -f",
268193645Ssimon"TECBMonte3" => "fips_desmovs -f",
269193645Ssimon"TECBpermop" => "fips_desmovs -f",
270193645Ssimon"TECBsubtab" => "fips_desmovs -f",
271193645Ssimon"TECBvarkey" => "fips_desmovs -f",
272193645Ssimon"TECBvartext" => "fips_desmovs -f",
273193645Ssimon"TOFBinvperm" => "fips_desmovs -f",
274193645Ssimon"TOFBMMT1" => "fips_desmovs -f",
275193645Ssimon"TOFBMMT2" => "fips_desmovs -f",
276193645Ssimon"TOFBMMT3" => "fips_desmovs -f",
277193645Ssimon"TOFBMonte1" => "fips_desmovs -f",
278193645Ssimon"TOFBMonte2" => "fips_desmovs -f",
279193645Ssimon"TOFBMonte3" => "fips_desmovs -f",
280193645Ssimon"TOFBpermop" => "fips_desmovs -f",
281193645Ssimon"TOFBsubtab" => "fips_desmovs -f",
282193645Ssimon"TOFBvarkey" => "fips_desmovs -f",
283193645Ssimon"TOFBvartext" => "fips_desmovs -f"
284193645Ssimon
285193645Ssimon);
286193645Ssimonmy %salt_names = (
287193645Ssimon"SigVerPSS (salt 0)" => "SigVerPSS",
288193645Ssimon"SigVerPSS (salt 62)" => "SigVerPSS",
289193645Ssimon"SigGenPSS (salt 0)" => "SigGenPSS",
290193645Ssimon"SigGenPSS (salt 62)" => "SigGenPSS",
291193645Ssimon);
292193645Ssimon
293193645Ssimon
294193645Ssimonmy $win32 = $^O =~ m/mswin/i;
295193645Ssimonmy $onedir = 0;
296193645Ssimonmy $filter = "";
297193645Ssimonmy $tvdir;
298193645Ssimonmy $tprefix;
299193645Ssimonmy $shwrap_prefix;
300215697Ssimonmy $shwrap;
301215697Ssimonmy $rmcmd = "rm -rf";
302215697Ssimonmy $mkcmd = "mkdir";
303193645Ssimonmy $debug = 0;
304193645Ssimonmy $quiet = 0;
305193645Ssimonmy $rspdir = "rsp";
306193645Ssimonmy $rspignore = 0;
307193645Ssimonmy @bogus = ();			# list of unmatched *.rsp files
308193645Ssimonmy $bufout = '';
309215697Ssimonmy $bufdir = '';
310193645Ssimonmy %_programs = ();		# list of external programs to check
311193645Ssimon
312193645Ssimonforeach (@ARGV)
313193645Ssimon	{
314193645Ssimon	if ($_ eq "--win32")
315193645Ssimon		{
316193645Ssimon		$win32 = 1;
317193645Ssimon		}
318193645Ssimon	elsif ($_ eq "--onedir")
319193645Ssimon		{
320193645Ssimon		$onedir = 1;
321193645Ssimon		}
322193645Ssimon	elsif ($_ eq "--debug")
323193645Ssimon		{
324193645Ssimon		$debug = 1;
325193645Ssimon		}
326193645Ssimon	elsif ($_ eq "--quiet")
327193645Ssimon		{
328193645Ssimon		$quiet = 1;
329193645Ssimon		}
330193645Ssimon	elsif (/--dir=(.*)$/)
331193645Ssimon		{
332193645Ssimon		$tvdir = $1;
333193645Ssimon		}
334193645Ssimon	elsif (/--rspdir=(.*)$/)
335193645Ssimon		{
336193645Ssimon		$rspdir = $1;
337193645Ssimon		}
338215697Ssimon	elsif (/--noshwrap$/)
339215697Ssimon		{
340215697Ssimon		$shwrap = "";
341215697Ssimon		}
342193645Ssimon	elsif (/--rspignore$/)
343193645Ssimon		{
344193645Ssimon		$rspignore = 1;
345193645Ssimon		}
346193645Ssimon	elsif (/--tprefix=(.*)$/)
347193645Ssimon		{
348193645Ssimon		$tprefix = $1;
349193645Ssimon		}
350193645Ssimon	elsif (/--shwrap_prefix=(.*)$/)
351193645Ssimon		{
352193645Ssimon		$shwrap_prefix = $1;
353193645Ssimon		}
354193645Ssimon	elsif (/--filter=(.*)$/)
355193645Ssimon		{
356193645Ssimon		$filter = $1;
357193645Ssimon		}
358215697Ssimon	elsif (/--mkdir=(.*)$/)
359215697Ssimon		{
360215697Ssimon		$mkcmd = $1;
361215697Ssimon		}
362215697Ssimon	elsif (/--rm=(.*)$/)
363215697Ssimon		{
364215697Ssimon		$rmcmd = $1;
365215697Ssimon		}
366193645Ssimon	elsif (/--outfile=(.*)$/)
367193645Ssimon		{
368193645Ssimon		$outfile = $1;
369193645Ssimon		}
370193645Ssimon	else
371193645Ssimon		{
372193645Ssimon		&Help();
373193645Ssimon		exit(1);
374193645Ssimon		}
375193645Ssimon	}
376193645Ssimon
377193645Ssimon$tvdir = "." unless defined $tvdir;
378193645Ssimon
379193645Ssimonif ($win32)
380193645Ssimon	{
381193645Ssimon	if (!defined $tprefix)
382193645Ssimon		{
383193645Ssimon		if ($onedir)
384193645Ssimon			{
385193645Ssimon			$tprefix = ".\\";
386193645Ssimon			}
387193645Ssimon		else
388193645Ssimon			{
389193645Ssimon			$tprefix = "..\\out32dll\\";
390193645Ssimon			}
391193645Ssimon		}
392193645Ssimon
393193645Ssimon	$bufinit .= <<END;
394193645Ssimon\@echo off
395193645Ssimonrem Test vector run script
396193645Ssimonrem Auto generated by mkfipsscr.pl script
397193645Ssimonrem Do not edit
398193645Ssimon
399193645SsimonEND
400193645Ssimon
401193645Ssimon	}
402193645Ssimonelse
403193645Ssimon	{
404193645Ssimon	if ($onedir)
405193645Ssimon		{
406193645Ssimon		$tprefix = "./" unless defined $tprefix;
407193645Ssimon		$shwrap_prefix = "./" unless defined $shwrap_prefix;
408193645Ssimon		}
409193645Ssimon	else
410193645Ssimon		{
411193645Ssimon		$tprefix = "../test/" unless defined $tprefix;
412193645Ssimon		$shwrap_prefix = "../util/" unless defined $shwrap_prefix;
413193645Ssimon		}
414193645Ssimon
415215697Ssimon	$shwrap = "${shwrap_prefix}shlib_wrap.sh " unless defined $shwrap;
416215697Ssimon
417193645Ssimon	$bufinit .= <<END;
418193645Ssimon#!/bin/sh
419193645Ssimon
420193645Ssimon# Test vector run script
421193645Ssimon# Auto generated by mkfipsscr.pl script
422193645Ssimon# Do not edit
423193645Ssimon
424215697SsimonRM="$rmcmd"
425215697SsimonMKDIR="$mkcmd"
426215697SsimonTPREFIX=$tprefix
427193645SsimonEND
428193645Ssimon
429193645Ssimon	}
430193645Ssimonmy %fips_found;
431193645Ssimonforeach (keys %fips_tests)
432193645Ssimon	{
433193645Ssimon	$fips_found{$_} = 0;
434193645Ssimon	}
435193645Ssimonmy %saltPSS;
436193645Ssimonfor (keys %salt_names)
437193645Ssimon	{
438193645Ssimon	$salt_found{$_} = 0;
439193645Ssimon	}
440193645Ssimon
441193645Ssimonrecurse_test($win32, $tprefix, $filter, $tvdir);
442193645Ssimon
443193645Ssimonwhile (($key, $value) = each %salt_found)
444193645Ssimon	{
445193645Ssimon	&countentry($key, $value);
446193645Ssimon	delete $fips_found{$salt_names{$key}};
447193645Ssimon	}
448193645Ssimonwhile (($key, $value) = each %fips_found)
449193645Ssimon	{
450193645Ssimon	&countentry($key, $value);
451193645Ssimon	}
452193645Ssimon
453193645Ssimon# If no fatal errors write out the script file
454193645Ssimon	$outfile = "fipstests.sh" unless defined $outfile;
455193645Ssimon	open(OUT, ">$outfile") || die "Error opening $outfile: $!";
456193645Ssimon	print OUT $bufinit;
457193645Ssimon	if (!$rspignore && @bogus)
458193645Ssimon		{
459193645Ssimon		print STDERR "ERROR: please remove bogus *.rsp files\n";
460193645Ssimon		print OUT <<EOF;
461193645Ssimonecho $outfile generation failed due to presence of bogus *.rsp files
462193645SsimonEOF
463193645Ssimon		}
464193645Ssimon	else
465193645Ssimon		{
466193645Ssimon		print OUT $bufout;
467193645Ssimon		}
468193645Ssimon	close OUT;
469193645Ssimon
470193645Ssimon# Check for external programs
471193645Ssimon	for (keys %_programs)
472193645Ssimon		{
473193645Ssimon		s/ .*$//;
474193645Ssimon		-x $_ || print STDERR "WARNING: program $_ not found\n";
475193645Ssimon		}
476193645Ssimon
477193645Ssimon#--------------------------------
478193645Ssimonsub Help {
479193645Ssimon(my $cmd) = ($0 =~ m#([^/]+)$#);
480193645Ssimon	print <<EOF;
481193645Ssimon$cmd: generate script for CMVP algorithm tests
482193645Ssimon	--debug                     Enable debug output
483193645Ssimon	--dir=<dirname>             Optional root for *.req file search
484193645Ssimon	--filter=<regexp>
485193645Ssimon	--onedir <dirname>          Assume all components in current directory
486193645Ssimon	--outfile=<filename>        Optional name of output script, default fipstests.{sh|bat}
487193645Ssimon	--rspdir=<dirname>          Name of subdirectories containing *.rsp files, default "resp"
488193645Ssimon	--rspignore                 Ignore any bogus *.rsp files
489193645Ssimon	--shwrap_prefix=<prefix>
490193645Ssimon	--tprefix=<prefix>
491193645Ssimon	--quiet                     Shhh....
492193645Ssimon	--win32                     Generate script for Win32 environment
493193645SsimonEOF
494193645Ssimon}
495193645Ssimon
496193645Ssimon#--------------------------------
497193645Ssimonsub countentry {
498193645Ssimon	my ($key,$value) = @_;
499193645Ssimon	if ($value == 0)
500193645Ssimon		{
501193645Ssimon		print STDERR "WARNING: test file $key not found\n" unless $quiet;
502193645Ssimon		}
503193645Ssimon	elsif ($value > 1)
504193645Ssimon		{
505193645Ssimon		print STDERR "WARNING: test file $key found $value times\n" unless $quiet;
506193645Ssimon		}
507193645Ssimon	else
508193645Ssimon		{
509193645Ssimon		print STDERR "Found test file $key\n" if $debug;
510193645Ssimon		}
511193645Ssimon	}
512193645Ssimon
513193645Ssimon#--------------------------------
514193645Ssimonsub recurse_test
515193645Ssimon	{
516193645Ssimon	my ($win32, $tprefix, $filter, $dir) = @_;
517193645Ssimon	my $dirh;
518193645Ssimon	opendir($dirh, $dir);
519193645Ssimon	while ($_ = readdir($dirh))
520193645Ssimon		{
521193645Ssimon		next if ($_ eq "." || $_ eq "..");
522193645Ssimon		$_ = "$dir/$_";
523193645Ssimon		if (-f "$_")
524193645Ssimon			{
525193645Ssimon			if (/\/([^\/]*)\.rsp$/)
526193645Ssimon				{
527193645Ssimon				if (exists $fips_tests{$1})
528193645Ssimon					{
529193645Ssimon					$debug && print "DEBUG: $1 found, will be overwritten\n";
530193645Ssimon					}
531193645Ssimon				else
532193645Ssimon					{
533193645Ssimon					print STDERR "ERROR: bogus file $_\n";
534193645Ssimon					push @bogus, $_;
535193645Ssimon					}
536193645Ssimon				}
537193645Ssimon			next unless /$filter.*\.req$/i;
538193645Ssimon			if (/\/([^\/]*)\.req$/ && exists $fips_tests{$1})
539193645Ssimon				{
540193645Ssimon				$fips_found{$1}++;
541193645Ssimon				test_line($win32, $_, $tprefix, $1);
542193645Ssimon				}
543193645Ssimon			elsif (! /SHAmix\.req$/)
544193645Ssimon				{
545193645Ssimon				print STDERR "WARNING: unrecognized filename $_\n";
546193645Ssimon				}
547193645Ssimon			}
548193645Ssimon		elsif (-d "$_")
549193645Ssimon			{
550193645Ssimon			if (/$filter.*req$/i)
551193645Ssimon				{
552193645Ssimon				test_dir($win32, $_);
553193645Ssimon				}
554193645Ssimon			recurse_test($win32, $tprefix, $filter, $_);
555193645Ssimon			}
556193645Ssimon		}
557193645Ssimon	closedir($dirh);
558193645Ssimon	}
559193645Ssimon
560193645Ssimon#--------------------------------
561193645Ssimonsub test_dir
562193645Ssimon	{
563193645Ssimon	my ($win32, $req) = @_;
564193645Ssimon	my $rsp = $req;
565193645Ssimon	$rsp =~ s/req$/$rspdir/;
566193645Ssimon	if ($win32)
567193645Ssimon		{
568193645Ssimon		$rsp =~ tr|/|\\|;
569193645Ssimon		$req =~ tr|/|\\|;
570215697Ssimon		$bufdir = <<END;
571193645Ssimon
572193645Ssimonecho Running tests in $req
573193645Ssimonif exist "$rsp" rd /s /q "$rsp"
574193645Ssimonmd "$rsp"
575193645SsimonEND
576193645Ssimon		}
577193645Ssimon	else
578193645Ssimon		{
579215697Ssimon		$bufdir = <<END;
580193645Ssimon
581193645Ssimonecho Running tests in "$req"
582215697Ssimon\$RM "$rsp"
583215697Ssimon\$MKDIR "$rsp"
584193645Ssimon
585193645SsimonEND
586193645Ssimon		}
587193645Ssimon	}
588193645Ssimon
589193645Ssimon#--------------------------------
590193645Ssimonsub test_line
591193645Ssimon	{
592193645Ssimon	my ($win32, $req, $tprefix, $tnam) = @_;
593193645Ssimon	my $rsp = $req;
594193645Ssimon	my $tcmd = $fips_tests{$tnam};
595215697Ssimon
596215697Ssimon	$bufout .= $bufdir;
597215697Ssimon	$bufdir = "";
598215697Ssimon
599193645Ssimon	$rsp =~ s/req\/([^\/]*).req$/$rspdir\/$1.rsp/;
600193645Ssimon	if ($tcmd =~ /-f$/)
601193645Ssimon		{
602193645Ssimon		if ($win32)
603193645Ssimon			{
604193645Ssimon			$req =~ tr|/|\\|;
605193645Ssimon			$rsp =~ tr|/|\\|;
606193645Ssimon			$bufout .= "$tprefix$tcmd \"$req\" \"$rsp\"\n";
607193645Ssimon			$_programs{"$tprefix$tcmd.exe"} = 1;
608193645Ssimon			}
609193645Ssimon		else
610193645Ssimon			{
611193645Ssimon			$bufout .= <<END;
612215697Ssimon${shwrap}\${TPREFIX}$tcmd "$req" "$rsp" || { echo "$req failure" ; exit 1
613193645Ssimon}
614193645SsimonEND
615193645Ssimon			$_programs{"${shwrap_prefix}shlib_wrap.sh"} = 1;
616193645Ssimon			$_programs{"$tprefix$tcmd"} = 1;
617193645Ssimon			}
618193645Ssimon		return;
619193645Ssimon		}
620193645Ssimon	if ($tcmd =~ /SALT$/)
621193645Ssimon		{
622193645Ssimon		open (IN, $req) || die "Can't Open File $req";
623193645Ssimon		my $saltlen;
624193645Ssimon		while (<IN>)
625193645Ssimon			{
626193645Ssimon			if (/^\s*#\s*salt\s+len:\s+(\d+)\s*$/i)
627193645Ssimon				{
628193645Ssimon				my $sl = $1;
629193645Ssimon				print STDERR "$req salt length $sl\n" if $debug;
630193645Ssimon				$tcmd =~ s/SALT$/$sl/;
631193645Ssimon				$salt_found{"$tnam (salt $sl)"}++;
632193645Ssimon				last;
633193645Ssimon				}
634193645Ssimon			}
635193645Ssimon		close IN;
636193645Ssimon		if ($tcmd =~ /SALT$/)
637193645Ssimon			{
638193645Ssimon			die "Can't detect salt length for $req";
639193645Ssimon			}
640193645Ssimon		}
641193645Ssimon
642193645Ssimon	if ($win32)
643193645Ssimon		{
644193645Ssimon		$req =~ tr|/|\\|;
645193645Ssimon		$rsp =~ tr|/|\\|;
646193645Ssimon		$bufout .= "$tprefix$tcmd < \"$req\" > \"$rsp\"\n";
647193645Ssimon		$_programs{"$tprefix$tcmd.exe"} = 1;
648193645Ssimon		}
649193645Ssimon	else
650193645Ssimon		{
651193645Ssimon		$bufout .= <<END;
652215697Ssimon${shwrap}\${TPREFIX}$tcmd < "$req" > "$rsp" || { echo "$req failure" ; exit 1; }
653193645SsimonEND
654193645Ssimon		$_programs{"$tprefix$tcmd"} = 1;
655193645Ssimon		}
656193645Ssimon	}
657193645Ssimon
658