Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53639960 authored by pkanwar's avatar pkanwar Committed by Pankaj Kanwar
Browse files

Building IMSI support for encryption. Changes to the JSON fields.

CPed from master.

BUG: 35606429
Test: runtest -x CarrierKeyDownloadMgrTest
Change-Id: Ie6b5e8607e661d0745e90df0e67f3c074a88f94a
parent 10453eb7
Loading
Loading
Loading
Loading
+45 −28
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import android.util.Pair;

import com.android.internal.annotations.VisibleForTesting;

@@ -44,10 +45,14 @@ import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.PublicKey;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Date;

/**
@@ -75,10 +80,9 @@ public class CarrierKeyDownloadManager {
    public static final String MCC = "MCC";
    private static final String SEPARATOR = ":";

    private static final String JSON_KEY = "key";
    private static final String JSON_CERTIFICATE = "certificate";
    private static final String JSON_TYPE = "type";
    private static final String JSON_IDENTIFIER = "identifier";
    private static final String JSON_EXPIRATION_DATE = "expiration-date";
    private static final String JSON_CARRIER_KEYS = "carrier-keys";
    private static final String JSON_TYPE_VALUE_WLAN = "WLAN";
    private static final String JSON_TYPE_VALUE_EPDG = "EPDG";
@@ -237,13 +241,13 @@ public class CarrierKeyDownloadManager {
    }

    /**
     * Returns the network operator.
     * Returns the sim operator.
     **/
    @VisibleForTesting
    public String getNetworkOperator() {
    public String getSimOperator() {
        final TelephonyManager telephonyManager =
                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        return telephonyManager.getNetworkOperator(mPhone.getSubId());
        return telephonyManager.getSimOperator(mPhone.getSubId());
    }

    /**
@@ -258,9 +262,9 @@ public class CarrierKeyDownloadManager {
        String mccSource = "";
        String mncSource = "";

        String networkOperator = getNetworkOperator();
        if (TextUtils.isEmpty(networkOperator) || TextUtils.isEmpty(mccMnc)) {
            Log.e(LOG_TAG, "networkOperator or mcc/mnc is empty");
        String simOperator = getSimOperator();
        if (TextUtils.isEmpty(simOperator) || TextUtils.isEmpty(mccMnc)) {
            Log.e(LOG_TAG, "simOperator or mcc/mnc is empty");
            return false;
        }

@@ -269,8 +273,8 @@ public class CarrierKeyDownloadManager {
        mncSource = splitValue[1];
        Log.d(LOG_TAG, "values from sharedPrefs mcc, mnc: " + mccSource + "," + mncSource);

        mccCurrent = networkOperator.substring(0, 3);
        mncCurrent = networkOperator.substring(3);
        mccCurrent = simOperator.substring(0, 3);
        mncCurrent = simOperator.substring(3);
        Log.d(LOG_TAG, "using values for mcc, mnc: " + mccCurrent + "," + mncCurrent);

        if (TextUtils.equals(mncSource, mncCurrent) &&  TextUtils.equals(mccSource, mccCurrent)) {
@@ -370,9 +374,8 @@ public class CarrierKeyDownloadManager {
     * including the Carrier public key, the key type and the key identifier. Once the nodes have
     * been extracted, they get persisted to the database. Sample:
     *      "carrier-keys": [ { "key": "",
     *                         "type": WLAN,
     *                         "identifier": "",
     *                         "expiration-date": 1502577746000
     *                         "type": "WLAN",
     *                         "identifier": ""
     *                        } ]
     * @param jsonStr the json string.
     * @param mccMnc contains the mcc, mnc
@@ -394,7 +397,7 @@ public class CarrierKeyDownloadManager {

            for (int i = 0; i < keys.length(); i++) {
                JSONObject key = keys.getJSONObject(i);
                String carrierKey = key.getString(JSON_KEY);
                String cert = key.getString(JSON_CERTIFICATE);
                String typeString = key.getString(JSON_TYPE);
                int type = UNINITIALIZED_KEY_TYPE;
                if (typeString.equals(JSON_TYPE_VALUE_WLAN)) {
@@ -402,13 +405,14 @@ public class CarrierKeyDownloadManager {
                } else if (typeString.equals(JSON_TYPE_VALUE_EPDG)) {
                    type = TelephonyManager.KEY_TYPE_EPDG;
                }
                long expiration_date = key.getLong(JSON_EXPIRATION_DATE);
                String identifier = key.getString(JSON_IDENTIFIER);
                savePublicKey(carrierKey, type, identifier, expiration_date,
                        mcc, mnc);
                Pair<PublicKey, Long> keyInfo = getKeyInformation(cert);
                savePublicKey(keyInfo.first, type, identifier, keyInfo.second, mcc, mnc);
            }
        } catch (final JSONException e) {
            Log.e(LOG_TAG, "Json parsing error: " + e.getMessage());
        } catch (final Exception e) {
            Log.e(LOG_TAG, "Exception getting certificate: " + e);
        }
    }

@@ -449,15 +453,13 @@ public class CarrierKeyDownloadManager {

    private boolean downloadKey() {
        Log.d(LOG_TAG, "starting download from: " + mURL);
        final TelephonyManager telephonyManager =
                (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        String mcc = "";
        String mnc = "";
        String networkOperator = telephonyManager.getNetworkOperator(mPhone.getSubId());
        String simOperator = getSimOperator();

        if (!TextUtils.isEmpty(networkOperator)) {
            mcc = networkOperator.substring(0, 3);
            mnc = networkOperator.substring(3);
        if (!TextUtils.isEmpty(simOperator)) {
            mcc = simOperator.substring(0, 3);
            mnc = simOperator.substring(3);
            Log.d(LOG_TAG, "using values for mcc, mnc: " + mcc + "," + mnc);
        } else {
            Log.e(LOG_TAG, "mcc, mnc: is empty");
@@ -485,19 +487,34 @@ public class CarrierKeyDownloadManager {

    /**
     * Save the public key
     * @param key public key that is base64 encoded.
     * @param certificate certificate that contains the public key.
     * @return Pair containing the Public Key and the expiration date.
     **/
    @VisibleForTesting
    public static Pair<PublicKey, Long> getKeyInformation(String certificate) throws Exception {
        byte[] derCert = Base64.decode(certificate.getBytes(), Base64.DEFAULT);
        InputStream inStream = new ByteArrayInputStream(derCert);
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        X509Certificate cert = (X509Certificate) cf.generateCertificate(inStream);
        Pair<PublicKey, Long> keyInformation =
                new Pair(cert.getPublicKey(), cert.getNotAfter().getTime());
        return keyInformation;
    }

    /**
     * Save the public key
     * @param publicKey public key.
     * @param type key-type.
     * @param identifier which is an opaque string.
     * @param expirationDate expiration date of the key.
     * @param mcc
     * @param mnc
     */
     **/
    @VisibleForTesting
    public void savePublicKey(String key, int type, String identifier, long expirationDate,
    public void savePublicKey(PublicKey publicKey, int type, String identifier, long expirationDate,
                               String mcc, String mnc) {
        byte[] keyBytes = Base64.decode(key.getBytes(), Base64.DEFAULT);
        ImsiEncryptionInfo imsiEncryptionInfo = new ImsiEncryptionInfo(mcc, mnc, type, identifier,
                keyBytes, new Date(expirationDate));
                publicKey, new Date(expirationDate));
        mPhone.setCarrierInfoForImsiEncryption(imsiEncryptionInfo);
    }
}
+23 −14
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */
package com.android.internal.telephony;

