• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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 com.android.server.wifi.util;
18 
19 import android.content.Context;
20 import android.net.wifi.WifiConfiguration;
21 import android.net.wifi.WifiEnterpriseConfig;
22 import android.telephony.TelephonyManager;
23 
24 /**
25  * Utilities for the Wifi Service to interact with telephony.
26  */
27 public class TelephonyUtil {
28 
29     /**
30      * Get the identity for the current SIM or null if the sim is not available
31      */
getSimIdentity(Context context, int eapMethod)32     public static String getSimIdentity(Context context, int eapMethod) {
33         TelephonyManager tm = TelephonyManager.from(context);
34         if (tm != null) {
35             String imsi = tm.getSubscriberId();
36             String mccMnc = "";
37 
38             if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
39                 mccMnc = tm.getSimOperator();
40             }
41 
42             return buildIdentity(eapMethod, imsi, mccMnc);
43         } else {
44             return null;
45         }
46     }
47 
48     /**
49      * create Permanent Identity base on IMSI,
50      *
51      * rfc4186 & rfc4187:
52      * identity = usernam@realm
53      * with username = prefix | IMSI
54      * and realm is derived MMC/MNC tuple according 3GGP spec(TS23.003)
55      */
buildIdentity(int eapMethod, String imsi, String mccMnc)56     private static String buildIdentity(int eapMethod, String imsi, String mccMnc) {
57         if (imsi == null || imsi.isEmpty()) {
58             return null;
59         }
60 
61         String prefix;
62         if (eapMethod == WifiEnterpriseConfig.Eap.SIM) {
63             prefix = "1";
64         } else if (eapMethod == WifiEnterpriseConfig.Eap.AKA) {
65             prefix = "0";
66         } else if (eapMethod == WifiEnterpriseConfig.Eap.AKA_PRIME) {
67             prefix = "6";
68         } else {  // not a valide EapMethod
69             return null;
70         }
71 
72         /* extract mcc & mnc from mccMnc */
73         String mcc;
74         String mnc;
75         if (mccMnc != null && !mccMnc.isEmpty()) {
76             mcc = mccMnc.substring(0, 3);
77             mnc = mccMnc.substring(3);
78             if (mnc.length() == 2) {
79                 mnc = "0" + mnc;
80             }
81         } else {
82             // extract mcc & mnc from IMSI, assume mnc size is 3
83             mcc = imsi.substring(0, 3);
84             mnc = imsi.substring(3, 6);
85         }
86 
87         return prefix + imsi + "@wlan.mnc" + mnc + ".mcc" + mcc + ".3gppnetwork.org";
88     }
89 
90     /**
91      * Checks if the network is a sim config.
92      *
93      * @param config Config corresponding to the network.
94      * @return true if it is a sim config, false otherwise.
95      */
isSimConfig(WifiConfiguration config)96     public static boolean isSimConfig(WifiConfiguration config) {
97         if (config == null || config.enterpriseConfig == null) {
98             return false;
99         }
100 
101         return isSimEapMethod(config.enterpriseConfig.getEapMethod());
102     }
103 
104     /**
105      * Checks if the network is a sim config.
106      *
107      * @param method
108      * @return true if it is a sim config, false otherwise.
109      */
isSimEapMethod(int eapMethod)110     public static boolean isSimEapMethod(int eapMethod) {
111         return eapMethod == WifiEnterpriseConfig.Eap.SIM
112                 || eapMethod == WifiEnterpriseConfig.Eap.AKA
113                 || eapMethod == WifiEnterpriseConfig.Eap.AKA_PRIME;
114     }
115 }
116