fipsoracle: Combine all test oracles into a single binary.

Change-Id: If53f88135976e5f8f113c0e68bd880e378c98fd9
Reviewed-on: https://boringssl-review.googlesource.com/15885
Reviewed-by: Martin Kreichgauer <martinkr@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/fipsoracle/CMakeLists.txt b/fipsoracle/CMakeLists.txt
index b9dfda1..18720bc 100644
--- a/fipsoracle/CMakeLists.txt
+++ b/fipsoracle/CMakeLists.txt
@@ -2,138 +2,30 @@
 
 if (FIPS)
   add_executable(
-    cavp_aes_test
+    cavp
 
-    cavp_aes_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_aes_gcm_test
+    cavp_main.cc
 
     cavp_aes_gcm_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_ecdsa2_keypair_test
-
-    cavp_ecdsa2_keypair_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_ecdsa2_pkv_test
-
-    cavp_ecdsa2_pkv_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_ecdsa2_siggen_test
-
-    cavp_ecdsa2_siggen_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_ecdsa2_sigver_test
-
-    cavp_ecdsa2_sigver_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_rsa2_keygen_test
-
-    cavp_rsa2_keygen_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_rsa2_siggen_test
-
-    cavp_rsa2_siggen_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_rsa2_sigver_test
-
-    cavp_rsa2_sigver_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_hmac_test
-
-    cavp_hmac_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_tdes_test
-
-    cavp_tdes_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_sha_test
-
-    cavp_sha_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_sha_monte_test
-
-    cavp_sha_monte_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_ctr_drbg_test
-
+    cavp_aes_test.cc
     cavp_ctr_drbg_test.cc
-    cavp_test_util.cc
-    $<TARGET_OBJECTS:test_support>
-  )
-
-  add_executable(
-    cavp_keywrap_test
-
+    cavp_ecdsa2_keypair_test.cc
+    cavp_ecdsa2_pkv_test.cc
+    cavp_ecdsa2_siggen_test.cc
+    cavp_ecdsa2_sigver_test.cc
+    cavp_hmac_test.cc
     cavp_keywrap_test.cc
+    cavp_rsa2_keygen_test.cc
+    cavp_rsa2_siggen_test.cc
+    cavp_rsa2_sigver_test.cc
+    cavp_sha_monte_test.cc
+    cavp_sha_test.cc
+    cavp_tdes_test.cc
+
     cavp_test_util.cc
+
     $<TARGET_OBJECTS:test_support>
   )
 
-  target_link_libraries(cavp_aes_test crypto)
-  target_link_libraries(cavp_aes_gcm_test crypto)
-  target_link_libraries(cavp_ctr_drbg_test crypto)
-  target_link_libraries(cavp_ecdsa2_keypair_test crypto)
-  target_link_libraries(cavp_ecdsa2_pkv_test crypto)
-  target_link_libraries(cavp_ecdsa2_siggen_test crypto)
-  target_link_libraries(cavp_ecdsa2_sigver_test crypto)
-  target_link_libraries(cavp_hmac_test crypto)
-  target_link_libraries(cavp_keywrap_test crypto)
-  target_link_libraries(cavp_rsa2_keygen_test crypto)
-  target_link_libraries(cavp_rsa2_siggen_test crypto)
-  target_link_libraries(cavp_rsa2_sigver_test crypto)
-  target_link_libraries(cavp_sha_test crypto)
-  target_link_libraries(cavp_sha_monte_test crypto)
-  target_link_libraries(cavp_tdes_test crypto)
+  target_link_libraries(cavp crypto)
 endif()
diff --git a/fipsoracle/cavp_aes_gcm_test.cc b/fipsoracle/cavp_aes_gcm_test.cc
index a476e62..30e1e7b 100644
--- a/fipsoracle/cavp_aes_gcm_test.cc
+++ b/fipsoracle/cavp_aes_gcm_test.cc
@@ -27,11 +27,15 @@
 #include "cavp_test_util.h"
 
 
