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