1bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
2bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Copyright (C) 2014 The Android Open Source Project
3bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
4bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
5bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// you may not use this file except in compliance with the License.
6bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// You may obtain a copy of the License at
7bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
8bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
9bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
10bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
11bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
12bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// See the License for the specific language governing permissions and
14bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// limitations under the License.
15bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
16c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
17c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/trunks_factory_for_test.h"
18c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
1930c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez#include <memory>
2030c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez
2130c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez#include <base/memory/ptr_util.h>
22c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include <gmock/gmock.h>
23c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
24c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/authorization_delegate.h"
250ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi#include "trunks/blob_parser.h"
26ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/hmac_session.h"
270ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi#include "trunks/mock_blob_parser.h"
28ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/mock_hmac_session.h"
29ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/mock_policy_session.h"
30ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/mock_session_manager.h"
31c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/mock_tpm.h"
32c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/mock_tpm_state.h"
3303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/mock_tpm_utility.h"
34ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/policy_session.h"
35ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/session_manager.h"
36c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/tpm_generated.h"
37c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/tpm_state.h"
38c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn#include "trunks/tpm_utility.h"
39c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
40c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnusing testing::NiceMock;
41c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
42c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnnamespace trunks {
43c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
44c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn// Forwards all calls to a target instance.
45c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnclass TpmStateForwarder : public TpmState {
46c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn public:
47c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  explicit TpmStateForwarder(TpmState* target) : target_(target) {}
480ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  ~TpmStateForwarder() override = default;
49c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
504dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  TPM_RC Initialize() override { return target_->Initialize(); }
51c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
524dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  bool IsOwnerPasswordSet() override { return target_->IsOwnerPasswordSet(); }
5352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
5452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  bool IsEndorsementPasswordSet() override {
5552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn    return target_->IsEndorsementPasswordSet();
5652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  }
5752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
5852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  bool IsLockoutPasswordSet() override {
5952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn    return target_->IsLockoutPasswordSet();
6052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  }
6152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
624dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  bool IsOwned() override { return target_->IsOwned(); }
63bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi
644dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  bool IsInLockout() override { return target_->IsInLockout(); }
65c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
66c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  bool IsPlatformHierarchyEnabled() override {
67c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    return target_->IsPlatformHierarchyEnabled();
68c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  }
69c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
70bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi  bool IsStorageHierarchyEnabled() override {
71bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi    return target_->IsStorageHierarchyEnabled();
72bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi  }
73bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi
74bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi  bool IsEndorsementHierarchyEnabled() override {
75bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi    return target_->IsEndorsementHierarchyEnabled();
76bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi  }
77bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi
784dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  bool IsEnabled() override { return target_->IsEnabled(); }
79bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi
804dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  bool WasShutdownOrderly() override { return target_->WasShutdownOrderly(); }
81c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
824dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  bool IsRSASupported() override { return target_->IsRSASupported(); }
8366d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
844dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  bool IsECCSupported() override { return target_->IsECCSupported(); }
8566d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi
864dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  uint32_t GetLockoutCounter() override { return target_->GetLockoutCounter(); }
8709176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi
8809176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi  uint32_t GetLockoutThreshold() override {
8909176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi    return target_->GetLockoutThreshold();
9009176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi  }
9109176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi
9209176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi  uint32_t GetLockoutInterval() override {
9309176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi    return target_->GetLockoutInterval();
9409176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi  }
9509176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi
9609176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi  uint32_t GetLockoutRecovery() override {
9709176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi    return target_->GetLockoutRecovery();
9809176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi  }
9909176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi
100ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn  uint32_t GetMaxNVSize() override { return target_->GetMaxNVSize(); }
101ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn
102ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn  bool GetTpmProperty(TPM_PT property, uint32_t* value) override {
103ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn    return target_->GetTpmProperty(property, value);
104ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn  }
105ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn
106ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn  bool GetAlgorithmProperties(TPM_ALG_ID algorithm,
107ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn                              TPMA_ALGORITHM* properties) override {
108ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn    return target_->GetAlgorithmProperties(algorithm, properties);
109ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn  }
110ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn
111c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn private:
112c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  TpmState* target_;
113c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn};
114c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
115c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn// Forwards all calls to a target instance.
11603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahnclass TpmUtilityForwarder : public TpmUtility {
11703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn public:
11803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  explicit TpmUtilityForwarder(TpmUtility* target) : target_(target) {}
1190ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  ~TpmUtilityForwarder() override = default;
12003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
1214dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  TPM_RC Startup() override { return target_->Startup(); }
12203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
1234dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  TPM_RC Clear() override { return target_->Clear(); }
124d75dcae8a010d1ced7554dd25a440bee350a2d06Utkarsh Sanghi
1254dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  void Shutdown() override { return target_->Shutdown(); }
126e8b9a556d4561617747fed4ee5ced70fce9a4392Utkarsh Sanghi
1274dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  TPM_RC InitializeTpm() override { return target_->InitializeTpm(); }
12803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
129e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  TPM_RC AllocatePCR(const std::string& platform_password) override {
130e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi    return target_->AllocatePCR(platform_password);
131e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi  }
132e7eb2bf306af6e8408cd77125861542d19e5ec6dUtkarsh Sanghi
1332ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  TPM_RC TakeOwnership(const std::string& owner_password,
1342ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                       const std::string& endorsement_password,
1352ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                       const std::string& lockout_password) override {
1364dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->TakeOwnership(owner_password, endorsement_password,
1372ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi                                  lockout_password);
1382ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi  }
1392ee32a9d61896f544d87ecee24dc25cc33c9ebb3Utkarsh Sanghi
1408b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM_RC StirRandom(const std::string& entropy_data,
1415d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                    AuthorizationDelegate* delegate) override {
1425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    return target_->StirRandom(entropy_data, delegate);
14303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  }
14403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
1458b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM_RC GenerateRandom(size_t num_bytes,
1465d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                        AuthorizationDelegate* delegate,
1478b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                        std::string* random_data) override {
1485d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    return target_->GenerateRandom(num_bytes, delegate, random_data);
14903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  }
15003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
1518b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi  TPM_RC ExtendPCR(int pcr_index,
1528b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                   const std::string& extend_data,
1535d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                   AuthorizationDelegate* delegate) override {
1545d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    return target_->ExtendPCR(pcr_index, extend_data, delegate);
155579dd8a934c684f2e2a34d9aa2f67953320428acUtkarsh Sanghi  }
156579dd8a934c684f2e2a34d9aa2f67953320428acUtkarsh Sanghi
157579dd8a934c684f2e2a34d9aa2f67953320428acUtkarsh Sanghi  TPM_RC ReadPCR(int pcr_index, std::string* pcr_value) override {
158579dd8a934c684f2e2a34d9aa2f67953320428acUtkarsh Sanghi    return target_->ReadPCR(pcr_index, pcr_value);
159579dd8a934c684f2e2a34d9aa2f67953320428acUtkarsh Sanghi  }
160579dd8a934c684f2e2a34d9aa2f67953320428acUtkarsh Sanghi
161b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_RC AsymmetricEncrypt(TPM_HANDLE key_handle,
162b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                           TPM_ALG_ID scheme,
1639dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                           TPM_ALG_ID hash_alg,
164b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                           const std::string& plaintext,
1655d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                           AuthorizationDelegate* delegate,
166748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                           std::string* ciphertext) override {
1674dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->AsymmetricEncrypt(key_handle, scheme, hash_alg, plaintext,
1684dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                      delegate, ciphertext);
169b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  }
170b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
171b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  TPM_RC AsymmetricDecrypt(TPM_HANDLE key_handle,
172b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                           TPM_ALG_ID scheme,
1739dc77fecdb2446da134b9b2901173bb4dcf5e5e4Utkarsh Sanghi                           TPM_ALG_ID hash_alg,
174b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi                           const std::string& ciphertext,
1755d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                           AuthorizationDelegate* delegate,
176748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                           std::string* plaintext) override {
1774dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->AsymmetricDecrypt(key_handle, scheme, hash_alg, ciphertext,
1784dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                      delegate, plaintext);
179b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi  }
180b3ba5e0b579a5462c7137cf49b49cc9a78d87944Utkarsh Sanghi
181748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_RC Sign(TPM_HANDLE key_handle,
182748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi              TPM_ALG_ID scheme,
183748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi              TPM_ALG_ID hash_alg,
184887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi              const std::string& plaintext,
1855d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi              AuthorizationDelegate* delegate,
186748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi              std::string* signature) override {
1874dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->Sign(key_handle, scheme, hash_alg, plaintext, delegate,
188748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                         signature);
189748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  }
190748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
191748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  TPM_RC Verify(TPM_HANDLE key_handle,
192748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                TPM_ALG_ID scheme,
193748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi                TPM_ALG_ID hash_alg,
194887ccbcc4db5fa0b5221018296aa49b86a5ac26fUtkarsh Sanghi                const std::string& plaintext,
1956f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                const std::string& signature,
1966f68562edf5f66006c08de24d558732d6a389631Utkarsh Sanghi                AuthorizationDelegate* delegate) override {
1974dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->Verify(key_handle, scheme, hash_alg, plaintext, signature,
1984dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                           delegate);
199748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi  }
200748f7d68284813a78b883f9c05988f6de535fc8aUtkarsh Sanghi
201fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  TPM_RC CertifyCreation(TPM_HANDLE key_handle,
202fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi                         const std::string& creation_blob) override {
203fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi    return target_->CertifyCreation(key_handle, creation_blob);
204fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi  }
205fded77411da5ef66dff7389e49f40900c19d510cUtkarsh Sanghi
20633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_RC ChangeKeyAuthorizationData(TPM_HANDLE key_handle,
20733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                    const std::string& new_password,
2085d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                    AuthorizationDelegate* delegate,
20933ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                                    std::string* key_blob) override {
2104dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->ChangeKeyAuthorizationData(key_handle, new_password,
2114dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                               delegate, key_blob);
21233ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  }
21333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
21433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  TPM_RC ImportRSAKey(AsymmetricKeyUsage key_type,
21533ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      const std::string& modulus,
21633ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      uint32_t public_exponent,
21733ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      const std::string& prime_factor,
21833ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      const std::string& password,
2195d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                      AuthorizationDelegate* delegate,
22033ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi                      std::string* key_blob) override {
22133ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi    return target_->ImportRSAKey(key_type, modulus, public_exponent,
2225d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                                 prime_factor, password, delegate, key_blob);
22333ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi  }
22433ca033c9665b8496f3491037403ae1574a54227Utkarsh Sanghi
2256465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  TPM_RC CreateRSAKeyPair(AsymmetricKeyUsage key_type,
2266465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi                          int modulus_bits,
2276465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi                          uint32_t public_exponent,
2286465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi                          const std::string& password,
2296ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi                          const std::string& policy_digest,
2306ea135676cf391fac45b0051242ccac935c8bc62Utkarsh Sanghi                          bool use_only_policy_authorization,
2310ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                          int creation_pcr_index,
2325d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                          AuthorizationDelegate* delegate,
233a5a2f2ea49e0085bf8d7f6f2b6e7cd624d710c01Utkarsh Sanghi                          std::string* key_blob,
234a5a2f2ea49e0085bf8d7f6f2b6e7cd624d710c01Utkarsh Sanghi                          std::string* creation_blob) override {
2354dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->CreateRSAKeyPair(
2364dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn        key_type, modulus_bits, public_exponent, password, policy_digest,
2374dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn        use_only_policy_authorization, creation_pcr_index, delegate, key_blob,
2384dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn        creation_blob);
2396465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  }
2406465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi
2416465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  TPM_RC LoadKey(const std::string& key_blob,
2425d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                 AuthorizationDelegate* delegate,
2436465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi                 TPM_HANDLE* key_handle) override {
2445d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    return target_->LoadKey(key_blob, delegate, key_handle);
2456465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  }
2466465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi
2476465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  TPM_RC GetKeyName(TPM_HANDLE handle, std::string* name) override {
2486465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi    return target_->GetKeyName(handle, name);
2496465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  }
2506465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi
2516465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi  TPM_RC GetKeyPublicArea(TPM_HANDLE handle,
2528b2bf63478b292937f85b3b0e215882af461a999Utkarsh Sanghi                          TPMT_PUBLIC* public_data) override {
2536465502c740d2599d95e09232c744f6d2ed54505Utkarsh Sanghi    return target_->GetKeyPublicArea(handle, public_data);
25482b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi  }
25582b03cf80cbe7ab5d5edb2cb46d245721e993a68Utkarsh Sanghi
256a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPM_RC SealData(const std::string& data_to_seal,
257a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                  const std::string& policy_digest,
258a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                  AuthorizationDelegate* delegate,
259a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                  std::string* sealed_data) override {
2604dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->SealData(data_to_seal, policy_digest, delegate,
2614dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                             sealed_data);
262a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  }
263a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
264a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPM_RC UnsealData(const std::string& sealed_data,
265a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                    AuthorizationDelegate* delegate,
266a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                    std::string* unsealed_data) override {
267a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi    return target_->UnsealData(sealed_data, delegate, unsealed_data);
268a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  }
269a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
270a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPM_RC StartSession(HmacSession* session) override {
271a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi    return target_->StartSession(session);
272a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  }
273a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
274a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  TPM_RC GetPolicyDigestForPcrValue(int pcr_index,
275a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                                    const std::string& pcr_value,
276a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                                    std::string* policy_digest) override {
277a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi    return target_->GetPolicyDigestForPcrValue(pcr_index, pcr_value,
278a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi                                               policy_digest);
279a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi  }
280a6e332ee7f5fe52c1291d961dbeda975c8272044Utkarsh Sanghi
28139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM_RC DefineNVSpace(uint32_t index,
28239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                       size_t num_bytes,
283b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                       TPMA_NV attributes,
284b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                       const std::string& authorization_value,
285b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                       const std::string& policy_digest,
2865d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                       AuthorizationDelegate* delegate) override {
287b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    return target_->DefineNVSpace(index, num_bytes, attributes,
288b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                                  authorization_value, policy_digest, delegate);
28939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  }
29039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
29139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM_RC DestroyNVSpace(uint32_t index,
2925d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                        AuthorizationDelegate* delegate) override {
2935d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi    return target_->DestroyNVSpace(index, delegate);
29439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  }
29539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
296b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  TPM_RC LockNVSpace(uint32_t index,
297b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                     bool lock_read,
298b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                     bool lock_write,
299b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                     bool using_owner_authorization,
300b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                     AuthorizationDelegate* delegate) override {
301b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    return target_->LockNVSpace(index, lock_read, lock_write,
302b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                                using_owner_authorization, delegate);
30339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  }
30439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
30539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM_RC WriteNVSpace(uint32_t index,
30639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                      uint32_t offset,
30739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                      const std::string& nvram_data,
308b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                      bool using_owner_authorization,
309b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                      bool extend,
3105d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                      AuthorizationDelegate* delegate) override {
311b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    return target_->WriteNVSpace(index, offset, nvram_data,
312b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                                 using_owner_authorization, extend, delegate);
31339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  }
31439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
31539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM_RC ReadNVSpace(uint32_t index,
31639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                     uint32_t offset,
31739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                     size_t num_bytes,
318b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                     bool using_owner_authorization,
31939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                     std::string* nvram_data,
3205d3b9451ae2e912aefed0669dd50b2a777ea0ab2Utkarsh Sanghi                     AuthorizationDelegate* delegate) override {
321b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    return target_->ReadNVSpace(index, offset, num_bytes,
322b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                                using_owner_authorization, nvram_data,
323b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                                delegate);
32439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  }
32539dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
32639dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM_RC GetNVSpaceName(uint32_t index, std::string* name) override {
32739dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi    return target_->GetNVSpaceName(index, name);
32839dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  }
32939dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
33039dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  TPM_RC GetNVSpacePublicArea(uint32_t index,
33139dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi                              TPMS_NV_PUBLIC* public_data) override {
33239dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi    return target_->GetNVSpacePublicArea(index, public_data);
33339dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi  }
33439dd58452d7fe3ebe93490a6239a76b385bd676dUtkarsh Sanghi
335b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  TPM_RC ListNVSpaces(std::vector<uint32_t>* index_list) override {
336b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    return target_->ListNVSpaces(index_list);
337b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  }
338b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn
339b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  TPM_RC SetDictionaryAttackParameters(
340b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn      uint32_t max_tries,
341b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn      uint32_t recovery_time,
342b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn      uint32_t lockout_recovery,
343b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn      AuthorizationDelegate* delegate) override {
344b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    return target_->SetDictionaryAttackParameters(max_tries, recovery_time,
345b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                                                  lockout_recovery, delegate);
346b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  }
347b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn
348b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  TPM_RC ResetDictionaryAttackLock(AuthorizationDelegate* delegate) override {
349b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    return target_->ResetDictionaryAttackLock(delegate);
350b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  }
351b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn
35203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn private:
35303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn  TpmUtility* target_;
35403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn};
35503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
35603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn// Forwards all calls to a target instance.
357c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahnclass AuthorizationDelegateForwarder : public AuthorizationDelegate {
358c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn public:
359c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  explicit AuthorizationDelegateForwarder(AuthorizationDelegate* target)
360c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      : target_(target) {}
3610ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  ~AuthorizationDelegateForwarder() override = default;
362c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
363c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  bool GetCommandAuthorization(const std::string& command_hash,
3641aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                               bool is_command_parameter_encryption_possible,
3651aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn                               bool is_response_parameter_encryption_possible,
366c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn                               std::string* authorization) override {
3671aeb5969d4f286e36fe88152ad8c96cff668c25fDarren Krahn    return target_->GetCommandAuthorization(
3684dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn        command_hash, is_command_parameter_encryption_possible,
3694dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn        is_response_parameter_encryption_possible, authorization);
370c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  }
371c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
372c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  bool CheckResponseAuthorization(const std::string& response_hash,
373c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn                                  const std::string& authorization) override {
374c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    return target_->CheckResponseAuthorization(response_hash, authorization);
375c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  }
376c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
377c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  bool EncryptCommandParameter(std::string* parameter) override {
378c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    return target_->EncryptCommandParameter(parameter);
379c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  }
380c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
381c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  bool DecryptResponseParameter(std::string* parameter) override {
382c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    return target_->DecryptResponseParameter(parameter);
383c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  }
384c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
385c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn private:
386c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  AuthorizationDelegate* target_;
387c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn};
388c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
38952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn// Forwards all calls to a target instance.
390ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiclass SessionManagerForwarder : public SessionManager {
39152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn public:
392ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  explicit SessionManagerForwarder(SessionManager* target) : target_(target) {}
393ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  ~SessionManagerForwarder() override {}
394ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
395ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_HANDLE GetSessionHandle() const override {
396ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    return target_->GetSessionHandle();
397ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
398ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
3994dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  void CloseSession() override { return target_->CloseSession(); }
400ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
4014dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  TPM_RC StartSession(TPM_SE session_type,
4024dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                      TPMI_DH_ENTITY bind_entity,
403ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      const std::string& bind_authorization_value,
404ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      bool enable_encryption,
405ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      HmacAuthorizationDelegate* delegate) override {
406ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    return target_->StartSession(session_type, bind_entity,
4074dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                 bind_authorization_value, enable_encryption,
4084dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                 delegate);
409ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
410ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
411ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi private:
412ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  SessionManager* target_;
413ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi};
414ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
415ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi// Forwards all calls to a target instance.
416ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiclass HmacSessionForwarder : public HmacSession {
417ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi public:
4184dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  explicit HmacSessionForwarder(HmacSession* target) : target_(target) {}
4190ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  ~HmacSessionForwarder() override = default;
42052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
42152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  AuthorizationDelegate* GetDelegate() override {
42252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn    return target_->GetDelegate();
42352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  }
42452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
425ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_RC StartBoundSession(TPMI_DH_ENTITY bind_entity,
426ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                           const std::string& bind_authorization_value,
427ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                           bool enable_encryption) override {
4284dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->StartBoundSession(bind_entity, bind_authorization_value,
42952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn                                      enable_encryption);
43052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  }
43152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
43252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  TPM_RC StartUnboundSession(bool enable_encryption) override {
43352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn    return target_->StartUnboundSession(enable_encryption);
43452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  }
43552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
43652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  void SetEntityAuthorizationValue(const std::string& value) override {
43752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn    return target_->SetEntityAuthorizationValue(value);
43852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn  }
43952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
440d89b4dc09f61e540caa077c6d53b9abf698e6d6fUtkarsh Sanghi  void SetFutureAuthorizationValue(const std::string& value) override {
441d89b4dc09f61e540caa077c6d53b9abf698e6d6fUtkarsh Sanghi    return target_->SetFutureAuthorizationValue(value);
442d89b4dc09f61e540caa077c6d53b9abf698e6d6fUtkarsh Sanghi  }
443d89b4dc09f61e540caa077c6d53b9abf698e6d6fUtkarsh Sanghi
44452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn private:
445ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  HmacSession* target_;
446ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi};
447ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
448ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi// Forwards all calls to a target instance.
449ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiclass PolicySessionForwarder : public PolicySession {
450ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi public:
4514dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  explicit PolicySessionForwarder(PolicySession* target) : target_(target) {}
4520ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  ~PolicySessionForwarder() override = default;
453ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
454ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  AuthorizationDelegate* GetDelegate() override {
455ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    return target_->GetDelegate();
456ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
457ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
458ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_RC StartBoundSession(TPMI_DH_ENTITY bind_entity,
459ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                           const std::string& bind_authorization_value,
460ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                           bool enable_encryption) override {
4614dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    return target_->StartBoundSession(bind_entity, bind_authorization_value,
462ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                      enable_encryption);
463ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
464ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
465ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_RC StartUnboundSession(bool enable_encryption) override {
466ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    return target_->StartUnboundSession(enable_encryption);
467ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
468ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
469fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  TPM_RC GetDigest(std::string* digest) override {
470fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi    return target_->GetDigest(digest);
471fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  }
472fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi
473fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  TPM_RC PolicyOR(const std::vector<std::string>& digests) override {
474fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi    return target_->PolicyOR(digests);
475fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  }
476fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi
477fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  TPM_RC PolicyPCR(uint32_t pcr_index, const std::string& pcr_value) override {
478fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi    return target_->PolicyPCR(pcr_index, pcr_value);
479fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  }
480fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi
481fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  TPM_RC PolicyCommandCode(TPM_CC command_code) override {
482fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi    return target_->PolicyCommandCode(command_code);
483fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  }
484fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi
4854dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  TPM_RC PolicyAuthValue() override { return target_->PolicyAuthValue(); }
486fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi
487b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  TPM_RC PolicyRestart() override { return target_->PolicyRestart(); }
488b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn
489fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  void SetEntityAuthorizationValue(const std::string& value) override {
490fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi    return target_->SetEntityAuthorizationValue(value);
491fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi  }
492fc942a5ffc967b7b2b206aee8b91b3bae1933382Utkarsh Sanghi
493ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi private:
494ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  PolicySession* target_;
49552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn};
49652e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
4970ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi// Forwards all calls to a target instance.
4980ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghiclass BlobParserForwarder : public BlobParser {
4990ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi public:
5004dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  explicit BlobParserForwarder(BlobParser* target) : target_(target) {}
5010ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  ~BlobParserForwarder() override = default;
5020ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
5030ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  bool SerializeKeyBlob(const TPM2B_PUBLIC& public_info,
5040ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                        const TPM2B_PRIVATE& private_info,
5050ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                        std::string* key_blob) override {
5060ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi    return target_->SerializeKeyBlob(public_info, private_info, key_blob);
5070ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  }
5080ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
5090ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  bool ParseKeyBlob(const std::string& key_blob,
5100ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                    TPM2B_PUBLIC* public_info,
5110ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                    TPM2B_PRIVATE* private_info) override {
5120ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi    return target_->ParseKeyBlob(key_blob, public_info, private_info);
5130ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  }
5140ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
5150ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  bool SerializeCreationBlob(const TPM2B_CREATION_DATA& creation_data,
5160ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                             const TPM2B_DIGEST& creation_hash,
5170ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                             const TPMT_TK_CREATION& creation_ticket,
5180ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                             std::string* creation_blob) override {
5190ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi    return target_->SerializeCreationBlob(creation_data, creation_hash,
5200ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                                          creation_ticket, creation_blob);
5210ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  }
5220ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
5230ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  bool ParseCreationBlob(const std::string& creation_blob,
5240ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                         TPM2B_CREATION_DATA* creation_data,
5250ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                         TPM2B_DIGEST* creation_hash,
5260ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                         TPMT_TK_CREATION* creation_ticket) override {
5270ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi    return target_->ParseCreationBlob(creation_blob, creation_data,
5280ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi                                      creation_hash, creation_ticket);
5290ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  }
5300ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
5310ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi private:
5320ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi  BlobParser* target_;
5330ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi};
5340ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
535c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTrunksFactoryForTest::TrunksFactoryForTest()
536c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn    : default_tpm_(new NiceMock<MockTpm>()),
537c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      tpm_(default_tpm_.get()),
538c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      default_tpm_state_(new NiceMock<MockTpmState>()),
539c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn      tpm_state_(default_tpm_state_.get()),
54003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      default_tpm_utility_(new NiceMock<MockTpmUtility>()),
54103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn      tpm_utility_(default_tpm_utility_.get()),
5426318d4413806a501783a003bf249e3ae627c73edUtkarsh Sanghi      default_authorization_delegate_(new PasswordAuthorizationDelegate("")),
54352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn      password_authorization_delegate_(default_authorization_delegate_.get()),
544ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      default_session_manager_(new NiceMock<MockSessionManager>()),
545ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      session_manager_(default_session_manager_.get()),
546ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      default_hmac_session_(new NiceMock<MockHmacSession>()),
547ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      hmac_session_(default_hmac_session_.get()),
548ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      default_policy_session_(new NiceMock<MockPolicySession>()),
5490ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      policy_session_(default_policy_session_.get()),
550b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn      default_trial_session_(new NiceMock<MockPolicySession>()),
551b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn      trial_session_(default_trial_session_.get()),
5520ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi      default_blob_parser_(new NiceMock<MockBlobParser>()),
5534dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      blob_parser_(default_blob_parser_.get()) {}
554c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
555ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh SanghiTrunksFactoryForTest::~TrunksFactoryForTest() {}
556c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
557c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren KrahnTpm* TrunksFactoryForTest::GetTpm() const {
558c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn  return tpm_;
559c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
560c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
56130c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<TpmState> TrunksFactoryForTest::GetTpmState() const {
56230c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<TpmStateForwarder>(tpm_state_);
563c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
564c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
56530c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<TpmUtility> TrunksFactoryForTest::GetTpmUtility() const {
56630c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<TpmUtilityForwarder>(tpm_utility_);
56703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
56803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
56930c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<AuthorizationDelegate>
5704dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren KrahnTrunksFactoryForTest::GetPasswordAuthorization(
5714dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    const std::string& password) const {
57230c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<AuthorizationDelegateForwarder>(
57330c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez      password_authorization_delegate_);
574c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}
575c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn
576b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnstd::unique_ptr<SessionManager> TrunksFactoryForTest::GetSessionManager()
577b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    const {
57830c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<SessionManagerForwarder>(session_manager_);
579ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
580ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
58130c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<HmacSession> TrunksFactoryForTest::GetHmacSession() const {
58230c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<HmacSessionForwarder>(hmac_session_);
583ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
584ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
58530c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<PolicySession> TrunksFactoryForTest::GetPolicySession() const {
58630c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<PolicySessionForwarder>(policy_session_);
58752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
58852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
58930c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<PolicySession> TrunksFactoryForTest::GetTrialSession() const {
590ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn  return base::MakeUnique<PolicySessionForwarder>(trial_session_);
591be41115c49f10e8b81ae27963dfebb893c98f06aUtkarsh Sanghi}
592be41115c49f10e8b81ae27963dfebb893c98f06aUtkarsh Sanghi
59330c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<BlobParser> TrunksFactoryForTest::GetBlobParser() const {
59430c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<BlobParserForwarder>(blob_parser_);
5950ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi}
5960ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
597c364caa9d091baae8eeb9144a6abf69e1fcabb39Darren Krahn}  // namespace trunks
598