| // |
| // Copyright (C) 2015 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #ifndef TRUNKS_POLICY_SESSION_IMPL_H_ |
| #define TRUNKS_POLICY_SESSION_IMPL_H_ |
| |
| #include "trunks/policy_session.h" |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "trunks/hmac_authorization_delegate.h" |
| #include "trunks/session_manager.h" |
| #include "trunks/trunks_factory.h" |
| |
| namespace trunks { |
| |
| // This class implements the PolicySession interface. It is used for |
| // keeping track of the HmacAuthorizationDelegate used for commands, and to |
| // provide authorization for commands that need it. It can also be used to |
| // create custom policies to restrict the usage of keys. |
| // PolicySessionImpl session(factory); |
| // session.StartBoundSession(bind_entity, bind_authorization, true); |
| // session.PolicyPCR(pcr_index, pcr_value); |
| // factory.GetTpm()->RSA_EncrpytSync(_,_,_,_, session.GetDelegate()); |
| // NOTE: StartBoundSession/StartUnboundSession should not be called before |
| // TPM Ownership is taken. This is because starting a session uses the |
| // SaltingKey, which is only created after ownership is taken. |
| class TRUNKS_EXPORT PolicySessionImpl : public PolicySession { |
| public: |
| explicit PolicySessionImpl(const TrunksFactory& factory); |
| // |session_type| specifies what type of session this is. It can only |
| // be TPM_SE_TRIAL or TPM_SE_POLICY. If other values are used, |
| // StartBoundSession will return SAPI_RC_INVALID_SESSIONS. |
| PolicySessionImpl(const TrunksFactory& factory, TPM_SE session_type); |
| ~PolicySessionImpl() override; |
| |
| // PolicySession methods |
| AuthorizationDelegate* GetDelegate() override; |
| TPM_RC StartBoundSession(TPMI_DH_ENTITY bind_entity, |
| const std::string& bind_authorization_value, |
| bool enable_encryption) override; |
| TPM_RC StartUnboundSession(bool enable_encryption) override; |
| TPM_RC GetDigest(std::string* digest) override; |
| TPM_RC PolicyOR(const std::vector<std::string>& digests) override; |
| TPM_RC PolicyPCR(uint32_t pcr_index, const std::string& pcr_value) override; |
| TPM_RC PolicyCommandCode(TPM_CC command_code) override; |
| TPM_RC PolicyAuthValue() override; |
| TPM_RC PolicyRestart() override; |
| void SetEntityAuthorizationValue(const std::string& value) override; |
| |
| private: |
| // This factory is only set in the constructor and is used to instantiate |
| // The TPM class to forward commands to the TPM chip. |
| const TrunksFactory& factory_; |
| // This field determines if this session is of type TPM_SE_TRIAL or |
| // TPM_SE_POLICY. |
| TPM_SE session_type_; |
| // This delegate is what provides authorization to commands. It is what is |
| // returned when the GetDelegate method is called. |
| HmacAuthorizationDelegate hmac_delegate_; |
| // This object is used to manage the TPM session associated with this |
| // AuthorizationSession. |
| std::unique_ptr<SessionManager> session_manager_; |
| |
| friend class PolicySessionTest; |
| DISALLOW_COPY_AND_ASSIGN(PolicySessionImpl); |
| }; |
| |
| } // namespace trunks |
| |
| #endif // TRUNKS_POLICY_SESSION_IMPL_H_ |