Merge "Update PM#checkSignatures by uid to support pre-key rotation behavior" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
3369bbd82a
@@ -2548,9 +2548,18 @@ public class PackageManagerTests extends AndroidTestCase {
|
|||||||
} else {
|
} else {
|
||||||
installFromRawResource(apk2Name, apk2, 0, false, false, -1,
|
installFromRawResource(apk2Name, apk2, 0, false, false, -1,
|
||||||
PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
|
PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
|
||||||
int match = mContext.getPackageManager().checkSignatures(pkg1.getPackageName(),
|
// TODO: All checkSignatures tests should return the same result regardless of
|
||||||
pkg2.getPackageName());
|
// querying by package name or uid; however if there are any edge cases where
|
||||||
assertEquals(expMatchResult, match);
|
// individual packages within a shareduid are compared with signatures that do not
|
||||||
|
// match the full lineage of the shareduid this method should be overloaded to
|
||||||
|
// accept the expected response for the uid query.
|
||||||
|
PackageManager pm = getPm();
|
||||||
|
int matchByName = pm.checkSignatures(pkg1.getPackageName(), pkg2.getPackageName());
|
||||||
|
int pkg1Uid = pm.getApplicationInfo(pkg1.getPackageName(), 0).uid;
|
||||||
|
int pkg2Uid = pm.getApplicationInfo(pkg2.getPackageName(), 0).uid;
|
||||||
|
int matchByUid = pm.checkSignatures(pkg1Uid, pkg2Uid);
|
||||||
|
assertEquals(expMatchResult, matchByName);
|
||||||
|
assertEquals(expMatchResult, matchByUid);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
if (cleanUp) {
|
if (cleanUp) {
|
||||||
|
|||||||
@@ -5966,25 +5966,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
|| shouldFilterApplicationLocked(ps2, callingUid, callingUserId)) {
|
|| shouldFilterApplicationLocked(ps2, callingUid, callingUserId)) {
|
||||||
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
||||||
}
|
}
|
||||||
SigningDetails p1SigningDetails = p1.getSigningDetails();
|
return checkSignaturesInternal(p1.getSigningDetails(), p2.getSigningDetails());
|
||||||
SigningDetails p2SigningDetails = p2.getSigningDetails();
|
|
||||||
int result = compareSignatures(p1SigningDetails.signatures,
|
|
||||||
p2SigningDetails.signatures);
|
|
||||||
// To support backwards compatibility with clients of this API expecting pre-key
|
|
||||||
// rotation results if either of the packages has a signing lineage the oldest signer
|
|
||||||
// in the lineage is used for signature verification.
|
|
||||||
if (result != PackageManager.SIGNATURE_MATCH && (
|
|
||||||
p1SigningDetails.hasPastSigningCertificates()
|
|
||||||
|| p2SigningDetails.hasPastSigningCertificates())) {
|
|
||||||
Signature[] p1Signatures = p1SigningDetails.hasPastSigningCertificates()
|
|
||||||
? new Signature[]{p1SigningDetails.pastSigningCertificates[0]}
|
|
||||||
: p1SigningDetails.signatures;
|
|
||||||
Signature[] p2Signatures = p2SigningDetails.hasPastSigningCertificates()
|
|
||||||
? new Signature[]{p2SigningDetails.pastSigningCertificates[0]}
|
|
||||||
: p2SigningDetails.signatures;
|
|
||||||
result = compareSignatures(p1Signatures, p2Signatures);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5998,21 +5980,21 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
final int appId2 = UserHandle.getAppId(uid2);
|
final int appId2 = UserHandle.getAppId(uid2);
|
||||||
// reader
|
// reader
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
Signature[] s1;
|
SigningDetails p1SigningDetails;
|
||||||
Signature[] s2;
|
SigningDetails p2SigningDetails;
|
||||||
Object obj = mSettings.getSettingLPr(appId1);
|
Object obj = mSettings.getSettingLPr(appId1);
|
||||||
if (obj != null) {
|
if (obj != null) {
|
||||||
if (obj instanceof SharedUserSetting) {
|
if (obj instanceof SharedUserSetting) {
|
||||||
if (isCallerInstantApp) {
|
if (isCallerInstantApp) {
|
||||||
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
||||||
}
|
}
|
||||||
s1 = ((SharedUserSetting)obj).signatures.mSigningDetails.signatures;
|
p1SigningDetails = ((SharedUserSetting) obj).signatures.mSigningDetails;
|
||||||
} else if (obj instanceof PackageSetting) {
|
} else if (obj instanceof PackageSetting) {
|
||||||
final PackageSetting ps = (PackageSetting) obj;
|
final PackageSetting ps = (PackageSetting) obj;
|
||||||
if (shouldFilterApplicationLocked(ps, callingUid, callingUserId)) {
|
if (shouldFilterApplicationLocked(ps, callingUid, callingUserId)) {
|
||||||
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
||||||
}
|
}
|
||||||
s1 = ps.signatures.mSigningDetails.signatures;
|
p1SigningDetails = ps.signatures.mSigningDetails;
|
||||||
} else {
|
} else {
|
||||||
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
||||||
}
|
}
|
||||||
@@ -6025,23 +6007,53 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
if (isCallerInstantApp) {
|
if (isCallerInstantApp) {
|
||||||
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
||||||
}
|
}
|
||||||
s2 = ((SharedUserSetting)obj).signatures.mSigningDetails.signatures;
|
p2SigningDetails = ((SharedUserSetting) obj).signatures.mSigningDetails;
|
||||||
} else if (obj instanceof PackageSetting) {
|
} else if (obj instanceof PackageSetting) {
|
||||||
final PackageSetting ps = (PackageSetting) obj;
|
final PackageSetting ps = (PackageSetting) obj;
|
||||||
if (shouldFilterApplicationLocked(ps, callingUid, callingUserId)) {
|
if (shouldFilterApplicationLocked(ps, callingUid, callingUserId)) {
|
||||||
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
||||||
}
|
}
|
||||||
s2 = ps.signatures.mSigningDetails.signatures;
|
p2SigningDetails = ps.signatures.mSigningDetails;
|
||||||
} else {
|
} else {
|
||||||
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
|
||||||
}
|
}
|
||||||
return compareSignatures(s1, s2);
|
return checkSignaturesInternal(p1SigningDetails, p2SigningDetails);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int checkSignaturesInternal(SigningDetails p1SigningDetails,
|
||||||
|
SigningDetails p2SigningDetails) {
|
||||||
|
if (p1SigningDetails == null) {
|
||||||
|
return p2SigningDetails == null
|
||||||
|
? PackageManager.SIGNATURE_NEITHER_SIGNED
|
||||||
|
: PackageManager.SIGNATURE_FIRST_NOT_SIGNED;
|
||||||
|
}
|
||||||
|
if (p2SigningDetails == null) {
|
||||||
|
return PackageManager.SIGNATURE_SECOND_NOT_SIGNED;
|
||||||
|
}
|
||||||
|
int result = compareSignatures(p1SigningDetails.signatures, p2SigningDetails.signatures);
|
||||||
|
if (result == PackageManager.SIGNATURE_MATCH) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
// To support backwards compatibility with clients of this API expecting pre-key
|
||||||
|
// rotation results if either of the packages has a signing lineage the oldest signer
|
||||||
|
// in the lineage is used for signature verification.
|
||||||
|
if (p1SigningDetails.hasPastSigningCertificates()
|
||||||
|
|| p2SigningDetails.hasPastSigningCertificates()) {
|
||||||
|
Signature[] p1Signatures = p1SigningDetails.hasPastSigningCertificates()
|
||||||
|
? new Signature[]{p1SigningDetails.pastSigningCertificates[0]}
|
||||||
|
: p1SigningDetails.signatures;
|
||||||
|
Signature[] p2Signatures = p2SigningDetails.hasPastSigningCertificates()
|
||||||
|
? new Signature[]{p2SigningDetails.pastSigningCertificates[0]}
|
||||||
|
: p2SigningDetails.signatures;
|
||||||
|
result = compareSignatures(p1Signatures, p2Signatures);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasSigningCertificate(
|
public boolean hasSigningCertificate(
|
||||||
String packageName, byte[] certificate, @PackageManager.CertificateInputType int type) {
|
String packageName, byte[] certificate, @PackageManager.CertificateInputType int type) {
|
||||||
|
|||||||
Reference in New Issue
Block a user