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