tpm_utility_test.cc revision 8b2bf63478b292937f85b3b0e215882af461a999
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() {}
34c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  virtual ~TpmUtilityTest() {}
35c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  void SetUp() {
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  }
40c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn protected:
41c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TrunksFactoryForTest factory_;
42c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  NiceMock<MockTpmState> mock_tpm_state_;
43c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  NiceMock<MockTpm> mock_tpm_;
44b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  NiceMock<MockAuthorizationSession> mock_authorization_session_;
45c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn};
46c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
4703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSuccess) {
4803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtilityImpl utility(factory_);
4903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.Startup());
5003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
5103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
5203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupAlreadyStarted) {
5303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, StartupSync(_, _))
5403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_INITIALIZE));
5503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtilityImpl utility(factory_);
5603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.Startup());
5703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
5803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
5903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupFailure) {
6003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, StartupSync(_, _))
6103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
6203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtilityImpl utility(factory_);
6303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.Startup());
6403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
6503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
6603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTEST_F(TpmUtilityTest, StartupSelfTestFailure) {
6703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, SelfTestSync(_, _))
6803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
6903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtilityImpl utility(factory_);
7003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.Startup());
7103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
7203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
73d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearSuccess) {
74d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
75d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
76d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
77d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Clear());
78d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
79d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
80d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearAfterBadInit) {
81d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
82d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
83d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_AUTH_MISSING))
84d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
85d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Clear());
86d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
87d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
88d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh SanghiTEST_F(TpmUtilityTest, ClearFail) {
89d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
90d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ClearSync(_, _, _))
91d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
92d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Clear());
93d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi}
94d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
95e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh SanghiTEST_F(TpmUtilityTest, ShutdownTest) {
96e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
97e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ShutdownSync(TPM_SU_CLEAR, _));
98e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  utility.Shutdown();
99e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi}
100e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi
101c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmAlreadyInit) {
102c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityImpl utility(factory_);
103c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.InitializeTpm());
104c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
105c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
106c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmSuccess) {
107c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityImpl utility(factory_);
108c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
109c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
110c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
111c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.InitializeTpm());
112c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
113c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
114c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmBadAuth) {
115c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityImpl utility(factory_);
116c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
117c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
118c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
119c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Reject attempts to set platform auth.
120c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_PLATFORM, _, _, _))
121c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
122c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.InitializeTpm());
123c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
124c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
125c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTEST_F(TpmUtilityTest, InitializeTpmDisablePHFails) {
126c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmUtilityImpl utility(factory_);
127c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  // Setup a hierarchy that needs to be disabled.
128c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsPlatformHierarchyEnabled())
129c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillOnce(Return(true));
13052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to disable the platform hierarchy.
13103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyControlSync(_, _, TPM_RH_PLATFORM, _, _))
132c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
133c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.InitializeTpm());
134c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
135c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
13652e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipSuccess) {
13752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
13852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
13952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
14052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
14152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
14252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
14352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
14452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
1452ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(2);
14652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
14752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .Times(1);
14852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
14952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .Times(1);
15052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.TakeOwnership("a", "b", "c"));
15152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
15252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
15352e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipAlreadyDone) {
15452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
15552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
15652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
15752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
15852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
15952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
16052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
16152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(_, _, _, _))
1622ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(1);
16352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.TakeOwnership("a", "b", "c"));
16452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
16552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
16652e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipPartial) {
16752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
16852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
16952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
17052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
17152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillOnce(Return(false));
17252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
17352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(true));
17452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
1752ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(1);
17652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
17752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .Times(1);
17852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
17952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .Times(0);
18052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_SUCCESS, utility.TakeOwnership("a", "b", "c"));
18152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
18252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
18352e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipOwnerFailure) {
18452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
18552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
18652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
18752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
18852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
18952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
19052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
19152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to set owner auth.
19252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
19352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
19452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
19552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
19652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
19752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
19852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.TakeOwnership("a", "b", "c"));
19952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
20052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
20152e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipEndorsementFailure) {
20252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
20352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
20452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
20552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
20652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
20752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
20852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
20952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to set endorsement auth.
21052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
21152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
21252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
21352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
21452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
21552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
21652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.TakeOwnership("a", "b", "c"));
21752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
21852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
21952e2a45f585fbe34032eae5b094a092afdf217caDarren KrahnTEST_F(TpmUtilityTest, TakeOwnershipLockoutFailure) {
22052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
22152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwnerPasswordSet())
22252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
22352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsEndorsementPasswordSet())
22452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
22552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_state_, IsLockoutPasswordSet())
22652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(false));
22752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  // Reject attempts to set lockout auth.
22852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_OWNER, _, _, _))
22952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
23052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_ENDORSEMENT, _, _, _))
23152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_SUCCESS));
23252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_CALL(mock_tpm_, HierarchyChangeAuthSync(TPM_RH_LOCKOUT, _, _, _))
23352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
23452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  EXPECT_EQ(TPM_RC_FAILURE, utility.TakeOwnership("a", "b", "c"));
23552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
23652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
2372ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomSuccess) {
23852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
2392ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string entropy_data("large test data", 100);
2408b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> delegate;
2418b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_authorization_session_, GetDelegate())
2428b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(&delegate));
2438b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, StirRandomSync(_, &delegate))
2442ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
2458b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
2468b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi            utility.StirRandom(entropy_data, &mock_authorization_session_));
24752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
24852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
2492ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, StirRandomFails) {
25052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
2512ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string entropy_data("test data");
2528b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, StirRandomSync(_, NULL))
2532ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
2548b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.StirRandom(entropy_data, NULL));
2552ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
2562ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
2572ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomSuccess) {
2582ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
2592ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // This number is larger than the max bytes the GetRandom call can return.
2602ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // Therefore we expect software to make multiple calls to fill this many
2612ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // bytes.
2622ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int num_bytes = 72;
2632ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string random_data;
2642ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM2B_DIGEST large_random;
2652ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  large_random.size = 32;
2662ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM2B_DIGEST small_random;
2672ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  small_random.size = 8;
2688b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> delegate;
2698b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_authorization_session_, GetDelegate())
2708b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(&delegate));
2718b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, &delegate))
2722ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .Times(2)
2732ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<1>(large_random),
27452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn                            Return(TPM_RC_SUCCESS)));
2758b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(8, _, &delegate))
2762ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<1>(small_random),
2772ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
2788b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.GenerateRandom(num_bytes,
2798b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                   &mock_authorization_session_,
2808b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                   &random_data));
2812ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(num_bytes, random_data.size());
28252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
28352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
2842ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, GenerateRandomFails) {
28552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
2862ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int num_bytes = 5;
2872ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string random_data;
2888b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, GetRandomSync(_, _, NULL))
2892ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
2908b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
2918b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi            utility.GenerateRandom(num_bytes, NULL, &random_data));
29252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
29352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
2942ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRSuccess) {
29552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TpmUtilityImpl utility(factory_);
2968b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM_HANDLE pcr_handle = HR_PCR + 1;
2978b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> delegate;
2988b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_authorization_session_, GetDelegate())
2998b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(&delegate));
3008b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ExtendSync(pcr_handle, _, _, &delegate))
3018b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
3028b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
3038b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi            utility.ExtendPCR(1, "test digest", &mock_authorization_session_));
3042ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3052ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3062ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRFail) {
3072ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3082ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int pcr_index = 0;
3092ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_HANDLE pcr_handle = HR_PCR + pcr_index;
3102ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ExtendSync(pcr_handle, _, _, _))
3112ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3128b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ExtendPCR(pcr_index, "test digest", NULL));
3132ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3142ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3152ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ExtendPCRBadParam) {
3162ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3178b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ExtendPCR(-1, "test digest", NULL));
3182ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3192ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3202ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRSuccess) {
3212ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3222ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // The |pcr_index| is chosen to match the structure for |pcr_select|.
3232ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  // If you change |pcr_index|, remember to change |pcr_select|.
3242ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  int pcr_index = 1;
3252ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3262ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPML_PCR_SELECTION pcr_select;
3272ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.count = 1;
3282ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].hash = TPM_ALG_SHA256;
3292ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].sizeof_select = 1;
3302ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_select.pcr_selections[0].pcr_select[0] = 2;
3312ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPML_DIGEST pcr_values;
3322ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_values.count = 1;
3332ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  pcr_values.digests[0].size = 5;
3342ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3352ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(pcr_select),
3362ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      SetArgPointee<3>(pcr_values),
3372ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
3382ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ReadPCR(pcr_index, &pcr_value));
3392ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3402ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3412ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRFail) {
3422ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3432ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3442ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3452ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
3462ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ReadPCR(1, &pcr_value));
3472ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
3482ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
3492ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, ReadPCRBadReturn) {
3502ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
3512ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  std::string pcr_value;
3522ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, PCR_ReadSync(_, _, _, _, _))
3532ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
3542ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ReadPCR(1, &pcr_value));
35552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
35652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
357b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSuccess) {
358b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
359b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
360b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
361b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
362b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
363b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
364b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      output_ciphertext);
365b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
366b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
367b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
3688b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
3698b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
370b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
371b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
372b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
3738b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  NiceMock<MockAuthorizationDelegate> delegate;
3748b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_authorization_session_, GetDelegate())
3758b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillOnce(Return(&delegate));
3768b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, &delegate))
377b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
378b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
3798b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricEncrypt(
3808b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      key_handle,
3818b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      TPM_ALG_NULL,
3828b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      TPM_ALG_NULL,
3838b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      plaintext,
3848b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      &mock_authorization_session_,
3858b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      &ciphertext));
386b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(0, ciphertext.compare(output_ciphertext));
387b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
388b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
389b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptFail) {
390b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
391b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
392b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
393b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
394b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
395b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
396b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
3978b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
3988b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
399b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
400b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
401b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4028b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, NULL))
403b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
404b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.AsymmetricEncrypt(key_handle,
405b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      TPM_ALG_NULL,
4069dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
407b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      plaintext,
4088b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                      NULL,
409b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      &ciphertext));
410b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
411b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
412b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptBadParams) {
413b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
414b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
415b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
416b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
417b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
418b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
419b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt | kRestricted;
4208b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, NULL))
421b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
422b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
423b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.AsymmetricEncrypt(key_handle,
424b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             TPM_ALG_RSAES,
4259dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                             TPM_ALG_NULL,
426b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             plaintext,
4278b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                             NULL,
428b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                             &ciphertext));
429b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
4309dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
4319dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptNullSchemeForward) {
4329dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
4339dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
4349dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
4359dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
4369dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
4379dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
4389dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_ciphertext);
4399dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
4409dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
4419dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4428b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4438b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
4449dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
4459dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
4469dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
4479dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4488b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, NULL))
4499dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
4509dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
4519dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
4529dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricEncrypt(key_handle,
4539dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
4549dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
4559dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      plaintext,
4568b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                      NULL,
4579dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      &ciphertext));
4589dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP);
4599dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256);
4609dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
4619dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
4629dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricEncryptSchemeForward) {
4639dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
4649dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
4659dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
4669dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_ciphertext("ciphertext");
4679dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
4689dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
4699dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_ciphertext);
4709dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
4719dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
4729dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
4738b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
4748b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
4759dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
4769dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
4779dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
4789dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
4798b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_EncryptSync(key_handle, _, _, _, _, _, NULL))
4809dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
4819dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
4829dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
4839dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricEncrypt(key_handle,
4849dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_RSAES,
4859dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
4869dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      plaintext,
4878b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                                                      NULL,
4889dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      &ciphertext));
4899dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES);
4909dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
4919dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
492b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSuccess) {
493b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
4942ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  scoped_ptr<AuthorizationSession> session(factory_.GetAuthorizationSession());
495b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
496b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
497b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string output_plaintext("plaintext");
498b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
4992ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password("password");
500b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
501b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      output_plaintext);
502b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
503b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
504b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5058b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5068b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
507b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
508b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
509b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
510b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
511b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
512b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
513b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricDecrypt(key_handle,
514b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      TPM_ALG_NULL,
5159dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                                                      TPM_ALG_NULL,
516b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      ciphertext,
5172ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi                                                      session.get(),
518b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                                                      &plaintext));
519b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_EQ(0, plaintext.compare(output_plaintext));
520b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
521b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
522b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptFail) {
523b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
524b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
525b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string key_name;
526b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
527b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
528b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string password;
529b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
530b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
531b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5328b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5338b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
534b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
535b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
536b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
537b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
538b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
5391ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.AsymmetricDecrypt(
5401ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
5411ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5421ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5431ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
5441ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
5451ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
546b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
547b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
548b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadParams) {
549b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
550b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_HANDLE key_handle;
551b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string key_name;
552b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string plaintext;
553b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string ciphertext;
554b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  std::string password;
555b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM2B_PUBLIC public_area;
556b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
557b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt | kRestricted;
558b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
559b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
560b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
5611ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.AsymmetricDecrypt(
5621ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
5631ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_RSAES,
5641ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
5651ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
5661ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
5671ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
568b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi}
569b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
5702ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptBadSession) {
5712ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
5721ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
5732ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string key_name;
5742ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string plaintext;
5752ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string ciphertext;
5762ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password;
5771ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.AsymmetricDecrypt(
5781ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle, TPM_ALG_RSAES, TPM_ALG_NULL, ciphertext, NULL, &plaintext));
5792ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi}
5802ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi
5819dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptNullSchemeForward) {
5829dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
5839dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
5849dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
5859dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_plaintext("plaintext");
5869dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
5879dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string password;
5889dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
5899dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_plaintext);
5909dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
5919dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
5929dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
5938b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
5948b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
5959dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
5969dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
5979dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
5989dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
5999dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
6009dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
6019dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
6029dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6031ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricDecrypt(
6041ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6051ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6061ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6071ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6081ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
6091ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
6109dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_OAEP);
6119dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.details.oaep.hash_alg, TPM_ALG_SHA256);
6129dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
6139dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
6149dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh SanghiTEST_F(TpmUtilityTest, AsymmetricDecryptSchemeForward) {
6159dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
6169dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM_HANDLE key_handle;
6179dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string plaintext;
6189dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string output_plaintext("plaintext");
6199dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string ciphertext;
6209dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  std::string password;
6219dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA out_message = Make_TPM2B_PUBLIC_KEY_RSA(
6229dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      output_plaintext);
6239dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPM2B_PUBLIC public_area;
6249dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
6259dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
6268b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6278b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
6289dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  TPMT_RSA_DECRYPT scheme;
6299dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
6309dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
6319dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
6329dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, RSA_DecryptSync(key_handle, _, _, _, _, _, _))
6339dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(out_message),
6349dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      SaveArg<3>(&scheme),
6359dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
6361ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.AsymmetricDecrypt(
6371ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle,
6381ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_RSAES,
6391ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      TPM_ALG_NULL,
6401ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      ciphertext,
6411ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
6421ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &plaintext));
6439dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAES);
6449dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi}
6459dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi
646748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSuccess) {
647748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
6482ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  scoped_ptr<AuthorizationSession> session(factory_.GetAuthorizationSession());
649748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
6502ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password("password");
651e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
652748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
653748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 2;
654748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.buffer[0] = 'h';
655748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.buffer[1] = 'i';
656748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
657748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
658748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
659748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
6608b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6618b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
662748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
663748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
664748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
665748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
666748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
667748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
668748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Sign(key_handle,
669748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
670748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
671748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
6722ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi                                         session.get(),
673748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
674748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(0, signature.compare("hi"));
675748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
676748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
677748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignFail) {
678748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
679748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
680748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
681e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
682748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
683748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
684748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
685748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
6868b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
6878b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
688748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
689748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
690748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
691748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
692748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
693748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Sign(key_handle,
694748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
695748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
696748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
6971ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                         &mock_authorization_session_,
698748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
699748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
700748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
701748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams1) {
702748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
703748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
704748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
705e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
706748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
707748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
708748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
709748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign | kRestricted;
710748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
711748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
712748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
713748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Sign(key_handle,
714748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_RSAPSS,
715748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_NULL,
716748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                digest,
7171ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                &mock_authorization_session_,
718748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                &signature));
719748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
720748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
7212ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh SanghiTEST_F(TpmUtilityTest, SignBadAuthorizationSession) {
7222ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
7231ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  TPM_HANDLE key_handle = TPM_RH_FIRST;
7242ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string password;
7252ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string digest(32, 'a');
7262ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  std::string signature;
7271ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.Sign(key_handle,
7281ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   TPM_ALG_RSAPSS,
7291ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   TPM_ALG_NULL,
7301ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   digest,
7311ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   NULL,
7321ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                   &signature));
7332ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi}
7342ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi
735748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams2) {
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 = kDecrypt;
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
755748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams3) {
756748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
757748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
758748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
759e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
760748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
761748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
762748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_ECC;
763748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
764748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
765748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
766748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
767748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Sign(key_handle,
768748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_RSAPSS,
769748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_NULL,
770748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                digest,
7711ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                &mock_authorization_session_,
772748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                &signature));
773748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
774748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
775748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams4) {
776748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
777748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
778748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
779e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
780748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
781748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
782748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
783748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
784748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
785748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
786748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_FAILURE)));
787748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Sign(key_handle,
788748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_RSAPSS,
789748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
790748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
7911ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                         &mock_authorization_session_,
792748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
793748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
794748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
795748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignBadParams5) {
796748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
797748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle = 0;
798748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
799e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
800748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
801748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Sign(key_handle,
802748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_AES,
803748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                TPM_ALG_NULL,
804748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                digest,
8051ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                                &mock_authorization_session_,
806748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                &signature));
807748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
808748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
809748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
810748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignNullSchemeForward) {
811748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
812748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
813748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
814e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
815748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
816748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 0;
817748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
818748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
819748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIG_SCHEME scheme;
820748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
821748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
8228b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
8238b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
824748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
825748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
826748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
827748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
828748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
829748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      SaveArg<3>(&scheme),
830748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
831748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Sign(key_handle,
832748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
833748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_NULL,
834748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
8351ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                         &mock_authorization_session_,
836748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
837748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSASSA);
838748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.details.rsassa.hash_alg, TPM_ALG_SHA256);
839748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
840748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
841748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, SignSchemeForward) {
842748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
843748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
844748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string password;
845e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(64, 'a');
846748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_out;
847748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  signature_out.signature.rsassa.sig.size = 0;
848748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
849748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
850748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIG_SCHEME scheme;
851748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
852748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
8538b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
8548b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
855748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
856748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
857748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
858748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, SignSync(key_handle, _, _, _, _, _, _))
859748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<5>(signature_out),
860748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      SaveArg<3>(&scheme),
861748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
862748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Sign(key_handle,
863748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         TPM_ALG_RSAPSS,
864887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi                                         TPM_ALG_SHA1,
865748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         digest,
8661ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi                                         &mock_authorization_session_,
867748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                         &signature));
868748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(scheme.scheme, TPM_ALG_RSAPSS);
869887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  EXPECT_EQ(scheme.details.rsapss.hash_alg, TPM_ALG_SHA1);
870748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
871748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
872748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySuccess) {
873748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
874748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
875e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
876748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
877748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
878748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
879748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
880748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
881748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
882748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
883748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
884748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
885748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Verify(key_handle,
886748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
887748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
888748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
889748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
890748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
891748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
892748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyFail) {
893748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
894748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
895e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
896748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
897748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
898748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
899748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
900748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
901748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
902748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
903748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
904748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
905748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Verify(key_handle,
906748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
907748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
908748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
909748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
910748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
911748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
912748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams1) {
913748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
914748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
915e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
916748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
917748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
918748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
919748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign | kRestricted;
920748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
921748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
922748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
923748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Verify(key_handle,
924748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
925748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
926748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  digest,
927748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  signature));
928748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
929748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
930748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams2) {
931748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
932748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
933e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
934748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
935748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
936748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
937748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kDecrypt;
938748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
939748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
940748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
941748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Verify(key_handle,
942748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
943748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
944748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  digest,
945748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  signature));
946748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
947748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
948748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams3) {
949748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
950748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
951e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
952748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
953748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
954748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_ECC;
955748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
956748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
957748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
958748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
959748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Verify(key_handle,
960748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
961748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
962748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  digest,
963748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  signature));
964748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
965748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
966748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams4) {
967748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
968748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
969e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
970748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
971748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
972748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
973748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
974748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
975748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
976748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_FAILURE)));
977748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.Verify(key_handle,
978748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
979748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
980748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
981748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
982748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
983748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
984748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyBadParams5) {
985748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
986748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
987e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
988748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
989748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
990748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
991748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
992748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
993748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
994748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
995748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.Verify(key_handle,
996748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_AES,
997748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  TPM_ALG_NULL,
998748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  digest,
999748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                                  signature));
1000748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1001748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1002748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifyNullSchemeForward) {
1003748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
1004748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1005e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(32, 'a');
1006748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1007748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1008748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_in;
1009748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1010748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1011748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1012748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1013748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1014748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
1015748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&signature_in),
1016748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1017748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Verify(key_handle,
1018748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
1019748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_NULL,
1020748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
1021748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
1022748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSASSA);
1023748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA256);
1024748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1025748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
1026748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh SanghiTEST_F(TpmUtilityTest, VerifySchemeForward) {
1027748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
1028748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_HANDLE key_handle;
1029e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi  std::string digest(64, 'a');
1030748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  std::string signature;
1031748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM2B_PUBLIC public_area;
1032748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPMT_SIGNATURE signature_in;
1033748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
1034748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  public_area.public_area.object_attributes = kSign;
1035748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
1036748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
1037748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
1038748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, VerifySignatureSync(key_handle, _, _, _, _, _))
1039748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&signature_in),
1040748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1041748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.Verify(key_handle,
1042748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           TPM_ALG_RSAPSS,
1043887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi                                           TPM_ALG_SHA1,
1044748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           digest,
1045748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                                           signature));
1046748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  EXPECT_EQ(signature_in.sig_alg, TPM_ALG_RSAPSS);
1047887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi  EXPECT_EQ(signature_in.signature.rsassa.hash, TPM_ALG_SHA1);
1048748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi}
1049748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
105033ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataSuccess) {
105133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
105233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
105333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
10541ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ChangeKeyAuthorizationData(
10551ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi    key_handle, new_password, &mock_authorization_session_, NULL));
105633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
105733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
105833ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataKeyNameFail) {
105933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
106033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
106133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string old_password;
106233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
106333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(key_handle, _, _, _, _, _))
106433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
10651ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ChangeKeyAuthorizationData(
10661ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle, new_password, &mock_authorization_session_, NULL));
106733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
106833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
106933ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataFailure) {
107033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
107133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
107233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
107333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ObjectChangeAuthSync(key_handle, _, _, _, _, _, _))
107433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
10751ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ChangeKeyAuthorizationData(
10761ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      key_handle, new_password, &mock_authorization_session_, NULL));
107733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
107833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
107933ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ChangeAuthDataWithReturnSuccess) {
108033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
108133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_HANDLE key_handle = 1;
108233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string new_password;
108333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string key_blob;
10848b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM2B_PUBLIC public_area;
10858b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.type = TPM_ALG_RSA;
10868b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.auth_policy.size = 0;
10878b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  public_area.public_area.unique.rsa.size = 0;
10888b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
10898b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<2>(public_area),
10908b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
10911ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ChangeKeyAuthorizationData(
10921ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi    key_handle, new_password, &mock_authorization_session_, &key_blob));
109333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
109433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
109533ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccess) {
109633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
109733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
109833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
109933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
110033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password("password");
110133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string key_blob;
110233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_DATA encryption_key;
110333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_PUBLIC public_data;
110433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_PRIVATE private_data;
110533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
110633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&encryption_key),
110733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      SaveArg<3>(&public_data),
110833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      SaveArg<4>(&private_data),
110933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
111033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ImportRSAKey(
111133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
11121ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
11131ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
11141ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
11151ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
11161ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
11171ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &key_blob));
111833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  // Validate that the public area was properly constructed.
111933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.parameters.rsa_detail.key_bits,
112033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            modulus.size() * 8);
112133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.parameters.rsa_detail.exponent,
112233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            public_exponent);
112333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(public_data.public_area.unique.rsa.size, modulus.size());
112433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(public_data.public_area.unique.rsa.buffer,
112533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      modulus.data(), modulus.size()));
112633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  // Validate the private struct construction.
112733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(kAesKeySize, encryption_key.size);
112833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_KEY key;
112933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_set_encrypt_key(encryption_key.buffer, kAesKeySize * 8, &key);
113033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  unsigned char iv[MAX_AES_BLOCK_SIZE_BYTES] = {0};
113133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  int iv_in = 0;
113233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string unencrypted_private(private_data.size, 0);
113333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  AES_cfb128_encrypt(
113433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    reinterpret_cast<const unsigned char*>(private_data.buffer),
113533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    reinterpret_cast<unsigned char*>(string_as_array(&unencrypted_private)),
113633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    private_data.size, &key, iv, &iv_in, AES_DECRYPT);
113733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_DIGEST inner_integrity;
113833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_DIGEST(&unencrypted_private,
113933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                               &inner_integrity, NULL));
114033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string object_name;
114133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ComputeKeyName(public_data.public_area,
114233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                                   &object_name));
114333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string integrity_value = crypto::SHA256HashString(unencrypted_private +
114433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                                         object_name);
114533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(integrity_value.size(), inner_integrity.size);
114633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(inner_integrity.buffer,
114733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      integrity_value.data(),
114833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      inner_integrity.size));
114933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM2B_SENSITIVE sensitive_data;
115033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, Parse_TPM2B_SENSITIVE(&unencrypted_private,
115133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                                  &sensitive_data, NULL));
115233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(sensitive_data.sensitive_area.auth_value.size, password.size());
115333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.auth_value.buffer,
115433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      password.data(), password.size()));
115533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(sensitive_data.sensitive_area.sensitive.rsa.size,
115633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi            prime_factor.size());
115733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(0, memcmp(sensitive_data.sensitive_area.sensitive.rsa.buffer,
115833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      prime_factor.data(), prime_factor.size()));
115933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
116033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
116133ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeySuccessWithNoBlob) {
116233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
116333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
116433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
116533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
116633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
116733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
116833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
116933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ImportRSAKey(
117033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
11711ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
11721ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
11731ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
11741ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
11751ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
11761ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      NULL));
117733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
117833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
117933ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyParentNameFail) {
118033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
118133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  uint32_t public_exponent = 0x10001;
118233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus(256, 'a');
118333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor(128, 'b');
118433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
118533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(_, _, _, _, _, _))
118633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
118733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ImportRSAKey(
118833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
11891ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
11901ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      public_exponent,
11911ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
11921ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
11931ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
11941ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      NULL));
119533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
119633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
119733ca033c9665b8496f3491037403ae1574a54227Utkarsh SanghiTEST_F(TpmUtilityTest, ImportRSAKeyFail) {
119833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    TpmUtilityImpl utility(factory_);
119933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string modulus;
120033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string prime_factor;
120133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  std::string password;
120233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, ImportSync(_, _, _, _, _, _, _, _, _))
120333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
120433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ImportRSAKey(
120533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
12061ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      modulus,
12071ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      0x10001,
12081ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      prime_factor,
12091ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      password,
12101ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
12111ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      NULL));
121233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi}
121333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
12146465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeyDecryptSuccess) {
121582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
12162ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi  scoped_ptr<AuthorizationSession> session(factory_.GetAuthorizationSession());
121782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
121882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
121982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
122082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
122182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
122282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
122382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
12246465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateAndLoadRSAKey(
122582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
122682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
12272ff7e22ba2ef3bb7ce2747b1b9706dd242ef9284Utkarsh Sanghi      session.get(),
12286465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
12296465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
123082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt);
123182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, 0);
123282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
1233e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi            TPM_ALG_NULL);
123482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
123582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
12366465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeySignSuccess) {
123782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
123882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
123982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
124082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
124182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
124282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
124382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
124482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
12456465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateAndLoadRSAKey(
124682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kSignKey,
124782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
12481ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
12496465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
12506465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
125182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign);
125282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, 0);
125382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
1254e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi            TPM_ALG_NULL);
125582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
125682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
12576465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeyLegacySuccess) {
125882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
125982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
126082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM2B_PUBLIC public_area;
126182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
126282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(DoAll(SaveArg<2>(&public_area),
126382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
126482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
126582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
12666465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateAndLoadRSAKey(
126782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptAndSignKey,
126882b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
12691ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
12706465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
12716465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
127282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kDecrypt, kDecrypt);
127382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.object_attributes & kSign, kSign);
127482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_EQ(public_area.public_area.parameters.rsa_detail.scheme.scheme,
127582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi            TPM_ALG_NULL);
127682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
127782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
12786465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeyFail1) {
127982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
128082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
128182b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
128282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
12836465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateAndLoadRSAKey(
128482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
128582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
12861ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
12876465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
12886465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
128982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
129082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
12916465502c740d2599d95e09232c744f6d2ed54505Utkarsh SanghiTEST_F(TpmUtilityTest, CreateAndLoadRSAKeyFail2) {
129282b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
129382b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  TPM_HANDLE key_handle;
129482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
129582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
129682b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
129782b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
12986465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateAndLoadRSAKey(
129982b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      TpmUtility::AsymmetricKeyUsage::kDecryptKey,
130082b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi      "password",
13011ef82e4a52abc91d0e8db12500c2da0d8c21f62cUtkarsh Sanghi      &mock_authorization_session_,
13026465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      &key_handle,
13036465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi      NULL));
130482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi}
130582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
130639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceSuccess) {
130739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
130839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 59;
130939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
131039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length  = 256;
131139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM2B_NV_PUBLIC public_data;
131239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _))
131339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(DoAll(SaveArg<3>(&public_data),
131439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
131539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
131639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DefineNVSpace(index, length, &mock_authorization_session_));
131739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.nv_index, nvram_index);
131839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.name_alg, TPM_ALG_SHA256);
131939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.attributes,
132039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            TPMA_NV_OWNERWRITE | TPMA_NV_WRITEDEFINE | TPMA_NV_AUTHREAD);
132139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(public_data.nv_public.data_size, length);
132239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
132339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
132439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadLength) {
132539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
132639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t bad_length = 3000;
132739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE,
132839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DefineNVSpace(0, bad_length, &mock_authorization_session_));
132939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
133039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
133139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadIndex) {
133239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
133339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<29;
133439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
133539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DefineNVSpace(bad_index, 2, &mock_authorization_session_));
133639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
133739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
133839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceBadSession) {
133939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
134039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.DefineNVSpace(0, 2, NULL));
134139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
134239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
134339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DefineNVSpaceFail) {
134439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
134539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 59;
134639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length  = 256;
134739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_DefineSpaceSync(TPM_RH_OWNER, _, _, _, _))
134839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
134939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
135039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DefineNVSpace(index, length, &mock_authorization_session_));
135139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
135239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
135339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceSuccess) {
135439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
135539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
135639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
135739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
135839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _));
135939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
136039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DestroyNVSpace(index, &mock_authorization_session_));
136139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
136239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
136339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadIndex) {
136439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
136539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<29;
136639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
136739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DestroyNVSpace(bad_index, &mock_authorization_session_));
136839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
136939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
137039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceBadSession) {
137139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
137239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.DestroyNVSpace(3, NULL));
137339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
137439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
137539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, DestroyNVSpaceFailure) {
137639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
137739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
137839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
137939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
138039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_UndefineSpaceSync(TPM_RH_OWNER, _, nvram_index, _, _))
138139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
138239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
138339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.DestroyNVSpace(index, &mock_authorization_session_));
138439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
138539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
138639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceSuccess) {
138739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
138839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
138939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
139039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_WriteLockSync(nvram_index, _, nvram_index, _, _))
139139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
139239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS,
139339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.LockNVSpace(index, &mock_authorization_session_));
139439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
139539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
139639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadIndex) {
139739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
139839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
139939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER,
140039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.LockNVSpace(bad_index, &mock_authorization_session_));
140139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
140239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
140339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceBadSession) {
140439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
140539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.LockNVSpace(52, NULL));
140639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
140739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
140839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, LockNVSpaceFailure) {
140939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
141039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
141139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
141239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_WriteLockSync(nvram_index, _, nvram_index, _, _))
141339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
141439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE,
141539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.LockNVSpace(index, &mock_authorization_session_));
141639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
141739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
141839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceSuccess) {
141939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
142039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
142139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
142239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
142339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
142439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _))
142539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
142639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.WriteNVSpace(
142739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, offset, "", &mock_authorization_session_));
142839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
142939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
143039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSize) {
143139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
143239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
143339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data(1025, 0);
143439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE, utility.WriteNVSpace(
143539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, 0, nvram_data, &mock_authorization_session_));
143639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
143739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
143839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadIndex) {
143939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
144039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
144139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.WriteNVSpace(
144239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      bad_index, 0, "", &mock_authorization_session_));
144339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
144439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
144539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceBadSessions) {
144639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
144739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS, utility.WriteNVSpace(53, 0, "", NULL));
144839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
144939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
145039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, WriteNVSpaceFailure) {
145139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
145239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
145339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
145439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
145539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
145639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_WriteSync(TPM_RH_OWNER, _, nvram_index, _, _, offset, _))
145739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
145839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.WriteNVSpace(
145939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, offset, "", &mock_authorization_session_));
146039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
146139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
146239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceSuccess) {
146339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
146439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
146539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
146639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nv_index = NV_INDEX_FIRST + index;
146739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 24;
146839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
146939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
147039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _))
147139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
147239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.ReadNVSpace(
147339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, offset, length, &nvram_data, &mock_authorization_session_));
147439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
147539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
147639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadReadLength) {
147739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
147839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 1025;
147939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
148039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_SIZE, utility.ReadNVSpace(
148139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      52, 0, length, &nvram_data, &mock_authorization_session_));
148239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
148339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
148439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadIndex) {
148539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
148639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t bad_index = 1<<24;
148739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
148839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_BAD_PARAMETER, utility.ReadNVSpace(
148939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      bad_index, 0, 5, &nvram_data, &mock_authorization_session_));
149039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
149139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
149239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceBadSession) {
149339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
149439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
149539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(SAPI_RC_INVALID_SESSIONS,
149639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi            utility.ReadNVSpace(53, 0, 5, &nvram_data, NULL));
149739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
149839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
149939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, ReadNVSpaceFailure) {
150039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
150139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
150239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t offset = 5;
150339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nv_index = NV_INDEX_FIRST + index;
150439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  size_t length = 24;
150539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string nvram_data;
150639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_,
150739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi              NV_ReadSync(nv_index, _, nv_index, _, length, offset, _, _))
150839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
150939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.ReadNVSpace(
151039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      index, offset, length, &nvram_data, &mock_authorization_session_));
151139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
151239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
151339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameSuccess) {
151439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
151539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
151639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
151739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string name;
151839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _))
151939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
152039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.GetNVSpaceName(index, &name));
152139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
152239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
152339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpaceNameFailure) {
152439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
152539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
152639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  std::string name;
152739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
152839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
152939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.GetNVSpaceName(index, &name));
153039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
153139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
153239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaSuccess) {
153339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
153439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
153539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t nvram_index = NV_INDEX_FIRST + index;
153639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
153739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(nvram_index, _, _, _, _))
153839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
153939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.GetNVSpacePublicArea(index, &public_area));
154039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
154139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
154239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh SanghiTEST_F(TpmUtilityTest, GetNVSpacePublicAreaFailure) {
154339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TpmUtilityImpl utility(factory_);
154439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  uint32_t index = 53;
154539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPMS_NV_PUBLIC public_area;
154639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, NV_ReadPublicSync(_, _, _, _, _))
154739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
154839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.GetNVSpacePublicArea(index, &public_area));
154939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi}
155039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
15512ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, RootKeysSuccess) {
15522ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
15532ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateStorageRootKeys("password"));
15542ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
15552ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
15562ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, RootKeysHandleConsistency) {
15572ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
15582ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_HANDLE test_handle = 42;
15592ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _))
15602ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<3>(test_handle),
15612ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
15622ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _))
15632ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
15642ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateStorageRootKeys("password"));
15652ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
15662ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
15672ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, RootKeysCreateFailure) {
15682ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
15692ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreatePrimarySyncShort(_, _, _, _, _, _, _, _, _, _))
15702ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
15712ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateStorageRootKeys("password"));
15722ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
15732ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
15742ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, RootKeysPersistFailure) {
15752ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
15762ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _))
15772ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
15782ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateStorageRootKeys("password"));
15792ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
15802ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
15812ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeySuccess) {
15822ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
15832ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateSaltingKey("password"));
15842ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
15852ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
15862ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyConsistency) {
15872ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
15882ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_HANDLE test_handle = 42;
15892ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
15902ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(DoAll(SetArgPointee<4>(test_handle),
15912ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                            Return(TPM_RC_SUCCESS)));
15922ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, test_handle, _, _, _))
15932ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
15942ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, utility.CreateSaltingKey("password"));
15952ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
15962ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
15972ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyCreateFailure) {
15982ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
15992ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, CreateSyncShort(_, _, _, _, _, _, _, _, _, _))
16002ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
16012ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateSaltingKey("password"));
16022ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16032ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16042ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyLoadFailure) {
16052ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16062ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, LoadSync(_, _, _, _, _, _, _))
16072ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
16082ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateSaltingKey("password"));
16092ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16102ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
16112ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh SanghiTEST_F(TpmUtilityTest, SaltingKeyPersistFailure) {
16122ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TpmUtilityImpl utility(factory_);
16132ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_CALL(mock_tpm_, EvictControlSync(_, _, _, _, _, _))
16142ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
16152ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, utility.CreateSaltingKey("password"));
16162ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi}
16172ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
1618c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}  // namespace trunks
1619