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