// Copyright 2020 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 CRYPTOHOME_TPM_AUTH_BLOCK_UTILS_H_
#define CRYPTOHOME_TPM_AUTH_BLOCK_UTILS_H_

#include <base/macros.h>

#include <string>

#include "cryptohome/crypto_error.h"
#include "cryptohome/cryptohome_key_loader.h"
#include "cryptohome/tpm.h"
#include "cryptohome/vault_keyset.pb.h"

namespace cryptohome {

class TpmAuthBlockUtils {
 public:
  TpmAuthBlockUtils(Tpm* tpm, CryptohomeKeyLoader* cryptohome_key_loader);
  TpmAuthBlockUtils(const TpmAuthBlockUtils&) = delete;
  TpmAuthBlockUtils& operator=(const TpmAuthBlockUtils&) = delete;

  // A static method which converts an error object.
  static CryptoError TpmErrorToCrypto(Tpm::TpmRetryAction retry_action);

  // A static method to report which errors can be recovered from with a retry.
  static bool TpmErrorIsRetriable(Tpm::TpmRetryAction retry_action);

  // Checks if the specified |hash| is the same as the hash for the |tpm_| used
  // by the class.
  bool IsTPMPubkeyHash(const brillo::SecureBlob& hash,
                       CryptoError* error) const;

  // This checks that the TPM is ready and that the vault keyset was encrypted
  // with this machine's TPM.
  bool CheckTPMReadiness(bool has_tpm_key,
                         bool has_tpm_public_key_hash,
                         const brillo::SecureBlob& tpm_public_key_hash,
                         CryptoError* error);

 private:
  Tpm* tpm_;
  CryptohomeKeyLoader* cryptohome_key_loader_;
};

}  // namespace cryptohome

#endif  // CRYPTOHOME_TPM_AUTH_BLOCK_UTILS_H_
