Android-cuttlefish cvd tool
sim_service.h
Go to the documentation of this file.
1//
2// Copyright (C) 2020 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#pragma once
17
18#include <tinyxml2.h>
19
21
22namespace cuttlefish {
23
24using namespace tinyxml2;
25
26class NetworkService;
27
28class SimService : public ModemService, public std::enable_shared_from_this<SimService> {
29 public:
30 SimService(int32_t service_id, ChannelMonitor* channel_monitor,
31 ThreadLooper* thread_looper);
32 ~SimService() = default;
33
34 SimService(const SimService &) = delete;
35 SimService &operator=(const SimService &) = delete;
36
38
39 void HandleSIMStatusReq(const Client& client);
40 void HandleChangeOrEnterPIN(const Client& client, const std::string& command);
41 void HandleSIM_IO(const Client& client, const std::string& command);
42 void HandleCSIM_IO(const Client& client, const std::string& command);
43 void HandleGetIMSI(const Client& client);
44 void HandleGetIccId(const Client& client);
45 void HandleGetEid(const Client& client);
46 void HandleGetAtr(const Client& client);
47 void HandleFacilityLock(const Client& client, const std::string& command);
48 void HandleOpenLogicalChannel(const Client& client,
49 const std::string& command);
50 void HandleCloseLogicalChannel(const Client& client,
51 const std::string& command);
52 void HandleTransmitLogicalChannel(const Client& client,
53 const std::string& command);
54 void HandleChangePassword(const Client& client, const std::string& command);
55 void HandleQueryRemainTimes(const Client& client, const std::string& command);
56 void HandleCdmaSubscriptionSource(const Client& client,
57 const std::string& command);
58 void HandleCdmaRoamingPreference(const Client& client,
59 const std::string& command);
60 void HandleSimAuthentication(const Client& client,
61 const std::string& command);
62 void HandlePhoneNumberUpdate(const Client& client,
63 const std::string& command);
66 bool IsFDNEnabled();
67 bool IsFixedDialNumber(std::string_view number);
68 XMLElement* GetIccProfile();
69 std::string GetPhoneNumber();
70 bool SetPhoneNumber(std::string_view number);
71
72 enum SimStatus {
78 };
79
80 SimStatus GetSimStatus() const;
81 std::string GetSimOperator();
82
83 private:
85 std::vector<CommandHandler> InitializeCommandHandlers();
88 void OnSimStatusChanged();
89 XMLElement* GetPhoneNumberElement();
91
92 /* SimStatus */
94
95 /* SimFileSystem */
97 enum EFId: int32_t {
98 EF_ADN = 0x6F3A,
99 EF_FDN = 0x6F3B,
100 EF_GID1 = 0x6F3E,
101 EF_GID2 = 0x6F3F,
102 EF_SDN = 0x6F49,
103 EF_EXT1 = 0x6F4A,
104 EF_EXT2 = 0x6F4B,
105 EF_EXT3 = 0x6F4C,
106 EF_EXT5 = 0x6F4E,
107 EF_EXT6 = 0x6FC8, // Ext record for EF[MBDN]
108 EF_MWIS = 0x6FCA,
109 EF_MBDN = 0x6FC7,
110 EF_PNN = 0x6FC5,
111 EF_OPL = 0x6FC6,
112 EF_SPN = 0x6F46,
113 EF_SMS = 0x6F3C,
114 EF_ICCID = 0x2FE2,
115 EF_AD = 0x6FAD,
116 EF_MBI = 0x6FC9,
117 EF_MSISDN = 0x6F40,
118 EF_SPDI = 0x6FCD,
119 EF_SST = 0x6F38,
120 EF_CFIS = 0x6FCB,
121 EF_IMG = 0x4F20,
122
123 // USIM SIM file ids from TS 131.102
124 EF_PBR = 0x4F30,
125 EF_LI = 0x6F05,
126
127 // GSM SIM file ids from CPHS (phase 2, version 4.2) CPHS4_2.WW6
130 EF_CFF_CPHS = 0x6F13,
131 EF_SPN_CPHS = 0x6F14,
133 EF_INFO_CPHS = 0x6F16,
134 EF_CSP_CPHS = 0x6F15,
135
136 // CDMA RUIM file ids from 3GPP2 C.S0023-0
137 EF_CST = 0x6F32,
138 EF_RUIM_SPN =0x6F41,
139
140 // ETSI TS.102.221
141 EF_PL = 0x2F05,
142 // 3GPP2 C.S0065
143 EF_CSIM_LI = 0x6F3A,
144 EF_CSIM_SPN =0x6F41,
145 EF_CSIM_MDN = 0x6F44,
148 EF_CSIM_EPRL = 0x6F5A,
150
151 //ISIM access
152 EF_IMPU = 0x6F04,
153 EF_IMPI = 0x6F02,
154 EF_DOMAIN = 0x6F03,
155 EF_IST = 0x6F07,
156 EF_PCSCF = 0x6F09,
157 EF_PSI = 0x6FE5,
158
159 //PLMN Selection Information w/ Access Technology TS 131.102
163
164 //Equivalent Home and Forbidden PLMN Lists TS 131.102
165 EF_EHPLMN = 0x6FD9,
166 EF_FPLMN = 0x6F7B,
167
168 // Last Roaming Selection Indicator
169 EF_LRPLMNSI = 0x6FDC,
170
171 //Search interval for higher priority PLMNs
172 EF_HPPLMN = 0x6F31,
173 };
174
175 XMLElement* GetRootElement();
176
177 static std::string GetCommonIccEFPath(EFId efid);
178 static std::string GetUsimEFPath(EFId efid);
179
180 static XMLElement *FindAttribute(XMLElement* parent,
181 const std::string& attr_name,
182 const std::string& attr_value);
183
184 XMLElement* AppendNewElement(XMLElement* parent, const char* name);
185 XMLElement* AppendNewElementWithText(XMLElement* parent, const char* name,
186 const char* text);
187
188 XMLDocument doc;
189 std::string file_path;
190 };
192
193
194 /* PinStatus */
195 struct PinStatus {
197
198 std::string pin_;
199 std::string puk_;
202
203 bool CheckPasswordValid(std::string_view password);
204
205 bool VerifyPIN(std::string_view pin);
206 bool VerifyPUK(std::string_view puk);
207 bool ChangePIN(ChangeMode mode, std::string_view pin_or_puk,
208 std::string_view new_pin);
209 bool ChangePUK(std::string_view puk, std::string_view new_puk);
210 };
213
214 bool checkPin1AndAdjustSimStatus(std::string_view password);
216 std::string_view pin,
217 std::string_view new_pin);
218
219 /* FacilityLock */
221 enum LockType {
222 AO = 1, // Barr all outgoing calls
223 OI = 2, // Barr all outgoing international calls
224 OX = 3, // Barr all outgoing international calls, except to Home Country
225 AI = 4, // Barr all incoming calls
226 IR = 5, // Barr all call, when roaming outside Home Country
227 AB = 6, // All barring services
228 AG = 7, // All outgoing barring services
229 AC = 8, // All incoming barring services
230 SC = 9, // PIN enable/disable
231 FD = 10, // SIM fixed FDN dialing lock, PIN2 is required as a password
232 };
233
234 enum Mode {
236 LOCK = 1,
237 QUERY = 2,
238 };
239
240 enum Class : int32_t {
241 DEFAULT = 7, // all classes
242 VOICE = 1 << 0, // telephony
243 DATA = 1 << 1, // to all bear service
244 FAX = 1 << 2, // facsimile services
245 SMS = 1 << 3, // short message services
246 };
247
251 };
252
253 LockStatus lock_status; // Ignore class
254
256 };
257 std::map<std::string, FacilityLock> facility_lock_;
258
259 /* LogicalChannel */
261 std::string df_name;
264
266 df_name(""), is_open(false), session_id(session_id) {};
267 };
268 std::vector<LogicalChannel> logical_channels_;
269 std::string last_file_id_;
270
273};
274
275} // namespace cuttlefish
Definition: channel_monitor.h:35
Definition: client.h:48
Definition: modem_service.h:63
Definition: network_service.h:30
Definition: sim_service.h:28
std::map< std::string, FacilityLock > facility_lock_
Definition: sim_service.h:257
void HandleQueryRemainTimes(const Client &client, const std::string &command)
Definition: sim_service.cpp:1726
SimService(int32_t service_id, ChannelMonitor *channel_monitor, ThreadLooper *thread_looper)
Definition: sim_service.cpp:287
PinStatus pin1_status_
Definition: sim_service.h:211
NetworkService * network_service_
Definition: sim_service.h:90
void HandleGetEid(const Client &client)
Definition: sim_service.cpp:1333
void InitializeSimFileSystemAndSimState()
Definition: sim_service.cpp:378
std::string GetSimOperator()
Definition: sim_service.cpp:808
void InitializeServiceState()
Definition: sim_service.cpp:367
void OnSimStatusChanged()
Definition: sim_service.cpp:1041
void SaveFacilityLockToIccProfile()
Definition: sim_service.cpp:650
bool ChangePin1AndAdjustSimStatus(PinStatus::ChangeMode mode, std::string_view pin, std::string_view new_pin)
Definition: sim_service.cpp:1150
SimStatus sim_status_
Definition: sim_service.h:93
bool SetPhoneNumber(std::string_view number)
Definition: sim_service.cpp:775
bool IsFDNEnabled()
Definition: sim_service.cpp:686
bool IsFixedDialNumber(std::string_view number)
Definition: sim_service.cpp:695
SimFileSystem sim_file_system_
Definition: sim_service.h:191
void HandleChangePassword(const Client &client, const std::string &command)
Definition: sim_service.cpp:1684
void HandleSimAuthentication(const Client &client, const std::string &command)
Definition: sim_service.cpp:1800
void HandleCdmaSubscriptionSource(const Client &client, const std::string &command)
Definition: sim_service.cpp:1763
SimStatus GetSimStatus() const
Definition: sim_service.cpp:804
void HandleChangeOrEnterPIN(const Client &client, const std::string &command)
Definition: sim_service.cpp:1168
SimService(const SimService &)=delete
void HandleTransmitLogicalChannel(const Client &client, const std::string &command)
Definition: sim_service.cpp:1600
bool checkPin1AndAdjustSimStatus(std::string_view password)
Definition: sim_service.cpp:1076
void HandleGetIccId(const Client &client)
Definition: sim_service.cpp:1301
void HandleCSIM_IO(const Client &client, const std::string &command)
Definition: sim_service.cpp:1092
SimStatus
Definition: sim_service.h:72
@ SIM_STATUS_ABSENT
Definition: sim_service.h:73
@ SIM_STATUS_READY
Definition: sim_service.h:75
@ SIM_STATUS_PUK
Definition: sim_service.h:77
@ SIM_STATUS_NOT_READY
Definition: sim_service.h:74
@ SIM_STATUS_PIN
Definition: sim_service.h:76
void HandleGetAtr(const Client &client)
Definition: sim_service.cpp:1359
std::vector< CommandHandler > InitializeCommandHandlers()
Definition: sim_service.cpp:294
XMLElement * GetIccProfile()
Definition: sim_service.cpp:748
void HandleCdmaRoamingPreference(const Client &client, const std::string &command)
Definition: sim_service.cpp:1784
int cdma_roaming_preference_
Definition: sim_service.h:272
std::string GetPhoneNumber()
Definition: sim_service.cpp:752
std::vector< LogicalChannel > logical_channels_
Definition: sim_service.h:268
SimService & operator=(const SimService &)=delete
void HandlePhoneNumberUpdate(const Client &client, const std::string &command)
Definition: sim_service.cpp:1834
PinStatus pin2_status_
Definition: sim_service.h:212
void HandleCloseLogicalChannel(const Client &client, const std::string &command)
Definition: sim_service.cpp:1554
std::string last_file_id_
Definition: sim_service.h:269
void HandleSIM_IO(const Client &client, const std::string &command)
Definition: sim_service.cpp:935
int cdma_subscription_source_
Definition: sim_service.h:271
void HandleFacilityLock(const Client &client, const std::string &command)
Definition: sim_service.cpp:1425
XMLElement * GetPhoneNumberElement()
Definition: sim_service.cpp:1048
void HandleSIMStatusReq(const Client &client)
Definition: sim_service.cpp:885
void SavePinStateToIccProfile()
Definition: sim_service.cpp:534
void HandleOpenLogicalChannel(const Client &client, const std::string &command)
Definition: sim_service.cpp:1496
void InitializeFacilityLock()
Definition: sim_service.cpp:495
void SetupDependency(NetworkService *net)
Definition: sim_service.cpp:862
void HandleGetIMSI(const Client &client)
Definition: sim_service.cpp:1256
Definition: thread_looper.h:51
#define parent
Definition: dict.c:53
static const char *const text[]
Definition: ext2_err.c:10
int status()
Definition: health.cpp:44
char * name
Definition: libf2fs.c:1403
Definition: alloc_driver.h:20
Definition: sim_service.h:220
FacilityLock(LockStatus status)
Definition: sim_service.h:255
LockStatus
Definition: sim_service.h:248
@ ENABLE
Definition: sim_service.h:250
@ DISABLE
Definition: sim_service.h:249
LockType
Definition: sim_service.h:221
@ AB
Definition: sim_service.h:227
@ AG
Definition: sim_service.h:228
@ FD
Definition: sim_service.h:231
@ AC
Definition: sim_service.h:229
@ SC
Definition: sim_service.h:230
@ IR
Definition: sim_service.h:226
@ OI
Definition: sim_service.h:223
@ AO
Definition: sim_service.h:222
@ OX
Definition: sim_service.h:224
@ AI
Definition: sim_service.h:225
Mode
Definition: sim_service.h:234
@ QUERY
Definition: sim_service.h:237
@ LOCK
Definition: sim_service.h:236
@ UNLOCK
Definition: sim_service.h:235
LockStatus lock_status
Definition: sim_service.h:253
Class
Definition: sim_service.h:240
@ DATA
Definition: sim_service.h:243
@ DEFAULT
Definition: sim_service.h:241
@ FAX
Definition: sim_service.h:244
@ SMS
Definition: sim_service.h:245
@ VOICE
Definition: sim_service.h:242
Definition: sim_service.h:260
bool is_open
Definition: sim_service.h:262
int session_id
Definition: sim_service.h:263
LogicalChannel(int session_id)
Definition: sim_service.h:265
std::string df_name
Definition: sim_service.h:261
Definition: sim_service.h:195
bool VerifyPUK(std::string_view puk)
Definition: sim_service.cpp:215
std::string puk_
Definition: sim_service.h:199
ChangeMode
Definition: sim_service.h:196
@ WITH_PIN
Definition: sim_service.h:196
@ WITH_PUK
Definition: sim_service.h:196
std::string pin_
Definition: sim_service.h:198
int puk_remaining_times_
Definition: sim_service.h:201
bool CheckPasswordValid(std::string_view password)
Definition: sim_service.cpp:180
bool ChangePIN(ChangeMode mode, std::string_view pin_or_puk, std::string_view new_pin)
Definition: sim_service.cpp:239
bool VerifyPIN(std::string_view pin)
Definition: sim_service.cpp:192
bool ChangePUK(std::string_view puk, std::string_view new_puk)
Definition: sim_service.cpp:269
int pin_remaining_times_
Definition: sim_service.h:200
Definition: sim_service.h:96
XMLElement * AppendNewElementWithText(XMLElement *parent, const char *name, const char *text)
Definition: sim_service.cpp:170
XMLElement * AppendNewElement(XMLElement *parent, const char *name)
Definition: sim_service.cpp:163
static std::string GetCommonIccEFPath(EFId efid)
Definition: sim_service.cpp:66
static std::string GetUsimEFPath(EFId efid)
Definition: sim_service.cpp:91
XMLElement * GetRootElement()
Definition: sim_service.cpp:62
std::string file_path
Definition: sim_service.h:189
EFId
Definition: sim_service.h:97
@ EF_LI
Definition: sim_service.h:125
@ EF_CSIM_MIPUPP
Definition: sim_service.h:149
@ EF_OPL
Definition: sim_service.h:111
@ EF_MSISDN
Definition: sim_service.h:117
@ EF_PCSCF
Definition: sim_service.h:156
@ EF_SMS
Definition: sim_service.h:113
@ EF_CSIM_CDMAHOME
Definition: sim_service.h:147
@ EF_OPLMN_W_ACT
Definition: sim_service.h:161
@ EF_SPN
Definition: sim_service.h:112
@ EF_SPN_SHORT_CPHS
Definition: sim_service.h:132
@ EF_LRPLMNSI
Definition: sim_service.h:169
@ EF_EXT5
Definition: sim_service.h:106
@ EF_SST
Definition: sim_service.h:119
@ EF_SPN_CPHS
Definition: sim_service.h:131
@ EF_CSIM_EPRL
Definition: sim_service.h:148
@ EF_CFF_CPHS
Definition: sim_service.h:130
@ EF_GID2
Definition: sim_service.h:101
@ EF_ADN
Definition: sim_service.h:98
@ EF_IST
Definition: sim_service.h:155
@ EF_CSP_CPHS
Definition: sim_service.h:134
@ EF_CSIM_IMSIM
Definition: sim_service.h:146
@ EF_MBDN
Definition: sim_service.h:109
@ EF_CST
Definition: sim_service.h:137
@ EF_VOICE_MAIL_INDICATOR_CPHS
Definition: sim_service.h:129
@ EF_RUIM_SPN
Definition: sim_service.h:138
@ EF_GID1
Definition: sim_service.h:100
@ EF_EHPLMN
Definition: sim_service.h:165
@ EF_SDN
Definition: sim_service.h:102
@ EF_HPLMN_W_ACT
Definition: sim_service.h:162
@ EF_FDN
Definition: sim_service.h:99
@ EF_MWIS
Definition: sim_service.h:108
@ EF_EXT3
Definition: sim_service.h:105
@ EF_CFIS
Definition: sim_service.h:120
@ EF_DOMAIN
Definition: sim_service.h:154
@ EF_EXT6
Definition: sim_service.h:107
@ EF_CSIM_MDN
Definition: sim_service.h:145
@ EF_ICCID
Definition: sim_service.h:114
@ EF_MBI
Definition: sim_service.h:116
@ EF_PLMN_W_ACT
Definition: sim_service.h:160
@ EF_EXT2
Definition: sim_service.h:104
@ EF_INFO_CPHS
Definition: sim_service.h:133
@ EF_IMG
Definition: sim_service.h:121
@ EF_PSI
Definition: sim_service.h:157
@ EF_IMPI
Definition: sim_service.h:153
@ EF_CSIM_LI
Definition: sim_service.h:143
@ EF_PBR
Definition: sim_service.h:124
@ EF_IMPU
Definition: sim_service.h:152
@ EF_MAILBOX_CPHS
Definition: sim_service.h:128
@ EF_FPLMN
Definition: sim_service.h:166
@ EF_AD
Definition: sim_service.h:115
@ EF_PL
Definition: sim_service.h:141
@ EF_PNN
Definition: sim_service.h:110
@ EF_EXT1
Definition: sim_service.h:103
@ EF_SPDI
Definition: sim_service.h:118
@ EF_HPPLMN
Definition: sim_service.h:172
@ EF_CSIM_SPN
Definition: sim_service.h:144
XMLDocument doc
Definition: sim_service.h:188
static XMLElement * FindAttribute(XMLElement *parent, const std::string &attr_name, const std::string &attr_value)
Definition: sim_service.cpp:145