dbus_proxy_test.cc revision 62c73fa5a343fbbf6a0b0176dd789352b85c44e5
1b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// Copyright 2015 The Chromium OS Authors. All rights reserved.
2b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// Use of this source code is governed by a BSD-style license that can be
3b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// found in the LICENSE file.
4b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
5b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <string>
6b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
70752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include <chromeos/bind_lambda.h>
8b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/mock_object_proxy.h>
9b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <gmock/gmock.h>
10b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <gtest/gtest.h>
11b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
12b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/client/dbus_proxy.h"
13b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
14b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::_;
15b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::Invoke;
16b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::StrictMock;
17b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnusing testing::WithArgs;
18b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
19b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnnamespace attestation {
20b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
21b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnclass DBusProxyTest : public testing::Test {
22b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn public:
23b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  ~DBusProxyTest() override = default;
24b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  void SetUp() override {
25b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    mock_object_proxy_ = new StrictMock<dbus::MockObjectProxy>(
26b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn        nullptr, "", dbus::ObjectPath(""));
27b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    proxy_.set_object_proxy(mock_object_proxy_.get());
28b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  }
29b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn protected:
30b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  scoped_refptr<StrictMock<dbus::MockObjectProxy>> mock_object_proxy_;
31b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  DBusProxy proxy_;
32b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn};
33b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
346222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(DBusProxyTest, CreateGoogleAttestedKey) {
350752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  auto fake_dbus_call = [](
360752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      dbus::MethodCall* method_call,
370752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
38b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    // Verify request protobuf.
39b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    dbus::MessageReader reader(method_call);
40b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    CreateGoogleAttestedKeyRequest request_proto;
41b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
42b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ("label", request_proto.key_label());
43b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
44b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, request_proto.key_usage());
45b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    EXPECT_EQ(ENTERPRISE_MACHINE_CERTIFICATE,
46b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn              request_proto.certificate_profile());
4759d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn    EXPECT_EQ("user", request_proto.username());
4859d7aa26782d3c6efd707e3b936d56c893a2555aDarren Krahn    EXPECT_EQ("origin", request_proto.origin());
49b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    // Create reply protobuf.
502e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
51b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    dbus::MessageWriter writer(response.get());
52b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    CreateGoogleAttestedKeyReply reply_proto;
53d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
540752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    reply_proto.set_certificate_chain("certificate");
55b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    reply_proto.set_server_error("server_error");
56b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
570752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    response_callback.Run(response.release());
58b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  };
596222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
600752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
610752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
620752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  // Set expectations on the outputs.
63d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  int callback_count = 0;
64b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  auto callback = [&callback_count](const CreateGoogleAttestedKeyReply& reply) {
65d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn    callback_count++;
66b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
67b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ("certificate", reply.certificate_chain());
68b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn    EXPECT_EQ("server_error", reply.server_error());
690752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  };
70b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  CreateGoogleAttestedKeyRequest request;
71b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_label("label");
72b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
73b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_usage(KEY_USAGE_SIGN);
74b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_certificate_profile(ENTERPRISE_MACHINE_CERTIFICATE);
75b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_username("user");
76b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_origin("origin");
77b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  proxy_.CreateGoogleAttestedKey(request, base::Bind(callback));
78d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn  EXPECT_EQ(1, callback_count);
79b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
80b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
816222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(DBusProxyTest, GetKeyInfo) {
826222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  auto fake_dbus_call = [](
836222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      dbus::MethodCall* method_call,
846222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
856222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    // Verify request protobuf.
866222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    dbus::MessageReader reader(method_call);
876222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    GetKeyInfoRequest request_proto;
886222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
896222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("label", request_proto.key_label());
906222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("username", request_proto.username());
916222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    // Create reply protobuf.
922e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
936222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    dbus::MessageWriter writer(response.get());
946222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    GetKeyInfoReply reply_proto;
956222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
966222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_key_type(KEY_TYPE_ECC);
976222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_key_usage(KEY_USAGE_SIGN);
986222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_public_key("public_key");
996222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certify_info("certify_info");
1006222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certify_info_signature("signature");
1016222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    reply_proto.set_certificate("certificate");
1026222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
1036222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    response_callback.Run(response.release());
1046222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  };
1056222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
1066222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
1076222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
1086222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  // Set expectations on the outputs.
1096222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  int callback_count = 0;
1106222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  auto callback = [&callback_count](const GetKeyInfoReply& reply) {
1116222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    callback_count++;
1126222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
1136222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, reply.key_type());
1146222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, reply.key_usage());
1156222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("public_key", reply.public_key());
1166222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("certify_info", reply.certify_info());
1176222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("signature", reply.certify_info_signature());
1186222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
1196222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  };
1206222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  GetKeyInfoRequest request;
1216222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  request.set_key_label("label");
1226222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  request.set_username("username");
1236222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  proxy_.GetKeyInfo(request, base::Bind(callback));
1246222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ(1, callback_count);
1256222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}
1266222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
127cd5486df897619718b68223ebefc1322a1f5ab29Darren KrahnTEST_F(DBusProxyTest, GetEndorsementInfo) {
128cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  auto fake_dbus_call = [](
129cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      dbus::MethodCall* method_call,
130cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
131cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    // Verify request protobuf.
132cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    dbus::MessageReader reader(method_call);
133cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    GetEndorsementInfoRequest request_proto;
134cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
135cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
136cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    // Create reply protobuf.
1372e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
138cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    dbus::MessageWriter writer(response.get());
139cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    GetEndorsementInfoReply reply_proto;
140cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
141cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_ek_public_key("public_key");
142cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    reply_proto.set_ek_certificate("certificate");
143cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
144cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    response_callback.Run(response.release());
145cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  };
146cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
147cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
148cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
149cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  // Set expectations on the outputs.
150cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  int callback_count = 0;
151cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  auto callback = [&callback_count](const GetEndorsementInfoReply& reply) {
152cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    callback_count++;
153cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
154cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ("public_key", reply.ek_public_key());
155cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    EXPECT_EQ("certificate", reply.ek_certificate());
156cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  };
157cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  GetEndorsementInfoRequest request;
158cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  request.set_key_type(KEY_TYPE_ECC);
159cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  proxy_.GetEndorsementInfo(request, base::Bind(callback));
160cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_EQ(1, callback_count);
161cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn}
162cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
163566c836c403212d5c13428b02ed65e5ff6e49a6bDarren KrahnTEST_F(DBusProxyTest, GetAttestationKeyInfo) {
164566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  auto fake_dbus_call = [](
165566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      dbus::MethodCall* method_call,
166566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
167566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    // Verify request protobuf.
168566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    dbus::MessageReader reader(method_call);
169566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    GetAttestationKeyInfoRequest request_proto;
170566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
171566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
172566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    // Create reply protobuf.
1732e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
174566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    dbus::MessageWriter writer(response.get());
175566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    GetAttestationKeyInfoReply reply_proto;
176566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
177566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_public_key("public_key");
1782e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_public_key_tpm_format("public_key_tpm_format");
179566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.set_certificate("certificate");
180566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.mutable_pcr0_quote()->set_quote("pcr0");
181566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    reply_proto.mutable_pcr1_quote()->set_quote("pcr1");
182566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
183566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    response_callback.Run(response.release());
184566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  };
185566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
186566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
187566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
188566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  // Set expectations on the outputs.
189566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  int callback_count = 0;
190566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  auto callback = [&callback_count](const GetAttestationKeyInfoReply& reply) {
191566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    callback_count++;
192566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
193566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("public_key", reply.public_key());
1942e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("public_key_tpm_format", reply.public_key_tpm_format());
195566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
196566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("pcr0", reply.pcr0_quote().quote());
197566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    EXPECT_EQ("pcr1", reply.pcr1_quote().quote());
198566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  };
199566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  GetAttestationKeyInfoRequest request;
200566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
201566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  proxy_.GetAttestationKeyInfo(request, base::Bind(callback));
202566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_EQ(1, callback_count);
203566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn}
204566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
2052e89ba764046e015ae90a1668f7cb3eb29cf509dDarren KrahnTEST_F(DBusProxyTest, ActivateAttestationKey) {
2062e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  auto fake_dbus_call = [](
2072e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      dbus::MethodCall* method_call,
2082e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
2092e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    // Verify request protobuf.
2102e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    dbus::MessageReader reader(method_call);
2112e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    ActivateAttestationKeyRequest request_proto;
2122e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
2132e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
2142e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("encrypted1",
2152e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn              request_proto.encrypted_certificate().asym_ca_contents());
2162e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("encrypted2",
2172e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn              request_proto.encrypted_certificate().sym_ca_attestation());
2182e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_TRUE(request_proto.save_certificate());
2192e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    // Create reply protobuf.
2202e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    auto response = dbus::Response::CreateEmpty();
2212e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    dbus::MessageWriter writer(response.get());
2222e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    ActivateAttestationKeyReply reply_proto;
2232e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_status(STATUS_SUCCESS);
2242e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    reply_proto.set_certificate("certificate");
2252e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
2262e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    response_callback.Run(response.release());
2272e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  };
2282e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
2292e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
2302e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
2312e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  // Set expectations on the outputs.
2322e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  int callback_count = 0;
2332e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  auto callback = [&callback_count](const ActivateAttestationKeyReply& reply) {
2342e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    callback_count++;
2352e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
2362e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    EXPECT_EQ("certificate", reply.certificate());
2372e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  };
2382e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  ActivateAttestationKeyRequest request;
2392e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
2402e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.mutable_encrypted_certificate()->set_asym_ca_contents("encrypted1");
2412e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.mutable_encrypted_certificate()->set_sym_ca_attestation("encrypted2");
2422e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.set_save_certificate(true);
2432e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  proxy_.ActivateAttestationKey(request, base::Bind(callback));
2442e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_EQ(1, callback_count);
2452e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn}
2462e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
24762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren KrahnTEST_F(DBusProxyTest, CreateCertifiableKey) {
24862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  auto fake_dbus_call = [](
24962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      dbus::MethodCall* method_call,
25062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      const dbus::MockObjectProxy::ResponseCallback& response_callback) {
25162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    // Verify request protobuf.
25262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    dbus::MessageReader reader(method_call);
25362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    CreateCertifiableKeyRequest request_proto;
25462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&request_proto));
25562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("label", request_proto.key_label());
25662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(KEY_TYPE_ECC, request_proto.key_type());
25762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(KEY_USAGE_SIGN, request_proto.key_usage());
25862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("user", request_proto.username());
25962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    // Create reply protobuf.
26062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    auto response = dbus::Response::CreateEmpty();
26162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    dbus::MessageWriter writer(response.get());
26262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    CreateCertifiableKeyReply reply_proto;
26362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_status(STATUS_SUCCESS);
26462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_public_key("public_key");
26562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_certify_info("certify_info");
26662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    reply_proto.set_certify_info_signature("signature");
26762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    writer.AppendProtoAsArrayOfBytes(reply_proto);
26862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    response_callback.Run(response.release());
26962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  };
27062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_CALL(*mock_object_proxy_, CallMethodWithErrorCallback(_, _, _, _))
27162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      .WillOnce(WithArgs<0, 2>(Invoke(fake_dbus_call)));
27262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
27362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // Set expectations on the outputs.
27462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  int callback_count = 0;
27562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  auto callback = [&callback_count](const CreateCertifiableKeyReply& reply) {
27662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    callback_count++;
27762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ(STATUS_SUCCESS, reply.status());
27862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("public_key", reply.public_key());
27962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("certify_info", reply.certify_info());
28062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    EXPECT_EQ("signature", reply.certify_info_signature());
28162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  };
28262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  CreateCertifiableKeyRequest request;
28362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_label("label");
28462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_type(KEY_TYPE_ECC);
28562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_usage(KEY_USAGE_SIGN);
28662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_username("user");
28762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  proxy_.CreateCertifiableKey(request, base::Bind(callback));
28862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_EQ(1, callback_count);
28962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn}
29062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
291b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}  // namespace attestation
292