diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index c5f8dac24a4e5..2aefb1da4783f 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -626,10 +626,10 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing * @hide */ @RequiresPermission(MANAGE_FINGERPRINT) - public void generateChallenge(int sensorId, GenerateChallengeCallback callback) { + public void generateChallenge(int sensorId, int userId, GenerateChallengeCallback callback) { if (mService != null) try { mGenerateChallengeCallback = callback; - mService.generateChallenge(mToken, sensorId, mServiceReceiver, + mService.generateChallenge(mToken, sensorId, userId, mServiceReceiver, mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -642,7 +642,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing * @hide */ @RequiresPermission(MANAGE_FINGERPRINT) - public void generateChallenge(GenerateChallengeCallback callback) { + public void generateChallenge(int userId, GenerateChallengeCallback callback) { final List fingerprintSensorProperties = getSensorPropertiesInternal(); if (fingerprintSensorProperties.isEmpty()) { @@ -651,7 +651,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing } final int sensorId = fingerprintSensorProperties.get(0).sensorId; - generateChallenge(sensorId, callback); + generateChallenge(sensorId, userId, callback); } /** @@ -659,10 +659,10 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing * @hide */ @RequiresPermission(MANAGE_FINGERPRINT) - public void revokeChallenge() { + public void revokeChallenge(int userId) { // On HALs with only single in-flight challenge such as IBiometricsFingerprint@2.1, // this parameter is ignored. - revokeChallenge(0L); + revokeChallenge(userId, 0L); } /** @@ -670,9 +670,17 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing * @hide */ @RequiresPermission(MANAGE_FINGERPRINT) - public void revokeChallenge(long challenge) { + public void revokeChallenge(int userId, long challenge) { if (mService != null) try { - mService.revokeChallenge(mToken, mContext.getOpPackageName(), challenge); + final List fingerprintSensorProperties = + getSensorPropertiesInternal(); + if (fingerprintSensorProperties.isEmpty()) { + Slog.e(TAG, "No sensors"); + return; + } + final int sensorId = fingerprintSensorProperties.get(0).sensorId; + mService.revokeChallenge(mToken, sensorId, userId, mContext.getOpPackageName(), + challenge); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index cc086cf5656ee..95668372c5a19 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -93,10 +93,10 @@ interface IFingerprintService { boolean isHardwareDetected(String opPackageName); // Get a pre-enrollment authentication token - void generateChallenge(IBinder token, int sensorId, IFingerprintServiceReceiver receiver, String opPackageName); + void generateChallenge(IBinder token, int sensorId, int userId, IFingerprintServiceReceiver receiver, String opPackageName); // Finish an enrollment sequence and invalidate the authentication token - void revokeChallenge(IBinder token, String opPackageName, long challenge); + void revokeChallenge(IBinder token, int sensorId, int userId, String opPackageName, long challenge); // Determine if a user has at least one enrolled fingerprint boolean hasEnrolledFingerprints(int userId, String opPackageName); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index dc22970d617ce..1f71d78091332 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -174,7 +174,7 @@ public class FingerprintService extends SystemService { } @Override // Binder call - public void generateChallenge(IBinder token, int sensorId, + public void generateChallenge(IBinder token, int sensorId, int userId, IFingerprintServiceReceiver receiver, String opPackageName) { Utils.checkPermission(getContext(), MANAGE_FINGERPRINT); @@ -184,20 +184,21 @@ public class FingerprintService extends SystemService { return; } - provider.scheduleGenerateChallenge(sensorId, token, receiver, opPackageName); + provider.scheduleGenerateChallenge(sensorId, userId, token, receiver, opPackageName); } @Override // Binder call - public void revokeChallenge(IBinder token, String opPackageName, long challenge) { + public void revokeChallenge(IBinder token, int sensorId, int userId, String opPackageName, + long challenge) { Utils.checkPermission(getContext(), MANAGE_FINGERPRINT); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { - Slog.w(TAG, "Null provider for revokeChallenge"); + Slog.w(TAG, "No matching sensor for revokeChallenge, sensorId: " + sensorId); return; } - provider.second.scheduleRevokeChallenge(provider.first, token, opPackageName, + provider.scheduleRevokeChallenge(sensorId, userId, token, opPackageName, challenge); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java index 35d01882f0c6e..c2315fdd4cccd 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java @@ -64,10 +64,10 @@ public interface ServiceProvider { void scheduleResetLockout(int sensorId, int userId, @Nullable byte[] hardwareAuthToken); - void scheduleGenerateChallenge(int sensorId, @NonNull IBinder token, + void scheduleGenerateChallenge(int sensorId, int userId, @NonNull IBinder token, @NonNull IFingerprintServiceReceiver receiver, String opPackageName); - void scheduleRevokeChallenge(int sensorId, @NonNull IBinder token, + void scheduleRevokeChallenge(int sensorId, int userId, @NonNull IBinder token, @NonNull String opPackageName, long challenge); void scheduleEnroll(int sensorId, @NonNull IBinder token, byte[] hardwareAuthToken, int userId, diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGenerateChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGenerateChallengeClient.java index 331bec186e9d0..402886b0e92c0 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGenerateChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintGenerateChallengeClient.java @@ -19,7 +19,7 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.fingerprint.IFingerprint; -import android.hardware.biometrics.fingerprint.IGenerateChallengeCallback; +import android.hardware.biometrics.fingerprint.ISession; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -30,28 +30,12 @@ import com.android.server.biometrics.sensors.GenerateChallengeClient; /** * Fingerprint-specific generateChallenge client for the {@link IFingerprint} AIDL HAL interface. */ -class FingerprintGenerateChallengeClient extends GenerateChallengeClient { +class FingerprintGenerateChallengeClient extends GenerateChallengeClient { private static final String TAG = "FingerprintGenerateChallengeClient"; private static final int CHALLENGE_TIMEOUT_SEC = 600; // 10 minutes - private final IGenerateChallengeCallback mGenerateChallengeCallback = - new IGenerateChallengeCallback.Stub() { - @Override - public void onChallengeGenerated(int sensorId, int userId, long challenge) { - try { - getListener().onChallengeGenerated(sensorId, challenge); - mCallback.onClientFinished(FingerprintGenerateChallengeClient.this, - true /* success */); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to send challenge", e); - mCallback.onClientFinished(FingerprintGenerateChallengeClient.this, - false /* success */); - } - } - }; - FingerprintGenerateChallengeClient(@NonNull Context context, - @NonNull LazyDaemon lazyDaemon, + @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, @NonNull String owner, int sensorId) { @@ -61,11 +45,21 @@ class FingerprintGenerateChallengeClient extends GenerateChallengeClient { - final FingerprintGenerateChallengeClient client = - new FingerprintGenerateChallengeClient(mContext, mLazyDaemon, token, - new ClientMonitorCallbackConverter(receiver), opPackageName, sensorId); - scheduleForSensor(sensorId, client); + final IFingerprint daemon = getHalInstance(); + if (daemon == null) { + Slog.e(getTag(), "Null daemon during generateChallenge, sensorId: " + sensorId); + return; + } + + try { + if (!mSensors.get(sensorId).hasSessionForUser(userId)) { + createNewSessionWithoutHandler(daemon, sensorId, userId); + } + + final FingerprintGenerateChallengeClient client = + new FingerprintGenerateChallengeClient(mContext, + mSensors.get(sensorId).getLazySession(), token, + new ClientMonitorCallbackConverter(receiver), opPackageName, + sensorId); + scheduleForSensor(sensorId, client); + } catch (RemoteException e) { + Slog.e(getTag(), "Remote exception when scheduling generateChallenge", e); + } }); } @Override - public void scheduleRevokeChallenge(int sensorId, @NonNull IBinder token, + public void scheduleRevokeChallenge(int sensorId, int userId, @NonNull IBinder token, @NonNull String opPackageName, long challenge) { mHandler.post(() -> { - final FingerprintRevokeChallengeClient client = - new FingerprintRevokeChallengeClient(mContext, mLazyDaemon, token, - opPackageName, sensorId, challenge); - scheduleForSensor(sensorId, client); + final IFingerprint daemon = getHalInstance(); + if (daemon == null) { + Slog.e(getTag(), "Null daemon during revokeChallenge, sensorId: " + sensorId); + return; + } + + try { + if (!mSensors.get(sensorId).hasSessionForUser(userId)) { + createNewSessionWithoutHandler(daemon, sensorId, userId); + } + + final FingerprintRevokeChallengeClient client = + new FingerprintRevokeChallengeClient(mContext, + mSensors.get(sensorId).getLazySession(), token, + opPackageName, sensorId, challenge); + scheduleForSensor(sensorId, client); + } catch (RemoteException e) { + Slog.e(getTag(), "Remote exception when scheduling revokeChallenge", e); + } }); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRevokeChallengeClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRevokeChallengeClient.java index 06edd650cbe51..ebb4fe63e4a1c 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRevokeChallengeClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintRevokeChallengeClient.java @@ -19,7 +19,7 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.fingerprint.IFingerprint; -import android.hardware.biometrics.fingerprint.IRevokeChallengeCallback; +import android.hardware.biometrics.fingerprint.ISession; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; @@ -29,23 +29,14 @@ import com.android.server.biometrics.sensors.RevokeChallengeClient; /** * Fingerprint-specific revokeChallenge client for the {@link IFingerprint} AIDL HAL interface. */ -class FingerprintRevokeChallengeClient extends RevokeChallengeClient { +class FingerprintRevokeChallengeClient extends RevokeChallengeClient { private static final String TAG = "FingerpirntRevokeChallengeClient"; private final long mChallenge; - private final IRevokeChallengeCallback mRevokeChallengeCallback = - new IRevokeChallengeCallback.Stub() { - @Override - public void onChallengeRevoked(int sensorId, int userId, long challenge) { - final boolean success = challenge == mChallenge; - mCallback.onClientFinished(FingerprintRevokeChallengeClient.this, success); - } - }; - FingerprintRevokeChallengeClient(@NonNull Context context, - @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, + @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, @NonNull String owner, int sensorId, long challenge) { super(context, lazyDaemon, token, owner, sensorId); mChallenge = challenge; @@ -54,10 +45,14 @@ class FingerprintRevokeChallengeClient extends RevokeChallengeClient { + final ClientMonitor client = mScheduler.getCurrentClient(); + if (!(client instanceof FingerprintGenerateChallengeClient)) { + Slog.e(mTag, "onChallengeGenerated for wrong client: " + + Utils.getClientName(client)); + return; + } + + final FingerprintGenerateChallengeClient generateChallengeClient = + (FingerprintGenerateChallengeClient) client; + generateChallengeClient.onChallengeGenerated(sensorId, userId, challenge); + }); + } + + @Override + public void onChallengeRevoked(long challenge) { + mHandler.post(() -> { + final ClientMonitor client = mScheduler.getCurrentClient(); + if (!(client instanceof FingerprintRevokeChallengeClient)) { + Slog.e(mTag, "onChallengeRevoked for wrong client: " + + Utils.getClientName(client)); + return; + } + + final FingerprintRevokeChallengeClient revokeChallengeClient = + (FingerprintRevokeChallengeClient) client; + revokeChallengeClient.onChallengeRevoked(sensorId, userId, challenge); + }); + } + @Override public void onAcquired(byte info, int vendorCode) { mHandler.post(() -> { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index 470fa1a2b4091..ab4427c5235c5 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -505,7 +505,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider } @Override - public void scheduleGenerateChallenge(int sensorId, @NonNull IBinder token, + public void scheduleGenerateChallenge(int sensorId, int userId, @NonNull IBinder token, @NonNull IFingerprintServiceReceiver receiver, @NonNull String opPackageName) { mHandler.post(() -> { final FingerprintGenerateChallengeClient client = @@ -517,7 +517,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider } @Override - public void scheduleRevokeChallenge(int sensorId, @NonNull IBinder token, + public void scheduleRevokeChallenge(int sensorId, int userId, @NonNull IBinder token, @NonNull String opPackageName, long challenge) { mHandler.post(() -> { final FingerprintRevokeChallengeClient client = new FingerprintRevokeChallengeClient(