Merge "Move generateChallenge/revokeChallenge to ISession"

This commit is contained in:
Ilya Matyukhin
2020-10-17 00:10:47 +00:00
committed by Android (Google) Code Review
9 changed files with 127 additions and 66 deletions

View File

@@ -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<FingerprintSensorPropertiesInternal> 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<FingerprintSensorPropertiesInternal> 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();
}

View File

@@ -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);

View File

@@ -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<Integer, ServiceProvider> 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);
}

View File

@@ -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,

View File

@@ -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<IFingerprint> {
class FingerprintGenerateChallengeClient extends GenerateChallengeClient<ISession> {
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<IFingerprint> lazyDaemon,
@NonNull LazyDaemon<ISession> lazyDaemon,
@NonNull IBinder token,
@NonNull ClientMonitorCallbackConverter listener,
@NonNull String owner, int sensorId) {
@@ -61,11 +45,21 @@ class FingerprintGenerateChallengeClient extends GenerateChallengeClient<IFinger
@Override
protected void startHalOperation() {
try {
getFreshDaemon().generateChallenge(getSensorId(), getTargetUserId(),
CHALLENGE_TIMEOUT_SEC,
mGenerateChallengeCallback);
getFreshDaemon().generateChallenge(mSequentialId, CHALLENGE_TIMEOUT_SEC);
} catch (RemoteException e) {
Slog.e(TAG, "Unable to generateChallenge", e);
}
}
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 */);
}
}
}

View File

@@ -274,24 +274,55 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
}
@Override
public void scheduleGenerateChallenge(int sensorId, @NonNull IBinder token,
public void scheduleGenerateChallenge(int sensorId, int userId, @NonNull IBinder token,
@NonNull IFingerprintServiceReceiver receiver, String opPackageName) {
mHandler.post(() -> {
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);
}
});
}

View File

@@ -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<IFingerprint> {
class FingerprintRevokeChallengeClient extends RevokeChallengeClient<ISession> {
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<IFingerprint> lazyDaemon, @NonNull IBinder token,
@NonNull LazyDaemon<ISession> 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<IFingerprin
@Override
protected void startHalOperation() {
try {
getFreshDaemon().revokeChallenge(getSensorId(), getTargetUserId(), mChallenge,
mRevokeChallengeCallback);
getFreshDaemon().revokeChallenge(mSequentialId, mChallenge);
} catch (RemoteException e) {
Slog.e(TAG, "Unable to revokeChallenge", e);
}
}
void onChallengeRevoked(int sensorId, int userId, long challenge) {
final boolean success = challenge == mChallenge;
mCallback.onClientFinished(FingerprintRevokeChallengeClient.this, success);
}
}

View File

@@ -141,6 +141,38 @@ class Sensor implements IBinder.DeathRecipient {
// TODO(b/162973174)
}
@Override
public void onChallengeGenerated(long challenge) {
mHandler.post(() -> {
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(() -> {

View File

@@ -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(