import static android.preference.PreferenceManager.getDefaultSharedPreferences;

import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
@@ -24,7 +26,7 @@ import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.ImsiEncryptionInfo;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Base64;
import android.util.Pair;

import org.junit.After;
import org.junit.Before;
@@ -32,14 +34,15 @@ import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.MockitoAnnotations;

import java.security.PublicKey;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import static android.preference.PreferenceManager.getDefaultSharedPreferences;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.times;
@@ -48,12 +51,14 @@ import static org.mockito.Mockito.when;

public class CarrierKeyDownloadMgrTest extends TelephonyTest {

    private static final String LOG_TAG = "CarrierKeyDownloadManager";

    private CarrierKeyDownloadManager mCarrierKeyDM;
    private CarrierActionAgentHandler mCarrierActionAgentHandler;

    private String mURL = "http://www.google.com";

    private String mJsonStr = "{ \"carrier-keys\": [ { \"key\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjGGHATBYlmas+0sEECkno8LZ1KPglb/mfe6VpCT3GhSr+7br7NG/ZwGZnEhLqE7YIH4fxltHmQC3Tz+jM1YN+kMaQgRRjo/LBCJdOKaMwUbkVynAH6OYsKevjrOPk8lfM5SFQzJMGsA9+Tfopr5xg0BwZ1vA/+E3mE7Tr3M2UvwIDAQAB\", \"type\": \"WLAN\", \"identifier\": \"key1=value\", \"expiration-date\": 1502577746000 }, { \"key\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjGGHATBYlmas+0sEECkno8LZ1KPglb/mfe6VpCT3GhSr+7br7NG/ZwGZnEhLqE7YIH4fxltHmQC3Tz+jM1YN+kMaQgRRjo/LBCJdOKaMwUbkVynAH6OYsKevjrOPk8lfM5SFQzJMGsA9+Tfopr5xg0BwZ1vA/+E3mE7Tr3M2UvwIDAQAB\", \"type\": \"WLAN\", \"identifier\": \"key1=value\", \"expiration-date\": 1502577746000 }]}";
    private String mJsonStr = "{ \"carrier-keys\": [ { \"certificate\": \"MIIFjzCCBHegAwIBAgIUPxj3SLif82Ky1RlUy8p2EWJCh8MwDQYJKoZIhvcNAQELBQAwgY0xCzAJBgNVBAYTAk5MMRIwEAYDVQQHEwlBbXN0ZXJkYW0xJTAjBgNVBAoTHFZlcml6b24gRW50ZXJwcmlzZSBTb2x1dGlvbnMxEzARBgNVBAsTCkN5YmVydHJ1c3QxLjAsBgNVBAMTJVZlcml6b24gUHVibGljIFN1cmVTZXJ2ZXIgQ0EgRzE0LVNIQTIwHhcNMTcwODE0MTc0MzM4WhcNMTkwODE0MTc0MzM4WjCBmTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFjAUBgNVBAcTDUJhc2tpbmcgUmlkZ2UxIjAgBgNVBAoTGVZlcml6b24gRGF0YSBTZXJ2aWNlcyBMTEMxHzAdBgNVBAsTFk5ldHdvcmsgU3lzdGVtIFN1cHBvcnQxGDAWBgNVBAMTD3ZpMWx2Lmltc3ZtLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALUQKWTHi4Hjpd1LQwJ87RXa0Rs3rVonvVevliqdUH5BikjhAzvIqwPSXeRQqkaRTFIyp0NKcNqGdjAaHRo43gdHeWSH331sS6CMZDg988gZznskzCqJJo6ii5FuLC8qe2YDsHxT+CefXev2rn6Bj1ei2X74uZsy5KlkBRZfFHtPdK6/EK5TpzrvcXfDyOK1rn8FTno1bQOTAhL39GPcLhdrXV7AN+lu+EBpdCqlTdcoDxsqavi/91MwUIVEzxJmycKloT6OWfU44r7+L5SYYgc88NTaGL/BvCFwHRIa1ZgYSGeAPes45792MGG7tfr/ttAGp9UEwTv2zWTxzWnRP/UCAwEAAaOCAdcwggHTMAwGA1UdEwEB/wQCMAAwTAYDVR0gBEUwQzBBBgkrBgEEAbE+ATIwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly9zZWN1cmUub21uaXJvb3QuY29tL3JlcG9zaXRvcnkwgakGCCsGAQUFBwEBBIGcMIGZMC0GCCsGAQUFBzABhiFodHRwOi8vdnBzc2cxNDIub2NzcC5vbW5pcm9vdC5jb20wMwYIKwYBBQUHMAKGJ2h0dHA6Ly9jYWNlcnQub21uaXJvb3QuY29tL3Zwc3NnMTQyLmNydDAzBggrBgEFBQcwAoYnaHR0cDovL2NhY2VydC5vbW5pcm9vdC5jb20vdnBzc2cxNDIuZGVyMBoGA1UdEQQTMBGCD3ZpMWx2Lmltc3ZtLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFOQtu5EBZSYftHo/oxUlpM6MRDM7MD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly92cHNzZzE0Mi5jcmwub21uaXJvb3QuY29tL3Zwc3NnMTQyLmNybDAdBgNVHQ4EFgQUv5SaSyNM/yXw1v0N9TNpjsFCaPcwDQYJKoZIhvcNAQELBQADggEBACNJusTULj1KyV4RwiskKfp4wI9Hsz3ESbZS/ijF9D57BQ0UwkELU9r6rEAhsYLUvMq4sDhDbYIdupgP4MBzFnjkKult7VQm5W3nCcuHgXYFAJ9Y1a4OZAo/4hrHj70W9TsQ1ioSMjUT4F8bDUYZI0kcyH8e/+2DaTsLUpHw3L+Keu8PsJVBLnvcKJjWrZD/Bgd6JuaTX2G84i0rY0GJuO9CxLNJa6n61Mz5cqLYIuwKgiVgTA2n71YITyFICOFPFX1vSx35AWvD6aVYblxtC8mpCdF2h4s1iyrpXeji2GCJLwsNVtTtNQ4zWX3Gnq683wzkYZeyOHUyftIgAQZ+HsY=\", \"type\": \"WLAN\", \"identifier\": \"key1=value\"}]}";

