Drop CAVP code.

All FIPS testing is done with ACVP now. We can delete all the CAVP
stuff.

Change-Id: I459873474e40b0371f9cf760090a130ef9a90a8c
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/51330
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: Adam Langley <agl@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c64ba8e..35ff4c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -593,7 +593,7 @@
 add_subdirectory(ssl)
 add_subdirectory(ssl/test)
 add_subdirectory(tool)
-add_subdirectory(util/fipstools/cavp)
+add_subdirectory(util/fipstools)
 add_subdirectory(util/fipstools/acvp/modulewrapper)
 add_subdirectory(decrepit)
 
diff --git a/crypto/fipsmodule/FIPS.md b/crypto/fipsmodule/FIPS.md
index 9e4463a..3a733a8 100644
--- a/crypto/fipsmodule/FIPS.md
+++ b/crypto/fipsmodule/FIPS.md
@@ -13,12 +13,9 @@
 1. 2019-08-08: certificate [#3678](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/3678), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Security-Policy-20190808.docx) (in docx format).
 1. 2019-10-20: certificate [#3753](https://csrc.nist.gov/Projects/Cryptographic-Module-Validation-Program/Certificate/3753), [security policy](/crypto/fipsmodule/policydocs/BoringCrypto-Android-Security-Policy-20191020.docx) (in docx format).
 
-## Running CAVP tests
+## Running ACVP tests
 
-CAVP results are calculated by `util/fipstools/cavp`, but that binary is almost always run by `util/fipstools/run_cavp.go`. The latter knows the set of tests to be processed and the flags needed to configure `cavp` for each one. It must be run from the top of a CAVP directory and needs the following options:
-
-1. `-oracle-bin`: points to the location of `util/fipstools/cavp`
-2. `-no-fax`: this is needed to suppress checking of the FAX files, which are only included in sample sets.
+See `util/fipstools/acvp/ACVP.md` for details of how ACVP testing is done.
 
 ## Breaking known-answer and continuous tests
 
diff --git a/util/fipstools/CMakeLists.txt b/util/fipstools/CMakeLists.txt
new file mode 100644
index 0000000..6359383
--- /dev/null
+++ b/util/fipstools/CMakeLists.txt
@@ -0,0 +1,12 @@
+include_directories(../../include)
+
+if(FIPS)
+  add_executable(
+    test_fips
+
+    test_fips.c
+  )
+
+  add_dependencies(test_fips global_target)
+  target_link_libraries(test_fips crypto)
+endif()
diff --git a/util/fipstools/cavp/CMakeLists.txt b/util/fipstools/cavp/CMakeLists.txt
deleted file mode 100644
index a50c9ab..0000000
--- a/util/fipstools/cavp/CMakeLists.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-include_directories(../../../include)
-
-if(FIPS)
-  add_executable(
-    cavp
-
-    cavp_main.cc
-
-    cavp_aes_gcm_test.cc
-    cavp_aes_test.cc
-    cavp_ctr_drbg_test.cc
-    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_kas_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_tlskdf_test.cc
-
-    cavp_test_util.cc
-  )
-
-  add_dependencies(cavp global_target)
-
-  add_executable(
-    test_fips
-
-    test_fips.c
-  )
-
-  add_dependencies(test_fips global_target)
-
-  target_link_libraries(cavp test_support_lib crypto)
-  target_link_libraries(test_fips test_support_lib crypto)
-endif()
diff --git a/util/fipstools/cavp/cavp_aes_gcm_test.cc b/util/fipstools/cavp/cavp_aes_gcm_test.cc
deleted file mode 100644
index 6ee991d..0000000
--- a/util/fipstools/cavp/cavp_aes_gcm_test.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-/* 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_aes_gcm_test processes a NIST CAVP AES GCM test vector request file and
-// emits the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/aead.h>
-#include <openssl/cipher.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  const EVP_AEAD *aead;
-};
-
-}
-
-static const EVP_AEAD *GetAEAD(const std::string &name, const bool enc) {
-  if (name == "aes-128-gcm") {
-    return EVP_aead_aes_128_gcm();
-  } else if (name == "aes-192-gcm") {
-    return EVP_aead_aes_192_gcm();
-  } else if (name == "aes-256-gcm") {
-    return EVP_aead_aes_256_gcm();
-  }
-  return nullptr;
-}
-
-static bool TestAEADEncrypt(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  std::string key_len_str, iv_len_str, pt_len_str, aad_len_str, tag_len_str;
-  if (!t->GetInstruction(&key_len_str, "Keylen") ||
-      !t->GetInstruction(&iv_len_str, "IVlen") ||
-      !t->GetInstruction(&pt_len_str, "PTlen") ||
-      !t->GetInstruction(&aad_len_str, "AADlen") ||
-      !t->GetInstruction(&tag_len_str, "Taglen")) {
-    return false;
-  }
-
-  std::string count;
-  std::vector<uint8_t> key, iv, pt, aad, tag, ct;
-  if (!t->GetAttribute(&count, "Count") ||
-      !t->GetBytes(&key, "Key") ||
-      !t->GetBytes(&iv, "IV") ||
-      !t->GetBytes(&pt, "PT") ||
-      !t->GetBytes(&aad, "AAD") ||
-      key.size() * 8 != strtoul(key_len_str.c_str(), nullptr, 0) ||
-      iv.size() * 8 != strtoul(iv_len_str.c_str(), nullptr, 0) ||
-      pt.size() * 8 != strtoul(pt_len_str.c_str(), nullptr, 0) ||
-      aad.size() * 8 != strtoul(aad_len_str.c_str(), nullptr, 0) ||
-      iv.size() != 12) {
-    return false;
-  }
-
-  const size_t tag_len = strtoul(tag_len_str.c_str(), nullptr, 0) / 8;
-  if (!AEADEncrypt(ctx->aead, &ct, &tag, tag_len, key, pt, aad, iv)) {
-    return false;
-  }
-  printf("%s", t->CurrentTestToString().c_str());
-  printf("CT = %s\r\n", EncodeHex(ct).c_str());
-  printf("Tag = %s\r\n\r\n", EncodeHex(tag).c_str());
-
-  return true;
-}
-
-static bool TestAEADDecrypt(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  std::string key_len, iv_len, pt_len_str, aad_len_str, tag_len;
-  if (!t->GetInstruction(&key_len, "Keylen") ||
-      !t->GetInstruction(&iv_len, "IVlen") ||
-      !t->GetInstruction(&pt_len_str, "PTlen") ||
-      !t->GetInstruction(&aad_len_str, "AADlen") ||
-      !t->GetInstruction(&tag_len, "Taglen")) {
-    t->PrintLine("Invalid instruction block.");
-    return false;
-  }
-  size_t aad_len = strtoul(aad_len_str.c_str(), nullptr, 0) / 8;
-  size_t pt_len = strtoul(pt_len_str.c_str(), nullptr, 0) / 8;
-
-  std::string count;
-  std::vector<uint8_t> key, iv, ct, aad, tag, pt;
-  if (!t->GetAttribute(&count, "Count") ||
-      !t->GetBytes(&key, "Key") ||
-      !t->GetBytes(&aad, "AAD") ||
-      !t->GetBytes(&tag, "Tag") ||
-      !t->GetBytes(&iv, "IV") ||
-      !t->GetBytes(&ct, "CT") ||
-      key.size() * 8 != strtoul(key_len.c_str(), nullptr, 0) ||
-      iv.size() * 8 != strtoul(iv_len.c_str(), nullptr, 0) ||
-      ct.size() != pt_len ||
-      aad.size() != aad_len ||
-      tag.size() * 8 != strtoul(tag_len.c_str(), nullptr, 0)) {
-    t->PrintLine("Invalid test case");
-    return false;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-  bool aead_result =
-      AEADDecrypt(ctx->aead, &pt, pt_len, key, aad, ct, tag, iv);
-  if (aead_result) {
-    printf("PT = %s\r\n\r\n", EncodeHex(pt).c_str());
-  } else {
-    printf("FAIL\r\n\r\n");
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s (enc|dec) <cipher> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_aes_gcm_test_main(int argc, char **argv) {
-  if (argc != 4) {
-    return usage(argv[0]);
-  }
-
-  const std::string mode(argv[1]);
-  bool (*test_fn)(FileTest * t, void *arg);
-  if (mode == "enc") {
-    test_fn = &TestAEADEncrypt;
-  } else if (mode == "dec") {
-    test_fn = &TestAEADDecrypt;
-  } else {
-    return usage(argv[0]);
-  }
-
-  const EVP_AEAD *aead = GetAEAD(argv[2], mode == "enc");
-  if (aead == nullptr) {
-    fprintf(stderr, "invalid aead: %s\n", argv[2]);
-    return 1;
-  }
-
-  TestCtx ctx = {aead};
-
-  FileTest::Options opts;
-  opts.path = argv[3];
-  opts.callback = test_fn;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_aes_test.cc b/util/fipstools/cavp/cavp_aes_test.cc
deleted file mode 100644
index d1f49b4..0000000
--- a/util/fipstools/cavp/cavp_aes_test.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/* 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_aes_test processes a NIST CAVP AES test vector request file and emits
-// the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/cipher.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  const EVP_CIPHER *cipher;
-  bool has_iv;
-  enum Mode {
-    kKAT,  // Known Answer Test
-    kMCT,  // Monte Carlo Test
-  };
-  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,
-                       std::vector<uint8_t> iv, std::vector<uint8_t> in) {
-  const std::string in_label = encrypt ? "PLAINTEXT" : "CIPHERTEXT",
-                    result_label = encrypt ? "CIPHERTEXT" : "PLAINTEXT";
-  std::vector<uint8_t> prev_result, result, prev_in;
-  for (int i = 0; i < 100; i++) {
-    printf("COUNT = %d\r\nKEY = %s\r\n", i, EncodeHex(key).c_str());
-    if (ctx->has_iv) {
-      printf("IV = %s\r\n", EncodeHex(iv).c_str());
-    }
-    printf("%s = %s\r\n", in_label.c_str(), EncodeHex(in).c_str());
-
-    if (!ctx->has_iv) {  // ECB mode
-      for (int j = 0; j < 1000; j++) {
-        prev_result = result;
-        if (!CipherOperation(cipher, &result, encrypt, key, iv, in)) {
-          return false;
-        }
-        in = result;
-      }
-    } else {
-      for (int j = 0; j < 1000; j++) {
-        prev_result = result;
-        if (j > 0) {
-          if (encrypt) {
-            iv = result;
-          } else {
-            iv = prev_in;
-          }
-        }
-
-        if (!CipherOperation(cipher, &result, encrypt, key, iv, in)) {
-          return false;
-        }
-
-        prev_in = in;
-
-        if (j == 0) {
-          in = iv;
-        } else {
-          in = prev_result;
-        }
-      }
-    }
-
-    printf("%s = %s\r\n\r\n", result_label.c_str(), EncodeHex(result).c_str());
-
-    const size_t key_len = key.size() * 8;
-    if (key_len == 128) {
-      for (size_t k = 0; k < key.size(); k++) {
-        key[k] ^= result[k];
-      }
-    } else if (key_len == 192) {
-      for (size_t k = 0; k < key.size(); k++) {
-        // Key[i+1] = Key[i] xor (last 64-bits of CT[j-1] || CT[j])
-        if (k < 8) {
-          key[k] ^= prev_result[prev_result.size() - 8 + k];
-        } else {
-          key[k] ^= result[k - 8];
-        }
-      }
-    } else {  // key_len == 256
-      for (size_t k = 0; k < key.size(); k++) {
-        // Key[i+1] = Key[i] xor (CT[j-1] || CT[j])
-        if (k < 16) {
-          key[k] ^= prev_result[k];
-        } else {
-          key[k] ^= result[k - 16];
-        }
-      }
-    }
-
-    if (ctx->has_iv) {
-      iv = result;
-      in = prev_result;
-    } else {
-      in = result;
-    }
-  }
-
-  return true;
-}
-
-static bool TestCipher(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  if (t->HasInstruction("ENCRYPT") == t->HasInstruction("DECRYPT")) {
-    t->PrintLine("Want either ENCRYPT or DECRYPT");
-    return false;
-  }
-  enum {
-    kEncrypt,
-    kDecrypt,
-  } operation = t->HasInstruction("ENCRYPT") ? kEncrypt : kDecrypt;
-
-  std::string count;
-  std::vector<uint8_t> key, iv, in, result;
-  if (!t->GetAttribute(&count, "COUNT") ||
-      !t->GetBytes(&key, "KEY") ||
-      (ctx->has_iv && !t->GetBytes(&iv, "IV"))) {
-    return false;
-  }
-
-  const EVP_CIPHER *cipher = ctx->cipher;
-  if (operation == kEncrypt) {
-    if (!t->GetBytes(&in, "PLAINTEXT")) {
-      return false;
-    }
-  } else {  // operation == kDecrypt
-    if (!t->GetBytes(&in, "CIPHERTEXT")) {
-      return false;
-    }
-  }
-
-  if (ctx->mode == TestCtx::kKAT) {
-    if (!CipherOperation(cipher, &result, operation == kEncrypt, key, iv, in)) {
-      return false;
-    }
-    const std::string label =
-        operation == kEncrypt ? "CIPHERTEXT" : "PLAINTEXT";
-    printf("%s%s = %s\r\n\r\n", t->CurrentTestToString().c_str(), label.c_str(),
-           EncodeHex(result).c_str());
-  } else {  // ctx->mode == kMCT
-    const std::string op_label =
-        operation == kEncrypt ? "[ENCRYPT]" : "[DECRYPT]";
-    printf("%s\r\n\r\n", op_label.c_str());
-    if (!MonteCarlo(ctx, t, cipher, &result, operation == kEncrypt, key, iv,
-                    in)) {
-      return false;
-    }
-    if (operation == kEncrypt) {
-      // MCT tests contain a stray blank line after the ENCRYPT section.
-      printf("\r\n");
-    }
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s (kat|mct) <cipher> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_aes_test_main(int argc, char **argv) {
-  if (argc != 4) {
-    return usage(argv[0]);
-  }
-
-  const std::string tm(argv[1]);
-  enum TestCtx::Mode test_mode;
-  if (tm == "kat") {
-    test_mode = TestCtx::kKAT;
-  } else if (tm == "mct") {
-    test_mode = TestCtx::kMCT;
-  } else {
-    fprintf(stderr, "invalid test_mode: %s\n", tm.c_str());
-    return usage(argv[0]);
-  }
-
-  const std::string cipher_name(argv[2]);
-  const EVP_CIPHER *cipher = GetCipher(argv[2]);
-  if (cipher == nullptr) {
-    fprintf(stderr, "invalid cipher: %s\n", argv[2]);
-    return 1;
-  }
-  const bool has_iv =
-      (cipher_name != "aes-128-ecb" &&
-       cipher_name != "aes-192-ecb" &&
-       cipher_name != "aes-256-ecb");
-
-  TestCtx ctx = {cipher, has_iv, test_mode};
-
-  FileTest::Options opts;
-  opts.path = argv[3];
-  opts.callback = TestCipher;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_ctr_drbg_test.cc b/util/fipstools/cavp/cavp_ctr_drbg_test.cc
deleted file mode 100644
index a27736e..0000000
--- a/util/fipstools/cavp/cavp_ctr_drbg_test.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/* 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_ctr_drbg_test processes a NIST CAVP DRBG800-90A test vector request
-// file and emits the corresponding response.
-
-#include <openssl/crypto.h>
-
-#include <stdlib.h>
-
-#include "cavp_test_util.h"
-#include "../crypto/fipsmodule/rand/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-
-
-static bool TestCTRDRBG(FileTest *t, void *arg) {
-  std::string test_type, prediction_resistance, entropy_input_len, nonce_len,
-      personalization_str_len, additional_input_len, returned_bits_len;
-  if (!t->GetInstruction(&test_type, "AES-256 no df") ||
-      !t->GetInstruction(&prediction_resistance, "PredictionResistance") ||
-      !t->GetInstruction(&entropy_input_len, "EntropyInputLen") ||
-      !t->GetInstruction(&nonce_len, "NonceLen") ||
-      !t->GetInstruction(&personalization_str_len,
-                         "PersonalizationStringLen") ||
-      !t->GetInstruction(&additional_input_len, "AdditionalInputLen") ||
-      !t->GetInstruction(&returned_bits_len, "ReturnedBitsLen") ||
-      !test_type.empty() ||
-      prediction_resistance != "False" ||
-      strtoul(entropy_input_len.c_str(), nullptr, 0) !=
-          CTR_DRBG_ENTROPY_LEN * 8 ||
-      nonce_len != "0") {
-    return false;
-  }
-
-  std::string count;
-  std::vector<uint8_t> entropy, nonce, personalization_str, ai1, ai2;
-  if (!t->GetAttribute(&count, "COUNT") ||
-      !t->GetBytes(&entropy, "EntropyInput") ||
-      !t->GetBytes(&nonce, "Nonce") ||
-      !t->GetBytes(&personalization_str, "PersonalizationString") ||
-      !t->GetBytes(&ai1, "AdditionalInput") ||
-      !t->GetBytes(&ai2, "AdditionalInput/2") ||
-      entropy.size() * 8 != strtoul(entropy_input_len.c_str(), nullptr, 0) ||
-      nonce.size() != 0 ||
-      personalization_str.size() * 8 !=
-          strtoul(personalization_str_len.c_str(), nullptr, 0) ||
-      ai1.size() != ai2.size() ||
-      ai1.size() * 8 != strtoul(additional_input_len.c_str(), nullptr, 0)) {
-    return false;
-  }
-
-  CTR_DRBG_STATE drbg;
-  CTR_DRBG_init(&drbg, entropy.data(),
-                personalization_str.size() > 0 ? personalization_str.data()
-                                               : nullptr,
-                personalization_str.size());
-
-  uint64_t out_len = strtoul(returned_bits_len.c_str(), nullptr, 0);
-  if (out_len == 0 || (out_len & 7) != 0) {
-    return false;
-  }
-  out_len /= 8;
-
-  std::vector<uint8_t> out;
-  out.resize(out_len);
-
-  CTR_DRBG_generate(&drbg, out.data(), out.size(),
-                    ai1.size() > 0 ? ai1.data() : nullptr, ai1.size());
-  CTR_DRBG_generate(&drbg, out.data(), out.size(),
-                    ai2.size() > 0 ? ai2.data() : nullptr, ai2.size());
-
-  printf("%s", t->CurrentTestToString().c_str());
-  printf("ReturnedBits = %s\r\n\r\n", EncodeHex(out).c_str());
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <test file>\n", arg);
-  return 1;
-}
-
-int cavp_ctr_drbg_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    return usage(argv[0]);
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestCTRDRBG;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_ecdsa2_keypair_test.cc b/util/fipstools/cavp/cavp_ecdsa2_keypair_test.cc
deleted file mode 100644
index f8c4a01..0000000
--- a/util/fipstools/cavp/cavp_ecdsa2_keypair_test.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/* 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_ecdsa2_keypair_test processes a NIST CAVP ECDSA2 KeyPair test vector
-// request file and emits the corresponding response.
-
-#include <stdlib.h>
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/ec_key.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestECDSA2KeyPair(FileTest *t, void *arg) {
-  std::string n_str;
-  const char *group_str;
-  int nid = GetECGroupNIDFromInstruction(t, &group_str);
-  if (nid == NID_undef ||
-      !t->GetAttribute(&n_str, "N")) {
-    return false;
-  }
-
-  // Don't use CurrentTestToString to avoid printing the N.
-  printf(
-      "[%s]\r\n\r\n[B.4.2 Key Pair Generation by Testing Candidates]\r\n\r\n",
-      group_str);
-
-  unsigned long n = strtoul(n_str.c_str(), nullptr, 10);
-  for (unsigned long i = 0; i < n; i++) {
-    bssl::UniquePtr<BIGNUM> qx(BN_new()), qy(BN_new());
-    bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
-    if (!key ||
-        !EC_KEY_generate_key_fips(key.get()) ||
-        !EC_POINT_get_affine_coordinates_GFp(EC_KEY_get0_group(key.get()),
-                                             EC_KEY_get0_public_key(key.get()),
-                                             qx.get(), qy.get(), nullptr)) {
-      return false;
-    }
-
-    size_t degree_len =
-        (EC_GROUP_get_degree(EC_KEY_get0_group(key.get())) + 7) / 8;
-    size_t order_len =
-        BN_num_bytes(EC_GROUP_get0_order(EC_KEY_get0_group(key.get())));
-    std::vector<uint8_t> qx_bytes(degree_len), qy_bytes(degree_len);
-    std::vector<uint8_t> d_bytes(order_len);
-    if (!BN_bn2bin_padded(qx_bytes.data(), qx_bytes.size(), qx.get()) ||
-        !BN_bn2bin_padded(qy_bytes.data(), qy_bytes.size(), qy.get()) ||
-        !BN_bn2bin_padded(d_bytes.data(), d_bytes.size(),
-                          EC_KEY_get0_private_key(key.get()))) {
-      return false;
-    }
-
-    printf("d = %s\r\nQx = %s\r\nQy = %s\r\n\r\n", EncodeHex(d_bytes).c_str(),
-           EncodeHex(qx_bytes).c_str(), EncodeHex(qy_bytes).c_str());
-  }
-
-  return true;
-}
-
-int cavp_ecdsa2_keypair_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestECDSA2KeyPair;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_ecdsa2_pkv_test.cc b/util/fipstools/cavp/cavp_ecdsa2_pkv_test.cc
deleted file mode 100644
index d823e7a..0000000
--- a/util/fipstools/cavp/cavp_ecdsa2_pkv_test.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/* 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_ecdsa2_pkv_test processes a NIST CAVP ECDSA2 PKV test vector request file
-// and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/ec_key.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-
-#include "../crypto/test/file_test.h"
-#include "cavp_test_util.h"
-
-
-static bool TestECDSA2PKV(FileTest *t, void *arg) {
-  int nid = GetECGroupNIDFromInstruction(t);
-  if (nid == NID_undef) {
-    return false;
-  }
-  bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
-  bssl::UniquePtr<BIGNUM> qx = GetBIGNUM(t, "Qx");
-  bssl::UniquePtr<BIGNUM> qy = GetBIGNUM(t, "Qy");
-  if (!key || !qx || !qy) {
-    return false;
-  }
-
-  if (EC_KEY_set_public_key_affine_coordinates(key.get(), qx.get(), qy.get())) {
-    printf("%sResult = P\r\n\r\n", t->CurrentTestToString().c_str());
-  } else {
-    char buf[256];
-    ERR_error_string_n(ERR_get_error(), buf, sizeof(buf));
-    printf("%sResult = F (%s)\r\n\r\n", t->CurrentTestToString().c_str(), buf);
-  }
-  ERR_clear_error();
-  return true;
-}
-
-int cavp_ecdsa2_pkv_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestECDSA2PKV;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_ecdsa2_siggen_test.cc b/util/fipstools/cavp/cavp_ecdsa2_siggen_test.cc
deleted file mode 100644
index 1282eaa..0000000
--- a/util/fipstools/cavp/cavp_ecdsa2_siggen_test.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/* 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_ecdsa2_siggen_test processes NIST CAVP ECDSA2 SigGen and
-// SigGenComponent test vector request files and emits the corresponding
-// response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/ec_key.h>
-#include <openssl/ecdsa.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestECDSA2SigGenImpl(FileTest *t, bool is_component) {
-  int nid = GetECGroupNIDFromInstruction(t);
-  const EVP_MD *md = GetDigestFromInstruction(t);
-  if (nid == NID_undef || md == nullptr) {
-    return false;
-  }
-  bssl::UniquePtr<BIGNUM> qx(BN_new()), qy(BN_new());
-  bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
-  std::vector<uint8_t> msg;
-  if (!qx || !qy || !key ||
-      !EC_KEY_generate_key_fips(key.get()) ||
-      !EC_POINT_get_affine_coordinates_GFp(EC_KEY_get0_group(key.get()),
-                                           EC_KEY_get0_public_key(key.get()),
-                                           qx.get(), qy.get(), nullptr) ||
-      !t->GetBytes(&msg, "Msg")) {
-    return false;
-  }
-
-  uint8_t digest[EVP_MAX_MD_SIZE];
-  unsigned digest_len;
-  if (is_component) {
-    if (msg.size() != EVP_MD_size(md)) {
-      t->PrintLine("Bad input length.");
-      return false;
-    }
-    digest_len = EVP_MD_size(md);
-    OPENSSL_memcpy(digest, msg.data(), msg.size());
-  } else if (!EVP_Digest(msg.data(), msg.size(), digest, &digest_len, md,
-                         nullptr)) {
-    return false;
-  }
-
-  bssl::UniquePtr<ECDSA_SIG> sig(ECDSA_do_sign(digest, digest_len, key.get()));
-  if (!sig) {
-    return false;
-  }
-
-  size_t degree_len =
-      (EC_GROUP_get_degree(EC_KEY_get0_group(key.get())) + 7) / 8;
-  size_t order_len =
-      BN_num_bytes(EC_GROUP_get0_order(EC_KEY_get0_group(key.get())));
-  std::vector<uint8_t> qx_bytes(degree_len), qy_bytes(degree_len);
-  std::vector<uint8_t> r_bytes(order_len), s_bytes(order_len);
-  if (!BN_bn2bin_padded(qx_bytes.data(), qx_bytes.size(), qx.get()) ||
-      !BN_bn2bin_padded(qy_bytes.data(), qy_bytes.size(), qy.get()) ||
-      !BN_bn2bin_padded(r_bytes.data(), r_bytes.size(), sig->r) ||
-      !BN_bn2bin_padded(s_bytes.data(), s_bytes.size(), sig->s)) {
-    return false;
-  }
-
-  printf("%sQx = %s\r\nQy = %s\r\nR = %s\r\nS = %s\r\n\r\n",
-         t->CurrentTestToString().c_str(), EncodeHex(qx_bytes).c_str(),
-         EncodeHex(qy_bytes).c_str(), EncodeHex(r_bytes).c_str(),
-         EncodeHex(s_bytes).c_str());
-  return true;
-}
-
-static bool TestECDSA2SigGen(FileTest *t, void *arg) {
-  return TestECDSA2SigGenImpl(t, false);
-}
-
-static bool TestECDSA2SigGenComponent(FileTest *t, void *arg) {
-  return TestECDSA2SigGenImpl(t, true);
-}
-
-int cavp_ecdsa2_siggen_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    fprintf(stderr, "usage: %s (SigGen|SigGenComponent) <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  static bool (*test_func)(FileTest *, void *);
-  if (strcmp(argv[1], "SigGen") == 0) {
-    test_func = TestECDSA2SigGen;
-  } else if (strcmp(argv[1], "SigGenComponent") == 0) {
-    test_func = TestECDSA2SigGenComponent;
-  } else {
-    fprintf(stderr, "Unknown test type: %s\n", argv[1]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = test_func;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_ecdsa2_sigver_test.cc b/util/fipstools/cavp/cavp_ecdsa2_sigver_test.cc
deleted file mode 100644
index f3fd4b1..0000000
--- a/util/fipstools/cavp/cavp_ecdsa2_sigver_test.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-/* 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_ecdsa2_sigver_test processes a NIST CAVP ECDSA2 SigVer test vector
-// request file and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/ec_key.h>
-#include <openssl/ecdsa.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-
-#include "../crypto/test/file_test.h"
-#include "cavp_test_util.h"
-
-
-static bool TestECDSA2SigVer(FileTest *t, void *arg) {
-  int nid = GetECGroupNIDFromInstruction(t);
-  const EVP_MD *md = GetDigestFromInstruction(t);
-  if (nid == NID_undef || md == nullptr) {
-    return false;
-  }
-  bssl::UniquePtr<ECDSA_SIG> sig(ECDSA_SIG_new());
-  bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(nid));
-  bssl::UniquePtr<BIGNUM> qx = GetBIGNUM(t, "Qx");
-  bssl::UniquePtr<BIGNUM> qy = GetBIGNUM(t, "Qy");
-  bssl::UniquePtr<BIGNUM> r = GetBIGNUM(t, "R");
-  bssl::UniquePtr<BIGNUM> s = GetBIGNUM(t, "S");
-  std::vector<uint8_t> msg;
-  uint8_t digest[EVP_MAX_MD_SIZE];
-  unsigned digest_len;
-  if (!sig || !key || !qx || !qy || !r || !s ||
-      !EC_KEY_set_public_key_affine_coordinates(key.get(), qx.get(),
-                                                qy.get()) ||
-      !t->GetBytes(&msg, "Msg") ||
-      !EVP_Digest(msg.data(), msg.size(), digest, &digest_len, md, nullptr)) {
-    return false;
-  }
-
-  BN_free(sig->r);
-  sig->r = r.release();
-  BN_free(sig->s);
-  sig->s = s.release();
-
-  if (ECDSA_do_verify(digest, digest_len, sig.get(), key.get())) {
-    printf("%sResult = P\r\n\r\n", t->CurrentTestToString().c_str());
-  } else {
-    char buf[256];
-    ERR_error_string_n(ERR_get_error(), buf, sizeof(buf));
-    printf("%sResult = F (%s)\r\n\r\n", t->CurrentTestToString().c_str(), buf);
-  }
-  ERR_clear_error();
-  return true;
-}
-
-int cavp_ecdsa2_sigver_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestECDSA2SigVer;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_hmac_test.cc b/util/fipstools/cavp/cavp_hmac_test.cc
deleted file mode 100644
index c88226a..0000000
--- a/util/fipstools/cavp/cavp_hmac_test.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/* 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_hmac_test processes a NIST CAVP HMAC test vector request file and emits
-// the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/crypto.h>
-#include <openssl/hmac.h>
-#include <openssl/span.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestHMAC(FileTest *t, void *arg) {
-  std::string md_len_str;
-  if (!t->GetInstruction(&md_len_str, "L")) {
-    return false;
-  }
-  const size_t md_len = strtoul(md_len_str.c_str(), nullptr, 0);
-
-  const EVP_MD *md;
-  switch (md_len) {
-    case 20:
-      md = EVP_sha1();
-      break;
-    case 28:
-      md = EVP_sha224();
-      break;
-    case 32:
-      md = EVP_sha256();
-      break;
-    case 48:
-      md = EVP_sha384();
-      break;
-    case 64:
-      md = EVP_sha512();
-      break;
-    default:
-      return false;
-  }
-
-  std::string count_str, k_len_str, t_len_str;
-  std::vector<uint8_t> key, msg;
-  if (!t->GetAttribute(&count_str, "Count") ||
-      !t->GetAttribute(&k_len_str, "Klen") ||
-      !t->GetAttribute(&t_len_str, "Tlen") ||
-      !t->GetBytes(&key, "Key") ||
-      !t->GetBytes(&msg, "Msg")) {
-    return false;
-  }
-
-  size_t k_len = strtoul(k_len_str.c_str(), nullptr, 0);
-  size_t t_len = strtoul(t_len_str.c_str(), nullptr, 0);
-  if (key.size() < k_len) {
-    return false;
-  }
-  unsigned out_len;
-  uint8_t out[EVP_MAX_MD_SIZE];
-  if (HMAC(md, key.data(), k_len, msg.data(), msg.size(), out, &out_len) ==
-      NULL) {
-    return false;
-  }
-
-  if (out_len < t_len) {
-    return false;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-  printf("Mac = %s\r\n\r\n",
-         EncodeHex(bssl::MakeConstSpan(out, t_len)).c_str());
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <test file>\n", arg);
-  return 1;
-}
-
-int cavp_hmac_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    return usage(argv[0]);
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestHMAC;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_kas_test.cc b/util/fipstools/cavp/cavp_kas_test.cc
deleted file mode 100644
index 9a74f1d..0000000
--- a/util/fipstools/cavp/cavp_kas_test.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-/* Copyright (c) 2018, 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_kas_test processes NIST CAVP ECC KAS test vector request files and
-// emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/ecdh.h>
-#include <openssl/ecdsa.h>
-#include <openssl/ec_key.h>
-#include <openssl/err.h>
-#include <openssl/nid.h>
-#include <openssl/sha.h>
-#include <openssl/span.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-static bool TestKAS(FileTest *t, void *arg) {
-  const bool validate = *reinterpret_cast<bool *>(arg);
-
-  int nid = NID_undef;
-  size_t digest_len = 0;
-
-  if (t->HasInstruction("EB - SHA224")) {
-    nid = NID_secp224r1;
-    digest_len = SHA224_DIGEST_LENGTH;
-  } else if (t->HasInstruction("EC - SHA256")) {
-    nid = NID_X9_62_prime256v1;
-    digest_len = SHA256_DIGEST_LENGTH;
-  } else if (t->HasInstruction("ED - SHA384")) {
-    nid = NID_secp384r1;
-    digest_len = SHA384_DIGEST_LENGTH;
-  } else if (t->HasInstruction("EE - SHA512")) {
-    nid = NID_secp521r1;
-    digest_len = SHA512_DIGEST_LENGTH;
-  } else {
-    return false;
-  }
-
-  if (!t->HasAttribute("COUNT")) {
-    return false;
-  }
-
-  bssl::UniquePtr<BIGNUM> their_x(GetBIGNUM(t, "QeCAVSx"));
-  bssl::UniquePtr<BIGNUM> their_y(GetBIGNUM(t, "QeCAVSy"));
-  bssl::UniquePtr<EC_KEY> ec_key(EC_KEY_new_by_curve_name(nid));
-  bssl::UniquePtr<BN_CTX> ctx(BN_CTX_new());
-  if (!their_x || !their_y || !ec_key || !ctx) {
-    return false;
-  }
-
-  const EC_GROUP *const group = EC_KEY_get0_group(ec_key.get());
-  bssl::UniquePtr<EC_POINT> their_point(EC_POINT_new(group));
-  if (!their_point ||
-      !EC_POINT_set_affine_coordinates_GFp(
-          group, their_point.get(), their_x.get(), their_y.get(), ctx.get())) {
-    return false;
-  }
-
-  if (validate) {
-    bssl::UniquePtr<BIGNUM> our_k(GetBIGNUM(t, "deIUT"));
-    if (!our_k ||
-        !EC_KEY_set_private_key(ec_key.get(), our_k.get()) ||
-        // These attributes are ignored.
-        !t->HasAttribute("QeIUTx") ||
-        !t->HasAttribute("QeIUTy")) {
-      return false;
-    }
-  } else if (!EC_KEY_generate_key(ec_key.get())) {
-    return false;
-  }
-
-  uint8_t digest[EVP_MAX_MD_SIZE];
-  if (!ECDH_compute_key_fips(digest, digest_len, their_point.get(),
-                             ec_key.get())) {
-    return false;
-  }
-
-  if (validate) {
-    std::vector<uint8_t> expected_shared_bytes;
-    if (!t->GetBytes(&expected_shared_bytes, "CAVSHashZZ")) {
-      return false;
-    }
-    const bool ok =
-        digest_len == expected_shared_bytes.size() &&
-        OPENSSL_memcmp(digest, expected_shared_bytes.data(), digest_len) == 0;
-
-    printf("%sIUTHashZZ = %s\r\nResult = %c\r\n\r\n\r\n",
-           t->CurrentTestToString().c_str(),
-           EncodeHex(bssl::MakeConstSpan(digest, digest_len)).c_str(),
-           ok ? 'P' : 'F');
-  } else {
-    const EC_POINT *pub = EC_KEY_get0_public_key(ec_key.get());
-    bssl::UniquePtr<BIGNUM> x(BN_new());
-    bssl::UniquePtr<BIGNUM> y(BN_new());
-    if (!x || !y ||
-        !EC_POINT_get_affine_coordinates_GFp(group, pub, x.get(), y.get(),
-                                             ctx.get())) {
-      return false;
-    }
-    bssl::UniquePtr<char> x_hex(BN_bn2hex(x.get()));
-    bssl::UniquePtr<char> y_hex(BN_bn2hex(y.get()));
-
-    printf("%sQeIUTx = %s\r\nQeIUTy = %s\r\nHashZZ = %s\r\n",
-           t->CurrentTestToString().c_str(), x_hex.get(), y_hex.get(),
-           EncodeHex(bssl::MakeConstSpan(digest, digest_len)).c_str());
-  }
-
-  return true;
-}
-
-int cavp_kas_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    fprintf(stderr, "usage: %s (validity|function) <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  bool validity;
-  if (strcmp(argv[1], "validity") == 0) {
-    validity = true;
-  } else if (strcmp(argv[1], "function") == 0) {
-    validity = false;
-  } else {
-    fprintf(stderr, "Unknown test type: %s\n", argv[1]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.arg = &validity;
-  opts.callback = TestKAS;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  opts.is_kas_test = true;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_keywrap_test.cc b/util/fipstools/cavp/cavp_keywrap_test.cc
deleted file mode 100644
index 67397ec..0000000
--- a/util/fipstools/cavp/cavp_keywrap_test.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-/* 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_keywrap_test processes a NIST CAVP AES test vector request file and
-// emits the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/aes.h>
-#include <openssl/crypto.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  bool encrypt;
-  bool padding;
-};
-
-}  // namespace
-
-static bool AESKeyWrap(std::vector<uint8_t> *out, bool encrypt,
-                       const std::vector<uint8_t> &key,
-                       const std::vector<uint8_t> &in) {
-  size_t key_bits = key.size() * 8;
-  if (key_bits != 128 && key_bits != 192 && key_bits != 256) {
-    return false;
-  }
-  AES_KEY aes_key;
-
-  if (encrypt) {
-    out->resize(in.size() + 8);
-    if (AES_set_encrypt_key(key.data(), key_bits, &aes_key) ||
-        AES_wrap_key(&aes_key, nullptr, out->data(), in.data(), in.size()) ==
-            -1) {
-      return false;
-    }
-  } else {
-    out->resize(in.size() - 8);
-    if (AES_set_decrypt_key(key.data(), key_bits, &aes_key) ||
-        AES_unwrap_key(&aes_key, nullptr, out->data(), in.data(), in.size()) ==
-            -1) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-static bool AESKeyWrapWithPadding(std::vector<uint8_t> *out, bool encrypt,
-                                  const std::vector<uint8_t> &key,
-                                  const std::vector<uint8_t> &in) {
-  const size_t key_bits = key.size() * 8;
-  if (key_bits != 128 && key_bits != 192 && key_bits != 256) {
-    return false;
-  }
-  AES_KEY aes_key;
-
-  size_t out_len;
-  if (encrypt) {
-    out->resize(in.size() + 15);
-    if (AES_set_encrypt_key(key.data(), key_bits, &aes_key) ||
-        !AES_wrap_key_padded(&aes_key, out->data(), &out_len, out->size(),
-                             in.data(), in.size())) {
-      return false;
-    }
-  } else {
-    out->resize(in.size());
-    if (AES_set_decrypt_key(key.data(), key_bits, &aes_key) ||
-        !AES_unwrap_key_padded(&aes_key, out->data(), &out_len, out->size(),
-                               in.data(), in.size())) {
-      return false;
-    }
-  }
-
-  out->resize(out_len);
-  return true;
-}
-
-static bool TestCipher(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  std::string count, unused, in_label = ctx->encrypt ? "P" : "C",
-                             result_label = ctx->encrypt ? "C" : "P";
-  std::vector<uint8_t> key, in, result;
-  // clang-format off
-  if (!t->GetInstruction(&unused, "PLAINTEXT LENGTH") ||
-      !t->GetAttribute(&count, "COUNT") ||
-      !t->GetBytes(&key, "K") ||
-      !t->GetBytes(&in, in_label)) {
-    return false;
-  }
-  // clang-format on
-
-  auto wrap_function = AESKeyWrap;
-  if (ctx->padding) {
-    wrap_function = AESKeyWrapWithPadding;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-  if (!wrap_function(&result, ctx->encrypt, key, in)) {
-    if (ctx->encrypt) {
-      return false;
-    } else {
-      printf("FAIL\r\n\r\n");
-    }
-  } else {
-    printf("%s = %s\r\n\r\n", result_label.c_str(), EncodeHex(result).c_str());
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(
-      stderr,
-      "usage: %s (enc|dec|enc-pad|dec-pad) (128|192|256) <test file>\n",
-      arg);
-  return 1;
-}
-
-int cavp_keywrap_test_main(int argc, char **argv) {
-  if (argc != 4) {
-    return usage(argv[0]);
-  }
-
-  const std::string op(argv[1]);
-  bool encrypt = false;
-  bool padding = false;
-  if (op == "enc") {
-    encrypt = true;
-  } else if (op == "dec") {
-  } else if (op == "enc-pad") {
-    encrypt = true;
-    padding = true;
-  } else if (op == "dec-pad") {
-    padding = true;
-  } else {
-    return usage(argv[0]);
-  }
-
-  TestCtx ctx = {encrypt, padding};
-
-  FileTest::Options opts;
-  opts.path = argv[3];
-  opts.callback = TestCipher;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_main.cc b/util/fipstools/cavp/cavp_main.cc
deleted file mode 100644
index 64dbd69..0000000
--- a/util/fipstools/cavp/cavp_main.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/* 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},
-    {"kas", &cavp_kas_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},
-    {"tlskdf", &cavp_tlskdf_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/util/fipstools/cavp/cavp_rsa2_keygen_test.cc b/util/fipstools/cavp/cavp_rsa2_keygen_test.cc
deleted file mode 100644
index e7088c7..0000000
--- a/util/fipstools/cavp/cavp_rsa2_keygen_test.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/* 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_rsa2_keygen_test processes NIST CAVP RSA2 KeyGen test vector request
-// files and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/rsa.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.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") ||
-      !t->GetInstruction(&table, "Table for M-R Test") ||
-      table != "C.2" ||
-      !t->GetAttribute(&count_str, "N")) {
-    return false;
-  }
-
-  printf("[mod = %s]\r\n", mod_str.c_str());
-  printf("[Table for M-R Test = %s]\r\n\r\n", table.c_str());
-
-  size_t bits = strtoul(mod_str.c_str(), nullptr, 0);
-  size_t count = strtoul(count_str.c_str(), nullptr, 0);
-  for (size_t i = 0; i < count; i++) {
-    bssl::UniquePtr<RSA> key(RSA_new());
-    if (key == nullptr ||
-        bits == 0 ||
-        !RSA_generate_key_fips(key.get(), bits, nullptr)) {
-      return 0;
-    }
-
-    const BIGNUM *n, *e, *d, *p, *q;
-    RSA_get0_key(key.get(), &n, &e, &d);
-    RSA_get0_factors(key.get(), &p, &q);
-    std::vector<uint8_t> n_bytes(BN_num_bytes(n)), e_bytes(BN_num_bytes(e)),
-        d_bytes((bits + 7) / 8), p_bytes(BN_num_bytes(p)),
-        q_bytes(BN_num_bytes(q));
-    if (n == NULL ||
-        BN_bn2bin(n, n_bytes.data()) != n_bytes.size() ||
-        e == NULL ||
-        BN_bn2bin(e, e_bytes.data()) != e_bytes.size() ||
-        d == NULL ||
-        !BN_bn2bin_padded(d_bytes.data(), d_bytes.size(), d) ||
-        p == NULL ||
-        BN_bn2bin(p, p_bytes.data()) != p_bytes.size() ||
-        q == NULL ||
-        BN_bn2bin(q, q_bytes.data()) != q_bytes.size()) {
-      return false;
-    }
-
-    printf("e = %s\r\np = %s\r\nq = %s\r\nn = %s\r\nd = %s\r\n\r\n",
-           EncodeHex(e_bytes).c_str(), EncodeHex(p_bytes).c_str(),
-           EncodeHex(q_bytes).c_str(), EncodeHex(n_bytes).c_str(),
-           EncodeHex(d_bytes).c_str());
-  }
-
-  return true;
-}
-
-int cavp_rsa2_keygen_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestRSA2KeyGen;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_rsa2_siggen_test.cc b/util/fipstools/cavp/cavp_rsa2_siggen_test.cc
deleted file mode 100644
index 636a73a..0000000
--- a/util/fipstools/cavp/cavp_rsa2_siggen_test.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/* 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_rsa2_siggen_test processes NIST CAVP RSA2 SigGen test vector request
-// files and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/rsa.h>
-
-#include "../crypto/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.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);
-
-  std::string mod_str, hash;
-  std::vector<uint8_t> msg;
-  if (!t->GetInstruction(&mod_str, "mod") ||
-      !t->GetAttribute(&hash, "SHAAlg") ||
-      !t->GetBytes(&msg, "Msg")) {
-    return false;
-  }
-
-  std::string test = t->CurrentTestToString();
-  if (t->IsAtNewInstructionBlock()) {
-    int mod_bits = strtoul(mod_str.c_str(), nullptr, 0);
-    ctx->key = bssl::UniquePtr<RSA>(RSA_new());
-    if (ctx->key == nullptr ||
-        mod_bits == 0 ||
-        !RSA_generate_key_fips(ctx->key.get(), mod_bits, nullptr)) {
-      return false;
-    }
-
-    const BIGNUM *n, *e;
-    RSA_get0_key(ctx->key.get(), &n, &e, nullptr);
-
-    std::vector<uint8_t> n_bytes(BN_num_bytes(n));
-    std::vector<uint8_t> e_bytes(BN_num_bytes(e));
-    if (!BN_bn2bin_padded(n_bytes.data(), n_bytes.size(), n) ||
-        !BN_bn2bin_padded(e_bytes.data(), e_bytes.size(), e)) {
-      return false;
-    }
-
-    printf("[mod = %s]\r\n\r\nn = %s\r\n\r\ne = %s", mod_str.c_str(),
-           EncodeHex(n_bytes).c_str(), EncodeHex(e_bytes).c_str());
-    test = test.substr(test.find("]") + 3);
-  }
-
-  const EVP_MD *md = EVP_get_digestbyname(hash.c_str());
-  uint8_t digest_buf[EVP_MAX_MD_SIZE];
-  std::vector<uint8_t> sig(RSA_size(ctx->key.get()));
-  unsigned digest_len;
-  size_t sig_len;
-  if (md == NULL ||
-      !EVP_Digest(msg.data(), msg.size(), digest_buf, &digest_len, md, NULL)) {
-    return false;
-  }
-
-  if (ctx->is_pss) {
-    if (!RSA_sign_pss_mgf1(ctx->key.get(), &sig_len, sig.data(), sig.size(),
-                           digest_buf, digest_len, md, md, -1)) {
-      return false;
-    }
-  } else {
-    unsigned sig_len_u;
-    if (!RSA_sign(EVP_MD_type(md), digest_buf, digest_len, sig.data(),
-                  &sig_len_u, ctx->key.get())) {
-      return false;
-    }
-    sig_len = sig_len_u;
-  }
-
-  sig.resize(sig_len);
-  printf("%sS = %s\r\n\r\n", test.c_str(), EncodeHex(sig).c_str());
-  return true;
-}
-
-int cavp_rsa2_siggen_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    fprintf(stderr, "usage: %s (pkcs15|pss) <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  TestCtx ctx;
-  if (strcmp(argv[1], "pkcs15") == 0) {
-    ctx = {nullptr, false};
-  } else if (strcmp(argv[1], "pss") == 0) {
-    ctx = {nullptr, true};
-  } else {
-    fprintf(stderr, "Unknown test type: %s\n", argv[1]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = TestRSA2SigGen;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_rsa2_sigver_test.cc b/util/fipstools/cavp/cavp_rsa2_sigver_test.cc
deleted file mode 100644
index cbcfc1f..0000000
--- a/util/fipstools/cavp/cavp_rsa2_sigver_test.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/* 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_rsa2_sigver_test processes NIST CAVP RSA2 SigVer test vector request
-// files and emits the corresponding response.
-
-#include <vector>
-
-#include <openssl/bn.h>
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-#include <openssl/err.h>
-#include <openssl/rsa.h>
-
-#include "../crypto/internal.h"
-#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);
-
-  std::string mod_str;
-  if (!t->GetInstruction(&mod_str, "mod")) {
-    return false;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-
-  if (t->HasAttribute("n")) {
-    printf("\r\n");
-    return t->GetBytes(&ctx->N, "n");
-  }
-
-  std::string hash;
-  std::vector<uint8_t> e_bytes, msg, sig;
-  if (!t->GetAttribute(&hash, "SHAAlg") ||
-      !t->GetBytes(&e_bytes, "e") ||
-      !t->GetBytes(&msg, "Msg") ||
-      !t->GetBytes(&sig, "S")) {
-    return false;
-  }
-
-  bssl::UniquePtr<RSA> key(RSA_new());
-  key->n = BN_new();
-  key->e = BN_new();
-  if (key == nullptr ||
-      !BN_bin2bn(ctx->N.data(), ctx->N.size(), key->n) ||
-      !BN_bin2bn(e_bytes.data(), e_bytes.size(), key->e)) {
-    return false;
-  }
-
-  const EVP_MD *md = EVP_get_digestbyname(hash.c_str());
-  uint8_t digest_buf[EVP_MAX_MD_SIZE];
-  unsigned digest_len;
-  if (md == NULL ||
-      !EVP_Digest(msg.data(), msg.size(), digest_buf, &digest_len, md, NULL)) {
-    return false;
-  }
-
-  int ok;
-  if (ctx->is_pss) {
-    ok = RSA_verify_pss_mgf1(key.get(), digest_buf, digest_len, md, md, -1,
-                             sig.data(), sig.size());
-  } else {
-    ok = RSA_verify(EVP_MD_type(md), digest_buf, digest_len, sig.data(),
-                    sig.size(), key.get());
-  }
-
-  if (ok) {
-    printf("Result = P\r\n\r\n");
-  } else {
-    char buf[256];
-    ERR_error_string_n(ERR_get_error(), buf, sizeof(buf));
-    printf("Result = F (%s)\r\n\r\n", buf);
-  }
-  ERR_clear_error();
-  return true;
-}
-
-int cavp_rsa2_sigver_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    fprintf(stderr, "usage: %s (pkcs15|pss) <test file>\n",
-            argv[0]);
-    return 1;
-  }
-
-  TestCtx ctx;
-  if (strcmp(argv[1], "pkcs15") == 0) {
-    ctx = {std::vector<uint8_t>(), false};
-  } else if (strcmp(argv[1], "pss") == 0) {
-    ctx = {std::vector<uint8_t>(), true};
-  } else {
-    fprintf(stderr, "Unknown test type: %s\n", argv[1]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = TestRSA2SigVer;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_sha_monte_test.cc b/util/fipstools/cavp/cavp_sha_monte_test.cc
deleted file mode 100644
index f5bcdd1..0000000
--- a/util/fipstools/cavp/cavp_sha_monte_test.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/* 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_sha_monte_test processes a NIST CAVP SHA-Monte test vector request file
-// and emits the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  std::string hash;
-};
-
-}
-
-static bool TestSHAMonte(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  const EVP_MD *md = EVP_get_digestbyname(ctx->hash.c_str());
-  if (md == nullptr) {
-    return false;
-  }
-  const size_t md_len = EVP_MD_size(md);
-
-  std::string out_len;
-  if (!t->GetInstruction(&out_len, "L") ||
-      md_len != strtoul(out_len.c_str(), nullptr, 0)) {
-    return false;
-  }
-
-  std::vector<uint8_t> seed;
-  if (!t->GetBytes(&seed, "Seed") ||
-      seed.size() != md_len) {
-    return false;
-  }
-
-  std::vector<uint8_t> out = seed;
-
-  printf("%s\r\n", t->CurrentTestToString().c_str());
-
-  for (int count = 0; count < 100; count++) {
-    std::vector<uint8_t> msg;
-    msg.insert(msg.end(), out.begin(), out.end());
-    msg.insert(msg.end(), out.begin(), out.end());
-    msg.insert(msg.end(), out.begin(), out.end());
-    for (int i = 0; i < 1000; i++) {
-      unsigned digest_len;
-      if (!EVP_Digest(msg.data(), msg.size(), out.data(), &digest_len, md,
-                      nullptr) ||
-          digest_len != out.size()) {
-        return false;
-      }
-
-      msg.erase(msg.begin(), msg.begin() + out.size());
-      msg.insert(msg.end(), out.begin(), out.end());
-    }
-    printf("COUNT = %d\r\n", count);
-    printf("MD = %s\r\n\r\n", EncodeHex(out).c_str());
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <hash> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_sha_monte_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    return usage(argv[0]);
-  }
-
-  TestCtx ctx = {std::string(argv[1])};
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = TestSHAMonte;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_sha_test.cc b/util/fipstools/cavp/cavp_sha_test.cc
deleted file mode 100644
index c046451..0000000
--- a/util/fipstools/cavp/cavp_sha_test.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/* 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_sha_test processes a NIST CAVP SHA test vector request file and emits
-// the corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/crypto.h>
-#include <openssl/digest.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.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);
-
-  const EVP_MD *md = EVP_get_digestbyname(ctx->hash.c_str());
-  if (md == nullptr) {
-    return false;
-  }
-  const size_t md_len = EVP_MD_size(md);
-
-  std::string out_len;
-  if (!t->GetInstruction(&out_len, "L") ||
-      md_len != strtoul(out_len.c_str(), nullptr, 0)) {
-    return false;
-  }
-
-  std::string msg_len_str;
-  std::vector<uint8_t> msg;
-  if (!t->GetAttribute(&msg_len_str, "Len") ||
-      !t->GetBytes(&msg, "Msg")) {
-    return false;
-  }
-
-  size_t msg_len = strtoul(msg_len_str.c_str(), nullptr, 0);
-  if (msg_len % 8 != 0 ||
-      msg_len / 8 > msg.size()) {
-    return false;
-  }
-  msg_len /= 8;
-
-  std::vector<uint8_t> out;
-  out.resize(md_len);
-  unsigned digest_len;
-  if (!EVP_Digest(msg.data(), msg_len, out.data(), &digest_len, md, nullptr) ||
-      digest_len != out.size()) {
-    return false;
-  }
-
-  printf("%s", t->CurrentTestToString().c_str());
-  printf("MD = %s\r\n\r\n", EncodeHex(out).c_str());
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s <hash> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_sha_test_main(int argc, char **argv) {
-  if (argc != 3) {
-    return usage(argv[0]);
-  }
-
-  TestCtx ctx = {std::string(argv[1])};
-
-  FileTest::Options opts;
-  opts.path = argv[2];
-  opts.callback = TestSHA;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_tdes_test.cc b/util/fipstools/cavp/cavp_tdes_test.cc
deleted file mode 100644
index 7b8839d..0000000
--- a/util/fipstools/cavp/cavp_tdes_test.cc
+++ /dev/null
@@ -1,336 +0,0 @@
-/* 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_tdes_test processes a NIST TMOVS test vector request file and emits the
-// corresponding response.
-
-#include <stdlib.h>
-
-#include <openssl/cipher.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-#include "cavp_test_util.h"
-
-
-namespace {
-
-struct TestCtx {
-  const EVP_CIPHER *cipher;
-  enum Mode {
-    kKAT,  // Known Answer Test
-    kMCT,  // Monte Carlo Test
-  };
-  bool has_iv;
-  Mode mode;
-};
-
-}
-
-static bool TestKAT(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  if (t->HasInstruction("ENCRYPT") == t->HasInstruction("DECRYPT")) {
-    t->PrintLine("Want either ENCRYPT or DECRYPT");
-    return false;
-  }
-  enum {
-    kEncrypt,
-    kDecrypt,
-  } operation = t->HasInstruction("ENCRYPT") ? kEncrypt : kDecrypt;
-
-  if (t->HasAttribute("NumKeys")) {
-    // Another file format quirk: NumKeys is a single attribute line immediately
-    // following an instruction and should probably have been an instruction
-    // instead. If it is present, the file has separate attributes "KEY{1,2,3}".
-    // If it is not, the keys are concatenated in a single attribute "KEYs".
-    std::string num_keys;
-    t->GetAttribute(&num_keys, "NumKeys");
-    t->InjectInstruction("NumKeys", num_keys);
-
-    std::string header = operation == kEncrypt ? "[ENCRYPT]" : "[DECRYPT]";
-    printf("%s\r\n\r\n", header.c_str());
-
-    return true;
-  }
-
-  enum {
-    kNotPresent,
-    kTwo,
-    kThree,
-  } num_keys = kNotPresent;
-  if (t->HasInstruction("NumKeys")) {
-    std::string num_keys_str;
-    t->GetInstruction(&num_keys_str, "NumKeys");
-    const int n = strtoul(num_keys_str.c_str(), nullptr, 0);
-    if (n == 2) {
-      num_keys = kTwo;
-    } else if (n == 3) {
-      num_keys = kThree;
-    } else {
-      t->PrintLine("invalid NumKeys value");
-      return false;
-    }
-  }
-
-  std::string count;
-  std::vector<uint8_t> keys, key1, key2, key3, iv, in, result;
-  const std::string in_label =
-      operation == kEncrypt ? "PLAINTEXT" : "CIPHERTEXT";
-  // clang-format off
-  if (!t->GetAttribute(&count, "COUNT") ||
-      (num_keys == 0 && !t->GetBytes(&keys, "KEYs")) ||
-      (num_keys > 0 &&
-       (!t->GetBytes(&key1, "KEY1") ||
-        !t->GetBytes(&key2, "KEY2") ||
-        !t->GetBytes(&key3, "KEY3"))) ||
-      (ctx->has_iv && !t->GetBytes(&iv, "IV")) ||
-      !t->GetBytes(&in, in_label)) {
-    return false;
-  }
-  // clang-format on
-  std::vector<uint8_t> key;
-  if (num_keys != kNotPresent) {
-    key.insert(key.end(), key1.begin(), key1.end());
-    key.insert(key.end(), key2.begin(), key2.end());
-    if (num_keys == kThree) {
-      key.insert(key.end(), key3.begin(), key3.end());
-    }
-  } else {
-    key.insert(key.end(), keys.begin(), keys.end());
-    key.insert(key.end(), keys.begin(), keys.end());
-    key.insert(key.end(), keys.begin(), keys.end());
-  }
-
-  if (!CipherOperation(ctx->cipher, &result, operation == kEncrypt, key, iv,
-                       in)) {
-    return false;
-  }
-
-  // TDES fax files output format differs from file to file, and the input
-  // format is inconsistent with the output, so we construct the output manually
-  // rather than printing CurrentTestToString().
-  if (t->IsAtNewInstructionBlock() && num_keys == kNotPresent) {
-    // If NumKeys is present, header is printed when parsing NumKeys.
-    std::string header = operation == kEncrypt ? "[ENCRYPT]" : "[DECRYPT]";
-    printf("%s\r\n", header.c_str());
-  }
-  const std::string result_label =
-      operation == kEncrypt ? "CIPHERTEXT" : "PLAINTEXT";
-  printf("COUNT = %s\r\n", count.c_str());
-  if (num_keys == kNotPresent) {
-    printf("KEYs = %s\r\n", EncodeHex(keys).c_str());
-  } else {
-    printf("KEY1 = %s\r\nKEY2 = %s\r\nKEY3 = %s\r\n", EncodeHex(key1).c_str(),
-           EncodeHex(key2).c_str(), EncodeHex(key3).c_str());
-  }
-  if (ctx->has_iv) {
-    printf("IV = %s\r\n", EncodeHex(iv).c_str());
-  }
-  printf("%s = %s\r\n", in_label.c_str(), EncodeHex(in).c_str());
-  printf("%s = %s\r\n\r\n", result_label.c_str(), EncodeHex(result).c_str());
-
-  return true;
-}
-
-// XORKeyWithOddParityLSB sets |*key| to |key| XOR |value| and then writes
-// the LSB of each byte to establish odd parity for that byte. This parity-based
-// embedded of a DES key into 64 bits is an old tradition and something that
-// NIST's tests require.
-static void XORKeyWithOddParityLSB(std::vector<uint8_t> *key,
-                                        const std::vector<uint8_t> &value) {
-  for (size_t i = 0; i < key->size(); i++) {
-    uint8_t v = (*key)[i] ^ value[i];
-
-    // Use LSB to establish odd parity.
-    v |= 0x01;
-    for (uint8_t j = 1; j < 8; j++) {
-      v ^= ((v >> j) & 0x01);
-    }
-    (*key)[i] = v;
-  }
-}
-
-static bool TestMCT(FileTest *t, void *arg) {
-  TestCtx *ctx = reinterpret_cast<TestCtx *>(arg);
-
-  if (t->HasInstruction("ENCRYPT") == t->HasInstruction("DECRYPT")) {
-    t->PrintLine("Want either ENCRYPT or DECRYPT");
-    return false;
-  }
-  enum {
-    kEncrypt,
-    kDecrypt,
-  } operation = t->HasInstruction("ENCRYPT") ? kEncrypt : kDecrypt;
-
-  if (t->HasAttribute("NumKeys")) {
-    // Another file format quirk: NumKeys is a single attribute line immediately
-    // following an instruction and should probably have been an instruction
-    // instead.
-    std::string num_keys;
-    t->GetAttribute(&num_keys, "NumKeys");
-    t->InjectInstruction("NumKeys", num_keys);
-    return true;
-  }
-
-  enum {
-    kTwo,
-    kThree,
-  } num_keys;
-  std::string num_keys_str;
-  if (!t->GetInstruction(&num_keys_str, "NumKeys")) {
-    return false;
-  } else {
-    const int n = strtoul(num_keys_str.c_str(), nullptr, 0);
-    if (n == 2) {
-      num_keys = kTwo;
-    } else if (n == 3) {
-      num_keys = kThree;
-    } else {
-      t->PrintLine("invalid NumKeys value");
-      return false;
-    }
-  }
-
-  std::string count;
-  std::vector<uint8_t> key1, key2, key3, iv, in, result;
-  const std::string in_label =
-      operation == kEncrypt ? "PLAINTEXT" : "CIPHERTEXT";
-  // clang-format off
-  if (!t->GetBytes(&key1, "KEY1") ||
-      !t->GetBytes(&key2, "KEY2") ||
-      !t->GetBytes(&key3, "KEY3") ||
-      (ctx->has_iv && !t->GetBytes(&iv, "IV")) ||
-      !t->GetBytes(&in, in_label)) {
-    return false;
-  }
-  // clang-format on
-
-  for (int i = 0; i < 400; i++) {
-    std::vector<uint8_t> current_iv = iv, current_in = in, prev_result,
-                         prev_prev_result;
-
-    std::vector<uint8_t> key(key1);
-    key.insert(key.end(), key2.begin(), key2.end());
-    key.insert(key.end(), key3.begin(), key3.end());
-
-    for (int j = 0; j < 10000; j++) {
-      prev_prev_result = prev_result;
-      prev_result = result;
-      const EVP_CIPHER *cipher = ctx->cipher;
-      if (!CipherOperation(cipher, &result, operation == kEncrypt, key,
-                           current_iv, current_in)) {
-        t->PrintLine("CipherOperation failed");
-        return false;
-      }
-      if (ctx->has_iv) {
-        if (operation == kEncrypt) {
-          if (j == 0) {
-            current_in = current_iv;
-          } else {
-            current_in = prev_result;
-          }
-          current_iv = result;
-        } else {  // operation == kDecrypt
-          current_iv = current_in;
-          current_in = result;
-        }
-      } else {
-        current_in = result;
-      }
-    }
-
-    // Output result for COUNT = i.
-    const std::string result_label =
-        operation == kEncrypt ? "CIPHERTEXT" : "PLAINTEXT";
-    if (i == 0) {
-      const std::string op_label =
-          operation == kEncrypt ? "ENCRYPT" : "DECRYPT";
-      printf("[%s]\n\n", op_label.c_str());
-    }
-    printf("COUNT = %d\r\nKEY1 = %s\r\nKEY2 = %s\r\nKEY3 = %s\r\n", i,
-           EncodeHex(key1).c_str(), EncodeHex(key2).c_str(),
-           EncodeHex(key3).c_str());
-    if (ctx->has_iv) {
-      printf("IV = %s\r\n", EncodeHex(iv).c_str());
-    }
-    printf("%s = %s\r\n", in_label.c_str(), EncodeHex(in).c_str());
-    printf("%s = %s\r\n\r\n", result_label.c_str(), EncodeHex(result).c_str());
-
-
-    XORKeyWithOddParityLSB(&key1, result);
-    XORKeyWithOddParityLSB(&key2, prev_result);
-    if (num_keys == kThree) {
-      XORKeyWithOddParityLSB(&key3, prev_prev_result);
-    } else {
-      XORKeyWithOddParityLSB(&key3, result);
-    }
-
-    if (ctx->has_iv) {
-      if (operation == kEncrypt) {
-        in = prev_result;
-        iv = result;
-      } else {
-        iv = current_iv;
-        in = current_in;
-      }
-    } else {
-      in = result;
-    }
-  }
-
-  return true;
-}
-
-static int usage(char *arg) {
-  fprintf(stderr, "usage: %s (kat|mct) <cipher> <test file>\n", arg);
-  return 1;
-}
-
-int cavp_tdes_test_main(int argc, char **argv) {
-  if (argc != 4) {
-    return usage(argv[0]);
-  }
-
-  const std::string tm(argv[1]);
-  enum TestCtx::Mode test_mode;
-  if (tm == "kat") {
-    test_mode = TestCtx::kKAT;
-  } else if (tm == "mct") {
-    test_mode = TestCtx::kMCT;
-  } else {
-    fprintf(stderr, "invalid test_mode: %s\n", tm.c_str());
-    return usage(argv[0]);
-  }
-
-  const std::string cipher_name(argv[2]);
-  const EVP_CIPHER *cipher = GetCipher(argv[2]);
-  if (cipher == nullptr) {
-    fprintf(stderr, "invalid cipher: %s\n", argv[2]);
-    return 1;
-  }
-  bool has_iv = cipher_name != "des-ede" && cipher_name != "des-ede3";
-  TestCtx ctx = {cipher, has_iv, test_mode};
-
-  FileTestFunc test_fn = test_mode == TestCtx::kKAT ? &TestKAT : &TestMCT;
-  FileTest::Options opts;
-  opts.path = argv[3];
-  opts.callback = test_fn;
-  opts.arg = &ctx;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/cavp_test_util.cc b/util/fipstools/cavp/cavp_test_util.cc
deleted file mode 100644
index 1b4e3a1..0000000
--- a/util/fipstools/cavp/cavp_test_util.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-/* 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. */
-
-#include "cavp_test_util.h"
-
-#include <openssl/bn.h>
-#include <openssl/digest.h>
-#include <openssl/ec.h>
-#include <openssl/nid.h>
-
-
-const EVP_CIPHER *GetCipher(const std::string &name) {
-  if (name == "des-cbc") {
-    return EVP_des_cbc();
-  } else if (name == "des-ecb") {
-    return EVP_des_ecb();
-  } else if (name == "des-ede") {
-    return EVP_des_ede();
-  } else if (name == "des-ede3") {
-    return EVP_des_ede3();
-  } else if (name == "des-ede-cbc") {
-    return EVP_des_ede_cbc();
-  } else if (name == "des-ede3-cbc") {
-    return EVP_des_ede3_cbc();
-  } else if (name == "rc4") {
-    return EVP_rc4();
-  } else if (name == "aes-128-ecb") {
-    return EVP_aes_128_ecb();
-  } else if (name == "aes-256-ecb") {
-    return EVP_aes_256_ecb();
-  } else if (name == "aes-128-cbc") {
-    return EVP_aes_128_cbc();
-  } else if (name == "aes-128-gcm") {
-    return EVP_aes_128_gcm();
-  } else if (name == "aes-128-ofb") {
-    return EVP_aes_128_ofb();
-  } else if (name == "aes-192-cbc") {
-    return EVP_aes_192_cbc();
-  } else if (name == "aes-192-ctr") {
-    return EVP_aes_192_ctr();
-  } else if (name == "aes-192-ecb") {
-    return EVP_aes_192_ecb();
-  } else if (name == "aes-256-cbc") {
-    return EVP_aes_256_cbc();
-  } else if (name == "aes-128-ctr") {
-    return EVP_aes_128_ctr();
-  } else if (name == "aes-256-ctr") {
-    return EVP_aes_256_ctr();
-  } else if (name == "aes-256-gcm") {
-    return EVP_aes_256_gcm();
-  } else if (name == "aes-256-ofb") {
-    return EVP_aes_256_ofb();
-  }
-  return nullptr;
-}
-
-bool CipherOperation(const EVP_CIPHER *cipher, std::vector<uint8_t> *out,
-                     bool encrypt, const std::vector<uint8_t> &key,
-                     const std::vector<uint8_t> &iv,
-                     const std::vector<uint8_t> &in) {
-  bssl::ScopedEVP_CIPHER_CTX ctx;
-  if (!EVP_CipherInit_ex(ctx.get(), cipher, nullptr, nullptr, nullptr,
-                         encrypt ? 1 : 0)) {
-    return false;
-  }
-  if (!iv.empty() && iv.size() != EVP_CIPHER_CTX_iv_length(ctx.get())) {
-    return false;
-  }
-
-  int result_len1 = 0, result_len2;
-  *out = std::vector<uint8_t>(in.size());
-  if (!EVP_CIPHER_CTX_set_key_length(ctx.get(), key.size()) ||
-      !EVP_CipherInit_ex(ctx.get(), nullptr, nullptr, key.data(), iv.data(),
-                         -1) ||
-      !EVP_CIPHER_CTX_set_padding(ctx.get(), 0) ||
-      !EVP_CipherUpdate(ctx.get(), out->data(), &result_len1, in.data(),
-                        in.size()) ||
-      !EVP_CipherFinal_ex(ctx.get(), out->data() + result_len1, &result_len2)) {
-    return false;
-  }
-  out->resize(result_len1 + result_len2);
-
-  return true;
-}
-
-bool AEADEncrypt(const EVP_AEAD *aead, std::vector<uint8_t> *ct,
-                 std::vector<uint8_t> *tag, size_t tag_len,
-                 const std::vector<uint8_t> &key,
-                 const std::vector<uint8_t> &pt,
-                 const std::vector<uint8_t> &aad,
-                 const std::vector<uint8_t> &iv) {
-  bssl::ScopedEVP_AEAD_CTX ctx;
-  if (!EVP_AEAD_CTX_init(ctx.get(), aead, key.data(), key.size(), tag_len,
-                         nullptr)) {
-    return false;
-  }
-
-  std::vector<uint8_t> out;
-  out.resize(pt.size() + EVP_AEAD_max_overhead(aead));
-  size_t out_len;
-  if (!EVP_AEAD_CTX_seal(ctx.get(), out.data(), &out_len, out.size(), iv.data(),
-                         iv.size(), pt.data(), pt.size(), aad.data(),
-                         aad.size())) {
-    return false;
-  }
-  out.resize(out_len);
-
-  ct->assign(out.begin(), out.end() - tag_len);
-  tag->assign(out.end() - tag_len, out.end());
-
-  return true;
-}
-
-bool AEADDecrypt(const EVP_AEAD *aead, std::vector<uint8_t> *pt, size_t pt_len,
-                 const std::vector<uint8_t> &key,
-                 const std::vector<uint8_t> &aad,
-                 const std::vector<uint8_t> &ct,
-                 const std::vector<uint8_t> &tag,
-                 const std::vector<uint8_t> &iv) {
-  bssl::ScopedEVP_AEAD_CTX ctx;
-  if (!EVP_AEAD_CTX_init_with_direction(ctx.get(), aead, key.data(), key.size(),
-                                        tag.size(), evp_aead_open)) {
-    return false;
-  }
-  std::vector<uint8_t> in = ct;
-  in.reserve(ct.size() + tag.size());
-  in.insert(in.end(), tag.begin(), tag.end());
-
-  pt->resize(pt_len);
-  size_t out_pt_len;
-  if (!EVP_AEAD_CTX_open(ctx.get(), pt->data(), &out_pt_len, pt->size(),
-                         iv.data(), iv.size(), in.data(), in.size(), aad.data(),
-                         aad.size()) ||
-      out_pt_len != pt_len) {
-    return false;
-  }
-  return true;
-}
-
-static int HexToBIGNUM(bssl::UniquePtr<BIGNUM> *out, const char *in) {
-  BIGNUM *raw = NULL;
-  int ret = BN_hex2bn(&raw, in);
-  out->reset(raw);
-  return ret;
-}
-
-bssl::UniquePtr<BIGNUM> GetBIGNUM(FileTest *t, const char *attribute) {
-  std::string hex;
-  if (!t->GetAttribute(&hex, attribute)) {
-    return nullptr;
-  }
-
-  bssl::UniquePtr<BIGNUM> ret;
-  if (HexToBIGNUM(&ret, hex.c_str()) != static_cast<int>(hex.size())) {
-    t->PrintLine("Could not decode '%s'.", hex.c_str());
-    return nullptr;
-  }
-  return ret;
-}
-
-int GetECGroupNIDFromInstruction(FileTest *t, const char **out_str) {
-  const char *dummy;
-  if (out_str == nullptr) {
-    out_str = &dummy;
-  }
-
-  if (t->HasInstruction("P-224")) {
-    *out_str = "P-224";
-    return NID_secp224r1;
-  }
-  if (t->HasInstruction("P-256")) {
-    *out_str = "P-256";
-    return NID_X9_62_prime256v1;
-  }
-  if (t->HasInstruction("P-384")) {
-    *out_str = "P-384";
-    return NID_secp384r1;
-  }
-  if (t->HasInstruction("P-521")) {
-    *out_str = "P-521";
-    return NID_secp521r1;
-  }
-  t->PrintLine("No supported group specified.");
-  return NID_undef;
-}
-
-const EVP_MD *GetDigestFromInstruction(FileTest *t) {
-  if (t->HasInstruction("SHA-1")) {
-    return EVP_sha1();
-  }
-  if (t->HasInstruction("SHA-224")) {
-    return EVP_sha224();
-  }
-  if (t->HasInstruction("SHA-256")) {
-    return EVP_sha256();
-  }
-  if (t->HasInstruction("SHA-384")) {
-    return EVP_sha384();
-  }
-  if (t->HasInstruction("SHA-512")) {
-    return EVP_sha512();
-  }
-  t->PrintLine("No supported digest function specified.");
-  return nullptr;
-}
-
-void EchoComment(const std::string& comment) {
-  fwrite(comment.c_str(), comment.size(), 1, stdout);
-}
diff --git a/util/fipstools/cavp/cavp_test_util.h b/util/fipstools/cavp/cavp_test_util.h
deleted file mode 100644
index d51dfe6..0000000
--- a/util/fipstools/cavp/cavp_test_util.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* 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. */
-
-#ifndef OPENSSL_HEADER_CRYPTO_FIPSMODULE_CAVP_TEST_UTIL_H
-#define OPENSSL_HEADER_CRYPTO_FIPSMODULE_CAVP_TEST_UTIL_H
-
-#include <stdlib.h>
-#include <string>
-#include <vector>
-
-#include <openssl/aead.h>
-#include <openssl/cipher.h>
-
-#include "../crypto/test/file_test.h"
-
-
-const EVP_CIPHER *GetCipher(const std::string &name);
-
-bool CipherOperation(const EVP_CIPHER *cipher, std::vector<uint8_t> *out,
-                     bool encrypt, const std::vector<uint8_t> &key,
-                     const std::vector<uint8_t> &iv,
-                     const std::vector<uint8_t> &in);
-
-bool AEADEncrypt(const EVP_AEAD *aead, std::vector<uint8_t> *ct,
-                 std::vector<uint8_t> *tag, size_t tag_len,
-                 const std::vector<uint8_t> &key,
-                 const std::vector<uint8_t> &pt,
-                 const std::vector<uint8_t> &aad,
-                 const std::vector<uint8_t> &iv);
-
-bool AEADDecrypt(const EVP_AEAD *aead, std::vector<uint8_t> *pt, size_t pt_len,
-                 const std::vector<uint8_t> &key,
-                 const std::vector<uint8_t> &aad,
-                 const std::vector<uint8_t> &ct,
-                 const std::vector<uint8_t> &tag,
-                 const std::vector<uint8_t> &iv);
-
-bssl::UniquePtr<BIGNUM> GetBIGNUM(FileTest *t, const char *attribute);
-
-int GetECGroupNIDFromInstruction(FileTest *t, const char **out_str = nullptr);
-
-const EVP_MD *GetDigestFromInstruction(FileTest *t);
-
-void EchoComment(const std::string& comment);
-
-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_kas_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);
-int cavp_tlskdf_test_main(int argc, char **argv);
-
-
-#endif  // OPENSSL_HEADER_CRYPTO_FIPSMODULE_CAVP_TEST_UTIL_H
diff --git a/util/fipstools/cavp/cavp_tlskdf_test.cc b/util/fipstools/cavp/cavp_tlskdf_test.cc
deleted file mode 100644
index 0243439..0000000
--- a/util/fipstools/cavp/cavp_tlskdf_test.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Copyright (c) 2018, 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_tlskdf_test processes NIST TLS KDF test vectors and emits the
-// corresponding response.
-// See https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/components/askdfvs.pdf, section 6.4.
-
-#include <vector>
-
-#include <errno.h>
-
-#include <openssl/digest.h>
-
-#include "cavp_test_util.h"
-#include "../crypto/fipsmodule/tls/internal.h"
-#include "../crypto/test/file_test.h"
-#include "../crypto/test/test_util.h"
-
-
-static bool TestTLSKDF(FileTest *t, void *arg) {
-  const EVP_MD *md = nullptr;
-
-  if (t->HasInstruction("TLS 1.0/1.1")) {
-    md = EVP_md5_sha1();
-  } else if (t->HasInstruction("TLS 1.2")) {
-    if (t->HasInstruction("SHA-256")) {
-      md = EVP_sha256();
-    } else if (t->HasInstruction("SHA-384")) {
-      md = EVP_sha384();
-    } else if (t->HasInstruction("SHA-512")) {
-      md = EVP_sha512();
-    }
-  }
-
-  if (md == nullptr) {
-    return false;
-  }
-
-  std::string key_block_len_str;
-  std::vector<uint8_t> premaster, server_random, client_random,
-      key_block_server_random, key_block_client_random;
-  if (!t->GetBytes(&premaster, "pre_master_secret") ||
-      !t->GetBytes(&server_random, "serverHello_random") ||
-      !t->GetBytes(&client_random, "clientHello_random") ||
-      // The NIST tests specify different client and server randoms for the
-      // expansion step from the master-secret step. This is impossible in TLS.
-      !t->GetBytes(&key_block_server_random, "server_random") ||
-      !t->GetBytes(&key_block_client_random, "client_random") ||
-      !t->GetInstruction(&key_block_len_str, "key block length") ||
-      // These are ignored.
-      !t->HasAttribute("COUNT") ||
-      !t->HasInstruction("pre-master secret length")) {
-    return false;
-  }
-
-  uint8_t master_secret[48];
-  static const char kMasterSecretLabel[] = "master secret";
-  if (!CRYPTO_tls1_prf(md, master_secret, sizeof(master_secret),
-                       premaster.data(), premaster.size(), kMasterSecretLabel,
-                       sizeof(kMasterSecretLabel) - 1, client_random.data(),
-                       client_random.size(), server_random.data(),
-                       server_random.size())) {
-    return false;
-  }
-
-  errno = 0;
-  const long int key_block_bits =
-      strtol(key_block_len_str.c_str(), nullptr, 10);
-  if (errno != 0 || key_block_bits <= 0 || (key_block_bits & 7) != 0) {
-    return false;
-  }
-  const size_t key_block_len = key_block_bits / 8;
-  std::vector<uint8_t> key_block(key_block_len);
-  static const char kLabel[] = "key expansion";
-  if (!CRYPTO_tls1_prf(
-          md, key_block.data(), key_block.size(), master_secret,
-          sizeof(master_secret), kLabel, sizeof(kLabel) - 1,
-          key_block_server_random.data(), key_block_server_random.size(),
-          key_block_client_random.data(), key_block_client_random.size())) {
-    return false;
-  }
-
-  printf("%smaster_secret = %s\r\nkey_block = %s\r\n\r\n",
-         t->CurrentTestToString().c_str(), EncodeHex(master_secret).c_str(),
-         EncodeHex(key_block).c_str());
-
-  return true;
-}
-
-int cavp_tlskdf_test_main(int argc, char **argv) {
-  if (argc != 2) {
-    fprintf(stderr, "usage: %s <test file>\n", argv[0]);
-    return 1;
-  }
-
-  FileTest::Options opts;
-  opts.path = argv[1];
-  opts.callback = TestTLSKDF;
-  opts.silent = true;
-  opts.comment_callback = EchoComment;
-  return FileTestMain(opts);
-}
diff --git a/util/fipstools/cavp/run_cavp.go b/util/fipstools/cavp/run_cavp.go
deleted file mode 100644
index 51a4100..0000000
--- a/util/fipstools/cavp/run_cavp.go
+++ /dev/null
@@ -1,592 +0,0 @@
-// run_cavp.go processes CAVP input files and generates suitable response
-// files, optionally comparing the results against the provided FAX files.
-package main
-
-import (
-	"bufio"
-	"errors"
-	"flag"
-	"fmt"
-	"os"
-	"os/exec"
-	"path"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"sync"
-	"time"
-)
-
-var (
-	oraclePath = flag.String("oracle-bin", "", "Path to the oracle binary")
-	suiteDir   = flag.String("suite-dir", "", "Base directory containing the CAVP test suite")
-	noFAX      = flag.Bool("no-fax", false, "Skip comparing against FAX files")
-	android    = flag.Bool("android", false, "Run tests via ADB")
-)
-
-const (
-	androidTmpPath       = "/data/local/tmp/"
-	androidCAVPPath      = androidTmpPath + "cavp"
-	androidLibCryptoPath = androidTmpPath + "libcrypto.so"
-)
-
-// test describes a single request file.
-type test struct {
-	// inFile is the base of the filename without an extension, i.e.
-	// “ECBMCT128”.
-	inFile string
-	// args are the arguments (not including the input filename) to the
-	// oracle binary.
-	args []string
-	// noFAX, if true, indicates that the output cannot be compared against
-	// the FAX file. (E.g. because the primitive is non-deterministic.)
-	noFAX bool
-}
-
-// nextLineState can be used by FAX next-line function to store state.
-type nextLineState struct {
-	// State used by the KAS test.
-	nextIsIUTHash bool
-}
-
-// testSuite describes a series of tests that are handled by a single oracle
-// binary.
-type testSuite struct {
-	// directory is the name of the directory in the CAVP input, i.e. “AES”.
-	directory string
-	// suite names the test suite to pass as the first command-line argument.
-	suite string
-	// nextLineFunc, if not nil, is the function used to read the next line
-	// from the FAX file. This can be used to skip lines and/or mutate them
-	// as needed. The second argument can be used by the scanner to store
-	// state, if needed. If isWildcard is true on return then line is not
-	// meaningful and any line from the response file should be accepted.
-	nextLineFunc func(*bufio.Scanner, *nextLineState) (line string, isWildcard, ok bool)
-	tests        []test
-}
-
-func (t *testSuite) getDirectory() string {
-	return filepath.Join(*suiteDir, t.directory)
-}
-
-var aesGCMTests = testSuite{
-	"AES_GCM",
-	"aes_gcm",
-	nil,
-	[]test{
-		{"gcmDecrypt128", []string{"dec", "aes-128-gcm"}, false},
-		{"gcmDecrypt192", []string{"dec", "aes-192-gcm"}, false},
-		{"gcmDecrypt256", []string{"dec", "aes-256-gcm"}, false},
-		{"gcmEncryptExtIV128", []string{"enc", "aes-128-gcm"}, false},
-		{"gcmEncryptExtIV192", []string{"enc", "aes-192-gcm"}, false},
-		{"gcmEncryptExtIV256", []string{"enc", "aes-256-gcm"}, false},
-	},
-}
-
-var aesTests = testSuite{
-	"AES",
-	"aes",
-	nil,
-	[]test{
-		{"CBCGFSbox128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCGFSbox192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCGFSbox256", []string{"kat", "aes-256-cbc"}, false},
-		{"CBCKeySbox128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCKeySbox192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCKeySbox256", []string{"kat", "aes-256-cbc"}, false},
-		{"CBCMMT128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCMMT192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCMMT256", []string{"kat", "aes-256-cbc"}, false},
-		{"CBCVarKey128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCVarKey192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCVarKey256", []string{"kat", "aes-256-cbc"}, false},
-		{"CBCVarTxt128", []string{"kat", "aes-128-cbc"}, false},
-		{"CBCVarTxt192", []string{"kat", "aes-192-cbc"}, false},
-		{"CBCVarTxt256", []string{"kat", "aes-256-cbc"}, false},
-		{"ECBGFSbox128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBGFSbox192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBGFSbox256", []string{"kat", "aes-256-ecb"}, false},
-		{"ECBKeySbox128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBKeySbox192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBKeySbox256", []string{"kat", "aes-256-ecb"}, false},
-		{"ECBMMT128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBMMT192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBMMT256", []string{"kat", "aes-256-ecb"}, false},
-		{"ECBVarKey128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBVarKey192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBVarKey256", []string{"kat", "aes-256-ecb"}, false},
-		{"ECBVarTxt128", []string{"kat", "aes-128-ecb"}, false},
-		{"ECBVarTxt192", []string{"kat", "aes-192-ecb"}, false},
-		{"ECBVarTxt256", []string{"kat", "aes-256-ecb"}, false},
-		// AES Monte-Carlo tests
-		{"ECBMCT128", []string{"mct", "aes-128-ecb"}, false},
-		{"ECBMCT192", []string{"mct", "aes-192-ecb"}, false},
-		{"ECBMCT256", []string{"mct", "aes-256-ecb"}, false},
-		{"CBCMCT128", []string{"mct", "aes-128-cbc"}, false},
-		{"CBCMCT192", []string{"mct", "aes-192-cbc"}, false},
-		{"CBCMCT256", []string{"mct", "aes-256-cbc"}, false},
-	},
-}
-
-var ecdsa2KeyPairTests = testSuite{
-	"ECDSA2",
-	"ecdsa2_keypair",
-	nil,
-	[]test{{"KeyPair", nil, true}},
-}
-
-var ecdsa2PKVTests = testSuite{
-	"ECDSA2",
-	"ecdsa2_pkv",
-	nil,
-	[]test{{"PKV", nil, false}},
-}
-
-var ecdsa2SigGenTests = testSuite{
-	"ECDSA2",
-	"ecdsa2_siggen",
-	nil,
-	[]test{
-		{"SigGen", []string{"SigGen"}, true},
-		{"SigGenComponent", []string{"SigGenComponent"}, true},
-	},
-}
-
-var ecdsa2SigVerTests = testSuite{
-	"ECDSA2",
-	"ecdsa2_sigver",
-	nil,
-	[]test{{"SigVer", nil, false}},
-}
-
-var rsa2KeyGenTests = testSuite{
-	"RSA2",
-	"rsa2_keygen",
-	nil,
-	[]test{
-		{"KeyGen_RandomProbablyPrime3_3", nil, true},
-	},
-}
-
-var rsa2SigGenTests = testSuite{
-	"RSA2",
-	"rsa2_siggen",
-	nil,
-	[]test{
-		{"SigGen15_186-3", []string{"pkcs15"}, true},
-		{"SigGenPSS_186-3", []string{"pss"}, true},
-	},
-}
-
-var rsa2SigVerTests = testSuite{
-	"RSA2",
-	"rsa2_sigver",
-	func(s *bufio.Scanner, state *nextLineState) (string, bool, bool) {
-		for {
-			if !s.Scan() {
-				return "", false, false
-			}
-
-			line := s.Text()
-			if strings.HasPrefix(line, "p = ") || strings.HasPrefix(line, "d = ") || strings.HasPrefix(line, "SaltVal = ") || strings.HasPrefix(line, "EM with ") {
-				continue
-			}
-			if strings.HasPrefix(line, "q = ") {
-				// Skip the "q = " line and an additional blank line.
-				if !s.Scan() ||
-					len(strings.TrimSpace(s.Text())) > 0 {
-					return "", false, false
-				}
-				continue
-			}
-			return line, false, true
-		}
-	},
-	[]test{
-		{"SigVer15_186-3", []string{"pkcs15"}, false},
-		{"SigVerPSS_186-3", []string{"pss"}, false},
-	},
-}
-
-var hmacTests = testSuite{
-	"HMAC",
-	"hmac",
-	nil,
-	[]test{{"HMAC", nil, false}},
-}
-
-var shaTests = testSuite{
-	"SHA",
-	"sha",
-	nil,
-	[]test{
-		{"SHA1LongMsg", []string{"SHA1"}, false},
-		{"SHA1ShortMsg", []string{"SHA1"}, false},
-		{"SHA224LongMsg", []string{"SHA224"}, false},
-		{"SHA224ShortMsg", []string{"SHA224"}, false},
-		{"SHA256LongMsg", []string{"SHA256"}, false},
-		{"SHA256ShortMsg", []string{"SHA256"}, false},
-		{"SHA384LongMsg", []string{"SHA384"}, false},
-		{"SHA384ShortMsg", []string{"SHA384"}, false},
-		{"SHA512LongMsg", []string{"SHA512"}, false},
-		{"SHA512ShortMsg", []string{"SHA512"}, false},
-	},
-}
-
-var shaMonteTests = testSuite{
-	"SHA",
-	"sha_monte",
-	nil,
-	[]test{
-		{"SHA1Monte", []string{"SHA1"}, false},
-		{"SHA224Monte", []string{"SHA224"}, false},
-		{"SHA256Monte", []string{"SHA256"}, false},
-		{"SHA384Monte", []string{"SHA384"}, false},
-		{"SHA512Monte", []string{"SHA512"}, false},
-	},
-}
-
-var ctrDRBGTests = testSuite{
-	"DRBG800-90A",
-	"ctr_drbg",
-	nil,
-	[]test{{"CTR_DRBG", nil, false}},
-}
-
-var tdesTests = testSuite{
-	"TDES",
-	"tdes",
-	nil,
-	[]test{
-		{"TCBCMMT2", []string{"kat", "des-ede-cbc"}, false},
-		{"TCBCMMT3", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCMonte2", []string{"mct", "des-ede3-cbc"}, false},
-		{"TCBCMonte3", []string{"mct", "des-ede3-cbc"}, false},
-		{"TCBCinvperm", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCpermop", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCsubtab", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCvarkey", []string{"kat", "des-ede3-cbc"}, false},
-		{"TCBCvartext", []string{"kat", "des-ede3-cbc"}, false},
-		{"TECBMMT2", []string{"kat", "des-ede"}, false},
-		{"TECBMMT3", []string{"kat", "des-ede3"}, false},
-		{"TECBMonte2", []string{"mct", "des-ede3"}, false},
-		{"TECBMonte3", []string{"mct", "des-ede3"}, false},
-		{"TECBinvperm", []string{"kat", "des-ede3"}, false},
-		{"TECBpermop", []string{"kat", "des-ede3"}, false},
-		{"TECBsubtab", []string{"kat", "des-ede3"}, false},
-		{"TECBvarkey", []string{"kat", "des-ede3"}, false},
-		{"TECBvartext", []string{"kat", "des-ede3"}, false},
-	},
-}
-
-var keyWrapTests = testSuite{
-	"KeyWrap38F",
-	"keywrap",
-	nil,
-	[]test{
-		{"KW_AD_128", []string{"dec", "128"}, false},
-		{"KW_AD_192", []string{"dec", "192"}, false},
-		{"KW_AD_256", []string{"dec", "256"}, false},
-		{"KW_AE_128", []string{"enc", "128"}, false},
-		{"KW_AE_192", []string{"enc", "192"}, false},
-		{"KW_AE_256", []string{"enc", "256"}, false},
-		{"KWP_AD_128", []string{"dec-pad", "128"}, false},
-		{"KWP_AD_192", []string{"dec-pad", "192"}, false},
-		{"KWP_AD_256", []string{"dec-pad", "256"}, false},
-		{"KWP_AE_128", []string{"enc-pad", "128"}, false},
-		{"KWP_AE_192", []string{"enc-pad", "192"}, false},
-		{"KWP_AE_256", []string{"enc-pad", "256"}, false},
-	},
-}
-
-var kasTests = testSuite{
-	"KAS",
-	"kas",
-	func(s *bufio.Scanner, state *nextLineState) (line string, isWildcard, ok bool) {
-		for {
-			// If the response file will include the IUT hash next,
-			// return a wildcard signal because this cannot be
-			// matched against the FAX file.
-			if state.nextIsIUTHash {
-				state.nextIsIUTHash = false
-				return "", true, true
-			}
-
-			if !s.Scan() {
-				return "", false, false
-			}
-
-			line := s.Text()
-			if strings.HasPrefix(line, "deCAVS = ") || strings.HasPrefix(line, "Z = ") {
-				continue
-			}
-			if strings.HasPrefix(line, "CAVSHashZZ = ") {
-				state.nextIsIUTHash = true
-			}
-			return line, false, true
-		}
-	},
-	[]test{
-		{"KASFunctionTest_ECCEphemeralUnified_NOKC_ZZOnly_init", []string{"function"}, true},
-		{"KASFunctionTest_ECCEphemeralUnified_NOKC_ZZOnly_resp", []string{"function"}, true},
-		{"KASValidityTest_ECCEphemeralUnified_NOKC_ZZOnly_init", []string{"validity"}, false},
-		{"KASValidityTest_ECCEphemeralUnified_NOKC_ZZOnly_resp", []string{"validity"}, false},
-	},
-}
-
-var tlsKDFTests = testSuite{
-	"KDF135",
-	"tlskdf",
-	nil,
-	[]test{
-		{"tls", nil, false},
-	},
-}
-
-var testSuites = []*testSuite{
-	&aesGCMTests,
-	&aesTests,
-	&ctrDRBGTests,
-	&ecdsa2KeyPairTests,
-	&ecdsa2PKVTests,
-	&ecdsa2SigGenTests,
-	&ecdsa2SigVerTests,
-	&hmacTests,
-	&keyWrapTests,
-	&rsa2KeyGenTests,
-	&rsa2SigGenTests,
-	&rsa2SigVerTests,
-	&shaTests,
-	&shaMonteTests,
-	&tdesTests,
-	&kasTests,
-	&tlsKDFTests,
-}
-
-// testInstance represents a specific test in a testSuite.
-type testInstance struct {
-	suite     *testSuite
-	testIndex int
-}
-
-func worker(wg *sync.WaitGroup, work <-chan testInstance) {
-	defer wg.Done()
-
-	for ti := range work {
-		test := ti.suite.tests[ti.testIndex]
-
-		if err := doTest(ti.suite, test); err != nil {
-			fmt.Fprintf(os.Stderr, "%s\n", err)
-			os.Exit(2)
-		}
-
-		if !*noFAX && !test.noFAX {
-			if err := compareFAX(ti.suite, test); err != nil {
-				fmt.Fprintf(os.Stderr, "%s\n", err)
-				os.Exit(3)
-			}
-		}
-	}
-}
-
-func checkAndroidPrereqs() error {
-	// The cavp binary, and a matching libcrypto.so, are required to be placed
-	// in /data/local/tmp before running this script.
-	if err := exec.Command("adb", "shell", "ls", androidCAVPPath).Run(); err != nil {
-		return errors.New("failed to list cavp binary; ensure that adb works and cavp binary is in place: " + err.Error())
-	}
-	if err := exec.Command("adb", "shell", "ls", androidLibCryptoPath).Run(); err != nil {
-		return errors.New("failed to list libcrypto.so; ensure that library is in place: " + err.Error())
-	}
-	return nil
-}
-
-func main() {
-	flag.Parse()
-
-	if *android {
-		if err := checkAndroidPrereqs(); err != nil {
-			fmt.Fprintf(os.Stderr, "%s\n", err)
-			os.Exit(1)
-		}
-	} else if len(*oraclePath) == 0 {
-		fmt.Fprintf(os.Stderr, "Must give -oracle-bin\n")
-		os.Exit(1)
-	}
-
-	work := make(chan testInstance)
-	var wg sync.WaitGroup
-
-	numWorkers := runtime.NumCPU()
-	if *android {
-		numWorkers = 1
-	}
-
-	for i := 0; i < numWorkers; i++ {
-		wg.Add(1)
-		go worker(&wg, work)
-	}
-
-	for _, suite := range testSuites {
-		for i := range suite.tests {
-			work <- testInstance{suite, i}
-		}
-	}
-
-	close(work)
-	wg.Wait()
-}
-
-func doTest(suite *testSuite, test test) error {
-	bin := *oraclePath
-	var args []string
-
-	if *android {
-		bin = "adb"
-		args = []string{"shell", "LD_LIBRARY_PATH=" + androidTmpPath, androidCAVPPath}
-	}
-
-	args = append(args, suite.suite)
-	args = append(args, test.args...)
-	reqPath := filepath.Join(suite.getDirectory(), "req", test.inFile+".req")
-	var reqPathOnDevice string
-
-	if *android {
-		reqPathOnDevice = path.Join(androidTmpPath, test.inFile+".req")
-		if err := exec.Command("adb", "push", reqPath, reqPathOnDevice).Run(); err != nil {
-			return errors.New("failed to push request file: " + err.Error())
-		}
-		args = append(args, reqPathOnDevice)
-	} else {
-		args = append(args, reqPath)
-	}
-
-	respDir := filepath.Join(suite.getDirectory(), "resp")
-	if err := os.Mkdir(respDir, 0755); err != nil && !os.IsExist(err) {
-		return fmt.Errorf("cannot create resp directory: %s", err)
-	}
-	outPath := filepath.Join(respDir, test.inFile+".rsp")
-	outFile, err := os.OpenFile(outPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
-	if err != nil {
-		return fmt.Errorf("cannot open output file for %q %q: %s", suite.getDirectory(), test.inFile, err)
-	}
-	defer outFile.Close()
-
-	cmd := exec.Command(bin, args...)
-	cmd.Stdout = outFile
-	cmd.Stderr = os.Stderr
-
-	cmdLine := strings.Join(append([]string{bin}, args...), " ")
-	startTime := time.Now()
-	if err := cmd.Run(); err != nil {
-		return fmt.Errorf("cannot run command for %q %q (%s): %s", suite.getDirectory(), test.inFile, cmdLine, err)
-	}
-
-	fmt.Printf("%s (%ds)\n", cmdLine, int(time.Since(startTime).Seconds()))
-
-	if *android {
-		exec.Command("adb", "shell", "rm", reqPathOnDevice).Run()
-	}
-
-	return nil
-}
-
-func canonicalizeLine(in string) string {
-	if strings.HasPrefix(in, "Result = P (") {
-		return "Result = P"
-	}
-	if strings.HasPrefix(in, "Result = F (") {
-		return "Result = F"
-	}
-	return in
-}
-
-func compareFAX(suite *testSuite, test test) error {
-	nextLineFunc := suite.nextLineFunc
-	if nextLineFunc == nil {
-		nextLineFunc = func(s *bufio.Scanner, state *nextLineState) (string, bool, bool) {
-			if !s.Scan() {
-				return "", false, false
-			}
-			return s.Text(), false, true
-		}
-	}
-
-	respPath := filepath.Join(suite.getDirectory(), "resp", test.inFile+".rsp")
-	respFile, err := os.Open(respPath)
-	if err != nil {
-		return fmt.Errorf("cannot read output of %q %q: %s", suite.getDirectory(), test.inFile, err)
-	}
-	defer respFile.Close()
-
-	faxPath := filepath.Join(suite.getDirectory(), "fax", test.inFile+".fax")
-	faxFile, err := os.Open(faxPath)
-	if err != nil {
-		return fmt.Errorf("cannot open fax file for %q %q: %s", suite.getDirectory(), test.inFile, err)
-	}
-	defer faxFile.Close()
-
-	respScanner := bufio.NewScanner(respFile)
-	faxScanner := bufio.NewScanner(faxFile)
-	var nextLineState nextLineState
-
-	lineNo := 0
-	inHeader := true
-
-	for respScanner.Scan() {
-		lineNo++
-		respLine := respScanner.Text()
-		var faxLine string
-		var isWildcard, ok bool
-
-		if inHeader && (len(respLine) == 0 || respLine[0] == '#') {
-			continue
-		}
-
-		for {
-			haveFaxLine := false
-
-			if inHeader {
-				for {
-					if faxLine, isWildcard, ok = nextLineFunc(faxScanner, &nextLineState); !ok {
-						break
-					}
-					if len(faxLine) != 0 && faxLine[0] != '#' {
-						haveFaxLine = true
-						break
-					}
-				}
-
-				inHeader = false
-			} else {
-				faxLine, isWildcard, haveFaxLine = nextLineFunc(faxScanner, &nextLineState)
-			}
-
-			if !haveFaxLine {
-				// Ignore blank lines at the end of the generated file.
-				if len(respLine) == 0 {
-					break
-				}
-				return fmt.Errorf("resp file is longer than fax for %q %q", suite.getDirectory(), test.inFile)
-			}
-
-			if strings.HasPrefix(faxLine, " (Reason: ") {
-				continue
-			}
-
-			break
-		}
-
-		if isWildcard || canonicalizeLine(faxLine) == canonicalizeLine(respLine) {
-			continue
-		}
-
-		return fmt.Errorf("resp and fax differ at line %d for %q %q: %q vs %q", lineNo, suite.getDirectory(), test.inFile, respLine, faxLine)
-	}
-
-	if _, _, ok := nextLineFunc(faxScanner, &nextLineState); ok {
-		return fmt.Errorf("fax file is longer than resp for %q %q", suite.getDirectory(), test.inFile)
-	}
-
-	return nil
-}
diff --git a/util/fipstools/test-break-kat.sh b/util/fipstools/test-break-kat.sh
index d343aa4..d2c44a7 100644
--- a/util/fipstools/test-break-kat.sh
+++ b/util/fipstools/test-break-kat.sh
@@ -18,7 +18,7 @@
 set -x
 set -e
 
-TEST_FIPS_BIN="build/util/fipstools/cavp/test_fips"
+TEST_FIPS_BIN="build/util/fipstools/test_fips"
 
 if [ ! -f $TEST_FIPS_BIN ]; then
   echo "$TEST_FIPS_BIN is missing. Run this script from the top level of a"
diff --git a/util/fipstools/cavp/test_fips.c b/util/fipstools/test_fips.c
similarity index 98%
rename from util/fipstools/cavp/test_fips.c
rename to util/fipstools/test_fips.c
index dd82d65..b3d5521 100644
--- a/util/fipstools/cavp/test_fips.c
+++ b/util/fipstools/test_fips.c
@@ -30,9 +30,9 @@
 #include <openssl/rsa.h>
 #include <openssl/sha.h>
 
-#include "../crypto/fipsmodule/rand/internal.h"
-#include "../crypto/fipsmodule/tls/internal.h"
-#include "../crypto/internal.h"
+#include "../../crypto/fipsmodule/rand/internal.h"
+#include "../../crypto/fipsmodule/tls/internal.h"
+#include "../../crypto/internal.h"
 
 
 static void hexdump(const void *a, size_t len) {