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