blob: f62d75d6d0c1caf37e4f7a17fc6e781ba370c004 [file] [log] [blame] [edit]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CRYPTOHOME_FP_MIGRATION_UTILITY_H_
#define CRYPTOHOME_FP_MIGRATION_UTILITY_H_
#include <string>
#include "cryptohome/auth_blocks/biometrics_auth_block_service.h"
#include "cryptohome/crypto.h"
#include "cryptohome/error/cryptohome_error.h"
#include "cryptohome/features.h"
#include "cryptohome/key_objects.h"
#include "cryptohome/util/async_init.h"
namespace cryptohome {
// A utility class to interact with biometrics service on legacy
// fingerprint migration related functionalities.
class FpMigrationUtility final {
public:
using LegacyRecordsCallback =
BiometricsAuthBlockService::LegacyRecordsCallback;
// Helper to construct an auth factor label from a index value.
// Legacy fingerprint migration utilizes this helper to derive
// a label automatically.
static std::string MigratedLegacyFpLabel(size_t index);
FpMigrationUtility(Crypto* crypto,
AsyncInitPtr<BiometricsAuthBlockService> bio_service,
AsyncInitFeatures* features)
: crypto_(crypto), bio_service_(bio_service), features_(features) {}
FpMigrationUtility(const FpMigrationUtility&) = delete;
FpMigrationUtility& operator=(const FpMigrationUtility&) = delete;
// Prepare a legacy fingerprint for later being added as an auth factor.
// Unlike normal enrollment where a service session is established for user
// input, the preparation of legacy fp completes as soon as biod finishes the
// template loading. Returns through the asynchronous |callback|.
void PrepareLegacyTemplate(const AuthInput& auth_input,
StatusCallback callback);
// Calls BiometricsAuthBlockService::ListLegacyRecords. It returns a list of
// legacy fingerprint records from biod's daemon store.
void ListLegacyRecords(LegacyRecordsCallback callback);
// Returns the desired migration rollout version. The version is
// determined by the latest feature flag for migration rollout.
// We expect to define one feature flag for each new migration rollout.
// Return 0 when there is no rollout feature flag.
uint64_t GetLegacyFingerprintMigrationRollout();
// Returns if legacy fingerprint migration is needed by comparing
// |last_rollout| and the desired rollout version.
bool NeedsMigration(std::optional<uint64_t> last_rollout);
private:
// Enrolls a legacy fp template through biod, with obtained |nonce|.
// Intended as a callback for BiometricsAuthBlockService::GetNonce.
void EnrollLegacyTemplate(StatusCallback callback,
const AuthInput& auth_input,
std::optional<brillo::Blob> nonce);
Crypto* crypto_;
// Biometrics service, used by operations that need to interact with biod.
AsyncInitPtr<BiometricsAuthBlockService> bio_service_;
// features lookup interface.
AsyncInitFeatures* features_;
base::WeakPtrFactory<FpMigrationUtility> weak_factory_{this};
};
} // namespace cryptohome
#endif // CRYPTOHOME_FP_MIGRATION_UTILITY_H_