| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 #!/usr/bin/perl -w |  | 
| 2 # Perl utility to run or verify FIPS 140-2 CMVP algorithm tests based on the |  | 
| 3 # pathnames of input algorithm test files actually present (the unqualified |  | 
| 4 # file names are consistent but the pathnames are not). |  | 
| 5 # |  | 
| 6 |  | 
| 7 # FIPS test definitions |  | 
| 8 # List of all the unqualified file names we expect and command lines to run |  | 
| 9 |  | 
| 10 # DSA tests |  | 
| 11 my @fips_dsa_test_list = ( |  | 
| 12 |  | 
| 13     "DSA", |  | 
| 14 |  | 
| 15     [ "PQGGen",  "fips_dssvs pqg" ], |  | 
| 16     [ "KeyPair", "fips_dssvs keypair" ], |  | 
| 17     [ "SigGen",  "fips_dssvs siggen" ], |  | 
| 18     [ "SigVer",  "fips_dssvs sigver" ] |  | 
| 19 |  | 
| 20 ); |  | 
| 21 |  | 
| 22 my @fips_dsa_pqgver_test_list = ( |  | 
| 23 |  | 
| 24     [ "PQGVer",  "fips_dssvs pqgver" ] |  | 
| 25 |  | 
| 26 ); |  | 
| 27 |  | 
| 28 # RSA tests |  | 
| 29 |  | 
| 30 my @fips_rsa_test_list = ( |  | 
| 31 |  | 
| 32     "RSA", |  | 
| 33 |  | 
| 34     [ "SigGen15",  "fips_rsastest" ], |  | 
| 35     [ "SigVer15",  "fips_rsavtest" ], |  | 
| 36     [ "SigVerRSA", "fips_rsavtest -x931" ], |  | 
| 37     [ "KeyGenRSA", "fips_rsagtest" ], |  | 
| 38     [ "SigGenRSA", "fips_rsastest -x931" ] |  | 
| 39 |  | 
| 40 ); |  | 
| 41 |  | 
| 42 # Special cases for PSS. The filename itself is |  | 
| 43 # not sufficient to determine the test. Addditionally we |  | 
| 44 # need to examine the file contents to determine the salt length |  | 
| 45 # In these cases the test filename has (saltlen) appended. |  | 
| 46 |  | 
| 47 # RSA PSS salt length 0 tests |  | 
| 48 |  | 
| 49 my @fips_rsa_pss0_test_list = ( |  | 
| 50 |  | 
| 51     [ "SigGenPSS(0)", "fips_rsastest -saltlen 0" ], |  | 
| 52     [ "SigVerPSS(0)", "fips_rsavtest -saltlen 0" ] |  | 
| 53 |  | 
| 54 ); |  | 
| 55 |  | 
| 56 # RSA PSS salt length 62 tests |  | 
| 57 |  | 
| 58 my @fips_rsa_pss62_test_list = ( |  | 
| 59     [ "SigGenPSS(62)", "fips_rsastest -saltlen 62" ], |  | 
| 60     [ "SigVerPSS(62)", "fips_rsavtest -saltlen 62" ] |  | 
| 61 |  | 
| 62 ); |  | 
| 63 |  | 
| 64 # SHA tests |  | 
| 65 |  | 
| 66 my @fips_sha_test_list = ( |  | 
| 67 |  | 
| 68     "SHA", |  | 
| 69 |  | 
| 70     [ "SHA1LongMsg",    "fips_shatest" ], |  | 
| 71     [ "SHA1Monte",      "fips_shatest" ], |  | 
| 72     [ "SHA1ShortMsg",   "fips_shatest" ], |  | 
| 73     [ "SHA224LongMsg",  "fips_shatest" ], |  | 
| 74     [ "SHA224Monte",    "fips_shatest" ], |  | 
| 75     [ "SHA224ShortMsg", "fips_shatest" ], |  | 
| 76     [ "SHA256LongMsg",  "fips_shatest" ], |  | 
| 77     [ "SHA256Monte",    "fips_shatest" ], |  | 
| 78     [ "SHA256ShortMsg", "fips_shatest" ], |  | 
| 79     [ "SHA384LongMsg",  "fips_shatest" ], |  | 
| 80     [ "SHA384Monte",    "fips_shatest" ], |  | 
| 81     [ "SHA384ShortMsg", "fips_shatest" ], |  | 
| 82     [ "SHA512LongMsg",  "fips_shatest" ], |  | 
| 83     [ "SHA512Monte",    "fips_shatest" ], |  | 
| 84     [ "SHA512ShortMsg", "fips_shatest" ] |  | 
| 85 |  | 
| 86 ); |  | 
| 87 |  | 
| 88 # HMAC |  | 
| 89 |  | 
| 90 my @fips_hmac_test_list = ( |  | 
| 91 |  | 
| 92     "HMAC", |  | 
| 93 |  | 
| 94     [ "HMAC", "fips_hmactest" ] |  | 
| 95 |  | 
| 96 ); |  | 
| 97 |  | 
| 98 # RAND tests, AES version |  | 
| 99 |  | 
| 100 my @fips_rand_aes_test_list = ( |  | 
| 101 |  | 
| 102     "RAND (AES)", |  | 
| 103 |  | 
| 104     [ "ANSI931_AES128MCT", "fips_rngvs mct" ], |  | 
| 105     [ "ANSI931_AES192MCT", "fips_rngvs mct" ], |  | 
| 106     [ "ANSI931_AES256MCT", "fips_rngvs mct" ], |  | 
| 107     [ "ANSI931_AES128VST", "fips_rngvs vst" ], |  | 
| 108     [ "ANSI931_AES192VST", "fips_rngvs vst" ], |  | 
| 109     [ "ANSI931_AES256VST", "fips_rngvs vst" ] |  | 
| 110 |  | 
| 111 ); |  | 
| 112 |  | 
| 113 # RAND tests, DES2 version |  | 
| 114 |  | 
| 115 my @fips_rand_des2_test_list = ( |  | 
| 116 |  | 
| 117     "RAND (DES2)", |  | 
| 118 |  | 
| 119     [ "ANSI931_TDES2MCT", "fips_rngvs mct" ], |  | 
| 120     [ "ANSI931_TDES2VST", "fips_rngvs vst" ] |  | 
| 121 |  | 
| 122 ); |  | 
| 123 |  | 
| 124 # AES tests |  | 
| 125 |  | 
| 126 my @fips_aes_test_list = ( |  | 
| 127 |  | 
| 128     "AES", |  | 
| 129 |  | 
| 130     [ "CBCGFSbox128",     "fips_aesavs -f" ], |  | 
| 131     [ "CBCGFSbox192",     "fips_aesavs -f" ], |  | 
| 132     [ "CBCGFSbox256",     "fips_aesavs -f" ], |  | 
| 133     [ "CBCKeySbox128",    "fips_aesavs -f" ], |  | 
| 134     [ "CBCKeySbox192",    "fips_aesavs -f" ], |  | 
| 135     [ "CBCKeySbox256",    "fips_aesavs -f" ], |  | 
| 136     [ "CBCMCT128",        "fips_aesavs -f" ], |  | 
| 137     [ "CBCMCT192",        "fips_aesavs -f" ], |  | 
| 138     [ "CBCMCT256",        "fips_aesavs -f" ], |  | 
| 139     [ "CBCMMT128",        "fips_aesavs -f" ], |  | 
| 140     [ "CBCMMT192",        "fips_aesavs -f" ], |  | 
| 141     [ "CBCMMT256",        "fips_aesavs -f" ], |  | 
| 142     [ "CBCVarKey128",     "fips_aesavs -f" ], |  | 
| 143     [ "CBCVarKey192",     "fips_aesavs -f" ], |  | 
| 144     [ "CBCVarKey256",     "fips_aesavs -f" ], |  | 
| 145     [ "CBCVarTxt128",     "fips_aesavs -f" ], |  | 
| 146     [ "CBCVarTxt192",     "fips_aesavs -f" ], |  | 
| 147     [ "CBCVarTxt256",     "fips_aesavs -f" ], |  | 
| 148     [ "CFB128GFSbox128",  "fips_aesavs -f" ], |  | 
| 149     [ "CFB128GFSbox192",  "fips_aesavs -f" ], |  | 
| 150     [ "CFB128GFSbox256",  "fips_aesavs -f" ], |  | 
| 151     [ "CFB128KeySbox128", "fips_aesavs -f" ], |  | 
| 152     [ "CFB128KeySbox192", "fips_aesavs -f" ], |  | 
| 153     [ "CFB128KeySbox256", "fips_aesavs -f" ], |  | 
| 154     [ "CFB128MCT128",     "fips_aesavs -f" ], |  | 
| 155     [ "CFB128MCT192",     "fips_aesavs -f" ], |  | 
| 156     [ "CFB128MCT256",     "fips_aesavs -f" ], |  | 
| 157     [ "CFB128MMT128",     "fips_aesavs -f" ], |  | 
| 158     [ "CFB128MMT192",     "fips_aesavs -f" ], |  | 
| 159     [ "CFB128MMT256",     "fips_aesavs -f" ], |  | 
| 160     [ "CFB128VarKey128",  "fips_aesavs -f" ], |  | 
| 161     [ "CFB128VarKey192",  "fips_aesavs -f" ], |  | 
| 162     [ "CFB128VarKey256",  "fips_aesavs -f" ], |  | 
| 163     [ "CFB128VarTxt128",  "fips_aesavs -f" ], |  | 
| 164     [ "CFB128VarTxt192",  "fips_aesavs -f" ], |  | 
| 165     [ "CFB128VarTxt256",  "fips_aesavs -f" ], |  | 
| 166     [ "CFB8GFSbox128",    "fips_aesavs -f" ], |  | 
| 167     [ "CFB8GFSbox192",    "fips_aesavs -f" ], |  | 
| 168     [ "CFB8GFSbox256",    "fips_aesavs -f" ], |  | 
| 169     [ "CFB8KeySbox128",   "fips_aesavs -f" ], |  | 
| 170     [ "CFB8KeySbox192",   "fips_aesavs -f" ], |  | 
| 171     [ "CFB8KeySbox256",   "fips_aesavs -f" ], |  | 
| 172     [ "CFB8MCT128",       "fips_aesavs -f" ], |  | 
| 173     [ "CFB8MCT192",       "fips_aesavs -f" ], |  | 
| 174     [ "CFB8MCT256",       "fips_aesavs -f" ], |  | 
| 175     [ "CFB8MMT128",       "fips_aesavs -f" ], |  | 
| 176     [ "CFB8MMT192",       "fips_aesavs -f" ], |  | 
| 177     [ "CFB8MMT256",       "fips_aesavs -f" ], |  | 
| 178     [ "CFB8VarKey128",    "fips_aesavs -f" ], |  | 
| 179     [ "CFB8VarKey192",    "fips_aesavs -f" ], |  | 
| 180     [ "CFB8VarKey256",    "fips_aesavs -f" ], |  | 
| 181     [ "CFB8VarTxt128",    "fips_aesavs -f" ], |  | 
| 182     [ "CFB8VarTxt192",    "fips_aesavs -f" ], |  | 
| 183     [ "CFB8VarTxt256",    "fips_aesavs -f" ], |  | 
| 184 |  | 
| 185     [ "ECBGFSbox128",  "fips_aesavs -f" ], |  | 
| 186     [ "ECBGFSbox192",  "fips_aesavs -f" ], |  | 
| 187     [ "ECBGFSbox256",  "fips_aesavs -f" ], |  | 
| 188     [ "ECBKeySbox128", "fips_aesavs -f" ], |  | 
| 189     [ "ECBKeySbox192", "fips_aesavs -f" ], |  | 
| 190     [ "ECBKeySbox256", "fips_aesavs -f" ], |  | 
| 191     [ "ECBMCT128",     "fips_aesavs -f" ], |  | 
| 192     [ "ECBMCT192",     "fips_aesavs -f" ], |  | 
| 193     [ "ECBMCT256",     "fips_aesavs -f" ], |  | 
| 194     [ "ECBMMT128",     "fips_aesavs -f" ], |  | 
| 195     [ "ECBMMT192",     "fips_aesavs -f" ], |  | 
| 196     [ "ECBMMT256",     "fips_aesavs -f" ], |  | 
| 197     [ "ECBVarKey128",  "fips_aesavs -f" ], |  | 
| 198     [ "ECBVarKey192",  "fips_aesavs -f" ], |  | 
| 199     [ "ECBVarKey256",  "fips_aesavs -f" ], |  | 
| 200     [ "ECBVarTxt128",  "fips_aesavs -f" ], |  | 
| 201     [ "ECBVarTxt192",  "fips_aesavs -f" ], |  | 
| 202     [ "ECBVarTxt256",  "fips_aesavs -f" ], |  | 
| 203     [ "OFBGFSbox128",  "fips_aesavs -f" ], |  | 
| 204     [ "OFBGFSbox192",  "fips_aesavs -f" ], |  | 
| 205     [ "OFBGFSbox256",  "fips_aesavs -f" ], |  | 
| 206     [ "OFBKeySbox128", "fips_aesavs -f" ], |  | 
| 207     [ "OFBKeySbox192", "fips_aesavs -f" ], |  | 
| 208     [ "OFBKeySbox256", "fips_aesavs -f" ], |  | 
| 209     [ "OFBMCT128",     "fips_aesavs -f" ], |  | 
| 210     [ "OFBMCT192",     "fips_aesavs -f" ], |  | 
| 211     [ "OFBMCT256",     "fips_aesavs -f" ], |  | 
| 212     [ "OFBMMT128",     "fips_aesavs -f" ], |  | 
| 213     [ "OFBMMT192",     "fips_aesavs -f" ], |  | 
| 214     [ "OFBMMT256",     "fips_aesavs -f" ], |  | 
| 215     [ "OFBVarKey128",  "fips_aesavs -f" ], |  | 
| 216     [ "OFBVarKey192",  "fips_aesavs -f" ], |  | 
| 217     [ "OFBVarKey256",  "fips_aesavs -f" ], |  | 
| 218     [ "OFBVarTxt128",  "fips_aesavs -f" ], |  | 
| 219     [ "OFBVarTxt192",  "fips_aesavs -f" ], |  | 
| 220     [ "OFBVarTxt256",  "fips_aesavs -f" ] |  | 
| 221 |  | 
| 222 ); |  | 
| 223 |  | 
| 224 my @fips_aes_cfb1_test_list = ( |  | 
| 225 |  | 
| 226     # AES CFB1 tests |  | 
| 227 |  | 
| 228     [ "CFB1GFSbox128",  "fips_aesavs -f" ], |  | 
| 229     [ "CFB1GFSbox192",  "fips_aesavs -f" ], |  | 
| 230     [ "CFB1GFSbox256",  "fips_aesavs -f" ], |  | 
| 231     [ "CFB1KeySbox128", "fips_aesavs -f" ], |  | 
| 232     [ "CFB1KeySbox192", "fips_aesavs -f" ], |  | 
| 233     [ "CFB1KeySbox256", "fips_aesavs -f" ], |  | 
| 234     [ "CFB1MCT128",     "fips_aesavs -f" ], |  | 
| 235     [ "CFB1MCT192",     "fips_aesavs -f" ], |  | 
| 236     [ "CFB1MCT256",     "fips_aesavs -f" ], |  | 
| 237     [ "CFB1MMT128",     "fips_aesavs -f" ], |  | 
| 238     [ "CFB1MMT192",     "fips_aesavs -f" ], |  | 
| 239     [ "CFB1MMT256",     "fips_aesavs -f" ], |  | 
| 240     [ "CFB1VarKey128",  "fips_aesavs -f" ], |  | 
| 241     [ "CFB1VarKey192",  "fips_aesavs -f" ], |  | 
| 242     [ "CFB1VarKey256",  "fips_aesavs -f" ], |  | 
| 243     [ "CFB1VarTxt128",  "fips_aesavs -f" ], |  | 
| 244     [ "CFB1VarTxt192",  "fips_aesavs -f" ], |  | 
| 245     [ "CFB1VarTxt256",  "fips_aesavs -f" ] |  | 
| 246 |  | 
| 247 ); |  | 
| 248 |  | 
| 249 # Triple DES tests |  | 
| 250 |  | 
| 251 my @fips_des3_test_list = ( |  | 
| 252 |  | 
| 253     "Triple DES", |  | 
| 254 |  | 
| 255     [ "TCBCinvperm",   "fips_desmovs -f" ], |  | 
| 256     [ "TCBCMMT1",      "fips_desmovs -f" ], |  | 
| 257     [ "TCBCMMT2",      "fips_desmovs -f" ], |  | 
| 258     [ "TCBCMMT3",      "fips_desmovs -f" ], |  | 
| 259     [ "TCBCMonte1",    "fips_desmovs -f" ], |  | 
| 260     [ "TCBCMonte2",    "fips_desmovs -f" ], |  | 
| 261     [ "TCBCMonte3",    "fips_desmovs -f" ], |  | 
| 262     [ "TCBCpermop",    "fips_desmovs -f" ], |  | 
| 263     [ "TCBCsubtab",    "fips_desmovs -f" ], |  | 
| 264     [ "TCBCvarkey",    "fips_desmovs -f" ], |  | 
| 265     [ "TCBCvartext",   "fips_desmovs -f" ], |  | 
| 266     [ "TCFB64invperm", "fips_desmovs -f" ], |  | 
| 267     [ "TCFB64MMT1",    "fips_desmovs -f" ], |  | 
| 268     [ "TCFB64MMT2",    "fips_desmovs -f" ], |  | 
| 269     [ "TCFB64MMT3",    "fips_desmovs -f" ], |  | 
| 270     [ "TCFB64Monte1",  "fips_desmovs -f" ], |  | 
| 271     [ "TCFB64Monte2",  "fips_desmovs -f" ], |  | 
| 272     [ "TCFB64Monte3",  "fips_desmovs -f" ], |  | 
| 273     [ "TCFB64permop",  "fips_desmovs -f" ], |  | 
| 274     [ "TCFB64subtab",  "fips_desmovs -f" ], |  | 
| 275     [ "TCFB64varkey",  "fips_desmovs -f" ], |  | 
| 276     [ "TCFB64vartext", "fips_desmovs -f" ], |  | 
| 277     [ "TCFB8invperm",  "fips_desmovs -f" ], |  | 
| 278     [ "TCFB8MMT1",     "fips_desmovs -f" ], |  | 
| 279     [ "TCFB8MMT2",     "fips_desmovs -f" ], |  | 
| 280     [ "TCFB8MMT3",     "fips_desmovs -f" ], |  | 
| 281     [ "TCFB8Monte1",   "fips_desmovs -f" ], |  | 
| 282     [ "TCFB8Monte2",   "fips_desmovs -f" ], |  | 
| 283     [ "TCFB8Monte3",   "fips_desmovs -f" ], |  | 
| 284     [ "TCFB8permop",   "fips_desmovs -f" ], |  | 
| 285     [ "TCFB8subtab",   "fips_desmovs -f" ], |  | 
| 286     [ "TCFB8varkey",   "fips_desmovs -f" ], |  | 
| 287     [ "TCFB8vartext",  "fips_desmovs -f" ], |  | 
| 288     [ "TECBinvperm",   "fips_desmovs -f" ], |  | 
| 289     [ "TECBMMT1",      "fips_desmovs -f" ], |  | 
| 290     [ "TECBMMT2",      "fips_desmovs -f" ], |  | 
| 291     [ "TECBMMT3",      "fips_desmovs -f" ], |  | 
| 292     [ "TECBMonte1",    "fips_desmovs -f" ], |  | 
| 293     [ "TECBMonte2",    "fips_desmovs -f" ], |  | 
| 294     [ "TECBMonte3",    "fips_desmovs -f" ], |  | 
| 295     [ "TECBpermop",    "fips_desmovs -f" ], |  | 
| 296     [ "TECBsubtab",    "fips_desmovs -f" ], |  | 
| 297     [ "TECBvarkey",    "fips_desmovs -f" ], |  | 
| 298     [ "TECBvartext",   "fips_desmovs -f" ], |  | 
| 299     [ "TOFBinvperm",   "fips_desmovs -f" ], |  | 
| 300     [ "TOFBMMT1",      "fips_desmovs -f" ], |  | 
| 301     [ "TOFBMMT2",      "fips_desmovs -f" ], |  | 
| 302     [ "TOFBMMT3",      "fips_desmovs -f" ], |  | 
| 303     [ "TOFBMonte1",    "fips_desmovs -f" ], |  | 
| 304     [ "TOFBMonte2",    "fips_desmovs -f" ], |  | 
| 305     [ "TOFBMonte3",    "fips_desmovs -f" ], |  | 
| 306     [ "TOFBpermop",    "fips_desmovs -f" ], |  | 
| 307     [ "TOFBsubtab",    "fips_desmovs -f" ], |  | 
| 308     [ "TOFBvarkey",    "fips_desmovs -f" ], |  | 
| 309     [ "TOFBvartext",   "fips_desmovs -f" ] |  | 
| 310 |  | 
| 311 ); |  | 
| 312 |  | 
| 313 my @fips_des3_cfb1_test_list = ( |  | 
| 314 |  | 
| 315     # DES3 CFB1 tests |  | 
| 316 |  | 
| 317     [ "TCFB1invperm",  "fips_desmovs -f" ], |  | 
| 318     [ "TCFB1MMT1",     "fips_desmovs -f" ], |  | 
| 319     [ "TCFB1MMT2",     "fips_desmovs -f" ], |  | 
| 320     [ "TCFB1MMT3",     "fips_desmovs -f" ], |  | 
| 321     [ "TCFB1Monte1",   "fips_desmovs -f" ], |  | 
| 322     [ "TCFB1Monte2",   "fips_desmovs -f" ], |  | 
| 323     [ "TCFB1Monte3",   "fips_desmovs -f" ], |  | 
| 324     [ "TCFB1permop",   "fips_desmovs -f" ], |  | 
| 325     [ "TCFB1subtab",   "fips_desmovs -f" ], |  | 
| 326     [ "TCFB1varkey",   "fips_desmovs -f" ], |  | 
| 327     [ "TCFB1vartext",  "fips_desmovs -f" ], |  | 
| 328 |  | 
| 329 ); |  | 
| 330 |  | 
| 331 # Verification special cases. |  | 
| 332 # In most cases the output of a test is deterministic and |  | 
| 333 # it can be compared to a known good result. A few involve |  | 
| 334 # the genration and use of random keys and the output will |  | 
| 335 # be different each time. In thoses cases we perform special tests |  | 
| 336 # to simply check their consistency. For example signature generation |  | 
| 337 # output will be run through signature verification to see if all outputs |  | 
| 338 # show as valid. |  | 
| 339 # |  | 
| 340 |  | 
| 341 my %verify_special = ( |  | 
| 342     "PQGGen"        => "fips_dssvs pqgver", |  | 
| 343     "KeyPair"       => "fips_dssvs keyver", |  | 
| 344     "SigGen"        => "fips_dssvs sigver", |  | 
| 345     "SigGen15"      => "fips_rsavtest", |  | 
| 346     "SigGenRSA"     => "fips_rsavtest -x931", |  | 
| 347     "SigGenPSS(0)"  => "fips_rsavtest -saltlen 0", |  | 
| 348     "SigGenPSS(62)" => "fips_rsavtest -saltlen 62", |  | 
| 349 ); |  | 
| 350 |  | 
| 351 my $win32  = $^O =~ m/mswin/i; |  | 
| 352 my $onedir = 0; |  | 
| 353 my $filter = ""; |  | 
| 354 my $tvdir; |  | 
| 355 my $tprefix; |  | 
| 356 my $shwrap_prefix; |  | 
| 357 my $debug          = 0; |  | 
| 358 my $quiet          = 0; |  | 
| 359 my $notest         = 0; |  | 
| 360 my $verify         = 1; |  | 
| 361 my $rspdir         = "rsp"; |  | 
| 362 my $ignore_missing = 0; |  | 
| 363 my $ignore_bogus   = 0; |  | 
| 364 my $bufout         = ''; |  | 
| 365 my $list_tests     = 0; |  | 
| 366 |  | 
| 367 my %fips_enabled = ( |  | 
| 368     dsa         => 1, |  | 
| 369     "dsa-pqgver"  => 0, |  | 
| 370     rsa         => 1, |  | 
| 371     "rsa-pss0"  => 0, |  | 
| 372     "rsa-pss62" => 1, |  | 
| 373     sha         => 1, |  | 
| 374     hmac        => 1, |  | 
| 375     "rand-aes"  => 1, |  | 
| 376     "rand-des2" => 0, |  | 
| 377     aes         => 1, |  | 
| 378     "aes-cfb1"  => 0, |  | 
| 379     des3        => 1, |  | 
| 380     "des3-cfb1" => 0 |  | 
| 381 ); |  | 
| 382 |  | 
| 383 foreach (@ARGV) { |  | 
| 384     if ( $_ eq "--win32" ) { |  | 
| 385         $win32 = 1; |  | 
| 386     } |  | 
| 387     elsif ( $_ eq "--onedir" ) { |  | 
| 388         $onedir = 1; |  | 
| 389     } |  | 
| 390     elsif ( $_ eq "--debug" ) { |  | 
| 391         $debug = 1; |  | 
| 392     } |  | 
| 393     elsif ( $_ eq "--ignore-missing" ) { |  | 
| 394         $ignore_missing = 1; |  | 
| 395     } |  | 
| 396     elsif ( $_ eq "--ignore-bogus" ) { |  | 
| 397         $ignore_bogus = 1; |  | 
| 398     } |  | 
| 399     elsif ( $_ eq "--generate" ) { |  | 
| 400         $verify = 0; |  | 
| 401     } |  | 
| 402     elsif ( $_ eq "--notest" ) { |  | 
| 403         $notest = 1; |  | 
| 404     } |  | 
| 405     elsif ( $_ eq "--quiet" ) { |  | 
| 406         $quiet = 1; |  | 
| 407     } |  | 
| 408     elsif (/--dir=(.*)$/) { |  | 
| 409         $tvdir = $1; |  | 
| 410     } |  | 
| 411     elsif (/--rspdir=(.*)$/) { |  | 
| 412         $rspdir = $1; |  | 
| 413     } |  | 
| 414     elsif (/--tprefix=(.*)$/) { |  | 
| 415         $tprefix = $1; |  | 
| 416     } |  | 
| 417     elsif (/--shwrap_prefix=(.*)$/) { |  | 
| 418         $shwrap_prefix = $1; |  | 
| 419     } |  | 
| 420     elsif (/^--(enable|disable)-(.*)$/) { |  | 
| 421         if ( !exists $fips_enabled{$2} ) { |  | 
| 422             print STDERR "Unknown test $2\n"; |  | 
| 423         } |  | 
| 424         if ( $1 eq "enable" ) { |  | 
| 425             $fips_enabled{$2} = 1; |  | 
| 426         } |  | 
| 427         else { |  | 
| 428             $fips_enabled{$2} = 0; |  | 
| 429         } |  | 
| 430     } |  | 
| 431     elsif (/--filter=(.*)$/) { |  | 
| 432         $filter = $1; |  | 
| 433     } |  | 
| 434     elsif (/^--list-tests$/) { |  | 
| 435         $list_tests = 1; |  | 
| 436     } |  | 
| 437     else { |  | 
| 438         Help(); |  | 
| 439         exit(1); |  | 
| 440     } |  | 
| 441 } |  | 
| 442 |  | 
| 443 my @fips_test_list; |  | 
| 444 |  | 
| 445 push @fips_test_list, @fips_dsa_test_list       if $fips_enabled{"dsa"}; |  | 
| 446 push @fips_test_list, @fips_dsa_pqgver_test_list if $fips_enabled{"dsa-pqgver"}; |  | 
| 447 push @fips_test_list, @fips_rsa_test_list       if $fips_enabled{"rsa"}; |  | 
| 448 push @fips_test_list, @fips_rsa_pss0_test_list  if $fips_enabled{"rsa-pss0"}; |  | 
| 449 push @fips_test_list, @fips_rsa_pss62_test_list if $fips_enabled{"rsa-pss62"}; |  | 
| 450 push @fips_test_list, @fips_sha_test_list       if $fips_enabled{"sha"}; |  | 
| 451 push @fips_test_list, @fips_hmac_test_list      if $fips_enabled{"hmac"}; |  | 
| 452 push @fips_test_list, @fips_rand_aes_test_list  if $fips_enabled{"rand-aes"}; |  | 
| 453 push @fips_test_list, @fips_rand_des2_test_list if $fips_enabled{"rand-des2"}; |  | 
| 454 push @fips_test_list, @fips_aes_test_list       if $fips_enabled{"aes"}; |  | 
| 455 push @fips_test_list, @fips_aes_cfb1_test_list  if $fips_enabled{"aes-cfb1"}; |  | 
| 456 push @fips_test_list, @fips_des3_test_list      if $fips_enabled{"des3"}; |  | 
| 457 push @fips_test_list, @fips_des3_cfb1_test_list if $fips_enabled{"des3-cfb1"}; |  | 
| 458 |  | 
| 459 if ($list_tests) { |  | 
| 460     my ( $test, $en ); |  | 
| 461     print "=====TEST LIST=====\n"; |  | 
| 462     foreach $test ( sort keys %fips_enabled ) { |  | 
| 463         $en = $fips_enabled{$test}; |  | 
| 464         $test =~ tr/[a-z]/[A-Z]/; |  | 
| 465         printf "%-10s %s\n", $test, $en ? "enabled" : "disabled"; |  | 
| 466     } |  | 
| 467     exit(0); |  | 
| 468 } |  | 
| 469 |  | 
| 470 foreach (@fips_test_list) { |  | 
| 471     next unless ref($_); |  | 
| 472     my $nm = $_->[0]; |  | 
| 473     $_->[2] = ""; |  | 
| 474     $_->[3] = ""; |  | 
| 475     print STDERR "Duplicate test $nm\n" if exists $fips_tests{$nm}; |  | 
| 476     $fips_tests{$nm} = $_; |  | 
| 477 } |  | 
| 478 |  | 
| 479 $tvdir = "." unless defined $tvdir; |  | 
| 480 |  | 
| 481 if ($win32) { |  | 
| 482     if ( !defined $tprefix ) { |  | 
| 483         if ($onedir) { |  | 
| 484             $tprefix = ".\\"; |  | 
| 485         } |  | 
| 486         else { |  | 
| 487             $tprefix = "..\\out32dll\\"; |  | 
| 488         } |  | 
| 489     } |  | 
| 490 } |  | 
| 491 else { |  | 
| 492     if ($onedir) { |  | 
| 493         $tprefix       = "./" unless defined $tprefix; |  | 
| 494         $shwrap_prefix = "./" unless defined $shwrap_prefix; |  | 
| 495     } |  | 
| 496     else { |  | 
| 497         $tprefix       = "../test/" unless defined $tprefix; |  | 
| 498         $shwrap_prefix = "../util/" unless defined $shwrap_prefix; |  | 
| 499     } |  | 
| 500 } |  | 
| 501 |  | 
| 502 sanity_check_exe( $win32, $tprefix, $shwrap_prefix ); |  | 
| 503 |  | 
| 504 my $cmd_prefix = $win32 ? "" : "${shwrap_prefix}shlib_wrap.sh "; |  | 
| 505 |  | 
| 506 find_files( $filter, $tvdir ); |  | 
| 507 |  | 
| 508 sanity_check_files(); |  | 
| 509 |  | 
| 510 my ( $runerr, $cmperr, $cmpok, $scheckrunerr, $scheckerr, $scheckok, $skipcnt ) |  | 
| 511   = ( 0, 0, 0, 0, 0, 0, 0 ); |  | 
| 512 |  | 
| 513 exit(0) if $notest; |  | 
| 514 |  | 
| 515 run_tests( $verify, $win32, $tprefix, $filter, $tvdir ); |  | 
| 516 |  | 
| 517 if ($verify) { |  | 
| 518     print "ALGORITHM TEST VERIFY SUMMARY REPORT:\n"; |  | 
| 519     print "Tests skipped due to missing files:        $skipcnt\n"; |  | 
| 520     print "Algorithm test program execution failures: $runerr\n"; |  | 
| 521     print "Test comparisons successful:               $cmpok\n"; |  | 
| 522     print "Test comparisons failed:                   $cmperr\n"; |  | 
| 523     print "Test sanity checks successful:             $scheckok\n"; |  | 
| 524     print "Test sanity checks failed:                 $scheckerr\n"; |  | 
| 525     print "Sanity check program execution failures:   $scheckrunerr\n"; |  | 
| 526 |  | 
| 527     if ( $runerr || $cmperr || $scheckrunerr || $scheckerr ) { |  | 
| 528         print "***TEST FAILURE***\n"; |  | 
| 529     } |  | 
| 530     else { |  | 
| 531         print "***ALL TESTS SUCCESSFUL***\n"; |  | 
| 532     } |  | 
| 533 } |  | 
| 534 else { |  | 
| 535     print "ALGORITHM TEST SUMMARY REPORT:\n"; |  | 
| 536     print "Tests skipped due to missing files:        $skipcnt\n"; |  | 
| 537     print "Algorithm test program execution failures: $runerr\n"; |  | 
| 538 |  | 
| 539     if ($runerr) { |  | 
| 540         print "***TEST FAILURE***\n"; |  | 
| 541     } |  | 
| 542     else { |  | 
| 543         print "***ALL TESTS SUCCESSFUL***\n"; |  | 
| 544     } |  | 
| 545 } |  | 
| 546 |  | 
| 547 #-------------------------------- |  | 
| 548 sub Help { |  | 
| 549     ( my $cmd ) = ( $0 =~ m#([^/]+)$# ); |  | 
| 550     print <<EOF; |  | 
| 551 $cmd: generate run CMVP algorithm tests |  | 
| 552         --debug                     Enable debug output |  | 
| 553         --dir=<dirname>             Optional root for *.req file search |  | 
| 554         --filter=<regexp> |  | 
| 555         --onedir <dirname>          Assume all components in current directory |  | 
| 556         --rspdir=<dirname>          Name of subdirectories containing *.rsp file
     s, default "rsp" |  | 
| 557         --shwrap_prefix=<prefix> |  | 
| 558         --tprefix=<prefix> |  | 
| 559         --ignore-bogus              Ignore duplicate or bogus files |  | 
| 560         --ignore-missing            Ignore missing test files |  | 
| 561         --quiet                     Shhh.... |  | 
| 562         --generate                  Generate algorithm test output |  | 
| 563         --win32                     Win32 environment |  | 
| 564         --enable-<alg>              Enable algorithm set <alg>. |  | 
| 565         --disable-<alg>             Disable algorithm set <alg>. |  | 
| 566         Where <alg> can be one of: |  | 
| 567 EOF |  | 
| 568 |  | 
| 569 while (my ($key, $value) = each %fips_enabled) |  | 
| 570         { |  | 
| 571         printf "\t\t%-20s(%s by default)\n", $key , |  | 
| 572                         $value ? "enabled" : "disabled"; |  | 
| 573         } |  | 
| 574 } |  | 
| 575 |  | 
| 576 # Sanity check to see if all necessary executables exist |  | 
| 577 |  | 
| 578 sub sanity_check_exe { |  | 
| 579     my ( $win32, $tprefix, $shwrap_prefix ) = @_; |  | 
| 580     my %exe_list; |  | 
| 581     my $bad = 0; |  | 
| 582     $exe_list{ $shwrap_prefix . "shlib_wrap.sh" } = 1 unless $win32; |  | 
| 583     foreach (@fips_test_list) { |  | 
| 584         next unless ref($_); |  | 
| 585         my $cmd = $_->[1]; |  | 
| 586         $cmd =~ s/ .*$//; |  | 
| 587         $cmd = $tprefix . $cmd; |  | 
| 588         $cmd .= ".exe" if $win32; |  | 
| 589         $exe_list{$cmd} = 1; |  | 
| 590     } |  | 
| 591 |  | 
| 592     foreach ( sort keys %exe_list ) { |  | 
| 593         if ( !-f $_ ) { |  | 
| 594             print STDERR "ERROR: can't find executable $_\n"; |  | 
| 595             $bad = 1; |  | 
| 596         } |  | 
| 597     } |  | 
| 598     if ($bad) { |  | 
| 599         print STDERR "FATAL ERROR: executables missing\n"; |  | 
| 600         exit(1); |  | 
| 601     } |  | 
| 602     elsif ($debug) { |  | 
| 603         print STDERR "Executable sanity check passed OK\n"; |  | 
| 604     } |  | 
| 605 } |  | 
| 606 |  | 
| 607 # Search for all request and response files |  | 
| 608 |  | 
| 609 sub find_files { |  | 
| 610     my ( $filter, $dir ) = @_; |  | 
| 611     my ( $dirh, $testname ); |  | 
| 612     opendir( $dirh, $dir ); |  | 
| 613     while ( $_ = readdir($dirh) ) { |  | 
| 614         next if ( $_ eq "." || $_ eq ".." ); |  | 
| 615         $_ = "$dir/$_"; |  | 
| 616         if ( -f "$_" ) { |  | 
| 617             if (/\/([^\/]*)\.rsp$/) { |  | 
| 618                 $testname = fix_pss( $1, $_ ); |  | 
| 619                 if ( exists $fips_tests{$testname} ) { |  | 
| 620                     if ( $fips_tests{$testname}->[3] eq "" ) { |  | 
| 621                         $fips_tests{$testname}->[3] = $_; |  | 
| 622                     } |  | 
| 623                     else { |  | 
| 624                         print STDERR |  | 
| 625 "WARNING: duplicate response file $_ for test $testname\n"; |  | 
| 626                         $nbogus++; |  | 
| 627                     } |  | 
| 628                 } |  | 
| 629                 else { |  | 
| 630                     print STDERR "WARNING: bogus file $_\n"; |  | 
| 631                     $nbogus++; |  | 
| 632                 } |  | 
| 633             } |  | 
| 634             next unless /$filter.*\.req$/i; |  | 
| 635             if (/\/([^\/]*)\.req$/) { |  | 
| 636                 $testname = fix_pss( $1, $_ ); |  | 
| 637                 if ( exists $fips_tests{$testname} ) { |  | 
| 638                     if ( $fips_tests{$testname}->[2] eq "" ) { |  | 
| 639                         $fips_tests{$testname}->[2] = $_; |  | 
| 640                     } |  | 
| 641                     else { |  | 
| 642                         print STDERR |  | 
| 643 "WARNING: duplicate request file $_ for test $testname\n"; |  | 
| 644                         $nbogus++; |  | 
| 645                     } |  | 
| 646 |  | 
| 647                 } |  | 
| 648                 elsif ( !/SHAmix\.req$/ ) { |  | 
| 649                     print STDERR "WARNING: unrecognized filename $_\n"; |  | 
| 650                     $nbogus++; |  | 
| 651                 } |  | 
| 652             } |  | 
| 653         } |  | 
| 654         elsif ( -d "$_" ) { |  | 
| 655             find_files( $filter, $_ ); |  | 
| 656         } |  | 
| 657     } |  | 
| 658     closedir($dirh); |  | 
| 659 } |  | 
| 660 |  | 
| 661 sub fix_pss { |  | 
| 662     my ( $test, $path ) = @_; |  | 
| 663     my $sl = ""; |  | 
| 664     local $_; |  | 
| 665     if ( $test =~ /PSS/ ) { |  | 
| 666         open( IN, $path ) || die "Can't Open File $path"; |  | 
| 667         while (<IN>) { |  | 
| 668             if (/^\s*#\s*salt\s+len:\s+(\d+)\s*$/i) { |  | 
| 669                 $sl = $1; |  | 
| 670                 last; |  | 
| 671             } |  | 
| 672         } |  | 
| 673         close IN; |  | 
| 674         if ( $sl eq "" ) { |  | 
| 675             print STDERR "WARNING: No Salt length detected for file $path\n"; |  | 
| 676         } |  | 
| 677         else { |  | 
| 678             return $test . "($sl)"; |  | 
| 679         } |  | 
| 680     } |  | 
| 681     return $test; |  | 
| 682 } |  | 
| 683 |  | 
| 684 sub sanity_check_files { |  | 
| 685     my $bad = 0; |  | 
| 686     foreach (@fips_test_list) { |  | 
| 687         next unless ref($_); |  | 
| 688         my ( $tst, $cmd, $req, $resp ) = @$_; |  | 
| 689 |  | 
| 690         #print STDERR "FILES $tst, $cmd, $req, $resp\n"; |  | 
| 691         if ( $req eq "" ) { |  | 
| 692             print STDERR "WARNING: missing request file for $tst\n"; |  | 
| 693             $bad = 1; |  | 
| 694             next; |  | 
| 695         } |  | 
| 696         if ( $verify && $resp eq "" ) { |  | 
| 697             print STDERR "WARNING: no response file for test $tst\n"; |  | 
| 698             $bad = 1; |  | 
| 699         } |  | 
| 700         elsif ( !$verify && $resp ne "" ) { |  | 
| 701             print STDERR "WARNING: response file $resp will be overwritten\n"; |  | 
| 702         } |  | 
| 703     } |  | 
| 704     if ($bad) { |  | 
| 705         print STDERR "ERROR: test vector file set not complete\n"; |  | 
| 706         exit(1) unless $ignore_missing; |  | 
| 707     } |  | 
| 708     if ($nbogus) { |  | 
| 709         print STDERR |  | 
| 710           "ERROR: $nbogus bogus or duplicate request and response files\n"; |  | 
| 711         exit(1) unless $ignore_bogus; |  | 
| 712     } |  | 
| 713     if ( $debug && !$nbogus && !$bad ) { |  | 
| 714         print STDERR "test vector file set complete\n"; |  | 
| 715     } |  | 
| 716 } |  | 
| 717 |  | 
| 718 sub run_tests { |  | 
| 719     my ( $verify, $win32, $tprefix, $filter, $tvdir ) = @_; |  | 
| 720     my ( $tname, $tref ); |  | 
| 721     my $bad = 0; |  | 
| 722     foreach (@fips_test_list) { |  | 
| 723         if ( !ref($_) ) { |  | 
| 724             print "Running $_ tests\n" unless $quiet; |  | 
| 725             next; |  | 
| 726         } |  | 
| 727         my ( $tname, $tcmd, $req, $rsp ) = @$_; |  | 
| 728         my $out = $rsp; |  | 
| 729         if ($verify) { |  | 
| 730             $out =~ s/\.rsp$/.tst/; |  | 
| 731         } |  | 
| 732         if ( $req eq "" ) { |  | 
| 733             print STDERR |  | 
| 734               "WARNING: Request file for $tname missing: test skipped\n"; |  | 
| 735             $skipcnt++; |  | 
| 736             next; |  | 
| 737         } |  | 
| 738         if ( $verify && $rsp eq "" ) { |  | 
| 739             print STDERR |  | 
| 740               "WARNING: Response file for $tname missing: test skipped\n"; |  | 
| 741             $skipcnt++; |  | 
| 742             next; |  | 
| 743         } |  | 
| 744         elsif ( !$verify ) { |  | 
| 745             if ( $rsp ne "" ) { |  | 
| 746                 print STDERR "WARNING: Response file for $tname deleted\n"; |  | 
| 747                 unlink $rsp; |  | 
| 748             } |  | 
| 749             $out = $req; |  | 
| 750             $out =~ s|/req/(\S+)\.req|/$rspdir/$1.rsp|; |  | 
| 751             my $outdir = $out; |  | 
| 752             $outdir =~ s|/[^/]*$||; |  | 
| 753             if ( !-d $outdir ) { |  | 
| 754                 print STDERR "DEBUG: Creating directory $outdir\n" if $debug; |  | 
| 755                 mkdir($outdir) || die "Can't create directory $outdir"; |  | 
| 756             } |  | 
| 757         } |  | 
| 758         my $cmd = "$cmd_prefix$tprefix$tcmd "; |  | 
| 759         if ( $tcmd =~ /-f$/ ) { |  | 
| 760             $cmd .= "\"$req\" \"$out\""; |  | 
| 761         } |  | 
| 762         else { |  | 
| 763             $cmd .= "<\"$req\" >\"$out\""; |  | 
| 764         } |  | 
| 765         print STDERR "DEBUG: running test $tname\n" if ( $debug && !$verify ); |  | 
| 766         system($cmd); |  | 
| 767         if ( $? != 0 ) { |  | 
| 768             print STDERR |  | 
| 769               "WARNING: error executing test $tname for command: $cmd\n"; |  | 
| 770             $runerr++; |  | 
| 771             next; |  | 
| 772         } |  | 
| 773         if ($verify) { |  | 
| 774             if ( exists $verify_special{$tname} ) { |  | 
| 775                 my $vout = $rsp; |  | 
| 776                 $vout =~ s/\.rsp$/.ver/; |  | 
| 777                 $tcmd = $verify_special{$tname}; |  | 
| 778                 $cmd  = "$cmd_prefix$tprefix$tcmd "; |  | 
| 779                 $cmd .= "<\"$out\" >\"$vout\""; |  | 
| 780                 system($cmd); |  | 
| 781                 if ( $? != 0 ) { |  | 
| 782                     print STDERR |  | 
| 783                       "WARNING: error executing verify test $tname $cmd\n"; |  | 
| 784                     $scheckrunerr++; |  | 
| 785                     next; |  | 
| 786                 } |  | 
| 787                 my ( $fcount, $pcount ) = ( 0, 0 ); |  | 
| 788                 open VER, "$vout"; |  | 
| 789                 while (<VER>) { |  | 
| 790                     if (/^Result\s*=\s*(\S*)\s*$/i) |  | 
| 791 |  | 
| 792                     { |  | 
| 793                         if ( $1 eq "F" ) { |  | 
| 794                             $fcount++; |  | 
| 795                         } |  | 
| 796                         else { |  | 
| 797                             $pcount++; |  | 
| 798                         } |  | 
| 799                     } |  | 
| 800                 } |  | 
| 801                 close VER; |  | 
| 802 |  | 
| 803                 unlink $vout; |  | 
| 804                 if ( $fcount || $debug ) { |  | 
| 805                     print STDERR "DEBUG: $tname, Pass=$pcount, Fail=$fcount\n"; |  | 
| 806                 } |  | 
| 807                 if ( $fcount || !$pcount ) { |  | 
| 808                     $scheckerr++; |  | 
| 809                 } |  | 
| 810                 else { |  | 
| 811                     $scheckok++; |  | 
| 812                 } |  | 
| 813 |  | 
| 814             } |  | 
| 815             elsif ( !cmp_file( $tname, $rsp, $out ) ) { |  | 
| 816                 $cmperr++; |  | 
| 817             } |  | 
| 818             else { |  | 
| 819                 $cmpok++; |  | 
| 820             } |  | 
| 821             unlink $out; |  | 
| 822         } |  | 
| 823     } |  | 
| 824 } |  | 
| 825 |  | 
| 826 sub cmp_file { |  | 
| 827     my ( $tname, $rsp, $tst ) = @_; |  | 
| 828     my ( $rspf,    $tstf ); |  | 
| 829     my ( $rspline, $tstline ); |  | 
| 830     if ( !open( $rspf, $rsp ) ) { |  | 
| 831         print STDERR "ERROR: can't open request file $rsp\n"; |  | 
| 832         return 0; |  | 
| 833     } |  | 
| 834     if ( !open( $tstf, $tst ) ) { |  | 
| 835         print STDERR "ERROR: can't open output file $tst\n"; |  | 
| 836         return 0; |  | 
| 837     } |  | 
| 838     for ( ; ; ) { |  | 
| 839         $rspline = next_line($rspf); |  | 
| 840         $tstline = next_line($tstf); |  | 
| 841         if ( !defined($rspline) && !defined($tstline) ) { |  | 
| 842             print STDERR "DEBUG: $tname file comparison OK\n" if $debug; |  | 
| 843             return 1; |  | 
| 844         } |  | 
| 845         if ( !defined($rspline) ) { |  | 
| 846             print STDERR "ERROR: $tname EOF on $rsp\n"; |  | 
| 847             return 0; |  | 
| 848         } |  | 
| 849         if ( !defined($tstline) ) { |  | 
| 850             print STDERR "ERROR: $tname EOF on $tst\n"; |  | 
| 851             return 0; |  | 
| 852         } |  | 
| 853 |  | 
| 854         # Workaround for bug in RAND des2 test output */ |  | 
| 855         if ( $tstline =~ /^Key2 =/ && $rspline =~ /^Key1 =/ ) { |  | 
| 856             $rspline =~ s/^Key1/Key2/; |  | 
| 857         } |  | 
| 858 |  | 
| 859         if ( $tstline ne $rspline ) { |  | 
| 860             print STDERR "ERROR: $tname mismatch:\n"; |  | 
| 861             print STDERR "\t \"$tstline\" != \"$rspline\"\n"; |  | 
| 862             return 0; |  | 
| 863         } |  | 
| 864     } |  | 
| 865     return 1; |  | 
| 866 } |  | 
| 867 |  | 
| 868 sub next_line { |  | 
| 869     my ($in) = @_; |  | 
| 870 |  | 
| 871     while (<$in>) { |  | 
| 872         chomp; |  | 
| 873 |  | 
| 874         # Delete comments |  | 
| 875         s/#.*$//; |  | 
| 876 |  | 
| 877         # Ignore blank lines |  | 
| 878         next if (/^\s*$/); |  | 
| 879 |  | 
| 880         # Translate multiple space into one |  | 
| 881         s/\s+/ /g; |  | 
| 882         # Delete trailing whitespace |  | 
| 883         s/\s+$//; |  | 
| 884         return $_; |  | 
| 885     } |  | 
| 886     return undef; |  | 
| 887 } |  | 
| OLD | NEW | 
|---|