// Copyright 2022 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_VAULT_KEYSET_CONVERTER_H_
#define CRYPTOHOME_AUTH_FACTOR_VAULT_KEYSET_CONVERTER_H_

#include <map>
#include <memory>
#include <string>
#include <vector>

#include <cryptohome/proto_bindings/auth_factor.pb.h>
#include <cryptohome/proto_bindings/rpc.pb.h>
#include <cryptohome/proto_bindings/UserDataAuth.pb.h>

#include "cryptohome/auth_blocks/auth_block_utils.h"
#include "cryptohome/auth_factor/auth_factor.h"
#include "cryptohome/auth_factor/auth_factor_metadata.h"
#include "cryptohome/auth_factor/auth_factor_type.h"
#include "cryptohome/key_objects.h"
#include "cryptohome/keyset_management.h"

namespace cryptohome {

// This class contains the methods to convert an AuthFactor data to a
// VaultKeyset data and to convert on-disk VaultKeysets data to AuthFactor data.
class AuthFactorVaultKeysetConverter {
 public:
  // Unowned pointer |keyset_management| should outlive the lifetime of the
  // AuthFactorVaultKeysetConverter object.
  explicit AuthFactorVaultKeysetConverter(KeysetManagement* keyset_management_);
  AuthFactorVaultKeysetConverter(const AuthFactorVaultKeysetConverter&) =
      delete;
  AuthFactorVaultKeysetConverter& operator=(
      const AuthFactorVaultKeysetConverter&) = delete;
  ~AuthFactorVaultKeysetConverter();

  // Generates and returns an AuthFactor type with the |key_data|
  std::unique_ptr<AuthFactor> VaultKeysetToAuthFactor(
      const std::string& username, const std::string& label);

  // Returns all the existing VaultKeyset data on disk mapped to their labels
  // and converted into AuthFactor format.
  user_data_auth::CryptohomeErrorCode VaultKeysetsToAuthFactors(
      const std::string& username,
      std::map<std::string, std::unique_ptr<AuthFactor>>&
          out_label_to_auth_factor);

  // Takes a label, which was sent from an AuthFactor API, find the VaultKeyset
  // identified with that label and returns its KeyData.
  user_data_auth::CryptohomeErrorCode PopulateKeyDataForVK(
      const std::string& username,
      const std::string& auth_factor_label,
      KeyData& out_vk_key_data);

  // Generates a KeyData structure using the |auth_factor_label| and
  // |auth_factor_type|
  user_data_auth::CryptohomeErrorCode AuthFactorToKeyData(
      const std::string& auth_factor_label,
      const AuthFactorType& auth_factor_type,
      KeyData& out_vk_key_data);

 private:
  // Unowned pointer.
  KeysetManagement* const keyset_management_;
};

}  // namespace cryptohome
#endif  // CRYPTOHOME_AUTH_FACTOR_VAULT_KEYSET_CONVERTER_H_
