blob: 1976ae0b29d12d0482ed32251084c02030f41f23 [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
Harald Welte53762512023-12-21 20:16:17 +010034from pySim.ts_51_011 import EF_CBMID, EF_CBMIR, EF_ADN, EF_CFIS, EF_SMS, EF_MSISDN, EF_SMSP, EF_SMSS
Harald Weltec91085e2022-02-10 18:05:45 +010035from 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 Welte324175f2023-12-21 20:25:30 +0100299 _test_de_encode = [
300 ( 'A00401010000A14A80010A81204E858C4D49D1343E6181284C47CA721730C98742CB7C6182D2E8126E08088D3680010B8120D1BC365F4997D17CE4374E72181431CBFEBA9E1B98D7618F79D48561B144672A',
301 {"prot_scheme_id_list": [{"priority": 0, "identifier": 1, "key_index": 1}, {"priority": 1,
302 "identifier": 0,
303 "key_index": 0}],
304 "hnet_pubkey_list": [{"hnet_pubkey_identifier": 10, "hnet_pubkey":
305 "4e858c4d49d1343e6181284c47ca721730c98742cb7c6182d2e8126e08088d36"},
306 {"hnet_pubkey_identifier": 11, "hnet_pubkey":
307 "d1bc365f4997d17ce4374e72181431cbfeba9e1b98d7618f79d48561b144672a"}]} ),
308 ]
Harald Welte13edf302022-07-21 15:19:23 +0200309 def __init__(self, fid="4f07", sfid=0x07, name='EF.SUCI_Calc_Info', size=(2, None),
Harald Welte419bb492022-02-12 21:39:35 +0100310 desc='SUCI Calc Info', **kwargs):
311 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200312
313 def _encode_prot_scheme_id_list(self, in_list):
314 out_bytes = [0xa0]
Harald Weltec91085e2022-02-10 18:05:45 +0100315 out_bytes.append(len(in_list)*2) # two byte per entry
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200316
317 # position in list determines priority; high-priority items (low index) come first
318 for scheme in sorted(in_list, key=lambda item: item["priority"]):
319 out_bytes.append(scheme["identifier"])
320 out_bytes.append(scheme["key_index"])
321
322 return out_bytes
323
324 def _encode_hnet_pubkey_list(self, hnet_pubkey_list):
Harald Weltec91085e2022-02-10 18:05:45 +0100325 out_bytes = [0xa1] # pubkey list tag
326 out_bytes.append(0x00) # length filled later
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200327 length = 0
328
329 for key in hnet_pubkey_list:
Harald Weltec91085e2022-02-10 18:05:45 +0100330 out_bytes.append(0x80) # identifier tag
331 out_bytes.append(0x01) # TODO size, fixed to 1 byte
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200332 out_bytes.append(key["hnet_pubkey_identifier"])
Harald Weltec91085e2022-02-10 18:05:45 +0100333 out_bytes.append(0x81) # key tag
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200334 out_bytes.append(len(key["hnet_pubkey"])//2)
335 length += 5+len(key["hnet_pubkey"])//2
336
337 pubkey_bytes = h2b(key["hnet_pubkey"])
338 out_bytes += pubkey_bytes
339
340 # fill length
341 out_bytes[1] = length
342 return out_bytes
343
344 def _encode_hex(self, in_json):
Harald Weltec91085e2022-02-10 18:05:45 +0100345 out_bytes = self._encode_prot_scheme_id_list(
346 in_json['prot_scheme_id_list'])
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200347 out_bytes += self._encode_hnet_pubkey_list(in_json['hnet_pubkey_list'])
348 return "".join(["%02X" % i for i in out_bytes])
349
350 def _decode_prot_scheme_id_list(self, in_bytes):
351 prot_scheme_id_list = []
352 pos = 0
353 # two bytes per entry
354 while pos < len(in_bytes):
355 prot_scheme = {
Harald Weltec91085e2022-02-10 18:05:45 +0100356 'priority': pos//2, # first in list: high priority
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200357 'identifier': in_bytes[pos],
358 'key_index': in_bytes[pos+1]
359 }
360 pos += 2
361 prot_scheme_id_list.append(prot_scheme)
362 return prot_scheme_id_list
363
364 def _decode_hnet_pubkey_list(self, in_bytes):
365 hnet_pubkey_list = []
366 pos = 0
367 if in_bytes[pos] != 0xa1:
368 print("missing Home Network Public Key List data object")
369 return {}
370 pos += 1
371 hnet_pubkey_list_len = in_bytes[pos]
372 pos += 1
373
374 while pos < hnet_pubkey_list_len:
375 if in_bytes[pos] != 0x80:
376 print("missing Home Network Public Key Identifier tag")
377 return {}
378 pos += 1
Harald Weltec91085e2022-02-10 18:05:45 +0100379 # TODO might be more than 1 byte?
380 hnet_pubkey_id_len = in_bytes[pos]
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200381 pos += 1
382 hnet_pubkey_id = in_bytes[pos:pos+hnet_pubkey_id_len][0]
383 pos += hnet_pubkey_id_len
384 if in_bytes[pos] != 0x81:
385 print("missing Home Network Public Key tag")
386 return {}
387 pos += 1
388 hnet_pubkey_len = in_bytes[pos]
389 pos += 1
390 hnet_pubkey = in_bytes[pos:pos+hnet_pubkey_len]
391 pos += hnet_pubkey_len
392
393 hnet_pubkey_list.append({
394 'hnet_pubkey_identifier': hnet_pubkey_id,
395 'hnet_pubkey': b2h(hnet_pubkey)
396 })
397
398 return hnet_pubkey_list
399
400 def _decode_bin(self, in_bin):
Vadim Yanitskiy5e41eeb2021-05-02 02:20:33 +0200401 return self._decode_hex(b2h(in_bin))
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200402
403 def _decode_hex(self, in_hex):
404 in_bytes = h2b(in_hex)
405 pos = 0
406
407 if in_bytes[pos] != 0xa0:
408 print("missing Protection Scheme Identifier List data object tag")
409 return {}
410 pos += 1
411
Harald Weltec91085e2022-02-10 18:05:45 +0100412 prot_scheme_id_list_len = in_bytes[pos] # TODO maybe more than 1 byte
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200413 pos += 1
414 # decode Protection Scheme Identifier List data object
Harald Weltec91085e2022-02-10 18:05:45 +0100415 prot_scheme_id_list = self._decode_prot_scheme_id_list(
416 in_bytes[pos:pos+prot_scheme_id_list_len])
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200417 pos += prot_scheme_id_list_len
418
419 # remaining data holds Home Network Public Key Data Object
420 hnet_pubkey_list = self._decode_hnet_pubkey_list(in_bytes[pos:])
421
422 return {
423 'prot_scheme_id_list': prot_scheme_id_list,
424 'hnet_pubkey_list': hnet_pubkey_list
425 }
426
427 def _encode_bin(self, in_json):
428 return h2b(self._encode_hex(in_json))
429
Harald Weltec91085e2022-02-10 18:05:45 +0100430
Harald Welteb2edd142021-01-08 23:29:35 +0100431class EF_LI(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200432 def __init__(self, fid='6f05', sfid=None, name='EF.LI', size=(2, None), rec_len=2,
Harald Welteb2edd142021-01-08 23:29:35 +0100433 desc='Language Indication'):
434 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)
Harald Weltec91085e2022-02-10 18:05:45 +0100435
Harald Weltef6b37af2023-01-24 15:42:26 +0100436 def _decode_record_bin(self, in_bin, **kwargs):
Harald Welteb2edd142021-01-08 23:29:35 +0100437 if in_bin == b'\xff\xff':
438 return None
439 else:
440 # officially this is 7-bit GSM alphabet with one padding bit in each byte
441 return in_bin.decode('ascii')
Harald Weltec91085e2022-02-10 18:05:45 +0100442
Harald Weltef6b37af2023-01-24 15:42:26 +0100443 def _encode_record_bin(self, in_json, **kwargs):
Harald Welteb2edd142021-01-08 23:29:35 +0100444 if in_json == None:
445 return b'\xff\xff'
446 else:
447 # officially this is 7-bit GSM alphabet with one padding bit in each byte
448 return in_json.encode('ascii')
449
Harald Weltec91085e2022-02-10 18:05:45 +0100450
Harald Welteb2edd142021-01-08 23:29:35 +0100451class EF_Keys(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200452 def __init__(self, fid='6f08', sfid=0x08, name='EF.Keys', size=(33, 33),
Harald Welteb2edd142021-01-08 23:29:35 +0100453 desc='Ciphering and Integrity Keys'):
454 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Weltec91085e2022-02-10 18:05:45 +0100455 self._construct = Struct(
456 'ksi'/Int8ub, 'ck'/HexAdapter(Bytes(16)), 'ik'/HexAdapter(Bytes(16)))
Harald Welteb2edd142021-01-08 23:29:35 +0100457
Harald Welte14105dc2021-05-31 08:48:51 +0200458# TS 31.102 Section 4.2.6
459class EF_HPPLMN(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100460 _test_de_encode = [ ( '05', 5 ) ]
Harald Welte13edf302022-07-21 15:19:23 +0200461 def __init__(self, fid='6f31', sfid=0x12, name='EF.HPPLMN', size=(1, 1),
Harald Welte14105dc2021-05-31 08:48:51 +0200462 desc='Higher Priority PLMN search period'):
463 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
464 self._construct = Int8ub
465
Harald Welte6ca2fa72022-02-12 16:29:31 +0100466class EF_UST(EF_UServiceTable):
467 def __init__(self, **kwargs):
Harald Welte13edf302022-07-21 15:19:23 +0200468 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 +0100469 # add those commands to the general commands of a TransparentEF
470 self.shell_commands += [self.AddlShellCommands()]
471
Harald Welteb2edd142021-01-08 23:29:35 +0100472 @with_default_category('File-Specific Commands')
473 class AddlShellCommands(CommandSet):
474 def __init__(self):
475 super().__init__()
476
477 def do_ust_service_activate(self, arg):
478 """Activate a service within EF.UST"""
Alexander Couzens6c5c3f82023-07-28 05:13:06 +0200479 selected_file = self._cmd.lchan.selected_file
480 selected_file.ust_update(self._cmd, [int(arg)], [])
Harald Welteb2edd142021-01-08 23:29:35 +0100481
482 def do_ust_service_deactivate(self, arg):
483 """Deactivate a service within EF.UST"""
Alexander Couzens6c5c3f82023-07-28 05:13:06 +0200484 selected_file = self._cmd.lchan.selected_file
485 selected_file.ust_update(self._cmd, [], [int(arg)])
Harald Welteb2edd142021-01-08 23:29:35 +0100486
Harald Welte4c5e2312022-02-12 14:37:48 +0100487 def do_ust_service_check(self, arg):
Harald Welte3bb516b2022-02-12 21:53:18 +0100488 """Check consistency between services of this file and files present/activated.
489
490 Many services determine if one or multiple files shall be present/activated or if they shall be
491 absent/deactivated. This performs a consistency check to ensure that no services are activated
492 for files that are not - and vice-versa, no files are activated for services that are not. Error
493 messages are printed for every inconsistency found."""
Harald Weltea6c0f882022-07-17 14:23:17 +0200494 selected_file = self._cmd.lchan.selected_file
Harald Welte82f75c22022-02-12 18:22:28 +0100495 num_problems = selected_file.ust_service_check(self._cmd)
496 # obtain list of currently active services
497 active_services = selected_file.get_active_services(self._cmd)
498 # Service n°46 can only be declared "available" if service n°45 is declared "available"
499 if 46 in active_services and not 45 in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100500 self._cmd.perror("ERROR: Service 46 available, but it requires Service 45")
Harald Welte82f75c22022-02-12 18:22:28 +0100501 num_problems += 1
502 # Service n°125 shall only be taken into account if Service n°124 is declared "available"
503 if 125 in active_services and not 124 in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100504 self._cmd.perror("ERROR: Service 125 is ignored as Service 124 not available")
Harald Welte82f75c22022-02-12 18:22:28 +0100505 num_problems += 1
506 # Service n°95, n°99 and n°115 shall not be declared "available" if an ISIM application is present on the UICC
507 non_isim_services = [95, 99, 115]
508 app_names = selected_file.get_mf().get_app_names()
509 if 'ADF.ISIM' in app_names:
510 for s in non_isim_services:
511 if s in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100512 self._cmd.perror("ERROR: Service %u shall not be available as ISIM application is present" % s)
Harald Welte82f75c22022-02-12 18:22:28 +0100513 num_problems += 1
514 self._cmd.poutput("===> %u service / file inconsistencies detected" % num_problems)
Harald Welte4c5e2312022-02-12 14:37:48 +0100515
516
Harald Welte89e59542021-04-02 21:33:13 +0200517# TS 31.103 Section 4.2.7 - *not* the same as DF.GSM/EF.ECC!
518class EF_ECC(LinFixedEF):
Harald Welte865eea62023-01-27 19:26:12 +0100519 _test_de_encode = [
520 ( '19f1ff01', { "call_code": "911f",
521 "service_category": { "police": True, "ambulance": False, "fire_brigade": False,
522 "marine_guard": False, "mountain_rescue": False,
523 "manual_ecall": False, "automatic_ecall": False } } ),
524 ( '19f3ff02', { "call_code": "913f",
525 "service_category": { "police": False, "ambulance": True, "fire_brigade": False,
526 "marine_guard": False, "mountain_rescue": False,
527 "manual_ecall": False, "automatic_ecall": False } } ),
528 ]
Harald Weltece01f482023-12-28 09:41:35 +0100529 _test_no_pad = True
Harald Welte865eea62023-01-27 19:26:12 +0100530 cc_construct = BcdAdapter(Rpad(Bytes(3)))
Harald Welteff2d86d2022-01-21 15:19:47 +0100531 category_construct = FlagsEnum(Byte, police=1, ambulance=2, fire_brigade=3, marine_guard=4,
532 mountain_rescue=5, manual_ecall=6, automatic_ecall=7)
Harald Welte6e6caa82023-12-27 22:04:50 +0100533 alpha_construct = GsmOrUcs2Adapter(Rpad(GreedyBytes))
Harald Weltec91085e2022-02-10 18:05:45 +0100534
Harald Welte89e59542021-04-02 21:33:13 +0200535 def __init__(self, fid='6fb7', sfid=0x01, name='EF.ECC',
536 desc='Emergency Call Codes'):
Harald Welte99e4cc02022-07-21 15:25:47 +0200537 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=(4, 20))
Harald Weltec91085e2022-02-10 18:05:45 +0100538
Harald Weltef6b37af2023-01-24 15:42:26 +0100539 def _decode_record_bin(self, in_bin, **kwargs):
Harald Welteff2d86d2022-01-21 15:19:47 +0100540 # mandatory parts
541 code = in_bin[:3]
542 if code == b'\xff\xff\xff':
543 return None
544 svc_category = in_bin[-1:]
545 ret = {'call_code': parse_construct(EF_ECC.cc_construct, code),
Harald Weltec91085e2022-02-10 18:05:45 +0100546 'service_category': parse_construct(EF_ECC.category_construct, svc_category)}
Harald Welteff2d86d2022-01-21 15:19:47 +0100547 # optional alpha identifier
548 if len(in_bin) > 4:
549 alpha_id = in_bin[3:-1]
550 ret['alpha_id'] = parse_construct(EF_ECC.alpha_construct, alpha_id)
551 return ret
Harald Weltec91085e2022-02-10 18:05:45 +0100552
Harald Weltef6b37af2023-01-24 15:42:26 +0100553 def _encode_record_bin(self, in_json, **kwargs):
Harald Welteff2d86d2022-01-21 15:19:47 +0100554 if in_json is None:
555 return b'\xff\xff\xff\xff'
556 code = EF_ECC.cc_construct.build(in_json['call_code'])
Harald Welte9b9efb62023-01-31 16:40:54 +0100557 svc_category = EF_ECC.category_construct.build(in_json['service_category'])
558 if 'alpha_id' in in_json:
559 alpha_id = EF_ECC.alpha_construct.build(in_json['alpha_id'])
560 # FIXME: alpha_id needs padding up to 'record_length - 4'
561 else:
562 alpha_id = b''
Harald Welteff2d86d2022-01-21 15:19:47 +0100563 return code + alpha_id + svc_category
564
Harald Welte89e59542021-04-02 21:33:13 +0200565
Harald Welte790b2702021-04-11 00:01:35 +0200566# TS 31.102 Section 4.2.17
567class EF_LOCI(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100568 _test_de_encode = [
569 ( '47d1264a62f21037211e00',
Harald Welte842fbdb2023-12-27 17:06:58 +0100570 { "tmsi": "47d1264a", "lai": { "mcc_mnc": "262-01", "lac": "3721" },
Harald Welte865eea62023-01-27 19:26:12 +0100571 "rfu": 30, "lu_status": 0 } ),
Harald Welte324175f2023-12-21 20:25:30 +0100572 ( 'ffffffff62f2200000ff01',
Harald Welte842fbdb2023-12-27 17:06:58 +0100573 {"tmsi": "ffffffff", "lai": {"mcc_mnc": "262-02", "lac": "0000"}, "rfu": 255, "lu_status": 1} ),
Harald Welte865eea62023-01-27 19:26:12 +0100574 ]
Harald Welte13edf302022-07-21 15:19:23 +0200575 def __init__(self, fid='6f7e', sfid=0x0b, name='EF.LOCI', desc='Location information', size=(11, 11)):
Harald Welte790b2702021-04-11 00:01:35 +0200576 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Welte842fbdb2023-12-27 17:06:58 +0100577 Lai = Struct('mcc_mnc'/PlmnAdapter(Bytes(3)), 'lac'/HexAdapter(Bytes(2)))
Harald Welte3a5afff2022-02-25 15:33:46 +0100578 self._construct = Struct('tmsi'/HexAdapter(Bytes(4)), 'lai'/Lai, 'rfu'/Int8ub, 'lu_status'/Int8ub)
Harald Welte865eea62023-01-27 19:26:12 +0100579
Harald Welte592b32e2021-06-05 11:26:36 +0200580# TS 31.102 Section 4.2.18
581class EF_AD(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100582 _test_de_encode = [
583 ( '00000002', { "ms_operation_mode": "normal",
584 "additional_info": { "ciphering_indicator": False, "csg_display_control": False,
585 "prose_services": False, "extended_drx": False },
586 "rfu": 0, "mnc_len": 2, "extensions": b'' } ),
587 ( '01000102', { "ms_operation_mode": "normal_and_specific_facilities",
588 "additional_info": { "ciphering_indicator": True, "csg_display_control": False,
589 "prose_services": False, "extended_drx": False },
590 "rfu": 0, "mnc_len": 2, "extensions": b'' } ),
591 ]
Harald Weltece01f482023-12-28 09:41:35 +0100592 _test_no_pad = True
593
Harald Welte592b32e2021-06-05 11:26:36 +0200594 class OP_MODE(enum.IntEnum):
Harald Weltec91085e2022-02-10 18:05:45 +0100595 normal = 0x00
596 type_approval = 0x80
597 normal_and_specific_facilities = 0x01
598 type_approval_and_specific_facilities = 0x81
599 maintenance_off_line = 0x02
600 cell_test = 0x04
Harald Welte592b32e2021-06-05 11:26:36 +0200601
Harald Welte13edf302022-07-21 15:19:23 +0200602 def __init__(self, fid='6fad', sfid=0x03, name='EF.AD', desc='Administrative Data', size=(4, 6)):
Harald Welte592b32e2021-06-05 11:26:36 +0200603 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
604 self._construct = BitStruct(
605 # Byte 1
606 'ms_operation_mode'/Bytewise(Enum(Byte, EF_AD.OP_MODE)),
607 # Byte 2 + 3
608 'additional_info'/Bytewise(FlagsEnum(Int16ub, ciphering_indicator=1, csg_display_control=2,
609 prose_services=4, extended_drx=8)),
610 'rfu'/BitsRFU(4),
611 'mnc_len'/BitsInteger(4),
612 'extensions'/COptional(Bytewise(GreedyBytesRFU))
613 )
Harald Welte790b2702021-04-11 00:01:35 +0200614
615# TS 31.102 Section 4.2.23
616class EF_PSLOCI(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200617 def __init__(self, fid='6f73', sfid=0x0c, name='EF.PSLOCI', desc='PS Location information', size=(14, 14)):
Harald Welte790b2702021-04-11 00:01:35 +0200618 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
619 self._construct = Struct('ptmsi'/HexAdapter(Bytes(4)), 'ptmsi_sig'/HexAdapter(Bytes(3)),
620 'rai'/HexAdapter(Bytes(6)), 'rau_status'/Int8ub)
621
622# TS 31.102 Section 4.2.33
623class EF_ICI(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200624 def __init__(self, fid='6f80', sfid=0x14, name='EF.ICI', rec_len=(28, 48),
Harald Welte6169c722022-02-12 09:05:15 +0100625 desc='Incoming Call Information', **kwargs):
626 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200627 self._construct = Struct('alpha_id'/HexAdapter(Bytes(this._.total_len-28)),
Harald Welte790b2702021-04-11 00:01:35 +0200628 'len_of_bcd_contents'/Int8ub,
629 'ton_npi'/Int8ub,
630 'call_number'/BcdAdapter(Bytes(10)),
631 'cap_cfg2_record_id'/Int8ub,
632 'ext5_record_id'/Int8ub,
633 'date_and_time'/BcdAdapter(Bytes(7)),
634 'duration'/Int24ub,
635 'status'/Byte,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200636 'link_to_phonebook'/HexAdapter(Bytes(3)))
Harald Welte790b2702021-04-11 00:01:35 +0200637
638# TS 31.102 Section 4.2.34
639class EF_OCI(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200640 def __init__(self, fid='6f81', sfid=0x15, name='EF.OCI', rec_len=(27, 47),
Harald Welte6169c722022-02-12 09:05:15 +0100641 desc='Outgoing Call Information', **kwargs):
642 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200643 self._construct = Struct('alpha_id'/HexAdapter(Bytes(this._.total_len-27)),
Harald Welte790b2702021-04-11 00:01:35 +0200644 'len_of_bcd_contents'/Int8ub,
645 'ton_npi'/Int8ub,
646 'call_number'/BcdAdapter(Bytes(10)),
647 'cap_cfg2_record_id'/Int8ub,
648 'ext5_record_id'/Int8ub,
649 'date_and_time'/BcdAdapter(Bytes(7)),
650 'duration'/Int24ub,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200651 'link_to_phonebook'/HexAdapter(Bytes(3)))
Harald Welte790b2702021-04-11 00:01:35 +0200652
653# TS 31.102 Section 4.2.35
654class EF_ICT(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200655 def __init__(self, fid='6f82', sfid=None, name='EF.ICT', rec_len=(3, 3),
Harald Welte6169c722022-02-12 09:05:15 +0100656 desc='Incoming Call Timer', **kwargs):
657 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200658 self._construct = Struct('accumulated_call_timer'/Int24ub)
659
660# TS 31.102 Section 4.2.38
661class EF_CCP2(LinFixedEF):
Harald Welte6169c722022-02-12 09:05:15 +0100662 def __init__(self, fid='6f4f', sfid=0x16, name='EF.CCP2', desc='Capability Configuration Parameters 2', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200663 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(15, None), **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200664
Harald Welte6ca2fa72022-02-12 16:29:31 +0100665# TS 31.102 Section 4.2.47
666class EF_EST(EF_UServiceTable):
667 def __init__(self, **kwargs):
Harald Welte13edf302022-07-21 15:19:23 +0200668 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 +0100669 # add those commands to the general commands of a TransparentEF
670 self.shell_commands += [self.AddlShellCommands()]
671
672 @with_default_category('File-Specific Commands')
673 class AddlShellCommands(CommandSet):
674 def __init__(self):
675 super().__init__()
676
Harald Welte18b75392023-02-23 10:00:51 +0100677 def do_est_service_enable(self, arg):
Alexander Couzensc8facea2023-07-29 05:01:57 +0200678 """Enable a service within EF.EST"""
679 selected_file = self._cmd.lchan.selected_file
680 selected_file.ust_update(self._cmd, [int(arg)], [])
Harald Welte6ca2fa72022-02-12 16:29:31 +0100681
Harald Welte18b75392023-02-23 10:00:51 +0100682 def do_est_service_disable(self, arg):
Alexander Couzensc8facea2023-07-29 05:01:57 +0200683 """Disable a service within EF.EST"""
684 selected_file = self._cmd.lchan.selected_file
685 selected_file.ust_update(self._cmd, [], [int(arg)])
Harald Welte6ca2fa72022-02-12 16:29:31 +0100686
Harald Welte790b2702021-04-11 00:01:35 +0200687# TS 31.102 Section 4.2.48
688class EF_ACL(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200689 def __init__(self, fid='6f57', sfid=None, name='EF.ACL', size=(32, None),
Harald Welte6169c722022-02-12 09:05:15 +0100690 desc='Access Point Name Control List', **kwargs):
691 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200692 self._construct = Struct('num_of_apns'/Int8ub, 'tlvs'/HexAdapter(GreedyBytes))
Harald Welte790b2702021-04-11 00:01:35 +0200693
694# TS 31.102 Section 4.2.51
695class EF_START_HFN(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100696 _test_de_encode = [
697 ( 'f00000f00000', { "start_cs": 15728640, "start_ps": 15728640 } ),
698 ]
Harald Welte13edf302022-07-21 15:19:23 +0200699 def __init__(self, fid='6f5b', sfid=0x0f, name='EF.START-HFN', size=(6, 6),
Harald Welte6169c722022-02-12 09:05:15 +0100700 desc='Initialisation values for Hyperframe number', **kwargs):
701 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200702 self._construct = Struct('start_cs'/Int24ub, 'start_ps'/Int24ub)
703
704# TS 31.102 Section 4.2.52
705class EF_THRESHOLD(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100706 _test_de_encode = [
707 ( 'f01000', { "max_start": 15732736 } ),
708 ]
Harald Welte13edf302022-07-21 15:19:23 +0200709 def __init__(self, fid='6f5c', sfid=0x10, name='EF.THRESHOLD', size=(3, 3),
Harald Welte6169c722022-02-12 09:05:15 +0100710 desc='Maximum value of START', **kwargs):
711 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200712 self._construct = Struct('max_start'/Int24ub)
713
Harald Welte363edd92022-07-17 22:24:03 +0200714# TS 31.102 (old releases like 3.8.0) Section 4.2.56
715class EF_RPLMNAcT(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200716 def __init__(self, fid='6f65', sfid=None, name='EF.RPLMNAcTD', size=(2, 4), rec_len=2,
Harald Welte363edd92022-07-17 22:24:03 +0200717 desc='RPLMN Last used Access Technology', **kwargs):
718 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len, **kwargs)
Harald Weltef6b37af2023-01-24 15:42:26 +0100719 def _decode_record_hex(self, in_hex, **kwargs):
Harald Welte363edd92022-07-17 22:24:03 +0200720 return dec_act(in_hex)
721 # TODO: Encode
722
Harald Welte790b2702021-04-11 00:01:35 +0200723# TS 31.102 Section 4.2.77
724class EF_VGCSCA(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200725 def __init__(self, fid='6fd4', sfid=None, name='EF.VGCSCA', size=(2, 100), rec_len=2,
Harald Welte6169c722022-02-12 09:05:15 +0100726 desc='Voice Group Call Service Ciphering Algorithm', **kwargs):
727 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200728 self._construct = Struct('alg_v_ki_1'/Int8ub, 'alg_v_ki_2'/Int8ub)
729
730# TS 31.102 Section 4.2.79
731class EF_GBABP(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200732 def __init__(self, fid='6fd6', sfid=None, name='EF.GBABP', size=(3, 50),
Harald Welte6169c722022-02-12 09:05:15 +0100733 desc='GBA Bootstrapping parameters', **kwargs):
734 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200735 self._construct = Struct('rand'/LV, 'b_tid'/LV, 'key_lifetime'/LV)
736
737# TS 31.102 Section 4.2.80
738class EF_MSK(LinFixedEF):
Harald Welte6169c722022-02-12 09:05:15 +0100739 def __init__(self, fid='6fd7', sfid=None, name='EF.MSK', desc='MBMS Service Key List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200740 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(20, None), **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200741 msk_ts_constr = Struct('msk_id'/Int32ub, 'timestamp_counter'/Int32ub)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200742 self._construct = Struct('key_domain_id'/HexAdapter(Bytes(3)),
Harald Welte790b2702021-04-11 00:01:35 +0200743 'num_msk_id'/Int8ub,
744 'msk_ids'/msk_ts_constr[this.num_msk_id])
Harald Welte14105dc2021-05-31 08:48:51 +0200745# TS 31.102 Section 4.2.81
746class EF_MUK(LinFixedEF):
747 class MUK_Idr(BER_TLV_IE, tag=0x80):
748 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100749
Harald Welte14105dc2021-05-31 08:48:51 +0200750 class MUK_Idi(BER_TLV_IE, tag=0x82):
751 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100752
Harald Welte14105dc2021-05-31 08:48:51 +0200753 class MUK_ID(BER_TLV_IE, tag=0xA0, nested=[MUK_Idr, MUK_Idi]):
754 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100755
Harald Welte14105dc2021-05-31 08:48:51 +0200756 class TimeStampCounter(BER_TLV_IE, tag=0x81):
757 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100758
Harald Welte14105dc2021-05-31 08:48:51 +0200759 class EF_MUK_Collection(TLV_IE_Collection, nested=[MUK_ID, TimeStampCounter]):
760 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100761
Harald Welte6169c722022-02-12 09:05:15 +0100762 def __init__(self, fid='6fd8', sfid=None, name='EF.MUK', desc='MBMS User Key', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200763 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(None, None), **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200764 self._tlv = EF_MUK.EF_MUK_Collection
765
766# TS 31.102 Section 4.2.83
767class EF_GBANL(LinFixedEF):
768 class NAF_ID(BER_TLV_IE, tag=0x80):
769 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100770
Harald Welte14105dc2021-05-31 08:48:51 +0200771 class B_TID(BER_TLV_IE, tag=0x81):
772 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100773
Harald Welte14105dc2021-05-31 08:48:51 +0200774 class EF_GBANL_Collection(BER_TLV_IE, nested=[NAF_ID, B_TID]):
775 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100776
Harald Welte6169c722022-02-12 09:05:15 +0100777 def __init__(self, fid='6fda', sfid=None, name='EF.GBANL', desc='GBA NAF List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200778 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(None, None), **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200779 self._tlv = EF_GBANL.EF_GBANL_Collection
Harald Welte790b2702021-04-11 00:01:35 +0200780
781# TS 31.102 Section 4.2.85
782class EF_EHPLMNPI(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100783 _test_de_encode = [
Harald Welte324175f2023-12-21 20:25:30 +0100784 ( '00', {"presentation_ind": "no_preference"} ),
Harald Welte865eea62023-01-27 19:26:12 +0100785 ( '02', { "presentation_ind": "display_all" } ),
786 ]
Harald Welte13edf302022-07-21 15:19:23 +0200787 def __init__(self, fid='6fdb', sfid=None, name='EF.EHPLMNPI', size=(1, 1),
Harald Welte6169c722022-02-12 09:05:15 +0100788 desc='Equivalent HPLMN Presentation Indication', **kwargs):
789 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100790 self._construct = Struct('presentation_ind' /
Harald Welte790b2702021-04-11 00:01:35 +0200791 Enum(Byte, no_preference=0, display_highest_prio_only=1, display_all=2))
Harald Welte14105dc2021-05-31 08:48:51 +0200792
793# TS 31.102 Section 4.2.87
794class EF_NAFKCA(LinFixedEF):
795 class NAF_KeyCentreAddress(BER_TLV_IE, tag=0x80):
796 _construct = HexAdapter(GreedyBytes)
Harald Welte99e4cc02022-07-21 15:25:47 +0200797 def __init__(self, fid='6fdd', sfid=None, name='EF.NAFKCA', rec_len=(None, None),
Harald Welte6169c722022-02-12 09:05:15 +0100798 desc='NAF Key Centre Address', **kwargs):
799 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200800 self._tlv = EF_NAFKCA.NAF_KeyCentreAddress
801
802# TS 31.102 Section 4.2.90
803class EF_NCP_IP(LinFixedEF):
804 class DataDestAddrRange(TLV_IE, tag=0x83):
805 _construct = Struct('type_of_address'/Enum(Byte, IPv4=0x21, IPv6=0x56),
806 'prefix_length'/Int8ub,
807 'prefix'/HexAdapter(GreedyBytes))
Harald Weltec91085e2022-02-10 18:05:45 +0100808
Harald Welte14105dc2021-05-31 08:48:51 +0200809 class AccessPointName(TLV_IE, tag=0x80):
810 # coded as per TS 23.003
811 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100812
Harald Welte14105dc2021-05-31 08:48:51 +0200813 class Login(TLV_IE, tag=0x81):
814 # as per SMS DCS TS 23.038
815 _construct = GsmStringAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100816
Harald Welte14105dc2021-05-31 08:48:51 +0200817 class Password(TLV_IE, tag=0x82):
818 # as per SMS DCS TS 23.038
819 _construct = GsmStringAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100820
Harald Welte14105dc2021-05-31 08:48:51 +0200821 class BearerDescription(TLV_IE, tag=0x84):
822 # Bearer descriptionTLV DO as per TS 31.111
823 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100824
Harald Welte14105dc2021-05-31 08:48:51 +0200825 class EF_NCP_IP_Collection(TLV_IE_Collection,
826 nested=[AccessPointName, Login, Password, BearerDescription]):
827 pass
Harald Welte99e4cc02022-07-21 15:25:47 +0200828 def __init__(self, fid='6fe2', sfid=None, name='EF.NCP-IP', rec_len=(None, None),
Harald Welte6169c722022-02-12 09:05:15 +0100829 desc='Network Connectivity Parameters for USIM IP connections', **kwargs):
830 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200831 self._tlv = EF_NCP_IP.EF_NCP_IP_Collection
832
Harald Welte790b2702021-04-11 00:01:35 +0200833# TS 31.102 Section 4.2.91
834class EF_EPSLOCI(TransparentEF):
Harald Welte12721292022-07-21 15:33:06 +0200835 def __init__(self, fid='6fe3', sfid=0x1e, name='EF.EPSLOCI',
836 desc='EPS Location Information', size=(18,18), **kwargs):
Harald Welte6169c722022-02-12 09:05:15 +0100837 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100838 upd_status_constr = Enum(
839 Byte, updated=0, not_updated=1, roaming_not_allowed=2)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200840 self._construct = Struct('guti'/HexAdapter(Bytes(12)),
841 'last_visited_registered_tai'/HexAdapter(Bytes(5)),
Harald Welte790b2702021-04-11 00:01:35 +0200842 'eps_update_status'/upd_status_constr)
843
Harald Welte14105dc2021-05-31 08:48:51 +0200844# TS 31.102 Section 4.2.92
845class EF_EPSNSC(LinFixedEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100846 class KSI_ASME(BER_TLV_IE, tag=0x80):
Harald Welte14105dc2021-05-31 08:48:51 +0200847 _construct = Int8ub
Harald Weltec91085e2022-02-10 18:05:45 +0100848
849 class K_ASME(BER_TLV_IE, tag=0x81):
Harald Welte14105dc2021-05-31 08:48:51 +0200850 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100851
Harald Welte14105dc2021-05-31 08:48:51 +0200852 class UplinkNASCount(BER_TLV_IE, tag=0x82):
853 _construct = Int32ub
Harald Weltec91085e2022-02-10 18:05:45 +0100854
Harald Welte14105dc2021-05-31 08:48:51 +0200855 class DownlinkNASCount(BER_TLV_IE, tag=0x83):
856 _construct = Int32ub
Harald Weltec91085e2022-02-10 18:05:45 +0100857
Harald Welte14105dc2021-05-31 08:48:51 +0200858 class IDofNASAlgorithms(BER_TLV_IE, tag=0x84):
859 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100860
Harald Welte14105dc2021-05-31 08:48:51 +0200861 class EPS_NAS_Security_Context(BER_TLV_IE, tag=0xa0,
Harald Weltec91085e2022-02-10 18:05:45 +0100862 nested=[KSI_ASME, K_ASME, UplinkNASCount, DownlinkNASCount,
863 IDofNASAlgorithms]):
Harald Welte14105dc2021-05-31 08:48:51 +0200864 pass
Harald Welte99e4cc02022-07-21 15:25:47 +0200865 def __init__(self, fid='6fe4', sfid=0x18, name='EF.EPSNSC', rec_len=(54, 128),
Harald Welte6169c722022-02-12 09:05:15 +0100866 desc='EPS NAS Security Context', **kwargs):
867 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200868 self._tlv = EF_EPSNSC.EPS_NAS_Security_Context
869
Harald Welte790b2702021-04-11 00:01:35 +0200870# TS 31.102 Section 4.2.96
871class EF_PWS(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100872 _test_de_encode = [
873 ( '00', { "pws_configuration": { "ignore_pws_in_hplmn_and_equivalent": False,
874 "ignore_pws_in_vplmn": False } } ),
875 ]
Harald Welte13edf302022-07-21 15:19:23 +0200876 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 +0100877 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100878 pws_config = FlagsEnum(
879 Byte, ignore_pws_in_hplmn_and_equivalent=1, ignore_pws_in_vplmn=2)
Harald Welte790b2702021-04-11 00:01:35 +0200880 self._construct = Struct('pws_configuration'/pws_config)
881
882# TS 31.102 Section 4.2.101
883class EF_IPS(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200884 def __init__(self, fid='6ff1', sfid=None, name='EF.IPS', rec_len=(4, 4),
Harald Welte6169c722022-02-12 09:05:15 +0100885 desc='IMEI(SV) Pairing Status', **kwargs):
886 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200887 self._construct = Struct('status'/PaddedString(2, 'ascii'),
888 'link_to_ef_ipd'/Int8ub, 'rfu'/Byte)
889
Harald Welte14105dc2021-05-31 08:48:51 +0200890# TS 31.102 Section 4.2.103
891class EF_ePDGId(TransparentEF):
Harald Welte478b5fe2023-12-08 14:27:50 +0100892 _test_de_encode = [
893 ( '801100657064672e6f736d6f636f6d2e6f7267', {'e_pdg_id': {"type_of_ePDG_address": "FQDN", "ePDG_address" : "epdg.osmocom.org" } } ),
Harald Welte6e9ae8a2023-12-08 14:57:19 +0100894 ( '800501c0a8a001', {'e_pdg_id': {"type_of_ePDG_address": "IPv4", "ePDG_address" : "192.168.160.1" } } ),
895 ( '80110220010db8000000000000000000000023', {'e_pdg_id': {"type_of_ePDG_address": "IPv6", "ePDG_address" : "2001:db8::23" } } ),
Harald Welte478b5fe2023-12-08 14:27:50 +0100896 ]
897 class ePDGId(BER_TLV_IE, tag=0x80):
Harald Welte14105dc2021-05-31 08:48:51 +0200898 _construct = Struct('type_of_ePDG_address'/Enum(Byte, FQDN=0, IPv4=1, IPv6=2),
Harald Welte478b5fe2023-12-08 14:27:50 +0100899 'ePDG_address'/Switch(this.type_of_ePDG_address,
Philipp Maier791f80a2023-07-26 17:01:37 +0200900 {'FQDN': Utf8Adapter(GreedyBytes),
Harald Welte6e9ae8a2023-12-08 14:57:19 +0100901 'IPv4': Ipv4Adapter(GreedyBytes),
902 'IPv6': Ipv6Adapter(GreedyBytes)}))
Harald Weltec91085e2022-02-10 18:05:45 +0100903
iw040ef2262023-11-07 13:41:12 +0100904 def __init__(self, fid='6ff3', sfid=None, name='EF.ePDGId', desc='Home ePDG Identifier', **kwargs):
Harald Welte6169c722022-02-12 09:05:15 +0100905 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200906 self._tlv = EF_ePDGId.ePDGId
907
Harald Weltecdfe1c22023-12-08 12:30:21 +0100908# TS 31.102 Section 4.2.104
909class EF_ePDGSelection(TransparentEF):
Harald Welte478b5fe2023-12-08 14:27:50 +0100910 _test_de_encode = [
Harald Welte842fbdb2023-12-27 17:06:58 +0100911 ( '800600f110000100', {'e_pdg_selection': [{'plmn': '001-01', 'epdg_priority': 1, 'epdg_fqdn_format': 'operator_identified' }] }),
912 ( '800600011000a001', {'e_pdg_selection': [{'plmn': '001-001', 'epdg_priority': 160, 'epdg_fqdn_format': 'location_based' }] }),
Harald Welte478b5fe2023-12-08 14:27:50 +0100913 ]
914 class ePDGSelection(BER_TLV_IE, tag=0x80):
Harald Welte842fbdb2023-12-27 17:06:58 +0100915 _construct = GreedyRange(Struct('plmn'/PlmnAdapter(Bytes(3)),
Harald Weltecdfe1c22023-12-08 12:30:21 +0100916 'epdg_priority'/Int16ub,
917 'epdg_fqdn_format'/Enum(Int8ub, operator_identified=0, location_based=1)))
918
919 def __init__(self, fid='6ff4', sfid=None, name='EF.ePDGSelection', desc='ePDG Selection Information', **kwargs):
920 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
921 self._tlv = EF_ePDGSelection.ePDGSelection
922
Harald Welte71290072021-04-21 10:58:24 +0200923# TS 31.102 Section 4.2.106
924class EF_FromPreferred(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200925 def __init__(self, fid='6ff7', sfid=None, name='EF.FromPreferred', size=(1, 1),
Harald Welte6169c722022-02-12 09:05:15 +0100926 desc='From Preferred', **kwargs):
927 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte45477a72023-11-03 01:33:06 +0100928 self._construct = BitStruct('rfu'/BitsRFU(7), 'from_preferred'/Flag)
Harald Welte71290072021-04-21 10:58:24 +0200929
Harald Weltefc67de22023-05-23 20:29:49 +0200930# TS 31.102 Section 4.2.114
931class EF_eAKA(TransparentEF):
932 def __init__(self, fid='6f01', sfid=None, name='EF.eAKA', size=(1, 1),
933 desc='enhanced AKA support', **kwargs):
934 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte45477a72023-11-03 01:33:06 +0100935 self._construct = BitStruct('rfu'/BitsRFU(7), 'enhanced_sqn_calculation_supported'/Flag)
Harald Weltefc67de22023-05-23 20:29:49 +0200936
Harald Welted90ceb82022-07-17 22:10:58 +0200937
938######################################################################
939# DF.GSM-ACCESS
940######################################################################
941
942class DF_GSM_ACCESS(CardDF):
943 def __init__(self, fid='5F3B', name='DF.GSM-ACCESS', desc='GSM Access', **kwargs):
944 super().__init__(fid=fid, name=name, desc=desc, service=27, **kwargs)
945 files = [
946 EF_Kc(fid='4f20', sfid=0x01, service=27),
947 EF_Kc(fid='4f52', sfid=0x02, name='EF.KcGPRS', desc='GPRS Ciphering key KcGPRS', service=27),
948 EF_CPBCCH(fid='4f63', service=39),
949 EF_InvScan(fid='4f64', service=40),
950 ]
951 self.add_files(files)
952
953
Harald Welte790b2702021-04-11 00:01:35 +0200954######################################################################
Harald Weltea77f7e12023-12-27 16:29:00 +0100955# DF.NHB
956######################################################################
957
958# 3GPP TS 31.102 Section 4.4.6.2
959class EF_ACSGL(LinFixedEF):
960 _test_de_encode = [
961 ( 'a00d800362f21081060000000002e0',
962 {'csg_list': [{'plmn': '262-01'},
963 {'csg_information': { 'csg_type': 'from_other_sources',
964 'hnb_name_indication': 'from_other_sources',
965 'csg_id': { 'id': 23 } } } ] } ),
966 ]
967 class Plmn(BER_TLV_IE, tag=0x80):
968 _construct = PlmnAdapter(Bytes(3))
969 class CsgInformation(BER_TLV_IE, tag=0x81):
970 _construct = Struct('csg_type'/Enum(Int8ub, from_other_sources=0),
971 'hnb_name_indication'/Enum(Int8ub, from_other_sources=0),
972 'csg_id'/BitStruct('id'/BitsInteger(27), Padding(5)))
973 class CsgList(BER_TLV_IE, tag=0xa0, nested=[Plmn, CsgInformation]):
974 pass
975 def __init__(self, fid='4f81', sfid=0x01, name='EF.ACSGL', desc='Allowed CSG Lists', service=86, **kwargs):
976 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, service=service, rec_len=(1, None), **kwargs)
977 self._tlv = EF_ACSGL.CsgList
978
979# 3GPP TS 31.102 Section 4.4.6.3
980class EF_CSGT(LinFixedEF):
981 _test_de_encode = [
982 ( '8906810300666f6f', [{ 'text_csg_type': 'foo' }] ),
983 ( '8906810300666f6f801068747470733a2f2f666f6f2e6261722f',
984 [{ 'text_csg_type': 'foo' }, { "graphics_csg_type_uri": "https://foo.bar/" }] ),
985 ]
986 class TextCsgType(BER_TLV_IE, tag=0x89):
987 _construct = Ucs2Adapter(GreedyBytes)
988 class GraphicsCsgTypeURI(BER_TLV_IE, tag=0x80):
989 _construct = Utf8Adapter(GreedyBytes)
990 class GraphicsCsgTypeEfImg(BER_TLV_IE, tag=0x81):
991 _construct = Int8ub
992 class Csgt_TLV_Collection(TLV_IE_Collection,
993 nested=[TextCsgType, GraphicsCsgTypeURI, GraphicsCsgTypeEfImg]):
994 pass
995 def __init__(self, fid='4f82', sfid=0x02, name='EF.CSGT', desc='CSG Types', service=86, **kwargs):
996 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, service=service, rec_len=(1, None), **kwargs)
997 self._tlv = EF_CSGT.Csgt_TLV_Collection
998
999
1000# 3GPP TS 31.102 Section 4.4.6.4
1001class EF_HNBN(LinFixedEF):
1002 _test_de_encode = [
1003 ( '800b8108006d61686c7a656974', { 'hnb_name': 'mahlzeit' }),
1004 ]
1005 class HnbName(BER_TLV_IE, tag=0x80):
1006 _construct = Ucs2Adapter(GreedyBytes)
1007 def __init__(self, fid='4f83', sfid=0x03, name='EF.HNBN', desc='Home NodeB Name', service=86, **kwargs):
1008 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, service=service, rec_len=(1, None), **kwargs)
1009 self._tlv = EF_HNBN.HnbName
1010
1011# 3GPP TS 31.102 Section 4.4.6.5
1012class EF_OCSGL(LinFixedEF):
1013 _test_de_encode = [
1014 ( 'a010800362f21081060000000002e0820100',
1015 {'operator_csg_list': [{'plmn': '262-01'},
1016 {'csg_information': { 'csg_type': 'from_other_sources',
1017 'hnb_name_indication': 'from_other_sources',
1018 'csg_id': { 'id': 23 } } },
1019 {'csg_display_indicator': 'all_available_csg_ids' } ] } ),
1020
1021 ]
1022 class CsgDisplayIndicator(BER_TLV_IE, tag=0x82):
1023 _construct = Enum(Int8ub, all_available_csg_ids=0, only_ocsgl_csg_ids=1)
1024 class OperatorCsgList(BER_TLV_IE, tag=0xa0, nested=[EF_ACSGL.Plmn, EF_ACSGL.CsgInformation, CsgDisplayIndicator]):
1025 pass
1026 def __init__(self, fid='4f84', sfid=0x04, name='EF.OCSGL', desc='Operator CSG Lists', service=90, **kwargs):
1027 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, service=service, rec_len=(1, None), **kwargs)
1028 self._tlv = EF_OCSGL.OperatorCsgList
1029
1030
1031######################################################################
Harald Welte790b2702021-04-11 00:01:35 +02001032# DF.5GS
1033######################################################################
1034
1035# TS 31.102 Section 4.4.11.2
1036class EF_5GS3GPPLOCI(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +02001037 def __init__(self, fid='4f01', sfid=0x01, name='EF.5GS3GPPLOCI', size=(20, 20),
Harald Welte419bb492022-02-12 21:39:35 +01001038 desc='5S 3GP location information', **kwargs):
1039 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +01001040 upd_status_constr = Enum(
1041 Byte, updated=0, not_updated=1, roaming_not_allowed=2)
Harald Welte3c98d5e2022-07-20 07:40:05 +02001042 self._construct = Struct('5g_guti'/HexAdapter(Bytes(13)),
1043 'last_visited_registered_tai_in_5gs'/HexAdapter(Bytes(6)),
Harald Welte790b2702021-04-11 00:01:35 +02001044 '5gs_update_status'/upd_status_constr)
1045
1046# TS 31.102 Section 4.4.11.7
1047class EF_UAC_AIC(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +01001048 _test_de_encode = [
1049 ( '03', { "uac_access_id_config": { "multimedia_priority_service": True,
1050 "mission_critical_service": True } } ),
1051 ]
Harald Welte13edf302022-07-21 15:19:23 +02001052 def __init__(self, fid='4f06', sfid=0x06, name='EF.UAC_AIC', size=(4, 4),
Harald Welte419bb492022-02-12 21:39:35 +01001053 desc='UAC Access Identities Configuration', **kwargs):
1054 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +02001055 cfg_constr = FlagsEnum(Byte, multimedia_priority_service=1,
Harald Weltec91085e2022-02-10 18:05:45 +01001056 mission_critical_service=2)
Harald Welte790b2702021-04-11 00:01:35 +02001057 self._construct = Struct('uac_access_id_config'/cfg_constr)
1058
Harald Welte14105dc2021-05-31 08:48:51 +02001059# TS 31.102 Section 4.4.11.9
Harald Welte790b2702021-04-11 00:01:35 +02001060class EF_OPL5G(LinFixedEF):
Harald Welte52064292023-05-24 15:25:26 +02001061 def __init__(self, fid='4f08', sfid=0x08, name='EF.OPL5G', desc='5GS Operator PLMN List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +02001062 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(10, None), **kwargs)
Harald Welte842fbdb2023-12-27 17:06:58 +01001063 Tai = Struct('mcc_mnc'/PlmnAdapter(Bytes(3)), 'tac_min'/HexAdapter(Bytes(3)),
Harald Welte3c98d5e2022-07-20 07:40:05 +02001064 'tac_max'/HexAdapter(Bytes(3)))
Harald Weltea0377622022-02-25 15:36:44 +01001065 self._construct = Struct('tai'/Tai, 'pnn_record_id'/Int8ub)
Harald Welte790b2702021-04-11 00:01:35 +02001066
Harald Welte14105dc2021-05-31 08:48:51 +02001067# TS 31.102 Section 4.4.11.10
1068class EF_SUPI_NAI(TransparentEF):
1069 class NetworkSpecificIdentifier(TLV_IE, tag=0x80):
1070 # RFC 7542 encoded as UTF-8 string
Philipp Maier791f80a2023-07-26 17:01:37 +02001071 _construct = Utf8Adapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +01001072
Harald Welte14105dc2021-05-31 08:48:51 +02001073 class GlobalLineIdentifier(TLV_IE, tag=0x81):
1074 # TS 23.003 clause 28.16.2
Philipp Maier791f80a2023-07-26 17:01:37 +02001075 _construct = Utf8Adapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +01001076
Harald Welte14105dc2021-05-31 08:48:51 +02001077 class GlobalCableIdentifier(TLV_IE, tag=0x82):
1078 # TS 23.003 clause 28.15.2
Philipp Maier791f80a2023-07-26 17:01:37 +02001079 _construct = Utf8Adapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +01001080
Harald Welte14105dc2021-05-31 08:48:51 +02001081 class NAI_TLV_Collection(TLV_IE_Collection,
Harald Weltec91085e2022-02-10 18:05:45 +01001082 nested=[NetworkSpecificIdentifier, GlobalLineIdentifier, GlobalCableIdentifier]):
Harald Welte14105dc2021-05-31 08:48:51 +02001083 pass
1084 def __init__(self, fid='4f09', sfid=0x09, name='EF.SUPI_NAI',
Harald Welte419bb492022-02-12 21:39:35 +01001085 desc='SUPI as Network Access Identifier', **kwargs):
1086 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +02001087 self._tlv = EF_SUPI_NAI.NAI_TLV_Collection
1088
Harald Welte455611c2023-05-27 12:48:54 +02001089# TS 31.102 Section 4.4.11.11
1090class EF_Routing_Indicator(TransparentEF):
1091 def __init__(self, fid='4f0a', sfid=0x0a, name='EF.Routing_Indicator', desc='Routing Indicator', **kwargs):
1092 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1093 # 3GPP TS 24.501 Table 9.11.3.4.1:
1094 # Routing Indicator shall consist of 1 to 4 digits. The coding of this field is the
1095 # responsibility of home network operator but BCD coding shall be used. If a network
1096 # operator decides to assign less than 4 digits to Routing Indicator, the remaining digits
1097 # shall be coded as "1111" to fill the 4 digits coding of Routing Indicator
Harald Weltef9a5ba52023-06-09 09:17:05 +02001098 self._construct = Struct('routing_indicator'/Rpad(BcdAdapter(Bytes(2)), 'f', 2),
1099 'rfu'/HexAdapter(Bytes(2)))
Harald Weltec91085e2022-02-10 18:05:45 +01001100
Harald Weltefc67de22023-05-23 20:29:49 +02001101# TS 31.102 Section 4.4.11.13
Harald Welte14105dc2021-05-31 08:48:51 +02001102class EF_TN3GPPSNN(TransparentEF):
1103 class ServingNetworkName(BER_TLV_IE, tag=0x80):
Philipp Maier791f80a2023-07-26 17:01:37 +02001104 _construct = Utf8Adapter(GreedyBytes)
Harald Welte14105dc2021-05-31 08:48:51 +02001105 def __init__(self, fid='4f0c', sfid=0x0c, name='EF.TN3GPPSNN',
Harald Welte419bb492022-02-12 21:39:35 +01001106 desc='Trusted non-3GPP Serving network names list', **kwargs):
1107 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +02001108 self._tlv = EF_TN3GPPSNN.ServingNetworkName
1109
Harald Weltefc67de22023-05-23 20:29:49 +02001110# TS 31.102 Section 4.4.11.14 (Rel 17)
1111class EF_CAG(TransparentEF):
1112 def __init__(self, fid='4f0d', sfid=0x0d, name='EF.CAG',
1113 desc='Pre-configured CAG information list EF', **kwargs):
1114 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1115 self._construct = HexAdapter(GreedyBytes)
1116
1117# TS 31.102 Section 4.4.11.15 (Rel 17)
1118class EF_SOR_CMCI(TransparentEF):
1119 def __init__(self, fid='4f0e', sfid=0x0e, name='EF.SOR-CMCI',
1120 desc='Steering Of Roaming - Connected Mode Control Information', **kwargs):
1121 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1122 self._construct = HexAdapter(GreedyBytes)
1123
1124# TS 31.102 Section 4.4.11.17 (Rel 17)
1125class EF_DRI(TransparentEF):
1126 def __init__(self, fid='4f0f', sfid=0x0f, name='EF.DRI',
1127 desc='Disaster roaming information EF', **kwargs):
1128 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1129 self._construct = Struct('disaster_roaming_enabled'/Byte,
1130 'parameters_indicator_status'/FlagsEnum(Byte, roaming_wait_range=1,
1131 return_wait_range=2,
1132 applicability_indicator=3),
1133 'roaming_wait_range'/HexAdapter(Bytes(2)),
1134 'return_wait_range'/HexAdapter(Bytes(2)),
1135 'applicability_indicator'/HexAdapter(Byte))
1136
1137# TS 31.102 Section 4.4.12.2 (Rel 17)
1138class EF_PWS_SNPN(TransparentEF):
1139 def __init__(self, fid='4f01', sfid=0x01, name='EF.PWS_SNPN',
1140 desc='Public Warning System in SNPNs', **kwargs):
1141 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1142 self._construct = Struct('pws_config_in_snpns'/FlagsEnum(Byte, ignore_all_pws_in_subscribed=1,
1143 ignore_all_pws_in_non_subscribed=2))
1144
1145# TS 31.102 Section 4.4.12.2 (Rel 17)
1146class EF_NID(LinFixedEF):
1147 def __init__(self, fid='4f02', sfid=0x02, name='EF.NID',
1148 desc='Network Identifier for SNPN', **kwargs):
1149 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=(6,6), **kwargs)
1150 self._construct = Struct('assignment_mode'/Enum(Byte, coordinated_ass_opt1=0,
1151 self_ass=1,
1152 coordinated_ass_opt2=2),
1153 'network_identifier'/HexAdapter(Bytes(5)))
1154
1155# TS 31.102 Section 4.4.12 (Rel 17)
1156class DF_SNPN(CardDF):
1157 def __init__(self, fid='5fe0', name='DF.SNPN', desc='Files for SNPN purpose', **kwargs):
1158 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1159 files = [
1160 EF_PWS_SNPN(service=143),
1161 EF_NID(service=146),
1162 ]
1163 self.add_files(files)
1164
1165# TS 31.102 Section 4.4.13.2 (Rel 17)
1166class EF_5G_PROSE_ST(EF_UServiceTable):
1167 def __init__(self, **kwargs):
1168 super().__init__(fid='4f01', sfid=0x01, name='EF.5G_PROSE_ST',
1169 desc='5G ProSe Service Table', size=(1,2), table=EF_5G_PROSE_ST_map, **kwargs)
1170 # add those commands to the general commands of a TransparentEF
1171 self.shell_commands += [self.AddlShellCommands()]
1172
1173 @with_default_category('File-Specific Commands')
1174 class AddlShellCommands(CommandSet):
1175 def __init__(self):
1176 super().__init__()
1177
1178 def do_prose_service_activate(self, arg):
1179 """Activate a service within EF.5G_PROSE_ST"""
Alexander Couzensc8facea2023-07-29 05:01:57 +02001180 selected_file = self._cmd.lchan.selected_file
1181 selected_file.ust_update(self._cmd, [int(arg)], [])
Harald Weltefc67de22023-05-23 20:29:49 +02001182
1183 def do_prose_service_deactivate(self, arg):
1184 """Deactivate a service within EF.5G_PROSE_ST"""
Alexander Couzensc8facea2023-07-29 05:01:57 +02001185 selected_file = self._cmd.lchan.selected_file
1186 selected_file.ust_update(self._cmd, [], [int(arg)])
Harald Weltefc67de22023-05-23 20:29:49 +02001187
1188# TS 31.102 Section 4.4.13.3 (Rel 17)
1189class EF_5G_PROSE_DD(TransparentEF):
1190 class ServedByNgRan(BER_TLV_IE, tag=0x80):
1191 pass
1192 class NotServedByNgran(BER_TLV_IE, tag=0x81):
1193 pass
1194 class ProSeIdentifiers(BER_TLV_IE, tag=0x82):
1195 pass
1196 class ProSeIdToDefaultDestL2Id(BER_TLV_IE, tag=0x83):
1197 pass
1198 class GroupMemberDiscoveryParameters(BER_TLV_IE, tag=0x84):
1199 pass
1200 class ValidityTimer(BER_TLV_IE, tag=0x85):
1201 pass
1202 class ProSeDirectDiscoveryUeId(BER_TLV_IE, tag=0x86):
1203 pass
1204 class Hplmn5GDdnmfAddressInformation(BER_TLV_IE, tag=0x87):
1205 pass
1206 class ProSeConfigForDirectDiscovery(BER_TLV_IE, tag=0xA0,
1207 nested=[ServedByNgRan, NotServedByNgran, ProSeIdentifiers,
1208 ProSeIdToDefaultDestL2Id, GroupMemberDiscoveryParameters,
1209 ValidityTimer, ProSeDirectDiscoveryUeId,
1210 Hplmn5GDdnmfAddressInformation]):
1211 pass
1212 def __init__(self, fid='4f02', sfid=0x02, name='EF.5G_PROSE_DD',
1213 desc='5G ProSe configuration data for direct discovery', **kwargs):
1214 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1215 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1216 self._tlv = EF_5G_PROSE_DD.ProSeConfigForDirectDiscovery
1217
1218# TS 31.102 Section 4.4.13.4 (Rel 17)
1219class EF_5G_PROSE_DC(TransparentEF):
1220 class PrivacyConfig(BER_TLV_IE, tag=0x87):
1221 pass
1222 class DirectCommInNrPc5(BER_TLV_IE, tag=0x88):
1223 pass
1224 class ApplicationToPathPreferenceMappingRules(BER_TLV_IE, tag=0x89):
1225 pass
1226 class ProSeIdToNrTxProfileForBroadcastAndGroupcastMappingRules(BER_TLV_IE, tag=0x91):
1227 pass
1228 class ProSeConfigForDirectCommunication(BER_TLV_IE, tag=0xA0,
1229 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1230 EF_5G_PROSE_DD.NotServedByNgran,
1231 PrivacyConfig, DirectCommInNrPc5,
1232 ApplicationToPathPreferenceMappingRules,
1233 EF_5G_PROSE_DD.ValidityTimer,
1234 ProSeIdToNrTxProfileForBroadcastAndGroupcastMappingRules]):
1235 pass
1236 def __init__(self, fid='4f03', sfid=0x03, name='EF.5G_PROSE_DC',
1237 desc='5G ProSe configuration data for direct communication', **kwargs):
1238 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1239 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1240 self._tlv = EF_5G_PROSE_DC.ProSeConfigForDirectCommunication
1241
1242# TS 31.102 Section 4.4.13.5 (Rel 17)
1243class EF_5G_PROSE_U2NRU(TransparentEF):
1244 class ProSeIdToDefaultDestL2Id(BER_TLV_IE, tag=0x8a):
1245 pass
1246 class RxcInfoList(BER_TLV_IE, tag=0x8b):
1247 pass
1248 class FiveQiToPc65QosParametersMappingRules(BER_TLV_IE, tag=0x8c):
1249 pass
1250 class ProSeIdToAppSrvAddrMappingRules(BER_TLV_IE, tag=0x8d):
1251 pass
1252 class UserInfoIdForDiscovery(BER_TLV_IE, tag=0x8e):
1253 pass
1254 class PrivacyTimer(BER_TLV_IE, tag=0x92):
1255 pass
1256 class FiveGPkkmfAddressInformation(BER_TLV_IE, tag=0x93):
1257 pass
1258 class ProSeConfigDataForUeToNetworkRelayUe(BER_TLV_IE, tag=0xA0,
1259 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1260 EF_5G_PROSE_DD.NotServedByNgran,
1261 ProSeIdToDefaultDestL2Id,
1262 RxcInfoList,
1263 FiveQiToPc65QosParametersMappingRules,
1264 ProSeIdToAppSrvAddrMappingRules,
1265 EF_5G_PROSE_DD.ValidityTimer,
1266 UserInfoIdForDiscovery,
1267 PrivacyTimer,
1268 FiveGPkkmfAddressInformation]):
1269 pass
1270 def __init__(self, fid='4f04', sfid=0x04, name='EF.5G_PROSE_U2NRU',
1271 desc='5G ProSe configuration data for UE-to-network relay UE', **kwargs):
1272 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1273 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1274 self._tlv = EF_5G_PROSE_U2NRU.ProSeConfigDataForUeToNetworkRelayUe
1275
1276# TS 31.102 Section 4.4.13.6 (Rel 17)
1277class EF_5G_PROSE_RU(TransparentEF):
1278 class DefaultDestL2Ids(BER_TLV_IE, tag=0x8f):
1279 pass
1280 class N3IwfSelectionInfoFor5GProSeL3RemoteUE(BER_TLV_IE, tag=0x90):
1281 pass
1282 class ProSeConfigDataForRemoteUe(BER_TLV_IE, tag=0xa0,
1283 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1284 EF_5G_PROSE_DD.NotServedByNgran,
1285 DefaultDestL2Ids,
1286 EF_5G_PROSE_U2NRU.RxcInfoList,
1287 N3IwfSelectionInfoFor5GProSeL3RemoteUE,
1288 EF_5G_PROSE_DD.ValidityTimer,
1289 EF_5G_PROSE_U2NRU.UserInfoIdForDiscovery,
1290 EF_5G_PROSE_U2NRU.PrivacyTimer,
1291 EF_5G_PROSE_U2NRU.FiveGPkkmfAddressInformation]):
1292 pass
1293 def __init__(self, fid='4f05', sfid=0x05, name='EF.5G_PROSE_RU',
1294 desc='5G ProSe configuration data for remote UE', **kwargs):
1295 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1296 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1297 self._tlv = EF_5G_PROSE_RU.ProSeConfigDataForRemoteUe
1298
1299# TS 31.102 Section 4.4.13.7 (Rel 17)
1300class EF_5G_PROSE_UIR(TransparentEF):
1301 class CollectionPeriod(BER_TLV_IE, tag=0x94):
1302 pass
1303 class ReportingWindow(BER_TLV_IE, tag=0x95):
1304 pass
1305 class ReportingIndicators(BER_TLV_IE, tag=0x96):
1306 pass
1307 class FiveGDdnmfCtfAddrForUploading(BER_TLV_IE, tag=0x97):
1308 pass
1309 class ProSeConfigDataForUeToNetworkRelayUE(BER_TLV_IE, tag=0xa0,
1310 nested=[EF_5G_PROSE_DD.ValidityTimer,
1311 CollectionPeriod, ReportingWindow,
1312 ReportingIndicators,
1313 FiveGDdnmfCtfAddrForUploading]):
1314 pass
1315 def __init__(self, fid='4f06', sfid=0x06, name='EF.5G_PROSE_UIR',
1316 desc='5G ProSe configuration data for usage information reporting', **kwargs):
1317 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1318 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1319 self._tlv = EF_5G_PROSE_UIR.ProSeConfigDataForUeToNetworkRelayUE
1320
1321# TS 31.102 Section 4.4.13 (Rel 17)
1322class DF_5G_ProSe(CardDF):
1323 def __init__(self, fid='5ff0', name='DF.5G_ProSe', desc='Files for 5G ProSe purpose', **kwargs):
1324 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1325 files = [
1326 EF_5G_PROSE_ST(),
1327 EF_5G_PROSE_DD(service=1),
1328 EF_5G_PROSE_DC(service=2),
1329 EF_5G_PROSE_U2NRU(service=3),
1330 EF_5G_PROSE_RU(service=4),
1331 EF_5G_PROSE_UIR(service=5),
1332 ]
1333 self.add_files(files)
1334
1335# TS 31.102 Section 4.4.11.18 (Rel 17)
1336class EF_5GSEDRX(TransparentEF):
1337 def __init__(self, fid='4f10', sfid=0x10, name='EF.5GSEDRX',
1338 desc='5GS eDRX Parameters', **kwargs):
1339 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1340 self._construct = Struct('5gs_rat_type'/FlagsEnum(Byte, ng_ran=1, sat_ng_ran=2),
1341 'edrx_cycle_length'/Int8ub)
1342
1343# TS 31.102 Section 4.4.11.19 (Rel 17)
1344class EF_5GNSWO_CONF(TransparentEF):
1345 def __init__(self, fid='4f11', sfid=0x11, name='EF.5GNSWO_CONF',
1346 desc='5G Non-Seamless WLAN Offload configuration', **kwargs):
1347 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1348 self._construct = Struct('5g_nswo_usage_ind'/Enum(Byte, disabled=0, enabled=1))
1349
1350# TS 31.102 Section 4.4.11.20 (Rel 17)
1351class EF_MCHPPLMN(TransparentEF):
Harald Welte24e77a72023-05-24 15:26:29 +02001352 def __init__(self, fid='4f15', sfid=0x15, name='EF.MCHPPLMN',
Harald Weltefc67de22023-05-23 20:29:49 +02001353 desc='Multiplier Coefficient for Higher Priority PLMN search', **kwargs):
1354 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1355 self._construct = Struct('multiplier_coefficient'/Int8ub)
1356
1357# TS 31.102 Section 4.4.11.21 (Rel 17)
1358class EF_KAUSF_DERIVATION(TransparentEF):
1359 def __init__(self, fid='4f16', sfid=0x16, name='EF.KAUSF_DERIVATION',
1360 desc='K_AUSF derivation configuration', **kwargs):
1361 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1362 self._construct = Struct('k_ausf_deriv_cfg'/FlagsEnum(Byte, use_msk=1), 'rfu'/HexAdapter(GreedyBytes))
1363
Harald Welte3990ebb2021-04-20 23:55:14 +02001364# TS 31.102 Section 4.4.5
1365class DF_WLAN(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001366 def __init__(self, fid='5f40', name='DF.WLAN', desc='Files for WLAN purpose', **kwargs):
1367 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001368 files = [
Harald Welte419bb492022-02-12 21:39:35 +01001369 TransparentEF('4f41', 0x01, 'EF.Pseudo', 'Pseudonym', service=59),
Harald Weltec91085e2022-02-10 18:05:45 +01001370 TransparentEF('4f42', 0x02, 'EF.UPLMNWLAN',
Harald Welte419bb492022-02-12 21:39:35 +01001371 'User controlled PLMN selector for I-WLAN Access', service=60),
Harald Weltec91085e2022-02-10 18:05:45 +01001372 TransparentEF('4f43', 0x03, 'EF.OPLMNWLAN',
Harald Welte419bb492022-02-12 21:39:35 +01001373 'Operator controlled PLMN selector for I-WLAN Access', service=61),
Harald Weltec91085e2022-02-10 18:05:45 +01001374 LinFixedEF('4f44', 0x04, 'EF.UWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001375 'User controlled WLAN Specific Identifier List', service=62),
Harald Weltec91085e2022-02-10 18:05:45 +01001376 LinFixedEF('4f45', 0x05, 'EF.OWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001377 'Operator controlled WLAN Specific Identifier List', service=63),
Harald Weltec91085e2022-02-10 18:05:45 +01001378 TransparentEF('4f46', 0x06, 'EF.WRI',
Harald Welte419bb492022-02-12 21:39:35 +01001379 'WLAN Reauthentication Identity', service=66),
Harald Weltec91085e2022-02-10 18:05:45 +01001380 LinFixedEF('4f47', 0x07, 'EF.HWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001381 'Home I-WLAN Specific Identifier List', service=81),
Harald Weltec91085e2022-02-10 18:05:45 +01001382 TransparentEF('4f48', 0x08, 'EF.WEHPLMNPI',
Harald Welte419bb492022-02-12 21:39:35 +01001383 'I-WLAN Equivalent HPLMN Presentation Indication', service=82),
Harald Weltec91085e2022-02-10 18:05:45 +01001384 TransparentEF('4f49', 0x09, 'EF.WHPI',
Harald Welte419bb492022-02-12 21:39:35 +01001385 'I-WLAN HPLMN Priority Indication', service=83),
Harald Weltec91085e2022-02-10 18:05:45 +01001386 TransparentEF('4f4a', 0x0a, 'EF.WLRPLMN',
Harald Welte419bb492022-02-12 21:39:35 +01001387 'I-WLAN Last Registered PLMN', service=84),
Harald Weltec91085e2022-02-10 18:05:45 +01001388 TransparentEF('4f4b', 0x0b, 'EF.HPLMNDAI',
Harald Welte419bb492022-02-12 21:39:35 +01001389 'HPLMN Direct Access Indicator', service=88),
Harald Weltec91085e2022-02-10 18:05:45 +01001390 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001391 self.add_files(files)
1392
1393# TS 31.102 Section 4.4.6
1394class DF_HNB(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001395 def __init__(self, fid='5f50', name='DF.HNB', desc='Files for HomeNodeB purpose', **kwargs):
1396 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001397 files = [
Harald Weltea77f7e12023-12-27 16:29:00 +01001398 EF_ACSGL(),
1399 EF_CSGT(),
1400 EF_HNBN(),
1401 EF_OCSGL(),
1402 EF_CSGT('4f85', 0x05, 'EF.OCSGT', 'Operator CSG Type', service=90),
1403 EF_HNBN('4f86', 0x06, 'EF.OHNBN', 'Operator Home NodeB Name', service=90),
Harald Weltec91085e2022-02-10 18:05:45 +01001404 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001405 self.add_files(files)
1406
1407# TS 31.102 Section 4.4.8
1408class DF_ProSe(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001409 def __init__(self, fid='5f90', name='DF.ProSe', desc='Files for ProSe purpose', **kwargs):
1410 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001411 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001412 LinFixedEF('4f01', 0x01, 'EF.PROSE_MON',
1413 'ProSe Monitoring Parameters'),
1414 LinFixedEF('4f02', 0x02, 'EF.PROSE_ANN',
1415 'ProSe Announcing Parameters'),
Harald Welte3990ebb2021-04-20 23:55:14 +02001416 LinFixedEF('4f03', 0x03, 'EF.PROSEFUNC', 'HPLMN ProSe Function'),
Harald Weltec91085e2022-02-10 18:05:45 +01001417 TransparentEF('4f04', 0x04, 'EF.PROSE_RADIO_COM',
1418 'ProSe Direct Communication Radio Parameters'),
1419 TransparentEF('4f05', 0x05, 'EF.PROSE_RADIO_MON',
1420 'ProSe Direct Discovery Monitoring Radio Parameters'),
1421 TransparentEF('4f06', 0x06, 'EF.PROSE_RADIO_ANN',
1422 'ProSe Direct Discovery Announcing Radio Parameters'),
1423 LinFixedEF('4f07', 0x07, 'EF.PROSE_POLICY',
1424 'ProSe Policy Parameters'),
Harald Welte3990ebb2021-04-20 23:55:14 +02001425 LinFixedEF('4f08', 0x08, 'EF.PROSE_PLMN', 'ProSe PLMN Parameters'),
1426 TransparentEF('4f09', 0x09, 'EF.PROSE_GC', 'ProSe Group Counter'),
1427 TransparentEF('4f10', 0x10, 'EF.PST', 'ProSe Service Table'),
Harald Weltec91085e2022-02-10 18:05:45 +01001428 TransparentEF('4f11', 0x11, 'EF.UIRC',
1429 'ProSe UsageInformationReportingConfiguration'),
1430 LinFixedEF('4f12', 0x12, 'EF.PROSE_GM_DISCOVERY',
1431 'ProSe Group Member Discovery Parameters'),
1432 LinFixedEF('4f13', 0x13, 'EF.PROSE_RELAY',
1433 'ProSe Relay Parameters'),
1434 TransparentEF('4f14', 0x14, 'EF.PROSE_RELAY_DISCOVERY',
1435 'ProSe Relay Discovery Parameters'),
1436 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001437 self.add_files(files)
1438
Harald Weltec91085e2022-02-10 18:05:45 +01001439
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001440class DF_USIM_5GS(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001441 def __init__(self, fid='5FC0', name='DF.5GS', desc='5GS related files', **kwargs):
1442 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001443 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001444 # I'm looking at 31.102 R16.6
Harald Welte419bb492022-02-12 21:39:35 +01001445 EF_5GS3GPPLOCI(service=122),
Harald Weltec91085e2022-02-10 18:05:45 +01001446 EF_5GS3GPPLOCI('4f02', 0x02, 'EF.5GSN3GPPLOCI',
Harald Welte28accc82023-10-18 23:21:46 +02001447 desc='5GS non-3GPP location information', service=122),
Harald Welte419bb492022-02-12 21:39:35 +01001448 EF_5GS3GPPNSC(service=122),
Harald Weltec91085e2022-02-10 18:05:45 +01001449 EF_5GS3GPPNSC('4f04', 0x04, 'EF.5GSN3GPPNSC',
Harald Welte28accc82023-10-18 23:21:46 +02001450 desc='5GS non-3GPP Access NAS Security Context', service=122),
Harald Welte419bb492022-02-12 21:39:35 +01001451 EF_5GAUTHKEYS(service=123),
1452 EF_UAC_AIC(service=126),
1453 EF_SUCI_Calc_Info(service=124),
1454 EF_OPL5G(service=129),
1455 EF_SUPI_NAI(service=130),
Harald Welte455611c2023-05-27 12:48:54 +02001456 EF_Routing_Indicator(service=124),
Harald Weltec91085e2022-02-10 18:05:45 +01001457 TransparentEF('4F0B', 0x0b, 'EF.URSP',
Harald Welte28accc82023-10-18 23:21:46 +02001458 desc='UE Route Selector Policies per PLMN', service=132),
Harald Welte419bb492022-02-12 21:39:35 +01001459 EF_TN3GPPSNN(service=133),
Harald Weltefc67de22023-05-23 20:29:49 +02001460 # Rel-17 additions below
1461 EF_CAG(service=137),
1462 EF_SOR_CMCI(service=138),
1463 EF_DRI(service=140),
1464 EF_5GSEDRX(service=141),
1465 EF_5GNSWO_CONF(service=142),
1466 EF_MCHPPLMN(service=144),
1467 EF_KAUSF_DERIVATION(service=145),
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001468 ]
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001469 self.add_files(files)
1470
Harald Weltec91085e2022-02-10 18:05:45 +01001471
Harald Welte2bee70c2023-05-25 09:14:28 +02001472class DF_SAIP(CardDF):
1473 """This is not really TS 31.102 but part of the eUICC Profile Package: Interoperable Format Technical
1474 Specification as released by TCA (formerly SIMalliance)"""
1475 def __init__(self, fid='5FD0', name='DF.SAIP', desc='SIMalliance Interoperable Profile', **kwargs):
1476 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1477 files = [
1478 # uses the same file format as DF.5GS/EF_SUCI_Calc_Info, but different FID
1479 EF_SUCI_Calc_Info(fid='4f01')
1480 ]
1481 self.add_files(files)
1482
1483
Harald Welteb2edd142021-01-08 23:29:35 +01001484class ADF_USIM(CardADF):
Philipp Maiera1850ae2023-10-25 18:05:09 +02001485 def __init__(self, aid='a0000000871002', has_fs=True, name='ADF.USIM', fid=None, sfid=None,
Harald Welteb2edd142021-01-08 23:29:35 +01001486 desc='USIM Application'):
Philipp Maiera1850ae2023-10-25 18:05:09 +02001487 super().__init__(aid=aid, has_fs=has_fs, fid=fid, sfid=sfid, name=name, desc=desc)
Harald Welte15fae982021-04-10 10:22:27 +02001488 # add those commands to the general commands of a TransparentEF
1489 self.shell_commands += [self.AddlShellCommands()]
Harald Welteb2edd142021-01-08 23:29:35 +01001490
1491 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001492 EF_LI(sfid=0x02),
1493 EF_IMSI(sfid=0x07),
1494 EF_Keys(),
1495 EF_Keys('6f09', 0x09, 'EF.KeysPS',
1496 desc='Ciphering and Integrity Keys for PS domain'),
1497 EF_xPLMNwAcT('6f60', 0x0a, 'EF.PLMNwAcT',
Harald Welte509ecf82023-10-18 23:32:57 +02001498 desc='User controlled PLMN Selector with Access Technology', service=20),
Harald Weltec91085e2022-02-10 18:05:45 +01001499 EF_HPPLMN(),
Harald Welte6169c722022-02-12 09:05:15 +01001500 EF_ACMmax(service=13),
Harald Welte6ca2fa72022-02-12 16:29:31 +01001501 EF_UST(),
Harald Weltec91085e2022-02-10 18:05:45 +01001502 CyclicEF('6f39', None, 'EF.ACM',
Harald Welte509ecf82023-10-18 23:32:57 +02001503 desc='Accumulated call meter', rec_len=(3, 3), service=13),
1504 TransparentEF('6f3e', None, 'EF.GID1', desc='Group Identifier Level 1', service=17),
1505 TransparentEF('6f3f', None, 'EF.GID2', desc='Group Identifier Level 2', service=18),
Harald Welte6169c722022-02-12 09:05:15 +01001506 EF_SPN(service=19),
Harald Weltec91085e2022-02-10 18:05:45 +01001507 TransparentEF('6f41', None, 'EF.PUCT',
Harald Welte509ecf82023-10-18 23:32:57 +02001508 desc='Price per unit and currency table', size=(5, 5), service=13),
Harald Welte6169c722022-02-12 09:05:15 +01001509 EF_CBMI(service=15),
Harald Weltec91085e2022-02-10 18:05:45 +01001510 EF_ACC(sfid=0x06),
Harald Welte509ecf82023-10-18 23:32:57 +02001511 EF_PLMNsel('6f7b', 0x0d, 'EF.FPLMN', desc='Forbidden PLMNs', size=(12, None)),
Harald Weltec91085e2022-02-10 18:05:45 +01001512 EF_LOCI(),
1513 EF_AD(),
Harald Welte6169c722022-02-12 09:05:15 +01001514 EF_CBMID(sfid=0x0e, service=29),
Harald Weltec91085e2022-02-10 18:05:45 +01001515 EF_ECC(),
Harald Welte6169c722022-02-12 09:05:15 +01001516 EF_CBMIR(service=16),
Harald Weltec91085e2022-02-10 18:05:45 +01001517 EF_PSLOCI(),
Harald Welte509ecf82023-10-18 23:32:57 +02001518 EF_ADN('6f3b', None, 'EF.FDN', desc='Fixed Dialling Numbers', service=[2, 89], ext=2),
Harald Welte6169c722022-02-12 09:05:15 +01001519 EF_SMS('6f3c', None, service=10),
1520 EF_MSISDN(service=21),
1521 EF_SMSP(service=12),
1522 EF_SMSS(service=10),
Harald Welte509ecf82023-10-18 23:32:57 +02001523 EF_ADN('6f49', None, 'EF.SDN', desc='Service Dialling Numbers', service=[4, 89], ext=3),
1524 EF_EXT('6f4b', None, 'EF.EXT2', desc='Extension2 (FDN)', service=3),
1525 EF_EXT('6f4c', None, 'EF.EXT3', desc='Extension2 (SDN)', service=5),
Harald Welte6169c722022-02-12 09:05:15 +01001526 EF_SMSR(service=11),
1527 EF_ICI(service=9),
1528 EF_OCI(service=8),
1529 EF_ICT(service=9),
Harald Welte509ecf82023-10-18 23:32:57 +02001530 EF_ICT('6f83', None, 'EF.OCT', desc='Outgoing Call Timer', service=8),
1531 EF_EXT('6f4e', None, 'EF.EXT5', desc='Extension5 (ICI/OCI/MSISDN)', service=44),
Harald Welte6169c722022-02-12 09:05:15 +01001532 EF_CCP2(service=14),
1533 EF_eMLPP(service=24),
1534 EF_AAeM(service=25),
Harald Weltec91085e2022-02-10 18:05:45 +01001535 # EF_Hiddenkey
Harald Welte509ecf82023-10-18 23:32:57 +02001536 EF_ADN('6f4d', None, 'EF.BDN', desc='Barred Dialling Numbers', service=6, ext=4),
1537 EF_EXT('6f55', None, 'EF.EXT4', desc='Extension4 (BDN/SSC)', service=7),
Harald Welte6169c722022-02-12 09:05:15 +01001538 EF_CMI(service=6),
Harald Welte6ca2fa72022-02-12 16:29:31 +01001539 EF_EST(service=[2, 6, 34, 35]),
Harald Welte6169c722022-02-12 09:05:15 +01001540 EF_ACL(service=35),
1541 EF_DCK(service=36),
1542 EF_CNL(service=37),
Harald Weltec91085e2022-02-10 18:05:45 +01001543 EF_START_HFN(),
1544 EF_THRESHOLD(),
Harald Welte509ecf82023-10-18 23:32:57 +02001545 EF_xPLMNwAcT('6f61', 0x11, 'EF.OPLMNwAcT', desc='User controlled PLMN Selector with Access Technology', service=42),
1546 EF_xPLMNwAcT('6f62', 0x13, 'EF.HPLMNwAcT', desc='HPLMN Selector with Access Technology', service=43),
Harald Weltec91085e2022-02-10 18:05:45 +01001547 EF_ARR('6f06', 0x17),
Harald Welte363edd92022-07-17 22:24:03 +02001548 EF_RPLMNAcT(),
Harald Welte509ecf82023-10-18 23:32:57 +02001549 TransparentEF('6fc4', None, 'EF.NETPAR', desc='Network Parameters'),
Harald Welte6169c722022-02-12 09:05:15 +01001550 EF_PNN('6fc5', 0x19, service=45),
1551 EF_OPL(service=46),
Harald Welte509ecf82023-10-18 23:32:57 +02001552 EF_ADN('6fc7', None, 'EF.MBDN', desc='Mailbox Dialling Numbers', service=47, ext=6),
1553 EF_EXT('6fc8', None, 'EF.EXT6', desc='Extension6 (MBDN)'),
Harald Welte6169c722022-02-12 09:05:15 +01001554 EF_MBI(service=47),
1555 EF_MWIS(service=48),
Harald Welte53762512023-12-21 20:16:17 +01001556 EF_CFIS(service=49, ext=7),
Harald Welte509ecf82023-10-18 23:32:57 +02001557 EF_EXT('6fcc', None, 'EF.EXT7', desc='Extension7 (CFIS)'),
1558 TransparentEF('6fcd', None, 'EF.SPDI', desc='Service Provider Display Information', service=51),
Harald Welte6169c722022-02-12 09:05:15 +01001559 EF_MMSN(service=52),
Harald Welte509ecf82023-10-18 23:32:57 +02001560 EF_EXT('6fcf', None, 'EF.EXT8', desc='Extension8 (MMSN)', service=53),
Harald Welte6169c722022-02-12 09:05:15 +01001561 EF_MMSICP(service=52),
1562 EF_MMSUP(service=52),
1563 EF_MMSUCP(service=(52, 55)),
Harald Welte04bd5142023-05-24 15:23:53 +02001564 EF_NIA(service=56, fid='6fd3'),
Harald Welte6169c722022-02-12 09:05:15 +01001565 EF_VGCS(service=57),
1566 EF_VGCSS(service=57),
Harald Welte509ecf82023-10-18 23:32:57 +02001567 EF_VGCS('6fb3', None, 'EF.VBS', desc='Voice Broadcast Service', service=58),
1568 EF_VGCSS('6fb4', None, 'EF.VBSS', desc='Voice Broadcast Service Status', service=58),
Harald Welte6169c722022-02-12 09:05:15 +01001569 EF_VGCSCA(service=64),
Harald Welte509ecf82023-10-18 23:32:57 +02001570 EF_VGCSCA('6fd5', None, 'EF.VBCSCA', desc='Voice Broadcast Service Ciphering Algorithm', service=65),
Harald Welte6169c722022-02-12 09:05:15 +01001571 EF_GBABP(service=68),
1572 EF_MSK(service=69),
1573 EF_MUK(service=69),
1574 EF_GBANL(service=68),
Harald Welte509ecf82023-10-18 23:32:57 +02001575 EF_PLMNsel('6fd9', 0x1d, 'EF.EHPLMN', desc='Equivalent HPLMN', size=(12, None), service=71),
Harald Welte6169c722022-02-12 09:05:15 +01001576 EF_EHPLMNPI(service=(71, 73)),
1577 # EF_LRPLMNSI ('6fdc', service=74)
1578 EF_NAFKCA(service=(68, 76)),
Harald Welte509ecf82023-10-18 23:32:57 +02001579 TransparentEF('6fde', None, 'EF.SPNI', desc='Service Provider Name Icon', service=78),
1580 LinFixedEF('6fdf', None, 'EF.PNNI', desc='PLMN Network Name Icon', service=79),
Harald Welte6169c722022-02-12 09:05:15 +01001581 EF_NCP_IP(service=80),
Harald Welte509ecf82023-10-18 23:32:57 +02001582 EF_EPSLOCI('6fe3', 0x1e, 'EF.EPSLOCI', desc='EPS location information', service=85),
Harald Welte6169c722022-02-12 09:05:15 +01001583 EF_EPSNSC(service=85),
Harald Welte324175f2023-12-21 20:25:30 +01001584 # EF.UFC Test data: 801e60c01e900080040000000000000000f0000000004000000000000080
Harald Welte509ecf82023-10-18 23:32:57 +02001585 TransparentEF('6fe6', None, 'EF.UFC', desc='USAT Facility Control', size=(1, 16)),
1586 TransparentEF('6fe8', None, 'EF.NASCONFIG', desc='Non Access Stratum Configuration', service=96),
Harald Welte6169c722022-02-12 09:05:15 +01001587 # UICC IARI (only in cards that have no ISIM) service=95
1588 EF_PWS(service=97),
Harald Welte509ecf82023-10-18 23:32:57 +02001589 LinFixedEF('6fed', None, 'EF.FDNURI', desc='Fixed Dialling Numbers URI', service=(2, 99)),
1590 LinFixedEF('6fee', None, 'EF.BDNURI', desc='Barred Dialling Numbers URI', service=(6, 99)),
1591 LinFixedEF('6fef', None, 'EF.SDNURI', desc='Service Dialling Numbers URI', service=(4, 99)),
Harald Welte6169c722022-02-12 09:05:15 +01001592 # EF_IWL (IMEI(SV) White List)
Harald Weltec91085e2022-02-10 18:05:45 +01001593 EF_IPS(),
Harald Welte6169c722022-02-12 09:05:15 +01001594 EF_ePDGId(service=(106, 107)),
Harald Weltecdfe1c22023-12-08 12:30:21 +01001595 EF_ePDGSelection(service=(106, 107)),
Harald Welte5277b5c2023-12-08 12:22:28 +01001596 EF_ePDGId('6ff5', None, 'EF.ePDGIdEm', desc='Emergency ePDG Identifier', service=(110, 111)),
Harald Weltecdfe1c22023-12-08 12:30:21 +01001597 EF_ePDGSelection('6ff6', None, 'EF.ePDGSelectionEm',
1598 desc='ePDG Selection Information for Emergency Services', service=(110, 111)),
Harald Welte6169c722022-02-12 09:05:15 +01001599 EF_FromPreferred(service=114),
Harald Weltefc67de22023-05-23 20:29:49 +02001600 EF_eAKA(),
Harald Welte6169c722022-02-12 09:05:15 +01001601 # FIXME: DF_SoLSA service=23
Harald Weltede4c14c2022-07-16 11:53:59 +02001602 DF_PHONEBOOK(),
Harald Welted90ceb82022-07-17 22:10:58 +02001603 DF_GSM_ACCESS(),
Harald Welte6169c722022-02-12 09:05:15 +01001604 DF_WLAN(service=[59, 60, 61, 62, 63, 66, 81, 82, 83, 84, 88]),
1605 DF_HNB(service=[86, 90]),
1606 DF_ProSe(service=101),
1607 # FIXME: DF_ACDC service=108
1608 # FIXME: DF_TV service=116
1609 DF_USIM_5GS(service=[122, 123, 124, 125, 126, 127, 129, 130]),
Harald Weltefc67de22023-05-23 20:29:49 +02001610 DF_SNPN(service=[143,146]),
1611 DF_5G_ProSe(service=139),
Harald Welte2bee70c2023-05-25 09:14:28 +02001612 DF_SAIP(),
Harald Weltec91085e2022-02-10 18:05:45 +01001613 ]
Harald Welteb2edd142021-01-08 23:29:35 +01001614 self.add_files(files)
1615
1616 def decode_select_response(self, data_hex):
Philipp Maier5998a3a2021-11-16 15:16:39 +01001617 return pySim.ts_102_221.CardProfileUICC.decode_select_response(data_hex)
Harald Welteb2edd142021-01-08 23:29:35 +01001618
Harald Welte15fae982021-04-10 10:22:27 +02001619 @with_default_category('Application-Specific Commands')
1620 class AddlShellCommands(CommandSet):
1621 def __init__(self):
1622 super().__init__()
1623
1624 authenticate_parser = argparse.ArgumentParser()
1625 authenticate_parser.add_argument('rand', help='Random challenge')
1626 authenticate_parser.add_argument('autn', help='Authentication Nonce')
1627 #authenticate_parser.add_argument('--context', help='Authentication context', default='3G')
Harald Weltec91085e2022-02-10 18:05:45 +01001628
Harald Welte15fae982021-04-10 10:22:27 +02001629 @cmd2.with_argparser(authenticate_parser)
1630 def do_authenticate(self, opts):
1631 """Perform Authentication and Key Agreement (AKA)."""
Harald Welte46255122023-10-21 23:40:42 +02001632 (data, sw) = self._cmd.lchan.scc.authenticate(opts.rand, opts.autn)
Harald Welte15fae982021-04-10 10:22:27 +02001633 self._cmd.poutput_json(data)
1634
Harald Welte12af7932022-02-15 16:39:08 +01001635 term_prof_parser = argparse.ArgumentParser()
1636 term_prof_parser.add_argument('PROFILE', help='Hexstring of encoded terminal profile')
1637
1638 @cmd2.with_argparser(term_prof_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001639 def do_terminal_profile(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001640 """Send a TERMINAL PROFILE command to the card.
1641 This is used to inform the card about which optional
1642 features the terminal (modem/phone) supports, particularly
1643 in the context of SIM Toolkit, Proactive SIM and OTA. You
1644 must specify a hex-string with the encoded terminal profile
1645 you want to send to the card."""
Harald Welte46255122023-10-21 23:40:42 +02001646 (data, sw) = self._cmd.lchan.scc.terminal_profile(opts.PROFILE)
Harald Welte846a8982021-10-08 15:47:16 +02001647 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
Harald Welte15fae982021-04-10 10:22:27 +02001648
Harald Welte12af7932022-02-15 16:39:08 +01001649 envelope_parser = argparse.ArgumentParser()
1650 envelope_parser.add_argument('PAYLOAD', help='Hexstring of encoded payload to ENVELOPE')
1651
1652 @cmd2.with_argparser(envelope_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001653 def do_envelope(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001654 """Send an ENVELOPE command to the card. This is how a
1655 variety of information is communicated from the terminal
1656 (modem/phone) to the card, particularly in the context of
1657 SIM Toolkit, Proactive SIM and OTA."""
Harald Welte46255122023-10-21 23:40:42 +02001658 (data, sw) = self._cmd.lchan.scc.envelope(opts.PAYLOAD)
Harald Welte7cb94e42021-10-08 15:47:57 +02001659 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
1660
Harald Welte12af7932022-02-15 16:39:08 +01001661 envelope_sms_parser = argparse.ArgumentParser()
1662 envelope_sms_parser.add_argument('TPDU', help='Hexstring of encoded SMS TPDU')
1663
1664 @cmd2.with_argparser(envelope_sms_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001665 def do_envelope_sms(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001666 """Send an ENVELOPE(SMS-PP-Download) command to the card.
1667 This emulates a terminal (modem/phone) having received a SMS
1668 with a PID of 'SMS for the SIM card'. You can use this
1669 command in the context of testing OTA related features
Philipp Maier4e5aa302023-06-06 19:22:19 +02001670 without a modem/phone or a cellular network."""
Harald Welte7cb94e42021-10-08 15:47:57 +02001671 tpdu_ie = SMS_TPDU()
Harald Welte51b3abb2022-07-30 16:30:33 +02001672 tpdu_ie.from_bytes(h2b(opts.TPDU))
Harald Weltec91085e2022-02-10 18:05:45 +01001673 dev_ids = DeviceIdentities(
1674 decoded={'source_dev_id': 'network', 'dest_dev_id': 'uicc'})
Harald Welte7cb94e42021-10-08 15:47:57 +02001675 sms_dl = SMSPPDownload(children=[dev_ids, tpdu_ie])
Harald Welte46255122023-10-21 23:40:42 +02001676 (data, sw) = self._cmd.lchan.scc.envelope(b2h(sms_dl.to_tlv()))
Harald Welte7cb94e42021-10-08 15:47:57 +02001677 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
1678
Harald Welte7ec82232023-06-06 18:15:52 +02001679 get_id_parser = argparse.ArgumentParser()
1680 get_id_parser.add_argument("--nswo-context", action='store_true')
1681
1682 @cmd2.with_argparser(get_id_parser)
1683 def do_get_identity(self, opts):
1684 """Send a GET IDENTITY command to the card. This is part of the
1685 procedure for "SUCI calculation performed on USIM" supported
1686 by USIM with support for both EF.UST service 124 and 125."""
1687 context = 0x01 # SUCI
1688 if opts.nswo_context:
1689 context = 0x02 # SUCI 5G NSWO
Harald Welte46255122023-10-21 23:40:42 +02001690 (data, sw) = self._cmd.lchan.scc.get_identity(context)
Harald Welte7ec82232023-06-06 18:15:52 +02001691 do = SUCI_TlvDataObject()
1692 do.from_tlv(h2b(data))
1693 do_d = do.to_dict()
1694 self._cmd.poutput('SUCI TLV Data Object: %s' % do_d['suci__tlv_data_object'])
1695
Harald Welte15fae982021-04-10 10:22:27 +02001696
Harald Welteb2edd142021-01-08 23:29:35 +01001697# TS 31.102 Section 7.3
1698sw_usim = {
1699 'Security management': {
1700 '9862': 'Authentication error, incorrect MAC',
1701 '9864': 'Authentication error, security context not supported',
1702 '9865': 'Key freshness failure',
1703 '9866': 'Authentication error, no memory space available',
1704 '9867': 'Authentication error, no memory space available in EF MUK',
1705 }
1706}
1707
Harald Weltec91085e2022-02-10 18:05:45 +01001708
Philipp Maier57f65ee2021-10-18 14:09:02 +02001709class CardApplicationUSIM(CardApplication):
1710 def __init__(self):
Harald Weltec91085e2022-02-10 18:05:45 +01001711 super().__init__('USIM', adf=ADF_USIM(), sw=sw_usim)