1aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar/*
2aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * Copyright (C) 2017 The Android Open Source Project
3aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar *
4aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * Licensed under the Apache License, Version 2.0 (the "License");
5aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * you may not use this file except in compliance with the License.
6aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * You may obtain a copy of the License at
7aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar *
8aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar *      http://www.apache.org/licenses/LICENSE-2.0
9aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar *
10aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * Unless required by applicable law or agreed to in writing, software
11aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * distributed under the License is distributed on an "AS IS" BASIS,
12aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * See the License for the specific language governing permissions and
14aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar * limitations under the License.
15aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar */
16aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarpackage com.android.internal.telephony;
17aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
18aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.app.DownloadManager;
19aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.content.Context;
20aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.content.Intent;
21aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.content.SharedPreferences;
22aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.os.HandlerThread;
23aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.os.PersistableBundle;
24aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.telephony.CarrierConfigManager;
25aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.telephony.ImsiEncryptionInfo;
26aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.test.suitebuilder.annotation.SmallTest;
275363996028cca9a2707dae86ffc1b94b364e3cb0pkanwarimport android.util.Pair;
28aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
296d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwarimport com.android.org.bouncycastle.util.io.pem.PemReader;
306d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar
31aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport org.junit.After;
32aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport org.junit.Before;
33aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport org.junit.Test;
34aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport org.mockito.Matchers;
35aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport org.mockito.MockitoAnnotations;
36aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
376d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwarimport java.io.BufferedReader;
386d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwarimport java.io.ByteArrayInputStream;
396d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwarimport java.io.InputStreamReader;
406d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwarimport java.io.Reader;
415363996028cca9a2707dae86ffc1b94b364e3cb0pkanwarimport java.security.PublicKey;
42aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport java.text.SimpleDateFormat;
43aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport java.util.Calendar;
44aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport java.util.Date;
45aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport java.util.GregorianCalendar;
46aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
476d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwarimport static android.preference.PreferenceManager.getDefaultSharedPreferences;
48aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport static org.junit.Assert.assertFalse;
49aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport static org.junit.Assert.assertTrue;
505363996028cca9a2707dae86ffc1b94b364e3cb0pkanwarimport static org.junit.Assert.fail;
51aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport static org.mockito.ArgumentMatchers.any;
52aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport static org.mockito.Mockito.anyInt;
53aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport static org.mockito.Mockito.times;
54aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport static org.mockito.Mockito.verify;
55aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport static org.mockito.Mockito.when;
56aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
57aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarpublic class CarrierKeyDownloadMgrTest extends TelephonyTest {
58aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
595363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar    private static final String LOG_TAG = "CarrierKeyDownloadManager";
605363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar
61aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    private CarrierKeyDownloadManager mCarrierKeyDM;
62aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    private CarrierActionAgentHandler mCarrierActionAgentHandler;
63aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
64aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    private String mURL = "http://www.google.com";
65aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
666d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar    private static final String CERT = "-----BEGIN CERTIFICATE-----\r\nMIIFjzCCBHegAwIBAgIUPxj3SLif82Ky1RlUy8p2EWJCh8MwDQYJKoZIhvcNAQELBQAwgY0xCzAJBgNVBAYTAk5MMRIwEAYDVQQHEwlBbXN0ZXJkYW0xJTAjBgNVBAoTHFZlcml6b24gRW50ZXJwcmlzZSBTb2x1dGlvbnMxEzARBgNVBAsTCkN5YmVydHJ1c3QxLjAsBgNVBAMTJVZlcml6b24gUHVibGljIFN1cmVTZXJ2ZXIgQ0EgRzE0LVNIQTIwHhcNMTcwODE0MTc0MzM4WhcNMTkwODE0MTc0MzM4WjCBmTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFjAUBgNVBAcTDUJhc2tpbmcgUmlkZ2UxIjAgBgNVBAoTGVZlcml6b24gRGF0YSBTZXJ2aWNlcyBMTEMxHzAdBgNVBAsTFk5ldHdvcmsgU3lzdGVtIFN1cHBvcnQxGDAWBgNVBAMTD3ZpMWx2Lmltc3ZtLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALUQKWTHi4Hjpd1LQwJ87RXa0Rs3rVonvVevliqdUH5BikjhAzvIqwPSXeRQqkaRTFIyp0NKcNqGdjAaHRo43gdHeWSH331sS6CMZDg988gZznskzCqJJo6ii5FuLC8qe2YDsHxT+CefXev2rn6Bj1ei2X74uZsy5KlkBRZfFHtPdK6/EK5TpzrvcXfDyOK1rn8FTno1bQOTAhL39GPcLhdrXV7AN+lu+EBpdCqlTdcoDxsqavi/91MwUIVEzxJmycKloT6OWfU44r7+L5SYYgc88NTaGL/BvCFwHRIa1ZgYSGeAPes45792MGG7tfr/ttAGp9UEwTv2zWTxzWnRP/UCAwEAAaOCAdcwggHTMAwGA1UdEwEB/wQCMAAwTAYDVR0gBEUwQzBBBgkrBgEEAbE+ATIwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly9zZWN1cmUub21uaXJvb3QuY29tL3JlcG9zaXRvcnkwgakGCCsGAQUFBwEBBIGcMIGZMC0GCCsGAQUFBzABhiFodHRwOi8vdnBzc2cxNDIub2NzcC5vbW5pcm9vdC5jb20wMwYIKwYBBQUHMAKGJ2h0dHA6Ly9jYWNlcnQub21uaXJvb3QuY29tL3Zwc3NnMTQyLmNydDAzBggrBgEFBQcwAoYnaHR0cDovL2NhY2VydC5vbW5pcm9vdC5jb20vdnBzc2cxNDIuZGVyMBoGA1UdEQQTMBGCD3ZpMWx2Lmltc3ZtLmNvbTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFOQtu5EBZSYftHo/oxUlpM6MRDM7MD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly92cHNzZzE0Mi5jcmwub21uaXJvb3QuY29tL3Zwc3NnMTQyLmNybDAdBgNVHQ4EFgQUv5SaSyNM/yXw1v0N9TNpjsFCaPcwDQYJKoZIhvcNAQELBQADggEBACNJusTULj1KyV4RwiskKfp4wI9Hsz3ESbZS/ijF9D57BQ0UwkELU9r6rEAhsYLUvMq4sDhDbYIdupgP4MBzFnjkKult7VQm5W3nCcuHgXYFAJ9Y1a4OZAo/4hrHj70W9TsQ1ioSMjUT4F8bDUYZI0kcyH8e/+2DaTsLUpHw3L+Keu8PsJVBLnvcKJjWrZD/Bgd6JuaTX2G84i0rY0GJuO9CxLNJa6n61Mz5cqLYIuwKgiVgTA2n71YITyFICOFPFX1vSx35AWvD6aVYblxtC8mpCdF2h4s1iyrpXeji2GCJLwsNVtTtNQ4zWX3Gnq683wzkYZeyOHUyftIgAQZ+HsY=\r\n-----END CERTIFICATE-----";
676d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar
686d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar
696d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar    private String mJsonStr = "{ \"carrier-keys\": [ { \"certificate\": \"" + CERT + "\", \"key-type\": \"WLAN\", \"key-identifier\": \"key1=value\", \"expiration-date\": 1502577746000 }, { \"certificate\": \"" + CERT + "\", \"key-type\": \"WLAN\", \"key-identifier\": \"key1=value\", \"expiration-date\": 1502577746000 }]}";
706d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar
716d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar    private String mJsonStr1 = "{ \"carrier-keys\": [ { \"public-key\": \"" + CERT + "\", \"key-type\": \"WLAN\", \"key-identifier\": \"key1=value\", \"expiration-date\": 1502577746000 }, { \"public-key\": \"" + CERT + "\", \"key-type\": \"WLAN\", \"key-identifier\": \"key1=value\", \"expiration-date\": 1502577746000 }]}";
72aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
73aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    private class CarrierActionAgentHandler extends HandlerThread {
74aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
75aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        private CarrierActionAgentHandler(String name) {
76aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar            super(name);
77aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        }
78aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
79aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        @Override
80aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        public void onLooperPrepared() {
81aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar            mCarrierKeyDM = new CarrierKeyDownloadManager(mPhone);
82aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar            setReady(true);
83aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        }
84aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
85aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
86aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Before
87aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void setUp() throws Exception {
88aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        logd("CarrierActionAgentTest +Setup!");
89aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        MockitoAnnotations.initMocks(this);
90aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        super.setUp(getClass().getSimpleName());
91aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierActionAgentHandler = new CarrierActionAgentHandler(getClass().getSimpleName());
92aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierActionAgentHandler.start();
93aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        waitUntilReady();
94aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        logd("CarrierActionAgentTest -Setup!");
95aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
96aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
97aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @After
98aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void tearDown() throws Exception {
99aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierActionAgentHandler.quit();
100aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        super.tearDown();
101aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
102aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
103aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /* Checks if the expiration date is calculated correctly
104aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * In this case the expiration date should be the next day.
105aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     */
106aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
107aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
108aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testExpirationDate1Day() {
109aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        java.security.PublicKey publicKey = null;
110aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierKeyDM.mKeyAvailability = 3;
111aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        SimpleDateFormat dt = new SimpleDateFormat("yyyy-mm-dd");
112aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Calendar cal = new GregorianCalendar();
113aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        cal.add(Calendar.DATE, 6);
114aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Date date = cal.getTime();
115aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Calendar expectedCal = new GregorianCalendar();
116aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        expectedCal.add(Calendar.DATE, 1);
117aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String dateExpected = dt.format(expectedCal.getTime());
118aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        ImsiEncryptionInfo imsiEncryptionInfo = new ImsiEncryptionInfo("mcc", "mnc", 1,
119aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar                "keyIdentifier", publicKey, date);
120aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        when(mPhone.getCarrierInfoForImsiEncryption(anyInt())).thenReturn(imsiEncryptionInfo);
121aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Date expirationDate = new Date(mCarrierKeyDM.getExpirationDate());
122aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(dt.format(expirationDate).equals(dateExpected));
123aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
124aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
125aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
126aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Checks if the expiration date is calculated correctly
127aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * In this case the expiration date should be the expiration date of the key.
128aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
129aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
130aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
131aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testExpirationDate7Day() {
132aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        java.security.PublicKey publicKey = null;
133aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierKeyDM.mKeyAvailability = 3;
134aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        SimpleDateFormat dt = new SimpleDateFormat("yyyy-mm-dd");
135aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Calendar cal = new GregorianCalendar();
136aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        cal.add(Calendar.DATE, 10);
137aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Date date = cal.getTime();
138aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Calendar expectedCal = new GregorianCalendar();
139aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        expectedCal.add(Calendar.DATE, 3);
140aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String dateExpected = dt.format(expectedCal.getTime());
141aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        ImsiEncryptionInfo imsiEncryptionInfo = new ImsiEncryptionInfo("mcc", "mnc", 1,
142aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar                "keyIdentifier", publicKey, date);
143aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        when(mPhone.getCarrierInfoForImsiEncryption(anyInt())).thenReturn(imsiEncryptionInfo);
144aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Date expirationDate = new Date(mCarrierKeyDM.getExpirationDate());
145aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(dt.format(expirationDate).equals(dateExpected));
146aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
1476d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar
148aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
149aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Checks if the json is parse correctly.
1506d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar     * Verify that setCarrierInfoForImsiEncryption is called with the right params
151aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
152aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
153aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
154aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testParseJson() {
1556d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        ByteArrayInputStream certBytes = new ByteArrayInputStream(CERT.getBytes());
1566d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        Reader fRd = new BufferedReader(new InputStreamReader(certBytes));
1576d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        PemReader reader = new PemReader(fRd);
1585363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        Pair<PublicKey, Long> keyInfo = null;
1595363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        try {
1606d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar            keyInfo = mCarrierKeyDM.getKeyInformation(reader.readPemObject().getContent());
1615363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        } catch (Exception e) {
1625363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar            fail(LOG_TAG + "exception creating public key");
1635363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        }
164aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        ImsiEncryptionInfo imsiEncryptionInfo = new ImsiEncryptionInfo("310", "270", 2,
1655363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar                "key1=value", keyInfo.first, new Date(keyInfo.second));
166aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String mccMnc = "310:270";
167aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierKeyDM.parseJsonAndPersistKey(mJsonStr, mccMnc);
1686d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        verify(mPhone, times(2)).setCarrierInfoForImsiEncryption(
1696d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar                (Matchers.refEq(imsiEncryptionInfo)));
1706d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar    }
1716d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar
1726d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar    /**
1736d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar     * Checks if the json is parse correctly.
1746d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar     * Same as testParseJason, except that the test looks for the "public-key" field.
1756d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar     **/
1766d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar    @Test
1776d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar    @SmallTest
1786d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar    public void testParseJsonPublicKey() {
1796d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        ByteArrayInputStream certBytes = new ByteArrayInputStream(CERT.getBytes());
1806d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        Reader fRd = new BufferedReader(new InputStreamReader(certBytes));
1816d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        PemReader reader = new PemReader(fRd);
1826d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        Pair<PublicKey, Long> keyInfo = null;
1836d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        try {
1846d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar            keyInfo = mCarrierKeyDM.getKeyInformation(reader.readPemObject().getContent());
1856d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        } catch (Exception e) {
1866d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar            fail(LOG_TAG + "exception creating public key");
1876d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        }
1886d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        ImsiEncryptionInfo imsiEncryptionInfo = new ImsiEncryptionInfo("310", "270", 2,
1896d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar                "key1=value", keyInfo.first, new Date(keyInfo.second));
1906d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        String mccMnc = "310:270";
1916d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        mCarrierKeyDM.parseJsonAndPersistKey(mJsonStr1, mccMnc);
1926d5f4de85dbdff84bef6def31a33c62bc35b5ca0pkanwar        verify(mPhone, times(2)).setCarrierInfoForImsiEncryption(
1935363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar                (Matchers.refEq(imsiEncryptionInfo)));
194aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
195aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
196aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
197aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Checks if the json is parse correctly.
198aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Since the json is bad, we want to verify that savePublicKey is not called.
199aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
200aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
201aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
202aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testParseBadJsonFail() {
203aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String mccMnc = "310:290";
204aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String badJsonStr = "{badJsonString}";
205aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierKeyDM.parseJsonAndPersistKey(badJsonStr, mccMnc);
206aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        verify(mPhone, times(0)).setCarrierInfoForImsiEncryption(any());
207aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
208aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
209aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
210aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Checks if the download is valid.
211aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * returns true since the mnc/mcc is valid.
212aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
213aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
214aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
215aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testIsValidDownload() {
216aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String mccMnc = "310:260";
2175363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
218aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(mCarrierKeyDM.isValidDownload(mccMnc));
219aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
220aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
221aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
222aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Checks if the download is valid.
223aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * returns false since the mnc/mcc is in-valid.
224aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
225aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
226aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
227aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testIsValidDownloadFail() {
228aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String mccMnc = "310:290";
2295363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
230aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertFalse(mCarrierKeyDM.isValidDownload(mccMnc));
231aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
232aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
233aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
234aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Tests if the key is enabled.
235aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * tests for all bit-mask value.
236aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
237aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
238aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
239aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testIsKeyEnabled() {
240aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierKeyDM.mKeyAvailability = 3;
241aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(mCarrierKeyDM.isKeyEnabled(1));
242aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(mCarrierKeyDM.isKeyEnabled(2));
243aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierKeyDM.mKeyAvailability = 2;
244aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertFalse(mCarrierKeyDM.isKeyEnabled(1));
245aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(mCarrierKeyDM.isKeyEnabled(2));
246aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mCarrierKeyDM.mKeyAvailability = 1;
247aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(mCarrierKeyDM.isKeyEnabled(1));
248aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertFalse(mCarrierKeyDM.isKeyEnabled(2));
249aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
250aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
251aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
252aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Tests sending the ACTION_DOWNLOAD_COMPLETE intent.
253aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Verify that the alarm will kick-off the next day.
254aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
255aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
256aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
257aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testDownloadComplete() {
258aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        SharedPreferences.Editor editor = getDefaultSharedPreferences(mContext).edit();
259aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String mccMnc = "310:260";
260aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        int slotId = mPhone.getPhoneId();
261aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        editor.putString("CARRIER_KEY_DM_MCC_MNC" + slotId, mccMnc);
262aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        editor.commit();
263aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
264aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        SimpleDateFormat dt = new SimpleDateFormat("yyyy-mm-dd");
265aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Calendar expectedCal = new GregorianCalendar();
266aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        expectedCal.add(Calendar.DATE, 1);
267aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String dateExpected = dt.format(expectedCal.getTime());
268aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
2695363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
270aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Intent mIntent = new Intent(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
271aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mContext.sendBroadcast(mIntent);
272aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Date expirationDate = new Date(mCarrierKeyDM.getExpirationDate());
273aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(dt.format(expirationDate).equals(dateExpected));
274aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
275aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
276aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
277aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Test sending the ACTION_CARRIER_CONFIG_CHANGED intent.
278aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Verify that the right mnc/mcc gets stored in the preferences.
279aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
280aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
281aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
282aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testCarrierConfigChanged() {
283aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        CarrierConfigManager carrierConfigManager = (CarrierConfigManager)
284aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar                mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
285aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        int slotId = mPhone.getPhoneId();
286aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        PersistableBundle bundle = carrierConfigManager.getConfigForSubId(slotId);
287aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        bundle.putInt(CarrierConfigManager.IMSI_KEY_AVAILABILITY_INT, 3);
288aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        bundle.putString(CarrierConfigManager.IMSI_KEY_DOWNLOAD_URL_STRING, mURL);
289aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
2905363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
291aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Intent mIntent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
292aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mIntent.putExtra(PhoneConstants.PHONE_KEY, 0);
293aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mContext.sendBroadcast(mIntent);
294aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        SharedPreferences preferences = getDefaultSharedPreferences(mContext);
295aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String mccMnc = preferences.getString("CARRIER_KEY_DM_MCC_MNC" + slotId, null);
296aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(mccMnc.equals("310:260"));
297aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
298aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
299aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    /**
300aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Tests sending the INTENT_KEY_RENEWAL_ALARM_PREFIX intent.
301aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     * Verify that the right mnc/mcc gets stored in the preferences.
302aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar     **/
303aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @Test
304aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    @SmallTest
305aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    public void testAlarmRenewal() {
306aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        CarrierConfigManager carrierConfigManager = (CarrierConfigManager)
307aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar                mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
308aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        int slotId = mPhone.getPhoneId();
309aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        PersistableBundle bundle = carrierConfigManager.getConfigForSubId(slotId);
310aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        bundle.putInt(CarrierConfigManager.IMSI_KEY_AVAILABILITY_INT, 3);
311aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        bundle.putString(CarrierConfigManager.IMSI_KEY_DOWNLOAD_URL_STRING, mURL);
312aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar
3135363996028cca9a2707dae86ffc1b94b364e3cb0pkanwar        when(mTelephonyManager.getSimOperator(anyInt())).thenReturn("310260");
314aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        Intent mIntent = new Intent("com.android.internal.telephony.carrier_key_download_alarm"
315aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar                + slotId);
316aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        mContext.sendBroadcast(mIntent);
317aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        SharedPreferences preferences = getDefaultSharedPreferences(mContext);
318aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        String mccMnc = preferences.getString("CARRIER_KEY_DM_MCC_MNC" + slotId, null);
319aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar        assertTrue(mccMnc.equals("310:260"));
320aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    }
321aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar}
322