1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.net.vcn.persistablebundleutils;
18 
19 import static android.telephony.TelephonyManager.APPTYPE_USIM;
20 
21 import static org.junit.Assert.assertEquals;
22 
23 import android.net.eap.EapSessionConfig;
24 import android.os.PersistableBundle;
25 
26 import androidx.test.InstrumentationRegistry;
27 import androidx.test.filters.SmallTest;
28 import androidx.test.runner.AndroidJUnit4;
29 
30 import org.junit.Test;
31 import org.junit.runner.RunWith;
32 
33 import java.io.InputStream;
34 import java.nio.charset.StandardCharsets;
35 import java.security.cert.CertificateFactory;
36 import java.security.cert.X509Certificate;
37 
38 @RunWith(AndroidJUnit4.class)
39 @SmallTest
40 public class EapSessionConfigUtilsTest {
41     private static final byte[] EAP_ID = "test@android.net".getBytes(StandardCharsets.US_ASCII);
42     private static final String USERNAME = "username";
43     private static final String PASSWORD = "password";
44     private static final int SUB_ID = 1;
45     private static final String NETWORK_NAME = "android.net";
46     private static final boolean ALLOW_MISMATCHED_NETWORK_NAMES = true;
47 
createBuilderWithId()48     private EapSessionConfig.Builder createBuilderWithId() {
49         return new EapSessionConfig.Builder().setEapIdentity(EAP_ID);
50     }
51 
verifyPersistableBundleEncodeDecodeIsLossless(EapSessionConfig config)52     private static void verifyPersistableBundleEncodeDecodeIsLossless(EapSessionConfig config) {
53         final PersistableBundle bundle = EapSessionConfigUtils.toPersistableBundle(config);
54         final EapSessionConfig resultConfig = EapSessionConfigUtils.fromPersistableBundle(bundle);
55 
56         assertEquals(config, resultConfig);
57     }
58 
59     @Test
testSetEapMsChapV2EncodeDecodeIsLossless()60     public void testSetEapMsChapV2EncodeDecodeIsLossless() throws Exception {
61         final EapSessionConfig config =
62                 createBuilderWithId().setEapMsChapV2Config(USERNAME, PASSWORD).build();
63 
64         verifyPersistableBundleEncodeDecodeIsLossless(config);
65     }
66 
67     @Test
testSetEapSimEncodeDecodeIsLossless()68     public void testSetEapSimEncodeDecodeIsLossless() throws Exception {
69         final EapSessionConfig config =
70                 createBuilderWithId().setEapSimConfig(SUB_ID, APPTYPE_USIM).build();
71 
72         verifyPersistableBundleEncodeDecodeIsLossless(config);
73     }
74 
75     @Test
testSetEapAkaEncodeDecodeIsLossless()76     public void testSetEapAkaEncodeDecodeIsLossless() throws Exception {
77         final EapSessionConfig config =
78                 createBuilderWithId().setEapAkaConfig(SUB_ID, APPTYPE_USIM).build();
79 
80         verifyPersistableBundleEncodeDecodeIsLossless(config);
81     }
82 
83     @Test
testSetEapAkaPrimeEncodeDecodeIsLossless()84     public void testSetEapAkaPrimeEncodeDecodeIsLossless() throws Exception {
85         final EapSessionConfig config =
86                 createBuilderWithId()
87                         .setEapAkaPrimeConfig(
88                                 SUB_ID, APPTYPE_USIM, NETWORK_NAME, ALLOW_MISMATCHED_NETWORK_NAMES)
89                         .build();
90 
91         verifyPersistableBundleEncodeDecodeIsLossless(config);
92     }
93 
94     @Test
testSetEapTtlsEncodeDecodeIsLossless()95     public void testSetEapTtlsEncodeDecodeIsLossless() throws Exception {
96         final InputStream inputStream =
97                 InstrumentationRegistry.getContext()
98                         .getResources()
99                         .getAssets()
100                         .open("self-signed-ca.pem");
101         final CertificateFactory factory = CertificateFactory.getInstance("X.509");
102         final X509Certificate trustedCa =
103                 (X509Certificate) factory.generateCertificate(inputStream);
104 
105         final EapSessionConfig innerConfig =
106                 new EapSessionConfig.Builder().setEapMsChapV2Config(USERNAME, PASSWORD).build();
107 
108         final EapSessionConfig config =
109                 new EapSessionConfig.Builder().setEapTtlsConfig(trustedCa, innerConfig).build();
110 
111         verifyPersistableBundleEncodeDecodeIsLossless(config);
112     }
113 }
114