Merge "Building IMSI encryption support." into oc-mr1-dev

This commit is contained in:
Pankaj Kanwar
2017-08-18 20:23:08 +00:00
committed by Android (Google) Code Review
2 changed files with 63 additions and 22 deletions

View File

@@ -1173,8 +1173,6 @@ public class CarrierConfigManager {
/** @hide */
public static final int CDMA_ROAMING_MODE_AFFILIATED = 1;
/** @hide */
public static final int IMSI_ENCRYPTION_DAYS_TIME_DISABLED = -1;
/** @hide */
public static final int CDMA_ROAMING_MODE_ANY = 2;
/**
* Boolean indicating if support is provided for directly dialing FDN number from FDN list.
@@ -1533,14 +1531,15 @@ public class CarrierConfigManager {
public static final String IMSI_KEY_DOWNLOAD_URL_STRING = "imsi_key_download_url_string";
/**
* Time in days, after which the key will expire, and a new key will need to be downloaded.
* default value is {@link IMSI_ENCRYPTION_DAYS_TIME_DISABLED}, and indicates that IMSI
* encryption is not enabled by default for a carrier. Value of 0 indicates that the key
* does not expire.
* Identifies if the key is available for WLAN or EPDG or both. The value is a bitmask.
* 0 indicates that neither EPDG or WLAN is enabled.
* 1 indicates that key type {@link TelephonyManager#KEY_TYPE_EPDG} is enabled.
* 2 indicates that key type {@link TelephonyManager#KEY_TYPE_WLAN} is enabled.
* 3 indicates that both are enabled.
* @hide
*/
public static final String IMSI_KEY_EXPIRATION_DAYS_TIME_INT =
"imsi_key_expiration_days_time_int";
public static final String IMSI_KEY_AVAILABILITY_INT = "imsi_key_availability_int";
/**
* Key identifying if the CDMA Caller ID presentation and suppression MMI codes
@@ -1814,7 +1813,7 @@ public class CarrierConfigManager {
sDefaults.putInt(KEY_LTE_EARFCNS_RSRP_BOOST_INT, 0);
sDefaults.putStringArray(KEY_BOOSTED_LTE_EARFCNS_STRING_ARRAY, null);
sDefaults.putBoolean(KEY_DISABLE_VOICE_BARRING_NOTIFICATION_BOOL, false);
sDefaults.putInt(IMSI_KEY_EXPIRATION_DAYS_TIME_INT, IMSI_ENCRYPTION_DAYS_TIME_DISABLED);
sDefaults.putInt(IMSI_KEY_AVAILABILITY_INT, 0);
sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null);
sDefaults.putBoolean(KEY_CONVERT_CDMA_CALLER_ID_MMI_CODES_WHILE_ROAMING_ON_3GPP_BOOL,
false);

View File

@@ -137,7 +137,7 @@ public class TelephonyManager {
/** @hide */
static public final int KEY_TYPE_EPDDG = 1;
static public final int KEY_TYPE_EPDG = 1;
/** @hide */
static public final int KEY_TYPE_WLAN = 2;
@@ -2373,33 +2373,75 @@ public class TelephonyManager {
* Requires Permission:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
* @param keyType whether the key is being used for wlan or epdg. Valid key types are
* {@link TelephonyManager#KEY_TYPE_EPDDG} or
* {@link TelephonyManager#KEY_TYPE_EPDG} or
* {@link TelephonyManager#KEY_TYPE_WLAN}.
* @return ImsiEncryptionInfo Carrier specific information that will be used to encrypt the
* IMSI and IMPI. This includes the public key and the key identifier. This information
* will be stored in the device keystore.
* will be stored in the device keystore. The system will return a null when no key was
* found, and the carrier does not require a key. The system will throw the following
* exceptions:
* 1. IllegalArgumentException when an invalid key is sent.
* 2. RuntimeException if the key is required but not found; and also if there was an
* internal exception.
* @hide
*/
public ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int keyType) {
try {
IPhoneSubInfo info = getSubscriberInfo();
if (info == null) return null;
int subId = getSubId(SubscriptionManager.getDefaultDataSubscriptionId());
if (keyType != KEY_TYPE_EPDDG && keyType != KEY_TYPE_WLAN) {
throw new IllegalArgumentException("Invalid key type");
if (info == null) {
throw new RuntimeException("IMSI error: Subscriber Info is null");
}
return info.getCarrierInfoForImsiEncryption(subId, keyType,
mContext.getOpPackageName());
int subId = getSubId(SubscriptionManager.getDefaultDataSubscriptionId());
if (keyType != KEY_TYPE_EPDG && keyType != KEY_TYPE_WLAN) {
throw new IllegalArgumentException("IMSI error: Invalid key type");
}
ImsiEncryptionInfo imsiEncryptionInfo = info.getCarrierInfoForImsiEncryption(
subId, keyType, mContext.getOpPackageName());
if (imsiEncryptionInfo == null
&& isImsiEncryptionRequired(subId, keyType)) {
Rlog.e(TAG, "IMSI error: key is required but not found");
throw new RuntimeException("IMSI error: key is required but not found");
}
return imsiEncryptionInfo;
} catch (RemoteException ex) {
Rlog.e(TAG, "getCarrierInfoForImsiEncryption RemoteException", ex);
return null;
Rlog.e(TAG, "getCarrierInfoForImsiEncryption RemoteException" + ex);
throw new RuntimeException("IMSI error: Remote Exception");
} catch (NullPointerException ex) {
// This could happen before phone restarts due to crashing
Rlog.e(TAG, "getCarrierInfoForImsiEncryption NullPointerException", ex);
return null;
Rlog.e(TAG, "getCarrierInfoForImsiEncryption NullPointerException" + ex);
throw new RuntimeException("IMSI error: Null Pointer exception");
}
}
/**
* @param keyAvailability bitmask that defines the availabilty of keys for a type.
* @param keyType the key type which is being checked. (WLAN, EPDG)
* @return true if the digit at position keyType is 1, else false.
* @hide
*/
private static boolean isKeyEnabled(int keyAvailability, int keyType) {
int returnValue = (keyAvailability >> (keyType - 1)) & 1;
return (returnValue == 1) ? true : false;
}
/**
* If Carrier requires Imsi to be encrypted.
* @hide
*/
private boolean isImsiEncryptionRequired(int subId, int keyType) {
CarrierConfigManager configManager =
(CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
if (configManager == null) {
return false;
}
PersistableBundle pb = configManager.getConfigForSubId(subId);
if (pb == null) {
return false;
}
int keyAvailability = pb.getInt(CarrierConfigManager.IMSI_KEY_AVAILABILITY_INT);
return isKeyEnabled(keyAvailability, keyType);
}
/**
* Sets the Carrier specific information that will be used to encrypt the IMSI and IMPI.
* This includes the public key and the key identifier. This information will be stored in the