+namespace {
+
 struct TestCtx {
   const EVP_AEAD *aead;
   std::unique_ptr<FileTest> response_sample;
 };
 
+}
+
 static const EVP_AEAD *GetAEAD(const std::string &name, const bool enc) {
   if (name == "aes-128-gcm") {
     return EVP_aead_aes_128_gcm_fips_testonly();
@@ -168,9 +172,7 @@
   return 1;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_aes_gcm_test_main(int argc, char **argv) {
   if (argc < 4 || argc > 5) {
     return usage(argv[0]);
   }
diff --git a/fipsoracle/cavp_aes_test.cc b/fipsoracle/cavp_aes_test.cc
index c341e85..d116759 100644
--- a/fipsoracle/cavp_aes_test.cc
+++ b/fipsoracle/cavp_aes_test.cc
@@ -26,6 +26,8 @@
 #include "cavp_test_util.h"
 
 
+namespace {
+
 struct TestCtx {
   const EVP_CIPHER *cipher;
   std::unique_ptr<FileTest> response_sample;
@@ -37,6 +39,8 @@
   Mode mode;
 };
 
+}
+
 static bool MonteCarlo(const TestCtx *ctx, FileTest *t,
                        const EVP_CIPHER *cipher, std::vector<uint8_t> *out,
                        bool encrypt, std::vector<uint8_t> key,
@@ -231,9 +235,7 @@
   return 1;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_aes_test_main(int argc, char **argv) {
   if (argc < 4 || argc > 5) {
     return usage(argv[0]);
   }
diff --git a/fipsoracle/cavp_ctr_drbg_test.cc b/fipsoracle/cavp_ctr_drbg_test.cc
index 7a47cbf..e3c6076 100644
--- a/fipsoracle/cavp_ctr_drbg_test.cc
+++ b/fipsoracle/cavp_ctr_drbg_test.cc
@@ -25,10 +25,14 @@
 #include "../crypto/test/file_test.h"
 
 
+namespace {
+
 struct TestCtx {
   std::unique_ptr<FileTest> response_sample;
 };
 
+}
+
 static bool TestCTRDRBG(FileTest *t, void *arg) {
   TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
 
@@ -114,9 +118,7 @@
   return 1;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_ctr_drbg_test_main(int argc, char **argv) {
   if (argc != 2 && argc != 3) {
     return usage(argv[0]);
   }
diff --git a/fipsoracle/cavp_ecdsa2_keypair_test.cc b/fipsoracle/cavp_ecdsa2_keypair_test.cc
index d342254..f4653ab 100644
--- a/fipsoracle/cavp_ecdsa2_keypair_test.cc
+++ b/fipsoracle/cavp_ecdsa2_keypair_test.cc
@@ -77,9 +77,7 @@
   return true;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_ecdsa2_keypair_test_main(int argc, char **argv) {
   if (argc != 2) {
     fprintf(stderr, "usage: %s <test file>\n",
             argv[0]);
diff --git a/fipsoracle/cavp_ecdsa2_pkv_test.cc b/fipsoracle/cavp_ecdsa2_pkv_test.cc
index 74c9da1..942405e 100644
--- a/fipsoracle/cavp_ecdsa2_pkv_test.cc
+++ b/fipsoracle/cavp_ecdsa2_pkv_test.cc
@@ -51,9 +51,7 @@
   return true;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_ecdsa2_pkv_test_main(int argc, char **argv) {
   if (argc != 2) {
     fprintf(stderr, "usage: %s <test file>\n",
             argv[0]);
diff --git a/fipsoracle/cavp_ecdsa2_siggen_test.cc b/fipsoracle/cavp_ecdsa2_siggen_test.cc
index a1be9ae..e97d161 100644
--- a/fipsoracle/cavp_ecdsa2_siggen_test.cc
+++ b/fipsoracle/cavp_ecdsa2_siggen_test.cc
@@ -98,9 +98,7 @@
   return TestECDSA2SigGenImpl(t, true);
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_ecdsa2_siggen_test_main(int argc, char **argv) {
   if (argc != 3) {
     fprintf(stderr, "usage: %s (SigGen|SigGenComponent) <test file>\n",
             argv[0]);
diff --git a/fipsoracle/cavp_ecdsa2_sigver_test.cc b/fipsoracle/cavp_ecdsa2_sigver_test.cc
index 9401854..93c1b48 100644
--- a/fipsoracle/cavp_ecdsa2_sigver_test.cc
+++ b/fipsoracle/cavp_ecdsa2_sigver_test.cc
@@ -69,9 +69,7 @@
   return true;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_ecdsa2_sigver_test_main(int argc, char **argv) {
   if (argc != 2) {
     fprintf(stderr, "usage: %s <test file>\n",
             argv[0]);
diff --git a/fipsoracle/cavp_hmac_test.cc b/fipsoracle/cavp_hmac_test.cc
index 98e64dc..9c4f221 100644
--- a/fipsoracle/cavp_hmac_test.cc
+++ b/fipsoracle/cavp_hmac_test.cc
@@ -89,9 +89,7 @@
   return 1;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_hmac_test_main(int argc, char **argv) {
   if (argc != 2) {
     return usage(argv[0]);
   }
diff --git a/fipsoracle/cavp_keywrap_test.cc b/fipsoracle/cavp_keywrap_test.cc
index 8ddf6f6..ebb40b4 100644
--- a/fipsoracle/cavp_keywrap_test.cc
+++ b/fipsoracle/cavp_keywrap_test.cc
@@ -25,11 +25,15 @@
 #include "cavp_test_util.h"
 
 
+namespace {
+
 struct TestCtx {
   bool encrypt;
   std::unique_ptr<FileTest> response_sample;
 };
 
+}
+
 static bool AESKeyWrap(std::vector<uint8_t> *out, bool encrypt,
                        const std::vector<uint8_t> &key,
                        const std::vector<uint8_t> &in) {
@@ -114,9 +118,7 @@
   return 1;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_keywrap_test_main(int argc, char **argv) {
   if (argc < 4 || argc > 5) {
     return usage(argv[0]);
   }
diff --git a/fipsoracle/cavp_main.cc b/fipsoracle/cavp_main.cc
new file mode 100644
index 0000000..e7bbfb4
--- /dev/null
+++ b/fipsoracle/cavp_main.cc
@@ -0,0 +1,71 @@
+/* Copyright (c) 2017, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+// cavp_main is a wrapper that invokes the main entry function of one of the
+// CAVP validation suite binaries.
+
+#include <stdlib.h>
+#include <cstdio>
+#include <string>
+
+#include <openssl/crypto.h>
+
+#include "cavp_test_util.h"
+
+
+static int usage(char *arg) {
+  fprintf(stderr, "usage: %s <validation suite> <args ...>\n", arg);
+  return 1;
+}
+
+struct TestSuite {
+  std::string name;
+  int (*main_func)(int argc, char **argv);
+};
+
+static TestSuite all_test_suites[] = {
+    {"aes", &cavp_aes_test_main},
+    {"aes_gcm", &cavp_aes_gcm_test_main},
+    {"ctr_drbg", &cavp_ctr_drbg_test_main},
+    {"ecdsa2_keypair", &cavp_ecdsa2_keypair_test_main},
+    {"ecdsa2_pkv", &cavp_ecdsa2_pkv_test_main},
+    {"ecdsa2_siggen", &cavp_ecdsa2_siggen_test_main},
+    {"ecdsa2_sigver", &cavp_ecdsa2_sigver_test_main},
+    {"hmac", &cavp_hmac_test_main},
+    {"keywrap", &cavp_keywrap_test_main},
+    {"rsa2_keygen", &cavp_rsa2_keygen_test_main},
+    {"rsa2_siggen", &cavp_rsa2_siggen_test_main},
+    {"rsa2_sigver", &cavp_rsa2_sigver_test_main},
+    {"sha", &cavp_sha_test_main},
+    {"sha_monte", &cavp_sha_monte_test_main},
+    {"tdes", &cavp_tdes_test_main}
+};
+
+int main(int argc, char **argv) {
+  CRYPTO_library_init();
+
+  if (argc < 3) {
+    return usage(argv[0]);
+  }
+
+  const std::string suite(argv[1]);
+  for (const TestSuite &s : all_test_suites) {
+    if (s.name == suite) {
+      return s.main_func(argc - 1, &argv[1]);
+    }
+  }
+
+  fprintf(stderr, "invalid test suite: %s\n\n", argv[1]);
+  return usage(argv[0]);
+}
diff --git a/fipsoracle/cavp_rsa2_keygen_test.cc b/fipsoracle/cavp_rsa2_keygen_test.cc
index c91aa7d..e0ce3a1 100644
--- a/fipsoracle/cavp_rsa2_keygen_test.cc
+++ b/fipsoracle/cavp_rsa2_keygen_test.cc
@@ -25,6 +25,7 @@
 #include "../crypto/test/file_test.h"
 #include "cavp_test_util.h"
 
+
 static bool TestRSA2KeyGen(FileTest *t, void *arg) {
   std::string mod_str, table, count_str;
   if (!t->GetInstruction(&mod_str, "mod") ||
@@ -79,9 +80,7 @@
   return true;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_rsa2_keygen_test_main(int argc, char **argv) {
   if (argc != 2) {
     fprintf(stderr, "usage: %s <test file>\n",
             argv[0]);
diff --git a/fipsoracle/cavp_rsa2_siggen_test.cc b/fipsoracle/cavp_rsa2_siggen_test.cc
index 1a0f773..069adad 100644
--- a/fipsoracle/cavp_rsa2_siggen_test.cc
+++ b/fipsoracle/cavp_rsa2_siggen_test.cc
@@ -26,11 +26,15 @@
 #include "../crypto/test/file_test.h"
 #include "cavp_test_util.h"
 
+namespace {
+
 struct TestCtx {
   bssl::UniquePtr<RSA> key;
   bool is_pss;
 };
 
+}
+
 static bool TestRSA2SigGen(FileTest *t, void *arg) {
   TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
 
@@ -100,9 +104,7 @@
   return true;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_rsa2_siggen_test_main(int argc, char **argv) {
   if (argc != 3) {
     fprintf(stderr, "usage: %s (pkcs15|pss) <test file>\n",
             argv[0]);
diff --git a/fipsoracle/cavp_rsa2_sigver_test.cc b/fipsoracle/cavp_rsa2_sigver_test.cc
index 631c2de..bf1ea2d 100644
--- a/fipsoracle/cavp_rsa2_sigver_test.cc
+++ b/fipsoracle/cavp_rsa2_sigver_test.cc
@@ -27,11 +27,16 @@
 #include "../crypto/test/file_test.h"
 #include "cavp_test_util.h"
 
+
+namespace {
+
 struct TestCtx {
   std::vector<uint8_t> N;
   bool is_pss;
 };
 
+}
+
 static bool TestRSA2SigVer(FileTest *t, void *arg) {
   TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
 
@@ -93,9 +98,7 @@
   return true;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_rsa2_sigver_test_main(int argc, char **argv) {
   if (argc != 3) {
     fprintf(stderr, "usage: %s (pkcs15|pss) <test file>\n",
             argv[0]);
diff --git a/fipsoracle/cavp_sha_monte_test.cc b/fipsoracle/cavp_sha_monte_test.cc
index 47b885e..91fbc6c 100644
--- a/fipsoracle/cavp_sha_monte_test.cc
+++ b/fipsoracle/cavp_sha_monte_test.cc
@@ -25,10 +25,14 @@
 #include "cavp_test_util.h"
 
 
+namespace {
+
 struct TestCtx {
   std::string hash;
 };
 
+}
+
 static bool TestSHAMonte(FileTest *t, void *arg) {
   TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
 
@@ -82,9 +86,7 @@
   return 1;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_sha_monte_test_main(int argc, char **argv) {
   if (argc != 3) {
     return usage(argv[0]);
   }
diff --git a/fipsoracle/cavp_sha_test.cc b/fipsoracle/cavp_sha_test.cc
index ca60bb0..a7d6ba1 100644
--- a/fipsoracle/cavp_sha_test.cc
+++ b/fipsoracle/cavp_sha_test.cc
@@ -24,11 +24,14 @@
 #include "../crypto/test/file_test.h"
 #include "cavp_test_util.h"
 
+namespace {
 
 struct TestCtx {
   std::string hash;
 };
 
+}
+
 static bool TestSHA(FileTest *t, void *arg) {
   TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
 
@@ -77,9 +80,7 @@
   return 1;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_sha_test_main(int argc, char **argv) {
   if (argc != 3) {
     return usage(argv[0]);
   }
diff --git a/fipsoracle/cavp_tdes_test.cc b/fipsoracle/cavp_tdes_test.cc
index f499ebe..fd357ff 100644
--- a/fipsoracle/cavp_tdes_test.cc
+++ b/fipsoracle/cavp_tdes_test.cc
@@ -26,6 +26,8 @@
 #include "cavp_test_util.h"
 
 
+namespace {
+
 struct TestCtx {
   const EVP_CIPHER *cipher;
   std::unique_ptr<FileTest> response_sample;
@@ -37,6 +39,8 @@
   Mode mode;
 };
 
+}
+
 static bool TestKAT(FileTest *t, void *arg) {
   TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
 
@@ -325,9 +329,7 @@
   return 1;
 }
 
-int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
+int cavp_tdes_test_main(int argc, char **argv) {
   if (argc < 4 || argc > 5) {
     return usage(argv[0]);
   }
diff --git a/fipsoracle/cavp_test_util.h b/fipsoracle/cavp_test_util.h
index 3f5330c..d851c5e 100644
--- a/fipsoracle/cavp_test_util.h
+++ b/fipsoracle/cavp_test_util.h
@@ -52,5 +52,21 @@
 
 const EVP_MD *GetDigestFromInstruction(FileTest *t);
 
+int cavp_aes_gcm_test_main(int argc, char **argv);
+int cavp_aes_test_main(int argc, char **argv);
+int cavp_ctr_drbg_test_main(int argc, char **argv);
+int cavp_ecdsa2_keypair_test_main(int argc, char **argv);
+int cavp_ecdsa2_pkv_test_main(int argc, char **argv);
+int cavp_ecdsa2_siggen_test_main(int argc, char **argv);
+int cavp_ecdsa2_sigver_test_main(int argc, char **argv);
+int cavp_hmac_test_main(int argc, char **argv);
+int cavp_keywrap_test_main(int argc, char **argv);
+int cavp_rsa2_keygen_test_main(int argc, char **argv);
+int cavp_rsa2_siggen_test_main(int argc, char **argv);
+int cavp_rsa2_sigver_test_main(int argc, char **argv);
+int cavp_sha_monte_test_main(int argc, char **argv);
+int cavp_sha_test_main(int argc, char **argv);
+int cavp_tdes_test_main(int argc, char **argv);
+
 
 #endif  // OPENSSL_HEADER_CRYPTO_FIPSMODULE_CAVP_TEST_UTIL_H
diff --git a/fipsoracle/run_cavp.go b/fipsoracle/run_cavp.go
index fa7f089..d0b389d 100644
--- a/fipsoracle/run_cavp.go
+++ b/fipsoracle/run_cavp.go
@@ -13,8 +13,8 @@
 )
 
 var (
-	binaryDir = flag.String("bin-dir", "", "Directory containing fipsoracle binaries")
-	suiteDir  = flag.String("suite-dir", "", "Base directory containing the CAVP test suite")
+	oraclePath = flag.String("oracle-bin", "", "Path to the oracle binary")
+	suiteDir   = flag.String("suite-dir", "", "Base directory containing the CAVP test suite")
 )
 
 // test describes a single request file.
@@ -35,8 +35,8 @@
 type testSuite struct {
 	// directory is the name of the directory in the CAVP input, i.e. “AES”.
 	directory string
-	// binary is the name of the binary that can process these tests.
-	binary string
+	// suite names the test suite to pass as the first command-line argument.
+	suite string
 	// faxScanFunc, if not nil, is the function to use instead of
 	// (*bufio.Scanner).Scan. This can be used to skip lines.
 	faxScanFunc func(*bufio.Scanner) bool
@@ -49,7 +49,7 @@
 
 var aesGCMTests = testSuite{
 	"AES_GCM",
-	"cavp_aes_gcm_test",
+	"aes_gcm",
 	nil,
 	[]test{
 		{"gcmDecrypt128", []string{"dec", "aes-128-gcm"}, false},
@@ -61,7 +61,7 @@
 
 var aesTests = testSuite{
 	"AES",
-	"cavp_aes_test",
+	"aes",
 	nil,
 	[]test{
 		{"CBCGFSbox128", []string{"kat", "aes-128-cbc"}, false},
@@ -106,21 +106,21 @@
 
 var ecdsa2KeyPairTests = testSuite{
 	"ECDSA2",
-	"cavp_ecdsa2_keypair_test",
+	"ecdsa2_keypair",
 	nil,
 	[]test{{"KeyPair", nil, true}},
 }
 
 var ecdsa2PKVTests = testSuite{
 	"ECDSA2",
-	"cavp_ecdsa2_pkv_test",
+	"ecdsa2_pkv",
 	nil,
 	[]test{{"PKV", nil, false}},
 }
 
 var ecdsa2SigGenTests = testSuite{
 	"ECDSA2",
-	"cavp_ecdsa2_siggen_test",
+	"ecdsa2_siggen",
 	nil,
 	[]test{
 		{"SigGen", []string{"SigGen"}, true},
@@ -130,14 +130,14 @@
 
 var ecdsa2SigVerTests = testSuite{
 	"ECDSA2",
-	"cavp_ecdsa2_sigver_test",
+	"ecdsa2_sigver",
 	nil,
 	[]test{{"SigVer", nil, false}},
 }
 
 var rsa2KeyGenTests = testSuite{
 	"RSA2",
-	"cavp_rsa2_keygen_test",
+	"rsa2_keygen",
 	nil,
 	[]test{
 		{"KeyGen_RandomProbablyPrime3_3", nil, true},
@@ -146,7 +146,7 @@
 
 var rsa2SigGenTests = testSuite{
 	"RSA2",
-	"cavp_rsa2_siggen_test",
+	"rsa2_siggen",
 	nil,
 	[]test{
 		{"SigGen15_186-3", []string{"pkcs15"}, true},
@@ -156,7 +156,7 @@
 
 var rsa2SigVerTests = testSuite{
 	"RSA2",
-	"cavp_rsa2_sigver_test",
+	"rsa2_sigver",
 	func(s *bufio.Scanner) bool {
 		for {
 			if !s.Scan() {
@@ -188,14 +188,14 @@
 
 var hmacTests = testSuite{
 	"HMAC",
-	"cavp_hmac_test",
+	"hmac",
 	nil,
 	[]test{{"HMAC", nil, false}},
 }
 
 var shaTests = testSuite{
 	"SHA",
-	"cavp_sha_test",
+	"sha",
 	nil,
 	[]test{
 		{"SHA1LongMsg", []string{"SHA1"}, false},
@@ -213,7 +213,7 @@
 
 var shaMonteTests = testSuite{
 	"SHA",
-	"cavp_sha_monte_test",
+	"sha_monte",
 	nil,
 	[]test{
 		{"SHA1Monte", []string{"SHA1"}, false},
@@ -226,14 +226,14 @@
 
 var ctrDRBGTests = testSuite{
 	"DRBG800-90A",
-	"cavp_ctr_drbg_test",
+	"ctr_drbg",
 	nil,
 	[]test{{"CTR_DRBG", nil, false}},
 }
 
 var tdesTests = testSuite{
 	"TDES",
-	"cavp_tdes_test",
+	"tdes",
 	nil,
 	[]test{
 		{"TCBCMMT2", []string{"kat", "des-ede-cbc"}, false},
@@ -259,7 +259,7 @@
 
 var keyWrapTests = testSuite{
 	"KeyWrap38F",
-	"cavp_keywrap_test",
+	"keywrap",
 	nil,
 	[]test{
 		{"KW_AD_128", []string{"dec", "128"}, false},
@@ -290,8 +290,8 @@
 func main() {
 	flag.Parse()
 
-	if len(*binaryDir) == 0 {
-		fmt.Fprintf(os.Stderr, "Must give -bin-dir\n")
+	if len(*oraclePath) == 0 {
+		fmt.Fprintf(os.Stderr, "Must give -oracle-bin\n")
 		os.Exit(1)
 	}
 
@@ -313,9 +313,7 @@
 }
 
 func doTest(suite *testSuite, test test) error {
-	binary := filepath.Join(*binaryDir, suite.binary)
-
-	var args []string
+	args := []string{suite.suite}
 	args = append(args, test.args...)
 	args = append(args, filepath.Join(suite.getDirectory(), "req", test.inFile+".req"))
 
@@ -326,12 +324,14 @@
 	}
 	defer outFile.Close()
 
-	cmd := exec.Command(binary, args...)
+	cmd := exec.Command(*oraclePath, args...)
 	cmd.Stdout = outFile
 	cmd.Stderr = os.Stderr
 
+	cmdLine := strings.Join(append([]string{*oraclePath}, args...), " ")
+	fmt.Println("Running", cmdLine)
 	if err := cmd.Run(); err != nil {
-		return fmt.Errorf("cannot run command for %q %q (%s): %s", suite.getDirectory(), test.inFile, strings.Join(append([]string{binary}, args...), " "), err)
+		return fmt.Errorf("cannot run command for %q %q (%s): %s", suite.getDirectory(), test.inFile, cmdLine, err)
 	}
 
 	return nil