tpm_utility_test.cc revision 6537cf15412f04bda9fc1a80f7209d55c955c61f
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"
14b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi#include "trunks/mock_authorization_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:
33c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityTest() {}
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_);
38b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi    factory_.set_authorization_session(&mock_authorization_session_);
39c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  }
406537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
416537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPM_RC CreateStorageRootKeys(TpmUtilityImpl utility,
426537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                               const std::string& password) {
436537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    return utility.CreateStorageRootKeys(password);
446537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
456537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
466537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPM_RC CreateSaltingKey(TpmUtilityImpl utility,
476537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                          const std::string& password) {
486537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    return utility.CreateSaltingKey(password);
496537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
506537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
516537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPM_RC ComputeKeyName(TpmUtilityImpl utility,
526537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                        const TPMT_PUBLIC& public_area,
536537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                        std::string* object_name) {
546537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    return utility.ComputeKeyName(public_area, object_name);
556537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
566537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
576537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  void SetNVRAMMap(TpmUtilityImpl utility,
586537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                   uint32_t index,
596537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                   const TPMS_NV_PUBLIC& public_area) {
606537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    utility.nvram_public_area_map_[index] = public_area;
616537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
626537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
636537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPM_RC GetNVRAMMap(TpmUtilityImpl utility,
646537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                     uint32_t index,
656537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi                     TPMS_NV_PUBLIC* public_area) {
666537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    auto it = utility.nvram_public_area_map_.find(index);
676537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    if (it == utility.nvram_public_area_map_.end()) {
686537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi      return TPM_RC_FAILURE;
696537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    }
706537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    *public_area = it->second;
716537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi    return TPM_RC_SUCCESS;
726537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  }
736537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
74c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn protected:
75c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TrunksFactoryForTest factory_;
76c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  NiceMock<MockTpmState> mock_tpm_state_;
77c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  NiceMock<MockTpm> mock_tpm_;
78b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  NiceMock<MockAuthorizationSession> mock_authorization_session_;
79c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn};
80c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
8103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSuccess) {
8203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtilityImpl utility(factory_);
8303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  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));
8903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtilityImpl utility(factory_);
9003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.Startup());
9103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
9203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
9303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupFailure) {
9403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, StartupSync(_, _))
9503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
9603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtilityImpl utility(factory_);
9703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.Startup());
9803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
9903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
10003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSelfTestFailure) {
10103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, SelfTestSync(_, _))
10203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
10303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtilityImpl utility(factory_);
10403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.Startup());
10503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
10603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
107d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearSuccess) {
108d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
109d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
110d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
111d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Clear());
112d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
113d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
114d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearAfterBadInit) {
115d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
116d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
117d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_AUTH_MISSING))
118d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
119d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Clear());
120d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
121d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
122d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearFail) {
123d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
124d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
125d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
126d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Clear());
127d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
128d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
129e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh SanghiTEST_F(TpmUtilityTest, ShutdownTest) {
130e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
131e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ShutdownSync(TPM_SU_CLEAR, _));
132e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  utility.Shutdown();
133e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi}
134e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi
135c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmAlreadyInit) {
136c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityImpl utility(factory_);
137c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.InitializeTpm());
138c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
139c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
140c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmSuccess) {
141c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityImpl utility(factory_);
142c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
143c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
144c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
145c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.InitializeTpm());
146c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
147c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
148c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmBadAuth) {
149c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityImpl utility(factory_);
150c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
151c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
152c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
153c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Reject attempts to set platform auth.
154c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_PLATFORM, _, _, _))
155c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
156c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.InitializeTpm());
157c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
158c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
159c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmDisablePHFails) {
160c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityImpl utility(factory_);
161c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
162c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
163c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
16452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to disable the platform hierarchy.
16503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyControlSync(_, _, TPM_RH_PLATFORM, _, _))
166c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
167c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.InitializeTpm());
168c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
169c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
17052e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipSuccess) {
17152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
17252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
17352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
17452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
17552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
17652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
17752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
17852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
1792ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(2);
18052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
18152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .Times(1);
18252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
18352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .Times(1);
18452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.TakeOwnership("a", "b", "c"));
18552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
18652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
18752e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipAlreadyDone) {
18852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
18952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
19052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
19152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
19252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
19352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
19452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
19552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _))
1962ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(1);
19752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.TakeOwnership("a", "b", "c"));
19852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
19952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
20052e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipPartial) {
20152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
20252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
20352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
20452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
20552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillOnce(Return(false));
20652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
20752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
20852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
2092ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(1);
21052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
21152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .Times(1);
21252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
21352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .Times(0);
21452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.TakeOwnership("a", "b", "c"));
21552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
21652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
21752e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipOwnerFailure) {
21852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
21952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
22052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
22152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
22252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
22352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
22452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
22552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to set owner auth.
22652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
22752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
22852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
22952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
23052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
23152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
23252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.TakeOwnership("a", "b", "c"));
23352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
23452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
23552e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipEndorsementFailure) {
23652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
23752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
23852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
23952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
24052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
24152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
24252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
24352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to set endorsement auth.
24452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
24552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
24652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
24752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
24852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
24952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
25052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.TakeOwnership("a", "b", "c"));
25152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
25252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
25352e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipLockoutFailure) {
25452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
25552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
25652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
25752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
25852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
25952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
26052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
26152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to set lockout auth.
26252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
26352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
26452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
26552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
26652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
26752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
26852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.TakeOwnership("a", "b", "c"));
26952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
27052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
2712ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomSuccess) {
27252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
2732ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string entropy_data("large test data", 100);
2748b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> delegate;
2758b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_authorization_session_, GetDelegate())
2768b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(&delegate));
2778b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, StirRandomSync(_, &delegate))
2782ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
2798b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
2808b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi            utility.StirRandom(entropy_data, &mock_authorization_session_));
28152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
28252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
2832ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomFails) {
28452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
2852ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string entropy_data("test data");
2868b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, StirRandomSync(_, NULL))
2872ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
2888b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.StirRandom(entropy_data, NULL));
2892ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
2902ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
2912ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomSuccess) {
2922ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
2932ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // This number is larger than the max bytes the GetRandom call can return.
2942ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // Therefore we expect software to make multiple calls to fill this many
2952ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // bytes.
2962ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int num_bytes = 72;
2972ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string random_data;
2982ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM2B_DIGEST large_random;
2992ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  large_random.size = 32;
3002ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM2B_DIGEST small_random;
3012ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  small_random.size = 8;
3028b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> delegate;
3038b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_authorization_session_, GetDelegate())
3048b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(&delegate));
3058b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, &delegate))
3062ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(2)
3072ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<1>(large_random),
30852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn                            Return(TPM_RC_SUCCESS)));
3098b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(8, _, &delegate))
3102ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(small_random),
3112ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
3128b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.GenerateRandom(num_bytes,
3138b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                   &mock_authorization_session_,
3148b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                   &random_data));
3152ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(num_bytes, random_data.size());
31652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
31752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
3182ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomFails) {
31952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
3202ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int num_bytes = 5;
3212ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string random_data;
3228b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, NULL))
3232ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3248b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
3258b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi            utility.GenerateRandom(num_bytes, NULL, &random_data));
32652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
32752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
3282ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRSuccess) {
32952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
3308b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM_HANDLE pcr_handle = HR_PCR + 1;
3318b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> delegate;
3328b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_authorization_session_, GetDelegate())
3338b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(&delegate));
3348b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ExtendSync(pcr_handle, _, _, &delegate))
3358b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
3368b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
3378b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi            utility.ExtendPCR(1, "test digest", &mock_authorization_session_));
3382ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3392ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3402ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRFail) {
3412ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3422ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int pcr_index = 0;
3432ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_HANDLE pcr_handle = HR_PCR + pcr_index;
3442ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ExtendSync(pcr_handle, _, _, _))
3452ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3468b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ExtendPCR(pcr_index, "test digest", NULL));
3472ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3482ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3492ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRBadParam) {
3502ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3518b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ExtendPCR(-1, "test digest", NULL));
3522ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3532ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3542ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRSuccess) {
3552ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3562ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // The |pcr_index| is chosen to match the structure for |pcr_select|.
3572ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // If you change |pcr_index|, remember to change |pcr_select|.
3582ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int pcr_index = 1;
3592ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3602ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPML_PCR_SELECTION pcr_select;
3612ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.count = 1;
3622ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256;
3632ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].sizeof_select = 1;
3642ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].pcr_select[0] = 2;
3652ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPML_DIGEST pcr_values;
3662ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_values.count = 1;
3672ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_values.digests[0].size = 5;
3682ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3692ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(pcr_select),
3702ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      SetArgPointee<3>(pcr_values),
3712ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
3722ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ReadPCR(pcr_index, &pcr_value));
3732ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3742ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3752ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRFail) {
3762ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3772ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3782ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3792ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3802ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ReadPCR(1, &pcr_value));
3812ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3822ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3832ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRBadReturn) {
3842ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3852ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3862ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3872ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
3882ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ReadPCR(1, &pcr_value));
38952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
39052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
391b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSuccess) {
392b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
393b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
394b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
395b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
396b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
397b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
398b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      output_ciphertext);
399b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
400b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
401b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4028b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4038b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
404b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
405b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
406b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4078b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> delegate;
4088b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_authorization_session_, GetDelegate())
4098b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(&delegate));
4108b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, &delegate))
411b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
412b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
4138b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricEncrypt(
4148b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      key_handle,
4158b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      TPM_ALG_NULL,
4168b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      TPM_ALG_NULL,
4178b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      plaintext,
4188b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      &mock_authorization_session_,
4198b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      &ciphertext));
420b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(0, ciphertext.compare(output_ciphertext));
421b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
422b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
423b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptFail) {
424b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
425b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
426b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
427b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
428b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
429b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
430b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4318b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4328b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
433b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
434b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
435b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4368b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, NULL))
437b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
438b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.AsymmetricEncrypt(key_handle,
439b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      TPM_ALG_NULL,
4409dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
441b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      plaintext,
4428b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                      NULL,
443b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      &ciphertext));
444b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
445b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
446b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptBadParams) {
447b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
448b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
449b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
450b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
451b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
452b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
453b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt | kRestricted;
4548b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, NULL))
455b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
456b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
457b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.AsymmetricEncrypt(key_handle,
458b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             TPM_ALG_RSAES,
4599dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                             TPM_ALG_NULL,
460b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             plaintext,
4618b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                             NULL,
462b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             &ciphertext));
463b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
4649dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
4659dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptNullSchemeForward) {
4669dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
4679dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
4689dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
4699dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
4709dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
4719dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
4729dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_ciphertext);
4739dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
4749dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
4759dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4768b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4778b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
4789dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
4799dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
4809dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
4819dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4828b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, NULL))
4839dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
4849dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
4859dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
4869dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricEncrypt(key_handle,
4879dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
4889dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
4899dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      plaintext,
4908b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                      NULL,
4919dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      &ciphertext));
4929dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP);
4939dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256);
4949dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
4959dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
4969dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSchemeForward) {
4979dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
4989dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
4999dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
5009dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
5019dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
5029dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
5039dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_ciphertext);
5049dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
5059dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
5069dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5078b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5088b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
5099dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
5109dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
5119dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
5129dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
5138b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, NULL))
5149dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
5159dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
5169dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
5179dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricEncrypt(key_handle,
5189dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_RSAES,
5199dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
5209dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      plaintext,
5218b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                      NULL,
5229dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      &ciphertext));
5239dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES);
5249dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
5259dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
526b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSuccess) {
527b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
5282ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  scoped_ptr<AuthorizationSession> session(factory_.GetAuthorizationSession());
529b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
530b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
531b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string output_plaintext("plaintext");
532b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
5332ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password("password");
534b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
535b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      output_plaintext);
536b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
537b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
538b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5398b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5408b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
541b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
542b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
543b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
544b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
545b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
546b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
547b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricDecrypt(key_handle,
548b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      TPM_ALG_NULL,
5499dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
550b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      ciphertext,
5512ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi                                                      session.get(),
552b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      &plaintext));
553b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(0, plaintext.compare(output_plaintext));
554b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
555b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
556b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptFail) {
557b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
558b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
559b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string key_name;
560b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
561b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
562b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string password;
563b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
564b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
565b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5668b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5678b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
568b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
569b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
570b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
571b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
572b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
5731ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.AsymmetricDecrypt(
5741ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
5751ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5761ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5771ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
5781ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
5791ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
580b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
581b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
582b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadParams) {
583b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
584b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
585b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string key_name;
586b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
587b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
588b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string password;
589b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
590b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
591b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt | kRestricted;
592b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
593b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
594b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
5951ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.AsymmetricDecrypt(
5961ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
5971ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_RSAES,
5981ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5991ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6001ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
6011ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
602b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
603b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
6042ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadSession) {
6052ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
6061ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
6072ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string key_name;
6082ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string plaintext;
6092ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string ciphertext;
6102ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password;
6111ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.AsymmetricDecrypt(
6121ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle, TPM_ALG_RSAES, TPM_ALG_NULL, ciphertext, NULL, &plaintext));
6132ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi}
6142ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi
6159dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptNullSchemeForward) {
6169dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
6179dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
6189dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
6199dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_plaintext("plaintext");
6209dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
6219dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string password;
6229dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
6239dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_plaintext);
6249dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
6259dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
6269dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
6278b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6288b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
6299dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
6309dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
6319dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
6329dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6339dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
6349dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
6359dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
6369dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6371ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricDecrypt(
6381ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6391ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6401ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6411ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6421ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
6431ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
6449dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP);
6459dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256);
6469dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
6479dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
6489dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSchemeForward) {
6499dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
6509dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
6519dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
6529dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_plaintext("plaintext");
6539dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
6549dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string password;
6559dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
6569dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_plaintext);
6579dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
6589dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
6599dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
6608b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6618b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
6629dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
6639dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
6649dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
6659dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6669dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
6679dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
6689dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
6699dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6701ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricDecrypt(
6711ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6721ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_RSAES,
6731ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6741ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6751ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
6761ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
6779dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES);
6789dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
6799dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
680748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSuccess) {
681748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
6822ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  scoped_ptr<AuthorizationSession> session(factory_.GetAuthorizationSession());
683748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
6842ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password("password");
685e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
686748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
687748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 2;
688748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.buffer[0] = 'h';
689748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.buffer[1] = 'i';
690748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
691748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
692748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
693748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
6948b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6958b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
696748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
697748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
698748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
699748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
700748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
701748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
702748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Sign(key_handle,
703748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
704748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
705748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
7062ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi                                         session.get(),
707748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
708748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(0, signature.compare("hi"));
709748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
710748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
711748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignFail) {
712748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
713748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
714748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
715e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
716748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
717748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
718748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
719748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
7208b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
7218b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
722748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
723748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
724748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
725748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
726748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
727748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Sign(key_handle,
728748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
729748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
730748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
7311ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                         &mock_authorization_session_,
732748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
733748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
734748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
735748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams1) {
736748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
737748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
738748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
739e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
740748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
741748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
742748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
743748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign | kRestricted;
744748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
745748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
746748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
747748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Sign(key_handle,
748748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_RSAPSS,
749748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_NULL,
750748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                digest,
7511ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                &mock_authorization_session_,
752748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                &signature));
753748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
754748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
7552ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, SignBadAuthorizationSession) {
7562ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
7571ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
7582ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password;
7592ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string digest(32, 'a');
7602ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string signature;
7611ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.Sign(key_handle,
7621ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   TPM_ALG_RSAPSS,
7631ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   TPM_ALG_NULL,
7641ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   digest,
7651ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   NULL,
7661ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   &signature));
7672ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi}
7682ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi
769748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams2) {
770748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
771748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
772748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
773e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
774748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
775748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
776748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
777748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
778748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
779748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
780748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
781748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Sign(key_handle,
782748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_RSAPSS,
783748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_NULL,
784748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                digest,
7851ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                &mock_authorization_session_,
786748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                &signature));
787748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
788748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
789748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams3) {
790748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
791748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
792748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
793e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
794748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
795748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
796748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_ECC;
797748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
798748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
799748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
800748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
801748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Sign(key_handle,
802748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_RSAPSS,
803748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_NULL,
804748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                digest,
8051ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                &mock_authorization_session_,
806748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                &signature));
807748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
808748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
809748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams4) {
810748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
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)));
821748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Sign(key_handle,
822748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_RSAPSS,
823748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
824748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
8251ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                         &mock_authorization_session_,
826748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
827748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
828748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
829748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams5) {
830748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
831748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle = 0;
832748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
833e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
834748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
835748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Sign(key_handle,
836748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_AES,
837748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_NULL,
838748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                digest,
8391ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                &mock_authorization_session_,
840748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                &signature));
841748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
842748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
843748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
844748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignNullSchemeForward) {
845748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
846748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
847748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
848e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
849748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
850748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 0;
851748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
852748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
853748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIG_SCHEME scheme;
854748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
855748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
8568b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
8578b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
858748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
859748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
860748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
861748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
862748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
863748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      SaveArg<3>(&scheme),
864748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
865748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Sign(key_handle,
866748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
867748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
868748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
8691ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                         &mock_authorization_session_,
870748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
871748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSASSA);
872748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.details.rsassa.hash_alg, TPM_ALG_SHA256);
873748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
874748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
875748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSchemeForward) {
876748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
877748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
878748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
879e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(64, 'a');
880748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
881748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 0;
882748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
883748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
884748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIG_SCHEME scheme;
885748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
886748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
8878b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
8888b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
889748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
890748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
891748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
892748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
893748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
894748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      SaveArg<3>(&scheme),
895748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
896748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Sign(key_handle,
897748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_RSAPSS,
898887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi                                         TPM_ALG_SHA1,
899748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
9001ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                         &mock_authorization_session_,
901748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
902748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAPSS);
903887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  EXPECT_EQ(scheme.details.rsapss.hash_alg, TPM_ALG_SHA1);
904748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
905748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
906748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySuccess) {
907748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
908748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
909e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
910748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
911748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
912748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
913748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
914748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
915748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
916748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
917748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
918748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
919748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Verify(key_handle,
920748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
921748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
922748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
923748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
924748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
925748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
926748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyFail) {
927748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
928748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
929e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
930748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
931748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
932748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
933748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
934748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
935748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
936748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
937748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
938748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
939748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Verify(key_handle,
940748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
941748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
942748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
943748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
944748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
945748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
946748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams1) {
947748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
948748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
949e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
950748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
951748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
952748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
953748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign | kRestricted;
954748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
955748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
956748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
957748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Verify(key_handle,
958748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
959748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
960748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  digest,
961748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  signature));
962748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
963748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
964748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams2) {
965748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
966748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
967e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
968748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
969748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
970748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
971748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
972748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
973748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
974748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
975748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Verify(key_handle,
976748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
977748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
978748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  digest,
979748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  signature));
980748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
981748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
982748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams3) {
983748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
984748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
985e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
986748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
987748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
988748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_ECC;
989748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
990748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
991748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
992748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
993748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Verify(key_handle,
994748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
995748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
996748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  digest,
997748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  signature));
998748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
999748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1000748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams4) {
1001748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
1002748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1003e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1004748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1005748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1006748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1007748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1008748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1009748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1010748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_FAILURE)));
1011748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Verify(key_handle,
1012748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
1013748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
1014748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
1015748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
1016748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1017748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1018748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams5) {
1019748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
1020748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1021e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1022748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1023748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1024748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1025748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1026748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1027748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1028748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1029748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Verify(key_handle,
1030748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_AES,
1031748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
1032748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  digest,
1033748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  signature));
1034748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1035748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1036748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyNullSchemeForward) {
1037748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
1038748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1039e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1040748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1041748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1042748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_in;
1043748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1044748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1045748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1046748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1047748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1048748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
1049748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&signature_in),
1050748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1051748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Verify(key_handle,
1052748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
1053748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
1054748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
1055748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
1056748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSASSA);
1057748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA256);
1058748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1059748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1060748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySchemeForward) {
1061748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
1062748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1063e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(64, 'a');
1064748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1065748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1066748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_in;
1067748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1068748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1069748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1070748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1071748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1072748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
1073748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&signature_in),
1074748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1075748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Verify(key_handle,
1076748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_RSAPSS,
1077887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi                                           TPM_ALG_SHA1,
1078748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
1079748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
1080748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSAPSS);
1081887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA1);
1082748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1083748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
108433ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataSuccess) {
108533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
108633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
108733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
10881ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ChangeKeyAuthorizationData(
10891ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi    key_handle, new_password, &mock_authorization_session_, NULL));
109033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
109133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
109233ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataKeyNameFail) {
109333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
109433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
109533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string old_password;
109633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
109733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
109833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
10991ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ChangeKeyAuthorizationData(
11001ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle, new_password, &mock_authorization_session_, NULL));
110133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
110233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
110333ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataFailure) {
110433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
110533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
110633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
110733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ObjectChangeAuthSync(key_handle, _, _, _, _, _, _))
110833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
11091ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ChangeKeyAuthorizationData(
11101ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle, new_password, &mock_authorization_session_, NULL));
111133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
111233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
111333ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataWithReturnSuccess) {
111433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
111533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
111633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
111733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string key_blob;
11188b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM2B_PUBLIC public_area;
11198b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
11208b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
11218b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
11228b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
11238b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
11248b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
11251ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ChangeKeyAuthorizationData(
11261ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi    key_handle, new_password, &mock_authorization_session_, &key_blob));
112733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
112833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
112933ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccess) {
113033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
113133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
113233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
113333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
113433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password("password");
113533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string key_blob;
113633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_DATA encryption_key;
113733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_PUBLIC public_data;
113833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_PRIVATE private_data;
113933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
114033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&encryption_key),
114133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      SaveArg<3>(&public_data),
114233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      SaveArg<4>(&private_data),
114333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
114433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ImportRSAKey(
114533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
11461ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
11471ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
11481ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
11491ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
11501ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
11511ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &key_blob));
115233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  // Validate that the public area was properly constructed.
115333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.parameters.rsa_detail.key_bits,
115433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            modulus.size() * 8);
115533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.parameters.rsa_detail.exponent,
115633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            public_exponent);
115733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.unique.rsa.size, modulus.size());
115833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(public_data.public_area.unique.rsa.buffer,
115933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      modulus.data(), modulus.size()));
116033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  // Validate the private struct construction.
116133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(kAesKeySize, encryption_key.size);
116233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_KEY key;
116333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_set_encrypt_key(encryption_key.buffer, kAesKeySize * 8, &key);
116433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  unsigned char iv[MAX_AES_BLOCK_SIZE_BYTES] = {0};
116533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  int iv_in = 0;
116633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string unencrypted_private(private_data.size, 0);
116733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_cfb128_encrypt(
116833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    reinterpret_cast<const unsigned char*>(private_data.buffer),
116933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    reinterpret_cast<unsigned char*>(string_as_array(&unencrypted_private)),
117033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    private_data.size, &key, iv, &iv_in, AES_DECRYPT);
117133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_DIGEST inner_integrity;
117233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_DIGEST(&unencrypted_private,
117333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                               &inner_integrity, NULL));
117433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string object_name;
11756537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
11766537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi            ComputeKeyName(utility, public_data.public_area, &object_name));
117733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string integrity_value = crypto::SHA256HashString(unencrypted_private +
117833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                                         object_name);
117933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(integrity_value.size(), inner_integrity.size);
118033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(inner_integrity.buffer,
118133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      integrity_value.data(),
118233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      inner_integrity.size));
118333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_SENSITIVE sensitive_data;
118433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_SENSITIVE(&unencrypted_private,
118533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                                  &sensitive_data, NULL));
118633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(sensitive_data.sensitive_area.auth_value.size, password.size());
118733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.auth_value.buffer,
118833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      password.data(), password.size()));
118933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(sensitive_data.sensitive_area.sensitive.rsa.size,
119033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            prime_factor.size());
119133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.sensitive.rsa.buffer,
119233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      prime_factor.data(), prime_factor.size()));
119333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
119433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
119533ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccessWithNoBlob) {
119633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
119733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
119833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
119933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
120033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
120133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
120233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
120333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ImportRSAKey(
120433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12051ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12061ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
12071ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12081ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12091ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
12101ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      NULL));
121133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
121233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
121333ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyParentNameFail) {
121433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
121533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
121633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
121733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
121833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
121933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
122033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
122133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ImportRSAKey(
122233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12231ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12241ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
12251ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12261ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12271ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
12281ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      NULL));
122933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
123033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
123133ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyFail) {
123233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    TpmUtilityImpl utility(factory_);
123333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus;
123433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor;
123533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
123633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
123733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
123833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ImportRSAKey(
123933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12401ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12411ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      0x10001,
12421ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12431ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12441ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
12451ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      NULL));
124633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
124733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
12486465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeyDecryptSuccess) {
124982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
12502ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  scoped_ptr<AuthorizationSession> session(factory_.GetAuthorizationSession());
125182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
125282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
125382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
125482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
125582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
125682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
125782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
12586465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateAndLoadRSAKey(
125982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
126082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
12612ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi      session.get(),
12626465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
12636465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
126482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt);
126582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, 0);
126682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
1267e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi            TPM_ALG_NULL);
126882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
126982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
12706465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeySignSuccess) {
127182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
127282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
127382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
127482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
127582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
127682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
127782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
127882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
12796465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateAndLoadRSAKey(
128082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kSignKey,
128182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
12821ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
12836465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
12846465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
128582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign);
128682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, 0);
128782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
1288e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi            TPM_ALG_NULL);
128982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
129082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
12916465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeyLegacySuccess) {
129282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
129382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
129482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
129582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
129682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
129782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
129882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
129982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
13006465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateAndLoadRSAKey(
130182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptAndSignKey,
130282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
13031ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
13046465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
13056465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
130682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt);
130782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign);
130882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
130982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi            TPM_ALG_NULL);
131082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
131182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
13126465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeyFail1) {
131382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
131482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
131582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
131682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
13176465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateAndLoadRSAKey(
131882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
131982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
13201ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
13216465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
13226465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
132382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
132482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
13256465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeyFail2) {
132682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
132782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
132882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
132982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
133082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
133182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
13326465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateAndLoadRSAKey(
133382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
133482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
13351ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
13366465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
13376465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
133882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
133982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
134039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceSuccess) {
134139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
134239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 59;
134339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
134439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length  = 256;
134539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM2B_NV_PUBLIC public_data;
134639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _))
134739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&public_data),
134839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
134939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
135039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DefineNVSpace(index, length, &mock_authorization_session_));
135139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.nv_index, nvram_index);
135239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.name_alg, TPM_ALG_SHA256);
135339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.attributes,
135439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            TPMA_NV_OWNERWRITE | TPMA_NV_WRITEDEFINE | TPMA_NV_AUTHREAD);
135539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.data_size, length);
135639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
135739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
135839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadLength) {
135939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
136039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t bad_length = 3000;
136139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE,
136239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DefineNVSpace(0, bad_length, &mock_authorization_session_));
136339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
136439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
136539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadIndex) {
136639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
136739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<29;
136839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
136939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DefineNVSpace(bad_index, 2, &mock_authorization_session_));
137039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
137139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
137239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadSession) {
137339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
137439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.DefineNVSpace(0, 2, NULL));
137539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
137639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
137739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceFail) {
137839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
137939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 59;
138039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length  = 256;
138139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _))
138239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
138339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
138439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DefineNVSpace(index, length, &mock_authorization_session_));
138539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
138639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
138739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceSuccess) {
138839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
138939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
139039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
139139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
139239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _));
139339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
139439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DestroyNVSpace(index, &mock_authorization_session_));
139539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
139639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
139739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadIndex) {
139839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
139939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<29;
140039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
140139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DestroyNVSpace(bad_index, &mock_authorization_session_));
140239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
140339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
140439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadSession) {
140539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
140639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.DestroyNVSpace(3, NULL));
140739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
140839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
140939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceFailure) {
141039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
141139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
141239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
141339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
141439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _))
141539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
141639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
141739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DestroyNVSpace(index, &mock_authorization_session_));
141839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
141939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
142039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceSuccess) {
142139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
142239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
142339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
142439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_WriteLockSync(nvram_index, _, nvram_index, _, _))
142539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
142639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
142739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.LockNVSpace(index, &mock_authorization_session_));
14286537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
14296537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(utility, index, &public_area));
14306537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(public_area.attributes & TPMA_NV_WRITELOCKED, TPMA_NV_WRITELOCKED);
143139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
143239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
143339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadIndex) {
143439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
143539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
143639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
143739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.LockNVSpace(bad_index, &mock_authorization_session_));
143839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
143939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
144039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadSession) {
144139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
144239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.LockNVSpace(52, NULL));
144339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
144439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
144539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceFailure) {
144639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
144739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
144839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
144939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_WriteLockSync(nvram_index, _, nvram_index, _, _))
145039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
145139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
145239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.LockNVSpace(index, &mock_authorization_session_));
145339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
145439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
145539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceSuccess) {
145639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
145739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
145839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
145939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
146039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
146139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _))
146239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
146339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.WriteNVSpace(
146439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, offset, "", &mock_authorization_session_));
14656537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
14666537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, GetNVRAMMap(utility, index, &public_area));
14676537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(public_area.attributes & TPMA_NV_WRITTEN, TPMA_NV_WRITTEN);
146839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
146939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
147039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSize) {
147139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
147239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
147339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data(1025, 0);
147439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE, utility.WriteNVSpace(
147539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, 0, nvram_data, &mock_authorization_session_));
147639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
147739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
147839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadIndex) {
147939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
148039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
148139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.WriteNVSpace(
148239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      bad_index, 0, "", &mock_authorization_session_));
148339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
148439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
148539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSessions) {
148639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
148739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.WriteNVSpace(53, 0, "", NULL));
148839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
148939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
149039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceFailure) {
149139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
149239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
149339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
149439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
149539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
149639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _))
149739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
149839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.WriteNVSpace(
149939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, offset, "", &mock_authorization_session_));
150039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
150139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
150239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceSuccess) {
150339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
150439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
150539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
150639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nv_index = NV_INDEX_FIRST + index;
150739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 24;
150839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
150939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
151039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _))
151139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
151239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ReadNVSpace(
151339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, offset, length, &nvram_data, &mock_authorization_session_));
151439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
151539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
151639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadReadLength) {
151739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
151839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 1025;
151939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
152039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE, utility.ReadNVSpace(
152139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      52, 0, length, &nvram_data, &mock_authorization_session_));
152239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
152339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
152439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadIndex) {
152539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
152639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
152739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
152839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.ReadNVSpace(
152939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      bad_index, 0, 5, &nvram_data, &mock_authorization_session_));
153039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
153139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
153239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadSession) {
153339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
153439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
153539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS,
153639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.ReadNVSpace(53, 0, 5, &nvram_data, NULL));
153739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
153839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
153939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceFailure) {
154039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
154139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
154239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
154339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nv_index = NV_INDEX_FIRST + index;
154439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 24;
154539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
154639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
154739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _))
154839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
154939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ReadNVSpace(
155039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, offset, length, &nvram_data, &mock_authorization_session_));
155139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
155239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
155339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameSuccess) {
155439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
155539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
155639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
155739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string name;
155839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _))
155939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
156039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.GetNVSpaceName(index, &name));
156139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
156239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
156339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameFailure) {
156439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
156539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
156639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string name;
156739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
156839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
156939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.GetNVSpaceName(index, &name));
157039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
157139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
15726537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaCachedSuccess) {
15736537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
15746537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  uint32_t index = 53;
15756537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
15766537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  SetNVRAMMap(utility, index, public_area);
15776537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
15786537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi      .Times(0);
15796537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.GetNVSpacePublicArea(index, &public_area));
15806537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi}
15816537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi
158239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaSuccess) {
158339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
158439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
158539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
158639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
158739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _))
158839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
158939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.GetNVSpacePublicArea(index, &public_area));
159039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
159139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
159239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaFailure) {
159339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
159439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
159539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
159639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
159739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
159839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.GetNVSpacePublicArea(index, &public_area));
159939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
160039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
16012ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, RootKeysSuccess) {
16022ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16036537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys(utility, "password"));
16042ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16052ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16062ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, RootKeysHandleConsistency) {
16072ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16082ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_HANDLE test_handle = 42;
16092ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _))
16102ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<3>(test_handle),
16112ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
16122ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _))
16132ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
16146537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateStorageRootKeys(utility, "password"));
16152ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16162ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16172ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, RootKeysCreateFailure) {
16182ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16192ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _))
16202ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
16216537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys(utility, "password"));
16222ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16232ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16242ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, RootKeysPersistFailure) {
16252ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16262ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _))
16272ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
16286537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateStorageRootKeys(utility, "password"));
16292ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16302ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16312ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeySuccess) {
16322ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16336537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey(utility, "password"));
16342ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16352ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16362ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyConsistency) {
16372ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16382ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_HANDLE test_handle = 42;
16392ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
16402ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<4>(test_handle),
16412ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
16422ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _))
16432ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
16446537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, CreateSaltingKey(utility, "password"));
16452ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16462ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16472ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyCreateFailure) {
16482ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16492ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
16502ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
16516537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey(utility, "password"));
16522ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16532ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16542ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyLoadFailure) {
16552ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16562ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
16572ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
16586537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey(utility, "password"));
16592ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16602ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16612ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyPersistFailure) {
16622ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16632ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _))
16642ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
16656537cf15412f04bda9fc1a80f7209d55c955c61fUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, CreateSaltingKey(utility, "password"));
16662ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16672ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
1668c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}  // namespace trunks
1669