diff options
author | Utkarsh Sanghi <usanghi@google.com> | 2015-10-27 14:33:02 -0700 |
---|---|---|
committer | Utkarsh Sanghi <usanghi@google.com> | 2015-10-28 10:05:12 -0700 |
commit | bbdb1b1f93626766baf7e293c7a9e532933531c3 (patch) | |
tree | 8502598c0418eeecfe28681c854bcdeb285ea368 | |
parent | e9f4df5412da4aa513b8e73ff0a7e2adb0ceedc4 (diff) | |
download | tpm_manager-bbdb1b1f93626766baf7e293c7a9e532933531c3.tar.gz |
tpm_manager: Add DBus method to remove owner dependency
Bug: 24059577
TEST=tpm_manager_client --remove_dependency=Test on DUT
Change-Id: I09996187197b8b5ff717a32e751ebc07b060c15e
-rw-r--r-- | client/main.cc | 17 | ||||
-rw-r--r-- | client/tpm_ownership_dbus_proxy.cc | 7 | ||||
-rw-r--r-- | client/tpm_ownership_dbus_proxy.h | 3 | ||||
-rw-r--r-- | client/tpm_ownership_dbus_proxy_test.cc | 34 | ||||
-rw-r--r-- | common/mock_tpm_ownership_interface.h | 3 | ||||
-rw-r--r-- | common/print_tpm_ownership_interface_proto.cc | 45 | ||||
-rw-r--r-- | common/print_tpm_ownership_interface_proto.h | 8 | ||||
-rw-r--r-- | common/tpm_ownership_dbus_interface.h | 1 | ||||
-rw-r--r-- | common/tpm_ownership_interface.h | 7 | ||||
-rw-r--r-- | common/tpm_ownership_interface.proto | 10 | ||||
-rw-r--r-- | server/dbus_service.cc | 8 | ||||
-rw-r--r-- | server/dbus_service_test.cc | 23 | ||||
-rw-r--r-- | server/tpm_manager_service.cc | 14 | ||||
-rw-r--r-- | server/tpm_manager_service.h | 9 |
14 files changed, 189 insertions, 0 deletions
diff --git a/client/main.cc b/client/main.cc index a752c5c..4a1c164 100644 --- a/client/main.cc +++ b/client/main.cc @@ -39,6 +39,7 @@ namespace tpm_manager { const char kGetTpmStatusCommand[] = "status"; const char kTakeOwnershipCommand[] = "take_ownership"; +const char kRemoveOwnerDependencyCommand[] = "remove_dependency"; const char kDefineNvramCommand[] = "define_nvram"; const char kDestroyNvramCommand[] = "destroy_nvram"; const char kWriteNvramCommand[] = "write_nvram"; @@ -58,6 +59,8 @@ Commands (used as switches): Prints the current status of the Tpm. --take_ownership Takes ownership of the Tpm with a random password. + --remove_dependency=<owner_dependency> + Removes the provided Tpm owner dependency. --define_nvram Defines an NV space at |nvram_index| with length |nvram_length|. --destroy_nvram @@ -132,6 +135,11 @@ class ClientLoop : public ClientLoopBase { } else if (command_line->HasSwitch(kTakeOwnershipCommand)) { task = base::Bind(&ClientLoop::HandleTakeOwnership, weak_factory_.GetWeakPtr()); + } else if (command_line->HasSwitch(kRemoveOwnerDependencyCommand)) { + task = base::Bind( + &ClientLoop::HandleRemoveOwnerDependency, + weak_factory_.GetWeakPtr(), + command_line->GetSwitchValueASCII(kRemoveOwnerDependencyCommand)); } else if (command_line->HasSwitch(kDefineNvramCommand)) { if (!command_line->HasSwitch(kNvramIndexArg) || !command_line->HasSwitch(kNvramLengthArg)) { @@ -231,6 +239,15 @@ class ClientLoop : public ClientLoopBase { weak_factory_.GetWeakPtr())); } + void HandleRemoveOwnerDependency(const std::string& owner_dependency) { + RemoveOwnerDependencyRequest request; + request.set_owner_dependency(owner_dependency); + tpm_ownership_->RemoveOwnerDependency( + request, + base::Bind(&ClientLoop::PrintReplyAndQuit<RemoveOwnerDependencyReply>, + weak_factory_.GetWeakPtr())); + } + void HandleDefineNvram(uint32_t index, size_t length) { DefineNvramRequest request; request.set_index(index); diff --git a/client/tpm_ownership_dbus_proxy.cc b/client/tpm_ownership_dbus_proxy.cc index 3282ca4..ae5c6a5 100644 --- a/client/tpm_ownership_dbus_proxy.cc +++ b/client/tpm_ownership_dbus_proxy.cc @@ -60,6 +60,13 @@ void TpmOwnershipDBusProxy::TakeOwnership( tpm_manager::kTakeOwnership, request, callback); } +void TpmOwnershipDBusProxy::RemoveOwnerDependency( + const RemoveOwnerDependencyRequest& request, + const RemoveOwnerDependencyCallback& callback) { + CallMethod<RemoveOwnerDependencyReply>( + tpm_manager::kRemoveOwnerDependency, request, callback); +} + template<typename ReplyProtobufType, typename RequestProtobufType, typename CallbackType> diff --git a/client/tpm_ownership_dbus_proxy.h b/client/tpm_ownership_dbus_proxy.h index 34c1a49..1731f15 100644 --- a/client/tpm_ownership_dbus_proxy.h +++ b/client/tpm_ownership_dbus_proxy.h @@ -49,6 +49,9 @@ class TPM_MANAGER_EXPORT TpmOwnershipDBusProxy : public TpmOwnershipInterface { const GetTpmStatusCallback& callback) override; void TakeOwnership(const TakeOwnershipRequest& request, const TakeOwnershipCallback& callback) override; + void RemoveOwnerDependency( + const RemoveOwnerDependencyRequest& request, + const RemoveOwnerDependencyCallback& callback) override; void set_object_proxy(dbus::ObjectProxy* object_proxy) { object_proxy_ = object_proxy; diff --git a/client/tpm_ownership_dbus_proxy_test.cc b/client/tpm_ownership_dbus_proxy_test.cc index c9ef319..9a632c6 100644 --- a/client/tpm_ownership_dbus_proxy_test.cc +++ b/client/tpm_ownership_dbus_proxy_test.cc @@ -116,4 +116,38 @@ TEST_F(TpmOwnershipDBusProxyTest, TakeOwnership) { EXPECT_EQ(1, callback_count); } +TEST_F(TpmOwnershipDBusProxyTest, RemoveOwnerDependency) { + const std::string owner_dependency("owner"); + auto fake_dbus_call = [&owner_dependency]( + dbus::MethodCall* method_call, + const dbus::MockObjectProxy::ResponseCallback& response_callback) { + // Verify request protobuf. + dbus::MessageReader reader(method_call); + RemoveOwnerDependencyRequest request; + EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request)); + EXPECT_TRUE(request.has_owner_dependency()); + EXPECT_EQ(owner_dependency, request.owner_dependency()); + // Create reply protobuf. + auto response = dbus::Response::CreateEmpty(); + dbus::MessageWriter writer(response.get()); + RemoveOwnerDependencyReply reply; + reply.set_status(STATUS_SUCCESS); + writer.AppendProtoAsArrayOfBytes(reply); + response_callback.Run(response.release()); + }; + EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _)) + .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call))); + + // Set expectations on the outputs. + int callback_count = 0; + auto callback = [&callback_count](const RemoveOwnerDependencyReply& reply) { + callback_count++; + EXPECT_EQ(STATUS_SUCCESS, reply.status()); + }; + RemoveOwnerDependencyRequest request; + request.set_owner_dependency(owner_dependency); + proxy_.RemoveOwnerDependency(request, base::Bind(callback)); + EXPECT_EQ(1, callback_count); +} + } // namespace tpm_manager diff --git a/common/mock_tpm_ownership_interface.h b/common/mock_tpm_ownership_interface.h index 5ae7ac6..b26f650 100644 --- a/common/mock_tpm_ownership_interface.h +++ b/common/mock_tpm_ownership_interface.h @@ -32,6 +32,9 @@ class MockTpmOwnershipInterface : public TpmOwnershipInterface { const GetTpmStatusCallback& callback)); MOCK_METHOD2(TakeOwnership, void(const TakeOwnershipRequest& request, const TakeOwnershipCallback& callback)); + MOCK_METHOD2(RemoveOwnerDependency, + void(const RemoveOwnerDependencyRequest& request, + const RemoveOwnerDependencyCallback& callback)); }; } // namespace tpm_manager diff --git a/common/print_tpm_ownership_interface_proto.cc b/common/print_tpm_ownership_interface_proto.cc index 45163b1..3d56ae1 100644 --- a/common/print_tpm_ownership_interface_proto.cc +++ b/common/print_tpm_ownership_interface_proto.cc @@ -138,4 +138,49 @@ std::string GetProtoDebugStringWithIndent(const TakeOwnershipReply& value, return output; } +std::string GetProtoDebugString(const RemoveOwnerDependencyRequest& value) { + return GetProtoDebugStringWithIndent(value, 0); +} + +std::string GetProtoDebugStringWithIndent( + const RemoveOwnerDependencyRequest& value, + int indent_size) { + std::string indent(indent_size, ' '); + std::string output = + base::StringPrintf("[%s] {\n", value.GetTypeName().c_str()); + + if (value.has_owner_dependency()) { + output += indent + " owner_dependency: "; + base::StringAppendF(&output, "%s", + base::HexEncode(value.owner_dependency().data(), + value.owner_dependency().size()) + .c_str()); + output += "\n"; + } + output += indent + "}\n"; + return output; +} + +std::string GetProtoDebugString(const RemoveOwnerDependencyReply& value) { + return GetProtoDebugStringWithIndent(value, 0); +} + +std::string GetProtoDebugStringWithIndent( + const RemoveOwnerDependencyReply& value, + int indent_size) { + std::string indent(indent_size, ' '); + std::string output = + base::StringPrintf("[%s] {\n", value.GetTypeName().c_str()); + + if (value.has_status()) { + output += indent + " status: "; + base::StringAppendF( + &output, "%s", + GetProtoDebugStringWithIndent(value.status(), indent_size + 2).c_str()); + output += "\n"; + } + output += indent + "}\n"; + return output; +} + } // namespace tpm_manager diff --git a/common/print_tpm_ownership_interface_proto.h b/common/print_tpm_ownership_interface_proto.h index e6d532d..8e13510 100644 --- a/common/print_tpm_ownership_interface_proto.h +++ b/common/print_tpm_ownership_interface_proto.h @@ -37,6 +37,14 @@ std::string GetProtoDebugString(const TakeOwnershipRequest& value); std::string GetProtoDebugStringWithIndent(const TakeOwnershipReply& value, int indent_size); std::string GetProtoDebugString(const TakeOwnershipReply& value); +std::string GetProtoDebugStringWithIndent( + const RemoveOwnerDependencyRequest& value, + int indent_size); +std::string GetProtoDebugString(const RemoveOwnerDependencyRequest& value); +std::string GetProtoDebugStringWithIndent( + const RemoveOwnerDependencyReply& value, + int indent_size); +std::string GetProtoDebugString(const RemoveOwnerDependencyReply& value); } // namespace tpm_manager diff --git a/common/tpm_ownership_dbus_interface.h b/common/tpm_ownership_dbus_interface.h index 979b0ff..a009a30 100644 --- a/common/tpm_ownership_dbus_interface.h +++ b/common/tpm_ownership_dbus_interface.h @@ -24,6 +24,7 @@ constexpr char kTpmOwnershipInterface[] = "org.chromium.TpmOwnership"; // Methods exported by tpm_manager ownership D-Bus interface. constexpr char kGetTpmStatus[] = "GetTpmStatus"; constexpr char kTakeOwnership[] = "TakeOwnership"; +constexpr char kRemoveOwnerDependency[] = "RemoveOwnerDependency"; } // namespace tpm_manager diff --git a/common/tpm_ownership_interface.h b/common/tpm_ownership_interface.h index 145d41b..6219a1e 100644 --- a/common/tpm_ownership_interface.h +++ b/common/tpm_ownership_interface.h @@ -40,6 +40,13 @@ class TPM_MANAGER_EXPORT TpmOwnershipInterface { virtual void TakeOwnership(const TakeOwnershipRequest& request, const TakeOwnershipCallback& callback) = 0; + // Processes a RemoveOwnerDependencyRequest and responds with a + // RemoveOwnerDependencyReply. + using RemoveOwnerDependencyCallback = + base::Callback<void(const RemoveOwnerDependencyReply&)>; + virtual void RemoveOwnerDependency( + const RemoveOwnerDependencyRequest& request, + const RemoveOwnerDependencyCallback& callback) = 0; }; } // namespace tpm_manager diff --git a/common/tpm_ownership_interface.proto b/common/tpm_ownership_interface.proto index f1aa4c2..e01a2bc 100644 --- a/common/tpm_ownership_interface.proto +++ b/common/tpm_ownership_interface.proto @@ -54,3 +54,13 @@ message TakeOwnershipRequest { message TakeOwnershipReply { optional TpmManagerStatus status = 1; } + +// Input for the RemoveOwnerDependency method. +message RemoveOwnerDependencyRequest { + optional bytes owner_dependency = 1; +} + +// Output for the RemoveOwnerDependency method. +message RemoveOwnerDependencyReply { + optional TpmManagerStatus status = 1; +} diff --git a/server/dbus_service.cc b/server/dbus_service.cc index 2859ca9..6e1945c 100644 --- a/server/dbus_service.cc +++ b/server/dbus_service.cc @@ -56,6 +56,14 @@ void DBusService::Register(const CompletionAction& callback) { TakeOwnershipReply, &TpmOwnershipInterface::TakeOwnership>); + ownership_dbus_interface->AddMethodHandler( + kRemoveOwnerDependency, + base::Unretained(this), + &DBusService::HandleOwnershipDBusMethod< + RemoveOwnerDependencyRequest, + RemoveOwnerDependencyReply, + &TpmOwnershipInterface::RemoveOwnerDependency>); + brillo::dbus_utils::DBusInterface* nvram_dbus_interface = dbus_object_.AddOrGetInterface(kTpmNvramInterface); diff --git a/server/dbus_service_test.cc b/server/dbus_service_test.cc index 2696dcc..f4bb55f 100644 --- a/server/dbus_service_test.cc +++ b/server/dbus_service_test.cc @@ -144,6 +144,29 @@ TEST_F(DBusServiceTest, TakeOwnership) { EXPECT_EQ(STATUS_SUCCESS, reply.status()); } +TEST_F(DBusServiceTest, RemoveOwnerDependency) { + std::string owner_dependency("owner_dependency"); + RemoveOwnerDependencyRequest request; + request.set_owner_dependency(owner_dependency); + EXPECT_CALL(mock_ownership_service_, RemoveOwnerDependency(_, _)) + .WillOnce(Invoke([&owner_dependency]( + const RemoveOwnerDependencyRequest& request, + const TpmOwnershipInterface::RemoveOwnerDependencyCallback& callback) + { + EXPECT_TRUE(request.has_owner_dependency()); + EXPECT_EQ(owner_dependency, request.owner_dependency()); + RemoveOwnerDependencyReply reply; + reply.set_status(STATUS_SUCCESS); + callback.Run(reply); + })); + RemoveOwnerDependencyReply reply; + ExecuteMethod(kRemoveOwnerDependency, + request, + &reply, + kTpmOwnershipInterface); + EXPECT_EQ(STATUS_SUCCESS, reply.status()); +} + TEST_F(DBusServiceTest, DefineNvram) { uint32_t nvram_index = 5; size_t nvram_length = 32; diff --git a/server/tpm_manager_service.cc b/server/tpm_manager_service.cc index ac6992b..fe56127 100644 --- a/server/tpm_manager_service.cc +++ b/server/tpm_manager_service.cc @@ -111,6 +111,20 @@ void TpmManagerService::TakeOwnershipTask( result->set_status(STATUS_SUCCESS); } +void TpmManagerService::RemoveOwnerDependency( + const RemoveOwnerDependencyRequest& request, + const RemoveOwnerDependencyCallback& callback) { + PostTaskToWorkerThread<RemoveOwnerDependencyReply>( + request, callback, &TpmManagerService::RemoveOwnerDependencyTask); +} + +void TpmManagerService::RemoveOwnerDependencyTask( + const RemoveOwnerDependencyRequest& request, + const std::shared_ptr<RemoveOwnerDependencyReply>& result) { + VLOG(1) << __func__; + result->set_status(STATUS_NOT_AVAILABLE); +} + void TpmManagerService::DefineNvram(const DefineNvramRequest& request, const DefineNvramCallback& callback) { PostTaskToWorkerThread<DefineNvramReply>( diff --git a/server/tpm_manager_service.h b/server/tpm_manager_service.h index 64196d4..9bf6c6d 100644 --- a/server/tpm_manager_service.h +++ b/server/tpm_manager_service.h @@ -74,6 +74,9 @@ class TpmManagerService : public TpmNvramInterface, const GetTpmStatusCallback& callback) override; void TakeOwnership(const TakeOwnershipRequest& request, const TakeOwnershipCallback& callback) override; + void RemoveOwnerDependency( + const RemoveOwnerDependencyRequest& request, + const RemoveOwnerDependencyCallback& callback) override; // TpmNvramInterface methods. void DefineNvram(const DefineNvramRequest& request, @@ -126,6 +129,12 @@ class TpmManagerService : public TpmNvramInterface, void TakeOwnershipTask(const TakeOwnershipRequest& request, const std::shared_ptr<TakeOwnershipReply>& result); + // Blocking implementation of RemoveOwnerDependency that can be executed on + // the background worker thread. + void RemoveOwnerDependencyTask( + const RemoveOwnerDependencyRequest& request, + const std::shared_ptr<RemoveOwnerDependencyReply>& result); + // Blocking implementation of DefineNvram that can be executed on the // background worker thread. void DefineNvramTask(const DefineNvramRequest& request, |