summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUtkarsh Sanghi <usanghi@google.com>2015-10-28 21:14:55 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-10-28 21:14:55 +0000
commitcabb381ef2970e1be85b1678381f8cac1b731401 (patch)
tree9c2a109855c9657b577041f3e09da5d2edfb60a3
parent203c680b569b4a5f82cdc262c013c16bd601260c (diff)
parentbbdb1b1f93626766baf7e293c7a9e532933531c3 (diff)
downloadtpm_manager-cabb381ef2970e1be85b1678381f8cac1b731401.tar.gz
Merge "tpm_manager: Add DBus method to remove owner dependency"
-rw-r--r--client/main.cc17
-rw-r--r--client/tpm_ownership_dbus_proxy.cc7
-rw-r--r--client/tpm_ownership_dbus_proxy.h3
-rw-r--r--client/tpm_ownership_dbus_proxy_test.cc34
-rw-r--r--common/mock_tpm_ownership_interface.h3
-rw-r--r--common/print_tpm_ownership_interface_proto.cc45
-rw-r--r--common/print_tpm_ownership_interface_proto.h8
-rw-r--r--common/tpm_ownership_dbus_interface.h1
-rw-r--r--common/tpm_ownership_interface.h7
-rw-r--r--common/tpm_ownership_interface.proto10
-rw-r--r--server/dbus_service.cc8
-rw-r--r--server/dbus_service_test.cc23
-rw-r--r--server/tpm_manager_service.cc14
-rw-r--r--server/tpm_manager_service.h9
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,