in niap-cc/Permissions/Tester/app/src/main/java/com/android/certifications/niap/permissions/NonPlatformPermissionTester.java [55:112]
public boolean runPermissionTests() {
boolean allTestsPassed = true;
// Maintain a mapping of permissions to declaring packages; this way if a configuration
// specifies a static list of permissions each permission can be looked up in expected
// constant time.
Map<String, String> permissionToPackage = new HashMap<>();
List<PermissionInfo> declaredPermissions = PermissionUtils.getAllDeclaredPermissions(mContext);
for (PermissionInfo permission : declaredPermissions) {
// Ensure that the permission has signature protection level with no other
// protection flags; the most common seen are privileged and preinstalled.
if (!permission.packageName.equals(Constants.PLATFORM_PACKAGE)
&& permission.getProtection() == PermissionInfo.PROTECTION_SIGNATURE
&& permission.getProtectionFlags() == 0) {
permissionToPackage.put(permission.name, permission.packageName);
}
}
byte[] signatureBytes = mAppSignature.toByteArray();
List<String> permissions = mConfiguration.getPermissions().orElse(
new ArrayList<>(permissionToPackage.keySet()));
// Maintain a mapping of each of the preloaded packages declaring signature permissions and
// whether this app is signed by that package's signing key to minimize calls to
// hasSigningCertificate.
Map<String, Boolean> packageSignatureMatch = new HashMap<>();
for (String permission : permissions) {
// Only test those signature permissions that are declared on the device to avoid false
// positives when the permission is expected to be granted.
if (!permissionToPackage.containsKey(permission)) {
mLogger.logDebug("Permission " + permission
+ " is not declared by a non-platform package on this device");
continue;
}
String packageName = permissionToPackage.get(permission);
boolean signatureMatch;
boolean permissionGranted = isPermissionGranted(permission);
if (!packageSignatureMatch.containsKey(packageName)) {
signatureMatch = mPackageManager.hasSigningCertificate(packageName,
signatureBytes, PackageManager.CERT_INPUT_RAW_X509);
packageSignatureMatch.put(packageName, signatureMatch);
} else {
signatureMatch = packageSignatureMatch.get(packageName);
}
if (permissionGranted != (signatureMatch || mPlatformSignatureMatch)) {
allTestsPassed = false;
}
StatusLogger.logSignaturePermissionStatus(permission, permissionGranted, signatureMatch,
mPlatformSignatureMatch);
}
if (allTestsPassed) {
StatusLogger.logInfo(
"*** PASSED - all non-framework signature permission tests completed "
+ "successfully");
} else {
StatusLogger.logInfo(
"!!! FAILED - one or more non-framework signature permission tests failed");
}
return allTestsPassed;
}