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 899caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn void SetExistingKeyHandleExpectation(TPM_HANDLE handle) { 909caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPMS_CAPABILITY_DATA capability_data = {}; 919caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_HANDLE& handles = capability_data.data.handles; 929caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn handles.count = 1; 939caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn handles.handle[0] = handle; 949caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_CALL(mock_tpm_, 959caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn GetCapabilitySync(TPM_CAP_HANDLES, handle, _, _, _, _)) 969caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn .WillRepeatedly( 979caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn DoAll(SetArgPointee<4>(capability_data), Return(TPM_RC_SUCCESS))); 989caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } 999caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn 1009caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn void PopulatePCRSelection(bool has_sha1_pcrs, 1019caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn bool make_sha1_bank_empty, 1029caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn bool has_sha256_pcrs, 1039caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_PCR_SELECTION* pcrs) { 1049caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn memset(pcrs, 0, sizeof(TPML_PCR_SELECTION)); 1059caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn // By convention fill SHA-256 first. This is a bit brittle because order is 1069caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn // not important but it simplifies comparison to memcmp. 1079caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn if (has_sha256_pcrs) { 1089caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn pcrs->pcr_selections[pcrs->count].hash = TPM_ALG_SHA256; 1099caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn pcrs->pcr_selections[pcrs->count].sizeof_select = PCR_SELECT_MIN; 1109caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn for (int i = 0; i < PCR_SELECT_MIN; ++i) { 1119caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn pcrs->pcr_selections[pcrs->count].pcr_select[i] = 0xff; 1129caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } 1139caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ++pcrs->count; 1149caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } 1159caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn if (has_sha1_pcrs) { 1169caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn pcrs->pcr_selections[pcrs->count].hash = TPM_ALG_SHA1; 1179caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn if (make_sha1_bank_empty) { 1189caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn pcrs->pcr_selections[pcrs->count].sizeof_select = PCR_SELECT_MAX; 1199caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } else { 1209caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn pcrs->pcr_selections[pcrs->count].sizeof_select = PCR_SELECT_MIN; 1219caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn for (int i = 0; i < PCR_SELECT_MIN; ++i) { 1229caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn pcrs->pcr_selections[pcrs->count].pcr_select[i] = 0xff; 1239caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } 1249caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } 1259caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ++pcrs->count; 1269caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } 1279caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } 1289caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn 1299caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn void SetExistingPCRSExpectation(bool has_sha1_pcrs, bool has_sha256_pcrs) { 1309caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPMS_CAPABILITY_DATA capability_data = {}; 1319caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_PCR_SELECTION& pcrs = capability_data.data.assigned_pcr; 1329caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn PopulatePCRSelection(has_sha1_pcrs, false, has_sha256_pcrs, &pcrs); 1339caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_CALL(mock_tpm_, 1349caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn GetCapabilitySync(TPM_CAP_PCRS, _, _, _, _, _)) 1359caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn .WillRepeatedly( 1369caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn DoAll(SetArgPointee<4>(capability_data), Return(TPM_RC_SUCCESS))); 1379caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn } 1389caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn 139c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn protected: 140c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn TrunksFactoryForTest factory_; 1410ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi NiceMock<MockBlobParser> mock_blob_parser_; 142c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn NiceMock<MockTpmState> mock_tpm_state_; 143c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn NiceMock<MockTpm> mock_tpm_; 1445d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi NiceMock<MockAuthorizationDelegate> mock_authorization_delegate_; 145ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi NiceMock<MockHmacSession> mock_hmac_session_; 146a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi NiceMock<MockPolicySession> mock_policy_session_; 1475d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TpmUtilityImpl utility_; 148c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}; 149c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn 15003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSuccess) { 1515d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Startup()); 15203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn} 15303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 15403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupAlreadyStarted) { 15503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn EXPECT_CALL(mock_tpm_, StartupSync(_, _)) 15603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn .WillRepeatedly(Return(TPM_RC_INITIALIZE)); 1575d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Startup()); 15803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn} 15903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 16003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupFailure) { 16103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn EXPECT_CALL(mock_tpm_, StartupSync(_, _)) 16203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn .WillRepeatedly(Return(TPM_RC_FAILURE)); 1635d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.Startup()); 16403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn} 16503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 16603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSelfTestFailure) { 16703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn EXPECT_CALL(mock_tpm_, SelfTestSync(_, _)) 16803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn .WillRepeatedly(Return(TPM_RC_FAILURE)); 1695d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.Startup()); 17003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn} 17103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn 172d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearSuccess) { 1735d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Clear()); 174d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi} 175d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi 176d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearAfterBadInit) { 177d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ClearSync(_, _, _)) 178d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi .WillOnce(Return(TPM_RC_AUTH_MISSING)) 179d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 1805d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Clear()); 181d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi} 182d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi 183d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearFail) { 184d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ClearSync(_, _, _)) 185d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1865d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.Clear()); 187d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi} 188d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi 189e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh SanghiTEST_F(TpmUtilityTest, ShutdownTest) { 190e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ShutdownSync(TPM_SU_CLEAR, _)); 1915d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.Shutdown(); 192e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi} 193e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi 194c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmAlreadyInit) { 1959caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(false, true); 1965d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm()); 1975d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm()); 198c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn} 199c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn 200c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmSuccess) { 2019caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(false, true); 2025d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm()); 203c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn} 204c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn 205c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmBadAuth) { 2069caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(false, true); 207c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn // Reject attempts to set platform auth. 208c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_PLATFORM, _, _, _)) 209c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn .WillRepeatedly(Return(TPM_RC_FAILURE)); 2105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.InitializeTpm()); 211c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn} 212c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn 213c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmDisablePHFails) { 2149caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(false, true); 21552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn // Reject attempts to disable the platform hierarchy. 21603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn EXPECT_CALL(mock_tpm_, HierarchyControlSync(_, _, TPM_RH_PLATFORM, _, _)) 217c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn .WillRepeatedly(Return(TPM_RC_FAILURE)); 2185d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.InitializeTpm()); 219c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn} 220c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn 2219caf492818a4cc51ba471534d3fcaa84c9ce0278Darren KrahnTEST_F(TpmUtilityTest, AllocatePCRFromNone) { 2229caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(false, false); 2239caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_PCR_SELECTION new_pcr_allocation; 224e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _)) 2259caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn .WillOnce(DoAll(SaveArg<2>(&new_pcr_allocation), 226e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi SetArgPointee<3>(YES), 227e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 2289caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR("")); 2299caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(1u, new_pcr_allocation.count); 2309caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_PCR_SELECTION expected_pcr_allocation; 2319caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn PopulatePCRSelection(false, false, true, &expected_pcr_allocation); 2329caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(0, memcmp(&expected_pcr_allocation, &new_pcr_allocation, 2339caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn sizeof(TPML_PCR_SELECTION))); 2349caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn} 2359caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn 2369caf492818a4cc51ba471534d3fcaa84c9ce0278Darren KrahnTEST_F(TpmUtilityTest, AllocatePCRFromSHA1Only) { 2379caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(true, false); 2389caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_PCR_SELECTION new_pcr_allocation; 2399caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _)) 2409caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn .WillOnce(DoAll(SaveArg<2>(&new_pcr_allocation), 2419caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetArgPointee<3>(YES), 2429caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn Return(TPM_RC_SUCCESS))); 2439caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR("")); 2449caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(2u, new_pcr_allocation.count); 2459caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_PCR_SELECTION expected_pcr_allocation; 2469caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn PopulatePCRSelection(true, true, true, &expected_pcr_allocation); 2479caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(0, memcmp(&expected_pcr_allocation, &new_pcr_allocation, 2489caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn sizeof(TPML_PCR_SELECTION))); 2499caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn} 2509caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn 2519caf492818a4cc51ba471534d3fcaa84c9ce0278Darren KrahnTEST_F(TpmUtilityTest, AllocatePCRFromSHA1AndSHA256) { 2529caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(true, true); 2539caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_PCR_SELECTION new_pcr_allocation; 2549caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _)) 2559caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn .WillOnce(DoAll(SaveArg<2>(&new_pcr_allocation), 2569caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetArgPointee<3>(YES), 2579caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn Return(TPM_RC_SUCCESS))); 2589caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR("")); 2599caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(1u, new_pcr_allocation.count); 2609caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPML_PCR_SELECTION expected_pcr_allocation; 2619caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn PopulatePCRSelection(true, true, false, &expected_pcr_allocation); 2629caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(0, memcmp(&expected_pcr_allocation, &new_pcr_allocation, 2639caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn sizeof(TPML_PCR_SELECTION))); 2649caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn} 2659caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn 2669caf492818a4cc51ba471534d3fcaa84c9ce0278Darren KrahnTEST_F(TpmUtilityTest, AllocatePCRFromSHA256Only) { 2679caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(false, true); 2689caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _)) 2699caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn .Times(0); 2709caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn ASSERT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR("")); 271e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi} 272e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi 273e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh SanghiTEST_F(TpmUtilityTest, AllocatePCRCommandFailure) { 2749caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(false, false); 275e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _)) 276e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 277e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.AllocatePCR("")); 278e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi} 279e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi 280e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh SanghiTEST_F(TpmUtilityTest, AllocatePCRTpmFailure) { 2819caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingPCRSExpectation(false, false); 282e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _)) 283e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi .WillOnce(DoAll(SetArgPointee<3>(NO), 284e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 285e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.AllocatePCR("")); 286e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi} 287e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi 28852e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipSuccess) { 28952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 29052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 29152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet()) 29252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 29352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet()) 29452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 29566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 29666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 29766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 29852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 29952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 30066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipOwnershipDone) { 30166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 30266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 30366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 30466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 30566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 30666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipBadSession) { 307ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true)) 30866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_FAILURE)); 30966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner", 31066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 31166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 31252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 31352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 31466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipFailure) { 31566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _)) 31666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_FAILURE)); 31766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner", 31866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 31966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 32066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 32166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 32266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementDone) { 32352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 32466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(false)); 32566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet()) 32666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(false)); 32766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 32866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 32966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 33052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 33152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 33266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordLockoutDone) { 33352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 33452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 33552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet()) 33652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 33766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 33866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 33966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 34052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 34152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 34266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementLockoutDone) { 34352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 34452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 34566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner", 34666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 34766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 34866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 34966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 35045e57ff54637d95252144544c3b051107473844eUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementFail) { 35166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 35252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 35366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet()) 35466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(false)); 35566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _)) 35652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(TPM_RC_SUCCESS)); 35752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _)) 35852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(TPM_RC_FAILURE)); 35966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner", 36066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 36166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 36252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 36352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 36466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordLockoutFailure) { 36552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 36652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 36752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet()) 36852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 36952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet()) 37052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(false)); 37166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _)) 37252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(TPM_RC_SUCCESS)); 37352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _)) 37452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn .WillRepeatedly(Return(TPM_RC_FAILURE)); 37566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner", 37666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "endorsement", 37766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi "lockout")); 3780f46c15b948ee17f5668c332a25a0dbaecb2cc47Utkarsh Sanghi} 3790f46c15b948ee17f5668c332a25a0dbaecb2cc47Utkarsh Sanghi 3802ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomSuccess) { 3812ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi std::string entropy_data("large test data", 100); 3828b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, 3835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.StirRandom(entropy_data, &mock_authorization_delegate_)); 38452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 38552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 3862ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomFails) { 3872ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi std::string entropy_data("test data"); 388c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_CALL(mock_tpm_, StirRandomSync(_, nullptr)) 3892ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 390c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.StirRandom(entropy_data, nullptr)); 3912ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi} 3922ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi 3932ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomSuccess) { 3942ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi // This number is larger than the max bytes the GetRandom call can return. 3952ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi // Therefore we expect software to make multiple calls to fill this many 3962ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi // bytes. 3979caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn size_t num_bytes = 72; 3982ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi std::string random_data; 3992ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi TPM2B_DIGEST large_random; 4002ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi large_random.size = 32; 4012ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi TPM2B_DIGEST small_random; 4022ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi small_random.size = 8; 4035d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, &mock_authorization_delegate_)) 4042ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi .Times(2) 4052ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<1>(large_random), 40652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn Return(TPM_RC_SUCCESS))); 4075d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_CALL(mock_tpm_, GetRandomSync(8, _, &mock_authorization_delegate_)) 4082ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<1>(small_random), 4092ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 4105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.GenerateRandom( 4115d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi num_bytes, &mock_authorization_delegate_, &random_data)); 4122ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi EXPECT_EQ(num_bytes, random_data.size()); 41352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 41452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 4152ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomFails) { 4169caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn size_t num_bytes = 5; 4172ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi std::string random_data; 418c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, nullptr)) 4192ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 4208b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 421c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi utility_.GenerateRandom(num_bytes, nullptr, &random_data)); 42252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 42352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 4242ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRSuccess) { 4258b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi TPM_HANDLE pcr_handle = HR_PCR + 1; 426e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi TPML_DIGEST_VALUES digests; 4275d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_CALL(mock_tpm_, 4285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi PCR_ExtendSync(pcr_handle, _, _, &mock_authorization_delegate_)) 429e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi .WillOnce(DoAll(SaveArg<2>(&digests), 430e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 431e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.ExtendPCR(1, "test digest", 432e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi &mock_authorization_delegate_)); 4339caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_EQ(1u, digests.count); 434e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi EXPECT_EQ(TPM_ALG_SHA256, digests.digests[0].hash_alg); 435e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi std::string hash_string = crypto::SHA256HashString("test digest"); 436e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi EXPECT_EQ(0, memcmp(hash_string.data(), 437e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi digests.digests[0].digest.sha256, 438e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi crypto::kSHA256Length)); 4392ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi} 4402ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi 4412ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRFail) { 4422ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi int pcr_index = 0; 4432ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi TPM_HANDLE pcr_handle = HR_PCR + pcr_index; 4442ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi EXPECT_CALL(mock_tpm_, PCR_ExtendSync(pcr_handle, _, _, _)) 4452ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 446c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 447c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi utility_.ExtendPCR(pcr_index, "test digest", nullptr)); 4482ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi} 4492ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi 4502ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRBadParam) { 451c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.ExtendPCR(-1, "test digest", nullptr)); 4522ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi} 4532ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi 4542ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRSuccess) { 4552ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi // The |pcr_index| is chosen to match the structure for |pcr_select|. 4562ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi // If you change |pcr_index|, remember to change |pcr_select|. 4572ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi int pcr_index = 1; 4582ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi std::string pcr_value; 4592ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi TPML_PCR_SELECTION pcr_select; 4602ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi pcr_select.count = 1; 4612ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256; 4622ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi pcr_select.pcr_selections[0].sizeof_select = 1; 4632ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi pcr_select.pcr_selections[0].pcr_select[0] = 2; 4642ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi TPML_DIGEST pcr_values; 4652ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi pcr_values.count = 1; 4662ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi pcr_values.digests[0].size = 5; 4672ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _)) 4682ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<2>(pcr_select), 4692ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi SetArgPointee<3>(pcr_values), 4702ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 4715d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.ReadPCR(pcr_index, &pcr_value)); 4722ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi} 4732ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi 4742ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRFail) { 4752ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi std::string pcr_value; 4762ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _)) 4772ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 4785d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadPCR(1, &pcr_value)); 4792ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi} 4802ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi 4812ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRBadReturn) { 4822ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi std::string pcr_value; 4835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadPCR(1, &pcr_value)); 48452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn} 48552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn 486b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSuccess) { 487b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM_HANDLE key_handle; 488b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string plaintext; 489b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string output_ciphertext("ciphertext"); 490b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string ciphertext; 491b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 492b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi output_ciphertext); 493b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM2B_PUBLIC public_area; 494b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 495b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 4968b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 4978b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 498b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 499b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 500b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 5015d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, 5025d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_)) 503b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(out_message), 504b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 5055d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt( 5068b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi key_handle, 5078b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi TPM_ALG_NULL, 5088b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi TPM_ALG_NULL, 5098b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi plaintext, 5105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 5118b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi &ciphertext)); 512b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi EXPECT_EQ(0, ciphertext.compare(output_ciphertext)); 513b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi} 514b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi 515b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptFail) { 516b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM_HANDLE key_handle; 517b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string plaintext; 518b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string ciphertext; 519b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM2B_PUBLIC public_area; 520b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 521b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 5228b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 5238b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 524b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 525b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 526b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 527c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr)) 528b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 5295d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.AsymmetricEncrypt(key_handle, 530b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM_ALG_NULL, 5319dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_ALG_NULL, 532b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi plaintext, 533c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi nullptr, 534b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi &ciphertext)); 535b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi} 536b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi 537b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptBadParams) { 5389caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPM_HANDLE key_handle = TPM_RH_FIRST; 539b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string plaintext; 540b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string ciphertext; 541b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM2B_PUBLIC public_area; 542b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 543b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt | kRestricted; 544c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, nullptr)) 545b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 546b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 5475d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.AsymmetricEncrypt(key_handle, 548b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM_ALG_RSAES, 5499dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_ALG_NULL, 550b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi plaintext, 551c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi nullptr, 552b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi &ciphertext)); 553b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi} 5549dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi 5559dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptNullSchemeForward) { 5569dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_HANDLE key_handle; 5579dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string plaintext; 5589dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string output_ciphertext("ciphertext"); 5599dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string ciphertext; 5609dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 5619dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi output_ciphertext); 5629dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM2B_PUBLIC public_area; 5639dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 5649dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh 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; 5679dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPMT_RSA_DECRYPT scheme; 5689dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 5699dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 5709dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 571c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr)) 5729dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(out_message), 5739dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi SaveArg<3>(&scheme), 5749dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 5755d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(key_handle, 5769dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_ALG_NULL, 5779dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_ALG_NULL, 5789dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi plaintext, 579c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi nullptr, 5809dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi &ciphertext)); 5819dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP); 5829dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256); 5839dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi} 5849dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi 5859dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSchemeForward) { 5869dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_HANDLE key_handle; 5879dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string plaintext; 5889dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string output_ciphertext("ciphertext"); 5899dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string ciphertext; 5909dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 5919dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi output_ciphertext); 5929dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM2B_PUBLIC public_area; 5939dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 5949dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 5958b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 5968b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 5979dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPMT_RSA_DECRYPT scheme; 5989dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 5999dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 6009dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 601c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr)) 6029dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(out_message), 6039dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi SaveArg<3>(&scheme), 6049dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 6055d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(key_handle, 6069dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_ALG_RSAES, 6079dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_ALG_NULL, 6089dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi plaintext, 609c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi nullptr, 6109dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi &ciphertext)); 6119dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES); 6129dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi} 6139dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi 614b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSuccess) { 615b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM_HANDLE key_handle; 616b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string plaintext; 617b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string output_plaintext("plaintext"); 618b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string ciphertext; 6192ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string password("password"); 620b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 621b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi output_plaintext); 622b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM2B_PUBLIC public_area; 623b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 624b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 6258b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 6268b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 627b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 628b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 629b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 6305d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, 6315d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_)) 632b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(out_message), 633b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 6345d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt( 6355d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi key_handle, 6365d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 6375d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 6385d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi ciphertext, 6395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 6405d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &plaintext)); 641b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi EXPECT_EQ(0, plaintext.compare(output_plaintext)); 642b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi} 643b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi 644b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptFail) { 645b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM_HANDLE key_handle; 646b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string key_name; 647b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string plaintext; 648b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string ciphertext; 649b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string password; 650b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM2B_PUBLIC public_area; 651b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 652b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 6538b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 6548b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 655b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 656b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 657b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 658b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _)) 659b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 6605d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.AsymmetricDecrypt( 6611ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi key_handle, 6621ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_ALG_NULL, 6631ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_ALG_NULL, 6641ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi ciphertext, 6655d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 6661ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi &plaintext)); 667b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi} 668b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi 669b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadParams) { 6709caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn TPM_HANDLE key_handle = TPM_RH_FIRST; 671b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string plaintext; 672b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi std::string ciphertext; 673b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi TPM2B_PUBLIC public_area; 674b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 675b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt | kRestricted; 676b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 677b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 678b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 6795d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.AsymmetricDecrypt( 6801ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi key_handle, 6811ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_ALG_RSAES, 6821ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_ALG_NULL, 6831ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi ciphertext, 6845d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 6851ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi &plaintext)); 686b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi} 687b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi 6882ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadSession) { 6891ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_HANDLE key_handle = TPM_RH_FIRST; 6902ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string key_name; 6912ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string plaintext; 6922ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string ciphertext; 6932ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string password; 6945d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.AsymmetricDecrypt( 695c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi key_handle, TPM_ALG_RSAES, TPM_ALG_NULL, 696c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi ciphertext, nullptr, &plaintext)); 6972ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi} 6982ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi 6999dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptNullSchemeForward) { 7009dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_HANDLE key_handle; 7019dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string plaintext; 7029dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string output_plaintext("plaintext"); 7039dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string ciphertext; 7049dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string password; 7059dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 7069dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi output_plaintext); 7079dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM2B_PUBLIC public_area; 7089dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 7099dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 7108b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 7118b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 7129dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPMT_RSA_DECRYPT scheme; 7139dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 7149dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 7159dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 7169dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _)) 7179dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(out_message), 7189dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi SaveArg<3>(&scheme), 7199dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 7205d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt( 7211ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi key_handle, 7221ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_ALG_NULL, 7231ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_ALG_NULL, 7241ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi ciphertext, 7255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 7261ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi &plaintext)); 7279dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP); 7289dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256); 7299dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi} 7309dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi 7319dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSchemeForward) { 7329dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM_HANDLE key_handle; 7339dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string plaintext; 7349dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string output_plaintext("plaintext"); 7359dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string ciphertext; 7369dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi std::string password; 7379dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA( 7389dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi output_plaintext); 7399dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPM2B_PUBLIC public_area; 7409dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 7419dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 7428b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 7438b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 7449dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi TPMT_RSA_DECRYPT scheme; 7459dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 7469dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 7479dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 7489dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _)) 7499dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(out_message), 7509dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi SaveArg<3>(&scheme), 7519dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 7525d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt( 7531ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi key_handle, 7541ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_ALG_RSAES, 7551ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_ALG_NULL, 7561ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi ciphertext, 7575d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 7581ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi &plaintext)); 7599dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES); 7609dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi} 7619dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi 762748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSuccess) { 763748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 7642ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string password("password"); 765e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 766748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPMT_SIGNATURE signature_out; 767748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi signature_out.signature.rsassa.sig.size = 2; 768748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi signature_out.signature.rsassa.sig.buffer[0] = 'h'; 769748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi signature_out.signature.rsassa.sig.buffer[1] = 'i'; 770748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 771748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 772748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 773748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 7748b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 7758b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 776748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 777748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 778748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 7795d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, 7805d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_)) 781748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(signature_out), 782748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 7835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle, 7845d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 7855d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 7865d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 7875d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 7885d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 789748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_EQ(0, signature.compare("hi")); 790748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 791748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 792748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignFail) { 793748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 794748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string password; 795e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 796748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 797748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 798748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 799748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 8008b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 8018b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 802748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 803748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 804748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 805748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _)) 806748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 8075d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.Sign(key_handle, 8085d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 8095d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 8105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 8115d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 8125d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 813748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 814748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 815748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams1) { 816748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 817748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string password; 818e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 819748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 820748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 821748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 822748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign | kRestricted; 823748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 824748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 825748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 8265d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle, 8275d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_RSAPSS, 8285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 8295d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 8305d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 8315d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 832748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 833748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 8342ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, SignBadAuthorizationSession) { 8351ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi TPM_HANDLE key_handle = TPM_RH_FIRST; 8362ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string password; 8372ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string digest(32, 'a'); 8382ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi std::string signature; 8395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.Sign(key_handle, 8405d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_RSAPSS, 8415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 8425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 843c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi nullptr, 8445d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 8452ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi} 8462ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi 847748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams2) { 848748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 849748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string password; 850e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 851748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 852748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 853748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 854748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 855748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 856748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 857748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 8585d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle, 8595d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_RSAPSS, 8605d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 8615d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 8625d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 8635d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 864748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 865748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 866748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams3) { 867748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 868748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string password; 869e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 870748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 871748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 872748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_ECC; 873748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 874748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 875748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 876748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 8775d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle, 8785d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_RSAPSS, 8795d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 8805d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 8815d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 8825d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 883748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 884748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 885748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams4) { 886748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 887748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string password; 888e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 889748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 890748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 891748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 892748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 893748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 894748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 895748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_FAILURE))); 8965d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.Sign(key_handle, 8975d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_RSAPSS, 8985d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 8995d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 9005d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 9015d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 902748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 903748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 904748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams5) { 905748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle = 0; 906748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string password; 907e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 908748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 9095d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle, 9105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_AES, 9115d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 9125d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 9135d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 9145d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 915748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 916748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 917748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 918748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignNullSchemeForward) { 919748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 920748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string password; 921e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 922748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPMT_SIGNATURE signature_out; 923748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi signature_out.signature.rsassa.sig.size = 0; 924748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 925748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 926748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPMT_SIG_SCHEME scheme; 927748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 928748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 9298b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 9308b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 931748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 932748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 933748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 934748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _)) 935748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(signature_out), 936748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi SaveArg<3>(&scheme), 937748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 9385d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle, 9395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 9405d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 9415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 9425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 9435d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 944748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_EQ(scheme.scheme, TPM_ALG_RSASSA); 945748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_EQ(scheme.details.rsassa.hash_alg, TPM_ALG_SHA256); 946748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 947748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 948748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSchemeForward) { 949748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 950748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string password; 951e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(64, 'a'); 952748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPMT_SIGNATURE signature_out; 953748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi signature_out.signature.rsassa.sig.size = 0; 954748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 955748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 956748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPMT_SIG_SCHEME scheme; 957748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 958748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 9598b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 9608b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 961748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 962748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 963748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 964748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _)) 965748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillOnce(DoAll(SetArgPointee<5>(signature_out), 966748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi SaveArg<3>(&scheme), 967748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 9685d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle, 9695d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_RSAPSS, 9705d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_SHA1, 9715d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 9725d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 9735d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &signature)); 974748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_EQ(scheme.scheme, TPM_ALG_RSAPSS); 975887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi EXPECT_EQ(scheme.details.rsapss.hash_alg, TPM_ALG_SHA1); 976748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 977748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 978748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySuccess) { 979748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 980e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 981748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 982748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 983748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 984748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 985748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 986748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 987748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 988748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _)) 989748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 9905d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle, 9915d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 9925d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 9935d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 9946f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 9956f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 996748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 997748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 998748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyFail) { 999748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 1000e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 1001748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 1002748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 1003748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 1004748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 1005748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1006748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1007748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 1008748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _)) 1009748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 10105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.Verify(key_handle, 10115d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10125d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10135d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 10146f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 10156f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 1016748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 1017748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 1018748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams1) { 1019748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 1020e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 1021748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 1022748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 1023748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 1024748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign | kRestricted; 1025748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1026748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1027748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 10285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle, 10295d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10305d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10315d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 10326f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 10336f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 1034748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 1035748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 1036748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams2) { 1037748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 1038e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 1039748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 1040748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 1041748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 1042748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kDecrypt; 1043748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1044748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1045748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 10465d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle, 10475d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10485d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10495d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 10506f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 10516f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 1052748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 1053748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 1054748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams3) { 1055748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 1056e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 1057748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 1058748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 1059748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_ECC; 1060748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 1061748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1062748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1063748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 10645d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle, 10655d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10665d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10675d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 10686f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 10696f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 1070748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 1071748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 1072748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams4) { 1073748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 1074e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 1075748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 1076748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 1077748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 1078748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 1079748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1080748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1081748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_FAILURE))); 10825d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.Verify(key_handle, 10835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10845d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 10855d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 10866f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 10876f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 1088748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 1089748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 1090748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams5) { 1091748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 1092e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 1093748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 1094748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 1095748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 1096748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 1097748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1098748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1099748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 11005d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle, 11015d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_AES, 11025d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 11035d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 11046f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 11056f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 1106748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 1107748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 1108748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyNullSchemeForward) { 1109748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 1110e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(32, 'a'); 1111748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 1112748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 1113748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPMT_SIGNATURE signature_in; 1114748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 1115748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 1116748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1117748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1118748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 1119748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _)) 1120748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillOnce(DoAll(SaveArg<3>(&signature_in), 1121748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 11225d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle, 11235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 11245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_NULL, 11255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 11266f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 11276f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 1128748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSASSA); 1129748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA256); 1130748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 1131748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 1132748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySchemeForward) { 1133748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM_HANDLE key_handle; 1134e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi std::string digest(64, 'a'); 1135748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi std::string signature; 1136748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPM2B_PUBLIC public_area; 1137748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi TPMT_SIGNATURE signature_in; 1138748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 1139748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi public_area.public_area.object_attributes = kSign; 1140748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 1141748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 1142748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 1143748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _)) 1144748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi .WillOnce(DoAll(SaveArg<3>(&signature_in), 1145748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 11465d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle, 11475d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_RSAPSS, 11485d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi TPM_ALG_SHA1, 11495d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi digest, 11506f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi signature, 11516f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi nullptr)); 1152748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSAPSS); 1153887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA1); 1154748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi} 1155748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi 1156fded77411da5ef66dff7389e49f40900c19d510cUtkarsh SanghiTEST_F(TpmUtilityTest, CertifyCreationSuccess) { 1157fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi TPM_HANDLE key_handle = 42; 1158fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi std::string creation_blob; 1159fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi EXPECT_CALL(mock_tpm_, CertifyCreationSyncShort(TPM_RH_NULL, key_handle, 1160fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi _, _, _, _, _, _, _)) 1161fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 1162fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, 1163fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi utility_.CertifyCreation(key_handle, creation_blob)); 1164fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi} 1165fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi 1166fded77411da5ef66dff7389e49f40900c19d510cUtkarsh SanghiTEST_F(TpmUtilityTest, CertifyCreationParserError) { 1167fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi TPM_HANDLE key_handle = 42; 1168fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi std::string creation_blob; 1169fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi EXPECT_CALL(mock_blob_parser_, ParseCreationBlob(creation_blob, _, _, _)) 1170fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi .WillOnce(Return(false)); 1171fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, 1172fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi utility_.CertifyCreation(key_handle, creation_blob)); 1173fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi} 1174fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi 1175fded77411da5ef66dff7389e49f40900c19d510cUtkarsh SanghiTEST_F(TpmUtilityTest, CertifyCreationFailure) { 1176fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi TPM_HANDLE key_handle = 42; 1177fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi std::string creation_blob; 1178fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi EXPECT_CALL(mock_tpm_, CertifyCreationSyncShort(TPM_RH_NULL, key_handle, 1179fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi _, _, _, _, _, _, _)) 1180fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1181fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 1182fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi utility_.CertifyCreation(key_handle, creation_blob)); 1183fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi} 1184fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi 118533ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataSuccess) { 118633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM_HANDLE key_handle = 1; 118733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string new_password; 11880ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string key_blob; 11890ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi TPM2B_PUBLIC public_area; 11900ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 11910ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi public_area.public_area.auth_policy.size = 0; 11920ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 11930ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 11940ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 11950ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 11965d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.ChangeKeyAuthorizationData( 11970ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi key_handle, new_password, &mock_authorization_delegate_, &key_blob)); 119833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi} 119933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi 120033ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataKeyNameFail) { 120133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM_HANDLE key_handle = 1; 120233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string old_password; 120333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string new_password; 120433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _)) 120533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 12065d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.ChangeKeyAuthorizationData( 1207c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi key_handle, new_password, &mock_authorization_delegate_, nullptr)); 120833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi} 120933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi 121033ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataFailure) { 121133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM_HANDLE key_handle = 1; 121233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string new_password; 121333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ObjectChangeAuthSync(key_handle, _, _, _, _, _, _)) 121433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 12155d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.ChangeKeyAuthorizationData( 1216c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi key_handle, new_password, &mock_authorization_delegate_, nullptr)); 121733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi} 121833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi 12190ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataParserFail) { 122033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM_HANDLE key_handle = 1; 122133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string new_password; 122233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string key_blob; 12238b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi TPM2B_PUBLIC public_area; 12248b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.type = TPM_ALG_RSA; 12258b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.auth_policy.size = 0; 12268b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi public_area.public_area.unique.rsa.size = 0; 12278b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 12288b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_area), 12298b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 12300ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob)) 12310ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi .WillOnce(Return(false)); 12320ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.ChangeKeyAuthorizationData( 12335d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi key_handle, new_password, &mock_authorization_delegate_, &key_blob)); 123433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi} 123533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi 123633ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccess) { 123733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi uint32_t public_exponent = 0x10001; 123833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string modulus(256, 'a'); 123933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string prime_factor(128, 'b'); 124033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string password("password"); 124133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string key_blob; 124233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM2B_DATA encryption_key; 124333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM2B_PUBLIC public_data; 124433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM2B_PRIVATE private_data; 124533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _)) 124633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi .WillOnce(DoAll(SaveArg<2>(&encryption_key), 124733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi SaveArg<3>(&public_data), 124833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi SaveArg<4>(&private_data), 124933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 12505d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.ImportRSAKey( 125133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kDecryptKey, 12521ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi modulus, 12531ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi public_exponent, 12541ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi prime_factor, 12551ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi password, 12565d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 12571ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi &key_blob)); 125833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi // Validate that the public area was properly constructed. 125933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(public_data.public_area.parameters.rsa_detail.key_bits, 126033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi modulus.size() * 8); 126133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(public_data.public_area.parameters.rsa_detail.exponent, 126233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi public_exponent); 126333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(public_data.public_area.unique.rsa.size, modulus.size()); 126433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(0, memcmp(public_data.public_area.unique.rsa.buffer, 126533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi modulus.data(), modulus.size())); 126633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi // Validate the private struct construction. 126733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(kAesKeySize, encryption_key.size); 126833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi AES_KEY key; 126933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi AES_set_encrypt_key(encryption_key.buffer, kAesKeySize * 8, &key); 127033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi unsigned char iv[MAX_AES_BLOCK_SIZE_BYTES] = {0}; 127133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi int iv_in = 0; 127233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string unencrypted_private(private_data.size, 0); 127333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi AES_cfb128_encrypt( 127433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi reinterpret_cast<const unsigned char*>(private_data.buffer), 127533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi reinterpret_cast<unsigned char*>(string_as_array(&unencrypted_private)), 127633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi private_data.size, &key, iv, &iv_in, AES_DECRYPT); 127733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM2B_DIGEST inner_integrity; 127833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_DIGEST(&unencrypted_private, 1279c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi &inner_integrity, nullptr)); 128033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string object_name; 12816537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, 12825d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi ComputeKeyName(public_data.public_area, &object_name)); 128333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string integrity_value = crypto::SHA256HashString(unencrypted_private + 128433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi object_name); 128533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(integrity_value.size(), inner_integrity.size); 128633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(0, memcmp(inner_integrity.buffer, 128733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi integrity_value.data(), 128833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi inner_integrity.size)); 128933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TPM2B_SENSITIVE sensitive_data; 129033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_SENSITIVE(&unencrypted_private, 1291c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi &sensitive_data, nullptr)); 129233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(sensitive_data.sensitive_area.auth_value.size, password.size()); 129333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.auth_value.buffer, 129433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi password.data(), password.size())); 129533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(sensitive_data.sensitive_area.sensitive.rsa.size, 129633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi prime_factor.size()); 129733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.sensitive.rsa.buffer, 129833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi prime_factor.data(), prime_factor.size())); 129933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi} 130033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi 130133ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccessWithNoBlob) { 130233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi uint32_t public_exponent = 0x10001; 130333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string modulus(256, 'a'); 130433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string prime_factor(128, 'b'); 130533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string password; 13065d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.ImportRSAKey( 130733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kDecryptKey, 13081ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi modulus, 13091ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi public_exponent, 13101ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi prime_factor, 13111ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi password, 13125d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 1313c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi nullptr)); 131433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi} 131533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi 131633ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyParentNameFail) { 131733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi uint32_t public_exponent = 0x10001; 131833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string modulus(256, 'a'); 131933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string prime_factor(128, 'b'); 132033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string password; 132133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 132233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 13235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.ImportRSAKey( 132433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kDecryptKey, 13251ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi modulus, 13261ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi public_exponent, 13271ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi prime_factor, 13281ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi password, 13295d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 1330c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi nullptr)); 133133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi} 133233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi 133333ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyFail) { 133433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string modulus; 133533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string prime_factor; 133633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi std::string password; 133733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _)) 133833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 13395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.ImportRSAKey( 134033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kDecryptKey, 13411ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi modulus, 13421ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi 0x10001, 13431ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi prime_factor, 13441ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi password, 13455d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_, 1346c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi nullptr)); 134733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi} 134833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi 13490ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyParserFail) { 13500ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string modulus; 13510ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string prime_factor; 13520ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string password; 13530ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string key_blob; 13540ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob)) 13550ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi .WillOnce(Return(false)); 13560ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.ImportRSAKey( 13570ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kDecryptKey, 13580ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi modulus, 13590ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi 0x10001, 13600ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi prime_factor, 13610ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi password, 13620ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi &mock_authorization_delegate_, 13630ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi &key_blob)); 13640ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi} 13650ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi 13666f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairSuccess) { 136782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi TPM2B_PUBLIC public_area; 13680ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi TPML_PCR_SELECTION creation_pcrs; 13696f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, 13706f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi _, _, _, _, _, _, _, _, 13715d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi &mock_authorization_delegate_)) 137282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi .WillOnce(DoAll(SaveArg<2>(&public_area), 13730ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi SaveArg<3>(&creation_pcrs), 137482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 13756f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_blob; 1376a5a2f2ea49e0085bf8d7f6f2b6e7cd624d710c01Utkarsh Sanghi std::string creation_blob; 13770ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi int creation_pcr = 12; 13786f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair( 13796f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kDecryptAndSignKey, 2048, 0x10001, 13800ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi "password", "", false, creation_pcr, &mock_authorization_delegate_, 13810ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi &key_blob, &creation_blob)); 138282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt); 13836f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign); 13846ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi EXPECT_EQ(public_area.public_area.object_attributes & kUserWithAuth, 13856ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi kUserWithAuth); 13869caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_EQ(public_area.public_area.object_attributes & kAdminWithPolicy, 0u); 138782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme, 1388e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi TPM_ALG_NULL); 13899caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_EQ(1u, creation_pcrs.count); 13900ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_EQ(TPM_ALG_SHA256, creation_pcrs.pcr_selections[0].hash); 13910ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_EQ(PCR_SELECT_MIN, creation_pcrs.pcr_selections[0].sizeof_select); 13929caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_EQ(1u << (creation_pcr % 8), 13930ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi creation_pcrs.pcr_selections[0].pcr_select[creation_pcr / 8]); 139482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi} 139582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi 13966f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairDecryptKeySuccess) { 139782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi TPM2B_PUBLIC public_area; 13986f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, 13996f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi _, _, _, _, _, _, _, _, 14006f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi &mock_authorization_delegate_)) 140182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi .WillOnce(DoAll(SaveArg<2>(&public_area), 140282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 14036f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_blob; 14046f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair( 1405a5a2f2ea49e0085bf8d7f6f2b6e7cd624d710c01Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kDecryptKey, 2048, 0x10001, "password", 14060ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob, 14070ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi nullptr)); 14086f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt); 14099caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_EQ(public_area.public_area.object_attributes & kSign, 0u); 141082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme, 1411e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi TPM_ALG_NULL); 141282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi} 141382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi 14146f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairSignKeySuccess) { 141582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi TPM2B_PUBLIC public_area; 14166f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi TPM2B_SENSITIVE_CREATE sensitive_create; 14176f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, 14186f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi _, _, _, _, _, _, _, _, 14196f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi &mock_authorization_delegate_)) 14206f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi .WillOnce(DoAll(SaveArg<1>(&sensitive_create), 14216f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi SaveArg<2>(&public_area), 142282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 14236f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_blob; 14246f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string policy_digest(32, 'a'); 14256f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_auth("password"); 14266f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair( 14276f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, key_auth, 14280ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi policy_digest, true /* use_only_policy_authorization */, kNoCreationPCR, 1429a5a2f2ea49e0085bf8d7f6f2b6e7cd624d710c01Utkarsh Sanghi &mock_authorization_delegate_, &key_blob, nullptr)); 14309caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, 0u); 143182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign); 14329caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_EQ(public_area.public_area.object_attributes & kUserWithAuth, 0u); 14336ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi EXPECT_EQ(public_area.public_area.object_attributes & kAdminWithPolicy, 14346ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi kAdminWithPolicy); 143582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme, 143682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi TPM_ALG_NULL); 14376f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(public_area.public_area.parameters.rsa_detail.key_bits, 2048); 14389caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn EXPECT_EQ(public_area.public_area.parameters.rsa_detail.exponent, 0x10001u); 14396f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(public_area.public_area.auth_policy.size, policy_digest.size()); 14406f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(0, memcmp(public_area.public_area.auth_policy.buffer, 14416f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi policy_digest.data(), policy_digest.size())); 14426f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(sensitive_create.sensitive.user_auth.size, key_auth.size()); 14436f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(0, memcmp(sensitive_create.sensitive.user_auth.buffer, 14446f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi key_auth.data(), key_auth.size())); 144582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi} 144682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi 14476f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairBadDelegate) { 14486f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_blob; 14496f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.CreateRSAKeyPair( 14506f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kDecryptKey, 2048, 0x10001, "password", 14510ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi "", false, kNoCreationPCR, nullptr, &key_blob, nullptr)); 14526f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi} 14536f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi 14546f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairFailure) { 14556f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, 14566f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi _, _, _, _, _, _, _, _, 14576f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi &mock_authorization_delegate_)) 145882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 14596f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_blob; 14606f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.CreateRSAKeyPair( 14616f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password", 14620ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob, 14630ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi nullptr)); 14640ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi} 14650ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi 14660ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairKeyParserFail) { 14670ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string key_blob; 14680ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &key_blob)) 14690ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi .WillOnce(Return(false)); 14700ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.CreateRSAKeyPair( 14710ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password", 14720ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob, 14730ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi nullptr)); 14740ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi} 14750ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi 14760ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairCreationParserFail) { 14770ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string creation_blob; 14780ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string key_blob; 14790ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_CALL(mock_blob_parser_, SerializeCreationBlob(_, _, _, &creation_blob)) 14800ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi .WillOnce(Return(false)); 14810ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.CreateRSAKeyPair( 14820ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password", 14830ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi "", false, kNoCreationPCR, &mock_authorization_delegate_, &key_blob, 14840ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi &creation_blob)); 148582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi} 148682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi 14876f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeySuccess) { 14886f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi TPM_HANDLE key_handle = TPM_RH_FIRST; 14896f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi TPM_HANDLE loaded_handle; 14906f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_CALL(mock_tpm_, LoadSync(kRSAStorageRootKey, _, _, _, _, _, 14916f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi &mock_authorization_delegate_)) 14926f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<4>(key_handle), 14936f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 14946f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_blob; 14956f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.LoadKey( 14966f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi key_blob, &mock_authorization_delegate_, &loaded_handle)); 14976f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(loaded_handle, key_handle); 14986f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi} 14996f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi 15006f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeyFailure) { 150182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi TPM_HANDLE key_handle; 150282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 150382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 15046f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_blob; 15056f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.LoadKey( 15066f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi key_blob, &mock_authorization_delegate_, &key_handle)); 15076f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi} 15086f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi 15096f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeyBadDelegate) { 15106f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi TPM_HANDLE key_handle; 15116f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi std::string key_blob; 15126f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.LoadKey( 15136f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi key_blob, nullptr, &key_handle)); 151482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi} 151582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi 15160ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh SanghiTEST_F(TpmUtilityTest, LoadKeyParserFail) { 15170ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi TPM_HANDLE key_handle; 15180ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi std::string key_blob; 15190ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_CALL(mock_blob_parser_, ParseKeyBlob(key_blob, _, _)) 15200ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi .WillOnce(Return(false)); 15210ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.LoadKey( 15220ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi key_blob, &mock_authorization_delegate_, &key_handle)); 15230ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi} 15246f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi 1525a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, SealedDataSuccess) { 1526a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string data_to_seal("seal_data"); 1527a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1528a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi TPM2B_SENSITIVE_CREATE sensitive_create; 1529a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi TPM2B_PUBLIC in_public; 1530a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, _, _, 1531a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi _, _, _, _, _, _, _)) 1532a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(DoAll(SaveArg<1>(&sensitive_create), 1533a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi SaveArg<2>(&in_public), 1534a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1535a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.SealData( 1536a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi data_to_seal, "", &mock_authorization_delegate_, &sealed_data)); 1537a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(sensitive_create.sensitive.data.size, data_to_seal.size()); 1538a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(0, memcmp(sensitive_create.sensitive.data.buffer, 1539a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi data_to_seal.data(), data_to_seal.size())); 1540a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(in_public.public_area.type, TPM_ALG_KEYEDHASH); 1541a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(in_public.public_area.name_alg, TPM_ALG_SHA256); 1542a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1543a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1544a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, SealDataBadDelegate) { 1545a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string data_to_seal("seal_data"); 1546a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1547a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.SealData( 1548a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi data_to_seal, "", nullptr, &sealed_data)); 1549a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1550a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1551a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, SealDataFailure) { 1552a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string data_to_seal("seal_data"); 1553a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1554a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey, _, _, 1555a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi _, _, _, _, _, _, _)) 1556a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1557a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.SealData( 1558a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi data_to_seal, "", &mock_authorization_delegate_, &sealed_data)); 1559a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1560a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1561a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, SealDataParserFail) { 1562a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string data_to_seal("seal_data"); 1563a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1564a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_blob_parser_, SerializeKeyBlob(_, _, &sealed_data)) 1565a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(false)); 1566a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_TCTI_STRUCTURE, utility_.SealData( 1567a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi data_to_seal, "", &mock_authorization_delegate_, &sealed_data)); 1568a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1569a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1570a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealDataSuccess) { 1571a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1572b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi std::string tpm_unsealed_data("password"); 1573a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string unsealed_data; 1574a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi TPM_HANDLE object_handle = 42; 1575b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi TPM2B_PUBLIC public_data; 1576b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi public_data.public_area.auth_policy.size = 0; 1577b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 1578b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_data), 1579b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1580b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(object_handle, _, _, _, _, _)) 1581b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<2>(public_data), 1582b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1583a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 1584a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<4>(object_handle), 1585a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1586b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi TPM2B_SENSITIVE_DATA out_data = Make_TPM2B_SENSITIVE_DATA(tpm_unsealed_data); 1587a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, UnsealSync(object_handle, _, _, _)) 1588b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<2>(out_data), 1589b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1590a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.UnsealData( 1591a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi sealed_data, &mock_authorization_delegate_, &unsealed_data)); 1592b23865882e3420660d7aad6e89bcc33f30230d88Utkarsh Sanghi EXPECT_EQ(unsealed_data, tpm_unsealed_data); 1593a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1594a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1595a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealDataBadDelegate) { 1596a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1597a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string unsealed_data; 1598a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.UnsealData( 1599a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi sealed_data, nullptr, &unsealed_data)); 1600a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1601a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1602a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealDataLoadFail) { 1603a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1604a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string unsealed_data; 1605a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 1606a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1607a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData( 1608a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi sealed_data, &mock_authorization_delegate_, &unsealed_data)); 1609a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1610a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1611a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealDataBadKeyName) { 1612a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1613a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string unsealed_data; 1614a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _)) 1615a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1616a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData( 1617a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi sealed_data, &mock_authorization_delegate_, &unsealed_data)); 1618a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1619a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1620a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, UnsealObjectFailure) { 1621a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string sealed_data; 1622a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string unsealed_data; 1623a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, UnsealSync(_, _, _, _)) 1624a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1625a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.UnsealData( 1626a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi sealed_data, &mock_authorization_delegate_, &unsealed_data)); 1627a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1628a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1629a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, StartSessionSuccess) { 1630a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true)) 1631a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 1632a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, 1633a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi utility_.StartSession(&mock_hmac_session_)); 1634a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1635a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1636a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, StartSessionFailure) { 1637a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true)) 1638a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1639a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 1640a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi utility_.StartSession(&mock_hmac_session_)); 1641a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1642a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1643a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueSuccess) { 1644a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi int index = 5; 1645a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string pcr_value("pcr_value"); 1646a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string policy_digest; 1647a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi TPML_PCR_SELECTION pcr_select; 1648a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi pcr_select.count = 1; 1649a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256; 1650a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi pcr_select.pcr_selections[0].sizeof_select = 1; 1651a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi pcr_select.pcr_selections[0].pcr_select[index / 8] = 1 << (index % 8); 1652a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi TPML_DIGEST pcr_values; 1653a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi pcr_values.count = 1; 1654a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi pcr_values.digests[0] = Make_TPM2B_DIGEST(pcr_value); 1655a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _)) 1656a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<2>(pcr_select), 1657a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi SetArgPointee<3>(pcr_values), 1658a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1659a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string tpm_pcr_value; 1660a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _)) 1661a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(DoAll(SaveArg<1>(&tpm_pcr_value), 1662a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1663a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string tpm_policy_digest("digest"); 1664a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_policy_session_, GetDigest(_)) 1665a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<0>(tpm_policy_digest), 1666a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1667a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, 1668a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi utility_.GetPolicyDigestForPcrValue(index, "", &policy_digest)); 1669a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(policy_digest, tpm_policy_digest); 1670a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(pcr_value, tpm_pcr_value); 1671a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1672a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1673a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueSuccessWithPcrValue) { 1674a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi int index = 5; 1675a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string pcr_value("pcr_value"); 1676a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string policy_digest; 1677a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string tpm_pcr_value; 1678a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _)) 1679a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(DoAll(SaveArg<1>(&tpm_pcr_value), 1680a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1681a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string tpm_policy_digest("digest"); 1682a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_policy_session_, GetDigest(_)) 1683a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(DoAll(SetArgPointee<0>(tpm_policy_digest), 1684a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi Return(TPM_RC_SUCCESS))); 1685a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, 1686a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest)); 1687a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(policy_digest, tpm_policy_digest); 1688a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(pcr_value, tpm_pcr_value); 1689a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1690a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1691a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadSession) { 1692a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi int index = 5; 1693a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string pcr_value("value"); 1694a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string policy_digest; 1695a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_policy_session_, StartUnboundSession(false)) 1696a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1697a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 1698a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest)); 1699a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1700a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1701a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValuePcrReadFail) { 1702a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi int index = 5; 1703a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string policy_digest; 1704a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _)) 1705a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1706a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 1707a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi utility_.GetPolicyDigestForPcrValue(index, "", &policy_digest)); 1708a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1709a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1710a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadPcr) { 1711a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi int index = 5; 1712a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string pcr_value("value"); 1713a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string policy_digest; 1714a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_policy_session_, PolicyPCR(index, _)) 1715a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1716a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 1717a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest)); 1718a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1719a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 1720a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh SanghiTEST_F(TpmUtilityTest, GetPolicyDigestForPcrValueBadDigest) { 1721a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi int index = 5; 1722a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string pcr_value("value"); 1723a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi std::string policy_digest; 1724a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_CALL(mock_policy_session_, GetDigest(&policy_digest)) 1725a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 1726a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 1727a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi utility_.GetPolicyDigestForPcrValue(index, pcr_value, &policy_digest)); 1728a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi} 1729a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi 173039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceSuccess) { 173139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 59; 173239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 173339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi size_t length = 256; 173439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi TPM2B_NV_PUBLIC public_data; 173539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _)) 173639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(DoAll(SaveArg<3>(&public_data), 173739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 17385d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.DefineNVSpace( 17395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi index, length, &mock_authorization_delegate_)); 174039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(public_data.nv_public.nv_index, nvram_index); 174139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(public_data.nv_public.name_alg, TPM_ALG_SHA256); 174239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(public_data.nv_public.attributes, 17432da8ff25e7c88c78e8a9db8de9686c92817f0992Darren Krahn TPMA_NV_NO_DA | TPMA_NV_OWNERWRITE | TPMA_NV_WRITEDEFINE | 17442da8ff25e7c88c78e8a9db8de9686c92817f0992Darren Krahn TPMA_NV_AUTHREAD); 174539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(public_data.nv_public.data_size, length); 174639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 174739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 174839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadLength) { 174939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi size_t bad_length = 3000; 175039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_SIZE, 17515d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.DefineNVSpace(0, bad_length, &mock_authorization_delegate_)); 175239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 175339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 175439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadIndex) { 175539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t bad_index = 1<<29; 175639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, 17575d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.DefineNVSpace(bad_index, 2, &mock_authorization_delegate_)); 175839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 175939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 176039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadSession) { 1761c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.DefineNVSpace(0, 2, nullptr)); 176239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 176339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 176439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceFail) { 176539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 59; 176639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi size_t length = 256; 176739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _)) 176839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 176939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 17705d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.DefineNVSpace(index, length, &mock_authorization_delegate_)); 177139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 177239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 177339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceSuccess) { 177439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 177539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 177639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, 177739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _)); 177839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, 17795d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.DestroyNVSpace(index, &mock_authorization_delegate_)); 178039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 178139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 178239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadIndex) { 178339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t bad_index = 1<<29; 178439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, 17855d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.DestroyNVSpace(bad_index, &mock_authorization_delegate_)); 178639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 178739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 178839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadSession) { 1789c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.DestroyNVSpace(3, nullptr)); 179039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 179139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 179239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceFailure) { 179339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 179439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 179539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, 179639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _)) 179739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 179839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 17995d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.DestroyNVSpace(index, &mock_authorization_delegate_)); 180039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 180139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 180239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceSuccess) { 180339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 180439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 18052da8ff25e7c88c78e8a9db8de9686c92817f0992Darren Krahn EXPECT_CALL(mock_tpm_, NV_WriteLockSync(TPM_RH_OWNER, _, nvram_index, _, _)) 180639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 180739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, 18085d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.LockNVSpace(index, &mock_authorization_delegate_)); 18096537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi TPMS_NV_PUBLIC public_area; 18105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(index, &public_area)); 18116537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi EXPECT_EQ(public_area.attributes & TPMA_NV_WRITELOCKED, TPMA_NV_WRITELOCKED); 181239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 181339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 181439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadIndex) { 181539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t bad_index = 1<<24; 181639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, 18175d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.LockNVSpace(bad_index, &mock_authorization_delegate_)); 181839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 181939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 182039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadSession) { 1821c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.LockNVSpace(52, nullptr)); 182239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 182339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 182439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceFailure) { 182539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 182639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 18272da8ff25e7c88c78e8a9db8de9686c92817f0992Darren Krahn EXPECT_CALL(mock_tpm_, NV_WriteLockSync(TPM_RH_OWNER, _, nvram_index, _, _)) 182839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 182939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, 18305d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi utility_.LockNVSpace(index, &mock_authorization_delegate_)); 183139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 183239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 183339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceSuccess) { 183439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 183539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t offset = 5; 183639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 183739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, 183839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _)) 183939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 18405d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.WriteNVSpace( 18415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi index, offset, "", &mock_authorization_delegate_)); 18426537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi TPMS_NV_PUBLIC public_area; 18435d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(index, &public_area)); 18446537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi EXPECT_EQ(public_area.attributes & TPMA_NV_WRITTEN, TPMA_NV_WRITTEN); 184539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 184639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 184739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSize) { 184839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 184939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi std::string nvram_data(1025, 0); 18505d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_SIZE, utility_.WriteNVSpace( 18515d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi index, 0, nvram_data, &mock_authorization_delegate_)); 185239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 185339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 185439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadIndex) { 185539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t bad_index = 1<<24; 18565d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.WriteNVSpace( 18575d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi bad_index, 0, "", &mock_authorization_delegate_)); 185839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 185939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 186039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSessions) { 1861c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, 1862c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi utility_.WriteNVSpace(53, 0, "", nullptr)); 186339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 186439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 186539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceFailure) { 186639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 186739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t offset = 5; 186839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 186939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, 187039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _)) 187139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 18725d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.WriteNVSpace( 18735d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi index, offset, "", &mock_authorization_delegate_)); 187439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 187539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 187639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceSuccess) { 187739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 187839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t offset = 5; 187939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nv_index = NV_INDEX_FIRST + index; 188039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi size_t length = 24; 188139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi std::string nvram_data; 188239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, 188339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _)) 188439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 18855d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.ReadNVSpace( 18865d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi index, offset, length, &nvram_data, &mock_authorization_delegate_)); 188739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 188839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 188939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadReadLength) { 189039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi size_t length = 1025; 189139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi std::string nvram_data; 18925d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_SIZE, utility_.ReadNVSpace( 18935d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi 52, 0, length, &nvram_data, &mock_authorization_delegate_)); 189439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 189539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 189639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadIndex) { 189739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t bad_index = 1<<24; 189839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi std::string nvram_data; 18995d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.ReadNVSpace( 19005d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi bad_index, 0, 5, &nvram_data, &mock_authorization_delegate_)); 190139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 190239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 190339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadSession) { 190439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi std::string nvram_data; 190539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, 1906c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi utility_.ReadNVSpace(53, 0, 5, &nvram_data, nullptr)); 190739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 190839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 190939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceFailure) { 191039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 191139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t offset = 5; 191239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nv_index = NV_INDEX_FIRST + index; 191339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi size_t length = 24; 191439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi std::string nvram_data; 191539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, 191639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _)) 191739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 19185d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadNVSpace( 19195d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi index, offset, length, &nvram_data, &mock_authorization_delegate_)); 192039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 192139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 192239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameSuccess) { 192339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 192439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 192539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi std::string name; 192639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _)) 192739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 19285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpaceName(index, &name)); 192939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 193039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 193139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameFailure) { 193239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 193339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi std::string name; 193439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _)) 193539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 19365d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.GetNVSpaceName(index, &name)); 193739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 193839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 19396537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaCachedSuccess) { 19406537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi uint32_t index = 53; 19416537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi TPMS_NV_PUBLIC public_area; 19425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi SetNVRAMMap(index, public_area); 19436537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _)) 19446537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi .Times(0); 19455d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpacePublicArea(index, &public_area)); 19466537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi} 19476537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi 194839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaSuccess) { 194939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 195039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t nvram_index = NV_INDEX_FIRST + index; 195139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi TPMS_NV_PUBLIC public_area; 195239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _)) 195339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 19545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpacePublicArea(index, &public_area)); 195539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 195639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 195739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaFailure) { 195839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi uint32_t index = 53; 195939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi TPMS_NV_PUBLIC public_area; 196039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _)) 196139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi .WillOnce(Return(TPM_RC_FAILURE)); 19625d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, utility_.GetNVSpacePublicArea(index, &public_area)); 196339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi} 196439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi 196566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordSuccess) { 196666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 196766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillOnce(Return(false)); 196866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _)) 196966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillOnce(Return(TPM_RC_SUCCESS)); 197066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, SetKnownOwnerPassword("password")); 197166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 197266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 197366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordOwnershipDone) { 197466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, SetKnownOwnerPassword("password")); 197566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 197666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 197766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordFailure) { 197866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet()) 197966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillOnce(Return(false)); 198066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _)) 198166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_FAILURE)); 198266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, SetKnownOwnerPassword("password")); 198366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 198466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 198566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysSuccess) { 198666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password")); 198766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 198866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 198966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysHandleConsistency) { 199066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi TPM_HANDLE test_handle = 42; 199166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _)) 199266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<3>(test_handle), 199366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 199466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _)) 199566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_SUCCESS)); 199666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password")); 199766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 199866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 199966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysCreateFailure) { 200066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _)) 200166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_FAILURE)); 200266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys("password")); 200366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 200466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 200566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysPersistFailure) { 200666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _)) 200766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_FAILURE)); 200866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys("password")); 200966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 201066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 201166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysAlreadyExist) { 20129caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingKeyHandleExpectation(kRSAStorageRootKey); 20139caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingKeyHandleExpectation(kECCStorageRootKey); 201466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password")); 201566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 201666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 201766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeySuccess) { 201812a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr TPM2B_PUBLIC public_area; 201912a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _)) 202012a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr .WillOnce(DoAll(SaveArg<2>(&public_area), 202112a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr Return(TPM_RC_SUCCESS))); 202266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password")); 202312a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr EXPECT_EQ(TPM_ALG_SHA256, public_area.public_area.name_alg); 202466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 202566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 202666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyConsistency) { 202745e57ff54637d95252144544c3b051107473844eUtkarsh Sanghi TPM_HANDLE test_handle = 42; 202866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 202966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(DoAll(SetArgPointee<4>(test_handle), 203066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi Return(TPM_RC_SUCCESS))); 203166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _)) 203266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_SUCCESS)); 203366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password")); 203466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 203566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 203666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyCreateFailure) { 203766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _)) 203866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_FAILURE)); 203966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password")); 204066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 204166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 204266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyLoadFailure) { 204366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _)) 204466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_FAILURE)); 204566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password")); 204666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 204766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 204866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyPersistFailure) { 204966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _)) 205066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi .WillRepeatedly(Return(TPM_RC_FAILURE)); 205166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password")); 205266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 205366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 205466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyAlreadyExists) { 20559caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn SetExistingKeyHandleExpectation(kSaltingKey); 205666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password")); 205766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi} 205866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi 2059c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn} // namespace trunks 2060