| #!/usr/local/bin/perl -w |
| # Quick & dirty utility to generate a script for executing the |
| # FIPS 140-2 CMVP algorithm tests based on the pathnames of |
| # input algorithm test files actually present (the unqualified |
| # file names are consistent but the pathnames are not). |
| # |
| |
| # List of all the unqualified file names we expect. |
| my %fips_tests = ( |
| |
| # FIPS test definitions |
| |
| # DSA tests |
| |
| "PQGGen" => "fips_dssvs pqg", |
| "KeyPair" => "fips_dssvs keypair", |
| "SigGen" => "fips_dssvs siggen", |
| "SigVer" => "fips_dssvs sigver", |
| |
| # SHA tests |
| |
| "SHA1LongMsg" => "fips_shatest", |
| "SHA1Monte" => "fips_shatest", |
| "SHA1ShortMsg" => "fips_shatest", |
| "SHA224LongMsg" => "fips_shatest", |
| "SHA224Monte" => "fips_shatest", |
| "SHA224ShortMsg" => "fips_shatest", |
| "SHA256LongMsg" => "fips_shatest", |
| "SHA256Monte" => "fips_shatest", |
| "SHA256ShortMsg" => "fips_shatest", |
| "SHA384LongMsg" => "fips_shatest", |
| "SHA384Monte" => "fips_shatest", |
| "SHA384ShortMsg" => "fips_shatest", |
| "SHA512LongMsg" => "fips_shatest", |
| "SHA512Monte" => "fips_shatest", |
| "SHA512ShortMsg" => "fips_shatest", |
| |
| # HMAC |
| |
| "HMAC" => "fips_hmactest", |
| |
| # RAND tests |
| |
| "ANSI931_AES128MCT" => "fips_rngvs mct", |
| "ANSI931_AES192MCT" => "fips_rngvs mct", |
| "ANSI931_AES256MCT" => "fips_rngvs mct", |
| "ANSI931_AES128VST" => "fips_rngvs vst", |
| "ANSI931_AES192VST" => "fips_rngvs vst", |
| "ANSI931_AES256VST" => "fips_rngvs vst", |
| |
| # RSA tests |
| |
| "SigGen15" => "fips_rsastest", |
| "SigVer15" => "fips_rsavtest", |
| "SigGenPSS" => "fips_rsastest -saltlen SALT", |
| "SigVerPSS" => "fips_rsavtest -saltlen SALT", |
| "SigGenRSA" => "fips_rsastest -x931", |
| "SigVerRSA" => "fips_rsavtest -x931", |
| "KeyGenRSA" => "fips_rsagtest", |
| |
| # AES tests |
| |
| "CBCGFSbox128" => "fips_aesavs -f", |
| "CBCGFSbox192" => "fips_aesavs -f", |
| "CBCGFSbox256" => "fips_aesavs -f", |
| "CBCKeySbox128" => "fips_aesavs -f", |
| "CBCKeySbox192" => "fips_aesavs -f", |
| "CBCKeySbox256" => "fips_aesavs -f", |
| "CBCMCT128" => "fips_aesavs -f", |
| "CBCMCT192" => "fips_aesavs -f", |
| "CBCMCT256" => "fips_aesavs -f", |
| "CBCMMT128" => "fips_aesavs -f", |
| "CBCMMT192" => "fips_aesavs -f", |
| "CBCMMT256" => "fips_aesavs -f", |
| "CBCVarKey128" => "fips_aesavs -f", |
| "CBCVarKey192" => "fips_aesavs -f", |
| "CBCVarKey256" => "fips_aesavs -f", |
| "CBCVarTxt128" => "fips_aesavs -f", |
| "CBCVarTxt192" => "fips_aesavs -f", |
| "CBCVarTxt256" => "fips_aesavs -f", |
| "CFB128GFSbox128" => "fips_aesavs -f", |
| "CFB128GFSbox192" => "fips_aesavs -f", |
| "CFB128GFSbox256" => "fips_aesavs -f", |
| "CFB128KeySbox128" => "fips_aesavs -f", |
| "CFB128KeySbox192" => "fips_aesavs -f", |
| "CFB128KeySbox256" => "fips_aesavs -f", |
| "CFB128MCT128" => "fips_aesavs -f", |
| "CFB128MCT192" => "fips_aesavs -f", |
| "CFB128MCT256" => "fips_aesavs -f", |
| "CFB128MMT128" => "fips_aesavs -f", |
| "CFB128MMT192" => "fips_aesavs -f", |
| "CFB128MMT256" => "fips_aesavs -f", |
| "CFB128VarKey128" => "fips_aesavs -f", |
| "CFB128VarKey192" => "fips_aesavs -f", |
| "CFB128VarKey256" => "fips_aesavs -f", |
| "CFB128VarTxt128" => "fips_aesavs -f", |
| "CFB128VarTxt192" => "fips_aesavs -f", |
| "CFB128VarTxt256" => "fips_aesavs -f", |
| "CFB8GFSbox128" => "fips_aesavs -f", |
| "CFB8GFSbox192" => "fips_aesavs -f", |
| "CFB8GFSbox256" => "fips_aesavs -f", |
| "CFB8KeySbox128" => "fips_aesavs -f", |
| "CFB8KeySbox192" => "fips_aesavs -f", |
| "CFB8KeySbox256" => "fips_aesavs -f", |
| "CFB8MCT128" => "fips_aesavs -f", |
| "CFB8MCT192" => "fips_aesavs -f", |
| "CFB8MCT256" => "fips_aesavs -f", |
| "CFB8MMT128" => "fips_aesavs -f", |
| "CFB8MMT192" => "fips_aesavs -f", |
| "CFB8MMT256" => "fips_aesavs -f", |
| "CFB8VarKey128" => "fips_aesavs -f", |
| "CFB8VarKey192" => "fips_aesavs -f", |
| "CFB8VarKey256" => "fips_aesavs -f", |
| "CFB8VarTxt128" => "fips_aesavs -f", |
| "CFB8VarTxt192" => "fips_aesavs -f", |
| "CFB8VarTxt256" => "fips_aesavs -f", |
| #"CFB1GFSbox128" => "fips_aesavs -f", |
| #"CFB1GFSbox192" => "fips_aesavs -f", |
| #"CFB1GFSbox256" => "fips_aesavs -f", |
| #"CFB1KeySbox128" => "fips_aesavs -f", |
| #"CFB1KeySbox192" => "fips_aesavs -f", |
| #"CFB1KeySbox256" => "fips_aesavs -f", |
| #"CFB1MCT128" => "fips_aesavs -f", |
| #"CFB1MCT192" => "fips_aesavs -f", |
| #"CFB1MCT256" => "fips_aesavs -f", |
| #"CFB1MMT128" => "fips_aesavs -f", |
| #"CFB1MMT192" => "fips_aesavs -f", |
| #"CFB1MMT256" => "fips_aesavs -f", |
| #"CFB1VarKey128" => "fips_aesavs -f", |
| #"CFB1VarKey192" => "fips_aesavs -f", |
| #"CFB1VarKey256" => "fips_aesavs -f", |
| #"CFB1VarTxt128" => "fips_aesavs -f", |
| #"CFB1VarTxt192" => "fips_aesavs -f", |
| #"CFB1VarTxt256" => "fips_aesavs -f", |
| "ECBGFSbox128" => "fips_aesavs -f", |
| "ECBGFSbox192" => "fips_aesavs -f", |
| "ECBGFSbox256" => "fips_aesavs -f", |
| "ECBKeySbox128" => "fips_aesavs -f", |
| "ECBKeySbox192" => "fips_aesavs -f", |
| "ECBKeySbox256" => "fips_aesavs -f", |
| "ECBMCT128" => "fips_aesavs -f", |
| "ECBMCT192" => "fips_aesavs -f", |
| "ECBMCT256" => "fips_aesavs -f", |
| "ECBMMT128" => "fips_aesavs -f", |
| "ECBMMT192" => "fips_aesavs -f", |
| "ECBMMT256" => "fips_aesavs -f", |
| "ECBVarKey128" => "fips_aesavs -f", |
| "ECBVarKey192" => "fips_aesavs -f", |
| "ECBVarKey256" => "fips_aesavs -f", |
| "ECBVarTxt128" => "fips_aesavs -f", |
| "ECBVarTxt192" => "fips_aesavs -f", |
| "ECBVarTxt256" => "fips_aesavs -f", |
| "OFBGFSbox128" => "fips_aesavs -f", |
| "OFBGFSbox192" => "fips_aesavs -f", |
| "OFBGFSbox256" => "fips_aesavs -f", |
| "OFBKeySbox128" => "fips_aesavs -f", |
| "OFBKeySbox192" => "fips_aesavs -f", |
| "OFBKeySbox256" => "fips_aesavs -f", |
| "OFBMCT128" => "fips_aesavs -f", |
| "OFBMCT192" => "fips_aesavs -f", |
| "OFBMCT256" => "fips_aesavs -f", |
| "OFBMMT128" => "fips_aesavs -f", |
| "OFBMMT192" => "fips_aesavs -f", |
| "OFBMMT256" => "fips_aesavs -f", |
| "OFBVarKey128" => "fips_aesavs -f", |
| "OFBVarKey192" => "fips_aesavs -f", |
| "OFBVarKey256" => "fips_aesavs -f", |
| "OFBVarTxt128" => "fips_aesavs -f", |
| "OFBVarTxt192" => "fips_aesavs -f", |
| "OFBVarTxt256" => "fips_aesavs -f", |
| |
| # Triple DES tests |
| |
| "TCBCinvperm" => "fips_desmovs -f", |
| "TCBCMMT1" => "fips_desmovs -f", |
| "TCBCMMT2" => "fips_desmovs -f", |
| "TCBCMMT3" => "fips_desmovs -f", |
| "TCBCMonte1" => "fips_desmovs -f", |
| "TCBCMonte2" => "fips_desmovs -f", |
| "TCBCMonte3" => "fips_desmovs -f", |
| "TCBCpermop" => "fips_desmovs -f", |
| "TCBCsubtab" => "fips_desmovs -f", |
| "TCBCvarkey" => "fips_desmovs -f", |
| "TCBCvartext" => "fips_desmovs -f", |
| "TCFB64invperm" => "fips_desmovs -f", |
| "TCFB64MMT1" => "fips_desmovs -f", |
| "TCFB64MMT2" => "fips_desmovs -f", |
| "TCFB64MMT3" => "fips_desmovs -f", |
| "TCFB64Monte1" => "fips_desmovs -f", |
| "TCFB64Monte2" => "fips_desmovs -f", |
| "TCFB64Monte3" => "fips_desmovs -f", |
| "TCFB64permop" => "fips_desmovs -f", |
| "TCFB64subtab" => "fips_desmovs -f", |
| "TCFB64varkey" => "fips_desmovs -f", |
| "TCFB64vartext" => "fips_desmovs -f", |
| "TCFB8invperm" => "fips_desmovs -f", |
| "TCFB8MMT1" => "fips_desmovs -f", |
| "TCFB8MMT2" => "fips_desmovs -f", |
| "TCFB8MMT3" => "fips_desmovs -f", |
| "TCFB8Monte1" => "fips_desmovs -f", |
| "TCFB8Monte2" => "fips_desmovs -f", |
| "TCFB8Monte3" => "fips_desmovs -f", |
| "TCFB8permop" => "fips_desmovs -f", |
| "TCFB8subtab" => "fips_desmovs -f", |
| "TCFB8varkey" => "fips_desmovs -f", |
| "TCFB8vartext" => "fips_desmovs -f", |
| "TECBinvperm" => "fips_desmovs -f", |
| "TECBMMT1" => "fips_desmovs -f", |
| "TECBMMT2" => "fips_desmovs -f", |
| "TECBMMT3" => "fips_desmovs -f", |
| "TECBMonte1" => "fips_desmovs -f", |
| "TECBMonte2" => "fips_desmovs -f", |
| "TECBMonte3" => "fips_desmovs -f", |
| "TECBpermop" => "fips_desmovs -f", |
| "TECBsubtab" => "fips_desmovs -f", |
| "TECBvarkey" => "fips_desmovs -f", |
| "TECBvartext" => "fips_desmovs -f", |
| "TOFBinvperm" => "fips_desmovs -f", |
| "TOFBMMT1" => "fips_desmovs -f", |
| "TOFBMMT2" => "fips_desmovs -f", |
| "TOFBMMT3" => "fips_desmovs -f", |
| "TOFBMonte1" => "fips_desmovs -f", |
| "TOFBMonte2" => "fips_desmovs -f", |
| "TOFBMonte3" => "fips_desmovs -f", |
| "TOFBpermop" => "fips_desmovs -f", |
| "TOFBsubtab" => "fips_desmovs -f", |
| "TOFBvarkey" => "fips_desmovs -f", |
| "TOFBvartext" => "fips_desmovs -f", |
| "TCBCinvperm" => "fips_desmovs -f", |
| "TCBCMMT1" => "fips_desmovs -f", |
| "TCBCMMT2" => "fips_desmovs -f", |
| "TCBCMMT3" => "fips_desmovs -f", |
| "TCBCMonte1" => "fips_desmovs -f", |
| "TCBCMonte2" => "fips_desmovs -f", |
| "TCBCMonte3" => "fips_desmovs -f", |
| "TCBCpermop" => "fips_desmovs -f", |
| "TCBCsubtab" => "fips_desmovs -f", |
| "TCBCvarkey" => "fips_desmovs -f", |
| "TCBCvartext" => "fips_desmovs -f", |
| "TCFB64invperm" => "fips_desmovs -f", |
| "TCFB64MMT1" => "fips_desmovs -f", |
| "TCFB64MMT2" => "fips_desmovs -f", |
| "TCFB64MMT3" => "fips_desmovs -f", |
| "TCFB64Monte1" => "fips_desmovs -f", |
| "TCFB64Monte2" => "fips_desmovs -f", |
| "TCFB64Monte3" => "fips_desmovs -f", |
| "TCFB64permop" => "fips_desmovs -f", |
| "TCFB64subtab" => "fips_desmovs -f", |
| "TCFB64varkey" => "fips_desmovs -f", |
| "TCFB64vartext" => "fips_desmovs -f", |
| "TCFB8invperm" => "fips_desmovs -f", |
| "TCFB8MMT1" => "fips_desmovs -f", |
| "TCFB8MMT2" => "fips_desmovs -f", |
| "TCFB8MMT3" => "fips_desmovs -f", |
| "TCFB8Monte1" => "fips_desmovs -f", |
| "TCFB8Monte2" => "fips_desmovs -f", |
| "TCFB8Monte3" => "fips_desmovs -f", |
| "TCFB8permop" => "fips_desmovs -f", |
| "TCFB8subtab" => "fips_desmovs -f", |
| "TCFB8varkey" => "fips_desmovs -f", |
| "TCFB8vartext" => "fips_desmovs -f", |
| "TECBinvperm" => "fips_desmovs -f", |
| "TECBMMT1" => "fips_desmovs -f", |
| "TECBMMT2" => "fips_desmovs -f", |
| "TECBMMT3" => "fips_desmovs -f", |
| "TECBMonte1" => "fips_desmovs -f", |
| "TECBMonte2" => "fips_desmovs -f", |
| "TECBMonte3" => "fips_desmovs -f", |
| "TECBpermop" => "fips_desmovs -f", |
| "TECBsubtab" => "fips_desmovs -f", |
| "TECBvarkey" => "fips_desmovs -f", |
| "TECBvartext" => "fips_desmovs -f", |
| "TOFBinvperm" => "fips_desmovs -f", |
| "TOFBMMT1" => "fips_desmovs -f", |
| "TOFBMMT2" => "fips_desmovs -f", |
| "TOFBMMT3" => "fips_desmovs -f", |
| "TOFBMonte1" => "fips_desmovs -f", |
| "TOFBMonte2" => "fips_desmovs -f", |
| "TOFBMonte3" => "fips_desmovs -f", |
| "TOFBpermop" => "fips_desmovs -f", |
| "TOFBsubtab" => "fips_desmovs -f", |
| "TOFBvarkey" => "fips_desmovs -f", |
| "TOFBvartext" => "fips_desmovs -f" |
| |
| ); |
| my %salt_names = ( |
| "SigVerPSS (salt 0)" => "SigVerPSS", |
| "SigVerPSS (salt 62)" => "SigVerPSS", |
| "SigGenPSS (salt 0)" => "SigGenPSS", |
| "SigGenPSS (salt 62)" => "SigGenPSS", |
| ); |
| |
| |
| my $win32 = $^O =~ m/mswin/i; |
| my $onedir = 0; |
| my $filter = ""; |
| my $tvdir; |
| my $tprefix; |
| my $shwrap_prefix; |
| my $debug = 0; |
| my $quiet = 0; |
| my $rspdir = "rsp"; |
| my $rspignore = 0; |
| my @bogus = (); # list of unmatched *.rsp files |
| my $bufout = ''; |
| my %_programs = (); # list of external programs to check |
| |
| foreach (@ARGV) |
| { |
| if ($_ eq "--win32") |
| { |
| $win32 = 1; |
| } |
| elsif ($_ eq "--onedir") |
| { |
| $onedir = 1; |
| } |
| elsif ($_ eq "--debug") |
| { |
| $debug = 1; |
| } |
| elsif ($_ eq "--quiet") |
| { |
| $quiet = 1; |
| } |
| elsif (/--dir=(.*)$/) |
| { |
| $tvdir = $1; |
| } |
| elsif (/--rspdir=(.*)$/) |
| { |
| $rspdir = $1; |
| } |
| elsif (/--rspignore$/) |
| { |
| $rspignore = 1; |
| } |
| elsif (/--tprefix=(.*)$/) |
| { |
| $tprefix = $1; |
| } |
| elsif (/--shwrap_prefix=(.*)$/) |
| { |
| $shwrap_prefix = $1; |
| } |
| elsif (/--filter=(.*)$/) |
| { |
| $filter = $1; |
| } |
| elsif (/--outfile=(.*)$/) |
| { |
| $outfile = $1; |
| } |
| else |
| { |
| &Help(); |
| exit(1); |
| } |
| } |
| |
| $tvdir = "." unless defined $tvdir; |
| |
| if ($win32) |
| { |
| if (!defined $tprefix) |
| { |
| if ($onedir) |
| { |
| $tprefix = ".\\"; |
| } |
| else |
| { |
| $tprefix = "..\\out32dll\\"; |
| } |
| } |
| |
| $bufinit .= <<END; |
| \@echo off |
| rem Test vector run script |
| rem Auto generated by mkfipsscr.pl script |
| rem Do not edit |
| |
| END |
| |
| } |
| else |
| { |
| if ($onedir) |
| { |
| $tprefix = "./" unless defined $tprefix; |
| $shwrap_prefix = "./" unless defined $shwrap_prefix; |
| } |
| else |
| { |
| $tprefix = "../test/" unless defined $tprefix; |
| $shwrap_prefix = "../util/" unless defined $shwrap_prefix; |
| } |
| |
| $bufinit .= <<END; |
| #!/bin/sh |
| |
| # Test vector run script |
| # Auto generated by mkfipsscr.pl script |
| # Do not edit |
| |
| END |
| |
| } |
| my %fips_found; |
| foreach (keys %fips_tests) |
| { |
| $fips_found{$_} = 0; |
| } |
| my %saltPSS; |
| for (keys %salt_names) |
| { |
| $salt_found{$_} = 0; |
| } |
| |
| recurse_test($win32, $tprefix, $filter, $tvdir); |
| |
| while (($key, $value) = each %salt_found) |
| { |
| &countentry($key, $value); |
| delete $fips_found{$salt_names{$key}}; |
| } |
| while (($key, $value) = each %fips_found) |
| { |
| &countentry($key, $value); |
| } |
| |
| # If no fatal errors write out the script file |
| $outfile = "fipstests.sh" unless defined $outfile; |
| open(OUT, ">$outfile") || die "Error opening $outfile: $!"; |
| print OUT $bufinit; |
| if (!$rspignore && @bogus) |
| { |
| print STDERR "ERROR: please remove bogus *.rsp files\n"; |
| print OUT <<EOF; |
| echo $outfile generation failed due to presence of bogus *.rsp files |
| EOF |
| } |
| else |
| { |
| print OUT $bufout; |
| } |
| close OUT; |
| |
| # Check for external programs |
| for (keys %_programs) |
| { |
| s/ .*$//; |
| -x $_ || print STDERR "WARNING: program $_ not found\n"; |
| } |
| |
| #-------------------------------- |
| sub Help { |
| (my $cmd) = ($0 =~ m#([^/]+)$#); |
| print <<EOF; |
| $cmd: generate script for CMVP algorithm tests |
| --debug Enable debug output |
| --dir=<dirname> Optional root for *.req file search |
| --filter=<regexp> |
| --onedir <dirname> Assume all components in current directory |
| --outfile=<filename> Optional name of output script, default fipstests.{sh|bat} |
| --rspdir=<dirname> Name of subdirectories containing *.rsp files, default "resp" |
| --rspignore Ignore any bogus *.rsp files |
| --shwrap_prefix=<prefix> |
| --tprefix=<prefix> |
| --quiet Shhh.... |
| --win32 Generate script for Win32 environment |
| EOF |
| } |
| |
| #-------------------------------- |
| sub countentry { |
| my ($key,$value) = @_; |
| if ($value == 0) |
| { |
| print STDERR "WARNING: test file $key not found\n" unless $quiet; |
| } |
| elsif ($value > 1) |
| { |
| print STDERR "WARNING: test file $key found $value times\n" unless $quiet; |
| } |
| else |
| { |
| print STDERR "Found test file $key\n" if $debug; |
| } |
| } |
| |
| #-------------------------------- |
| sub recurse_test |
| { |
| my ($win32, $tprefix, $filter, $dir) = @_; |
| my $dirh; |
| opendir($dirh, $dir); |
| while ($_ = readdir($dirh)) |
| { |
| next if ($_ eq "." || $_ eq ".."); |
| $_ = "$dir/$_"; |
| if (-f "$_") |
| { |
| if (/\/([^\/]*)\.rsp$/) |
| { |
| if (exists $fips_tests{$1}) |
| { |
| $debug && print "DEBUG: $1 found, will be overwritten\n"; |
| } |
| else |
| { |
| print STDERR "ERROR: bogus file $_\n"; |
| push @bogus, $_; |
| } |
| } |
| next unless /$filter.*\.req$/i; |
| if (/\/([^\/]*)\.req$/ && exists $fips_tests{$1}) |
| { |
| $fips_found{$1}++; |
| test_line($win32, $_, $tprefix, $1); |
| } |
| elsif (! /SHAmix\.req$/) |
| { |
| print STDERR "WARNING: unrecognized filename $_\n"; |
| } |
| } |
| elsif (-d "$_") |
| { |
| if (/$filter.*req$/i) |
| { |
| test_dir($win32, $_); |
| } |
| recurse_test($win32, $tprefix, $filter, $_); |
| } |
| } |
| closedir($dirh); |
| } |
| |
| #-------------------------------- |
| sub test_dir |
| { |
| my ($win32, $req) = @_; |
| my $rsp = $req; |
| $rsp =~ s/req$/$rspdir/; |
| if ($win32) |
| { |
| $rsp =~ tr|/|\\|; |
| $req =~ tr|/|\\|; |
| $bufout .= <<END; |
| |
| echo Running tests in $req |
| if exist "$rsp" rd /s /q "$rsp" |
| md "$rsp" |
| END |
| } |
| else |
| { |
| $bufout .= <<END; |
| |
| echo Running tests in "$req" |
| rm -rf "$rsp" |
| mkdir "$rsp" |
| |
| END |
| } |
| } |
| |
| #-------------------------------- |
| sub test_line |
| { |
| my ($win32, $req, $tprefix, $tnam) = @_; |
| my $rsp = $req; |
| my $tcmd = $fips_tests{$tnam}; |
| $rsp =~ s/req\/([^\/]*).req$/$rspdir\/$1.rsp/; |
| if ($tcmd =~ /-f$/) |
| { |
| if ($win32) |
| { |
| $req =~ tr|/|\\|; |
| $rsp =~ tr|/|\\|; |
| $bufout .= "$tprefix$tcmd \"$req\" \"$rsp\"\n"; |
| $_programs{"$tprefix$tcmd.exe"} = 1; |
| } |
| else |
| { |
| $bufout .= <<END; |
| ${shwrap_prefix}shlib_wrap.sh $tprefix$tcmd "$req" "$rsp" || { echo "$req failure" ; exit 1 |
| } |
| END |
| $_programs{"${shwrap_prefix}shlib_wrap.sh"} = 1; |
| $_programs{"$tprefix$tcmd"} = 1; |
| } |
| return; |
| } |
| if ($tcmd =~ /SALT$/) |
| { |
| open (IN, $req) || die "Can't Open File $req"; |
| my $saltlen; |
| while (<IN>) |
| { |
| if (/^\s*#\s*salt\s+len:\s+(\d+)\s*$/i) |
| { |
| my $sl = $1; |
| print STDERR "$req salt length $sl\n" if $debug; |
| $tcmd =~ s/SALT$/$sl/; |
| $salt_found{"$tnam (salt $sl)"}++; |
| last; |
| } |
| } |
| close IN; |
| if ($tcmd =~ /SALT$/) |
| { |
| die "Can't detect salt length for $req"; |
| } |
| } |
| |
| if ($win32) |
| { |
| $req =~ tr|/|\\|; |
| $rsp =~ tr|/|\\|; |
| $bufout .= "$tprefix$tcmd < \"$req\" > \"$rsp\"\n"; |
| $_programs{"$tprefix$tcmd.exe"} = 1; |
| } |
| else |
| { |
| $bufout .= <<END; |
| ${shwrap_prefix}shlib_wrap.sh $tprefix$tcmd < "$req" > "$rsp" || { echo "$req failure" ; exit 1; } |
| END |
| $_programs{"$tprefix$tcmd"} = 1; |
| } |
| } |
| |