diff --git a/cc/daead/BUILD.bazel b/cc/daead/BUILD.bazel
index df9018aa5a57020719f39a1434e634c9ef890322..70d43c0f7b78b92a2a484442438e6a87b8c41101 100644
--- a/cc/daead/BUILD.bazel
+++ b/cc/daead/BUILD.bazel
@@ -103,13 +103,10 @@ cc_test(
     deps = [
         ":aes_siv_key_manager",
         "//cc:aead",
-        "//cc:core/key_manager_impl",
         "//cc/util:status",
         "//cc/util:statusor",
-        "//proto:aes_eax_cc_proto",
+        "//cc/util:test_matchers",
         "//proto:aes_siv_cc_proto",
-        "//proto:common_cc_proto",
-        "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
diff --git a/cc/daead/CMakeLists.txt b/cc/daead/CMakeLists.txt
index b9e9178c9f42dae0bb001223b94941c424024250..a746c8c6c0d3b52bcc7caccaeefa3a0c924d3202 100644
--- a/cc/daead/CMakeLists.txt
+++ b/cc/daead/CMakeLists.txt
@@ -16,8 +16,6 @@ tink_cc_library(
     tink::util::statusor
     tink::util::validation
     tink::proto::aes_siv_cc_proto
-    tink::proto::common_cc_proto
-    tink::proto::tink_cc_proto
     absl::strings
 )
 
@@ -90,13 +88,10 @@ tink_cc_test(
   DEPS
     tink::daead::aes_siv_key_manager
     tink::core::deterministic_aead
-    tink::core::key_manager_impl
     tink::util::status
     tink::util::statusor
-    tink::proto::aes_eax_cc_proto
     tink::proto::aes_siv_cc_proto
-    tink::proto::common_cc_proto
-    tink::proto::tink_cc_proto
+    gmock
 )
 
 tink_cc_test(
diff --git a/cc/daead/aes_siv_key_manager_test.cc b/cc/daead/aes_siv_key_manager_test.cc
index e9e1c1399ab90f3825f35e9f0038b20833bb41c4..3cec51007f06bae0ca422e8a702b1537a53ff2c2 100644
--- a/cc/daead/aes_siv_key_manager_test.cc
+++ b/cc/daead/aes_siv_key_manager_test.cc
@@ -16,268 +16,142 @@
 
 #include "tink/daead/aes_siv_key_manager.h"
 
-#include "tink/core/key_manager_impl.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/deterministic_aead.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-#include "proto/aes_eax.pb.h"
+#include "tink/util/test_matchers.h"
 #include "proto/aes_siv.pb.h"
-#include "proto/common.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::AesEaxKeyFormat;
-using google::crypto::tink::AesSivKey;
-using google::crypto::tink::AesSivKeyFormat;
-using google::crypto::tink::KeyData;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::AesSivKey;
+using ::google::crypto::tink::AesSivKeyFormat;
+using ::testing::Eq;
+using ::testing::Ne;
+using ::testing::Not;
+using ::testing::SizeIs;
 
 namespace {
 
-class AesSivKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string aes_siv_key_type_ =
-      "type.googleapis.com/google.crypto.tink.AesSivKey";
-};
+TEST(AesSivKeyManagerTest, Basics) {
+  EXPECT_THAT(AesSivKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(AesSivKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.AesSivKey"));
+  EXPECT_THAT(AesSivKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
+}
 
-TEST_F(AesSivKeyManagerTest, testBasic) {
-  AesSivKeyManager key_type_manager;
-  auto key_manager =
-      internal::MakeKeyManager<DeterministicAead>(&key_type_manager);
+TEST(AesSivKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(AesSivKeyManager().ValidateKey(AesSivKey()), Not(IsOk()));
+}
 
-  EXPECT_EQ(0, key_manager->get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.AesSivKey",
-            key_manager->get_key_type());
-  EXPECT_TRUE(key_manager->DoesSupport(key_manager->get_key_type()));
+TEST(AesSivKeyManagerTest, ValidateEmptyKeyFormat) {
+  EXPECT_THAT(AesSivKeyManager().ValidateKeyFormat(AesSivKeyFormat()),
+              Not(IsOk()));
 }
 
-TEST_F(AesSivKeyManagerTest, testKeyDataErrors) {
-  AesSivKeyManager key_type_manager;
-  auto key_manager =
-      internal::MakeKeyManager<DeterministicAead>(&key_type_manager);
+TEST(AesSivKeyManagerTest, ValidKeyFormat) {
+  AesSivKeyFormat format;
+  format.set_key_size(64);
+  EXPECT_THAT(AesSivKeyManager().ValidateKeyFormat(format), IsOk());
+}
 
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager->GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
+TEST(AesSivKeyManagerTest, ValidateKeyFormatWithWrongSizes) {
+  AesSivKeyFormat format;
 
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(aes_siv_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager->GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
+  for (int i = 0; i < 64; ++i) {
+    format.set_key_size(i);
+    EXPECT_THAT(AesSivKeyManager().ValidateKeyFormat(format), Not(IsOk()))
+        << " for length " << i;
   }
-
-  {  // Bad version.
-    KeyData key_data;
-    AesSivKey key;
-    key.set_version(1);
-    key_data.set_type_url(aes_siv_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager->GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported size: 64).
-    for (int len = 0; len < 72; len++) {
-      AesSivKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      KeyData key_data;
-      key_data.set_type_url(aes_siv_key_type_);
-      key_data.set_value(key.SerializeAsString());
-      auto result = key_manager->GetPrimitive(key_data);
-      if (len == 64) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                  result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported size",
-                            result.status().error_message());
-      }
-    }
+  for (int i = 65; i <= 200; ++i) {
+    format.set_key_size(i);
+    EXPECT_THAT(AesSivKeyManager().ValidateKeyFormat(format), Not(IsOk()))
+        << " for length " << i;
   }
 }
 
-TEST_F(AesSivKeyManagerTest, testKeyMessageErrors) {
-  AesSivKeyManager key_type_manager;
-  auto key_manager =
-      internal::MakeKeyManager<DeterministicAead>(&key_type_manager);
+TEST(AesSivKeyManagerTest, CreateKey) {
+  AesSivKeyFormat format;
+  format.set_key_size(64);
+  auto key_or = AesSivKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().key_value(), SizeIs(format.key_size()));
+  EXPECT_THAT(key_or.ValueOrDie().version(), Eq(0));
+}
 
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager->GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
+TEST(AesSivKeyManagerTest, CreateKeyIsValid) {
+  AesSivKeyFormat format;
+  format.set_key_size(64);
+  auto key_or = AesSivKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(AesSivKeyManager().ValidateKey(key_or.ValueOrDie()), IsOk());
+}
 
-  {  // Bad key_value size (supported size: 64).
-    for (int len = 0; len < 72; len++) {
-      AesSivKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      auto result = key_manager->GetPrimitive(key);
-      if (len == 64) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                  result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported size",
-                            result.status().error_message());
-      }
-    }
-  }
+TEST(AesSivKeyManagerTest, MultipleCreateCallsCreateDifferentKeys) {
+  AesSivKeyFormat format;
+  AesSivKeyManager manager;
+  format.set_key_size(64);
+  auto key1_or = manager.CreateKey(format);
+  ASSERT_THAT(key1_or.status(), IsOk());
+  auto key2_or = manager.CreateKey(format);
+  ASSERT_THAT(key2_or.status(), IsOk());
+  EXPECT_THAT(key1_or.ValueOrDie().key_value(),
+              Ne(key2_or.ValueOrDie().key_value()));
 }
 
-TEST_F(AesSivKeyManagerTest, testPrimitives) {
-  std::string plaintext = "some plaintext";
-  std::string aad = "some aad";
-  AesSivKeyManager key_type_manager;
-  auto key_manager =
-      internal::MakeKeyManager<DeterministicAead>(&key_type_manager);
+TEST(AesSivKeyManagerTest, ValidateKey) {
   AesSivKey key;
-
+  *key.mutable_key_value() = std::string(64, 'a');
   key.set_version(0);
-  key.set_key_value(
-      "64 bytes of key 0123456789abcdef0123456789abcdef0123456789abcdef");
-
-  {  // Using key message only.
-    auto result = key_manager->GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto aes_siv = std::move(result.ValueOrDie());
-    auto encrypt_result = aes_siv->EncryptDeterministically(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result =
-        aes_siv->DecryptDeterministically(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-  }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(aes_siv_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager->GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto aes_siv = std::move(result.ValueOrDie());
-    auto encrypt_result = aes_siv->EncryptDeterministically(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result =
-        aes_siv->DecryptDeterministically(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-  }
+  EXPECT_THAT(AesSivKeyManager().ValidateKey(key), IsOk());
 }
 
-TEST_F(AesSivKeyManagerTest, testNewKeyErrors) {
-  AesSivKeyManager key_type_manager;
-  auto key_manager =
-      internal::MakeKeyManager<DeterministicAead>(&key_type_manager);
-  const KeyFactory& key_factory = key_manager->get_key_factory();
-
-  {  // Bad key format.
-    AesEaxKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKeyFormat",
-                        result.status().error_message());
-  }
-
-  {  // Bad serialized key format.
-    auto result = key_factory.NewKey("some bad serialized proto");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
+TEST(AesSivKeyManagerTest, ValidateKeyStringLength) {
+  AesSivKey key;
+    key.set_version(0);
+  for (int i = 0 ; i < 64; ++i) {
+    *key.mutable_key_value() = std::string(i, 'a');
+    EXPECT_THAT(AesSivKeyManager().ValidateKey(key), Not(IsOk()));
   }
-
-  {  // Bad AesSivKeyFormat: small key_size.
-    AesSivKeyFormat key_format;
-    key_format.set_key_size(32);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "key size",
-                        result.status().error_message());
+  for (int i = 65 ; i <= 200; ++i) {
+    *key.mutable_key_value() = std::string(i, 'a');
+    EXPECT_THAT(AesSivKeyManager().ValidateKey(key), Not(IsOk()));
   }
 }
 
-TEST_F(AesSivKeyManagerTest, testNewKeyBasic) {
-  AesSivKeyManager key_type_manager;
-  auto key_manager =
-      internal::MakeKeyManager<DeterministicAead>(&key_type_manager);
-  const KeyFactory& key_factory = key_manager->get_key_factory();
-  AesSivKeyFormat key_format;
-  key_format.set_key_size(64);
-
-  { // Via NewKey(format_proto).
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix_ + key->GetTypeName(), aes_siv_key_type_);
-    std::unique_ptr<AesSivKey> aes_siv_key(
-        reinterpret_cast<AesSivKey*>(key.release()));
-    EXPECT_EQ(0, aes_siv_key->version());
-    EXPECT_EQ(key_format.key_size(), aes_siv_key->key_value().size());
-  }
-
-  { // Via NewKey(serialized_format_proto).
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix_ + key->GetTypeName(), aes_siv_key_type_);
-    std::unique_ptr<AesSivKey> aes_siv_key(
-        reinterpret_cast<AesSivKey*>(key.release()));
-    EXPECT_EQ(0, aes_siv_key->version());
-    EXPECT_EQ(key_format.key_size(), aes_siv_key->key_value().size());
-  }
+TEST(AesSivKeyManagerTest, ValidateKeyVersion) {
+  AesSivKey key;
+  *key.mutable_key_value() = std::string(64, 'a');
+  key.set_version(1);
+  EXPECT_THAT(AesSivKeyManager().ValidateKey(key), Not(IsOk()));
+}
 
-  { // Via NewKeyData(serialized_format_proto).
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(aes_siv_key_type_, key_data->type_url());
-    EXPECT_EQ(KeyData::SYMMETRIC, key_data->key_material_type());
-    AesSivKey aes_siv_key;
-    EXPECT_TRUE(aes_siv_key.ParseFromString(key_data->value()));
-    EXPECT_EQ(0, aes_siv_key.version());
-    EXPECT_EQ(key_format.key_size(), aes_siv_key.key_value().size());
-  }
+TEST(AesSivKeyManagerTest, GetPrimitive) {
+  AesSivKeyFormat format;
+  format.set_key_size(64);
+  auto key_or = AesSivKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  auto daead_or =
+      AesSivKeyManager().GetPrimitive<DeterministicAead>(key_or.ValueOrDie());
+  ASSERT_THAT(daead_or.status(), IsOk());
+
+  auto direct_daead_or =
+      subtle::AesSivBoringSsl::New(key_or.ValueOrDie().key_value());
+  ASSERT_THAT(direct_daead_or.status(), IsOk());
+
+  auto encryption_or =
+      daead_or.ValueOrDie()->EncryptDeterministically("123", "abcd");
+  ASSERT_THAT(encryption_or.status(), IsOk());
+  auto direct_encryption_or =
+      direct_daead_or.ValueOrDie()->EncryptDeterministically("123", "abcd");
+  ASSERT_THAT(direct_encryption_or.status(), IsOk());
+  ASSERT_THAT(encryption_or.ValueOrDie(),
+              Eq(direct_encryption_or.ValueOrDie()));
 }
 
 }  // namespace