tpm_utility_test.cc revision 2da8ff25e7c88c78e8a9db8de9686c92817f0992
1bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
2bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Copyright (C) 2014 The Android Open Source Project
3bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
4bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
5bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// you may not use this file except in compliance with the License.
6bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// You may obtain a copy of the License at
7bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
8bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
9bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
10bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
11bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
12bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// See the License for the specific language governing permissions and
14bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// limitations under the License.
15bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
16c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
1733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi#include <base/stl_util.h>
1833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi#include <crypto/sha2.h>
19c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include <gmock/gmock.h>
20c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include <gtest/gtest.h>
2133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi#include <openssl/aes.h>
22c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
23b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi#include "trunks/error_codes.h"
2433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi#include "trunks/hmac_authorization_delegate.h"
25b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi#include "trunks/mock_authorization_delegate.h"
260ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi#include "trunks/mock_blob_parser.h"
27ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/mock_hmac_session.h"
28a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi#include "trunks/mock_policy_session.h"
29c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/mock_tpm.h"
30c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/mock_tpm_state.h"
3139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi#include "trunks/tpm_constants.h"
32c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/tpm_utility_impl.h"
33c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/trunks_factory_for_test.h"
34c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
35c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnusing testing::_;
36e31034f28641c9bc3e5576cab6d2c7d918bb427cUtkarsh Sanghiusing testing::DoAll;
37c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnusing testing::NiceMock;
38c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnusing testing::Return;
39748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghiusing testing::SaveArg;
40e31034f28641c9bc3e5576cab6d2c7d918bb427cUtkarsh Sanghiusing testing::SetArgPointee;
41c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
42c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnnamespace trunks {
43c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
44c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn// A test fixture for TpmUtility tests.
45c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnclass TpmUtilityTest : public testing::Test {
46c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn public:
475d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  TpmUtilityTest() : utility_(factory_) {}
48295e851b66fb19c05a14401e834337962a58c493Darren Krahn  ~TpmUtilityTest() override {}
49295e851b66fb19c05a14401e834337962a58c493Darren Krahn  void SetUp() override {
500ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi    factory_.set_blob_parser(&mock_blob_parser_);
51c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    factory_.set_tpm_state(&mock_tpm_state_);
52c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    factory_.set_tpm(&mock_tpm_);
53ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    factory_.set_hmac_session(&mock_hmac_session_);
54a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi    factory_.set_policy_session(&mock_policy_session_);
55c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  }
566537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
575d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  TPM_RC ComputeKeyName(const TPMT_PUBLIC& public_area,
586537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                        std::string* object_name) {
595d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    return utility_.ComputeKeyName(public_area, object_name);
606537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
616537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
625d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  void SetNVRAMMap(uint32_t index,
636537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                   const TPMS_NV_PUBLIC& public_area) {
645d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    utility_.nvram_public_area_map_[index] = public_area;
656537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
666537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
675d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  TPM_RC GetNVRAMMap(uint32_t index,
686537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                     TPMS_NV_PUBLIC* public_area) {
695d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    auto it = utility_.nvram_public_area_map_.find(index);
705d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    if (it == utility_.nvram_public_area_map_.end()) {
716537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi      return TPM_RC_FAILURE;
726537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    }
736537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    *public_area = it->second;
746537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    return TPM_RC_SUCCESS;
756537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
766537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
7766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_RC SetKnownOwnerPassword(const std::string& owner_password) {
7866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi    return utility_.SetKnownOwnerPassword(owner_password);
7966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  }
8066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
8166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_RC CreateStorageRootKeys(const std::string& owner_password) {
8266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi    return utility_.CreateStorageRootKeys(owner_password);
8366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  }
8466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
8566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_RC CreateSaltingKey(const std::string& owner_password) {
8666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi    return utility_.CreateSaltingKey(owner_password);
8766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  }
8866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
89c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn protected:
90c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TrunksFactoryForTest factory_;
910ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  NiceMock<MockBlobParser> mock_blob_parser_;
92c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  NiceMock<MockTpmState> mock_tpm_state_;
93c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  NiceMock<MockTpm> mock_tpm_;
945d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> mock_authorization_delegate_;
95ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  NiceMock<MockHmacSession> mock_hmac_session_;
96a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  NiceMock<MockPolicySession> mock_policy_session_;
975d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  TpmUtilityImpl utility_;
98c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn};
99c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
10003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSuccess) {
1015d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Startup());
10203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
10303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
10403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupAlreadyStarted) {
10503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, StartupSync(_, _))
10603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_INITIALIZE));
1075d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Startup());
10803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
10903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
11003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupFailure) {
11103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, StartupSync(_, _))
11203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
1135d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Startup());
11403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
11503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
11603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSelfTestFailure) {
11703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, SelfTestSync(_, _))
11803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
1195d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Startup());
12003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
12103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
122d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearSuccess) {
1235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Clear());
124d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
125d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
126d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearAfterBadInit) {
127d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
128d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_AUTH_MISSING))
129d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
1305d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Clear());
131d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
132d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
133d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearFail) {
134d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
135d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1365d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Clear());
137d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
138d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
139e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh SanghiTEST_F(TpmUtilityTest, ShutdownTest) {
140e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ShutdownSync(TPM_SU_CLEAR, _));
1415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  utility_.Shutdown();
142e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi}
143e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi
144c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmAlreadyInit) {
1455d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm());
1465d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm());
147c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
148c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
149c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmSuccess) {
150e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _))
151e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<3>(YES),
152e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm());
154c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
155c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
156c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmBadAuth) {
157c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Reject attempts to set platform auth.
158c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_PLATFORM, _, _, _))
159c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
1605d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.InitializeTpm());
161c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
162c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
163c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmDisablePHFails) {
164e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _))
165e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<3>(YES),
166e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
16752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to disable the platform hierarchy.
16803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyControlSync(_, _, TPM_RH_PLATFORM, _, _))
169c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
1705d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.InitializeTpm());
171c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
172c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
173e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh SanghiTEST_F(TpmUtilityTest, AllocatePCRSuccess) {
174e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  TPML_PCR_SELECTION pcr_allocation;
175e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _))
176e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&pcr_allocation),
177e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      SetArgPointee<3>(YES),
178e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
179e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR(""));
180e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(1, pcr_allocation.count);
181e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_ALG_SHA256, pcr_allocation.pcr_selections[0].hash);
182e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(PCR_SELECT_MIN, pcr_allocation.pcr_selections[0].sizeof_select);
183e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(0xFF, pcr_allocation.pcr_selections[0].pcr_select[0]);
184e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(0xFF, pcr_allocation.pcr_selections[0].pcr_select[1]);
185e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi}
186e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi
187e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh SanghiTEST_F(TpmUtilityTest, AllocatePCRCommandFailure) {
188e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _))
189e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
190e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.AllocatePCR(""));
191e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi}
192e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi
193e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh SanghiTEST_F(TpmUtilityTest, AllocatePCRTpmFailure) {
194e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _))
195e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<3>(NO),
196e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
197e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.AllocatePCR(""));
198e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi}
199e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi
20052e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipSuccess) {
20152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
20252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
20352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
20452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
20552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
20652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
20766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
20866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
20966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
21052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
21152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
21266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipOwnershipDone) {
21366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
21466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
21566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
21666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
21766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
21866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipBadSession) {
219ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true))
22066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
22166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner",
22266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
22366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
22452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
22552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
22666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipFailure) {
22766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
22866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
22966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner",
23066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
23166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
23266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
23366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
23466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementDone) {
23552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
23666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(false));
23766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
23866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(false));
23966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
24066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
24166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
24252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
24352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
24466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordLockoutDone) {
24552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
24652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
24752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
24852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
24966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
25066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
25166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
25252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
25352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
25466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementLockoutDone) {
25552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
25652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
25766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
25866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
25966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
26066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
26166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
26245e57ff54637d95252144544c3b051107473844eUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementFail) {
26366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
26452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
26566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
26666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(false));
26766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _))
26852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
26952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
27052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
27166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner",
27266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
27366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
27452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
27552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
27666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordLockoutFailure) {
27752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
27852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
27952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
28052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
28152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
28252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
28366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _))
28452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
28552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
28652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
28766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner",
28866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
28966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
2900f46c15b948ee17f5668c332a25a0dbaecb2cc47Utkarsh Sanghi}
2910f46c15b948ee17f5668c332a25a0dbaecb2cc47Utkarsh Sanghi
2922ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomSuccess) {
2932ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string entropy_data("large test data", 100);
2948b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
2955d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.StirRandom(entropy_data, &mock_authorization_delegate_));
29652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
29752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
2982ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomFails) {
2992ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string entropy_data("test data");
300c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, StirRandomSync(_, nullptr))
3012ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
302c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.StirRandom(entropy_data, nullptr));
3032ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3042ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3052ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomSuccess) {
3062ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // This number is larger than the max bytes the GetRandom call can return.
3072ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // Therefore we expect software to make multiple calls to fill this many
3082ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // bytes.
3092ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int num_bytes = 72;
3102ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string random_data;
3112ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM2B_DIGEST large_random;
3122ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  large_random.size = 32;
3132ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM2B_DIGEST small_random;
3142ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  small_random.size = 8;
3155d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, &mock_authorization_delegate_))
3162ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(2)
3172ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<1>(large_random),
31852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn                            Return(TPM_RC_SUCCESS)));
3195d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(8, _, &mock_authorization_delegate_))
3202ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(small_random),
3212ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
3225d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.GenerateRandom(
3235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      num_bytes, &mock_authorization_delegate_, &random_data));
3242ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(num_bytes, random_data.size());
32552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
32652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
3272ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomFails) {
3282ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int num_bytes = 5;
3292ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string random_data;
330c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, nullptr))
3312ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3328b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
333c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi            utility_.GenerateRandom(num_bytes, nullptr, &random_data));
33452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
33552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
3362ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRSuccess) {
3378b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM_HANDLE pcr_handle = HR_PCR + 1;
338e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  TPML_DIGEST_VALUES digests;
3395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_,
3405d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi              PCR_ExtendSync(pcr_handle, _, _, &mock_authorization_delegate_))
341e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&digests),
342e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
343e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ExtendPCR(1, "test digest",
344e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                                               &mock_authorization_delegate_));
345e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(1, digests.count);
346e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_ALG_SHA256, digests.digests[0].hash_alg);
347e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  std::string hash_string = crypto::SHA256HashString("test digest");
348e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(0, memcmp(hash_string.data(),
349e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      digests.digests[0].digest.sha256,
350e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      crypto::kSHA256Length));
3512ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3522ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3532ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRFail) {
3542ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int pcr_index = 0;
3552ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_HANDLE pcr_handle = HR_PCR + pcr_index;
3562ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ExtendSync(pcr_handle, _, _, _))
3572ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
358c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
359c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi            utility_.ExtendPCR(pcr_index, "test digest", nullptr));
3602ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3612ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3622ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRBadParam) {
363c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ExtendPCR(-1, "test digest", nullptr));
3642ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3652ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3662ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRSuccess) {
3672ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // The |pcr_index| is chosen to match the structure for |pcr_select|.
3682ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // If you change |pcr_index|, remember to change |pcr_select|.
3692ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int pcr_index = 1;
3702ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3712ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPML_PCR_SELECTION pcr_select;
3722ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.count = 1;
3732ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256;
3742ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].sizeof_select = 1;
3752ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].pcr_select[0] = 2;
3762ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPML_DIGEST pcr_values;
3772ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_values.count = 1;
3782ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_values.digests[0].size = 5;
3792ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3802ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(pcr_select),
3812ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      SetArgPointee<3>(pcr_values),
3822ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
3835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ReadPCR(pcr_index, &pcr_value));
3842ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3852ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3862ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRFail) {
3872ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3882ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3892ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3905d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadPCR(1, &pcr_value));
3912ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3922ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3932ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRBadReturn) {
3942ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3955d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadPCR(1, &pcr_value));
39652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
39752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
398b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSuccess) {
399b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
400b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
401b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
402b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
403b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
404b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      output_ciphertext);
405b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
406b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
407b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4088b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4098b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
410b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
411b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
412b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4135d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _,
4145d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                         &mock_authorization_delegate_))
415b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
416b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
4175d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(
4188b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      key_handle,
4198b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      TPM_ALG_NULL,
4208b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      TPM_ALG_NULL,
4218b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      plaintext,
4225d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
4238b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      &ciphertext));
424b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(0, ciphertext.compare(output_ciphertext));
425b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
426b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
427b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptFail) {
428b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
429b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
430b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
431b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
432b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
433b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4348b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4358b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
436b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
437b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
438b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
439c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr))
440b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
4415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.AsymmetricEncrypt(key_handle,
442b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      TPM_ALG_NULL,
4439dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
444b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      plaintext,
445c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                      nullptr,
446b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      &ciphertext));
447b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
448b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
449b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptBadParams) {
450b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
451b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
452b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
453b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
454b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
455b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt | kRestricted;
456c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, nullptr))
457b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
458b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4595d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.AsymmetricEncrypt(key_handle,
460b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             TPM_ALG_RSAES,
4619dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                             TPM_ALG_NULL,
462b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             plaintext,
463c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                             nullptr,
464b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             &ciphertext));
465b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
4669dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
4679dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptNullSchemeForward) {
4689dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
4699dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
4709dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
4719dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
4729dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
4739dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_ciphertext);
4749dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
4759dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
4769dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4778b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4788b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
4799dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
4809dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
4819dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
4829dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
483c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr))
4849dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
4859dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
4869dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
4875d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(key_handle,
4889dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
4899dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
4909dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      plaintext,
491c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                      nullptr,
4929dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      &ciphertext));
4939dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP);
4949dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256);
4959dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
4969dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
4979dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSchemeForward) {
4989dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
4999dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
5009dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
5019dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
5029dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
5039dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_ciphertext);
5049dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
5059dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
5069dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5078b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5088b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
5099dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
5109dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
5119dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
5129dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
513c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr))
5149dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
5159dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
5169dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
5175d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(key_handle,
5189dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_RSAES,
5199dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
5209dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      plaintext,
521c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                      nullptr,
5229dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      &ciphertext));
5239dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES);
5249dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
5259dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
526b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSuccess) {
527b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
528b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
529b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string output_plaintext("plaintext");
530b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
5312ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password("password");
532b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
533b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      output_plaintext);
534b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
535b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
536b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5378b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5388b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
539b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
540b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
541b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
5425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _,
5435d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                         &mock_authorization_delegate_))
544b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
545b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
5465d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt(
5475d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      key_handle,
5485d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      TPM_ALG_NULL,
5495d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      TPM_ALG_NULL,
5505d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      ciphertext,
5515d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
5525d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &plaintext));
553b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(0, plaintext.compare(output_plaintext));
554b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
555b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
556b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptFail) {
557b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
558b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string key_name;
559b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
560b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
561b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string password;
562b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
563b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
564b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5658b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5668b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
567b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
568b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
569b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
570b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
571b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
5725d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.AsymmetricDecrypt(
5731ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
5741ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5751ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5761ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
5775d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
5781ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
579b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
580b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
581b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadParams) {
582b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
583b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string key_name;
584b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
585b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
586b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string password;
587b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
588b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
589b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt | kRestricted;
590b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
591b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
592b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
5935d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.AsymmetricDecrypt(
5941ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
5951ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_RSAES,
5961ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5971ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
5985d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
5991ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
600b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
601b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
6022ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadSession) {
6031ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
6042ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string key_name;
6052ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string plaintext;
6062ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string ciphertext;
6072ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password;
6085d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.AsymmetricDecrypt(
609c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      key_handle, TPM_ALG_RSAES, TPM_ALG_NULL,
610c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      ciphertext, nullptr, &plaintext));
6112ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi}
6122ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi
6139dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptNullSchemeForward) {
6149dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
6159dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
6169dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_plaintext("plaintext");
6179dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
6189dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string password;
6199dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
6209dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_plaintext);
6219dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
6229dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
6239dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
6248b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6258b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
6269dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
6279dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
6289dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
6299dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6309dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
6319dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
6329dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
6339dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6345d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt(
6351ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6361ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6371ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6381ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
6401ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
6419dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP);
6429dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256);
6439dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
6449dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
6459dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSchemeForward) {
6469dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
6479dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
6489dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_plaintext("plaintext");
6499dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
6509dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string password;
6519dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
6529dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_plaintext);
6539dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
6549dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
6559dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
6568b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6578b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
6589dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
6599dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
6609dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
6619dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6629dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
6639dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
6649dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
6659dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6665d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt(
6671ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6681ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_RSAES,
6691ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6701ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6715d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
6721ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
6739dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES);
6749dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
6759dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
676748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSuccess) {
677748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
6782ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password("password");
679e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
680748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
681748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 2;
682748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.buffer[0] = 'h';
683748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.buffer[1] = 'i';
684748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
685748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
686748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
687748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
6888b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6898b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
690748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
691748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
692748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6935d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _,
6945d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                  &mock_authorization_delegate_))
695748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
696748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6975d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle,
6985d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
6995d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
7005d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
7015d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
7025d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
703748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(0, signature.compare("hi"));
704748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
705748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
706748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignFail) {
707748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
708748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
709e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
710748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
711748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
712748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
713748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
7148b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
7158b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
716748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
717748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
718748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
719748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
720748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
7215d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Sign(key_handle,
7225d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
7235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
7245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
7255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
7265d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
727748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
728748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
729748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams1) {
730748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
731748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
732e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
733748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
734748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
735748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
736748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign | kRestricted;
737748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
738748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
739748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
7405d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle,
7415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_RSAPSS,
7425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_NULL,
7435d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 digest,
7445d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &mock_authorization_delegate_,
7455d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &signature));
746748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
747748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
7482ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, SignBadAuthorizationSession) {
7491ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
7502ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password;
7512ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string digest(32, 'a');
7522ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string signature;
7535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.Sign(key_handle,
7545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                    TPM_ALG_RSAPSS,
7555d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                    TPM_ALG_NULL,
7565d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                    digest,
757c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                    nullptr,
7585d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                    &signature));
7592ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi}
7602ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi
761748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams2) {
762748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
763748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
764e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
765748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
766748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
767748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
768748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
769748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
770748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
771748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
7725d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle,
7735d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_RSAPSS,
7745d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_NULL,
7755d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 digest,
7765d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &mock_authorization_delegate_,
7775d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &signature));
778748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
779748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
780748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams3) {
781748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
782748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
783e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
784748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
785748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
786748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_ECC;
787748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
788748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
789748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
790748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
7915d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle,
7925d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_RSAPSS,
7935d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_NULL,
7945d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 digest,
7955d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &mock_authorization_delegate_,
7965d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &signature));
797748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
798748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
799748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams4) {
800748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
801748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
802e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
803748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
804748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
805748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
806748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
807748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
808748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
809748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_FAILURE)));
8105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Sign(key_handle,
8115d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_RSAPSS,
8125d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
8135d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
8145d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
8155d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
816748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
817748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
818748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams5) {
819748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle = 0;
820748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
821e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
822748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
8235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle,
8245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_AES,
8255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_NULL,
8265d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 digest,
8275d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &mock_authorization_delegate_,
8285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &signature));
829748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
830748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
831748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
832748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignNullSchemeForward) {
833748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
834748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
835e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
836748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
837748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 0;
838748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
839748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
840748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIG_SCHEME scheme;
841748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
842748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
8438b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
8448b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
845748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
846748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
847748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
848748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
849748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
850748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      SaveArg<3>(&scheme),
851748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
8525d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle,
8535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
8545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
8555d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
8565d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
8575d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
858748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSASSA);
859748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.details.rsassa.hash_alg, TPM_ALG_SHA256);
860748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
861748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
862748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSchemeForward) {
863748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
864748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
865e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(64, 'a');
866748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
867748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 0;
868748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
869748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
870748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIG_SCHEME scheme;
871748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
872748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
8738b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
8748b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
875748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
876748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
877748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
878748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
879748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
880748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      SaveArg<3>(&scheme),
881748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
8825d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle,
8835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_RSAPSS,
8845d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_SHA1,
8855d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
8865d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
8875d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
888748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAPSS);
889887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  EXPECT_EQ(scheme.details.rsapss.hash_alg, TPM_ALG_SHA1);
890748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
891748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
892748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySuccess) {
893748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
894e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
895748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
896748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
897748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
898748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
899748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
900748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
901748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
902748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
903748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
9045d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle,
9055d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9065d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9075d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
9086f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
9096f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
910748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
911748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
912748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyFail) {
913748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
914e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
915748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
916748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
917748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
918748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
919748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
920748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
921748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
922748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
923748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
9245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Verify(key_handle,
9255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9265d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9275d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
9286f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
9296f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
930748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
931748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
932748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams1) {
933748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
934e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
935748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
936748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
937748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
938748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign | kRestricted;
939748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
940748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
941748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
9425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle,
9435d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9445d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9455d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   digest,
9466f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   signature,
9476f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   nullptr));
948748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
949748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
950748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams2) {
951748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
952e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
953748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
954748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
955748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
956748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
957748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
958748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
959748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
9605d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle,
9615d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9625d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9635d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   digest,
9646f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   signature,
9656f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   nullptr));
966748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
967748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
968748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams3) {
969748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
970e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
971748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
972748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
973748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_ECC;
974748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
975748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
976748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
977748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
9785d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle,
9795d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9805d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9815d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   digest,
9826f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   signature,
9836f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   nullptr));
984748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
985748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
986748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams4) {
987748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
988e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
989748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
990748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
991748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
992748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
993748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
994748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
995748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_FAILURE)));
9965d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Verify(key_handle,
9975d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9985d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9995d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
10006f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
10016f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
1002748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1003748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1004748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams5) {
1005748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1006e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1007748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1008748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1009748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1010748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1011748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1012748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1013748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
10145d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle,
10155d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_AES,
10165d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
10175d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   digest,
10186f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   signature,
10196f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   nullptr));
1020748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1021748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1022748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyNullSchemeForward) {
1023748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1024e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1025748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1026748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1027748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_in;
1028748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1029748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1030748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1031748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1032748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1033748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
1034748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&signature_in),
1035748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
10365d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle,
10375d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
10385d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
10395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
10406f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
10416f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
1042748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSASSA);
1043748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA256);
1044748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1045748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1046748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySchemeForward) {
1047748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1048e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(64, 'a');
1049748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1050748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1051748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_in;
1052748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1053748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1054748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1055748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1056748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1057748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
1058748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&signature_in),
1059748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
10605d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle,
10615d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_RSAPSS,
10625d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_SHA1,
10635d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
10646f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
10656f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
1066748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSAPSS);
1067887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA1);
1068748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1069748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1070fded77411da5ef66dff7389e49f40900c19d510cUtkarsh SanghiTEST_F(TpmUtilityTest, CertifyCreationSuccess) {
1071fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  TPM_HANDLE key_handle = 42;
1072fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  std::string creation_blob;
1073fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, CertifyCreationSyncShort(TPM_RH_NULL, key_handle,
1074fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi                                                  _, _, _, _, _, _, _))
1075fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
1076fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
1077fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi            utility_.CertifyCreation(key_handle, creation_blob));
1078fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi}
1079fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi
1080fded77411da5ef66dff7389e49f40900c19d510cUtkarsh SanghiTEST_F(TpmUtilityTest, CertifyCreationParserError) {
1081fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  TPM_HANDLE key_handle = 42;
1082fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  std::string creation_blob;
1083fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  EXPECT_CALL(mock_blob_parser_, ParseCreationBlob(creation_blob, _, _, _))
1084fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi      .WillOnce(Return(false));
1085fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
1086fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi            utility_.CertifyCreation(key_handle, creation_blob));
1087fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi}
1088fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi
1089fded77411da5ef66dff7389e49f40900c19d510cUtkarsh SanghiTEST_F(TpmUtilityTest, CertifyCreationFailure) {
1090fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  TPM_HANDLE key_handle = 42;
1091fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  std::string creation_blob;
1092fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, CertifyCreationSyncShort(TPM_RH_NULL, key_handle,
1093fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi                                                  _, _, _, _, _, _, _))
1094fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1095fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
1096fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi            utility_.CertifyCreation(key_handle, creation_blob));
1097fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi}
1098fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi
109933ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataSuccess) {
110033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
110133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
11020ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string key_blob;
11030ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  TPM2B_PUBLIC public_area;
11040ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
11050ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
11060ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
11070ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
11080ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
11090ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
11105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ChangeKeyAuthorizationData(
11110ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi    key_handle, new_password, &mock_authorization_delegate_, &key_blob));
111233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
111333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
111433ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataKeyNameFail) {
111533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
111633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string old_password;
111733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
111833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
111933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
11205d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ChangeKeyAuthorizationData(
1121c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      key_handle, new_password, &mock_authorization_delegate_, nullptr));
112233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
112333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
112433ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataFailure) {
112533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
112633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
112733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ObjectChangeAuthSync(key_handle, _, _, _, _, _, _))
112833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
11295d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ChangeKeyAuthorizationData(
1130c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      key_handle, new_password, &mock_authorization_delegate_, nullptr));
113133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
113233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
11330ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataParserFail) {
113433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
113533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
113633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string key_blob;
11378b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM2B_PUBLIC public_area;
11388b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
11398b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
11408b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
11418b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
11428b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
11438b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
11440ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob))
11450ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      .WillOnce(Return(false));
11460ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.ChangeKeyAuthorizationData(
11475d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    key_handle, new_password, &mock_authorization_delegate_, &key_blob));
114833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
114933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
115033ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccess) {
115133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
115233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
115333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
115433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password("password");
115533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string key_blob;
115633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_DATA encryption_key;
115733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_PUBLIC public_data;
115833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_PRIVATE private_data;
115933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
116033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&encryption_key),
116133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      SaveArg<3>(&public_data),
116233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      SaveArg<4>(&private_data),
116333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
11645d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ImportRSAKey(
116533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
11661ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
11671ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
11681ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
11691ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
11705d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
11711ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &key_blob));
117233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  // Validate that the public area was properly constructed.
117333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.parameters.rsa_detail.key_bits,
117433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            modulus.size() * 8);
117533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.parameters.rsa_detail.exponent,
117633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            public_exponent);
117733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.unique.rsa.size, modulus.size());
117833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(public_data.public_area.unique.rsa.buffer,
117933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      modulus.data(), modulus.size()));
118033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  // Validate the private struct construction.
118133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(kAesKeySize, encryption_key.size);
118233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_KEY key;
118333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_set_encrypt_key(encryption_key.buffer, kAesKeySize * 8, &key);
118433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  unsigned char iv[MAX_AES_BLOCK_SIZE_BYTES] = {0};
118533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  int iv_in = 0;
118633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string unencrypted_private(private_data.size, 0);
118733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_cfb128_encrypt(
118833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    reinterpret_cast<const unsigned char*>(private_data.buffer),
118933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    reinterpret_cast<unsigned char*>(string_as_array(&unencrypted_private)),
119033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    private_data.size, &key, iv, &iv_in, AES_DECRYPT);
119133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_DIGEST inner_integrity;
119233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_DIGEST(&unencrypted_private,
1193c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                               &inner_integrity, nullptr));
119433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string object_name;
11956537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
11965d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            ComputeKeyName(public_data.public_area, &object_name));
119733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string integrity_value = crypto::SHA256HashString(unencrypted_private +
119833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                                         object_name);
119933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(integrity_value.size(), inner_integrity.size);
120033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(inner_integrity.buffer,
120133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      integrity_value.data(),
120233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      inner_integrity.size));
120333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_SENSITIVE sensitive_data;
120433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_SENSITIVE(&unencrypted_private,
1205c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                  &sensitive_data, nullptr));
120633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(sensitive_data.sensitive_area.auth_value.size, password.size());
120733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.auth_value.buffer,
120833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      password.data(), password.size()));
120933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(sensitive_data.sensitive_area.sensitive.rsa.size,
121033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            prime_factor.size());
121133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.sensitive.rsa.buffer,
121233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      prime_factor.data(), prime_factor.size()));
121333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
121433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
121533ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccessWithNoBlob) {
121633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
121733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
121833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
121933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
12205d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ImportRSAKey(
122133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12221ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12231ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
12241ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12251ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12265d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
1227c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      nullptr));
122833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
122933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
123033ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyParentNameFail) {
123133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
123233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
123333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
123433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
123533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
123633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
12375d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ImportRSAKey(
123833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12391ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12401ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
12411ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12421ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12435d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
1244c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      nullptr));
124533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
124633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
124733ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyFail) {
124833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus;
124933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor;
125033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
125133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
125233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
12535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ImportRSAKey(
125433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12551ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12561ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      0x10001,
12571ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12581ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12595d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
1260c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      nullptr));
126133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
126233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
12630ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyParserFail) {
12640ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string modulus;
12650ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string prime_factor;
12660ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string password;
12670ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string key_blob;
12680ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob))
12690ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      .WillOnce(Return(false));
12700ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.ImportRSAKey(
12710ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12720ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      modulus,
12730ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      0x10001,
12740ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      prime_factor,
12750ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      password,
12760ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      &mock_authorization_delegate_,
12770ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      &key_blob));
12780ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi}
12790ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
12806f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairSuccess) {
128182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
12820ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  TPML_PCR_SELECTION creation_pcrs;
12836f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey,
12846f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         _, _, _, _, _, _, _, _,
12855d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                         &mock_authorization_delegate_))
128682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
12870ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                      SaveArg<3>(&creation_pcrs),
128882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
12896f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
1290a5a2f2ea49e0085bf8d7f6f2b6e7cd624d710c01Utkarsh Sanghi  std::string creation_blob;
12910ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  int creation_pcr = 12;
12926f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair(
12936f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptAndSignKey, 2048, 0x10001,
12940ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      "password", "", false, creation_pcr, &mock_authorization_delegate_,
12950ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      &key_blob, &creation_blob));
129682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt);
12976f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign);
12986ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kUserWithAuth,
12996ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi            kUserWithAuth);
13006ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kAdminWithPolicy, 0);
130182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
1302e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi            TPM_ALG_NULL);
13030ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(1, creation_pcrs.count);
13040ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(TPM_ALG_SHA256, creation_pcrs.pcr_selections[0].hash);
13050ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(PCR_SELECT_MIN, creation_pcrs.pcr_selections[0].sizeof_select);
13060ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(1 << (creation_pcr % 8),
13070ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi            creation_pcrs.pcr_selections[0].pcr_select[creation_pcr / 8]);
130882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
130982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
13106f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairDecryptKeySuccess) {
131182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
13126f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey,
13136f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         _, _, _, _, _, _, _, _,
13146f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         &mock_authorization_delegate_))
131582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
131682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
13176f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13186f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair(
1319a5a2f2ea49e0085bf8d7f6f2b6e7cd624d710c01Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey, 2048, 0x10001, "password",
13200ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob,
13210ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      nullptr));
13226f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt);
13236f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, 0);
132482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
1325e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi            TPM_ALG_NULL);
132682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
132782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
13286f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairSignKeySuccess) {
132982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
13306f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  TPM2B_SENSITIVE_CREATE sensitive_create;
13316f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey,
13326f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         _, _, _, _, _, _, _, _,
13336f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         &mock_authorization_delegate_))
13346f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<1>(&sensitive_create),
13356f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                      SaveArg<2>(&public_area),
133682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
13376f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13386f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string policy_digest(32, 'a');
13396f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_auth("password");
13406f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair(
13416f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, key_auth,
13420ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      policy_digest, true  /* use_only_policy_authorization */, kNoCreationPCR,
1343a5a2f2ea49e0085bf8d7f6f2b6e7cd624d710c01Utkarsh Sanghi      &mock_authorization_delegate_, &key_blob, nullptr));
13446f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, 0);
134582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign);
13466ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kUserWithAuth, 0);
13476ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kAdminWithPolicy,
13486ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi            kAdminWithPolicy);
134982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
135082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi            TPM_ALG_NULL);
13516f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.key_bits, 2048);
13526f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.exponent, 0x10001);
13536f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.auth_policy.size, policy_digest.size());
13546f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(0, memcmp(public_area.public_area.auth_policy.buffer,
13556f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                      policy_digest.data(), policy_digest.size()));
13566f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(sensitive_create.sensitive.user_auth.size, key_auth.size());
13576f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_create.sensitive.user_auth.buffer,
13586f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                      key_auth.data(), key_auth.size()));
135982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
136082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
13616f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairBadDelegate) {
13626f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13636f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.CreateRSAKeyPair(
13646f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey, 2048, 0x10001, "password",
13650ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      "", false, kNoCreationPCR, nullptr, &key_blob, nullptr));
13666f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi}
13676f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi
13686f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairFailure) {
13696f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey,
13706f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         _, _, _, _, _, _, _, _,
13716f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         &mock_authorization_delegate_))
137282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
13736f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13746f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.CreateRSAKeyPair(
13756f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password",
13760ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob,
13770ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      nullptr));
13780ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi}
13790ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
13800ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairKeyParserFail) {
13810ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string key_blob;
13820ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob))
13830ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      .WillOnce(Return(false));
13840ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.CreateRSAKeyPair(
13850ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password",
13860ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob,
13870ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      nullptr));
13880ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi}
13890ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
13900ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairCreationParserFail) {
13910ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string creation_blob;
13920ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string key_blob;
13930ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_CALL(mock_blob_parser_, SerializeCreationBlob(_, _, _, &creation_blob))
13940ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      .WillOnce(Return(false));
13950ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.CreateRSAKeyPair(
13960ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password",
13970ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob,
13980ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      &creation_blob));
139982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
140082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
14016f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeySuccess) {
14026f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
14036f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  TPM_HANDLE loaded_handle;
14046f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(kRSAStorageRootKey, _, _, _, _, _,
14056f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                  &mock_authorization_delegate_))
14066f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<4>(key_handle),
14076f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
14086f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
14096f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.LoadKey(
14106f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      key_blob, &mock_authorization_delegate_, &loaded_handle));
14116f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(loaded_handle, key_handle);
14126f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi}
14136f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi
14146f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeyFailure) {
141582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
141682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
141782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
14186f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
14196f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.LoadKey(
14206f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      key_blob, &mock_authorization_delegate_, &key_handle));
14216f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi}
14226f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi
14236f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeyBadDelegate) {
14246f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  TPM_HANDLE key_handle;
14256f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
14266f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.LoadKey(
14276f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      key_blob, nullptr, &key_handle));
142882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
142982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
14300ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, LoadKeyParserFail) {
14310ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  TPM_HANDLE key_handle;
14320ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  std::string key_blob;
14330ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_CALL(mock_blob_parser_, ParseKeyBlob(key_blob, _, _))
14340ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      .WillOnce(Return(false));
14350ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.LoadKey(
14360ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      key_blob, &mock_authorization_delegate_, &key_handle));
14370ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi}
14386f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi
1439a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, SealedDataSuccess) {
1440a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string data_to_seal("seal_data");
1441a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1442a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPM2B_SENSITIVE_CREATE sensitive_create;
1443a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPM2B_PUBLIC in_public;
1444a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, _, _,
1445a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                                         _, _, _, _, _, _, _))
1446a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<1>(&sensitive_create),
1447a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      SaveArg<2>(&in_public),
1448a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1449a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.SealData(
1450a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      data_to_seal, "", &mock_authorization_delegate_, &sealed_data));
1451a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(sensitive_create.sensitive.data.size, data_to_seal.size());
1452a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_create.sensitive.data.buffer,
1453a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      data_to_seal.data(), data_to_seal.size()));
1454a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(in_public.public_area.type, TPM_ALG_KEYEDHASH);
1455a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(in_public.public_area.name_alg, TPM_ALG_SHA256);
1456a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1457a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1458a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, SealDataBadDelegate) {
1459a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string data_to_seal("seal_data");
1460a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1461a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.SealData(
1462a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      data_to_seal, "", nullptr, &sealed_data));
1463a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1464a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1465a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, SealDataFailure) {
1466a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string data_to_seal("seal_data");
1467a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1468a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, _, _,
1469a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                                         _, _, _, _, _, _, _))
1470a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1471a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.SealData(
1472a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      data_to_seal, "", &mock_authorization_delegate_, &sealed_data));
1473a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1474a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1475a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, SealDataParserFail) {
1476a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string data_to_seal("seal_data");
1477a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1478a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &sealed_data))
1479a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(false));
1480a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.SealData(
1481a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      data_to_seal, "", &mock_authorization_delegate_, &sealed_data));
1482a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1483a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1484a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealDataSuccess) {
1485a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1486b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi  std::string tpm_unsealed_data("password");
1487a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string unsealed_data;
1488a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPM_HANDLE object_handle = 42;
1489b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi  TPM2B_PUBLIC public_data;
1490b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi  public_data.public_area.auth_policy.size = 0;
1491b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
1492b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_data),
1493b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1494b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(object_handle, _, _, _, _, _))
1495b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_data),
1496b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1497a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
1498a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<4>(object_handle),
1499a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1500b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi  TPM2B_SENSITIVE_DATA out_data = Make_TPM2B_SENSITIVE_DATA(tpm_unsealed_data);
1501a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, UnsealSync(object_handle, _, _, _))
1502b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(out_data),
1503b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1504a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.UnsealData(
1505a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      sealed_data, &mock_authorization_delegate_, &unsealed_data));
1506b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi  EXPECT_EQ(unsealed_data, tpm_unsealed_data);
1507a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1508a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1509a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealDataBadDelegate) {
1510a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1511a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string unsealed_data;
1512a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.UnsealData(
1513a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      sealed_data, nullptr, &unsealed_data));
1514a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1515a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1516a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealDataLoadFail) {
1517a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1518a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string unsealed_data;
1519a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
1520a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1521a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData(
1522a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      sealed_data, &mock_authorization_delegate_, &unsealed_data));
1523a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1524a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1525a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealDataBadKeyName) {
1526a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1527a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string unsealed_data;
1528a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
1529a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1530a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData(
1531a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      sealed_data, &mock_authorization_delegate_, &unsealed_data));
1532a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1533a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1534a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealObjectFailure) {
1535a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string sealed_data;
1536a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string unsealed_data;
1537a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, UnsealSync(_, _, _, _))
1538a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1539a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData(
1540a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      sealed_data, &mock_authorization_delegate_, &unsealed_data));
1541a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1542a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1543a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, StartSessionSuccess) {
1544a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true))
1545a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
1546a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
1547a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      utility_.StartSession(&mock_hmac_session_));
1548a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1549a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1550a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, StartSessionFailure) {
1551a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true))
1552a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1553a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
1554a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      utility_.StartSession(&mock_hmac_session_));
1555a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1556a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1557a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueSuccess) {
1558a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  int index = 5;
1559a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string pcr_value("pcr_value");
1560a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string policy_digest;
1561a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPML_PCR_SELECTION pcr_select;
1562a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  pcr_select.count = 1;
1563a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256;
1564a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  pcr_select.pcr_selections[0].sizeof_select = 1;
1565a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  pcr_select.pcr_selections[0].pcr_select[index / 8] = 1 << (index % 8);
1566a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPML_DIGEST pcr_values;
1567a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  pcr_values.count = 1;
1568a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  pcr_values.digests[0] = Make_TPM2B_DIGEST(pcr_value);
1569a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
1570a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(pcr_select),
1571a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      SetArgPointee<3>(pcr_values),
1572a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1573a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string tpm_pcr_value;
1574a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _))
1575a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<1>(&tpm_pcr_value),
1576a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1577a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string tpm_policy_digest("digest");
1578a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_policy_session_, GetDigest(_))
1579a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<0>(tpm_policy_digest),
1580a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1581a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
1582a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      utility_.GetPolicyDigestForPcrValue(index, "", &policy_digest));
1583a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(policy_digest, tpm_policy_digest);
1584a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(pcr_value, tpm_pcr_value);
1585a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1586a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1587a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueSuccessWithPcrValue) {
1588a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  int index = 5;
1589a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string pcr_value("pcr_value");
1590a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string policy_digest;
1591a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string tpm_pcr_value;
1592a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _))
1593a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<1>(&tpm_pcr_value),
1594a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1595a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string tpm_policy_digest("digest");
1596a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_policy_session_, GetDigest(_))
1597a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<0>(tpm_policy_digest),
1598a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1599a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
1600a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest));
1601a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(policy_digest, tpm_policy_digest);
1602a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(pcr_value, tpm_pcr_value);
1603a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1604a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1605a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadSession) {
1606a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  int index = 5;
1607a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string pcr_value("value");
1608a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string policy_digest;
1609a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_policy_session_, StartUnboundSession(false))
1610a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1611a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
1612a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest));
1613a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1614a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1615a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValuePcrReadFail) {
1616a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  int index = 5;
1617a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string policy_digest;
1618a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
1619a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1620a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
1621a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      utility_.GetPolicyDigestForPcrValue(index, "", &policy_digest));
1622a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1623a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1624a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadPcr) {
1625a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  int index = 5;
1626a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string pcr_value("value");
1627a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string policy_digest;
1628a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _))
1629a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1630a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
1631a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest));
1632a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1633a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
1634a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadDigest) {
1635a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  int index = 5;
1636a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string pcr_value("value");
1637a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  std::string policy_digest;
1638a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_CALL(mock_policy_session_, GetDigest(&policy_digest))
1639a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1640a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
1641a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi      utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest));
1642a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi}
1643a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
164439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceSuccess) {
164539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 59;
164639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
164739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length  = 256;
164839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM2B_NV_PUBLIC public_data;
164939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _))
165039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&public_data),
165139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
16525d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.DefineNVSpace(
16535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, length, &mock_authorization_delegate_));
165439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.nv_index, nvram_index);
165539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.name_alg, TPM_ALG_SHA256);
165639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.attributes,
16572da8ff25e7c88c78e8a9db8de9686c92817f0992Darren Krahn            TPMA_NV_NO_DA | TPMA_NV_OWNERWRITE | TPMA_NV_WRITEDEFINE |
16582da8ff25e7c88c78e8a9db8de9686c92817f0992Darren Krahn                TPMA_NV_AUTHREAD);
165939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.data_size, length);
166039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
166139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
166239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadLength) {
166339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t bad_length = 3000;
166439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE,
16655d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      utility_.DefineNVSpace(0, bad_length, &mock_authorization_delegate_));
166639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
166739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
166839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadIndex) {
166939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<29;
167039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
16715d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      utility_.DefineNVSpace(bad_index, 2, &mock_authorization_delegate_));
167239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
167339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
167439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadSession) {
1675c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.DefineNVSpace(0, 2, nullptr));
167639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
167739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
167839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceFail) {
167939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 59;
168039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length  = 256;
168139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _))
168239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
168339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
16845d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      utility_.DefineNVSpace(index, length, &mock_authorization_delegate_));
168539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
168639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
168739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceSuccess) {
168839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
168939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
169039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
169139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _));
169239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
16935d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.DestroyNVSpace(index, &mock_authorization_delegate_));
169439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
169539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
169639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadIndex) {
169739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<29;
169839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
16995d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.DestroyNVSpace(bad_index, &mock_authorization_delegate_));
170039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
170139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
170239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadSession) {
1703c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.DestroyNVSpace(3, nullptr));
170439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
170539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
170639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceFailure) {
170739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
170839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
170939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
171039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _))
171139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
171239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
17135d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.DestroyNVSpace(index, &mock_authorization_delegate_));
171439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
171539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
171639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceSuccess) {
171739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
171839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
17192da8ff25e7c88c78e8a9db8de9686c92817f0992Darren Krahn  EXPECT_CALL(mock_tpm_, NV_WriteLockSync(TPM_RH_OWNER, _, nvram_index, _, _))
172039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
172139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
17225d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.LockNVSpace(index, &mock_authorization_delegate_));
17236537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
17245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(index, &public_area));
17256537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(public_area.attributes & TPMA_NV_WRITELOCKED, TPMA_NV_WRITELOCKED);
172639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
172739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
172839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadIndex) {
172939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
173039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
17315d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.LockNVSpace(bad_index, &mock_authorization_delegate_));
173239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
173339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
173439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadSession) {
1735c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.LockNVSpace(52, nullptr));
173639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
173739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
173839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceFailure) {
173939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
174039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
17412da8ff25e7c88c78e8a9db8de9686c92817f0992Darren Krahn  EXPECT_CALL(mock_tpm_, NV_WriteLockSync(TPM_RH_OWNER, _, nvram_index, _, _))
174239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
174339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
17445d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.LockNVSpace(index, &mock_authorization_delegate_));
174539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
174639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
174739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceSuccess) {
174839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
174939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
175039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
175139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
175239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _))
175339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
17545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.WriteNVSpace(
17555d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, offset, "", &mock_authorization_delegate_));
17566537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
17575d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(index, &public_area));
17586537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(public_area.attributes & TPMA_NV_WRITTEN, TPMA_NV_WRITTEN);
175939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
176039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
176139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSize) {
176239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
176339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data(1025, 0);
17645d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE, utility_.WriteNVSpace(
17655d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, 0, nvram_data, &mock_authorization_delegate_));
176639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
176739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
176839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadIndex) {
176939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
17705d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.WriteNVSpace(
17715d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      bad_index, 0, "", &mock_authorization_delegate_));
177239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
177339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
177439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSessions) {
1775c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS,
1776c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi            utility_.WriteNVSpace(53, 0, "", nullptr));
177739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
177839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
177939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceFailure) {
178039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
178139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
178239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
178339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
178439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _))
178539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
17865d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.WriteNVSpace(
17875d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, offset, "", &mock_authorization_delegate_));
178839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
178939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
179039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceSuccess) {
179139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
179239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
179339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nv_index = NV_INDEX_FIRST + index;
179439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 24;
179539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
179639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
179739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _))
179839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
17995d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ReadNVSpace(
18005d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, offset, length, &nvram_data, &mock_authorization_delegate_));
180139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
180239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
180339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadReadLength) {
180439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 1025;
180539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
18065d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE, utility_.ReadNVSpace(
18075d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      52, 0, length, &nvram_data, &mock_authorization_delegate_));
180839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
180939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
181039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadIndex) {
181139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
181239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
18135d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.ReadNVSpace(
18145d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      bad_index, 0, 5, &nvram_data, &mock_authorization_delegate_));
181539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
181639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
181739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadSession) {
181839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
181939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS,
1820c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi            utility_.ReadNVSpace(53, 0, 5, &nvram_data, nullptr));
182139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
182239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
182339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceFailure) {
182439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
182539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
182639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nv_index = NV_INDEX_FIRST + index;
182739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 24;
182839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
182939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
183039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _))
183139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
18325d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadNVSpace(
18335d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, offset, length, &nvram_data, &mock_authorization_delegate_));
183439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
183539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
183639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameSuccess) {
183739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
183839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
183939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string name;
184039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _))
184139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
18425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpaceName(index, &name));
184339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
184439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
184539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameFailure) {
184639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
184739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string name;
184839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
184939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
18505d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.GetNVSpaceName(index, &name));
185139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
185239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
18536537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaCachedSuccess) {
18546537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  uint32_t index = 53;
18556537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
18565d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  SetNVRAMMap(index, public_area);
18576537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
18586537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi      .Times(0);
18595d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpacePublicArea(index, &public_area));
18606537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi}
18616537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
186239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaSuccess) {
186339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
186439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
186539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
186639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _))
186739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
18685d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpacePublicArea(index, &public_area));
186939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
187039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
187139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaFailure) {
187239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
187339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
187439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
187539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
18765d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.GetNVSpacePublicArea(index, &public_area));
187739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
187839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
187966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordSuccess) {
188066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
188166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(false));
188266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
188366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
188466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, SetKnownOwnerPassword("password"));
188566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
188666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
188766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordOwnershipDone) {
188866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, SetKnownOwnerPassword("password"));
188966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
189066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
189166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordFailure) {
189266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
189366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(false));
189466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
189566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
189666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, SetKnownOwnerPassword("password"));
189766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
189866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
189966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysSuccess) {
190066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
190166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .Times(2)
190266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
190366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password"));
190466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
190566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
190666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysHandleConsistency) {
190766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_HANDLE test_handle = 42;
190866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
190966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .Times(2)
191066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
191166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _))
191266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<3>(test_handle),
191366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
191466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _))
191566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
191666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password"));
191766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
191866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
191966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysCreateFailure) {
192066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
192166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
192266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _))
192366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
192466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys("password"));
192566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
192666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
192766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysPersistFailure) {
192866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
192966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
193066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _))
193166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
193266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys("password"));
193366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
193466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
193566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysAlreadyExist) {
193666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
193766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .Times(2)
193866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
193966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password"));
194066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
194166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
194266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeySuccess) {
194366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
194466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
194566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
194666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
194712a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr  TPM2B_PUBLIC public_area;
194812a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
194912a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr      .WillOnce(DoAll(SaveArg<2>(&public_area),
195012a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr                      Return(TPM_RC_SUCCESS)));
195166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password"));
195212a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr  EXPECT_EQ(TPM_ALG_SHA256, public_area.public_area.name_alg);
195366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
195466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
195566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyConsistency) {
195666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
195766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
195866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
195966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
196045e57ff54637d95252144544c3b051107473844eUtkarsh Sanghi  TPM_HANDLE test_handle = 42;
196166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
196266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<4>(test_handle),
196366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
196466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _))
196566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
196666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password"));
196766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
196866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
196966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyCreateFailure) {
197066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
197166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
197266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
197366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
197466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
197566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
197666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password"));
197766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
197866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
197966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyLoadFailure) {
198066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
198166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
198266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
198366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
198466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
198566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
198666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password"));
198766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
198866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
198966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyPersistFailure) {
199066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
199166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
199266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
199366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
199466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _))
199566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
199666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password"));
199766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
199866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
199966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyAlreadyExists) {
200066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
200166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
200266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password"));
200366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
200466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
2005c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}  // namespace trunks
2006