// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TPM_MANAGER_SERVER_TPM_NVRAM_IMPL_H_
#define TPM_MANAGER_SERVER_TPM_NVRAM_IMPL_H_

#include "tpm_manager/server/tpm_nvram.h"

#include <stdint.h>

#include <string>
#include <vector>

#include <base/macros.h>
#include <trousers/scoped_tss_type.h>
#include <trousers/tss.h>

#include "tpm_manager/server/tpm_connection.h"

namespace tpm_manager {

class LocalDataStore;

class TpmNvramImpl : public TpmNvram {
 public:
  explicit TpmNvramImpl(LocalDataStore* local_data_store);
  ~TpmNvramImpl() override = default;

  // TpmNvram methods.
  NvramResult DefineSpace(uint32_t index,
                          size_t size,
                          const std::vector<NvramSpaceAttribute>& attributes,
                          const std::string& authorization_value,
                          NvramSpacePolicy policy) override;
  NvramResult DestroySpace(uint32_t index) override;
  NvramResult WriteSpace(uint32_t index,
                         const std::string& data,
                         const std::string& authorization_value) override;
  NvramResult ReadSpace(uint32_t index,
                        std::string* data,
                        const std::string& authorization_value) override;
  NvramResult LockSpace(uint32_t index,
                        bool lock_read,
                        bool lock_write,
                        const std::string& authorization_value) override;
  NvramResult ListSpaces(std::vector<uint32_t>* index_list) override;
  NvramResult GetSpaceInfo(uint32_t index,
                           uint32_t* size,
                           bool* is_read_locked,
                           bool* is_write_locked,
                           std::vector<NvramSpaceAttribute>* attributes,
                           NvramSpacePolicy* policy) override;

  void PrunePolicies() override;

 private:
  // If |data| is a nullptr, read-locks the NV index; otherwise, reads content
  // from the |index| with |authorization_value| and stores the content into
  // |data|.
  NvramResult ReadSpaceInternal(uint32_t index,
                                const std::string& authorization_value,
                                std::string* data);

  // This method creates and initializes the nvram object associated with
  // |handle| at |index|. Returns true on success, else false.
  bool InitializeNvramHandle(uint32_t index,
                             trousers::ScopedTssNvStore* nv_handle,
                             TpmConnection* connection);

  // Initializes the nvram handle |nv_handle| at |index| with the TPM
  // |connection|. If |need_auth_policy| is set, the method also initializes
  // |policy_handle| with |authorization_value| and associates |policy_handle|
  // with |nv_handle|.
  //
  // Note: the caller should make sure the lifetime of |policy_handle| is >= the
  // lifetime of |nv_handle|.
  //
  // Returns whether the initialization is successful.
  bool InitializeNvramHandleWithPolicy(uint32_t index,
                                       bool need_auth_policy,
                                       const std::string& authorization_value,
                                       trousers::ScopedTssNvStore* nv_handle,
                                       trousers::ScopedTssPolicy* policy_handle,
                                       TpmConnection* connection);

  // This method sets up the composite pcr provided by |pcr_handle| with the
  // value of PCR0 at locality 1. Returns true on success.
  bool SetCompositePcr0(trousers::ScopedTssPcrs* pcr_handle,
                        TpmConnection* connection);

  // This method gets the owner password stored on disk and returns it via the
  // out argument |owner_password|. Returns true if we were able to read a
  // non empty owner_password off disk, else false.
  bool GetOwnerPassword(std::string* owner_password);

  LocalDataStore* local_data_store_;
  // A default non-owner connection.
  TpmConnection tpm_connection_;

  DISALLOW_COPY_AND_ASSIGN(TpmNvramImpl);
};

}  // namespace tpm_manager

#endif  // TPM_MANAGER_SERVER_TPM_NVRAM_IMPL_H_
