
1: # perl script to run OpenSSL tests 2: 3: 4: my $base_path = "\\openssl"; 5: 6: my $output_path = "$base_path\\test_out"; 7: my $cert_path = "$base_path\\certs"; 8: my $test_path = "$base_path\\test"; 9: my $app_path = "$base_path\\apps"; 10: 11: my $tmp_cert = "$output_path\\cert.tmp"; 12: my $OpenSSL_config = "$app_path\\openssl.cnf"; 13: my $log_file = "$output_path\\tests.log"; 14: 15: my $pause = 0; 16: 17: 18: # process the command line args to see if they wanted us to pause 19: # between executing each command 20: foreach $i (@ARGV) 21: { 22: if ($i =~ /^-p$/) 23: { $pause=1; } 24: } 25: 26: 27: 28: main(); 29: 30: 31: ############################################################################ 32: sub main() 33: { 34: # delete all the output files in the output directory 35: unlink <$output_path\\*.*>; 36: 37: # open the main log file 38: open(OUT, ">$log_file") || die "unable to open $log_file\n"; 39: 40: 41: algorithm_tests(); 42: encryption_tests(); 43: pem_tests(); 44: verify_tests(); 45: ca_tests(); 46: ssl_tests(); 47: 48: close(OUT); 49: 50: print("\nCompleted running tests.\n\n"); 51: print("Check log file for errors: $log_file\n"); 52: } 53: 54: ############################################################################ 55: sub algorithm_tests 56: { 57: my $i; 58: my $outFile; 59: my @tests = ( rsa_test, destest, ideatest, bftest, shatest, sha1test, 60: md5test, dsatest, md2test, mdc2test, rc2test, rc4test, randtest, 61: dhtest, exptest ); 62: 63: print( "\nRUNNING CRYPTO ALGORITHM TESTS:\n\n"); 64: 65: print( OUT "\n========================================================\n"); 66: print( OUT "CRYPTO ALGORITHM TESTS:\n\n"); 67: 68: foreach $i (@tests) 69: { 70: if (-e "$base_path\\$i.nlm") 71: { 72: $outFile = "$output_path\\$i.out"; 73: system("$i > $outFile"); 74: log_desc("Test: $i\.nlm:"); 75: log_output("", $outFile ); 76: } 77: else 78: { 79: log_desc("Test: $i\.nlm: file not found"); 80: } 81: } 82: } 83: 84: ############################################################################ 85: sub encryption_tests 86: { 87: my $i; 88: my $outFile; 89: my @enc_tests = ( "enc", "rc4", "des-cfb", "des-ede-cfb", "des-ede3-cfb", 90: "des-ofb", "des-ede-ofb", "des-ede3-ofb", 91: "des-ecb", "des-ede", "des-ede3", "des-cbc", 92: "des-ede-cbc", "des-ede3-cbc", "idea-ecb", "idea-cfb", 93: "idea-ofb", "idea-cbc", "rc2-ecb", "rc2-cfb", 94: "rc2-ofb", "rc2-cbc", "bf-ecb", "bf-cfb", 95: "bf-ofb", "bf-cbc" ); 96: 97: my $input = "$base_path\\do_tests.pl"; 98: my $cipher = "$output_path\\cipher.out"; 99: my $clear = "$output_path\\clear.out"; 100: 101: print( "\nRUNNING ENCRYPTION & DECRYPTION TESTS:\n\n"); 102: 103: print( OUT "\n========================================================\n"); 104: print( OUT "FILE ENCRYPTION & DECRYPTION TESTS:\n\n"); 105: 106: foreach $i (@enc_tests) 107: { 108: log_desc("Testing: $i"); 109: 110: # do encryption 111: $outFile = "$output_path\\enc.out"; 112: system("openssl2 $i -e -bufsize 113 -k test -in $input -out $cipher > $outFile" ); 113: log_output("Encrypting: $input --> $cipher", $outFile); 114: 115: # do decryption 116: $outFile = "$output_path\\dec.out"; 117: system("openssl2 $i -d -bufsize 157 -k test -in $cipher -out $clear > $outFile"); 118: log_output("Decrypting: $cipher --> $clear", $outFile); 119: 120: # compare files 121: $x = compare_files( $input, $clear, 1); 122: if ( $x == 0 ) 123: { 124: print( "SUCCESS - files match: $input, $clear\n"); 125: print( OUT "SUCCESS - files match: $input, $clear\n"); 126: } 127: else 128: { 129: print( "ERROR: files don't match\n"); 130: print( OUT "ERROR: files don't match\n"); 131: } 132: 133: do_wait(); 134: 135: # Now do the same encryption but use Base64 136: 137: # do encryption B64 138: $outFile = "$output_path\\B64enc.out"; 139: system("openssl2 $i -a -e -bufsize 113 -k test -in $input -out $cipher > $outFile"); 140: log_output("Encrypting(B64): $cipher --> $clear", $outFile); 141: 142: # do decryption B64 143: $outFile = "$output_path\\B64dec.out"; 144: system("openssl2 $i -a -d -bufsize 157 -k test -in $cipher -out $clear > $outFile"); 145: log_output("Decrypting(B64): $cipher --> $clear", $outFile); 146: 147: # compare files 148: $x = compare_files( $input, $clear, 1); 149: if ( $x == 0 ) 150: { 151: print( "SUCCESS - files match: $input, $clear\n"); 152: print( OUT "SUCCESS - files match: $input, $clear\n"); 153: } 154: else 155: { 156: print( "ERROR: files don't match\n"); 157: print( OUT "ERROR: files don't match\n"); 158: } 159: 160: do_wait(); 161: 162: } # end foreach 163: 164: # delete the temporary files 165: unlink($cipher); 166: unlink($clear); 167: } 168: 169: 170: ############################################################################ 171: sub pem_tests 172: { 173: my $i; 174: my $tmp_out; 175: my $outFile = "$output_path\\pem.out"; 176: 177: my %pem_tests = ( 178: "crl" => "testcrl.pem", 179: "pkcs7" => "testp7.pem", 180: "req" => "testreq2.pem", 181: "rsa" => "testrsa.pem", 182: "x509" => "testx509.pem", 183: "x509" => "v3-cert1.pem", 184: "sess_id" => "testsid.pem" ); 185: 186: 187: print( "\nRUNNING PEM TESTS:\n\n"); 188: 189: print( OUT "\n========================================================\n"); 190: print( OUT "PEM TESTS:\n\n"); 191: 192: foreach $i (keys(%pem_tests)) 193: { 194: log_desc( "Testing: $i"); 195: 196: my $input = "$test_path\\$pem_tests{$i}"; 197: 198: $tmp_out = "$output_path\\$pem_tests{$i}"; 199: 200: if ($i ne "req" ) 201: { 202: system("openssl2 $i -in $input -out $tmp_out > $outFile"); 203: log_output( "openssl2 $i -in $input -out $tmp_out", $outFile); 204: } 205: else 206: { 207: system("openssl2 $i -in $input -out $tmp_out -config $OpenSSL_config > $outFile"); 208: log_output( "openssl2 $i -in $input -out $tmp_out -config $OpenSSL_config", $outFile ); 209: } 210: 211: $x = compare_files( $input, $tmp_out); 212: if ( $x == 0 ) 213: { 214: print( "SUCCESS - files match: $input, $tmp_out\n"); 215: print( OUT "SUCCESS - files match: $input, $tmp_out\n"); 216: } 217: else 218: { 219: print( "ERROR: files don't match\n"); 220: print( OUT "ERROR: files don't match\n"); 221: } 222: do_wait(); 223: 224: } # end foreach 225: } 226: 227: 228: ############################################################################ 229: sub verify_tests 230: { 231: my $i; 232: my $outFile = "$output_path\\verify.out"; 233: 234: my @cert_files = <$cert_path\\*.pem>; 235: 236: print( "\nRUNNING VERIFY TESTS:\n\n"); 237: 238: print( OUT "\n========================================================\n"); 239: print( OUT "VERIFY TESTS:\n\n"); 240: 241: make_tmp_cert_file(); 242: 243: foreach $i (@cert_files) 244: { 245: system("openssl2 verify -CAfile $tmp_cert $i >$outFile"); 246: log_desc("Verifying cert: $i"); 247: log_output("openssl2 verify -CAfile $tmp_cert $i", $outFile); 248: } 249: } 250: 251: 252: ############################################################################ 253: sub ssl_tests 254: { 255: my $outFile = "$output_path\\ssl_tst.out"; 256: my($CAcert) = "$output_path\\certCA.ss"; 257: my($Ukey) = "$output_path\\keyU.ss"; 258: my($Ucert) = "$output_path\\certU.ss"; 259: my($ssltest)= "ssltest -key $Ukey -cert $Ucert -c_key $Ukey -c_cert $Ucert -CAfile $CAcert"; 260: 261: print( "\nRUNNING SSL TESTS:\n\n"); 262: 263: print( OUT "\n========================================================\n"); 264: print( OUT "SSL TESTS:\n\n"); 265: 266: system("ssltest -ssl2 >$outFile"); 267: log_desc("Testing sslv2:"); 268: log_output("ssltest -ssl2", $outFile); 269: 270: system("$ssltest -ssl2 -server_auth >$outFile"); 271: log_desc("Testing sslv2 with server authentication:"); 272: log_output("$ssltest -ssl2 -server_auth", $outFile); 273: 274: system("$ssltest -ssl2 -client_auth >$outFile"); 275: log_desc("Testing sslv2 with client authentication:"); 276: log_output("$ssltest -ssl2 -client_auth", $outFile); 277: 278: system("$ssltest -ssl2 -server_auth -client_auth >$outFile"); 279: log_desc("Testing sslv2 with both client and server authentication:"); 280: log_output("$ssltest -ssl2 -server_auth -client_auth", $outFile); 281: 282: system("ssltest -ssl3 >$outFile"); 283: log_desc("Testing sslv3:"); 284: log_output("ssltest -ssl3", $outFile); 285: 286: system("$ssltest -ssl3 -server_auth >$outFile"); 287: log_desc("Testing sslv3 with server authentication:"); 288: log_output("$ssltest -ssl3 -server_auth", $outFile); 289: 290: system("$ssltest -ssl3 -client_auth >$outFile"); 291: log_desc("Testing sslv3 with client authentication:"); 292: log_output("$ssltest -ssl3 -client_auth", $outFile); 293: 294: system("$ssltest -ssl3 -server_auth -client_auth >$outFile"); 295: log_desc("Testing sslv3 with both client and server authentication:"); 296: log_output("$ssltest -ssl3 -server_auth -client_auth", $outFile); 297: 298: system("ssltest >$outFile"); 299: log_desc("Testing sslv2/sslv3:"); 300: log_output("ssltest", $outFile); 301: 302: system("$ssltest -server_auth >$outFile"); 303: log_desc("Testing sslv2/sslv3 with server authentication:"); 304: log_output("$ssltest -server_auth", $outFile); 305: 306: system("$ssltest -client_auth >$outFile"); 307: log_desc("Testing sslv2/sslv3 with client authentication:"); 308: log_output("$ssltest -client_auth ", $outFile); 309: 310: system("$ssltest -server_auth -client_auth >$outFile"); 311: log_desc("Testing sslv2/sslv3 with both client and server authentication:"); 312: log_output("$ssltest -server_auth -client_auth", $outFile); 313: 314: system("ssltest -bio_pair -ssl2 >$outFile"); 315: log_desc("Testing sslv2 via BIO pair:"); 316: log_output("ssltest -bio_pair -ssl2", $outFile); 317: 318: system("ssltest -bio_pair -dhe1024dsa -v >$outFile"); 319: log_desc("Testing sslv2/sslv3 with 1024 bit DHE via BIO pair:"); 320: log_output("ssltest -bio_pair -dhe1024dsa -v", $outFile); 321: 322: system("$ssltest -bio_pair -ssl2 -server_auth >$outFile"); 323: log_desc("Testing sslv2 with server authentication via BIO pair:"); 324: log_output("$ssltest -bio_pair -ssl2 -server_auth", $outFile); 325: 326: system("$ssltest -bio_pair -ssl2 -client_auth >$outFile"); 327: log_desc("Testing sslv2 with client authentication via BIO pair:"); 328: log_output("$ssltest -bio_pair -ssl2 -client_auth", $outFile); 329: 330: system("$ssltest -bio_pair -ssl2 -server_auth -client_auth >$outFile"); 331: log_desc("Testing sslv2 with both client and server authentication via BIO pair:"); 332: log_output("$ssltest -bio_pair -ssl2 -server_auth -client_auth", $outFile); 333: 334: system("ssltest -bio_pair -ssl3 >$outFile"); 335: log_desc("Testing sslv3 via BIO pair:"); 336: log_output("ssltest -bio_pair -ssl3", $outFile); 337: 338: system("$ssltest -bio_pair -ssl3 -server_auth >$outFile"); 339: log_desc("Testing sslv3 with server authentication via BIO pair:"); 340: log_output("$ssltest -bio_pair -ssl3 -server_auth", $outFile); 341: 342: system("$ssltest -bio_pair -ssl3 -client_auth >$outFile"); 343: log_desc("Testing sslv3 with client authentication via BIO pair:"); 344: log_output("$ssltest -bio_pair -ssl3 -client_auth", $outFile); 345: 346: system("$ssltest -bio_pair -ssl3 -server_auth -client_auth >$outFile"); 347: log_desc("Testing sslv3 with both client and server authentication via BIO pair:"); 348: log_output("$ssltest -bio_pair -ssl3 -server_auth -client_auth", $outFile); 349: 350: system("ssltest -bio_pair >$outFile"); 351: log_desc("Testing sslv2/sslv3 via BIO pair:"); 352: log_output("ssltest -bio_pair", $outFile); 353: 354: system("$ssltest -bio_pair -server_auth >$outFile"); 355: log_desc("Testing sslv2/sslv3 with server authentication via BIO pair:"); 356: log_output("$ssltest -bio_pair -server_auth", $outFile); 357: 358: system("$ssltest -bio_pair -client_auth >$outFile"); 359: log_desc("Testing sslv2/sslv3 with client authentication via BIO pair:"); 360: log_output("$ssltest -bio_pair -client_auth", $outFile); 361: 362: system("$ssltest -bio_pair -server_auth -client_auth >$outFile"); 363: log_desc("Testing sslv2/sslv3 with both client and server authentication via BIO pair:"); 364: log_output("$ssltest -bio_pair -server_auth -client_auth", $outFile); 365: } 366: 367: 368: ############################################################################ 369: sub ca_tests 370: { 371: my $outFile = "$output_path\\ca_tst.out"; 372: 373: my($CAkey) = "$output_path\\keyCA.ss"; 374: my($CAcert) = "$output_path\\certCA.ss"; 375: my($CAserial) = "$output_path\\certCA.srl"; 376: my($CAreq) = "$output_path\\reqCA.ss"; 377: my($CAreq2) = "$output_path\\req2CA.ss"; 378: 379: my($CAconf) = "$test_path\\CAss.cnf"; 380: 381: my($Uconf) = "$test_path\\Uss.cnf"; 382: 383: my($Ukey) = "$output_path\\keyU.ss"; 384: my($Ureq) = "$output_path\\reqU.ss"; 385: my($Ucert) = "$output_path\\certU.ss"; 386: 387: print( "\nRUNNING CA TESTS:\n\n"); 388: 389: print( OUT "\n========================================================\n"); 390: print( OUT "CA TESTS:\n"); 391: 392: system("openssl2 req -config $CAconf -out $CAreq -keyout $CAkey -new >$outFile"); 393: log_desc("Make a certificate request using req:"); 394: log_output("openssl2 req -config $CAconf -out $CAreq -keyout $CAkey -new", $outFile); 395: 396: system("openssl2 x509 -CAcreateserial -in $CAreq -days 30 -req -out $CAcert -signkey $CAkey >$outFile"); 397: log_desc("Convert the certificate request into a self signed certificate using x509:"); 398: log_output("openssl2 x509 -CAcreateserial -in $CAreq -days 30 -req -out $CAcert -signkey $CAkey", $outFile); 399: 400: system("openssl2 x509 -in $CAcert -x509toreq -signkey $CAkey -out $CAreq2 >$outFile"); 401: log_desc("Convert a certificate into a certificate request using 'x509':"); 402: log_output("openssl2 x509 -in $CAcert -x509toreq -signkey $CAkey -out $CAreq2", $outFile); 403: 404: system("openssl2 req -config $OpenSSL_config -verify -in $CAreq -noout >$outFile"); 405: log_output("openssl2 req -config $OpenSSL_config -verify -in $CAreq -noout", $outFile); 406: 407: system("openssl2 req -config $OpenSSL_config -verify -in $CAreq2 -noout >$outFile"); 408: log_output( "openssl2 req -config $OpenSSL_config -verify -in $CAreq2 -noout", $outFile); 409: 410: system("openssl2 verify -CAfile $CAcert $CAcert >$outFile"); 411: log_output("openssl2 verify -CAfile $CAcert $CAcert", $outFile); 412: 413: system("openssl2 req -config $Uconf -out $Ureq -keyout $Ukey -new >$outFile"); 414: log_desc("Make another certificate request using req:"); 415: log_output("openssl2 req -config $Uconf -out $Ureq -keyout $Ukey -new", $outFile); 416: 417: system("openssl2 x509 -CAcreateserial -in $Ureq -days 30 -req -out $Ucert -CA $CAcert -CAkey $CAkey -CAserial $CAserial >$outFile"); 418: log_desc("Sign certificate request with the just created CA via x509:"); 419: log_output("openssl2 x509 -CAcreateserial -in $Ureq -days 30 -req -out $Ucert -CA $CAcert -CAkey $CAkey -CAserial $CAserial", $outFile); 420: 421: system("openssl2 verify -CAfile $CAcert $Ucert >$outFile"); 422: log_output("openssl2 verify -CAfile $CAcert $Ucert", $outFile); 423: 424: system("openssl2 x509 -subject -issuer -startdate -enddate -noout -in $Ucert >$outFile"); 425: log_desc("Certificate details"); 426: log_output("openssl2 x509 -subject -issuer -startdate -enddate -noout -in $Ucert", $outFile); 427: 428: print(OUT "-- \n"); 429: print(OUT "The generated CA certificate is $CAcert\n"); 430: print(OUT "The generated CA private key is $CAkey\n"); 431: print(OUT "The current CA signing serial number is in $CAserial\n"); 432: 433: print(OUT "The generated user certificate is $Ucert\n"); 434: print(OUT "The generated user private key is $Ukey\n"); 435: print(OUT "--\n"); 436: } 437: 438: ############################################################################ 439: sub log_output( $ $ ) 440: { 441: my( $desc, $file ) = @_; 442: my($error) = 0; 443: my($key); 444: my($msg); 445: 446: if ($desc) 447: { 448: print("$desc\n"); 449: print(OUT "$desc\n"); 450: } 451: 452: # loop waiting for test program to complete 453: while ( stat($file) == 0) 454: { print(". "); sleep(1); } 455: 456: 457: # copy test output to log file 458: open(IN, "<$file"); 459: while (<IN>) 460: { 461: print(OUT $_); 462: if ( $_ =~ /ERROR/ ) 463: { 464: $error = 1; 465: } 466: } 467: # close and delete the temporary test output file 468: close(IN); 469: unlink($file); 470: 471: if ( $error == 0 ) 472: { 473: $msg = "Test Succeeded"; 474: } 475: else 476: { 477: $msg = "Test Failed"; 478: } 479: 480: print(OUT "$msg\n"); 481: 482: if ($pause) 483: { 484: print("$msg - press ENTER to continue..."); 485: $key = getc; 486: print("\n"); 487: } 488: 489: # Several of the testing scripts run a loop loading the 490: # same NLM with different options. 491: # On slow NetWare machines there appears to be some delay in the 492: # OS actually unloading the test nlms and the OS complains about. 493: # the NLM already being loaded. This additional pause is to 494: # to help provide a little more time for unloading before trying to 495: # load again. 496: sleep(1); 497: } 498: 499: 500: ############################################################################ 501: sub log_desc( $ ) 502: { 503: my( $desc ) = @_; 504: 505: print("\n"); 506: print("$desc\n"); 507: 508: print(OUT "\n"); 509: print(OUT "$desc\n"); 510: print(OUT "======================================\n"); 511: } 512: 513: ############################################################################ 514: sub compare_files( $ $ $ ) 515: { 516: my( $file1, $file2, $binary ) = @_; 517: my( $n1, $n2, $b1, $b2 ); 518: my($ret) = 1; 519: 520: open(IN0, $file1) || die "\nunable to open $file1\n"; 521: open(IN1, $file2) || die "\nunable to open $file2\n"; 522: 523: if ($binary) 524: { 525: binmode IN0; 526: binmode IN1; 527: } 528: 529: for (;;) 530: { 531: $n1 = read(IN0, $b1, 512); 532: $n2 = read(IN1, $b2, 512); 533: 534: if ($n1 != $n2) {last;} 535: if ($b1 != $b2) {last;} 536: 537: if ($n1 == 0) 538: { 539: $ret = 0; 540: last; 541: } 542: } 543: close(IN0); 544: close(IN1); 545: return($ret); 546: } 547: 548: ############################################################################ 549: sub do_wait() 550: { 551: my($key); 552: 553: if ($pause) 554: { 555: print("Press ENTER to continue..."); 556: $key = getc; 557: print("\n"); 558: } 559: } 560: 561: 562: ############################################################################ 563: sub make_tmp_cert_file() 564: { 565: my @cert_files = <$cert_path\\*.pem>; 566: 567: # delete the file if it already exists 568: unlink($tmp_cert); 569: 570: open( TMP_CERT, ">$tmp_cert") || die "\nunable to open $tmp_cert\n"; 571: 572: print("building temporary cert file\n"); 573: 574: # create a temporary cert file that contains all the certs 575: foreach $i (@cert_files) 576: { 577: open( IN_CERT, $i ) || die "\nunable to open $i\n"; 578: 579: for(;;) 580: { 581: $n = sysread(IN_CERT, $data, 1024); 582: 583: if ($n == 0) 584: { 585: close(IN_CERT); 586: last; 587: }; 588: 589: syswrite(TMP_CERT, $data, $n); 590: } 591: } 592: 593: close( TMP_CERT ); 594: }