13daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
23daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Copyright (C) 2014 The Android Open Source Project
33daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
43daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
53daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// you may not use this file except in compliance with the License.
63daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// You may obtain a copy of the License at
73daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
83daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
93daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
103daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
113daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
123daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// See the License for the specific language governing permissions and
143daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// limitations under the License.
153daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi//
160752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
170752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include <string>
180752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
19e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko#include <brillo/bind_lambda.h>
20e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko#include <brillo/dbus/dbus_object_test_helpers.h>
210752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include <dbus/mock_bus.h>
220752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include <dbus/mock_exported_object.h>
230752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include <gmock/gmock.h>
240752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include <gtest/gtest.h>
250752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
260752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include "attestation/common/dbus_interface.h"
270752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include "attestation/common/mock_attestation_interface.h"
280752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include "attestation/server/dbus_service.h"
290752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
300752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnusing testing::_;
310752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnusing testing::Invoke;
320752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnusing testing::NiceMock;
330752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnusing testing::Return;
340752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnusing testing::StrictMock;
350752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnusing testing::WithArgs;
360752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
370752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnnamespace attestation {
380752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
390752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnclass DBusServiceTest : public testing::Test {
400752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn public:
410752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  ~DBusServiceTest() override = default;
420752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  void SetUp() override {
430752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    dbus::Bus::Options options;
440752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    mock_bus_ = new NiceMock<dbus::MockBus>(options);
450752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    dbus::ObjectPath path(kAttestationServicePath);
460752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    mock_exported_object_ = new NiceMock<dbus::MockExportedObject>(
470752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn        mock_bus_.get(), path);
480752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    ON_CALL(*mock_bus_, GetExportedObject(path))
490752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn        .WillByDefault(Return(mock_exported_object_.get()));
500752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    dbus_service_.reset(new DBusService(mock_bus_, &mock_service_));
51e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko    dbus_service_->Register(brillo::dbus_utils::AsyncEventSequencer::
520752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn                                GetDefaultCompletionAction());
530752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  }
540752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
550752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  std::unique_ptr<dbus::Response> CallMethod(dbus::MethodCall* method_call) {
56e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko    return brillo::dbus_utils::testing::CallMethod(
570752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn        dbus_service_->dbus_object_, method_call);
580752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  }
590752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
600752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  std::unique_ptr<dbus::MethodCall> CreateMethodCall(
610752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      const std::string& method_name) {
620752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    std::unique_ptr<dbus::MethodCall> call(new dbus::MethodCall(
630752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn        kAttestationInterface, method_name));
640752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    call->SetSerial(1);
650752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    return call;
660752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  }
670752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
680752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn protected:
690752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  scoped_refptr<dbus::MockBus> mock_bus_;
700752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  scoped_refptr<dbus::MockExportedObject> mock_exported_object_;
710752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  StrictMock<MockAttestationInterface> mock_service_;
720752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  std::unique_ptr<DBusService> dbus_service_;
730752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn};
740752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
75b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren KrahnTEST_F(DBusServiceTest, CreateGoogleAttestedKey) {
76b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  CreateGoogleAttestedKeyRequest request;
77b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_label("label");
78b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
79b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_key_usage(KEY_USAGE_SIGN);
80b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_certificate_profile(ENTERPRISE_MACHINE_CERTIFICATE);
81b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_username("username");
82b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  request.set_origin("origin");
83b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  EXPECT_CALL(mock_service_, CreateGoogleAttestedKey(_, _))
84b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn      .WillOnce(Invoke([](
856222defa52eb13c0d90673f642f2647f7753478bDarren Krahn          const CreateGoogleAttestedKeyRequest& request,
866222defa52eb13c0d90673f642f2647f7753478bDarren Krahn          const AttestationInterface::
876222defa52eb13c0d90673f642f2647f7753478bDarren Krahn              CreateGoogleAttestedKeyCallback& callback) {
88b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        EXPECT_EQ("label", request.key_label());
89b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        EXPECT_EQ(KEY_TYPE_ECC, request.key_type());
90b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        EXPECT_EQ(KEY_USAGE_SIGN, request.key_usage());
91b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        EXPECT_EQ(ENTERPRISE_MACHINE_CERTIFICATE,
92b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn                  request.certificate_profile());
93b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        EXPECT_EQ("username", request.username());
94b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        EXPECT_EQ("origin", request.origin());
95b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        CreateGoogleAttestedKeyReply reply;
96b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        reply.set_status(STATUS_SUCCESS);
97b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        reply.set_certificate_chain("certificate");
98b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        reply.set_server_error("server_error");
99b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        callback.Run(reply);
100b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn      }));
1010752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  std::unique_ptr<dbus::MethodCall> call = CreateMethodCall(
1020752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      kCreateGoogleAttestedKey);
1030752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  dbus::MessageWriter writer(call.get());
104b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  writer.AppendProtoAsArrayOfBytes(request);
1050752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  auto response = CallMethod(call.get());
1060752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  dbus::MessageReader reader(response.get());
107b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  CreateGoogleAttestedKeyReply reply;
108b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
109b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
110b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  EXPECT_EQ("certificate", reply.certificate_chain());
111b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  EXPECT_EQ("server_error", reply.server_error());
1120752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn}
1130752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn
11439f82d968e22cd3de567df5ddb2d00a923c0bb74Darren KrahnTEST_F(DBusServiceTest, CopyableCallback) {
115b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  EXPECT_CALL(mock_service_, CreateGoogleAttestedKey(_, _))
116b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn      .WillOnce(WithArgs<1>(Invoke([](const AttestationInterface::
117d66389850c33614ffbbbbc3f768621182fd853baDarren Krahn          CreateGoogleAttestedKeyCallback& callback) {
11839f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn        // Copy the callback, then call the original.
119b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        CreateGoogleAttestedKeyReply reply;
120b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        base::Closure copy = base::Bind(callback, reply);
121b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn        callback.Run(reply);
12239f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      })));
12339f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  std::unique_ptr<dbus::MethodCall> call = CreateMethodCall(
12439f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      kCreateGoogleAttestedKey);
125b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  CreateGoogleAttestedKeyRequest request;
12639f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  dbus::MessageWriter writer(call.get());
127b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  writer.AppendProtoAsArrayOfBytes(request);
12839f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  auto response = CallMethod(call.get());
12939f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  dbus::MessageReader reader(response.get());
130b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  CreateGoogleAttestedKeyReply reply;
131b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
13239f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn}
13339f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn
1346222defa52eb13c0d90673f642f2647f7753478bDarren KrahnTEST_F(DBusServiceTest, GetKeyInfo) {
1356222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  GetKeyInfoRequest request;
1366222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  request.set_key_label("label");
1376222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  request.set_username("username");
1386222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_CALL(mock_service_, GetKeyInfo(_, _))
1396222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      .WillOnce(Invoke([](
1406222defa52eb13c0d90673f642f2647f7753478bDarren Krahn          const GetKeyInfoRequest& request,
1416222defa52eb13c0d90673f642f2647f7753478bDarren Krahn          const AttestationInterface::GetKeyInfoCallback& callback) {
1426222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        EXPECT_EQ("label", request.key_label());
1436222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        EXPECT_EQ("username", request.username());
1446222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        GetKeyInfoReply reply;
1456222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        reply.set_status(STATUS_SUCCESS);
1466222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        reply.set_key_type(KEY_TYPE_ECC);
1476222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        reply.set_key_usage(KEY_USAGE_SIGN);
1486222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        reply.set_public_key("public_key");
1496222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        reply.set_certify_info("certify");
1506222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        reply.set_certify_info_signature("signature");
1516222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        reply.set_certificate("certificate");
1526222defa52eb13c0d90673f642f2647f7753478bDarren Krahn        callback.Run(reply);
1536222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      }));
1546222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  std::unique_ptr<dbus::MethodCall> call = CreateMethodCall(kGetKeyInfo);
1556222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  dbus::MessageWriter writer(call.get());
1566222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  writer.AppendProtoAsArrayOfBytes(request);
1576222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  auto response = CallMethod(call.get());
1586222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  dbus::MessageReader reader(response.get());
1596222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  GetKeyInfoReply reply;
1606222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
1616222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
1626222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ(KEY_TYPE_ECC, reply.key_type());
1636222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ(KEY_USAGE_SIGN, reply.key_usage());
1646222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ("public_key", reply.public_key());
1656222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ("certify", reply.certify_info());
1666222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ("signature", reply.certify_info_signature());
1676222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  EXPECT_EQ("certificate", reply.certificate());
1686222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}
1696222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
170cd5486df897619718b68223ebefc1322a1f5ab29Darren KrahnTEST_F(DBusServiceTest, GetEndorsementInfo) {
171cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  GetEndorsementInfoRequest request;
172cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  request.set_key_type(KEY_TYPE_ECC);
173cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_CALL(mock_service_, GetEndorsementInfo(_, _))
174cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      .WillOnce(Invoke([](
175cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn          const GetEndorsementInfoRequest& request,
176cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn          const AttestationInterface::GetEndorsementInfoCallback& callback) {
177cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn        EXPECT_EQ(KEY_TYPE_ECC, request.key_type());
178cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn        GetEndorsementInfoReply reply;
179cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn        reply.set_status(STATUS_SUCCESS);
180cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn        reply.set_ek_public_key("public_key");
181cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn        reply.set_ek_certificate("certificate");
182cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn        callback.Run(reply);
183cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      }));
184cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  std::unique_ptr<dbus::MethodCall> call =
185cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      CreateMethodCall(kGetEndorsementInfo);
186cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  dbus::MessageWriter writer(call.get());
187cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  writer.AppendProtoAsArrayOfBytes(request);
188cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  auto response = CallMethod(call.get());
189cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  dbus::MessageReader reader(response.get());
190cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  GetEndorsementInfoReply reply;
191cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
192cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
193cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_EQ("public_key", reply.ek_public_key());
194cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  EXPECT_EQ("certificate", reply.ek_certificate());
195cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn}
196cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
197566c836c403212d5c13428b02ed65e5ff6e49a6bDarren KrahnTEST_F(DBusServiceTest, GetAttestationKeyInfo) {
198566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  GetAttestationKeyInfoRequest request;
199566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
200566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_CALL(mock_service_, GetAttestationKeyInfo(_, _))
201566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      .WillOnce(Invoke([](
202566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn          const GetAttestationKeyInfoRequest& request,
203566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn          const AttestationInterface::GetAttestationKeyInfoCallback& callback) {
204566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        EXPECT_EQ(KEY_TYPE_ECC, request.key_type());
205566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        GetAttestationKeyInfoReply reply;
206566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        reply.set_status(STATUS_SUCCESS);
207566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        reply.set_public_key("public_key");
2082e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        reply.set_public_key_tpm_format("public_key_tpm_format");
209566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        reply.set_certificate("certificate");
210566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        reply.mutable_pcr0_quote()->set_quote("pcr0");
211566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        reply.mutable_pcr1_quote()->set_quote("pcr1");
212566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        callback.Run(reply);
213566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      }));
214566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  std::unique_ptr<dbus::MethodCall> call =
215566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      CreateMethodCall(kGetAttestationKeyInfo);
216566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  dbus::MessageWriter writer(call.get());
217566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  writer.AppendProtoAsArrayOfBytes(request);
218566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  auto response = CallMethod(call.get());
219566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  dbus::MessageReader reader(response.get());
220566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  GetAttestationKeyInfoReply reply;
221566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
222566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
223566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_EQ("public_key", reply.public_key());
2242e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_EQ("public_key_tpm_format", reply.public_key_tpm_format());
225566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_EQ("certificate", reply.certificate());
226566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_EQ("pcr0", reply.pcr0_quote().quote());
227566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  EXPECT_EQ("pcr1", reply.pcr1_quote().quote());
228566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn}
229566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
2302e89ba764046e015ae90a1668f7cb3eb29cf509dDarren KrahnTEST_F(DBusServiceTest, ActivateAttestationKey) {
2312e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  ActivateAttestationKeyRequest request;
2322e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.set_key_type(KEY_TYPE_ECC);
2332e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.mutable_encrypted_certificate()->set_asym_ca_contents("encrypted1");
2342e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.mutable_encrypted_certificate()->set_sym_ca_attestation("encrypted2");
2352e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  request.set_save_certificate(true);
2362e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_CALL(mock_service_, ActivateAttestationKey(_, _))
2372e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      .WillOnce(Invoke([](
2382e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn          const ActivateAttestationKeyRequest& request,
2392e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn          const AttestationInterface::ActivateAttestationKeyCallback&
2402e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn              callback) {
2412e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        EXPECT_EQ(KEY_TYPE_ECC, request.key_type());
2422e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        EXPECT_EQ("encrypted1",
2432e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn                  request.encrypted_certificate().asym_ca_contents());
2442e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        EXPECT_EQ("encrypted2",
2452e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn                  request.encrypted_certificate().sym_ca_attestation());
2462e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        EXPECT_TRUE(request.save_certificate());
2472e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        ActivateAttestationKeyReply reply;
2482e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        reply.set_status(STATUS_SUCCESS);
2492e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        reply.set_certificate("certificate");
2502e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        callback.Run(reply);
2512e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      }));
2522e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  std::unique_ptr<dbus::MethodCall> call =
2532e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      CreateMethodCall(kActivateAttestationKey);
2542e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  dbus::MessageWriter writer(call.get());
2552e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  writer.AppendProtoAsArrayOfBytes(request);
2562e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  auto response = CallMethod(call.get());
2572e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  dbus::MessageReader reader(response.get());
2582e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  ActivateAttestationKeyReply reply;
2592e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
2602e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
2612e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  EXPECT_EQ("certificate", reply.certificate());
2622e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn}
2632e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
26462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren KrahnTEST_F(DBusServiceTest, CreateCertifiableKey) {
26562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  CreateCertifiableKeyRequest request;
26662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_label("label");
26762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_type(KEY_TYPE_ECC);
26862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_key_usage(KEY_USAGE_SIGN);
26962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  request.set_username("user");
27062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_CALL(mock_service_, CreateCertifiableKey(_, _))
27162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      .WillOnce(Invoke([](
27262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn          const CreateCertifiableKeyRequest& request,
273bc0c74963418442991072b2c87baec839eec9c20Darren Krahn          const AttestationInterface::CreateCertifiableKeyCallback& callback) {
27462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        EXPECT_EQ("label", request.key_label());
27562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        EXPECT_EQ(KEY_TYPE_ECC, request.key_type());
27662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        EXPECT_EQ(KEY_USAGE_SIGN, request.key_usage());
27762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        EXPECT_EQ("user", request.username());
27862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        CreateCertifiableKeyReply reply;
27962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        reply.set_status(STATUS_SUCCESS);
28062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        reply.set_public_key("public_key");
28162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        reply.set_certify_info("certify_info");
28262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        reply.set_certify_info_signature("signature");
28362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        callback.Run(reply);
28462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      }));
28562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  std::unique_ptr<dbus::MethodCall> call =
28662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      CreateMethodCall(kCreateCertifiableKey);
28762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  dbus::MessageWriter writer(call.get());
28862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  writer.AppendProtoAsArrayOfBytes(request);
28962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  auto response = CallMethod(call.get());
29062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  dbus::MessageReader reader(response.get());
29162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  CreateCertifiableKeyReply reply;
29262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
29362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
29462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_EQ("public_key", reply.public_key());
29562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_EQ("certify_info", reply.certify_info());
29662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  EXPECT_EQ("signature", reply.certify_info_signature());
29762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn}
29862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
299bc0c74963418442991072b2c87baec839eec9c20Darren KrahnTEST_F(DBusServiceTest, Decrypt) {
300bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  DecryptRequest request;
301bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_key_label("label");
302bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_username("user");
303bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  request.set_encrypted_data("data");
304bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_CALL(mock_service_, Decrypt(_, _))
305bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      .WillOnce(Invoke([](
306bc0c74963418442991072b2c87baec839eec9c20Darren Krahn          const DecryptRequest& request,
307bc0c74963418442991072b2c87baec839eec9c20Darren Krahn          const AttestationInterface::DecryptCallback& callback) {
308bc0c74963418442991072b2c87baec839eec9c20Darren Krahn        EXPECT_EQ("label", request.key_label());
309bc0c74963418442991072b2c87baec839eec9c20Darren Krahn        EXPECT_EQ("user", request.username());
310bc0c74963418442991072b2c87baec839eec9c20Darren Krahn        EXPECT_EQ("data", request.encrypted_data());
311bc0c74963418442991072b2c87baec839eec9c20Darren Krahn        DecryptReply reply;
312bc0c74963418442991072b2c87baec839eec9c20Darren Krahn        reply.set_status(STATUS_SUCCESS);
313bc0c74963418442991072b2c87baec839eec9c20Darren Krahn        reply.set_decrypted_data("data");
314bc0c74963418442991072b2c87baec839eec9c20Darren Krahn        callback.Run(reply);
315bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      }));
316ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  std::unique_ptr<dbus::MethodCall> call = CreateMethodCall(kDecrypt);
317bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  dbus::MessageWriter writer(call.get());
318bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  writer.AppendProtoAsArrayOfBytes(request);
319bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  auto response = CallMethod(call.get());
320bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  dbus::MessageReader reader(response.get());
321bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  DecryptReply reply;
322bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
323bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
324bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  EXPECT_EQ("data", reply.decrypted_data());
325bc0c74963418442991072b2c87baec839eec9c20Darren Krahn}
326bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
327ccf90703bb6989e659b12a6494e84fdb921008edDarren KrahnTEST_F(DBusServiceTest, Sign) {
328ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  SignRequest request;
329ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_key_label("label");
330ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_username("user");
331ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  request.set_data_to_sign("data");
332ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_CALL(mock_service_, Sign(_, _))
333ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn      .WillOnce(Invoke([](
334ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn          const SignRequest& request,
335ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn          const AttestationInterface::SignCallback& callback) {
336ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn        EXPECT_EQ("label", request.key_label());
337ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn        EXPECT_EQ("user", request.username());
338ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn        EXPECT_EQ("data", request.data_to_sign());
339ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn        SignReply reply;
340ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn        reply.set_status(STATUS_SUCCESS);
341ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn        reply.set_signature("signature");
342ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn        callback.Run(reply);
343ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn      }));
344ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  std::unique_ptr<dbus::MethodCall> call = CreateMethodCall(kSign);
345ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  dbus::MessageWriter writer(call.get());
346ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  writer.AppendProtoAsArrayOfBytes(request);
347ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  auto response = CallMethod(call.get());
348ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  dbus::MessageReader reader(response.get());
349ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  SignReply reply;
350ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
351ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
352ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn  EXPECT_EQ("signature", reply.signature());
353ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn}
354ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn
355594849c7cf872d055575277b930f4f596bef1988Darren KrahnTEST_F(DBusServiceTest, RegisterKeyWithChapsToken) {
356594849c7cf872d055575277b930f4f596bef1988Darren Krahn  RegisterKeyWithChapsTokenRequest request;
357594849c7cf872d055575277b930f4f596bef1988Darren Krahn  request.set_key_label("label");
358594849c7cf872d055575277b930f4f596bef1988Darren Krahn  request.set_username("user");
359594849c7cf872d055575277b930f4f596bef1988Darren Krahn  EXPECT_CALL(mock_service_, RegisterKeyWithChapsToken(_, _))
360594849c7cf872d055575277b930f4f596bef1988Darren Krahn      .WillOnce(Invoke([](
361594849c7cf872d055575277b930f4f596bef1988Darren Krahn          const RegisterKeyWithChapsTokenRequest& request,
362594849c7cf872d055575277b930f4f596bef1988Darren Krahn          const AttestationInterface::RegisterKeyWithChapsTokenCallback&
363594849c7cf872d055575277b930f4f596bef1988Darren Krahn              callback) {
364594849c7cf872d055575277b930f4f596bef1988Darren Krahn        EXPECT_EQ("label", request.key_label());
365594849c7cf872d055575277b930f4f596bef1988Darren Krahn        EXPECT_EQ("user", request.username());
366594849c7cf872d055575277b930f4f596bef1988Darren Krahn        RegisterKeyWithChapsTokenReply reply;
367594849c7cf872d055575277b930f4f596bef1988Darren Krahn        reply.set_status(STATUS_SUCCESS);
368594849c7cf872d055575277b930f4f596bef1988Darren Krahn        callback.Run(reply);
369594849c7cf872d055575277b930f4f596bef1988Darren Krahn      }));
370594849c7cf872d055575277b930f4f596bef1988Darren Krahn  std::unique_ptr<dbus::MethodCall> call =
371594849c7cf872d055575277b930f4f596bef1988Darren Krahn      CreateMethodCall(kRegisterKeyWithChapsToken);
372594849c7cf872d055575277b930f4f596bef1988Darren Krahn  dbus::MessageWriter writer(call.get());
373594849c7cf872d055575277b930f4f596bef1988Darren Krahn  writer.AppendProtoAsArrayOfBytes(request);
374594849c7cf872d055575277b930f4f596bef1988Darren Krahn  auto response = CallMethod(call.get());
375594849c7cf872d055575277b930f4f596bef1988Darren Krahn  dbus::MessageReader reader(response.get());
376594849c7cf872d055575277b930f4f596bef1988Darren Krahn  RegisterKeyWithChapsTokenReply reply;
377594849c7cf872d055575277b930f4f596bef1988Darren Krahn  EXPECT_TRUE(reader.PopArrayOfBytesAsProto(&reply));
378594849c7cf872d055575277b930f4f596bef1988Darren Krahn  EXPECT_EQ(STATUS_SUCCESS, reply.status());
379594849c7cf872d055575277b930f4f596bef1988Darren Krahn}
380594849c7cf872d055575277b930f4f596bef1988Darren Krahn
381594849c7cf872d055575277b930f4f596bef1988Darren Krahn
3820752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn}  // namespace attestation
383