// Copyright 2021 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_AUTH_FACTOR_H_
#define CRYPTOHOME_AUTH_FACTOR_H_

#include <memory>
#include <string>

#include "cryptohome/auth_block.h"
#include "cryptohome/credential_verifier.h"
#include "cryptohome/credentials.h"
#include "cryptohome/keyset_management.h"
#include "cryptohome/rpc.pb.h"
#include "cryptohome/storage/file_system_keyset.h"
#include "cryptohome/UserDataAuth.pb.h"

namespace cryptohome {

// This is a pure virtual interface designed to be implemented by the different
// authentication factors - password, pin, security keys, etc - so that
// they take handle multiple factors of the same type and know what to do with
// it.
class AuthFactor {
 public:
  AuthFactor() = default;
  virtual ~AuthFactor() = default;
  // AuthenticateAuthFactor validates the key should it exist on disk for the
  // user.
  virtual bool AuthenticateAuthFactor(const Credentials& credential,
                                      bool is_ephemeral_user,
                                      MountError* code) = 0;

  // Transfer ownership of password verifier that can be used to verify
  // credentials during unlock.
  virtual std::unique_ptr<CredentialVerifier> TakeCredentialVerifier() = 0;
  // -------------------------------------------------------------------------
  // Temporary functions below as we transition from AuthSession to AuthFactor
  // -------------------------------------------------------------------------
  // Returns the key data with which this AuthFactor is authenticated with.
  virtual const cryptohome::KeyData& GetKeyData() = 0;

  // This function returns the current index of the keyset that was used to
  // Authenticate. This is useful during verification of challenge credentials.
  virtual const int GetKeyIndex() = 0;

  // Get VaultKeyset.
  virtual VaultKeyset vault_keyset() = 0;

  // Return a const reference to FileSystemKeyset.
  virtual const FileSystemKeyset GetFileSystemKeyset() = 0;
};

}  // namespace cryptohome

#endif  // CRYPTOHOME_AUTH_FACTOR_H_
