Merge "Specify UID in getAuthenticatorIds" am: 47f27e64c0

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1687049

Change-Id: I9b81131c4f59d6855c83947003f70e59ab818f6f
This commit is contained in:
Treehugger Robot
2021-04-28 00:39:36 +00:00
committed by Automerger Merge Worker
3 changed files with 24 additions and 7 deletions

View File

@@ -26,7 +26,7 @@ import android.annotation.SystemApi;
import android.annotation.SystemService; import android.annotation.SystemService;
import android.content.Context; import android.content.Context;
import android.os.RemoteException; import android.os.RemoteException;
import android.security.keystore.KeyGenParameterSpec; import android.os.UserHandle;
import android.security.keystore.KeyProperties; import android.security.keystore.KeyProperties;
import android.util.Slog; import android.util.Slog;
@@ -334,11 +334,23 @@ public class BiometricManager {
* in Keystore land as SIDs, and are used during key generation. * in Keystore land as SIDs, and are used during key generation.
* @hide * @hide
*/ */
@RequiresPermission(USE_BIOMETRIC_INTERNAL)
public long[] getAuthenticatorIds() { public long[] getAuthenticatorIds() {
return getAuthenticatorIds(UserHandle.getCallingUserId());
}
/**
* Get a list of AuthenticatorIDs for biometric authenticators which have 1) enrolled templates,
* and 2) meet the requirements for integrating with Keystore. The AuthenticatorIDs are known
* in Keystore land as SIDs, and are used during key generation.
*
* @param userId Android user ID for user to look up.
*
* @hide
*/
public long[] getAuthenticatorIds(int userId) {
if (mService != null) { if (mService != null) {
try { try {
return mService.getAuthenticatorIds(); return mService.getAuthenticatorIds(userId);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
@@ -347,6 +359,5 @@ public class BiometricManager {
return new long[0]; return new long[0];
} }
} }
} }

View File

@@ -55,5 +55,7 @@ interface IAuthService {
// Get a list of AuthenticatorIDs for authenticators which have enrolled templates and meet // Get a list of AuthenticatorIDs for authenticators which have enrolled templates and meet
// the requirements for integrating with Keystore. The AuthenticatorID are known in Keystore // the requirements for integrating with Keystore. The AuthenticatorID are known in Keystore
// land as SIDs, and are used during key generation. // land as SIDs, and are used during key generation.
long[] getAuthenticatorIds(); // If userId is not equal to the calling user ID, the caller must have the
// USE_BIOMETRIC_INTERNAL permission.
long[] getAuthenticatorIds(in int userId);
} }

View File

@@ -289,7 +289,7 @@ public class AuthService extends SystemService {
} }
@Override @Override
public long[] getAuthenticatorIds() throws RemoteException { public long[] getAuthenticatorIds(int userId) throws RemoteException {
// In this method, we're not checking whether the caller is permitted to use face // In this method, we're not checking whether the caller is permitted to use face
// API because current authenticator ID is leaked (in a more contrived way) via Android // API because current authenticator ID is leaked (in a more contrived way) via Android
// Keystore (android.security.keystore package): the user of that API can create a key // Keystore (android.security.keystore package): the user of that API can create a key
@@ -307,9 +307,13 @@ public class AuthService extends SystemService {
// method from inside app processes. // method from inside app processes.
final int callingUserId = UserHandle.getCallingUserId(); final int callingUserId = UserHandle.getCallingUserId();
if (userId != callingUserId) {
getContext().enforceCallingOrSelfPermission(USE_BIOMETRIC_INTERNAL,
"Must have " + USE_BIOMETRIC_INTERNAL + " permission.");
}
final long identity = Binder.clearCallingIdentity(); final long identity = Binder.clearCallingIdentity();
try { try {
return mBiometricService.getAuthenticatorIds(callingUserId); return mBiometricService.getAuthenticatorIds(userId);
} finally { } finally {
Binder.restoreCallingIdentity(identity); Binder.restoreCallingIdentity(identity);
} }