blob: 5db3e88ffd3ab1f19e88266d02b28c7e04d3590a [file] [log] [blame]
Supreeth Herle475dcaa2020-03-20 18:57:39 +01001# -*- coding: utf-8 -*-
2
Harald Weltef12979d2021-05-29 21:47:13 +02003# without this, pylint will fail when inner classes are used
4# within the 'nested' kwarg of our TlvMeta metaclass on python 3.7 :(
5# pylint: disable=undefined-variable
6
Supreeth Herle475dcaa2020-03-20 18:57:39 +01007"""
Harald Weltefc67de22023-05-23 20:29:49 +02008Various constants from 3GPP TS 31.102 V17.9.0
Supreeth Herle475dcaa2020-03-20 18:57:39 +01009"""
10
11#
12# Copyright (C) 2020 Supreeth Herle <herlesupreeth@gmail.com>
Harald Weltefc67de22023-05-23 20:29:49 +020013# Copyright (C) 2021-2023 Harald Welte <laforge@osmocom.org>
Supreeth Herle475dcaa2020-03-20 18:57:39 +010014#
15# This program is free software: you can redistribute it and/or modify
16# it under the terms of the GNU General Public License as published by
17# the Free Software Foundation, either version 2 of the License, or
18# (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program. If not, see <http://www.gnu.org/licenses/>.
27#
28
29# Mapping between USIM Service Number and its description
Harald Weltec91085e2022-02-10 18:05:45 +010030import pySim.ts_102_221
31from pySim.ts_51_011 import EF_ACMmax, EF_AAeM, EF_eMLPP, EF_CMI, EF_PNN
32from pySim.ts_51_011 import EF_MMSN, EF_MMSICP, EF_MMSUP, EF_MMSUCP, EF_VGCS, EF_VGCSS, EF_NIA
33from pySim.ts_51_011 import EF_SMSR, EF_DCK, EF_EXT, EF_CNL, EF_OPL, EF_MBI, EF_MWIS
34from pySim.ts_51_011 import EF_CBMID, EF_CBMIR, EF_ADN, EF_SMS, EF_MSISDN, EF_SMSP, EF_SMSS
35from pySim.ts_51_011 import EF_IMSI, EF_xPLMNwAcT, EF_SPN, EF_CBMI, EF_ACC, EF_PLMNsel
Harald Welted90ceb82022-07-17 22:10:58 +020036from pySim.ts_51_011 import EF_Kc, EF_CPBCCH, EF_InvScan
Harald Weltec91085e2022-02-10 18:05:45 +010037from pySim.ts_102_221 import EF_ARR
38from pySim.tlv import *
39from pySim.filesystem import *
Harald Welte6f8a8702022-07-17 21:50:31 +020040from pySim.ts_31_102_telecom import DF_PHONEBOOK, EF_UServiceTable
Harald Weltec91085e2022-02-10 18:05:45 +010041from pySim.construct import *
Harald Weltef56b6b22022-07-30 16:36:06 +020042from pySim.cat import SMS_TPDU, DeviceIdentities, SMSPPDownload
Harald Weltec91085e2022-02-10 18:05:45 +010043from construct import Optional as COptional
44from construct import *
45from typing import Tuple
46from struct import unpack, pack
47import enum
Supreeth Herle475dcaa2020-03-20 18:57:39 +010048EF_UST_map = {
Harald Weltec91085e2022-02-10 18:05:45 +010049 1: 'Local Phone Book',
50 2: 'Fixed Dialling Numbers (FDN)',
51 3: 'Extension 2',
52 4: 'Service Dialling Numbers (SDN)',
53 5: 'Extension3',
54 6: 'Barred Dialling Numbers (BDN)',
55 7: 'Extension4',
56 8: 'Outgoing Call Information (OCI and OCT)',
57 9: 'Incoming Call Information (ICI and ICT)',
58 10: 'Short Message Storage (SMS)',
59 11: 'Short Message Status Reports (SMSR)',
60 12: 'Short Message Service Parameters (SMSP)',
61 13: 'Advice of Charge (AoC)',
62 14: 'Capability Configuration Parameters 2 (CCP2)',
63 15: 'Cell Broadcast Message Identifier',
64 16: 'Cell Broadcast Message Identifier Ranges',
65 17: 'Group Identifier Level 1',
66 18: 'Group Identifier Level 2',
67 19: 'Service Provider Name',
68 20: 'User controlled PLMN selector with Access Technology',
69 21: 'MSISDN',
70 22: 'Image (IMG)',
71 23: 'Support of Localised Service Areas (SoLSA)',
72 24: 'Enhanced Multi-Level Precedence and Pre-emption Service',
73 25: 'Automatic Answer for eMLPP',
74 26: 'RFU',
75 27: 'GSM Access',
76 28: 'Data download via SMS-PP',
77 29: 'Data download via SMS-CB',
78 30: 'Call Control by USIM',
79 31: 'MO-SMS Control by USIM',
80 32: 'RUN AT COMMAND command',
81 33: 'shall be set to 1',
82 34: 'Enabled Services Table',
83 35: 'APN Control List (ACL)',
84 36: 'Depersonalisation Control Keys',
85 37: 'Co-operative Network List',
86 38: 'GSM security context',
87 39: 'CPBCCH Information',
88 40: 'Investigation Scan',
89 41: 'MexE',
90 42: 'Operator controlled PLMN selector with Access Technology',
91 43: 'HPLMN selector with Access Technology',
92 44: 'Extension 5',
93 45: 'PLMN Network Name',
94 46: 'Operator PLMN List',
95 47: 'Mailbox Dialling Numbers',
96 48: 'Message Waiting Indication Status',
97 49: 'Call Forwarding Indication Status',
98 50: 'Reserved and shall be ignored',
99 51: 'Service Provider Display Information',
100 52: 'Multimedia Messaging Service (MMS)',
101 53: 'Extension 8',
102 54: 'Call control on GPRS by USIM',
103 55: 'MMS User Connectivity Parameters',
104 56: 'Network\'s indication of alerting in the MS (NIA)',
105 57: 'VGCS Group Identifier List (EFVGCS and EFVGCSS)',
106 58: 'VBS Group Identifier List (EFVBS and EFVBSS)',
107 59: 'Pseudonym',
108 60: 'User Controlled PLMN selector for I-WLAN access',
109 61: 'Operator Controlled PLMN selector for I-WLAN access',
110 62: 'User controlled WSID list',
111 63: 'Operator controlled WSID list',
112 64: 'VGCS security',
113 65: 'VBS security',
114 66: 'WLAN Reauthentication Identity',
115 67: 'Multimedia Messages Storage',
116 68: 'Generic Bootstrapping Architecture (GBA)',
117 69: 'MBMS security',
118 70: 'Data download via USSD and USSD application mode',
119 71: 'Equivalent HPLMN',
120 72: 'Additional TERMINAL PROFILE after UICC activation',
121 73: 'Equivalent HPLMN Presentation Indication',
122 74: 'Last RPLMN Selection Indication',
123 75: 'OMA BCAST Smart Card Profile',
124 76: 'GBA-based Local Key Establishment Mechanism',
125 77: 'Terminal Applications',
126 78: 'Service Provider Name Icon',
127 79: 'PLMN Network Name Icon',
128 80: 'Connectivity Parameters for USIM IP connections',
129 81: 'Home I-WLAN Specific Identifier List',
130 82: 'I-WLAN Equivalent HPLMN Presentation Indication',
131 83: 'I-WLAN HPLMN Priority Indication',
132 84: 'I-WLAN Last Registered PLMN',
133 85: 'EPS Mobility Management Information',
134 86: 'Allowed CSG Lists and corresponding indications',
135 87: 'Call control on EPS PDN connection by USIM',
136 88: 'HPLMN Direct Access',
137 89: 'eCall Data',
138 90: 'Operator CSG Lists and corresponding indications',
139 91: 'Support for SM-over-IP',
140 92: 'Support of CSG Display Control',
141 93: 'Communication Control for IMS by USIM',
142 94: 'Extended Terminal Applications',
143 95: 'Support of UICC access to IMS',
144 96: 'Non-Access Stratum configuration by USIM',
145 97: 'PWS configuration by USIM',
146 98: 'RFU',
147 99: 'URI support by UICC',
148 100: 'Extended EARFCN support',
149 101: 'ProSe',
150 102: 'USAT Application Pairing',
151 103: 'Media Type support',
152 104: 'IMS call disconnection cause',
153 105: 'URI support for MO SHORT MESSAGE CONTROL',
154 106: 'ePDG configuration Information support',
155 107: 'ePDG configuration Information configured',
156 108: 'ACDC support',
157 109: 'MCPTT',
158 110: 'ePDG configuration Information for Emergency Service support',
159 111: 'ePDG configuration Information for Emergency Service configured',
160 112: 'eCall Data over IMS',
161 113: 'URI support for SMS-PP DOWNLOAD as defined in 3GPP TS 31.111 [12]',
162 114: 'From Preferred',
163 115: 'IMS configuration data',
164 116: 'TV configuration',
165 117: '3GPP PS Data Off',
166 118: '3GPP PS Data Off Service List',
167 119: 'V2X',
168 120: 'XCAP Configuration Data',
169 121: 'EARFCN list for MTC/NB-IOT UEs',
170 122: '5GS Mobility Management Information',
171 123: '5G Security Parameters',
172 124: 'Subscription identifier privacy support',
173 125: 'SUCI calculation by the USIM',
174 126: 'UAC Access Identities support',
175 127: 'Expect control plane-based Steering of Roaming information during initial registration in VPLMN',
176 128: 'Call control on PDU Session by USIM',
177 129: '5GS Operator PLMN List',
178 130: 'Support for SUPI of type NSI or GLI or GCI',
179 131: '3GPP PS Data Off separate Home and Roaming lists',
180 132: 'Support for URSP by USIM',
181 133: '5G Security Parameters extended',
182 134: 'MuD and MiD configuration data',
Harald Weltefc67de22023-05-23 20:29:49 +0200183 135: 'Support for Trusted non-3GPP access networks by USIM',
184 136: 'Support for multiple records of NAS security context storage for multiple registration',
185 137: 'Pre-configured CAG information list',
186 138: 'SOR-CMCI storage in USIM',
187 139: '5G ProSe',
188 140: 'Storage of disaster roaming information in USIM',
189 141: 'Pre-configured eDRX parameters',
190 142: '5G NSWO support',
191 143: 'PWS configuration for SNPN in USIM',
192 144: 'Multiplier Coefficient for Higher Priority PLMN search via NG-RAN satellite access',
193 145: 'K_AUSF derivation configuration',
194 146: 'Network Identifier for SNPN (NID)',
195}
196
197EF_5G_PROSE_ST_map = {
198 1: '5G ProSe configuration data for direct discovery',
199 2: '5G ProSe configuration data for direct communication',
200 3: '5G ProSe configuration data for UE-to-network relay UE',
201 4: '5G ProSe configuration data for remote UE',
202 5: '5G ProSe configuration data for usage information reporting',
Sebastian Viviani0dc8f692020-05-29 00:14:55 +0100203}
204
Harald Weltee8947492022-02-10 10:33:20 +0100205# Mapping between USIM Enbled Service Number and its description
206EF_EST_map = {
207 1: 'Fixed Dialling Numbers (FDN)',
208 2: 'Barred Dialling Numbers (BDN)',
209 3: 'APN Control List (ACL)'
210}
211
Harald Welte21caf322022-07-16 14:06:46 +0200212# 3gPP TS 31.102 Section 7.5.2.1
213class SUCI_TlvDataObject(BER_TLV_IE, tag=0xA1):
214 _construct = HexAdapter(GreedyBytes)
215
Harald Welteb2edd142021-01-08 23:29:35 +0100216######################################################################
217# ADF.USIM
218######################################################################
219
Harald Welteb2edd142021-01-08 23:29:35 +0100220
Harald Weltef12979d2021-05-29 21:47:13 +0200221# 3GPP TS 31.102 Section 4.4.11.4 (EF_5GS3GPPNSC)
222class EF_5GS3GPPNSC(LinFixedEF):
223 class NgKSI(BER_TLV_IE, tag=0x80):
224 _construct = Int8ub
225
226 class K_AMF(BER_TLV_IE, tag=0x81):
227 _construct = HexAdapter(Bytes(32))
228
229 class UplinkNASCount(BER_TLV_IE, tag=0x82):
230 _construct = Int32ub
231
232 class DownlinkNASCount(BER_TLV_IE, tag=0x83):
233 _construct = Int32ub
234
235 class IdsOfSelectedNasAlgos(BER_TLV_IE, tag=0x84):
236 # 3GPP TS 24.501 Section 9.11.3.34
237 _construct = BitStruct('ciphering'/Nibble, 'integrity'/Nibble)
238
239 class IdsOfSelectedEpsAlgos(BER_TLV_IE, tag=0x85):
240 # 3GPP TS 24.301 Section 9.9.3.23
241 _construct = BitStruct('ciphering'/Nibble, 'integrity'/Nibble)
242
243 class FiveGSNasSecurityContext(BER_TLV_IE, tag=0xA0,
Harald Weltec91085e2022-02-10 18:05:45 +0100244 nested=[NgKSI, K_AMF, UplinkNASCount,
245 DownlinkNASCount, IdsOfSelectedNasAlgos,
246 IdsOfSelectedEpsAlgos]):
Harald Weltef12979d2021-05-29 21:47:13 +0200247 pass
248
Harald Welte99e4cc02022-07-21 15:25:47 +0200249 def __init__(self, fid="4f03", sfid=0x03, name='EF.5GS3GPPNSC', rec_len=(57, None),
Harald Welte419bb492022-02-12 21:39:35 +0100250 desc='5GS 3GPP Access NAS Security Context', **kwargs):
251 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte65516272022-02-10 17:51:05 +0100252 self._tlv = EF_5GS3GPPNSC.FiveGSNasSecurityContext
Harald Weltef12979d2021-05-29 21:47:13 +0200253
254# 3GPP TS 31.102 Section 4.4.11.6
255class EF_5GAUTHKEYS(TransparentEF):
256 class K_AUSF(BER_TLV_IE, tag=0x80):
257 _construct = HexAdapter(GreedyBytes)
258
259 class K_SEAF(BER_TLV_IE, tag=0x81):
260 _construct = HexAdapter(GreedyBytes)
261
262 class FiveGAuthKeys(TLV_IE_Collection, nested=[K_AUSF, K_SEAF]):
263 pass
264
Harald Welte13edf302022-07-21 15:19:23 +0200265 def __init__(self, fid='4f05', sfid=0x05, name='EF.5GAUTHKEYS', size=(68, None),
Harald Welte419bb492022-02-12 21:39:35 +0100266 desc='5G authentication keys', **kwargs):
267 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte65516272022-02-10 17:51:05 +0100268 self._tlv = EF_5GAUTHKEYS.FiveGAuthKeys
Harald Weltef12979d2021-05-29 21:47:13 +0200269
270# 3GPP TS 31.102 Section 4.4.11.8
271class ProtSchemeIdList(BER_TLV_IE, tag=0xa0):
272 # FIXME: 3GPP TS 24.501 Protection Scheme Identifier
273 # repeated sequence of (id, index) tuples
Harald Weltec91085e2022-02-10 18:05:45 +0100274 _construct = GreedyRange(
275 Struct('id'/Enum(Byte, null=0, A=1, B=2), 'index'/Int8ub))
276
Harald Weltef12979d2021-05-29 21:47:13 +0200277
278class HomeNetPubKeyId(BER_TLV_IE, tag=0x80):
279 # 3GPP TS 24.501 / 3GPP TS 23.003
280 _construct = Int8ub
281
Harald Weltec91085e2022-02-10 18:05:45 +0100282
Harald Weltef12979d2021-05-29 21:47:13 +0200283class HomeNetPubKey(BER_TLV_IE, tag=0x81):
284 # FIXME: RFC 5480
285 _construct = HexAdapter(GreedyBytes)
286
Harald Weltec91085e2022-02-10 18:05:45 +0100287
Harald Weltef12979d2021-05-29 21:47:13 +0200288class HomeNetPubKeyList(BER_TLV_IE, tag=0xa1,
Harald Weltec91085e2022-02-10 18:05:45 +0100289 nested=[HomeNetPubKeyId, HomeNetPubKey]):
Harald Weltef12979d2021-05-29 21:47:13 +0200290 pass
291
292# 3GPP TS 31.102 Section 4.4.11.6
Harald Weltec91085e2022-02-10 18:05:45 +0100293class SUCI_CalcInfo(TLV_IE_Collection, nested=[ProtSchemeIdList, HomeNetPubKeyList]):
Harald Weltef12979d2021-05-29 21:47:13 +0200294 pass
295
296
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200297# TS 31.102 4.4.11.8
298class EF_SUCI_Calc_Info(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200299 def __init__(self, fid="4f07", sfid=0x07, name='EF.SUCI_Calc_Info', size=(2, None),
Harald Welte419bb492022-02-12 21:39:35 +0100300 desc='SUCI Calc Info', **kwargs):
301 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200302
303 def _encode_prot_scheme_id_list(self, in_list):
304 out_bytes = [0xa0]
Harald Weltec91085e2022-02-10 18:05:45 +0100305 out_bytes.append(len(in_list)*2) # two byte per entry
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200306
307 # position in list determines priority; high-priority items (low index) come first
308 for scheme in sorted(in_list, key=lambda item: item["priority"]):
309 out_bytes.append(scheme["identifier"])
310 out_bytes.append(scheme["key_index"])
311
312 return out_bytes
313
314 def _encode_hnet_pubkey_list(self, hnet_pubkey_list):
Harald Weltec91085e2022-02-10 18:05:45 +0100315 out_bytes = [0xa1] # pubkey list tag
316 out_bytes.append(0x00) # length filled later
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200317 length = 0
318
319 for key in hnet_pubkey_list:
Harald Weltec91085e2022-02-10 18:05:45 +0100320 out_bytes.append(0x80) # identifier tag
321 out_bytes.append(0x01) # TODO size, fixed to 1 byte
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200322 out_bytes.append(key["hnet_pubkey_identifier"])
Harald Weltec91085e2022-02-10 18:05:45 +0100323 out_bytes.append(0x81) # key tag
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200324 out_bytes.append(len(key["hnet_pubkey"])//2)
325 length += 5+len(key["hnet_pubkey"])//2
326
327 pubkey_bytes = h2b(key["hnet_pubkey"])
328 out_bytes += pubkey_bytes
329
330 # fill length
331 out_bytes[1] = length
332 return out_bytes
333
334 def _encode_hex(self, in_json):
Harald Weltec91085e2022-02-10 18:05:45 +0100335 out_bytes = self._encode_prot_scheme_id_list(
336 in_json['prot_scheme_id_list'])
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200337 out_bytes += self._encode_hnet_pubkey_list(in_json['hnet_pubkey_list'])
338 return "".join(["%02X" % i for i in out_bytes])
339
340 def _decode_prot_scheme_id_list(self, in_bytes):
341 prot_scheme_id_list = []
342 pos = 0
343 # two bytes per entry
344 while pos < len(in_bytes):
345 prot_scheme = {
Harald Weltec91085e2022-02-10 18:05:45 +0100346 'priority': pos//2, # first in list: high priority
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200347 'identifier': in_bytes[pos],
348 'key_index': in_bytes[pos+1]
349 }
350 pos += 2
351 prot_scheme_id_list.append(prot_scheme)
352 return prot_scheme_id_list
353
354 def _decode_hnet_pubkey_list(self, in_bytes):
355 hnet_pubkey_list = []
356 pos = 0
357 if in_bytes[pos] != 0xa1:
358 print("missing Home Network Public Key List data object")
359 return {}
360 pos += 1
361 hnet_pubkey_list_len = in_bytes[pos]
362 pos += 1
363
364 while pos < hnet_pubkey_list_len:
365 if in_bytes[pos] != 0x80:
366 print("missing Home Network Public Key Identifier tag")
367 return {}
368 pos += 1
Harald Weltec91085e2022-02-10 18:05:45 +0100369 # TODO might be more than 1 byte?
370 hnet_pubkey_id_len = in_bytes[pos]
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200371 pos += 1
372 hnet_pubkey_id = in_bytes[pos:pos+hnet_pubkey_id_len][0]
373 pos += hnet_pubkey_id_len
374 if in_bytes[pos] != 0x81:
375 print("missing Home Network Public Key tag")
376 return {}
377 pos += 1
378 hnet_pubkey_len = in_bytes[pos]
379 pos += 1
380 hnet_pubkey = in_bytes[pos:pos+hnet_pubkey_len]
381 pos += hnet_pubkey_len
382
383 hnet_pubkey_list.append({
384 'hnet_pubkey_identifier': hnet_pubkey_id,
385 'hnet_pubkey': b2h(hnet_pubkey)
386 })
387
388 return hnet_pubkey_list
389
390 def _decode_bin(self, in_bin):
Vadim Yanitskiy5e41eeb2021-05-02 02:20:33 +0200391 return self._decode_hex(b2h(in_bin))
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200392
393 def _decode_hex(self, in_hex):
394 in_bytes = h2b(in_hex)
395 pos = 0
396
397 if in_bytes[pos] != 0xa0:
398 print("missing Protection Scheme Identifier List data object tag")
399 return {}
400 pos += 1
401
Harald Weltec91085e2022-02-10 18:05:45 +0100402 prot_scheme_id_list_len = in_bytes[pos] # TODO maybe more than 1 byte
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200403 pos += 1
404 # decode Protection Scheme Identifier List data object
Harald Weltec91085e2022-02-10 18:05:45 +0100405 prot_scheme_id_list = self._decode_prot_scheme_id_list(
406 in_bytes[pos:pos+prot_scheme_id_list_len])
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200407 pos += prot_scheme_id_list_len
408
409 # remaining data holds Home Network Public Key Data Object
410 hnet_pubkey_list = self._decode_hnet_pubkey_list(in_bytes[pos:])
411
412 return {
413 'prot_scheme_id_list': prot_scheme_id_list,
414 'hnet_pubkey_list': hnet_pubkey_list
415 }
416
417 def _encode_bin(self, in_json):
418 return h2b(self._encode_hex(in_json))
419
Harald Weltec91085e2022-02-10 18:05:45 +0100420
Harald Welteb2edd142021-01-08 23:29:35 +0100421class EF_LI(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200422 def __init__(self, fid='6f05', sfid=None, name='EF.LI', size=(2, None), rec_len=2,
Harald Welteb2edd142021-01-08 23:29:35 +0100423 desc='Language Indication'):
424 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)
Harald Weltec91085e2022-02-10 18:05:45 +0100425
Harald Weltef6b37af2023-01-24 15:42:26 +0100426 def _decode_record_bin(self, in_bin, **kwargs):
Harald Welteb2edd142021-01-08 23:29:35 +0100427 if in_bin == b'\xff\xff':
428 return None
429 else:
430 # officially this is 7-bit GSM alphabet with one padding bit in each byte
431 return in_bin.decode('ascii')
Harald Weltec91085e2022-02-10 18:05:45 +0100432
Harald Weltef6b37af2023-01-24 15:42:26 +0100433 def _encode_record_bin(self, in_json, **kwargs):
Harald Welteb2edd142021-01-08 23:29:35 +0100434 if in_json == None:
435 return b'\xff\xff'
436 else:
437 # officially this is 7-bit GSM alphabet with one padding bit in each byte
438 return in_json.encode('ascii')
439
Harald Weltec91085e2022-02-10 18:05:45 +0100440
Harald Welteb2edd142021-01-08 23:29:35 +0100441class EF_Keys(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200442 def __init__(self, fid='6f08', sfid=0x08, name='EF.Keys', size=(33, 33),
Harald Welteb2edd142021-01-08 23:29:35 +0100443 desc='Ciphering and Integrity Keys'):
444 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Weltec91085e2022-02-10 18:05:45 +0100445 self._construct = Struct(
446 'ksi'/Int8ub, 'ck'/HexAdapter(Bytes(16)), 'ik'/HexAdapter(Bytes(16)))
Harald Welteb2edd142021-01-08 23:29:35 +0100447
Harald Welte14105dc2021-05-31 08:48:51 +0200448# TS 31.102 Section 4.2.6
449class EF_HPPLMN(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100450 _test_de_encode = [ ( '05', 5 ) ]
Harald Welte13edf302022-07-21 15:19:23 +0200451 def __init__(self, fid='6f31', sfid=0x12, name='EF.HPPLMN', size=(1, 1),
Harald Welte14105dc2021-05-31 08:48:51 +0200452 desc='Higher Priority PLMN search period'):
453 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
454 self._construct = Int8ub
455
Harald Welte6ca2fa72022-02-12 16:29:31 +0100456class EF_UST(EF_UServiceTable):
457 def __init__(self, **kwargs):
Harald Welte13edf302022-07-21 15:19:23 +0200458 super().__init__(fid='6f38', sfid=0x04, name='EF.UST', desc='USIM Service Table', size=(1,17), table=EF_UST_map, **kwargs)
Harald Welte6ca2fa72022-02-12 16:29:31 +0100459 # add those commands to the general commands of a TransparentEF
460 self.shell_commands += [self.AddlShellCommands()]
461
Harald Welteb2edd142021-01-08 23:29:35 +0100462 @with_default_category('File-Specific Commands')
463 class AddlShellCommands(CommandSet):
464 def __init__(self):
465 super().__init__()
466
467 def do_ust_service_activate(self, arg):
468 """Activate a service within EF.UST"""
469 self._cmd.card.update_ust(int(arg), 1)
470
471 def do_ust_service_deactivate(self, arg):
472 """Deactivate a service within EF.UST"""
473 self._cmd.card.update_ust(int(arg), 0)
474
Harald Welte4c5e2312022-02-12 14:37:48 +0100475 def do_ust_service_check(self, arg):
Harald Welte3bb516b2022-02-12 21:53:18 +0100476 """Check consistency between services of this file and files present/activated.
477
478 Many services determine if one or multiple files shall be present/activated or if they shall be
479 absent/deactivated. This performs a consistency check to ensure that no services are activated
480 for files that are not - and vice-versa, no files are activated for services that are not. Error
481 messages are printed for every inconsistency found."""
Harald Weltea6c0f882022-07-17 14:23:17 +0200482 selected_file = self._cmd.lchan.selected_file
Harald Welte82f75c22022-02-12 18:22:28 +0100483 num_problems = selected_file.ust_service_check(self._cmd)
484 # obtain list of currently active services
485 active_services = selected_file.get_active_services(self._cmd)
486 # Service n°46 can only be declared "available" if service n°45 is declared "available"
487 if 46 in active_services and not 45 in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100488 self._cmd.perror("ERROR: Service 46 available, but it requires Service 45")
Harald Welte82f75c22022-02-12 18:22:28 +0100489 num_problems += 1
490 # Service n°125 shall only be taken into account if Service n°124 is declared "available"
491 if 125 in active_services and not 124 in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100492 self._cmd.perror("ERROR: Service 125 is ignored as Service 124 not available")
Harald Welte82f75c22022-02-12 18:22:28 +0100493 num_problems += 1
494 # Service n°95, n°99 and n°115 shall not be declared "available" if an ISIM application is present on the UICC
495 non_isim_services = [95, 99, 115]
496 app_names = selected_file.get_mf().get_app_names()
497 if 'ADF.ISIM' in app_names:
498 for s in non_isim_services:
499 if s in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100500 self._cmd.perror("ERROR: Service %u shall not be available as ISIM application is present" % s)
Harald Welte82f75c22022-02-12 18:22:28 +0100501 num_problems += 1
502 self._cmd.poutput("===> %u service / file inconsistencies detected" % num_problems)
Harald Welte4c5e2312022-02-12 14:37:48 +0100503
504
Harald Welte89e59542021-04-02 21:33:13 +0200505# TS 31.103 Section 4.2.7 - *not* the same as DF.GSM/EF.ECC!
506class EF_ECC(LinFixedEF):
Harald Welte865eea62023-01-27 19:26:12 +0100507 _test_de_encode = [
508 ( '19f1ff01', { "call_code": "911f",
509 "service_category": { "police": True, "ambulance": False, "fire_brigade": False,
510 "marine_guard": False, "mountain_rescue": False,
511 "manual_ecall": False, "automatic_ecall": False } } ),
512 ( '19f3ff02', { "call_code": "913f",
513 "service_category": { "police": False, "ambulance": True, "fire_brigade": False,
514 "marine_guard": False, "mountain_rescue": False,
515 "manual_ecall": False, "automatic_ecall": False } } ),
516 ]
517 cc_construct = BcdAdapter(Rpad(Bytes(3)))
Harald Welteff2d86d2022-01-21 15:19:47 +0100518 category_construct = FlagsEnum(Byte, police=1, ambulance=2, fire_brigade=3, marine_guard=4,
519 mountain_rescue=5, manual_ecall=6, automatic_ecall=7)
520 alpha_construct = GsmStringAdapter(Rpad(GreedyBytes))
Harald Weltec91085e2022-02-10 18:05:45 +0100521
Harald Welte89e59542021-04-02 21:33:13 +0200522 def __init__(self, fid='6fb7', sfid=0x01, name='EF.ECC',
523 desc='Emergency Call Codes'):
Harald Welte99e4cc02022-07-21 15:25:47 +0200524 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=(4, 20))
Harald Weltec91085e2022-02-10 18:05:45 +0100525
Harald Weltef6b37af2023-01-24 15:42:26 +0100526 def _decode_record_bin(self, in_bin, **kwargs):
Harald Welteff2d86d2022-01-21 15:19:47 +0100527 # mandatory parts
528 code = in_bin[:3]
529 if code == b'\xff\xff\xff':
530 return None
531 svc_category = in_bin[-1:]
532 ret = {'call_code': parse_construct(EF_ECC.cc_construct, code),
Harald Weltec91085e2022-02-10 18:05:45 +0100533 'service_category': parse_construct(EF_ECC.category_construct, svc_category)}
Harald Welteff2d86d2022-01-21 15:19:47 +0100534 # optional alpha identifier
535 if len(in_bin) > 4:
536 alpha_id = in_bin[3:-1]
537 ret['alpha_id'] = parse_construct(EF_ECC.alpha_construct, alpha_id)
538 return ret
Harald Weltec91085e2022-02-10 18:05:45 +0100539
Harald Weltef6b37af2023-01-24 15:42:26 +0100540 def _encode_record_bin(self, in_json, **kwargs):
Harald Welteff2d86d2022-01-21 15:19:47 +0100541 if in_json is None:
542 return b'\xff\xff\xff\xff'
543 code = EF_ECC.cc_construct.build(in_json['call_code'])
Harald Welte9b9efb62023-01-31 16:40:54 +0100544 svc_category = EF_ECC.category_construct.build(in_json['service_category'])
545 if 'alpha_id' in in_json:
546 alpha_id = EF_ECC.alpha_construct.build(in_json['alpha_id'])
547 # FIXME: alpha_id needs padding up to 'record_length - 4'
548 else:
549 alpha_id = b''
Harald Welteff2d86d2022-01-21 15:19:47 +0100550 return code + alpha_id + svc_category
551
Harald Welte89e59542021-04-02 21:33:13 +0200552
Harald Welte790b2702021-04-11 00:01:35 +0200553# TS 31.102 Section 4.2.17
554class EF_LOCI(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100555 _test_de_encode = [
556 ( '47d1264a62f21037211e00',
557 { "tmsi": "47d1264a", "lai": { "mcc_mnc": "262f01", "lac": "3721" },
558 "rfu": 30, "lu_status": 0 } ),
559 ]
Harald Welte13edf302022-07-21 15:19:23 +0200560 def __init__(self, fid='6f7e', sfid=0x0b, name='EF.LOCI', desc='Location information', size=(11, 11)):
Harald Welte790b2702021-04-11 00:01:35 +0200561 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Welte3a5afff2022-02-25 15:33:46 +0100562 Lai = Struct('mcc_mnc'/BcdAdapter(Bytes(3)), 'lac'/HexAdapter(Bytes(2)))
563 self._construct = Struct('tmsi'/HexAdapter(Bytes(4)), 'lai'/Lai, 'rfu'/Int8ub, 'lu_status'/Int8ub)
Harald Welte865eea62023-01-27 19:26:12 +0100564
Harald Welte592b32e2021-06-05 11:26:36 +0200565# TS 31.102 Section 4.2.18
566class EF_AD(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100567 _test_de_encode = [
568 ( '00000002', { "ms_operation_mode": "normal",
569 "additional_info": { "ciphering_indicator": False, "csg_display_control": False,
570 "prose_services": False, "extended_drx": False },
571 "rfu": 0, "mnc_len": 2, "extensions": b'' } ),
572 ( '01000102', { "ms_operation_mode": "normal_and_specific_facilities",
573 "additional_info": { "ciphering_indicator": True, "csg_display_control": False,
574 "prose_services": False, "extended_drx": False },
575 "rfu": 0, "mnc_len": 2, "extensions": b'' } ),
576 ]
Harald Welte592b32e2021-06-05 11:26:36 +0200577 class OP_MODE(enum.IntEnum):
Harald Weltec91085e2022-02-10 18:05:45 +0100578 normal = 0x00
579 type_approval = 0x80
580 normal_and_specific_facilities = 0x01
581 type_approval_and_specific_facilities = 0x81
582 maintenance_off_line = 0x02
583 cell_test = 0x04
Harald Welte592b32e2021-06-05 11:26:36 +0200584
Harald Welte13edf302022-07-21 15:19:23 +0200585 def __init__(self, fid='6fad', sfid=0x03, name='EF.AD', desc='Administrative Data', size=(4, 6)):
Harald Welte592b32e2021-06-05 11:26:36 +0200586 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
587 self._construct = BitStruct(
588 # Byte 1
589 'ms_operation_mode'/Bytewise(Enum(Byte, EF_AD.OP_MODE)),
590 # Byte 2 + 3
591 'additional_info'/Bytewise(FlagsEnum(Int16ub, ciphering_indicator=1, csg_display_control=2,
592 prose_services=4, extended_drx=8)),
593 'rfu'/BitsRFU(4),
594 'mnc_len'/BitsInteger(4),
595 'extensions'/COptional(Bytewise(GreedyBytesRFU))
596 )
Harald Welte790b2702021-04-11 00:01:35 +0200597
598# TS 31.102 Section 4.2.23
599class EF_PSLOCI(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200600 def __init__(self, fid='6f73', sfid=0x0c, name='EF.PSLOCI', desc='PS Location information', size=(14, 14)):
Harald Welte790b2702021-04-11 00:01:35 +0200601 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
602 self._construct = Struct('ptmsi'/HexAdapter(Bytes(4)), 'ptmsi_sig'/HexAdapter(Bytes(3)),
603 'rai'/HexAdapter(Bytes(6)), 'rau_status'/Int8ub)
604
605# TS 31.102 Section 4.2.33
606class EF_ICI(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200607 def __init__(self, fid='6f80', sfid=0x14, name='EF.ICI', rec_len=(28, 48),
Harald Welte6169c722022-02-12 09:05:15 +0100608 desc='Incoming Call Information', **kwargs):
609 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200610 self._construct = Struct('alpha_id'/HexAdapter(Bytes(this._.total_len-28)),
Harald Welte790b2702021-04-11 00:01:35 +0200611 'len_of_bcd_contents'/Int8ub,
612 'ton_npi'/Int8ub,
613 'call_number'/BcdAdapter(Bytes(10)),
614 'cap_cfg2_record_id'/Int8ub,
615 'ext5_record_id'/Int8ub,
616 'date_and_time'/BcdAdapter(Bytes(7)),
617 'duration'/Int24ub,
618 'status'/Byte,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200619 'link_to_phonebook'/HexAdapter(Bytes(3)))
Harald Welte790b2702021-04-11 00:01:35 +0200620
621# TS 31.102 Section 4.2.34
622class EF_OCI(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200623 def __init__(self, fid='6f81', sfid=0x15, name='EF.OCI', rec_len=(27, 47),
Harald Welte6169c722022-02-12 09:05:15 +0100624 desc='Outgoing Call Information', **kwargs):
625 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200626 self._construct = Struct('alpha_id'/HexAdapter(Bytes(this._.total_len-27)),
Harald Welte790b2702021-04-11 00:01:35 +0200627 'len_of_bcd_contents'/Int8ub,
628 'ton_npi'/Int8ub,
629 'call_number'/BcdAdapter(Bytes(10)),
630 'cap_cfg2_record_id'/Int8ub,
631 'ext5_record_id'/Int8ub,
632 'date_and_time'/BcdAdapter(Bytes(7)),
633 'duration'/Int24ub,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200634 'link_to_phonebook'/HexAdapter(Bytes(3)))
Harald Welte790b2702021-04-11 00:01:35 +0200635
636# TS 31.102 Section 4.2.35
637class EF_ICT(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200638 def __init__(self, fid='6f82', sfid=None, name='EF.ICT', rec_len=(3, 3),
Harald Welte6169c722022-02-12 09:05:15 +0100639 desc='Incoming Call Timer', **kwargs):
640 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200641 self._construct = Struct('accumulated_call_timer'/Int24ub)
642
643# TS 31.102 Section 4.2.38
644class EF_CCP2(LinFixedEF):
Harald Welte6169c722022-02-12 09:05:15 +0100645 def __init__(self, fid='6f4f', sfid=0x16, name='EF.CCP2', desc='Capability Configuration Parameters 2', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200646 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(15, None), **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200647
Harald Welte6ca2fa72022-02-12 16:29:31 +0100648# TS 31.102 Section 4.2.47
649class EF_EST(EF_UServiceTable):
650 def __init__(self, **kwargs):
Harald Welte13edf302022-07-21 15:19:23 +0200651 super().__init__(fid='6f56', sfid=0x05, name='EF.EST', desc='Enabled Services Table', size=(1,None), table=EF_EST_map, **kwargs)
Harald Welte6ca2fa72022-02-12 16:29:31 +0100652 # add those commands to the general commands of a TransparentEF
653 self.shell_commands += [self.AddlShellCommands()]
654
655 @with_default_category('File-Specific Commands')
656 class AddlShellCommands(CommandSet):
657 def __init__(self):
658 super().__init__()
659
Harald Welte18b75392023-02-23 10:00:51 +0100660 def do_est_service_enable(self, arg):
661 """Enable a service within EF.UST"""
Harald Welte6ca2fa72022-02-12 16:29:31 +0100662 self._cmd.card.update_est(int(arg), 1)
663
Harald Welte18b75392023-02-23 10:00:51 +0100664 def do_est_service_disable(self, arg):
665 """Disable a service within EF.UST"""
Harald Welte6ca2fa72022-02-12 16:29:31 +0100666 self._cmd.card.update_est(int(arg), 0)
667
Harald Welte790b2702021-04-11 00:01:35 +0200668# TS 31.102 Section 4.2.48
669class EF_ACL(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200670 def __init__(self, fid='6f57', sfid=None, name='EF.ACL', size=(32, None),
Harald Welte6169c722022-02-12 09:05:15 +0100671 desc='Access Point Name Control List', **kwargs):
672 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200673 self._construct = Struct('num_of_apns'/Int8ub, 'tlvs'/HexAdapter(GreedyBytes))
Harald Welte790b2702021-04-11 00:01:35 +0200674
675# TS 31.102 Section 4.2.51
676class EF_START_HFN(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100677 _test_de_encode = [
678 ( 'f00000f00000', { "start_cs": 15728640, "start_ps": 15728640 } ),
679 ]
Harald Welte13edf302022-07-21 15:19:23 +0200680 def __init__(self, fid='6f5b', sfid=0x0f, name='EF.START-HFN', size=(6, 6),
Harald Welte6169c722022-02-12 09:05:15 +0100681 desc='Initialisation values for Hyperframe number', **kwargs):
682 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200683 self._construct = Struct('start_cs'/Int24ub, 'start_ps'/Int24ub)
684
685# TS 31.102 Section 4.2.52
686class EF_THRESHOLD(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100687 _test_de_encode = [
688 ( 'f01000', { "max_start": 15732736 } ),
689 ]
Harald Welte13edf302022-07-21 15:19:23 +0200690 def __init__(self, fid='6f5c', sfid=0x10, name='EF.THRESHOLD', size=(3, 3),
Harald Welte6169c722022-02-12 09:05:15 +0100691 desc='Maximum value of START', **kwargs):
692 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200693 self._construct = Struct('max_start'/Int24ub)
694
Harald Welte363edd92022-07-17 22:24:03 +0200695# TS 31.102 (old releases like 3.8.0) Section 4.2.56
696class EF_RPLMNAcT(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200697 def __init__(self, fid='6f65', sfid=None, name='EF.RPLMNAcTD', size=(2, 4), rec_len=2,
Harald Welte363edd92022-07-17 22:24:03 +0200698 desc='RPLMN Last used Access Technology', **kwargs):
699 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len, **kwargs)
Harald Weltef6b37af2023-01-24 15:42:26 +0100700 def _decode_record_hex(self, in_hex, **kwargs):
Harald Welte363edd92022-07-17 22:24:03 +0200701 return dec_act(in_hex)
702 # TODO: Encode
703
Harald Welte790b2702021-04-11 00:01:35 +0200704# TS 31.102 Section 4.2.77
705class EF_VGCSCA(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200706 def __init__(self, fid='6fd4', sfid=None, name='EF.VGCSCA', size=(2, 100), rec_len=2,
Harald Welte6169c722022-02-12 09:05:15 +0100707 desc='Voice Group Call Service Ciphering Algorithm', **kwargs):
708 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200709 self._construct = Struct('alg_v_ki_1'/Int8ub, 'alg_v_ki_2'/Int8ub)
710
711# TS 31.102 Section 4.2.79
712class EF_GBABP(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200713 def __init__(self, fid='6fd6', sfid=None, name='EF.GBABP', size=(3, 50),
Harald Welte6169c722022-02-12 09:05:15 +0100714 desc='GBA Bootstrapping parameters', **kwargs):
715 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200716 self._construct = Struct('rand'/LV, 'b_tid'/LV, 'key_lifetime'/LV)
717
718# TS 31.102 Section 4.2.80
719class EF_MSK(LinFixedEF):
Harald Welte6169c722022-02-12 09:05:15 +0100720 def __init__(self, fid='6fd7', sfid=None, name='EF.MSK', desc='MBMS Service Key List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200721 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(20, None), **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200722 msk_ts_constr = Struct('msk_id'/Int32ub, 'timestamp_counter'/Int32ub)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200723 self._construct = Struct('key_domain_id'/HexAdapter(Bytes(3)),
Harald Welte790b2702021-04-11 00:01:35 +0200724 'num_msk_id'/Int8ub,
725 'msk_ids'/msk_ts_constr[this.num_msk_id])
Harald Welte14105dc2021-05-31 08:48:51 +0200726# TS 31.102 Section 4.2.81
727class EF_MUK(LinFixedEF):
728 class MUK_Idr(BER_TLV_IE, tag=0x80):
729 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100730
Harald Welte14105dc2021-05-31 08:48:51 +0200731 class MUK_Idi(BER_TLV_IE, tag=0x82):
732 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100733
Harald Welte14105dc2021-05-31 08:48:51 +0200734 class MUK_ID(BER_TLV_IE, tag=0xA0, nested=[MUK_Idr, MUK_Idi]):
735 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100736
Harald Welte14105dc2021-05-31 08:48:51 +0200737 class TimeStampCounter(BER_TLV_IE, tag=0x81):
738 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100739
Harald Welte14105dc2021-05-31 08:48:51 +0200740 class EF_MUK_Collection(TLV_IE_Collection, nested=[MUK_ID, TimeStampCounter]):
741 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100742
Harald Welte6169c722022-02-12 09:05:15 +0100743 def __init__(self, fid='6fd8', sfid=None, name='EF.MUK', desc='MBMS User Key', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200744 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(None, None), **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200745 self._tlv = EF_MUK.EF_MUK_Collection
746
747# TS 31.102 Section 4.2.83
748class EF_GBANL(LinFixedEF):
749 class NAF_ID(BER_TLV_IE, tag=0x80):
750 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100751
Harald Welte14105dc2021-05-31 08:48:51 +0200752 class B_TID(BER_TLV_IE, tag=0x81):
753 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100754
Harald Welte14105dc2021-05-31 08:48:51 +0200755 class EF_GBANL_Collection(BER_TLV_IE, nested=[NAF_ID, B_TID]):
756 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100757
Harald Welte6169c722022-02-12 09:05:15 +0100758 def __init__(self, fid='6fda', sfid=None, name='EF.GBANL', desc='GBA NAF List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200759 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(None, None), **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200760 self._tlv = EF_GBANL.EF_GBANL_Collection
Harald Welte790b2702021-04-11 00:01:35 +0200761
762# TS 31.102 Section 4.2.85
763class EF_EHPLMNPI(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100764 _test_de_encode = [
765 ( '02', { "presentation_ind": "display_all" } ),
766 ]
Harald Welte13edf302022-07-21 15:19:23 +0200767 def __init__(self, fid='6fdb', sfid=None, name='EF.EHPLMNPI', size=(1, 1),
Harald Welte6169c722022-02-12 09:05:15 +0100768 desc='Equivalent HPLMN Presentation Indication', **kwargs):
769 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100770 self._construct = Struct('presentation_ind' /
Harald Welte790b2702021-04-11 00:01:35 +0200771 Enum(Byte, no_preference=0, display_highest_prio_only=1, display_all=2))
Harald Welte14105dc2021-05-31 08:48:51 +0200772
773# TS 31.102 Section 4.2.87
774class EF_NAFKCA(LinFixedEF):
775 class NAF_KeyCentreAddress(BER_TLV_IE, tag=0x80):
776 _construct = HexAdapter(GreedyBytes)
Harald Welte99e4cc02022-07-21 15:25:47 +0200777 def __init__(self, fid='6fdd', sfid=None, name='EF.NAFKCA', rec_len=(None, None),
Harald Welte6169c722022-02-12 09:05:15 +0100778 desc='NAF Key Centre Address', **kwargs):
779 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200780 self._tlv = EF_NAFKCA.NAF_KeyCentreAddress
781
782# TS 31.102 Section 4.2.90
783class EF_NCP_IP(LinFixedEF):
784 class DataDestAddrRange(TLV_IE, tag=0x83):
785 _construct = Struct('type_of_address'/Enum(Byte, IPv4=0x21, IPv6=0x56),
786 'prefix_length'/Int8ub,
787 'prefix'/HexAdapter(GreedyBytes))
Harald Weltec91085e2022-02-10 18:05:45 +0100788
Harald Welte14105dc2021-05-31 08:48:51 +0200789 class AccessPointName(TLV_IE, tag=0x80):
790 # coded as per TS 23.003
791 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100792
Harald Welte14105dc2021-05-31 08:48:51 +0200793 class Login(TLV_IE, tag=0x81):
794 # as per SMS DCS TS 23.038
795 _construct = GsmStringAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100796
Harald Welte14105dc2021-05-31 08:48:51 +0200797 class Password(TLV_IE, tag=0x82):
798 # as per SMS DCS TS 23.038
799 _construct = GsmStringAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100800
Harald Welte14105dc2021-05-31 08:48:51 +0200801 class BearerDescription(TLV_IE, tag=0x84):
802 # Bearer descriptionTLV DO as per TS 31.111
803 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100804
Harald Welte14105dc2021-05-31 08:48:51 +0200805 class EF_NCP_IP_Collection(TLV_IE_Collection,
806 nested=[AccessPointName, Login, Password, BearerDescription]):
807 pass
Harald Welte99e4cc02022-07-21 15:25:47 +0200808 def __init__(self, fid='6fe2', sfid=None, name='EF.NCP-IP', rec_len=(None, None),
Harald Welte6169c722022-02-12 09:05:15 +0100809 desc='Network Connectivity Parameters for USIM IP connections', **kwargs):
810 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200811 self._tlv = EF_NCP_IP.EF_NCP_IP_Collection
812
Harald Welte790b2702021-04-11 00:01:35 +0200813# TS 31.102 Section 4.2.91
814class EF_EPSLOCI(TransparentEF):
Harald Welte12721292022-07-21 15:33:06 +0200815 def __init__(self, fid='6fe3', sfid=0x1e, name='EF.EPSLOCI',
816 desc='EPS Location Information', size=(18,18), **kwargs):
Harald Welte6169c722022-02-12 09:05:15 +0100817 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100818 upd_status_constr = Enum(
819 Byte, updated=0, not_updated=1, roaming_not_allowed=2)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200820 self._construct = Struct('guti'/HexAdapter(Bytes(12)),
821 'last_visited_registered_tai'/HexAdapter(Bytes(5)),
Harald Welte790b2702021-04-11 00:01:35 +0200822 'eps_update_status'/upd_status_constr)
823
Harald Welte14105dc2021-05-31 08:48:51 +0200824# TS 31.102 Section 4.2.92
825class EF_EPSNSC(LinFixedEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100826 class KSI_ASME(BER_TLV_IE, tag=0x80):
Harald Welte14105dc2021-05-31 08:48:51 +0200827 _construct = Int8ub
Harald Weltec91085e2022-02-10 18:05:45 +0100828
829 class K_ASME(BER_TLV_IE, tag=0x81):
Harald Welte14105dc2021-05-31 08:48:51 +0200830 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100831
Harald Welte14105dc2021-05-31 08:48:51 +0200832 class UplinkNASCount(BER_TLV_IE, tag=0x82):
833 _construct = Int32ub
Harald Weltec91085e2022-02-10 18:05:45 +0100834
Harald Welte14105dc2021-05-31 08:48:51 +0200835 class DownlinkNASCount(BER_TLV_IE, tag=0x83):
836 _construct = Int32ub
Harald Weltec91085e2022-02-10 18:05:45 +0100837
Harald Welte14105dc2021-05-31 08:48:51 +0200838 class IDofNASAlgorithms(BER_TLV_IE, tag=0x84):
839 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100840
Harald Welte14105dc2021-05-31 08:48:51 +0200841 class EPS_NAS_Security_Context(BER_TLV_IE, tag=0xa0,
Harald Weltec91085e2022-02-10 18:05:45 +0100842 nested=[KSI_ASME, K_ASME, UplinkNASCount, DownlinkNASCount,
843 IDofNASAlgorithms]):
Harald Welte14105dc2021-05-31 08:48:51 +0200844 pass
Harald Welte99e4cc02022-07-21 15:25:47 +0200845 def __init__(self, fid='6fe4', sfid=0x18, name='EF.EPSNSC', rec_len=(54, 128),
Harald Welte6169c722022-02-12 09:05:15 +0100846 desc='EPS NAS Security Context', **kwargs):
847 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200848 self._tlv = EF_EPSNSC.EPS_NAS_Security_Context
849
Harald Welte790b2702021-04-11 00:01:35 +0200850# TS 31.102 Section 4.2.96
851class EF_PWS(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100852 _test_de_encode = [
853 ( '00', { "pws_configuration": { "ignore_pws_in_hplmn_and_equivalent": False,
854 "ignore_pws_in_vplmn": False } } ),
855 ]
Harald Welte13edf302022-07-21 15:19:23 +0200856 def __init__(self, fid='6fec', sfid=None, name='EF.PWS', desc='Public Warning System', size=(1, 1), **kwargs):
Harald Welte6169c722022-02-12 09:05:15 +0100857 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100858 pws_config = FlagsEnum(
859 Byte, ignore_pws_in_hplmn_and_equivalent=1, ignore_pws_in_vplmn=2)
Harald Welte790b2702021-04-11 00:01:35 +0200860 self._construct = Struct('pws_configuration'/pws_config)
861
862# TS 31.102 Section 4.2.101
863class EF_IPS(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200864 def __init__(self, fid='6ff1', sfid=None, name='EF.IPS', rec_len=(4, 4),
Harald Welte6169c722022-02-12 09:05:15 +0100865 desc='IMEI(SV) Pairing Status', **kwargs):
866 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200867 self._construct = Struct('status'/PaddedString(2, 'ascii'),
868 'link_to_ef_ipd'/Int8ub, 'rfu'/Byte)
869
Harald Welte14105dc2021-05-31 08:48:51 +0200870# TS 31.102 Section 4.2.103
871class EF_ePDGId(TransparentEF):
872 class ePDGId(BER_TLV_IE, tag=0x80, nested=[]):
873 _construct = Struct('type_of_ePDG_address'/Enum(Byte, FQDN=0, IPv4=1, IPv6=2),
874 'ePDG_address'/Switch(this.type_of_address,
Harald Weltec91085e2022-02-10 18:05:45 +0100875 {'FQDN': GreedyString("utf8"),
876 'IPv4': HexAdapter(GreedyBytes),
877 'IPv6': HexAdapter(GreedyBytes)}))
878
Harald Welte6169c722022-02-12 09:05:15 +0100879 def __init__(self, fid='6ff3', sfid=None, name='EF.eDPDGId', desc='Home ePDG Identifier', **kwargs):
880 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200881 self._tlv = EF_ePDGId.ePDGId
882
Harald Welte71290072021-04-21 10:58:24 +0200883# TS 31.102 Section 4.2.106
884class EF_FromPreferred(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200885 def __init__(self, fid='6ff7', sfid=None, name='EF.FromPreferred', size=(1, 1),
Harald Welte6169c722022-02-12 09:05:15 +0100886 desc='From Preferred', **kwargs):
887 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte71290072021-04-21 10:58:24 +0200888 self._construct = BitStruct('rfu'/BitsRFU(7), 'from_preferred'/Bit)
889
Harald Weltefc67de22023-05-23 20:29:49 +0200890# TS 31.102 Section 4.2.114
891class EF_eAKA(TransparentEF):
892 def __init__(self, fid='6f01', sfid=None, name='EF.eAKA', size=(1, 1),
893 desc='enhanced AKA support', **kwargs):
894 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
895 self._construct = BitStruct('rfu'/BitsRFU(7), 'enhanced_sqn_calculation_supported'/Bit)
896
Harald Welted90ceb82022-07-17 22:10:58 +0200897
898######################################################################
899# DF.GSM-ACCESS
900######################################################################
901
902class DF_GSM_ACCESS(CardDF):
903 def __init__(self, fid='5F3B', name='DF.GSM-ACCESS', desc='GSM Access', **kwargs):
904 super().__init__(fid=fid, name=name, desc=desc, service=27, **kwargs)
905 files = [
906 EF_Kc(fid='4f20', sfid=0x01, service=27),
907 EF_Kc(fid='4f52', sfid=0x02, name='EF.KcGPRS', desc='GPRS Ciphering key KcGPRS', service=27),
908 EF_CPBCCH(fid='4f63', service=39),
909 EF_InvScan(fid='4f64', service=40),
910 ]
911 self.add_files(files)
912
913
Harald Welte790b2702021-04-11 00:01:35 +0200914######################################################################
915# DF.5GS
916######################################################################
917
918# TS 31.102 Section 4.4.11.2
919class EF_5GS3GPPLOCI(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200920 def __init__(self, fid='4f01', sfid=0x01, name='EF.5GS3GPPLOCI', size=(20, 20),
Harald Welte419bb492022-02-12 21:39:35 +0100921 desc='5S 3GP location information', **kwargs):
922 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100923 upd_status_constr = Enum(
924 Byte, updated=0, not_updated=1, roaming_not_allowed=2)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200925 self._construct = Struct('5g_guti'/HexAdapter(Bytes(13)),
926 'last_visited_registered_tai_in_5gs'/HexAdapter(Bytes(6)),
Harald Welte790b2702021-04-11 00:01:35 +0200927 '5gs_update_status'/upd_status_constr)
928
929# TS 31.102 Section 4.4.11.7
930class EF_UAC_AIC(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100931 _test_de_encode = [
932 ( '03', { "uac_access_id_config": { "multimedia_priority_service": True,
933 "mission_critical_service": True } } ),
934 ]
Harald Welte13edf302022-07-21 15:19:23 +0200935 def __init__(self, fid='4f06', sfid=0x06, name='EF.UAC_AIC', size=(4, 4),
Harald Welte419bb492022-02-12 21:39:35 +0100936 desc='UAC Access Identities Configuration', **kwargs):
937 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200938 cfg_constr = FlagsEnum(Byte, multimedia_priority_service=1,
Harald Weltec91085e2022-02-10 18:05:45 +0100939 mission_critical_service=2)
Harald Welte790b2702021-04-11 00:01:35 +0200940 self._construct = Struct('uac_access_id_config'/cfg_constr)
941
Harald Welte14105dc2021-05-31 08:48:51 +0200942# TS 31.102 Section 4.4.11.9
Harald Welte790b2702021-04-11 00:01:35 +0200943class EF_OPL5G(LinFixedEF):
Harald Welte52064292023-05-24 15:25:26 +0200944 def __init__(self, fid='4f08', sfid=0x08, name='EF.OPL5G', desc='5GS Operator PLMN List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200945 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(10, None), **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200946 Tai = Struct('mcc_mnc'/BcdAdapter(Bytes(3)), 'tac_min'/HexAdapter(Bytes(3)),
947 'tac_max'/HexAdapter(Bytes(3)))
Harald Weltea0377622022-02-25 15:36:44 +0100948 self._construct = Struct('tai'/Tai, 'pnn_record_id'/Int8ub)
Harald Welte790b2702021-04-11 00:01:35 +0200949
Harald Welte14105dc2021-05-31 08:48:51 +0200950# TS 31.102 Section 4.4.11.10
951class EF_SUPI_NAI(TransparentEF):
952 class NetworkSpecificIdentifier(TLV_IE, tag=0x80):
953 # RFC 7542 encoded as UTF-8 string
954 _construct = GreedyString("utf8")
Harald Weltec91085e2022-02-10 18:05:45 +0100955
Harald Welte14105dc2021-05-31 08:48:51 +0200956 class GlobalLineIdentifier(TLV_IE, tag=0x81):
957 # TS 23.003 clause 28.16.2
Harald Welteba6d6ab2023-05-27 13:45:01 +0200958 _construct = GreedyString("utf8")
Harald Weltec91085e2022-02-10 18:05:45 +0100959
Harald Welte14105dc2021-05-31 08:48:51 +0200960 class GlobalCableIdentifier(TLV_IE, tag=0x82):
961 # TS 23.003 clause 28.15.2
Harald Welteba6d6ab2023-05-27 13:45:01 +0200962 _construct = GreedyString("utf8")
Harald Weltec91085e2022-02-10 18:05:45 +0100963
Harald Welte14105dc2021-05-31 08:48:51 +0200964 class NAI_TLV_Collection(TLV_IE_Collection,
Harald Weltec91085e2022-02-10 18:05:45 +0100965 nested=[NetworkSpecificIdentifier, GlobalLineIdentifier, GlobalCableIdentifier]):
Harald Welte14105dc2021-05-31 08:48:51 +0200966 pass
967 def __init__(self, fid='4f09', sfid=0x09, name='EF.SUPI_NAI',
Harald Welte419bb492022-02-12 21:39:35 +0100968 desc='SUPI as Network Access Identifier', **kwargs):
969 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200970 self._tlv = EF_SUPI_NAI.NAI_TLV_Collection
971
Harald Welte455611c2023-05-27 12:48:54 +0200972# TS 31.102 Section 4.4.11.11
973class EF_Routing_Indicator(TransparentEF):
974 def __init__(self, fid='4f0a', sfid=0x0a, name='EF.Routing_Indicator', desc='Routing Indicator', **kwargs):
975 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
976 # 3GPP TS 24.501 Table 9.11.3.4.1:
977 # Routing Indicator shall consist of 1 to 4 digits. The coding of this field is the
978 # responsibility of home network operator but BCD coding shall be used. If a network
979 # operator decides to assign less than 4 digits to Routing Indicator, the remaining digits
980 # shall be coded as "1111" to fill the 4 digits coding of Routing Indicator
Harald Weltef9a5ba52023-06-09 09:17:05 +0200981 self._construct = Struct('routing_indicator'/Rpad(BcdAdapter(Bytes(2)), 'f', 2),
982 'rfu'/HexAdapter(Bytes(2)))
Harald Weltec91085e2022-02-10 18:05:45 +0100983
Harald Weltefc67de22023-05-23 20:29:49 +0200984# TS 31.102 Section 4.4.11.13
Harald Welte14105dc2021-05-31 08:48:51 +0200985class EF_TN3GPPSNN(TransparentEF):
986 class ServingNetworkName(BER_TLV_IE, tag=0x80):
987 _construct = GreedyString("utf8")
988 def __init__(self, fid='4f0c', sfid=0x0c, name='EF.TN3GPPSNN',
Harald Welte419bb492022-02-12 21:39:35 +0100989 desc='Trusted non-3GPP Serving network names list', **kwargs):
990 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200991 self._tlv = EF_TN3GPPSNN.ServingNetworkName
992
Harald Weltefc67de22023-05-23 20:29:49 +0200993# TS 31.102 Section 4.4.11.14 (Rel 17)
994class EF_CAG(TransparentEF):
995 def __init__(self, fid='4f0d', sfid=0x0d, name='EF.CAG',
996 desc='Pre-configured CAG information list EF', **kwargs):
997 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
998 self._construct = HexAdapter(GreedyBytes)
999
1000# TS 31.102 Section 4.4.11.15 (Rel 17)
1001class EF_SOR_CMCI(TransparentEF):
1002 def __init__(self, fid='4f0e', sfid=0x0e, name='EF.SOR-CMCI',
1003 desc='Steering Of Roaming - Connected Mode Control Information', **kwargs):
1004 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1005 self._construct = HexAdapter(GreedyBytes)
1006
1007# TS 31.102 Section 4.4.11.17 (Rel 17)
1008class EF_DRI(TransparentEF):
1009 def __init__(self, fid='4f0f', sfid=0x0f, name='EF.DRI',
1010 desc='Disaster roaming information EF', **kwargs):
1011 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1012 self._construct = Struct('disaster_roaming_enabled'/Byte,
1013 'parameters_indicator_status'/FlagsEnum(Byte, roaming_wait_range=1,
1014 return_wait_range=2,
1015 applicability_indicator=3),
1016 'roaming_wait_range'/HexAdapter(Bytes(2)),
1017 'return_wait_range'/HexAdapter(Bytes(2)),
1018 'applicability_indicator'/HexAdapter(Byte))
1019
1020# TS 31.102 Section 4.4.12.2 (Rel 17)
1021class EF_PWS_SNPN(TransparentEF):
1022 def __init__(self, fid='4f01', sfid=0x01, name='EF.PWS_SNPN',
1023 desc='Public Warning System in SNPNs', **kwargs):
1024 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1025 self._construct = Struct('pws_config_in_snpns'/FlagsEnum(Byte, ignore_all_pws_in_subscribed=1,
1026 ignore_all_pws_in_non_subscribed=2))
1027
1028# TS 31.102 Section 4.4.12.2 (Rel 17)
1029class EF_NID(LinFixedEF):
1030 def __init__(self, fid='4f02', sfid=0x02, name='EF.NID',
1031 desc='Network Identifier for SNPN', **kwargs):
1032 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=(6,6), **kwargs)
1033 self._construct = Struct('assignment_mode'/Enum(Byte, coordinated_ass_opt1=0,
1034 self_ass=1,
1035 coordinated_ass_opt2=2),
1036 'network_identifier'/HexAdapter(Bytes(5)))
1037
1038# TS 31.102 Section 4.4.12 (Rel 17)
1039class DF_SNPN(CardDF):
1040 def __init__(self, fid='5fe0', name='DF.SNPN', desc='Files for SNPN purpose', **kwargs):
1041 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1042 files = [
1043 EF_PWS_SNPN(service=143),
1044 EF_NID(service=146),
1045 ]
1046 self.add_files(files)
1047
1048# TS 31.102 Section 4.4.13.2 (Rel 17)
1049class EF_5G_PROSE_ST(EF_UServiceTable):
1050 def __init__(self, **kwargs):
1051 super().__init__(fid='4f01', sfid=0x01, name='EF.5G_PROSE_ST',
1052 desc='5G ProSe Service Table', size=(1,2), table=EF_5G_PROSE_ST_map, **kwargs)
1053 # add those commands to the general commands of a TransparentEF
1054 self.shell_commands += [self.AddlShellCommands()]
1055
1056 @with_default_category('File-Specific Commands')
1057 class AddlShellCommands(CommandSet):
1058 def __init__(self):
1059 super().__init__()
1060
1061 def do_prose_service_activate(self, arg):
1062 """Activate a service within EF.5G_PROSE_ST"""
1063 self._cmd.card.update_ust(int(arg), 1)
1064
1065 def do_prose_service_deactivate(self, arg):
1066 """Deactivate a service within EF.5G_PROSE_ST"""
1067 self._cmd.card.update_ust(int(arg), 0)
1068
1069# TS 31.102 Section 4.4.13.3 (Rel 17)
1070class EF_5G_PROSE_DD(TransparentEF):
1071 class ServedByNgRan(BER_TLV_IE, tag=0x80):
1072 pass
1073 class NotServedByNgran(BER_TLV_IE, tag=0x81):
1074 pass
1075 class ProSeIdentifiers(BER_TLV_IE, tag=0x82):
1076 pass
1077 class ProSeIdToDefaultDestL2Id(BER_TLV_IE, tag=0x83):
1078 pass
1079 class GroupMemberDiscoveryParameters(BER_TLV_IE, tag=0x84):
1080 pass
1081 class ValidityTimer(BER_TLV_IE, tag=0x85):
1082 pass
1083 class ProSeDirectDiscoveryUeId(BER_TLV_IE, tag=0x86):
1084 pass
1085 class Hplmn5GDdnmfAddressInformation(BER_TLV_IE, tag=0x87):
1086 pass
1087 class ProSeConfigForDirectDiscovery(BER_TLV_IE, tag=0xA0,
1088 nested=[ServedByNgRan, NotServedByNgran, ProSeIdentifiers,
1089 ProSeIdToDefaultDestL2Id, GroupMemberDiscoveryParameters,
1090 ValidityTimer, ProSeDirectDiscoveryUeId,
1091 Hplmn5GDdnmfAddressInformation]):
1092 pass
1093 def __init__(self, fid='4f02', sfid=0x02, name='EF.5G_PROSE_DD',
1094 desc='5G ProSe configuration data for direct discovery', **kwargs):
1095 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1096 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1097 self._tlv = EF_5G_PROSE_DD.ProSeConfigForDirectDiscovery
1098
1099# TS 31.102 Section 4.4.13.4 (Rel 17)
1100class EF_5G_PROSE_DC(TransparentEF):
1101 class PrivacyConfig(BER_TLV_IE, tag=0x87):
1102 pass
1103 class DirectCommInNrPc5(BER_TLV_IE, tag=0x88):
1104 pass
1105 class ApplicationToPathPreferenceMappingRules(BER_TLV_IE, tag=0x89):
1106 pass
1107 class ProSeIdToNrTxProfileForBroadcastAndGroupcastMappingRules(BER_TLV_IE, tag=0x91):
1108 pass
1109 class ProSeConfigForDirectCommunication(BER_TLV_IE, tag=0xA0,
1110 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1111 EF_5G_PROSE_DD.NotServedByNgran,
1112 PrivacyConfig, DirectCommInNrPc5,
1113 ApplicationToPathPreferenceMappingRules,
1114 EF_5G_PROSE_DD.ValidityTimer,
1115 ProSeIdToNrTxProfileForBroadcastAndGroupcastMappingRules]):
1116 pass
1117 def __init__(self, fid='4f03', sfid=0x03, name='EF.5G_PROSE_DC',
1118 desc='5G ProSe configuration data for direct communication', **kwargs):
1119 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1120 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1121 self._tlv = EF_5G_PROSE_DC.ProSeConfigForDirectCommunication
1122
1123# TS 31.102 Section 4.4.13.5 (Rel 17)
1124class EF_5G_PROSE_U2NRU(TransparentEF):
1125 class ProSeIdToDefaultDestL2Id(BER_TLV_IE, tag=0x8a):
1126 pass
1127 class RxcInfoList(BER_TLV_IE, tag=0x8b):
1128 pass
1129 class FiveQiToPc65QosParametersMappingRules(BER_TLV_IE, tag=0x8c):
1130 pass
1131 class ProSeIdToAppSrvAddrMappingRules(BER_TLV_IE, tag=0x8d):
1132 pass
1133 class UserInfoIdForDiscovery(BER_TLV_IE, tag=0x8e):
1134 pass
1135 class PrivacyTimer(BER_TLV_IE, tag=0x92):
1136 pass
1137 class FiveGPkkmfAddressInformation(BER_TLV_IE, tag=0x93):
1138 pass
1139 class ProSeConfigDataForUeToNetworkRelayUe(BER_TLV_IE, tag=0xA0,
1140 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1141 EF_5G_PROSE_DD.NotServedByNgran,
1142 ProSeIdToDefaultDestL2Id,
1143 RxcInfoList,
1144 FiveQiToPc65QosParametersMappingRules,
1145 ProSeIdToAppSrvAddrMappingRules,
1146 EF_5G_PROSE_DD.ValidityTimer,
1147 UserInfoIdForDiscovery,
1148 PrivacyTimer,
1149 FiveGPkkmfAddressInformation]):
1150 pass
1151 def __init__(self, fid='4f04', sfid=0x04, name='EF.5G_PROSE_U2NRU',
1152 desc='5G ProSe configuration data for UE-to-network relay UE', **kwargs):
1153 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1154 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1155 self._tlv = EF_5G_PROSE_U2NRU.ProSeConfigDataForUeToNetworkRelayUe
1156
1157# TS 31.102 Section 4.4.13.6 (Rel 17)
1158class EF_5G_PROSE_RU(TransparentEF):
1159 class DefaultDestL2Ids(BER_TLV_IE, tag=0x8f):
1160 pass
1161 class N3IwfSelectionInfoFor5GProSeL3RemoteUE(BER_TLV_IE, tag=0x90):
1162 pass
1163 class ProSeConfigDataForRemoteUe(BER_TLV_IE, tag=0xa0,
1164 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1165 EF_5G_PROSE_DD.NotServedByNgran,
1166 DefaultDestL2Ids,
1167 EF_5G_PROSE_U2NRU.RxcInfoList,
1168 N3IwfSelectionInfoFor5GProSeL3RemoteUE,
1169 EF_5G_PROSE_DD.ValidityTimer,
1170 EF_5G_PROSE_U2NRU.UserInfoIdForDiscovery,
1171 EF_5G_PROSE_U2NRU.PrivacyTimer,
1172 EF_5G_PROSE_U2NRU.FiveGPkkmfAddressInformation]):
1173 pass
1174 def __init__(self, fid='4f05', sfid=0x05, name='EF.5G_PROSE_RU',
1175 desc='5G ProSe configuration data for remote UE', **kwargs):
1176 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1177 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1178 self._tlv = EF_5G_PROSE_RU.ProSeConfigDataForRemoteUe
1179
1180# TS 31.102 Section 4.4.13.7 (Rel 17)
1181class EF_5G_PROSE_UIR(TransparentEF):
1182 class CollectionPeriod(BER_TLV_IE, tag=0x94):
1183 pass
1184 class ReportingWindow(BER_TLV_IE, tag=0x95):
1185 pass
1186 class ReportingIndicators(BER_TLV_IE, tag=0x96):
1187 pass
1188 class FiveGDdnmfCtfAddrForUploading(BER_TLV_IE, tag=0x97):
1189 pass
1190 class ProSeConfigDataForUeToNetworkRelayUE(BER_TLV_IE, tag=0xa0,
1191 nested=[EF_5G_PROSE_DD.ValidityTimer,
1192 CollectionPeriod, ReportingWindow,
1193 ReportingIndicators,
1194 FiveGDdnmfCtfAddrForUploading]):
1195 pass
1196 def __init__(self, fid='4f06', sfid=0x06, name='EF.5G_PROSE_UIR',
1197 desc='5G ProSe configuration data for usage information reporting', **kwargs):
1198 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1199 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1200 self._tlv = EF_5G_PROSE_UIR.ProSeConfigDataForUeToNetworkRelayUE
1201
1202# TS 31.102 Section 4.4.13 (Rel 17)
1203class DF_5G_ProSe(CardDF):
1204 def __init__(self, fid='5ff0', name='DF.5G_ProSe', desc='Files for 5G ProSe purpose', **kwargs):
1205 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1206 files = [
1207 EF_5G_PROSE_ST(),
1208 EF_5G_PROSE_DD(service=1),
1209 EF_5G_PROSE_DC(service=2),
1210 EF_5G_PROSE_U2NRU(service=3),
1211 EF_5G_PROSE_RU(service=4),
1212 EF_5G_PROSE_UIR(service=5),
1213 ]
1214 self.add_files(files)
1215
1216# TS 31.102 Section 4.4.11.18 (Rel 17)
1217class EF_5GSEDRX(TransparentEF):
1218 def __init__(self, fid='4f10', sfid=0x10, name='EF.5GSEDRX',
1219 desc='5GS eDRX Parameters', **kwargs):
1220 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1221 self._construct = Struct('5gs_rat_type'/FlagsEnum(Byte, ng_ran=1, sat_ng_ran=2),
1222 'edrx_cycle_length'/Int8ub)
1223
1224# TS 31.102 Section 4.4.11.19 (Rel 17)
1225class EF_5GNSWO_CONF(TransparentEF):
1226 def __init__(self, fid='4f11', sfid=0x11, name='EF.5GNSWO_CONF',
1227 desc='5G Non-Seamless WLAN Offload configuration', **kwargs):
1228 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1229 self._construct = Struct('5g_nswo_usage_ind'/Enum(Byte, disabled=0, enabled=1))
1230
1231# TS 31.102 Section 4.4.11.20 (Rel 17)
1232class EF_MCHPPLMN(TransparentEF):
Harald Welte24e77a72023-05-24 15:26:29 +02001233 def __init__(self, fid='4f15', sfid=0x15, name='EF.MCHPPLMN',
Harald Weltefc67de22023-05-23 20:29:49 +02001234 desc='Multiplier Coefficient for Higher Priority PLMN search', **kwargs):
1235 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1236 self._construct = Struct('multiplier_coefficient'/Int8ub)
1237
1238# TS 31.102 Section 4.4.11.21 (Rel 17)
1239class EF_KAUSF_DERIVATION(TransparentEF):
1240 def __init__(self, fid='4f16', sfid=0x16, name='EF.KAUSF_DERIVATION',
1241 desc='K_AUSF derivation configuration', **kwargs):
1242 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1243 self._construct = Struct('k_ausf_deriv_cfg'/FlagsEnum(Byte, use_msk=1), 'rfu'/HexAdapter(GreedyBytes))
1244
Harald Welte3990ebb2021-04-20 23:55:14 +02001245# TS 31.102 Section 4.4.5
1246class DF_WLAN(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001247 def __init__(self, fid='5f40', name='DF.WLAN', desc='Files for WLAN purpose', **kwargs):
1248 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001249 files = [
Harald Welte419bb492022-02-12 21:39:35 +01001250 TransparentEF('4f41', 0x01, 'EF.Pseudo', 'Pseudonym', service=59),
Harald Weltec91085e2022-02-10 18:05:45 +01001251 TransparentEF('4f42', 0x02, 'EF.UPLMNWLAN',
Harald Welte419bb492022-02-12 21:39:35 +01001252 'User controlled PLMN selector for I-WLAN Access', service=60),
Harald Weltec91085e2022-02-10 18:05:45 +01001253 TransparentEF('4f43', 0x03, 'EF.OPLMNWLAN',
Harald Welte419bb492022-02-12 21:39:35 +01001254 'Operator controlled PLMN selector for I-WLAN Access', service=61),
Harald Weltec91085e2022-02-10 18:05:45 +01001255 LinFixedEF('4f44', 0x04, 'EF.UWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001256 'User controlled WLAN Specific Identifier List', service=62),
Harald Weltec91085e2022-02-10 18:05:45 +01001257 LinFixedEF('4f45', 0x05, 'EF.OWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001258 'Operator controlled WLAN Specific Identifier List', service=63),
Harald Weltec91085e2022-02-10 18:05:45 +01001259 TransparentEF('4f46', 0x06, 'EF.WRI',
Harald Welte419bb492022-02-12 21:39:35 +01001260 'WLAN Reauthentication Identity', service=66),
Harald Weltec91085e2022-02-10 18:05:45 +01001261 LinFixedEF('4f47', 0x07, 'EF.HWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001262 'Home I-WLAN Specific Identifier List', service=81),
Harald Weltec91085e2022-02-10 18:05:45 +01001263 TransparentEF('4f48', 0x08, 'EF.WEHPLMNPI',
Harald Welte419bb492022-02-12 21:39:35 +01001264 'I-WLAN Equivalent HPLMN Presentation Indication', service=82),
Harald Weltec91085e2022-02-10 18:05:45 +01001265 TransparentEF('4f49', 0x09, 'EF.WHPI',
Harald Welte419bb492022-02-12 21:39:35 +01001266 'I-WLAN HPLMN Priority Indication', service=83),
Harald Weltec91085e2022-02-10 18:05:45 +01001267 TransparentEF('4f4a', 0x0a, 'EF.WLRPLMN',
Harald Welte419bb492022-02-12 21:39:35 +01001268 'I-WLAN Last Registered PLMN', service=84),
Harald Weltec91085e2022-02-10 18:05:45 +01001269 TransparentEF('4f4b', 0x0b, 'EF.HPLMNDAI',
Harald Welte419bb492022-02-12 21:39:35 +01001270 'HPLMN Direct Access Indicator', service=88),
Harald Weltec91085e2022-02-10 18:05:45 +01001271 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001272 self.add_files(files)
1273
1274# TS 31.102 Section 4.4.6
1275class DF_HNB(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001276 def __init__(self, fid='5f50', name='DF.HNB', desc='Files for HomeNodeB purpose', **kwargs):
1277 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001278 files = [
Harald Welteeb882052022-07-17 21:13:57 +02001279 LinFixedEF('4f81', 0x01, 'EF.ACSGL', 'Allowed CSG Lists', service=86),
1280 LinFixedEF('4f82', 0x02, 'EF.CSGTL', 'CSG Types', service=86),
1281 LinFixedEF('4f83', 0x03, 'EF.HNBN', 'Home NodeB Name', service=86),
1282 LinFixedEF('4f84', 0x04, 'EF.OCSGL', 'Operator CSG Lists', service=90),
1283 LinFixedEF('4f85', 0x05, 'EF.OCSGT', 'Operator CSG Type', service=90),
1284 LinFixedEF('4f86', 0x06, 'EF.OHNBN', 'Operator Home NodeB Name', service=90),
Harald Weltec91085e2022-02-10 18:05:45 +01001285 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001286 self.add_files(files)
1287
1288# TS 31.102 Section 4.4.8
1289class DF_ProSe(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001290 def __init__(self, fid='5f90', name='DF.ProSe', desc='Files for ProSe purpose', **kwargs):
1291 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001292 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001293 LinFixedEF('4f01', 0x01, 'EF.PROSE_MON',
1294 'ProSe Monitoring Parameters'),
1295 LinFixedEF('4f02', 0x02, 'EF.PROSE_ANN',
1296 'ProSe Announcing Parameters'),
Harald Welte3990ebb2021-04-20 23:55:14 +02001297 LinFixedEF('4f03', 0x03, 'EF.PROSEFUNC', 'HPLMN ProSe Function'),
Harald Weltec91085e2022-02-10 18:05:45 +01001298 TransparentEF('4f04', 0x04, 'EF.PROSE_RADIO_COM',
1299 'ProSe Direct Communication Radio Parameters'),
1300 TransparentEF('4f05', 0x05, 'EF.PROSE_RADIO_MON',
1301 'ProSe Direct Discovery Monitoring Radio Parameters'),
1302 TransparentEF('4f06', 0x06, 'EF.PROSE_RADIO_ANN',
1303 'ProSe Direct Discovery Announcing Radio Parameters'),
1304 LinFixedEF('4f07', 0x07, 'EF.PROSE_POLICY',
1305 'ProSe Policy Parameters'),
Harald Welte3990ebb2021-04-20 23:55:14 +02001306 LinFixedEF('4f08', 0x08, 'EF.PROSE_PLMN', 'ProSe PLMN Parameters'),
1307 TransparentEF('4f09', 0x09, 'EF.PROSE_GC', 'ProSe Group Counter'),
1308 TransparentEF('4f10', 0x10, 'EF.PST', 'ProSe Service Table'),
Harald Weltec91085e2022-02-10 18:05:45 +01001309 TransparentEF('4f11', 0x11, 'EF.UIRC',
1310 'ProSe UsageInformationReportingConfiguration'),
1311 LinFixedEF('4f12', 0x12, 'EF.PROSE_GM_DISCOVERY',
1312 'ProSe Group Member Discovery Parameters'),
1313 LinFixedEF('4f13', 0x13, 'EF.PROSE_RELAY',
1314 'ProSe Relay Parameters'),
1315 TransparentEF('4f14', 0x14, 'EF.PROSE_RELAY_DISCOVERY',
1316 'ProSe Relay Discovery Parameters'),
1317 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001318 self.add_files(files)
1319
Harald Weltec91085e2022-02-10 18:05:45 +01001320
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001321class DF_USIM_5GS(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001322 def __init__(self, fid='5FC0', name='DF.5GS', desc='5GS related files', **kwargs):
1323 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001324 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001325 # I'm looking at 31.102 R16.6
Harald Welte419bb492022-02-12 21:39:35 +01001326 EF_5GS3GPPLOCI(service=122),
Harald Weltec91085e2022-02-10 18:05:45 +01001327 EF_5GS3GPPLOCI('4f02', 0x02, 'EF.5GSN3GPPLOCI',
Harald Welte419bb492022-02-12 21:39:35 +01001328 '5GS non-3GPP location information', service=122),
1329 EF_5GS3GPPNSC(service=122),
Harald Weltec91085e2022-02-10 18:05:45 +01001330 EF_5GS3GPPNSC('4f04', 0x04, 'EF.5GSN3GPPNSC',
Harald Welte419bb492022-02-12 21:39:35 +01001331 '5GS non-3GPP Access NAS Security Context', service=122),
1332 EF_5GAUTHKEYS(service=123),
1333 EF_UAC_AIC(service=126),
1334 EF_SUCI_Calc_Info(service=124),
1335 EF_OPL5G(service=129),
1336 EF_SUPI_NAI(service=130),
Harald Welte455611c2023-05-27 12:48:54 +02001337 EF_Routing_Indicator(service=124),
Harald Weltec91085e2022-02-10 18:05:45 +01001338 TransparentEF('4F0B', 0x0b, 'EF.URSP',
Harald Welte419bb492022-02-12 21:39:35 +01001339 'UE Route Selector Policies per PLMN', service=132),
1340 EF_TN3GPPSNN(service=133),
Harald Weltefc67de22023-05-23 20:29:49 +02001341 # Rel-17 additions below
1342 EF_CAG(service=137),
1343 EF_SOR_CMCI(service=138),
1344 EF_DRI(service=140),
1345 EF_5GSEDRX(service=141),
1346 EF_5GNSWO_CONF(service=142),
1347 EF_MCHPPLMN(service=144),
1348 EF_KAUSF_DERIVATION(service=145),
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001349 ]
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001350 self.add_files(files)
1351
Harald Weltec91085e2022-02-10 18:05:45 +01001352
Harald Welte2bee70c2023-05-25 09:14:28 +02001353class DF_SAIP(CardDF):
1354 """This is not really TS 31.102 but part of the eUICC Profile Package: Interoperable Format Technical
1355 Specification as released by TCA (formerly SIMalliance)"""
1356 def __init__(self, fid='5FD0', name='DF.SAIP', desc='SIMalliance Interoperable Profile', **kwargs):
1357 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1358 files = [
1359 # uses the same file format as DF.5GS/EF_SUCI_Calc_Info, but different FID
1360 EF_SUCI_Calc_Info(fid='4f01')
1361 ]
1362 self.add_files(files)
1363
1364
Harald Welteb2edd142021-01-08 23:29:35 +01001365class ADF_USIM(CardADF):
1366 def __init__(self, aid='a0000000871002', name='ADF.USIM', fid=None, sfid=None,
1367 desc='USIM Application'):
1368 super().__init__(aid=aid, fid=fid, sfid=sfid, name=name, desc=desc)
Harald Welte15fae982021-04-10 10:22:27 +02001369 # add those commands to the general commands of a TransparentEF
1370 self.shell_commands += [self.AddlShellCommands()]
Harald Welteb2edd142021-01-08 23:29:35 +01001371
1372 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001373 EF_LI(sfid=0x02),
1374 EF_IMSI(sfid=0x07),
1375 EF_Keys(),
1376 EF_Keys('6f09', 0x09, 'EF.KeysPS',
1377 desc='Ciphering and Integrity Keys for PS domain'),
1378 EF_xPLMNwAcT('6f60', 0x0a, 'EF.PLMNwAcT',
Harald Welte6169c722022-02-12 09:05:15 +01001379 'User controlled PLMN Selector with Access Technology', service=20),
Harald Weltec91085e2022-02-10 18:05:45 +01001380 EF_HPPLMN(),
Harald Welte6169c722022-02-12 09:05:15 +01001381 EF_ACMmax(service=13),
Harald Welte6ca2fa72022-02-12 16:29:31 +01001382 EF_UST(),
Harald Weltec91085e2022-02-10 18:05:45 +01001383 CyclicEF('6f39', None, 'EF.ACM',
Harald Welte99e4cc02022-07-21 15:25:47 +02001384 'Accumulated call meter', rec_len=(3, 3), service=13),
Harald Welte6169c722022-02-12 09:05:15 +01001385 TransparentEF('6f3e', None, 'EF.GID1', 'Group Identifier Level 1', service=17),
1386 TransparentEF('6f3f', None, 'EF.GID2', 'Group Identifier Level 2', service=18),
1387 EF_SPN(service=19),
Harald Weltec91085e2022-02-10 18:05:45 +01001388 TransparentEF('6f41', None, 'EF.PUCT',
Harald Welte13edf302022-07-21 15:19:23 +02001389 'Price per unit and currency table', size=(5, 5), service=13),
Harald Welte6169c722022-02-12 09:05:15 +01001390 EF_CBMI(service=15),
Harald Weltec91085e2022-02-10 18:05:45 +01001391 EF_ACC(sfid=0x06),
1392 EF_PLMNsel('6f7b', 0x0d, 'EF.FPLMN',
Harald Welte13edf302022-07-21 15:19:23 +02001393 'Forbidden PLMNs', size=(12, None)),
Harald Weltec91085e2022-02-10 18:05:45 +01001394 EF_LOCI(),
1395 EF_AD(),
Harald Welte6169c722022-02-12 09:05:15 +01001396 EF_CBMID(sfid=0x0e, service=29),
Harald Weltec91085e2022-02-10 18:05:45 +01001397 EF_ECC(),
Harald Welte6169c722022-02-12 09:05:15 +01001398 EF_CBMIR(service=16),
Harald Weltec91085e2022-02-10 18:05:45 +01001399 EF_PSLOCI(),
Harald Welte0dc6c202023-01-24 18:10:13 +01001400 EF_ADN('6f3b', None, 'EF.FDN', 'Fixed Dialling Numbers', service=[2, 89], ext=2),
Harald Welte6169c722022-02-12 09:05:15 +01001401 EF_SMS('6f3c', None, service=10),
1402 EF_MSISDN(service=21),
1403 EF_SMSP(service=12),
1404 EF_SMSS(service=10),
Harald Welte0dc6c202023-01-24 18:10:13 +01001405 EF_ADN('6f49', None, 'EF.SDN', 'Service Dialling Numbers', service=[4, 89], ext=3),
Harald Welte6169c722022-02-12 09:05:15 +01001406 EF_EXT('6f4b', None, 'EF.EXT2', 'Extension2 (FDN)', service=3),
1407 EF_EXT('6f4c', None, 'EF.EXT3', 'Extension2 (SDN)', service=5),
1408 EF_SMSR(service=11),
1409 EF_ICI(service=9),
1410 EF_OCI(service=8),
1411 EF_ICT(service=9),
1412 EF_ICT('6f83', None, 'EF.OCT', 'Outgoing Call Timer', service=8),
1413 EF_EXT('6f4e', None, 'EF.EXT5', 'Extension5 (ICI/OCI/MSISDN)', service=44),
1414 EF_CCP2(service=14),
1415 EF_eMLPP(service=24),
1416 EF_AAeM(service=25),
Harald Weltec91085e2022-02-10 18:05:45 +01001417 # EF_Hiddenkey
Harald Welte0dc6c202023-01-24 18:10:13 +01001418 EF_ADN('6f4d', None, 'EF.BDN', 'Barred Dialling Numbers', service=6, ext=4),
Harald Welte6169c722022-02-12 09:05:15 +01001419 EF_EXT('6f55', None, 'EF.EXT4', 'Extension4 (BDN/SSC)', service=7),
1420 EF_CMI(service=6),
Harald Welte6ca2fa72022-02-12 16:29:31 +01001421 EF_EST(service=[2, 6, 34, 35]),
Harald Welte6169c722022-02-12 09:05:15 +01001422 EF_ACL(service=35),
1423 EF_DCK(service=36),
1424 EF_CNL(service=37),
Harald Weltec91085e2022-02-10 18:05:45 +01001425 EF_START_HFN(),
1426 EF_THRESHOLD(),
Harald Welte6169c722022-02-12 09:05:15 +01001427 EF_xPLMNwAcT('6f61', 0x11, 'EF.OPLMNwAcT', 'User controlled PLMN Selector with Access Technology', service=42),
1428 EF_xPLMNwAcT('6f62', 0x13, 'EF.HPLMNwAcT', 'HPLMN Selector with Access Technology', service=43),
Harald Weltec91085e2022-02-10 18:05:45 +01001429 EF_ARR('6f06', 0x17),
Harald Welte363edd92022-07-17 22:24:03 +02001430 EF_RPLMNAcT(),
Harald Weltec91085e2022-02-10 18:05:45 +01001431 TransparentEF('6fc4', None, 'EF.NETPAR', 'Network Parameters'),
Harald Welte6169c722022-02-12 09:05:15 +01001432 EF_PNN('6fc5', 0x19, service=45),
1433 EF_OPL(service=46),
Harald Welte0dc6c202023-01-24 18:10:13 +01001434 EF_ADN('6fc7', None, 'EF.MBDN', 'Mailbox Dialling Numbers', service=47, ext=6),
Harald Welte6169c722022-02-12 09:05:15 +01001435 EF_EXT('6fc8', None, 'EF.EXT6', 'Extension6 (MBDN)'),
1436 EF_MBI(service=47),
1437 EF_MWIS(service=48),
Harald Welte0dc6c202023-01-24 18:10:13 +01001438 EF_ADN('6fcb', None, 'EF.CFIS', 'Call Forwarding Indication Status', service=49, ext=7),
Harald Weltec91085e2022-02-10 18:05:45 +01001439 EF_EXT('6fcc', None, 'EF.EXT7', 'Extension7 (CFIS)'),
Harald Welte6169c722022-02-12 09:05:15 +01001440 TransparentEF('6fcd', None, 'EF.SPDI', 'Service Provider Display Information', service=51),
1441 EF_MMSN(service=52),
1442 EF_EXT('6fcf', None, 'EF.EXT8', 'Extension8 (MMSN)', service=53),
1443 EF_MMSICP(service=52),
1444 EF_MMSUP(service=52),
1445 EF_MMSUCP(service=(52, 55)),
Harald Welte04bd5142023-05-24 15:23:53 +02001446 EF_NIA(service=56, fid='6fd3'),
Harald Welte6169c722022-02-12 09:05:15 +01001447 EF_VGCS(service=57),
1448 EF_VGCSS(service=57),
1449 EF_VGCS('6fb3', None, 'EF.VBS', 'Voice Broadcast Service', service=58),
1450 EF_VGCSS('6fb4', None, 'EF.VBSS', 'Voice Broadcast Service Status', service=58),
1451 EF_VGCSCA(service=64),
1452 EF_VGCSCA('6fd5', None, 'EF.VBCSCA', 'Voice Broadcast Service Ciphering Algorithm', service=65),
1453 EF_GBABP(service=68),
1454 EF_MSK(service=69),
1455 EF_MUK(service=69),
1456 EF_GBANL(service=68),
Harald Welte13edf302022-07-21 15:19:23 +02001457 EF_PLMNsel('6fd9', 0x1d, 'EF.EHPLMN', 'Equivalent HPLMN', size=(12, None), service=71),
Harald Welte6169c722022-02-12 09:05:15 +01001458 EF_EHPLMNPI(service=(71, 73)),
1459 # EF_LRPLMNSI ('6fdc', service=74)
1460 EF_NAFKCA(service=(68, 76)),
1461 TransparentEF('6fde', None, 'EF.SPNI', 'Service Provider Name Icon', service=78),
1462 LinFixedEF('6fdf', None, 'EF.PNNI', 'PLMN Network Name Icon', service=79),
1463 EF_NCP_IP(service=80),
1464 EF_EPSLOCI('6fe3', 0x1e, 'EF.EPSLOCI', 'EPS location information', service=85),
1465 EF_EPSNSC(service=85),
Harald Welte13edf302022-07-21 15:19:23 +02001466 TransparentEF('6fe6', None, 'EF.UFC', 'USAT Facility Control', size=(1, 16)),
Harald Welte6169c722022-02-12 09:05:15 +01001467 TransparentEF('6fe8', None, 'EF.NASCONFIG', 'Non Access Stratum Configuration', service=96),
1468 # UICC IARI (only in cards that have no ISIM) service=95
1469 EF_PWS(service=97),
1470 LinFixedEF('6fed', None, 'EF.FDNURI', 'Fixed Dialling Numbers URI', service=(2, 99)),
1471 LinFixedEF('6fee', None, 'EF.BDNURI', 'Barred Dialling Numbers URI', service=(6, 99)),
1472 LinFixedEF('6fef', None, 'EF.SDNURI', 'Service Dialling Numbers URI', service=(4, 99)),
1473 # EF_IWL (IMEI(SV) White List)
Harald Weltec91085e2022-02-10 18:05:45 +01001474 EF_IPS(),
Harald Welte6169c722022-02-12 09:05:15 +01001475 EF_ePDGId(service=(106, 107)),
Harald Weltec91085e2022-02-10 18:05:45 +01001476 # FIXME: from EF_ePDGSelection onwards
Harald Welte6169c722022-02-12 09:05:15 +01001477 EF_FromPreferred(service=114),
Harald Weltefc67de22023-05-23 20:29:49 +02001478 EF_eAKA(),
Harald Welte6169c722022-02-12 09:05:15 +01001479 # FIXME: DF_SoLSA service=23
Harald Weltede4c14c2022-07-16 11:53:59 +02001480 DF_PHONEBOOK(),
Harald Welted90ceb82022-07-17 22:10:58 +02001481 DF_GSM_ACCESS(),
Harald Welte6169c722022-02-12 09:05:15 +01001482 DF_WLAN(service=[59, 60, 61, 62, 63, 66, 81, 82, 83, 84, 88]),
1483 DF_HNB(service=[86, 90]),
1484 DF_ProSe(service=101),
1485 # FIXME: DF_ACDC service=108
1486 # FIXME: DF_TV service=116
1487 DF_USIM_5GS(service=[122, 123, 124, 125, 126, 127, 129, 130]),
Harald Weltefc67de22023-05-23 20:29:49 +02001488 DF_SNPN(service=[143,146]),
1489 DF_5G_ProSe(service=139),
Harald Welte2bee70c2023-05-25 09:14:28 +02001490 DF_SAIP(),
Harald Weltec91085e2022-02-10 18:05:45 +01001491 ]
Harald Welteb2edd142021-01-08 23:29:35 +01001492 self.add_files(files)
1493
1494 def decode_select_response(self, data_hex):
Philipp Maier5998a3a2021-11-16 15:16:39 +01001495 return pySim.ts_102_221.CardProfileUICC.decode_select_response(data_hex)
Harald Welteb2edd142021-01-08 23:29:35 +01001496
Harald Welte15fae982021-04-10 10:22:27 +02001497 @with_default_category('Application-Specific Commands')
1498 class AddlShellCommands(CommandSet):
1499 def __init__(self):
1500 super().__init__()
1501
1502 authenticate_parser = argparse.ArgumentParser()
1503 authenticate_parser.add_argument('rand', help='Random challenge')
1504 authenticate_parser.add_argument('autn', help='Authentication Nonce')
1505 #authenticate_parser.add_argument('--context', help='Authentication context', default='3G')
Harald Weltec91085e2022-02-10 18:05:45 +01001506
Harald Welte15fae982021-04-10 10:22:27 +02001507 @cmd2.with_argparser(authenticate_parser)
1508 def do_authenticate(self, opts):
1509 """Perform Authentication and Key Agreement (AKA)."""
1510 (data, sw) = self._cmd.card._scc.authenticate(opts.rand, opts.autn)
1511 self._cmd.poutput_json(data)
1512
Harald Welte12af7932022-02-15 16:39:08 +01001513 term_prof_parser = argparse.ArgumentParser()
1514 term_prof_parser.add_argument('PROFILE', help='Hexstring of encoded terminal profile')
1515
1516 @cmd2.with_argparser(term_prof_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001517 def do_terminal_profile(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001518 """Send a TERMINAL PROFILE command to the card.
1519 This is used to inform the card about which optional
1520 features the terminal (modem/phone) supports, particularly
1521 in the context of SIM Toolkit, Proactive SIM and OTA. You
1522 must specify a hex-string with the encoded terminal profile
1523 you want to send to the card."""
Harald Welte51b3abb2022-07-30 16:30:33 +02001524 (data, sw) = self._cmd.card._scc.terminal_profile(opts.PROFILE)
Harald Welte846a8982021-10-08 15:47:16 +02001525 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
Harald Welte15fae982021-04-10 10:22:27 +02001526
Harald Welte12af7932022-02-15 16:39:08 +01001527 envelope_parser = argparse.ArgumentParser()
1528 envelope_parser.add_argument('PAYLOAD', help='Hexstring of encoded payload to ENVELOPE')
1529
1530 @cmd2.with_argparser(envelope_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001531 def do_envelope(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001532 """Send an ENVELOPE command to the card. This is how a
1533 variety of information is communicated from the terminal
1534 (modem/phone) to the card, particularly in the context of
1535 SIM Toolkit, Proactive SIM and OTA."""
Harald Welte51b3abb2022-07-30 16:30:33 +02001536 (data, sw) = self._cmd.card._scc.envelope(opts.PAYLOAD)
Harald Welte7cb94e42021-10-08 15:47:57 +02001537 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
1538
Harald Welte12af7932022-02-15 16:39:08 +01001539 envelope_sms_parser = argparse.ArgumentParser()
1540 envelope_sms_parser.add_argument('TPDU', help='Hexstring of encoded SMS TPDU')
1541
1542 @cmd2.with_argparser(envelope_sms_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001543 def do_envelope_sms(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001544 """Send an ENVELOPE(SMS-PP-Download) command to the card.
1545 This emulates a terminal (modem/phone) having received a SMS
1546 with a PID of 'SMS for the SIM card'. You can use this
1547 command in the context of testing OTA related features
Philipp Maier4e5aa302023-06-06 19:22:19 +02001548 without a modem/phone or a cellular network."""
Harald Welte7cb94e42021-10-08 15:47:57 +02001549 tpdu_ie = SMS_TPDU()
Harald Welte51b3abb2022-07-30 16:30:33 +02001550 tpdu_ie.from_bytes(h2b(opts.TPDU))
Harald Weltec91085e2022-02-10 18:05:45 +01001551 dev_ids = DeviceIdentities(
1552 decoded={'source_dev_id': 'network', 'dest_dev_id': 'uicc'})
Harald Welte7cb94e42021-10-08 15:47:57 +02001553 sms_dl = SMSPPDownload(children=[dev_ids, tpdu_ie])
1554 (data, sw) = self._cmd.card._scc.envelope(b2h(sms_dl.to_tlv()))
1555 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
1556
Harald Welte7ec82232023-06-06 18:15:52 +02001557 get_id_parser = argparse.ArgumentParser()
1558 get_id_parser.add_argument("--nswo-context", action='store_true')
1559
1560 @cmd2.with_argparser(get_id_parser)
1561 def do_get_identity(self, opts):
1562 """Send a GET IDENTITY command to the card. This is part of the
1563 procedure for "SUCI calculation performed on USIM" supported
1564 by USIM with support for both EF.UST service 124 and 125."""
1565 context = 0x01 # SUCI
1566 if opts.nswo_context:
1567 context = 0x02 # SUCI 5G NSWO
1568 (data, sw) = self._cmd.card._scc.get_identity(context)
1569 do = SUCI_TlvDataObject()
1570 do.from_tlv(h2b(data))
1571 do_d = do.to_dict()
1572 self._cmd.poutput('SUCI TLV Data Object: %s' % do_d['suci__tlv_data_object'])
1573
Harald Welte15fae982021-04-10 10:22:27 +02001574
Harald Welteb2edd142021-01-08 23:29:35 +01001575# TS 31.102 Section 7.3
1576sw_usim = {
1577 'Security management': {
1578 '9862': 'Authentication error, incorrect MAC',
1579 '9864': 'Authentication error, security context not supported',
1580 '9865': 'Key freshness failure',
1581 '9866': 'Authentication error, no memory space available',
1582 '9867': 'Authentication error, no memory space available in EF MUK',
1583 }
1584}
1585
Harald Weltec91085e2022-02-10 18:05:45 +01001586
Philipp Maier57f65ee2021-10-18 14:09:02 +02001587class CardApplicationUSIM(CardApplication):
1588 def __init__(self):
Harald Weltec91085e2022-02-10 18:05:45 +01001589 super().__init__('USIM', adf=ADF_USIM(), sw=sw_usim)