139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// you may not use this file except in compliance with the License.
639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// You may obtain a copy of the License at
739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
1039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
1139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
1239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// See the License for the specific language governing permissions and
1439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// limitations under the License.
1539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
1639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
1739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#ifndef TPM_MANAGER_SERVER_TPM2_NVRAM_IMPL_H_
1839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#define TPM_MANAGER_SERVER_TPM2_NVRAM_IMPL_H_
1939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
2039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include "tpm_manager/server/tpm_nvram.h"
2139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
2239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <memory>
2339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <string>
2439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
2539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <base/macros.h>
2639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <base/memory/scoped_ptr.h>
2739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <trunks/trunks_factory.h>
2839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
2939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include "tpm_manager/server/local_data_store.h"
3039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
3139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghinamespace tpm_manager {
3239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
3339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiclass Tpm2NvramImpl : public TpmNvram {
3439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi public:
3539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // Does not take ownership of |local_data_store|.
3639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  explicit Tpm2NvramImpl(LocalDataStore* local_data_store);
3739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // Does not take ownership of |local_data_store|, but takes ownership of
3839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // |factory|.
3939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  Tpm2NvramImpl(std::unique_ptr<trunks::TrunksFactory> factory,
4039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi                LocalDataStore* local_data_store);
4139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  ~Tpm2NvramImpl() override = default;
4239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
4339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // TpmNvram methods.
4439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool DefineNvram(uint32_t index, size_t length) override;
4539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool DestroyNvram(uint32_t index) override;
4639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool WriteNvram(uint32_t index, const std::string& data) override;
4739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool ReadNvram(uint32_t index, std::string* data) override;
4839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool IsNvramDefined(uint32_t index, bool* defined) override;
4939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool IsNvramLocked(uint32_t index, bool* locked) override;
5039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool GetNvramSize(uint32_t index, size_t* size) override;
5139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
5239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi private:
5339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // Initializes the connection to the Tpm2.0 and starts an authorization
5439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // session.
5539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // Note: there are no guarantees about the authorization value loaded into
5639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // |trunks_session_| at the end of this method.
5739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool Initialize();
5839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
5939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // This method initializes and ensures that a valid owner password is
6039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // available. When this method returns, |owner_password_| will be loaded
6139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  // into |trunks_session_|.
6239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool InitializeWithOwnerPassword();
6339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
6439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  std::unique_ptr<trunks::TrunksFactory> trunks_factory_;
6539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  LocalDataStore* local_data_store_;
6639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  bool initialized_;
6739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  std::string owner_password_;
6839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  scoped_ptr<trunks::HmacSession> trunks_session_;
6939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  scoped_ptr<trunks::TpmUtility> trunks_utility_;
7039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
7139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  friend class Tpm2NvramTest;
7239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  DISALLOW_COPY_AND_ASSIGN(Tpm2NvramImpl);
7339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi};
7439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
7539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}  // namespace tpm_manager
7639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
7739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#endif  // TPM_MANAGER_SERVER_TPM2_NVRAM_IMPL_H_
78