blob: 4001967ba3c901d04a643edf12b514797d9bf4b4 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_COMMON_CREDENTIAL_PROVIDER_PASSKEY_KEYCHAIN_PROVIDER_H_
#define IOS_CHROME_COMMON_CREDENTIAL_PROVIDER_PASSKEY_KEYCHAIN_PROVIDER_H_
#import <UIKit/UIKit.h>
#import <vector>
#import "base/functional/callback_forward.h"
#import "components/webauthn/ios/passkey_types.h"
@class GCRSSOFolsomService;
// Class to manage passkey vault keys.
class PasskeyKeychainProvider {
public:
// TODO(crbug.com/385174410): Remove these 4 type aliases once everything else
// uses the webauthn types directly.
using ReauthenticatePurpose = webauthn::ReauthenticatePurpose;
using SharedKey = webauthn::SharedKey;
using SharedKeyList = webauthn::SharedKeyList;
using KeysFetchedCallback = webauthn::KeysFetchedCallback;
// Types for the different callbacks.
using CheckEnrolledCallback = base::OnceCallback<void(BOOL, NSError*)>;
using EnrollCallback = base::OnceCallback<void(NSError*)>;
using KeysMarkedAsAsStaleCallback = base::OnceCallback<void(void)>;
using CheckDegradedRecoverabilityCallback =
base::OnceCallback<void(BOOL, NSError*)>;
using FixDegradedRecoverabilityCallback = base::OnceCallback<void(NSError*)>;
PasskeyKeychainProvider(bool metrics_reporting_enabled);
PasskeyKeychainProvider(const PasskeyKeychainProvider&) = delete;
PasskeyKeychainProvider& operator=(const PasskeyKeychainProvider&) = delete;
~PasskeyKeychainProvider();
// Checks if the identity identified by `gaia` is enrolled and invokes
// `callback` with the result.
// - "gaia" is used to identify the account.
// - "callback" is called once the enrollment status is known and receives
// the result and the potential error as input.
void CheckEnrolled(NSString* gaia, CheckEnrolledCallback callback);
// Asynchronously enrolls the identity identified by `gaia` and invokes
// `callback`.
// - "gaia" is used to identify the account.
// - "navigation_controller" is used to display UI for the user to enter
// credentials.
// - "navigation_item_title_view" is a branded title view of the
// password manager.
// - "callback" is called once the enrollment process is finished and
// receives the potential error as input.
void Enroll(NSString* gaia,
UINavigationController* navigation_controller,
UIView* navigation_item_title_view,
EnrollCallback callback);
// Asynchronously fetches the shared keys for the identity identified by
// `gaia` and invokes `callback` with the fetched keys.
// - "gaia" is used to identify the account.
// - "purpose" is used to specify if the keys will be used to encrypt or
// decrypt. This is mostly for logging purposes and has no effect on the
// fetched keys.
// - "callback" is called once the keys are fetched and receives the fetched
// keys as input (the array will be empty on failure).
void FetchKeys(NSString* gaia,
webauthn::ReauthenticatePurpose purpose,
webauthn::KeysFetchedCallback callback);
// Asynchronously marks the keys as stale for the identity identified by
// `gaia` and invokes `callback` after completion. This should be invoked
// only after attempting and failing to decrypt a passkey using the keys
// received from the "FetchKeys" function above.
// - "gaia" is used to identify the account.
// - "callback" is called once the keys are marked as stale.
void MarkKeysAsStale(NSString* gaia, KeysMarkedAsAsStaleCallback callback);
// Asynchronously reauthenticates the identity identified by `gaia` after the
// keys were fetched and invokes `callback` with the fetched keys.
// - "gaia" is used to identify the account.
// - "navigation_controller" is used to display UI for the user to enter
// credentials.
// - "navigation_item_title_view" is a branded title view of the
// password manager.
// - "purpose" is used to specify if the keys will be used to encrypt or
// decrypt. This is mostly for logging purposes and has no effect on the
// fetched keys.
// - "callback" is called once the keys are fetched and receives the fetched
// keys as input (the array will be empty on failure).
void Reauthenticate(NSString* gaia,
UINavigationController* navigation_controller,
UIView* navigation_item_title_view,
webauthn::ReauthenticatePurpose purpose,
webauthn::KeysFetchedCallback callback);
// Checks if the identity identified by `gaia` is in the degraded
// recoverability state.
// - "gaia" is used to identify the account.
// - "callback" is called once the degraded recoverability status is known and
// receives the result and the potential error as input.
void CheckDegradedRecoverability(
NSString* gaia,
CheckDegradedRecoverabilityCallback callback);
// Asynchronously fixes the degraded recoverability state for the identity
// identified by `gaia` and invokes `callback`.
// - "gaia" is used to identify the account.
// - "navigation_controller" is used to display UI for the user to enter
// credentials.
// - "navigation_item_title_view" is a branded title view of the
// password manager.
// - "callback" is called once the degraded recoverability fix is completed
// and receives the potential error as input.
void FixDegradedRecoverability(NSString* gaia,
UINavigationController* navigation_controller,
UIView* navigation_item_title_view,
FixDegradedRecoverabilityCallback callback);
private:
// Folsom service.
[[maybe_unused]] GCRSSOFolsomService* gcr_sso_folsom_service_;
};
#endif // IOS_CHROME_COMMON_CREDENTIAL_PROVIDER_PASSKEY_KEYCHAIN_PROVIDER_H_