tpm_utility_test.cc revision 12a12083abb8fc9b1bd9ac69e2be983bb7227818
1c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn// Copyright 2014 The Chromium OS Authors. All rights reserved.
2c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn// Use of this source code is governed by a BSD-style license that can be
3c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn// found in the LICENSE file.
4c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi#include <base/stl_util.h>
633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi#include <crypto/sha2.h>
7c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include <gmock/gmock.h>
8c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include <gtest/gtest.h>
933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi#include <openssl/aes.h>
10c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
11b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi#include "trunks/error_codes.h"
1233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi#include "trunks/hmac_authorization_delegate.h"
13b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi#include "trunks/mock_authorization_delegate.h"
14ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/mock_hmac_session.h"
15c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/mock_tpm.h"
16c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/mock_tpm_state.h"
1739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi#include "trunks/tpm_constants.h"
18c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/tpm_utility_impl.h"
19c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/trunks_factory_for_test.h"
20c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
21c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnusing testing::_;
22e31034f28641c9bc3e5576cab6d2c7d918bb427cUtkarsh Sanghiusing testing::DoAll;
23c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnusing testing::NiceMock;
24c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnusing testing::Return;
25748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghiusing testing::SaveArg;
26e31034f28641c9bc3e5576cab6d2c7d918bb427cUtkarsh Sanghiusing testing::SetArgPointee;
27c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
28c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnnamespace trunks {
29c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
30c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn// A test fixture for TpmUtility tests.
31c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnclass TpmUtilityTest : public testing::Test {
32c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn public:
335d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  TpmUtilityTest() : utility_(factory_) {}
34295e851b66fb19c05a14401e834337962a58c493Darren Krahn  ~TpmUtilityTest() override {}
35295e851b66fb19c05a14401e834337962a58c493Darren Krahn  void SetUp() override {
36c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    factory_.set_tpm_state(&mock_tpm_state_);
37c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    factory_.set_tpm(&mock_tpm_);
38ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    factory_.set_hmac_session(&mock_hmac_session_);
39c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  }
406537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  TPM_RC ComputeKeyName(const TPMT_PUBLIC& public_area,
426537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                        std::string* object_name) {
435d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    return utility_.ComputeKeyName(public_area, object_name);
446537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
456537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
465d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  void SetNVRAMMap(uint32_t index,
476537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                   const TPMS_NV_PUBLIC& public_area) {
485d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    utility_.nvram_public_area_map_[index] = public_area;
496537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
506537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
515d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  TPM_RC GetNVRAMMap(uint32_t index,
526537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                     TPMS_NV_PUBLIC* public_area) {
535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    auto it = utility_.nvram_public_area_map_.find(index);
545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    if (it == utility_.nvram_public_area_map_.end()) {
556537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi      return TPM_RC_FAILURE;
566537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    }
576537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    *public_area = it->second;
586537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    return TPM_RC_SUCCESS;
596537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
606537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
6166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_RC SetKnownOwnerPassword(const std::string& owner_password) {
6266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi    return utility_.SetKnownOwnerPassword(owner_password);
6366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  }
6466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
6566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_RC CreateStorageRootKeys(const std::string& owner_password) {
6666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi    return utility_.CreateStorageRootKeys(owner_password);
6766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  }
6866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
6966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_RC CreateSaltingKey(const std::string& owner_password) {
7066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi    return utility_.CreateSaltingKey(owner_password);
7166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  }
7266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
73c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn protected:
74c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TrunksFactoryForTest factory_;
75c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  NiceMock<MockTpmState> mock_tpm_state_;
76c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  NiceMock<MockTpm> mock_tpm_;
775d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> mock_authorization_delegate_;
78ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  NiceMock<MockHmacSession> mock_hmac_session_;
795d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  TpmUtilityImpl utility_;
80c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn};
81c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
8203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSuccess) {
835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Startup());
8403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
8503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
8603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupAlreadyStarted) {
8703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, StartupSync(_, _))
8803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_INITIALIZE));
895d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Startup());
9003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
9103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
9203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupFailure) {
9303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, StartupSync(_, _))
9403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
955d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Startup());
9603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
9703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
9803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSelfTestFailure) {
9903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, SelfTestSync(_, _))
10003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
1015d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Startup());
10203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
10303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
104d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearSuccess) {
105d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
106d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
1075d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Clear());
108d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
109d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
110d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearAfterBadInit) {
111d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
112d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_AUTH_MISSING))
113d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
1145d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Clear());
115d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
116d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
117d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearFail) {
118d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
119d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
1205d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Clear());
121d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
122d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
123e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh SanghiTEST_F(TpmUtilityTest, ShutdownTest) {
124e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ShutdownSync(TPM_SU_CLEAR, _));
1255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  utility_.Shutdown();
126e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi}
127e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi
128c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmAlreadyInit) {
1295d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm());
1305d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm());
131c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
132c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
133c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmSuccess) {
134c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
135c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
136c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
137e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _))
138e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<3>(YES),
139e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1405d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.InitializeTpm());
141c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
142c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
143c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmBadAuth) {
144c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
145c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
146c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
147c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Reject attempts to set platform auth.
148c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_PLATFORM, _, _, _))
149c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
1505d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.InitializeTpm());
151c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
152c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
153c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmDisablePHFails) {
154c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
155c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
156c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
157e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _))
158e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<3>(YES),
159e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
16052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to disable the platform hierarchy.
16103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyControlSync(_, _, TPM_RH_PLATFORM, _, _))
162c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
1635d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.InitializeTpm());
164c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
165c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
166e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh SanghiTEST_F(TpmUtilityTest, AllocatePCRSuccess) {
167e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  TPML_PCR_SELECTION pcr_allocation;
168e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(TPM_RH_PLATFORM, _, _, _, _, _, _, _))
169e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&pcr_allocation),
170e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      SetArgPointee<3>(YES),
171e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
172e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AllocatePCR(""));
173e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(1, pcr_allocation.count);
174e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_ALG_SHA256, pcr_allocation.pcr_selections[0].hash);
175e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(PCR_SELECT_MIN, pcr_allocation.pcr_selections[0].sizeof_select);
176e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(0xFF, pcr_allocation.pcr_selections[0].pcr_select[0]);
177e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(0xFF, pcr_allocation.pcr_selections[0].pcr_select[1]);
178e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi}
179e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi
180e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh SanghiTEST_F(TpmUtilityTest, AllocatePCRCommandFailure) {
181e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _))
182e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
183e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.AllocatePCR(""));
184e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi}
185e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi
186e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh SanghiTEST_F(TpmUtilityTest, AllocatePCRTpmFailure) {
187e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_AllocateSync(_, _, _, _, _, _, _, _))
188e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<3>(NO),
189e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
190e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.AllocatePCR(""));
191e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi}
192e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi
19352e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipSuccess) {
19452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
19552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
19652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
19752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
19852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
19952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
20066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
20166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
20266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
20352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
20452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
20566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipOwnershipDone) {
20652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
20752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
20852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
20952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
21052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
21152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
21266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
21366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
21466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
21566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
21666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
21766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipBadSession) {
218ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_CALL(mock_hmac_session_, StartUnboundSession(true))
21966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
22066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner",
22166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
22266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
22352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
22452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
22566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, TakeOwnershipFailure) {
22666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
22766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
22866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner",
22966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
23066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
23166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
23266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
23366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementDone) {
23452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
23566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(false));
23652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
23752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
23866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
23966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(false));
24066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
24166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
24266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
24352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
24452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
24566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordLockoutDone) {
24652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
24752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
24852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
24952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
25052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
25166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(true));
25266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
25366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
25466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
25552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
25652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
25766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndorsementLockoutDone) {
25852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
25952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
26052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
26166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(true));
26252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
26366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(true));
26466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.TakeOwnership("owner",
26566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
26666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
26766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
26866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
26966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordEndoresmentFail) {
27066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
27152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
27266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
27366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(false));
27466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _))
27552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
27652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
27752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
27866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner",
27966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
28066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
28152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
28252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
28366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, ChangeOwnerPasswordLockoutFailure) {
28452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
28552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
28652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
28752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
28852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
28952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
29066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _))
29152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
29252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
29352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
29466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.TakeOwnership("owner",
29566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "endorsement",
29666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                                                   "lockout"));
2970f46c15b948ee17f5668c332a25a0dbaecb2cc47Utkarsh Sanghi}
2980f46c15b948ee17f5668c332a25a0dbaecb2cc47Utkarsh Sanghi
2992ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomSuccess) {
3002ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string entropy_data("large test data", 100);
3015d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, StirRandomSync(_, &mock_authorization_delegate_))
3022ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
3038b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
3045d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.StirRandom(entropy_data, &mock_authorization_delegate_));
30552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
30652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
3072ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomFails) {
3082ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string entropy_data("test data");
309c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, StirRandomSync(_, nullptr))
3102ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
311c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.StirRandom(entropy_data, nullptr));
3122ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3132ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3142ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomSuccess) {
3152ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // This number is larger than the max bytes the GetRandom call can return.
3162ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // Therefore we expect software to make multiple calls to fill this many
3172ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // bytes.
3182ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int num_bytes = 72;
3192ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string random_data;
3202ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM2B_DIGEST large_random;
3212ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  large_random.size = 32;
3222ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM2B_DIGEST small_random;
3232ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  small_random.size = 8;
3245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, &mock_authorization_delegate_))
3252ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(2)
3262ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<1>(large_random),
32752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn                            Return(TPM_RC_SUCCESS)));
3285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(8, _, &mock_authorization_delegate_))
3292ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(small_random),
3302ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
3315d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.GenerateRandom(
3325d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      num_bytes, &mock_authorization_delegate_, &random_data));
3332ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(num_bytes, random_data.size());
33452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
33552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
3362ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomFails) {
3372ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int num_bytes = 5;
3382ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string random_data;
339c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, nullptr))
3402ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3418b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
342c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi            utility_.GenerateRandom(num_bytes, nullptr, &random_data));
34352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
34452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
3452ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRSuccess) {
3468b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM_HANDLE pcr_handle = HR_PCR + 1;
347e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  TPML_DIGEST_VALUES digests;
3485d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_,
3495d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi              PCR_ExtendSync(pcr_handle, _, _, &mock_authorization_delegate_))
350e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&digests),
351e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
352e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ExtendPCR(1, "test digest",
353e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                                               &mock_authorization_delegate_));
354e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(1, digests.count);
355e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(TPM_ALG_SHA256, digests.digests[0].hash_alg);
356e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  std::string hash_string = crypto::SHA256HashString("test digest");
357e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  EXPECT_EQ(0, memcmp(hash_string.data(),
358e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      digests.digests[0].digest.sha256,
359e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi                      crypto::kSHA256Length));
3602ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3612ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3622ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRFail) {
3632ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int pcr_index = 0;
3642ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_HANDLE pcr_handle = HR_PCR + pcr_index;
3652ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ExtendSync(pcr_handle, _, _, _))
3662ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
367c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
368c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi            utility_.ExtendPCR(pcr_index, "test digest", nullptr));
3692ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3702ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3712ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRBadParam) {
372c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ExtendPCR(-1, "test digest", nullptr));
3732ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3742ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3752ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRSuccess) {
3762ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // The |pcr_index| is chosen to match the structure for |pcr_select|.
3772ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // If you change |pcr_index|, remember to change |pcr_select|.
3782ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int pcr_index = 1;
3792ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3802ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPML_PCR_SELECTION pcr_select;
3812ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.count = 1;
3822ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256;
3832ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].sizeof_select = 1;
3842ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].pcr_select[0] = 2;
3852ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPML_DIGEST pcr_values;
3862ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_values.count = 1;
3872ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_values.digests[0].size = 5;
3882ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3892ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(pcr_select),
3902ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      SetArgPointee<3>(pcr_values),
3912ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
3925d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ReadPCR(pcr_index, &pcr_value));
3932ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3942ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3952ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRFail) {
3962ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3972ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3982ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3995d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadPCR(1, &pcr_value));
4002ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
4012ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
4022ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRBadReturn) {
4032ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
4042ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
4052ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
4065d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadPCR(1, &pcr_value));
40752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
40852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
409b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSuccess) {
410b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
411b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
412b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
413b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
414b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
415b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      output_ciphertext);
416b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
417b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
418b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4198b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4208b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
421b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
422b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
423b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _,
4255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                         &mock_authorization_delegate_))
426b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
427b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
4285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(
4298b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      key_handle,
4308b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      TPM_ALG_NULL,
4318b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      TPM_ALG_NULL,
4328b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      plaintext,
4335d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
4348b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      &ciphertext));
435b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(0, ciphertext.compare(output_ciphertext));
436b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
437b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
438b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptFail) {
439b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
440b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
441b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
442b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
443b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
444b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4458b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4468b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
447b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
448b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
449b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
450c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr))
451b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
4525d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.AsymmetricEncrypt(key_handle,
453b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      TPM_ALG_NULL,
4549dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
455b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      plaintext,
456c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                      nullptr,
457b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      &ciphertext));
458b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
459b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
460b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptBadParams) {
461b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
462b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
463b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
464b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
465b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
466b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt | kRestricted;
467c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, nullptr))
468b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
469b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4705d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.AsymmetricEncrypt(key_handle,
471b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             TPM_ALG_RSAES,
4729dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                             TPM_ALG_NULL,
473b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             plaintext,
474c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                             nullptr,
475b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             &ciphertext));
476b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
4779dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
4789dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptNullSchemeForward) {
4799dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
4809dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
4819dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
4829dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
4839dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
4849dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_ciphertext);
4859dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
4869dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
4879dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4888b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4898b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
4909dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
4919dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
4929dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
4939dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
494c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr))
4959dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
4969dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
4979dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
4985d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(key_handle,
4999dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
5009dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
5019dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      plaintext,
502c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                      nullptr,
5039dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      &ciphertext));
5049dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP);
5059dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256);
5069dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
5079dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
5089dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSchemeForward) {
5099dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
5109dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
5119dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
5129dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
5139dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
5149dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_ciphertext);
5159dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
5169dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
5179dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5188b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5198b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
5209dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
5219dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
5229dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
5239dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
524c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, nullptr))
5259dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
5269dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
5279dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
5285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricEncrypt(key_handle,
5299dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_RSAES,
5309dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
5319dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      plaintext,
532c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                      nullptr,
5339dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      &ciphertext));
5349dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES);
5359dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
5369dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
537b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSuccess) {
538b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
539b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
540b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string output_plaintext("plaintext");
541b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
5422ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password("password");
543b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
544b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      output_plaintext);
545b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
546b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
547b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5488b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5498b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
550b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
551b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
552b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
5535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _,
5545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                         &mock_authorization_delegate_))
555b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
556b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
5575d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt(
5585d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      key_handle,
5595d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      TPM_ALG_NULL,
5605d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      TPM_ALG_NULL,
5615d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      ciphertext,
5625d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
5635d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &plaintext));
564b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(0, plaintext.compare(output_plaintext));
565b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
566b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
567b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptFail) {
568b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
569b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string key_name;
570b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
571b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
572b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string password;
573b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
574b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
575b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5768b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5778b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
578b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
579b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
580b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
581b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
582b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
5835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.AsymmetricDecrypt(
5841ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
5851ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5861ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5871ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
5885d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
5891ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
590b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
591b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
592b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadParams) {
593b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
594b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string key_name;
595b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
596b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
597b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string password;
598b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
599b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
600b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt | kRestricted;
601b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
602b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
603b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6045d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.AsymmetricDecrypt(
6051ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6061ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_RSAES,
6071ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6081ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6095d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
6101ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
611b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
612b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
6132ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadSession) {
6141ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
6152ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string key_name;
6162ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string plaintext;
6172ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string ciphertext;
6182ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password;
6195d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.AsymmetricDecrypt(
620c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      key_handle, TPM_ALG_RSAES, TPM_ALG_NULL,
621c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      ciphertext, nullptr, &plaintext));
6222ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi}
6232ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi
6249dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptNullSchemeForward) {
6259dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
6269dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
6279dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_plaintext("plaintext");
6289dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
6299dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string password;
6309dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
6319dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_plaintext);
6329dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
6339dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
6349dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
6358b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6368b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
6379dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
6389dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
6399dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
6409dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6419dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
6429dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
6439dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
6449dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6455d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt(
6461ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6471ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6481ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6491ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6505d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
6511ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
6529dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP);
6539dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256);
6549dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
6559dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
6569dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSchemeForward) {
6579dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
6589dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
6599dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_plaintext("plaintext");
6609dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
6619dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string password;
6629dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
6639dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_plaintext);
6649dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
6659dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
6669dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
6678b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6688b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
6699dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
6709dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
6719dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
6729dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6739dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
6749dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
6759dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
6769dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6775d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.AsymmetricDecrypt(
6781ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6791ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_RSAES,
6801ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6811ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6825d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
6831ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
6849dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES);
6859dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
6869dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
687748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSuccess) {
688748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
6892ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password("password");
690e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
691748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
692748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 2;
693748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.buffer[0] = 'h';
694748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.buffer[1] = 'i';
695748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
696748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
697748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
698748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
6998b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
7008b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
701748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
702748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
703748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
7045d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _,
7055d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                  &mock_authorization_delegate_))
706748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
707748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
7085d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle,
7095d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
7105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
7115d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
7125d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
7135d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
714748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(0, signature.compare("hi"));
715748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
716748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
717748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignFail) {
718748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
719748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
720e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
721748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
722748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
723748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
724748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
7258b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
7268b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
727748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
728748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
729748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
730748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
731748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
7325d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Sign(key_handle,
7335d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
7345d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
7355d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
7365d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
7375d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
738748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
739748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
740748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams1) {
741748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
742748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
743e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
744748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
745748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
746748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
747748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign | kRestricted;
748748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
749748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
750748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
7515d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle,
7525d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_RSAPSS,
7535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_NULL,
7545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 digest,
7555d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &mock_authorization_delegate_,
7565d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &signature));
757748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
758748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
7592ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, SignBadAuthorizationSession) {
7601ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
7612ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password;
7622ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string digest(32, 'a');
7632ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string signature;
7645d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.Sign(key_handle,
7655d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                    TPM_ALG_RSAPSS,
7665d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                    TPM_ALG_NULL,
7675d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                    digest,
768c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                    nullptr,
7695d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                    &signature));
7702ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi}
7712ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi
772748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams2) {
773748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
774748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
775e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
776748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
777748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
778748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
779748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
780748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
781748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
782748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
7835d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle,
7845d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_RSAPSS,
7855d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_NULL,
7865d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 digest,
7875d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &mock_authorization_delegate_,
7885d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &signature));
789748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
790748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
791748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams3) {
792748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
793748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
794e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
795748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
796748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
797748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_ECC;
798748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
799748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
800748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
801748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
8025d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle,
8035d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_RSAPSS,
8045d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_NULL,
8055d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 digest,
8065d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &mock_authorization_delegate_,
8075d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &signature));
808748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
809748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
810748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams4) {
811748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
812748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
813e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
814748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
815748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
816748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
817748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
818748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
819748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
820748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_FAILURE)));
8215d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Sign(key_handle,
8225d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_RSAPSS,
8235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
8245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
8255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
8265d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
827748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
828748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
829748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams5) {
830748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle = 0;
831748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
832e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
833748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
8345d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Sign(key_handle,
8355d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_AES,
8365d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 TPM_ALG_NULL,
8375d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 digest,
8385d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &mock_authorization_delegate_,
8395d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                 &signature));
840748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
841748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
842748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
843748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignNullSchemeForward) {
844748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
845748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
846e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
847748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
848748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 0;
849748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
850748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
851748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIG_SCHEME scheme;
852748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
853748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
8548b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
8558b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
856748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
857748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
858748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
859748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
860748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
861748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      SaveArg<3>(&scheme),
862748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
8635d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle,
8645d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
8655d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_NULL,
8665d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
8675d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
8685d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
869748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSASSA);
870748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.details.rsassa.hash_alg, TPM_ALG_SHA256);
871748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
872748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
873748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSchemeForward) {
874748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
875748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
876e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(64, 'a');
877748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
878748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 0;
879748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
880748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
881748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIG_SCHEME scheme;
882748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
883748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
8848b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
8858b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
886748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
887748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
888748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
889748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
890748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
891748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      SaveArg<3>(&scheme),
892748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
8935d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Sign(key_handle,
8945d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_RSAPSS,
8955d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          TPM_ALG_SHA1,
8965d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          digest,
8975d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &mock_authorization_delegate_,
8985d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                          &signature));
899748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAPSS);
900887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  EXPECT_EQ(scheme.details.rsapss.hash_alg, TPM_ALG_SHA1);
901748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
902748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
903748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySuccess) {
904748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
905e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
906748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
907748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
908748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
909748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
910748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
911748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
912748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
913748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
914748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
9155d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle,
9165d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9175d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9185d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
9196f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
9206f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
921748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
922748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
923748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyFail) {
924748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
925e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
926748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
927748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
928748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
929748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
930748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
931748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
932748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
933748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
934748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
9355d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Verify(key_handle,
9365d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9375d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
9385d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
9396f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
9406f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
941748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
942748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
943748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams1) {
944748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
945e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
946748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
947748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
948748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
949748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign | kRestricted;
950748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
951748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
952748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
9535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle,
9545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9555d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9565d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   digest,
9576f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   signature,
9586f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   nullptr));
959748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
960748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
961748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams2) {
962748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
963e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
964748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
965748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
966748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
967748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
968748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
969748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
970748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
9715d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle,
9725d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9735d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9745d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   digest,
9756f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   signature,
9766f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   nullptr));
977748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
978748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
979748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams3) {
980748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
981e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
982748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
983748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
984748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_ECC;
985748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
986748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
987748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
988748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
9895d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle,
9905d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9915d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
9925d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   digest,
9936f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   signature,
9946f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   nullptr));
995748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
996748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
997748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams4) {
998748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
999e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1000748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1001748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1002748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1003748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1004748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1005748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1006748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_FAILURE)));
10075d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.Verify(key_handle,
10085d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
10095d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
10105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
10116f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
10126f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
1013748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1014748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1015748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams5) {
1016748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1017e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1018748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1019748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1020748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1021748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1022748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1023748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1024748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
10255d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.Verify(key_handle,
10265d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_AES,
10275d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   TPM_ALG_NULL,
10285d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                                   digest,
10296f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   signature,
10306f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                                   nullptr));
1031748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1032748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1033748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyNullSchemeForward) {
1034748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1035e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1036748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1037748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1038748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_in;
1039748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1040748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1041748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1042748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1043748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1044748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
1045748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&signature_in),
1046748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
10475d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle,
10485d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
10495d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_NULL,
10505d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
10516f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
10526f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
1053748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSASSA);
1054748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA256);
1055748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1056748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1057748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySchemeForward) {
1058748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1059e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(64, 'a');
1060748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1061748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1062748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_in;
1063748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1064748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1065748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1066748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1067748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1068748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
1069748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&signature_in),
1070748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
10715d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.Verify(key_handle,
10725d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_RSAPSS,
10735d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            TPM_ALG_SHA1,
10745d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                            digest,
10756f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            signature,
10766f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                            nullptr));
1077748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSAPSS);
1078887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA1);
1079748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1080748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
108133ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataSuccess) {
108233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
108333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
10845d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ChangeKeyAuthorizationData(
1085c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi    key_handle, new_password, &mock_authorization_delegate_, nullptr));
108633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
108733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
108833ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataKeyNameFail) {
108933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
109033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string old_password;
109133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
109233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
109333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
10945d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ChangeKeyAuthorizationData(
1095c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      key_handle, new_password, &mock_authorization_delegate_, nullptr));
109633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
109733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
109833ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataFailure) {
109933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
110033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
110133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ObjectChangeAuthSync(key_handle, _, _, _, _, _, _))
110233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
11035d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ChangeKeyAuthorizationData(
1104c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      key_handle, new_password, &mock_authorization_delegate_, nullptr));
110533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
110633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
110733ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataWithReturnSuccess) {
110833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
110933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
111033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string key_blob;
11118b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM2B_PUBLIC public_area;
11128b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
11138b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
11148b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
11158b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
11168b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
11178b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
11185d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ChangeKeyAuthorizationData(
11195d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    key_handle, new_password, &mock_authorization_delegate_, &key_blob));
112033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
112133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
112233ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccess) {
112333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
112433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
112533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
112633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password("password");
112733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string key_blob;
112833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_DATA encryption_key;
112933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_PUBLIC public_data;
113033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_PRIVATE private_data;
113133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
113233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&encryption_key),
113333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      SaveArg<3>(&public_data),
113433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      SaveArg<4>(&private_data),
113533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
11365d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ImportRSAKey(
113733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
11381ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
11391ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
11401ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
11411ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
11425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
11431ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &key_blob));
114433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  // Validate that the public area was properly constructed.
114533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.parameters.rsa_detail.key_bits,
114633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            modulus.size() * 8);
114733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.parameters.rsa_detail.exponent,
114833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            public_exponent);
114933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.unique.rsa.size, modulus.size());
115033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(public_data.public_area.unique.rsa.buffer,
115133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      modulus.data(), modulus.size()));
115233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  // Validate the private struct construction.
115333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(kAesKeySize, encryption_key.size);
115433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_KEY key;
115533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_set_encrypt_key(encryption_key.buffer, kAesKeySize * 8, &key);
115633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  unsigned char iv[MAX_AES_BLOCK_SIZE_BYTES] = {0};
115733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  int iv_in = 0;
115833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string unencrypted_private(private_data.size, 0);
115933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_cfb128_encrypt(
116033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    reinterpret_cast<const unsigned char*>(private_data.buffer),
116133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    reinterpret_cast<unsigned char*>(string_as_array(&unencrypted_private)),
116233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    private_data.size, &key, iv, &iv_in, AES_DECRYPT);
116333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_DIGEST inner_integrity;
116433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_DIGEST(&unencrypted_private,
1165c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                               &inner_integrity, nullptr));
116633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string object_name;
11676537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
11685d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            ComputeKeyName(public_data.public_area, &object_name));
116933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string integrity_value = crypto::SHA256HashString(unencrypted_private +
117033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                                         object_name);
117133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(integrity_value.size(), inner_integrity.size);
117233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(inner_integrity.buffer,
117333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      integrity_value.data(),
117433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      inner_integrity.size));
117533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_SENSITIVE sensitive_data;
117633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_SENSITIVE(&unencrypted_private,
1177c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi                                                  &sensitive_data, nullptr));
117833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(sensitive_data.sensitive_area.auth_value.size, password.size());
117933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.auth_value.buffer,
118033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      password.data(), password.size()));
118133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(sensitive_data.sensitive_area.sensitive.rsa.size,
118233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            prime_factor.size());
118333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.sensitive.rsa.buffer,
118433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      prime_factor.data(), prime_factor.size()));
118533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
118633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
118733ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccessWithNoBlob) {
118833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
118933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
119033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
119133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
119233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
119333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
11945d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ImportRSAKey(
119533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
11961ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
11971ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
11981ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
11991ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12005d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
1201c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      nullptr));
120233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
120333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
120433ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyParentNameFail) {
120533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
120633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
120733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
120833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
120933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
121033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
12115d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ImportRSAKey(
121233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12131ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12141ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
12151ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12161ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12175d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
1218c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      nullptr));
121933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
122033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
122133ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyFail) {
122233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus;
122333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor;
122433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
122533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
122633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
12275d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ImportRSAKey(
122833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12291ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12301ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      0x10001,
12311ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12321ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12335d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      &mock_authorization_delegate_,
1234c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi      nullptr));
123533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
123633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
12376f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairSuccess) {
123882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
12396f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey,
12406f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         _, _, _, _, _, _, _, _,
12415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                         &mock_authorization_delegate_))
124282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
124382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
12446f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
12456f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair(
12466f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptAndSignKey, 2048, 0x10001,
12476ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi      "password", "", false, &mock_authorization_delegate_, &key_blob));
124882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt);
12496f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign);
12506ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kUserWithAuth,
12516ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi            kUserWithAuth);
12526ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kAdminWithPolicy, 0);
125382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
1254e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi            TPM_ALG_NULL);
125582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
125682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
12576f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairDecryptKeySuccess) {
125882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
12596f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey,
12606f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         _, _, _, _, _, _, _, _,
12616f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         &mock_authorization_delegate_))
126282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
126382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
12646f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
12656f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair(
12666ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey, 2048, 0x10001,
12676ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi      "password", "", false, &mock_authorization_delegate_, &key_blob));
12686f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt);
12696f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, 0);
127082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
1271e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi            TPM_ALG_NULL);
127282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
127382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
12746f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairSignKeySuccess) {
127582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
12766f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  TPM2B_SENSITIVE_CREATE sensitive_create;
12776f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey,
12786f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         _, _, _, _, _, _, _, _,
12796f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         &mock_authorization_delegate_))
12806f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<1>(&sensitive_create),
12816f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                      SaveArg<2>(&public_area),
128282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
12836f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
12846f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string policy_digest(32, 'a');
12856f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_auth("password");
12866f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.CreateRSAKeyPair(
12876f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, key_auth,
12886ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi      policy_digest, true,  // use_only_policy_authorization
12896ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi      &mock_authorization_delegate_, &key_blob));
12906f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, 0);
129182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign);
12926ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kUserWithAuth, 0);
12936ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kAdminWithPolicy,
12946ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi            kAdminWithPolicy);
129582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
129682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi            TPM_ALG_NULL);
12976f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.key_bits, 2048);
12986f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.exponent, 0x10001);
12996f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.auth_policy.size, policy_digest.size());
13006f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(0, memcmp(public_area.public_area.auth_policy.buffer,
13016f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                      policy_digest.data(), policy_digest.size()));
13026f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(sensitive_create.sensitive.user_auth.size, key_auth.size());
13036f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_create.sensitive.user_auth.buffer,
13046f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                      key_auth.data(), key_auth.size()));
130582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
130682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
13076f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairBadDelegate) {
13086f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13096f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.CreateRSAKeyPair(
13106f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey, 2048, 0x10001, "password",
13116ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi      "", false, nullptr, &key_blob));
13126f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi}
13136f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi
13146f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, CreateRSAKeyPairFailure) {
13156f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(kRSAStorageRootKey,
13166f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         _, _, _, _, _, _, _, _,
13176f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                         &mock_authorization_delegate_))
131882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
13196f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13206f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.CreateRSAKeyPair(
13216f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kSignKey, 2048, 0x10001, "password",
13226ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi      "", false, &mock_authorization_delegate_, &key_blob));
132382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
132482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
13256f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeySuccess) {
13266f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
13276f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  TPM_HANDLE loaded_handle;
13286f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(kRSAStorageRootKey, _, _, _, _, _,
13296f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                                  &mock_authorization_delegate_))
13306f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<4>(key_handle),
13316f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
13326f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13336f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.LoadKey(
13346f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      key_blob, &mock_authorization_delegate_, &loaded_handle));
13356f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(loaded_handle, key_handle);
13366f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi}
13376f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi
13386f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeyFailure) {
133982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
134082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
134182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
13426f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13436f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.LoadKey(
13446f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      key_blob, &mock_authorization_delegate_, &key_handle));
13456f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi}
13466f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi
13476f68562edf5f66006c08de24d558732d6a389631Utkarsh SanghiTEST_F(TpmUtilityTest, LoadKeyBadDelegate) {
13486f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  TPM_HANDLE key_handle;
13496f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  std::string key_blob;
13506f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.LoadKey(
13516f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi      key_blob, nullptr, &key_handle));
135282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
135382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
13546f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi
135539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceSuccess) {
135639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 59;
135739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
135839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length  = 256;
135939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM2B_NV_PUBLIC public_data;
136039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _))
136139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&public_data),
136239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
13635d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.DefineNVSpace(
13645d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, length, &mock_authorization_delegate_));
136539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.nv_index, nvram_index);
136639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.name_alg, TPM_ALG_SHA256);
136739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.attributes,
136839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            TPMA_NV_OWNERWRITE | TPMA_NV_WRITEDEFINE | TPMA_NV_AUTHREAD);
136939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.data_size, length);
137039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
137139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
137239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadLength) {
137339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t bad_length = 3000;
137439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE,
13755d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      utility_.DefineNVSpace(0, bad_length, &mock_authorization_delegate_));
137639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
137739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
137839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadIndex) {
137939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<29;
138039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
13815d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      utility_.DefineNVSpace(bad_index, 2, &mock_authorization_delegate_));
138239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
138339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
138439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadSession) {
1385c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.DefineNVSpace(0, 2, nullptr));
138639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
138739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
138839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceFail) {
138939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 59;
139039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length  = 256;
139139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _))
139239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
139339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
13945d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      utility_.DefineNVSpace(index, length, &mock_authorization_delegate_));
139539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
139639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
139739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceSuccess) {
139839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
139939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
140039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
140139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _));
140239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
14035d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.DestroyNVSpace(index, &mock_authorization_delegate_));
140439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
140539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
140639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadIndex) {
140739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<29;
140839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
14095d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.DestroyNVSpace(bad_index, &mock_authorization_delegate_));
141039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
141139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
141239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadSession) {
1413c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.DestroyNVSpace(3, nullptr));
141439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
141539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
141639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceFailure) {
141739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
141839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
141939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
142039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _))
142139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
142239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
14235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.DestroyNVSpace(index, &mock_authorization_delegate_));
142439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
142539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
142639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceSuccess) {
142739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
142839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
142939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_WriteLockSync(nvram_index, _, nvram_index, _, _))
143039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
143139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
14325d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.LockNVSpace(index, &mock_authorization_delegate_));
14336537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
14345d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(index, &public_area));
14356537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(public_area.attributes & TPMA_NV_WRITELOCKED, TPMA_NV_WRITELOCKED);
143639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
143739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
143839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadIndex) {
143939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
144039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
14415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.LockNVSpace(bad_index, &mock_authorization_delegate_));
144239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
144339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
144439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadSession) {
1445c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility_.LockNVSpace(52, nullptr));
144639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
144739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
144839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceFailure) {
144939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
145039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
145139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_WriteLockSync(nvram_index, _, nvram_index, _, _))
145239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
145339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
14545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi            utility_.LockNVSpace(index, &mock_authorization_delegate_));
145539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
145639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
145739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceSuccess) {
145839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
145939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
146039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
146139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
146239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _))
146339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
14645d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.WriteNVSpace(
14655d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, offset, "", &mock_authorization_delegate_));
14666537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
14675d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(index, &public_area));
14686537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(public_area.attributes & TPMA_NV_WRITTEN, TPMA_NV_WRITTEN);
146939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
147039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
147139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSize) {
147239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
147339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data(1025, 0);
14745d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE, utility_.WriteNVSpace(
14755d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, 0, nvram_data, &mock_authorization_delegate_));
147639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
147739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
147839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadIndex) {
147939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
14805d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.WriteNVSpace(
14815d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      bad_index, 0, "", &mock_authorization_delegate_));
148239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
148339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
148439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSessions) {
1485c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS,
1486c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi            utility_.WriteNVSpace(53, 0, "", nullptr));
148739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
148839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
148939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceFailure) {
149039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
149139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
149239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
149339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
149439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _))
149539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
14965d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.WriteNVSpace(
14975d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, offset, "", &mock_authorization_delegate_));
149839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
149939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
150039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceSuccess) {
150139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
150239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
150339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nv_index = NV_INDEX_FIRST + index;
150439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 24;
150539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
150639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
150739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _))
150839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
15095d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.ReadNVSpace(
15105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, offset, length, &nvram_data, &mock_authorization_delegate_));
151139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
151239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
151339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadReadLength) {
151439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 1025;
151539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
15165d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE, utility_.ReadNVSpace(
15175d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      52, 0, length, &nvram_data, &mock_authorization_delegate_));
151839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
151939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
152039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadIndex) {
152139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
152239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
15235d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility_.ReadNVSpace(
15245d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      bad_index, 0, 5, &nvram_data, &mock_authorization_delegate_));
152539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
152639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
152739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadSession) {
152839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
152939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS,
1530c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi            utility_.ReadNVSpace(53, 0, 5, &nvram_data, nullptr));
153139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
153239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
153339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceFailure) {
153439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
153539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
153639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nv_index = NV_INDEX_FIRST + index;
153739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 24;
153839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
153939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
154039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _))
154139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
15425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.ReadNVSpace(
15435d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi      index, offset, length, &nvram_data, &mock_authorization_delegate_));
154439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
154539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
154639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameSuccess) {
154739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
154839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
154939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string name;
155039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _))
155139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
15525d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpaceName(index, &name));
155339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
155439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
155539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameFailure) {
155639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
155739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string name;
155839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
155939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
15605d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.GetNVSpaceName(index, &name));
156139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
156239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
15636537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaCachedSuccess) {
15646537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  uint32_t index = 53;
15656537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
15665d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  SetNVRAMMap(index, public_area);
15676537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
15686537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi      .Times(0);
15695d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpacePublicArea(index, &public_area));
15706537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi}
15716537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
157239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaSuccess) {
157339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
157439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
157539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
157639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _))
157739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
15785d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility_.GetNVSpacePublicArea(index, &public_area));
157939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
158039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
158139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaFailure) {
158239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
158339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
158439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
158539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
15865d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility_.GetNVSpacePublicArea(index, &public_area));
158739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
158839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
158966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordSuccess) {
159066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
159166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(false));
159266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
159366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
159466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, SetKnownOwnerPassword("password"));
159566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
159666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
159766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordOwnershipDone) {
159866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
159966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(true));
160066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, SetKnownOwnerPassword("password"));
160166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
160266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
160366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SetKnownPasswordFailure) {
160466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
160566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(false));
160666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
160766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
160866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, SetKnownOwnerPassword("password"));
160966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
161066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
161166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysSuccess) {
161266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
161366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .Times(2)
161466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
161566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password"));
161666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
161766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
161866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysHandleConsistency) {
161966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_HANDLE test_handle = 42;
162066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
162166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .Times(2)
162266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
162366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _))
162466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<3>(test_handle),
162566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
162666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _))
162766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
162866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password"));
162966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
163066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
163166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysCreateFailure) {
163266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
163366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
163466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _))
163566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
163666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys("password"));
163766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
163866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
163966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysPersistFailure) {
164066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
164166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
164266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _))
164366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
164466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys("password"));
164566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
164666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
164766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, RootKeysAlreadyExist) {
164866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
164966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .Times(2)
165066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
165166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys("password"));
165266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
165366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
165466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeySuccess) {
165566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
165666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
165766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
165866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
165912a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr  TPM2B_PUBLIC public_area;
166012a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
166112a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr      .WillOnce(DoAll(SaveArg<2>(&public_area),
166212a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr                      Return(TPM_RC_SUCCESS)));
166366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password"));
166412a12083abb8fc9b1bd9ac69e2be983bb7227818Jocelyn Bohr  EXPECT_EQ(TPM_ALG_SHA256, public_area.public_area.name_alg);
166566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
166666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
166766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyConsistency) {
166866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
166966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
167066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  TPM_HANDLE test_handle = 42;
167166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
167266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
167366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
167466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<4>(test_handle),
167566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
167666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _))
167766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
167866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password"));
167966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
168066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
168166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyCreateFailure) {
168266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
168366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
168466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
168566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
168666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
168766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
168866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password"));
168966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
169066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
169166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyLoadFailure) {
169266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
169366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
169466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
169566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
169666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
169766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
169866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password"));
169966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
170066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
170166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyPersistFailure) {
170266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
170366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
170466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
170566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
170666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _))
170766d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
170866d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey("password"));
170966d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
171066d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
171166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyAlreadyExists) {
171266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, _))
171366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
171466d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey("password"));
171566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi}
171666d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
1717c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}  // namespace trunks
1718