Loading proto/src/carrierId.proto +4 −0 Original line number Diff line number Diff line Loading @@ -79,5 +79,9 @@ message CarrierAttribute { // [Optional] Prefix of Integrated Circuit Card Identifier. Read from subscription EF_ICCID. // Sample values: 894430, 894410 repeated string iccid_prefix = 8; // [Optional] Carrier Privilege Access Rule in hex string. // Sample values: 61ed377e85d386a8dfee6b864bd85b0bfaa5af88 repeated string privilege_access_rule = 9; }; src/java/com/android/internal/telephony/CarrierIdentifier.java +38 −22 Original line number Diff line number Diff line Loading @@ -344,6 +344,7 @@ public class CarrierIdentifier extends Handler { cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.PLMN)), cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.SPN)), cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.APN)), cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.PRIVILEGE_ACCESS_RULE)), cursor.getInt(cursor.getColumnIndexOrThrow(CarrierId.CARRIER_ID)), cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.CARRIER_NAME))); } Loading @@ -351,7 +352,7 @@ public class CarrierIdentifier extends Handler { /** * carrier matching attributes with corresponding cid */ private static class CarrierMatchingRule { private class CarrierMatchingRule { /** * These scores provide the hierarchical relationship between the attributes, intended to * resolve conflicts in a deterministic way. The scores are constructed such that a match Loading @@ -361,26 +362,28 @@ public class CarrierIdentifier extends Handler { * rule 1 {mccmnc, imsi} rule 2 {mccmnc, imsi, gid1} and rule 3 {mccmnc, imsi, gid2} all * matches with subscription data. rule 2 wins with the highest matching score. */ private static final int SCORE_MCCMNC = 1 << 7; private static final int SCORE_IMSI_PREFIX = 1 << 6; private static final int SCORE_ICCID_PREFIX = 1 << 5; private static final int SCORE_GID1 = 1 << 4; private static final int SCORE_GID2 = 1 << 3; private static final int SCORE_PLMN = 1 << 2; private static final int SCORE_MCCMNC = 1 << 8; private static final int SCORE_IMSI_PREFIX = 1 << 7; private static final int SCORE_ICCID_PREFIX = 1 << 6; private static final int SCORE_GID1 = 1 << 5; private static final int SCORE_GID2 = 1 << 4; private static final int SCORE_PLMN = 1 << 3; private static final int SCORE_PRIVILEGE_ACCESS_RULE = 1 << 2; private static final int SCORE_SPN = 1 << 1; private static final int SCORE_APN = 1 << 0; private static final int SCORE_INVALID = -1; // carrier matching attributes private String mMccMnc; private String mImsiPrefixPattern; private String mIccidPrefix; private String mGid1; private String mGid2; private String mPlmn; private String mSpn; private String mApn; private final String mMccMnc; private final String mImsiPrefixPattern; private final String mIccidPrefix; private final String mGid1; private final String mGid2; private final String mPlmn; private final String mSpn; private final String mApn; private final String mPrivilegeAccessRule; // user-facing carrier name private String mName; Loading @@ -390,8 +393,8 @@ public class CarrierIdentifier extends Handler { private int mScore = 0; CarrierMatchingRule(String mccmnc, String imsiPrefixPattern, String iccidPrefix, String gid1, String gid2, String plmn, String spn, String apn, int cid, String name) { String gid1, String gid2, String plmn, String spn, String apn, String privilegeAccessRule, int cid, String name) { mMccMnc = mccmnc; mImsiPrefixPattern = imsiPrefixPattern; mIccidPrefix = iccidPrefix; Loading @@ -400,6 +403,7 @@ public class CarrierIdentifier extends Handler { mPlmn = plmn; mSpn = spn; mApn = apn; mPrivilegeAccessRule = privilegeAccessRule; mCid = cid; mName = name; } Loading Loading @@ -464,6 +468,16 @@ public class CarrierIdentifier extends Handler { } mScore += SCORE_SPN; } if (mPrivilegeAccessRule != null) { if (mUiccProfile == null || !mUiccProfile.hasCarrierPrivilegeRulesLoadedForCertHex( mPrivilegeAccessRule)) { mScore = SCORE_INVALID; return; } mScore += SCORE_PRIVILEGE_ACCESS_RULE; } if (mApn != null) { if (!CarrierIdentifier.equals(subscriptionRule.mApn, mApn, true)) { mScore = SCORE_INVALID; Loading Loading @@ -504,6 +518,7 @@ public class CarrierIdentifier extends Handler { + " imsi_prefix: " + mImsiPrefixPattern + " iccid_prefix" + mIccidPrefix + " spn: " + mSpn + " privilege_access_rule: " + mPrivilegeAccessRule + " apn: " + mApn + " name: " + mName + " cid: " + mCid Loading Loading @@ -542,7 +557,8 @@ public class CarrierIdentifier extends Handler { } CarrierMatchingRule subscriptionRule = new CarrierMatchingRule( mccmnc, imsi, iccid, gid1, gid2, plmn, spn, apn, mccmnc, imsi, iccid, gid1, gid2, plmn, spn, apn, null /** fetching privilege access rule is handled by CarrierMatchingRule#match **/, TelephonyManager.UNKNOWN_CARRIER_ID, null); int maxScore = CarrierMatchingRule.SCORE_INVALID; Loading src/java/com/android/internal/telephony/uicc/UiccProfile.java +20 −0 Original line number Diff line number Diff line Loading @@ -1463,6 +1463,26 @@ public class UiccProfile extends IccCard { carrierPrivilegeRules.getCarrierPrivilegeStatusForUid(packageManager, uid); } /** * Match the input certificate to any loaded carrier privileges access rules. * * @param cert certificate in hex string * @return true if matching certificate is found. false otherwise. */ public boolean hasCarrierPrivilegeRulesLoadedForCertHex(String cert) { UiccCarrierPrivilegeRules carrierPrivilegeRules = getCarrierPrivilegeRules(); if (carrierPrivilegeRules != null) { List<UiccAccessRule> accessRules = carrierPrivilegeRules.getAccessRules(); for (UiccAccessRule accessRule : accessRules) { String certHexString = accessRule.getCertificateHexString(); if (!TextUtils.isEmpty(certHexString) && certHexString.equalsIgnoreCase(cert)) { return true; } } } return false; } /** * Exposes {@link UiccCarrierPrivilegeRules#getCarrierPackageNamesForIntent}. */ Loading tests/telephonytests/src/com/android/internal/telephony/CarrierIdentifierTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -212,6 +212,7 @@ public class CarrierIdentifierTest extends TelephonyTest { CarrierId.All.PLMN, CarrierId.All.IMSI_PREFIX_XPATTERN, CarrierId.All.ICCID_PREFIX, CarrierId.All.PRIVILEGE_ACCESS_RULE, CarrierId.All.SPN, CarrierId.All.APN, CarrierId.CARRIER_NAME, Loading @@ -225,6 +226,7 @@ public class CarrierIdentifierTest extends TelephonyTest { null, // plmn null, // imsi_prefix null, // iccid_prefix null, // access rule null, // spn null, // apn NAME, // carrier name Loading @@ -238,6 +240,7 @@ public class CarrierIdentifierTest extends TelephonyTest { null, // plmn null, // imsi_prefix null, // iccid_prefix null, // access_rule null, // spn null, // apn NAME_TMO, // carrier name Loading @@ -251,6 +254,7 @@ public class CarrierIdentifierTest extends TelephonyTest { null, // plmn null, // imsi_prefix null, // iccid_prefix null, // access_rule SPN_FI, // spn null, // apn NAME_FI, // carrier name Loading @@ -264,6 +268,7 @@ public class CarrierIdentifierTest extends TelephonyTest { null, // plmn null, // imsi_prefix null, // iccid_prefix null, // access_rule null, // spn APN_DOCOMO, // apn NAME_DOCOMO, // carrier name Loading Loading
proto/src/carrierId.proto +4 −0 Original line number Diff line number Diff line Loading @@ -79,5 +79,9 @@ message CarrierAttribute { // [Optional] Prefix of Integrated Circuit Card Identifier. Read from subscription EF_ICCID. // Sample values: 894430, 894410 repeated string iccid_prefix = 8; // [Optional] Carrier Privilege Access Rule in hex string. // Sample values: 61ed377e85d386a8dfee6b864bd85b0bfaa5af88 repeated string privilege_access_rule = 9; };
src/java/com/android/internal/telephony/CarrierIdentifier.java +38 −22 Original line number Diff line number Diff line Loading @@ -344,6 +344,7 @@ public class CarrierIdentifier extends Handler { cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.PLMN)), cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.SPN)), cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.APN)), cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.All.PRIVILEGE_ACCESS_RULE)), cursor.getInt(cursor.getColumnIndexOrThrow(CarrierId.CARRIER_ID)), cursor.getString(cursor.getColumnIndexOrThrow(CarrierId.CARRIER_NAME))); } Loading @@ -351,7 +352,7 @@ public class CarrierIdentifier extends Handler { /** * carrier matching attributes with corresponding cid */ private static class CarrierMatchingRule { private class CarrierMatchingRule { /** * These scores provide the hierarchical relationship between the attributes, intended to * resolve conflicts in a deterministic way. The scores are constructed such that a match Loading @@ -361,26 +362,28 @@ public class CarrierIdentifier extends Handler { * rule 1 {mccmnc, imsi} rule 2 {mccmnc, imsi, gid1} and rule 3 {mccmnc, imsi, gid2} all * matches with subscription data. rule 2 wins with the highest matching score. */ private static final int SCORE_MCCMNC = 1 << 7; private static final int SCORE_IMSI_PREFIX = 1 << 6; private static final int SCORE_ICCID_PREFIX = 1 << 5; private static final int SCORE_GID1 = 1 << 4; private static final int SCORE_GID2 = 1 << 3; private static final int SCORE_PLMN = 1 << 2; private static final int SCORE_MCCMNC = 1 << 8; private static final int SCORE_IMSI_PREFIX = 1 << 7; private static final int SCORE_ICCID_PREFIX = 1 << 6; private static final int SCORE_GID1 = 1 << 5; private static final int SCORE_GID2 = 1 << 4; private static final int SCORE_PLMN = 1 << 3; private static final int SCORE_PRIVILEGE_ACCESS_RULE = 1 << 2; private static final int SCORE_SPN = 1 << 1; private static final int SCORE_APN = 1 << 0; private static final int SCORE_INVALID = -1; // carrier matching attributes private String mMccMnc; private String mImsiPrefixPattern; private String mIccidPrefix; private String mGid1; private String mGid2; private String mPlmn; private String mSpn; private String mApn; private final String mMccMnc; private final String mImsiPrefixPattern; private final String mIccidPrefix; private final String mGid1; private final String mGid2; private final String mPlmn; private final String mSpn; private final String mApn; private final String mPrivilegeAccessRule; // user-facing carrier name private String mName; Loading @@ -390,8 +393,8 @@ public class CarrierIdentifier extends Handler { private int mScore = 0; CarrierMatchingRule(String mccmnc, String imsiPrefixPattern, String iccidPrefix, String gid1, String gid2, String plmn, String spn, String apn, int cid, String name) { String gid1, String gid2, String plmn, String spn, String apn, String privilegeAccessRule, int cid, String name) { mMccMnc = mccmnc; mImsiPrefixPattern = imsiPrefixPattern; mIccidPrefix = iccidPrefix; Loading @@ -400,6 +403,7 @@ public class CarrierIdentifier extends Handler { mPlmn = plmn; mSpn = spn; mApn = apn; mPrivilegeAccessRule = privilegeAccessRule; mCid = cid; mName = name; } Loading Loading @@ -464,6 +468,16 @@ public class CarrierIdentifier extends Handler { } mScore += SCORE_SPN; } if (mPrivilegeAccessRule != null) { if (mUiccProfile == null || !mUiccProfile.hasCarrierPrivilegeRulesLoadedForCertHex( mPrivilegeAccessRule)) { mScore = SCORE_INVALID; return; } mScore += SCORE_PRIVILEGE_ACCESS_RULE; } if (mApn != null) { if (!CarrierIdentifier.equals(subscriptionRule.mApn, mApn, true)) { mScore = SCORE_INVALID; Loading Loading @@ -504,6 +518,7 @@ public class CarrierIdentifier extends Handler { + " imsi_prefix: " + mImsiPrefixPattern + " iccid_prefix" + mIccidPrefix + " spn: " + mSpn + " privilege_access_rule: " + mPrivilegeAccessRule + " apn: " + mApn + " name: " + mName + " cid: " + mCid Loading Loading @@ -542,7 +557,8 @@ public class CarrierIdentifier extends Handler { } CarrierMatchingRule subscriptionRule = new CarrierMatchingRule( mccmnc, imsi, iccid, gid1, gid2, plmn, spn, apn, mccmnc, imsi, iccid, gid1, gid2, plmn, spn, apn, null /** fetching privilege access rule is handled by CarrierMatchingRule#match **/, TelephonyManager.UNKNOWN_CARRIER_ID, null); int maxScore = CarrierMatchingRule.SCORE_INVALID; Loading
src/java/com/android/internal/telephony/uicc/UiccProfile.java +20 −0 Original line number Diff line number Diff line Loading @@ -1463,6 +1463,26 @@ public class UiccProfile extends IccCard { carrierPrivilegeRules.getCarrierPrivilegeStatusForUid(packageManager, uid); } /** * Match the input certificate to any loaded carrier privileges access rules. * * @param cert certificate in hex string * @return true if matching certificate is found. false otherwise. */ public boolean hasCarrierPrivilegeRulesLoadedForCertHex(String cert) { UiccCarrierPrivilegeRules carrierPrivilegeRules = getCarrierPrivilegeRules(); if (carrierPrivilegeRules != null) { List<UiccAccessRule> accessRules = carrierPrivilegeRules.getAccessRules(); for (UiccAccessRule accessRule : accessRules) { String certHexString = accessRule.getCertificateHexString(); if (!TextUtils.isEmpty(certHexString) && certHexString.equalsIgnoreCase(cert)) { return true; } } } return false; } /** * Exposes {@link UiccCarrierPrivilegeRules#getCarrierPackageNamesForIntent}. */ Loading
tests/telephonytests/src/com/android/internal/telephony/CarrierIdentifierTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -212,6 +212,7 @@ public class CarrierIdentifierTest extends TelephonyTest { CarrierId.All.PLMN, CarrierId.All.IMSI_PREFIX_XPATTERN, CarrierId.All.ICCID_PREFIX, CarrierId.All.PRIVILEGE_ACCESS_RULE, CarrierId.All.SPN, CarrierId.All.APN, CarrierId.CARRIER_NAME, Loading @@ -225,6 +226,7 @@ public class CarrierIdentifierTest extends TelephonyTest { null, // plmn null, // imsi_prefix null, // iccid_prefix null, // access rule null, // spn null, // apn NAME, // carrier name Loading @@ -238,6 +240,7 @@ public class CarrierIdentifierTest extends TelephonyTest { null, // plmn null, // imsi_prefix null, // iccid_prefix null, // access_rule null, // spn null, // apn NAME_TMO, // carrier name Loading @@ -251,6 +254,7 @@ public class CarrierIdentifierTest extends TelephonyTest { null, // plmn null, // imsi_prefix null, // iccid_prefix null, // access_rule SPN_FI, // spn null, // apn NAME_FI, // carrier name Loading @@ -264,6 +268,7 @@ public class CarrierIdentifierTest extends TelephonyTest { null, // plmn null, // imsi_prefix null, // iccid_prefix null, // access_rule null, // spn APN_DOCOMO, // apn NAME_DOCOMO, // carrier name Loading