| // Copyright 2022 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_AUTH_BLOCKS_FP_SERVICE_H_ |
| #define CRYPTOHOME_AUTH_BLOCKS_FP_SERVICE_H_ |
| |
| #include <memory> |
| |
| #include <base/functional/callback.h> |
| #include <base/memory/weak_ptr.h> |
| #include <cryptohome/proto_bindings/UserDataAuth.pb.h> |
| |
| #include "cryptohome/auth_blocks/prepare_token.h" |
| #include "cryptohome/credential_verifier.h" |
| #include "cryptohome/error/cryptohome_error.h" |
| #include "cryptohome/fingerprint_manager.h" |
| #include "cryptohome/signalling.h" |
| #include "cryptohome/util/async_init.h" |
| |
| namespace cryptohome { |
| |
| class FingerprintAuthBlockService { |
| public: |
| FingerprintAuthBlockService(AsyncInitPtr<FingerprintManager> fp_manager, |
| AsyncInitPtr<SignallingInterface> signalling); |
| |
| FingerprintAuthBlockService(const FingerprintAuthBlockService&) = delete; |
| FingerprintAuthBlockService& operator=(const FingerprintAuthBlockService&) = |
| delete; |
| |
| ~FingerprintAuthBlockService() = default; |
| |
| // Create a null instance of this service that will not have any of the |
| // underlying services available and so will not be able to do anything. |
| // |
| // This is mostly useful in tests where you need a copy of the service but |
| // don't actually need any fingerprint operations to work. |
| static std::unique_ptr<FingerprintAuthBlockService> MakeNullService(); |
| |
| // Start registers a given user to the fp_service and initiates a fingerprint |
| // sensor session. |
| void Start(ObfuscatedUsername obfuscated_username, |
| PreparedAuthFactorToken::Consumer on_done); |
| |
| // Verify if the fingerprint sensor is currently in a "successfully |
| // authorized" state or not. |
| CryptohomeStatus Verify(); |
| |
| // Terminate stops any ongoing fingerprint sensor session and |
| // clears the registered user. |
| void Terminate(); |
| |
| private: |
| // Token implementation used by the fingerprint service. |
| class Token : public PreparedAuthFactorToken { |
| public: |
| Token(); |
| |
| // Attaches the token to the underlying service. Ideally we'd do this in the |
| // constructor but the token is constructed when we initiate the request to |
| // start the session, not after the session is (successfully) started. We |
| // don't want the token to be able to termination the session until it |
| // starts, so we wait until that point to attach it. |
| void AttachToService(FingerprintAuthBlockService* service); |
| |
| private: |
| CryptohomeStatus TerminateAuthFactor() override; |
| |
| FingerprintAuthBlockService* service_ = nullptr; |
| TerminateOnDestruction terminate_; |
| }; |
| |
| // Depending on the result of success, this will pass either the given auth |
| // factor token, or a not-OK status to the given callback. This function is |
| // designed to be used as a callback with FingerprintManager. |
| void CheckSessionStartResult(std::unique_ptr<Token> token, |
| PreparedAuthFactorToken::Consumer on_done, |
| bool success); |
| |
| // Capture processes a fingerprint scan result. It records the scan result |
| // and converts the result into a cryptohome signal status through |
| // |scan_result_signal_callback_|. This function is designed to be |
| // used by as a repeating callback with FingerprintManager. |
| void Capture(FingerprintScanStatus status); |
| |
| // EndAuthSession terminates any ongoing fingerprint sensor session |
| // and cancels all existing pending callbacks. |
| void EndAuthSession(); |
| |
| // TODO(b/276453357): Replace with FingerprintManager* once that object is |
| // guaranteed to always be available. |
| AsyncInitPtr<FingerprintManager> fp_manager_; |
| |
| // The most recent fingerprint scan result. |
| FingerprintScanStatus scan_result_ = |
| FingerprintScanStatus::FAILED_RETRY_NOT_ALLOWED; |
| // The token for the currently active auth session, if there is one. This will |
| // be set to null otherwise. |
| PreparedAuthFactorToken* active_token_ = nullptr; |
| // The interface used to send scan result signals. |
| AsyncInitPtr<SignallingInterface> signalling_; |
| |
| // The last member, to invalidate weak references first on destruction. |
| base::WeakPtrFactory<FingerprintAuthBlockService> weak_factory_{this}; |
| }; |
| |
| // Implementation of the credential verifier API. Acts as a simple wrapper |
| // around the verify provided by the fingerprint service. |
| class FingerprintVerifier final : public AsyncCredentialVerifier { |
| public: |
| explicit FingerprintVerifier(FingerprintAuthBlockService* service); |
| |
| private: |
| void VerifyAsync(const AuthInput& input, |
| StatusCallback callback) const override; |
| |
| FingerprintAuthBlockService* service_; |
| }; |
| |
| } // namespace cryptohome |
| |
| #endif // CRYPTOHOME_AUTH_BLOCKS_FP_SERVICE_H_ |