    private class CarrierActionAgentHandler extends HandlerThread {

@@ -129,7 +134,6 @@ public class CarrierKeyDownloadMgrTest extends TelephonyTest {
        Date expirationDate = new Date(mCarrierKeyDM.getExpirationDate());
        assertTrue(dt.format(expirationDate).equals(dateExpected));
    }

    /**
     * Checks if the json is parse correctly.
     * Verify if the savePublicKey method is called with the right params.
@@ -137,14 +141,19 @@ public class CarrierKeyDownloadMgrTest extends TelephonyTest {
    @Test
    @SmallTest
    public void testParseJson() {
        Date expirationDate = new Date(1502577746000L);
        String key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjGGHATBYlmas+0sEECkno8LZ1KPglb/mfe6VpCT3GhSr+7br7NG/ZwGZnEhLqE7YIH4fxltHmQC3Tz+jM1YN+kMaQgRRjo/LBCJdOKaMwUbkVynAH6OYsKevjrOPk8lfM5SFQzJMGsA9+Tfopr5xg0BwZ1vA/+E3mE7Tr3M2UvwIDAQAB";
        byte[] keyBytes = Base64.decode(key.getBytes(), Base64.DEFAULT);
        String certificate = "MIIFjzCCBHegAwIBAgIUPxj3SLif82Ky1RlUy8p2EWJCh8MwDQYJKoZIhvcNAQELBQAwgY0xCzAJBgNVBAYTAk5MMRIwEAYDVQQHEwlBbXN0ZXJkYW0xJTAjBgNVBAoTHFZlcml6b24gRW50ZXJwcmlzZSBTb2x1dGlvbnMxEzARBgNVBAsTCkN5YmVydHJ1c3QxLjAsBgNVBAMTJVZlcml6b24gUHVibGljIFN1cmVTZXJ2ZXIgQ0EgRzE0LVNIQTIwHhcNMTcwODE0MTc0MzM4WhcNMTkwODE0MTc0MzM4WjCBmTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFjAUBgNVBAcTDUJhc2tpbmcgUmlkZ2UxIjAgBgNVBAoTGVZlcml6b24gRGF0YSBTZXJ2aWNlcyBMTEMxHzAdBgNVBAsTFk5ldHdvcmsgU3lzdGVtIFN1cHBvcnQxGDAWBgNVBAMTD3ZpMWx2Lmltc3ZtLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALUQKWTHi4Hjpd1LQwJ87RXa0Rs3rVonvVevliqdUH5BikjhAzvIqwPSXeRQqkaRTFIyp0NKcNqGdjAaHRo43gdHeWSH331sS6CMZDg988gZznskzCqJJo6ii5FuLC8qe2YDsHxT+CefXev2rn6Bj1ei2X74uZsy5KlkBRZfFHtPdK6/EK5TpzrvcXfDyOK1rn8FTno1bQOTAhL39GPcLhdrXV7AN+lu+EBpdCqlTdcoDxsqavi/91MwUIVEzxJmycKloT6OWfU44r7+L5SYYgc88NTaGL/BvCFwHRIa1ZgYSGeAPes45792MGG7tfr/ttAGp9UEwTv2zWTxzWnRP/UCAwEAAaOCAdcwggHTMAwGA1UdEwEB/wQCMAAwTAYDVR0gBEUwQzBBBgkrBgEEAbE+ATIwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly9zZWN1cmUub21uaXJvb3QuY29tL3JlcG9zaXRvcnkwgakGCCsGAQUFBwEBBIGcMIGZMC0GCCsGAQUFBzABhiFodHRwOi8vdnBzc2cxNDIub2NzcC5vbW5pcm9vdC5jb20wMwYIKwYBBQUHMAKGJ2h0dHA6Ly9jYWNlcnQub21uaXJvb3QuY29tL3Zwc3NnMTQyLmNydDAzBggrBgEFBQcwAoYnaHR0cDovL2NhY2VydC5vbW5pcm9vdC5jb20vdnBzc2cxNDIuZGVyMBoGA1UdEQQTMBGCD3ZpMWx2Lmltc3ZtLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFOQtu5EBZSYftHo/oxUlpM6MRDM7MD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly92cHNzZzE0Mi5jcmwub21uaXJvb3QuY29tL3Zwc3NnMTQyLmNybDAdBgNVHQ4EFgQUv5SaSyNM/yXw1v0N9TNpjsFCaPcwDQYJKoZIhvcNAQELBQADggEBACNJusTULj1KyV4RwiskKfp4wI9Hsz3ESbZS/ijF9D57BQ0UwkELU9r6rEAhsYLUvMq4sDhDbYIdupgP4MBzFnjkKult7VQm5W3nCcuHgXYFAJ9Y1a4OZAo/4hrHj70W9TsQ1ioSMjUT4F8bDUYZI0kcyH8e/+2DaTsLUpHw3L+Keu8PsJVBLnvcKJjWrZD/Bgd6JuaTX2G84i0rY0GJuO9CxLNJa6n61Mz5cqLYIuwKgiVgTA2n71YITyFICOFPFX1vSx35AWvD6aVYblxtC8mpCdF2h4s1iyrpXeji2GCJLwsNVtTtNQ4zWX3Gnq683wzkYZeyOHUyftIgAQZ+HsY=";
        Pair<PublicKey, Long> keyInfo = null;
        try {
            keyInfo = CarrierKeyDownloadManager.getKeyInformation(certificate);
        } catch (Exception e) {
            fail(LOG_TAG + "exception creating public key");
        }
        ImsiEncryptionInfo imsiEncryptionInfo = new ImsiEncryptionInfo("310", "270", 2,
                "key1=value", keyBytes, expirationDate);
                "key1=value", keyInfo.first, new Date(keyInfo.second));
        String mccMnc = "310:270";
        mCarrierKeyDM.parseJsonAndPersistKey(mJsonStr, mccMnc);
        verify(mPhone, times(2)).setCarrierInfoForImsiEncryption((Matchers.refEq(imsiEncryptionInfo)));
        verify(mPhone, times(1)).setCarrierInfoForImsiEncryption(
                (Matchers.refEq(imsiEncryptionInfo)));
    }

    /**
@@ -168,7 +177,7 @@ public class CarrierKeyDownloadMgrTest extends TelephonyTest {
    @SmallTest
    public void testIsValidDownload() {
        String mccMnc = "310:260";
        when(mTelephonyManager.getNetworkOperator(anyInt())).thenReturn("310260");
        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
        assertTrue(mCarrierKeyDM.isValidDownload(mccMnc));
    }

@@ -180,7 +189,7 @@ public class CarrierKeyDownloadMgrTest extends TelephonyTest {
    @SmallTest
    public void testIsValidDownloadFail() {
        String mccMnc = "310:290";
        when(mTelephonyManager.getNetworkOperator(anyInt())).thenReturn("310260");
        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
        assertFalse(mCarrierKeyDM.isValidDownload(mccMnc));
    }

@@ -220,7 +229,7 @@ public class CarrierKeyDownloadMgrTest extends TelephonyTest {
        expectedCal.add(Calendar.DATE, 1);
        String dateExpected = dt.format(expectedCal.getTime());

        when(mTelephonyManager.getNetworkOperator(anyInt())).thenReturn("310260");
        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
        Intent mIntent = new Intent(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        mContext.sendBroadcast(mIntent);
        Date expirationDate = new Date(mCarrierKeyDM.getExpirationDate());
@@ -241,7 +250,7 @@ public class CarrierKeyDownloadMgrTest extends TelephonyTest {
        bundle.putInt(CarrierConfigManager.IMSI_KEY_AVAILABILITY_INT, 3);
        bundle.putString(CarrierConfigManager.IMSI_KEY_DOWNLOAD_URL_STRING, mURL);

        when(mTelephonyManager.getNetworkOperator(anyInt())).thenReturn("310260");
        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
        Intent mIntent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        mIntent.putExtra(PhoneConstants.PHONE_KEY, 0);
        mContext.sendBroadcast(mIntent);
@@ -264,7 +273,7 @@ public class CarrierKeyDownloadMgrTest extends TelephonyTest {
        bundle.putInt(CarrierConfigManager.IMSI_KEY_AVAILABILITY_INT, 3);
        bundle.putString(CarrierConfigManager.IMSI_KEY_DOWNLOAD_URL_STRING, mURL);

        when(mTelephonyManager.getNetworkOperator(anyInt())).thenReturn("310260");
        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
        Intent mIntent = new Intent("com.android.internal.telephony.carrier_key_download_alarm"
                + slotId);
        mContext.sendBroadcast(mIntent);