blob: e7ae8f0989de0318f555edb5179dacb5e133d855 [file] [log] [blame]
Supreeth Herle475dcaa2020-03-20 18:57:39 +01001# -*- coding: utf-8 -*-
2
Harald Weltef12979d2021-05-29 21:47:13 +02003# without this, pylint will fail when inner classes are used
4# within the 'nested' kwarg of our TlvMeta metaclass on python 3.7 :(
5# pylint: disable=undefined-variable
6
Supreeth Herle475dcaa2020-03-20 18:57:39 +01007"""
Harald Weltefc67de22023-05-23 20:29:49 +02008Various constants from 3GPP TS 31.102 V17.9.0
Supreeth Herle475dcaa2020-03-20 18:57:39 +01009"""
10
11#
12# Copyright (C) 2020 Supreeth Herle <herlesupreeth@gmail.com>
Harald Weltefc67de22023-05-23 20:29:49 +020013# Copyright (C) 2021-2023 Harald Welte <laforge@osmocom.org>
Supreeth Herle475dcaa2020-03-20 18:57:39 +010014#
15# This program is free software: you can redistribute it and/or modify
16# it under the terms of the GNU General Public License as published by
17# the Free Software Foundation, either version 2 of the License, or
18# (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program. If not, see <http://www.gnu.org/licenses/>.
27#
28
29# Mapping between USIM Service Number and its description
Harald Weltec91085e2022-02-10 18:05:45 +010030import pySim.ts_102_221
31from pySim.ts_51_011 import EF_ACMmax, EF_AAeM, EF_eMLPP, EF_CMI, EF_PNN
32from pySim.ts_51_011 import EF_MMSN, EF_MMSICP, EF_MMSUP, EF_MMSUCP, EF_VGCS, EF_VGCSS, EF_NIA
33from pySim.ts_51_011 import EF_SMSR, EF_DCK, EF_EXT, EF_CNL, EF_OPL, EF_MBI, EF_MWIS
34from pySim.ts_51_011 import EF_CBMID, EF_CBMIR, EF_ADN, EF_SMS, EF_MSISDN, EF_SMSP, EF_SMSS
35from pySim.ts_51_011 import EF_IMSI, EF_xPLMNwAcT, EF_SPN, EF_CBMI, EF_ACC, EF_PLMNsel
Harald Welted90ceb82022-07-17 22:10:58 +020036from pySim.ts_51_011 import EF_Kc, EF_CPBCCH, EF_InvScan
Harald Weltec91085e2022-02-10 18:05:45 +010037from pySim.ts_102_221 import EF_ARR
38from pySim.tlv import *
39from pySim.filesystem import *
Harald Welte6f8a8702022-07-17 21:50:31 +020040from pySim.ts_31_102_telecom import DF_PHONEBOOK, EF_UServiceTable
Harald Weltec91085e2022-02-10 18:05:45 +010041from pySim.construct import *
Harald Weltef56b6b22022-07-30 16:36:06 +020042from pySim.cat import SMS_TPDU, DeviceIdentities, SMSPPDownload
Harald Weltec91085e2022-02-10 18:05:45 +010043from construct import Optional as COptional
44from construct import *
45from typing import Tuple
46from struct import unpack, pack
47import enum
Supreeth Herle475dcaa2020-03-20 18:57:39 +010048EF_UST_map = {
Harald Weltec91085e2022-02-10 18:05:45 +010049 1: 'Local Phone Book',
50 2: 'Fixed Dialling Numbers (FDN)',
51 3: 'Extension 2',
52 4: 'Service Dialling Numbers (SDN)',
53 5: 'Extension3',
54 6: 'Barred Dialling Numbers (BDN)',
55 7: 'Extension4',
56 8: 'Outgoing Call Information (OCI and OCT)',
57 9: 'Incoming Call Information (ICI and ICT)',
58 10: 'Short Message Storage (SMS)',
59 11: 'Short Message Status Reports (SMSR)',
60 12: 'Short Message Service Parameters (SMSP)',
61 13: 'Advice of Charge (AoC)',
62 14: 'Capability Configuration Parameters 2 (CCP2)',
63 15: 'Cell Broadcast Message Identifier',
64 16: 'Cell Broadcast Message Identifier Ranges',
65 17: 'Group Identifier Level 1',
66 18: 'Group Identifier Level 2',
67 19: 'Service Provider Name',
68 20: 'User controlled PLMN selector with Access Technology',
69 21: 'MSISDN',
70 22: 'Image (IMG)',
71 23: 'Support of Localised Service Areas (SoLSA)',
72 24: 'Enhanced Multi-Level Precedence and Pre-emption Service',
73 25: 'Automatic Answer for eMLPP',
74 26: 'RFU',
75 27: 'GSM Access',
76 28: 'Data download via SMS-PP',
77 29: 'Data download via SMS-CB',
78 30: 'Call Control by USIM',
79 31: 'MO-SMS Control by USIM',
80 32: 'RUN AT COMMAND command',
81 33: 'shall be set to 1',
82 34: 'Enabled Services Table',
83 35: 'APN Control List (ACL)',
84 36: 'Depersonalisation Control Keys',
85 37: 'Co-operative Network List',
86 38: 'GSM security context',
87 39: 'CPBCCH Information',
88 40: 'Investigation Scan',
89 41: 'MexE',
90 42: 'Operator controlled PLMN selector with Access Technology',
91 43: 'HPLMN selector with Access Technology',
92 44: 'Extension 5',
93 45: 'PLMN Network Name',
94 46: 'Operator PLMN List',
95 47: 'Mailbox Dialling Numbers',
96 48: 'Message Waiting Indication Status',
97 49: 'Call Forwarding Indication Status',
98 50: 'Reserved and shall be ignored',
99 51: 'Service Provider Display Information',
100 52: 'Multimedia Messaging Service (MMS)',
101 53: 'Extension 8',
102 54: 'Call control on GPRS by USIM',
103 55: 'MMS User Connectivity Parameters',
104 56: 'Network\'s indication of alerting in the MS (NIA)',
105 57: 'VGCS Group Identifier List (EFVGCS and EFVGCSS)',
106 58: 'VBS Group Identifier List (EFVBS and EFVBSS)',
107 59: 'Pseudonym',
108 60: 'User Controlled PLMN selector for I-WLAN access',
109 61: 'Operator Controlled PLMN selector for I-WLAN access',
110 62: 'User controlled WSID list',
111 63: 'Operator controlled WSID list',
112 64: 'VGCS security',
113 65: 'VBS security',
114 66: 'WLAN Reauthentication Identity',
115 67: 'Multimedia Messages Storage',
116 68: 'Generic Bootstrapping Architecture (GBA)',
117 69: 'MBMS security',
118 70: 'Data download via USSD and USSD application mode',
119 71: 'Equivalent HPLMN',
120 72: 'Additional TERMINAL PROFILE after UICC activation',
121 73: 'Equivalent HPLMN Presentation Indication',
122 74: 'Last RPLMN Selection Indication',
123 75: 'OMA BCAST Smart Card Profile',
124 76: 'GBA-based Local Key Establishment Mechanism',
125 77: 'Terminal Applications',
126 78: 'Service Provider Name Icon',
127 79: 'PLMN Network Name Icon',
128 80: 'Connectivity Parameters for USIM IP connections',
129 81: 'Home I-WLAN Specific Identifier List',
130 82: 'I-WLAN Equivalent HPLMN Presentation Indication',
131 83: 'I-WLAN HPLMN Priority Indication',
132 84: 'I-WLAN Last Registered PLMN',
133 85: 'EPS Mobility Management Information',
134 86: 'Allowed CSG Lists and corresponding indications',
135 87: 'Call control on EPS PDN connection by USIM',
136 88: 'HPLMN Direct Access',
137 89: 'eCall Data',
138 90: 'Operator CSG Lists and corresponding indications',
139 91: 'Support for SM-over-IP',
140 92: 'Support of CSG Display Control',
141 93: 'Communication Control for IMS by USIM',
142 94: 'Extended Terminal Applications',
143 95: 'Support of UICC access to IMS',
144 96: 'Non-Access Stratum configuration by USIM',
145 97: 'PWS configuration by USIM',
146 98: 'RFU',
147 99: 'URI support by UICC',
148 100: 'Extended EARFCN support',
149 101: 'ProSe',
150 102: 'USAT Application Pairing',
151 103: 'Media Type support',
152 104: 'IMS call disconnection cause',
153 105: 'URI support for MO SHORT MESSAGE CONTROL',
154 106: 'ePDG configuration Information support',
155 107: 'ePDG configuration Information configured',
156 108: 'ACDC support',
157 109: 'MCPTT',
158 110: 'ePDG configuration Information for Emergency Service support',
159 111: 'ePDG configuration Information for Emergency Service configured',
160 112: 'eCall Data over IMS',
161 113: 'URI support for SMS-PP DOWNLOAD as defined in 3GPP TS 31.111 [12]',
162 114: 'From Preferred',
163 115: 'IMS configuration data',
164 116: 'TV configuration',
165 117: '3GPP PS Data Off',
166 118: '3GPP PS Data Off Service List',
167 119: 'V2X',
168 120: 'XCAP Configuration Data',
169 121: 'EARFCN list for MTC/NB-IOT UEs',
170 122: '5GS Mobility Management Information',
171 123: '5G Security Parameters',
172 124: 'Subscription identifier privacy support',
173 125: 'SUCI calculation by the USIM',
174 126: 'UAC Access Identities support',
175 127: 'Expect control plane-based Steering of Roaming information during initial registration in VPLMN',
176 128: 'Call control on PDU Session by USIM',
177 129: '5GS Operator PLMN List',
178 130: 'Support for SUPI of type NSI or GLI or GCI',
179 131: '3GPP PS Data Off separate Home and Roaming lists',
180 132: 'Support for URSP by USIM',
181 133: '5G Security Parameters extended',
182 134: 'MuD and MiD configuration data',
Harald Weltefc67de22023-05-23 20:29:49 +0200183 135: 'Support for Trusted non-3GPP access networks by USIM',
184 136: 'Support for multiple records of NAS security context storage for multiple registration',
185 137: 'Pre-configured CAG information list',
186 138: 'SOR-CMCI storage in USIM',
187 139: '5G ProSe',
188 140: 'Storage of disaster roaming information in USIM',
189 141: 'Pre-configured eDRX parameters',
190 142: '5G NSWO support',
191 143: 'PWS configuration for SNPN in USIM',
192 144: 'Multiplier Coefficient for Higher Priority PLMN search via NG-RAN satellite access',
193 145: 'K_AUSF derivation configuration',
194 146: 'Network Identifier for SNPN (NID)',
195}
196
197EF_5G_PROSE_ST_map = {
198 1: '5G ProSe configuration data for direct discovery',
199 2: '5G ProSe configuration data for direct communication',
200 3: '5G ProSe configuration data for UE-to-network relay UE',
201 4: '5G ProSe configuration data for remote UE',
202 5: '5G ProSe configuration data for usage information reporting',
Sebastian Viviani0dc8f692020-05-29 00:14:55 +0100203}
204
Harald Weltee8947492022-02-10 10:33:20 +0100205# Mapping between USIM Enbled Service Number and its description
206EF_EST_map = {
207 1: 'Fixed Dialling Numbers (FDN)',
208 2: 'Barred Dialling Numbers (BDN)',
209 3: 'APN Control List (ACL)'
210}
211
Sebastian Vivianie61170c2020-06-03 08:57:00 +0100212LOCI_STATUS_map = {
Harald Weltec91085e2022-02-10 18:05:45 +0100213 0: 'updated',
214 1: 'not updated',
215 2: 'plmn not allowed',
216 3: 'locatation area not allowed'
Sebastian Vivianie61170c2020-06-03 08:57:00 +0100217}
herlesupreetha562ea02020-09-16 20:17:22 +0200218
Sebastian Viviani0dc8f692020-05-29 00:14:55 +0100219EF_USIM_ADF_map = {
Harald Weltec91085e2022-02-10 18:05:45 +0100220 'LI': '6F05',
221 'ARR': '6F06',
222 'IMSI': '6F07',
223 'Keys': '6F08',
224 'KeysPS': '6F09',
225 'DCK': '6F2C',
226 'HPPLMN': '6F31',
227 'CNL': '6F32',
228 'ACMmax': '6F37',
229 'UST': '6F38',
230 'ACM': '6F39',
231 'FDN': '6F3B',
232 'SMS': '6F3C',
233 'GID1': '6F3E',
234 'GID2': '6F3F',
235 'MSISDN': '6F40',
236 'PUCT': '6F41',
237 'SMSP': '6F42',
238 'SMSS': '6F42',
239 'CBMI': '6F45',
240 'SPN': '6F46',
241 'SMSR': '6F47',
242 'CBMID': '6F48',
243 'SDN': '6F49',
244 'EXT2': '6F4B',
245 'EXT3': '6F4C',
246 'BDN': '6F4D',
247 'EXT5': '6F4E',
248 'CCP2': '6F4F',
249 'CBMIR': '6F50',
250 'EXT4': '6F55',
251 'EST': '6F56',
252 'ACL': '6F57',
253 'CMI': '6F58',
254 'START-HFN': '6F5B',
255 'THRESHOLD': '6F5C',
256 'PLMNwAcT': '6F60',
257 'OPLMNwAcT': '6F61',
258 'HPLMNwAcT': '6F62',
259 'PSLOCI': '6F73',
260 'ACC': '6F78',
261 'FPLMN': '6F7B',
262 'LOCI': '6F7E',
263 'ICI': '6F80',
264 'OCI': '6F81',
265 'ICT': '6F82',
266 'OCT': '6F83',
267 'AD': '6FAD',
268 'VGCS': '6FB1',
269 'VGCSS': '6FB2',
270 'VBS': '6FB3',
271 'VBSS': '6FB4',
272 'eMLPP': '6FB5',
273 'AAeM': '6FB6',
274 'ECC': '6FB7',
275 'Hiddenkey': '6FC3',
276 'NETPAR': '6FC4',
277 'PNN': '6FC5',
278 'OPL': '6FC6',
279 'MBDN': '6FC7',
280 'EXT6': '6FC8',
281 'MBI': '6FC9',
282 'MWIS': '6FCA',
283 'CFIS': '6FCB',
284 'EXT7': '6FCC',
285 'SPDI': '6FCD',
286 'MMSN': '6FCE',
287 'EXT8': '6FCF',
288 'MMSICP': '6FD0',
289 'MMSUP': '6FD1',
290 'MMSUCP': '6FD2',
291 'NIA': '6FD3',
292 'VGCSCA': '6FD4',
293 'VBSCA': '6FD5',
294 'GBAP': '6FD6',
295 'MSK': '6FD7',
296 'MUK': '6FD8',
297 'EHPLMN': '6FD9',
298 'GBANL': '6FDA',
299 'EHPLMNPI': '6FDB',
300 'LRPLMNSI': '6FDC',
301 'NAFKCA': '6FDD',
302 'SPNI': '6FDE',
303 'PNNI': '6FDF',
304 'NCP-IP': '6FE2',
305 'EPSLOCI': '6FE3',
306 'EPSNSC': '6FE4',
307 'UFC': '6FE6',
308 'UICCIARI': '6FE7',
309 'NASCONFIG': '6FE8',
310 'PWC': '6FEC',
311 'FDNURI': '6FED',
312 'BDNURI': '6FEE',
313 'SDNURI': '6FEF',
314 'IWL': '6FF0',
315 'IPS': '6FF1',
316 'IPD': '6FF2',
317 'ePDGId': '6FF3',
318 'ePDGSelection': '6FF4',
319 'ePDGIdEm': '6FF5',
320 'ePDGSelectionEm': '6FF6',
Sebastian Viviani0dc8f692020-05-29 00:14:55 +0100321}
Harald Welteb2edd142021-01-08 23:29:35 +0100322
Harald Welte21caf322022-07-16 14:06:46 +0200323# 3gPP TS 31.102 Section 7.5.2.1
324class SUCI_TlvDataObject(BER_TLV_IE, tag=0xA1):
325 _construct = HexAdapter(GreedyBytes)
326
Harald Welteb2edd142021-01-08 23:29:35 +0100327######################################################################
328# ADF.USIM
329######################################################################
330
Harald Welteb2edd142021-01-08 23:29:35 +0100331
Harald Weltef12979d2021-05-29 21:47:13 +0200332# 3GPP TS 31.102 Section 4.4.11.4 (EF_5GS3GPPNSC)
333class EF_5GS3GPPNSC(LinFixedEF):
334 class NgKSI(BER_TLV_IE, tag=0x80):
335 _construct = Int8ub
336
337 class K_AMF(BER_TLV_IE, tag=0x81):
338 _construct = HexAdapter(Bytes(32))
339
340 class UplinkNASCount(BER_TLV_IE, tag=0x82):
341 _construct = Int32ub
342
343 class DownlinkNASCount(BER_TLV_IE, tag=0x83):
344 _construct = Int32ub
345
346 class IdsOfSelectedNasAlgos(BER_TLV_IE, tag=0x84):
347 # 3GPP TS 24.501 Section 9.11.3.34
348 _construct = BitStruct('ciphering'/Nibble, 'integrity'/Nibble)
349
350 class IdsOfSelectedEpsAlgos(BER_TLV_IE, tag=0x85):
351 # 3GPP TS 24.301 Section 9.9.3.23
352 _construct = BitStruct('ciphering'/Nibble, 'integrity'/Nibble)
353
354 class FiveGSNasSecurityContext(BER_TLV_IE, tag=0xA0,
Harald Weltec91085e2022-02-10 18:05:45 +0100355 nested=[NgKSI, K_AMF, UplinkNASCount,
356 DownlinkNASCount, IdsOfSelectedNasAlgos,
357 IdsOfSelectedEpsAlgos]):
Harald Weltef12979d2021-05-29 21:47:13 +0200358 pass
359
Harald Welte99e4cc02022-07-21 15:25:47 +0200360 def __init__(self, fid="4f03", sfid=0x03, name='EF.5GS3GPPNSC', rec_len=(57, None),
Harald Welte419bb492022-02-12 21:39:35 +0100361 desc='5GS 3GPP Access NAS Security Context', **kwargs):
362 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte65516272022-02-10 17:51:05 +0100363 self._tlv = EF_5GS3GPPNSC.FiveGSNasSecurityContext
Harald Weltef12979d2021-05-29 21:47:13 +0200364
365# 3GPP TS 31.102 Section 4.4.11.6
366class EF_5GAUTHKEYS(TransparentEF):
367 class K_AUSF(BER_TLV_IE, tag=0x80):
368 _construct = HexAdapter(GreedyBytes)
369
370 class K_SEAF(BER_TLV_IE, tag=0x81):
371 _construct = HexAdapter(GreedyBytes)
372
373 class FiveGAuthKeys(TLV_IE_Collection, nested=[K_AUSF, K_SEAF]):
374 pass
375
Harald Welte13edf302022-07-21 15:19:23 +0200376 def __init__(self, fid='4f05', sfid=0x05, name='EF.5GAUTHKEYS', size=(68, None),
Harald Welte419bb492022-02-12 21:39:35 +0100377 desc='5G authentication keys', **kwargs):
378 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte65516272022-02-10 17:51:05 +0100379 self._tlv = EF_5GAUTHKEYS.FiveGAuthKeys
Harald Weltef12979d2021-05-29 21:47:13 +0200380
381# 3GPP TS 31.102 Section 4.4.11.8
382class ProtSchemeIdList(BER_TLV_IE, tag=0xa0):
383 # FIXME: 3GPP TS 24.501 Protection Scheme Identifier
384 # repeated sequence of (id, index) tuples
Harald Weltec91085e2022-02-10 18:05:45 +0100385 _construct = GreedyRange(
386 Struct('id'/Enum(Byte, null=0, A=1, B=2), 'index'/Int8ub))
387
Harald Weltef12979d2021-05-29 21:47:13 +0200388
389class HomeNetPubKeyId(BER_TLV_IE, tag=0x80):
390 # 3GPP TS 24.501 / 3GPP TS 23.003
391 _construct = Int8ub
392
Harald Weltec91085e2022-02-10 18:05:45 +0100393
Harald Weltef12979d2021-05-29 21:47:13 +0200394class HomeNetPubKey(BER_TLV_IE, tag=0x81):
395 # FIXME: RFC 5480
396 _construct = HexAdapter(GreedyBytes)
397
Harald Weltec91085e2022-02-10 18:05:45 +0100398
Harald Weltef12979d2021-05-29 21:47:13 +0200399class HomeNetPubKeyList(BER_TLV_IE, tag=0xa1,
Harald Weltec91085e2022-02-10 18:05:45 +0100400 nested=[HomeNetPubKeyId, HomeNetPubKey]):
Harald Weltef12979d2021-05-29 21:47:13 +0200401 pass
402
403# 3GPP TS 31.102 Section 4.4.11.6
Harald Weltec91085e2022-02-10 18:05:45 +0100404class SUCI_CalcInfo(TLV_IE_Collection, nested=[ProtSchemeIdList, HomeNetPubKeyList]):
Harald Weltef12979d2021-05-29 21:47:13 +0200405 pass
406
407
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200408# TS 31.102 4.4.11.8
409class EF_SUCI_Calc_Info(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200410 def __init__(self, fid="4f07", sfid=0x07, name='EF.SUCI_Calc_Info', size=(2, None),
Harald Welte419bb492022-02-12 21:39:35 +0100411 desc='SUCI Calc Info', **kwargs):
412 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200413
414 def _encode_prot_scheme_id_list(self, in_list):
415 out_bytes = [0xa0]
Harald Weltec91085e2022-02-10 18:05:45 +0100416 out_bytes.append(len(in_list)*2) # two byte per entry
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200417
418 # position in list determines priority; high-priority items (low index) come first
419 for scheme in sorted(in_list, key=lambda item: item["priority"]):
420 out_bytes.append(scheme["identifier"])
421 out_bytes.append(scheme["key_index"])
422
423 return out_bytes
424
425 def _encode_hnet_pubkey_list(self, hnet_pubkey_list):
Harald Weltec91085e2022-02-10 18:05:45 +0100426 out_bytes = [0xa1] # pubkey list tag
427 out_bytes.append(0x00) # length filled later
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200428 length = 0
429
430 for key in hnet_pubkey_list:
Harald Weltec91085e2022-02-10 18:05:45 +0100431 out_bytes.append(0x80) # identifier tag
432 out_bytes.append(0x01) # TODO size, fixed to 1 byte
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200433 out_bytes.append(key["hnet_pubkey_identifier"])
Harald Weltec91085e2022-02-10 18:05:45 +0100434 out_bytes.append(0x81) # key tag
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200435 out_bytes.append(len(key["hnet_pubkey"])//2)
436 length += 5+len(key["hnet_pubkey"])//2
437
438 pubkey_bytes = h2b(key["hnet_pubkey"])
439 out_bytes += pubkey_bytes
440
441 # fill length
442 out_bytes[1] = length
443 return out_bytes
444
445 def _encode_hex(self, in_json):
Harald Weltec91085e2022-02-10 18:05:45 +0100446 out_bytes = self._encode_prot_scheme_id_list(
447 in_json['prot_scheme_id_list'])
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200448 out_bytes += self._encode_hnet_pubkey_list(in_json['hnet_pubkey_list'])
449 return "".join(["%02X" % i for i in out_bytes])
450
451 def _decode_prot_scheme_id_list(self, in_bytes):
452 prot_scheme_id_list = []
453 pos = 0
454 # two bytes per entry
455 while pos < len(in_bytes):
456 prot_scheme = {
Harald Weltec91085e2022-02-10 18:05:45 +0100457 'priority': pos//2, # first in list: high priority
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200458 'identifier': in_bytes[pos],
459 'key_index': in_bytes[pos+1]
460 }
461 pos += 2
462 prot_scheme_id_list.append(prot_scheme)
463 return prot_scheme_id_list
464
465 def _decode_hnet_pubkey_list(self, in_bytes):
466 hnet_pubkey_list = []
467 pos = 0
468 if in_bytes[pos] != 0xa1:
469 print("missing Home Network Public Key List data object")
470 return {}
471 pos += 1
472 hnet_pubkey_list_len = in_bytes[pos]
473 pos += 1
474
475 while pos < hnet_pubkey_list_len:
476 if in_bytes[pos] != 0x80:
477 print("missing Home Network Public Key Identifier tag")
478 return {}
479 pos += 1
Harald Weltec91085e2022-02-10 18:05:45 +0100480 # TODO might be more than 1 byte?
481 hnet_pubkey_id_len = in_bytes[pos]
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200482 pos += 1
483 hnet_pubkey_id = in_bytes[pos:pos+hnet_pubkey_id_len][0]
484 pos += hnet_pubkey_id_len
485 if in_bytes[pos] != 0x81:
486 print("missing Home Network Public Key tag")
487 return {}
488 pos += 1
489 hnet_pubkey_len = in_bytes[pos]
490 pos += 1
491 hnet_pubkey = in_bytes[pos:pos+hnet_pubkey_len]
492 pos += hnet_pubkey_len
493
494 hnet_pubkey_list.append({
495 'hnet_pubkey_identifier': hnet_pubkey_id,
496 'hnet_pubkey': b2h(hnet_pubkey)
497 })
498
499 return hnet_pubkey_list
500
501 def _decode_bin(self, in_bin):
Vadim Yanitskiy5e41eeb2021-05-02 02:20:33 +0200502 return self._decode_hex(b2h(in_bin))
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200503
504 def _decode_hex(self, in_hex):
505 in_bytes = h2b(in_hex)
506 pos = 0
507
508 if in_bytes[pos] != 0xa0:
509 print("missing Protection Scheme Identifier List data object tag")
510 return {}
511 pos += 1
512
Harald Weltec91085e2022-02-10 18:05:45 +0100513 prot_scheme_id_list_len = in_bytes[pos] # TODO maybe more than 1 byte
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200514 pos += 1
515 # decode Protection Scheme Identifier List data object
Harald Weltec91085e2022-02-10 18:05:45 +0100516 prot_scheme_id_list = self._decode_prot_scheme_id_list(
517 in_bytes[pos:pos+prot_scheme_id_list_len])
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200518 pos += prot_scheme_id_list_len
519
520 # remaining data holds Home Network Public Key Data Object
521 hnet_pubkey_list = self._decode_hnet_pubkey_list(in_bytes[pos:])
522
523 return {
524 'prot_scheme_id_list': prot_scheme_id_list,
525 'hnet_pubkey_list': hnet_pubkey_list
526 }
527
528 def _encode_bin(self, in_json):
529 return h2b(self._encode_hex(in_json))
530
Harald Weltec91085e2022-02-10 18:05:45 +0100531
Harald Welteb2edd142021-01-08 23:29:35 +0100532class EF_LI(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200533 def __init__(self, fid='6f05', sfid=None, name='EF.LI', size=(2, None), rec_len=2,
Harald Welteb2edd142021-01-08 23:29:35 +0100534 desc='Language Indication'):
535 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)
Harald Weltec91085e2022-02-10 18:05:45 +0100536
Harald Weltef6b37af2023-01-24 15:42:26 +0100537 def _decode_record_bin(self, in_bin, **kwargs):
Harald Welteb2edd142021-01-08 23:29:35 +0100538 if in_bin == b'\xff\xff':
539 return None
540 else:
541 # officially this is 7-bit GSM alphabet with one padding bit in each byte
542 return in_bin.decode('ascii')
Harald Weltec91085e2022-02-10 18:05:45 +0100543
Harald Weltef6b37af2023-01-24 15:42:26 +0100544 def _encode_record_bin(self, in_json, **kwargs):
Harald Welteb2edd142021-01-08 23:29:35 +0100545 if in_json == None:
546 return b'\xff\xff'
547 else:
548 # officially this is 7-bit GSM alphabet with one padding bit in each byte
549 return in_json.encode('ascii')
550
Harald Weltec91085e2022-02-10 18:05:45 +0100551
Harald Welteb2edd142021-01-08 23:29:35 +0100552class EF_Keys(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200553 def __init__(self, fid='6f08', sfid=0x08, name='EF.Keys', size=(33, 33),
Harald Welteb2edd142021-01-08 23:29:35 +0100554 desc='Ciphering and Integrity Keys'):
555 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Weltec91085e2022-02-10 18:05:45 +0100556 self._construct = Struct(
557 'ksi'/Int8ub, 'ck'/HexAdapter(Bytes(16)), 'ik'/HexAdapter(Bytes(16)))
Harald Welteb2edd142021-01-08 23:29:35 +0100558
Harald Welte14105dc2021-05-31 08:48:51 +0200559# TS 31.102 Section 4.2.6
560class EF_HPPLMN(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100561 _test_de_encode = [ ( '05', 5 ) ]
Harald Welte13edf302022-07-21 15:19:23 +0200562 def __init__(self, fid='6f31', sfid=0x12, name='EF.HPPLMN', size=(1, 1),
Harald Welte14105dc2021-05-31 08:48:51 +0200563 desc='Higher Priority PLMN search period'):
564 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
565 self._construct = Int8ub
566
Harald Welte6ca2fa72022-02-12 16:29:31 +0100567class EF_UST(EF_UServiceTable):
568 def __init__(self, **kwargs):
Harald Welte13edf302022-07-21 15:19:23 +0200569 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 +0100570 # add those commands to the general commands of a TransparentEF
571 self.shell_commands += [self.AddlShellCommands()]
572
Harald Welteb2edd142021-01-08 23:29:35 +0100573 @with_default_category('File-Specific Commands')
574 class AddlShellCommands(CommandSet):
575 def __init__(self):
576 super().__init__()
577
578 def do_ust_service_activate(self, arg):
579 """Activate a service within EF.UST"""
580 self._cmd.card.update_ust(int(arg), 1)
581
582 def do_ust_service_deactivate(self, arg):
583 """Deactivate a service within EF.UST"""
584 self._cmd.card.update_ust(int(arg), 0)
585
Harald Welte4c5e2312022-02-12 14:37:48 +0100586 def do_ust_service_check(self, arg):
Harald Welte3bb516b2022-02-12 21:53:18 +0100587 """Check consistency between services of this file and files present/activated.
588
589 Many services determine if one or multiple files shall be present/activated or if they shall be
590 absent/deactivated. This performs a consistency check to ensure that no services are activated
591 for files that are not - and vice-versa, no files are activated for services that are not. Error
592 messages are printed for every inconsistency found."""
Harald Weltea6c0f882022-07-17 14:23:17 +0200593 selected_file = self._cmd.lchan.selected_file
Harald Welte82f75c22022-02-12 18:22:28 +0100594 num_problems = selected_file.ust_service_check(self._cmd)
595 # obtain list of currently active services
596 active_services = selected_file.get_active_services(self._cmd)
597 # Service n°46 can only be declared "available" if service n°45 is declared "available"
598 if 46 in active_services and not 45 in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100599 self._cmd.perror("ERROR: Service 46 available, but it requires Service 45")
Harald Welte82f75c22022-02-12 18:22:28 +0100600 num_problems += 1
601 # Service n°125 shall only be taken into account if Service n°124 is declared "available"
602 if 125 in active_services and not 124 in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100603 self._cmd.perror("ERROR: Service 125 is ignored as Service 124 not available")
Harald Welte82f75c22022-02-12 18:22:28 +0100604 num_problems += 1
605 # Service n°95, n°99 and n°115 shall not be declared "available" if an ISIM application is present on the UICC
606 non_isim_services = [95, 99, 115]
607 app_names = selected_file.get_mf().get_app_names()
608 if 'ADF.ISIM' in app_names:
609 for s in non_isim_services:
610 if s in active_services:
Harald Weltefa8b8d12022-02-12 18:30:28 +0100611 self._cmd.perror("ERROR: Service %u shall not be available as ISIM application is present" % s)
Harald Welte82f75c22022-02-12 18:22:28 +0100612 num_problems += 1
613 self._cmd.poutput("===> %u service / file inconsistencies detected" % num_problems)
Harald Welte4c5e2312022-02-12 14:37:48 +0100614
615
Harald Welte89e59542021-04-02 21:33:13 +0200616# TS 31.103 Section 4.2.7 - *not* the same as DF.GSM/EF.ECC!
617class EF_ECC(LinFixedEF):
Harald Welte865eea62023-01-27 19:26:12 +0100618 _test_de_encode = [
619 ( '19f1ff01', { "call_code": "911f",
620 "service_category": { "police": True, "ambulance": False, "fire_brigade": False,
621 "marine_guard": False, "mountain_rescue": False,
622 "manual_ecall": False, "automatic_ecall": False } } ),
623 ( '19f3ff02', { "call_code": "913f",
624 "service_category": { "police": False, "ambulance": True, "fire_brigade": False,
625 "marine_guard": False, "mountain_rescue": False,
626 "manual_ecall": False, "automatic_ecall": False } } ),
627 ]
628 cc_construct = BcdAdapter(Rpad(Bytes(3)))
Harald Welteff2d86d2022-01-21 15:19:47 +0100629 category_construct = FlagsEnum(Byte, police=1, ambulance=2, fire_brigade=3, marine_guard=4,
630 mountain_rescue=5, manual_ecall=6, automatic_ecall=7)
631 alpha_construct = GsmStringAdapter(Rpad(GreedyBytes))
Harald Weltec91085e2022-02-10 18:05:45 +0100632
Harald Welte89e59542021-04-02 21:33:13 +0200633 def __init__(self, fid='6fb7', sfid=0x01, name='EF.ECC',
634 desc='Emergency Call Codes'):
Harald Welte99e4cc02022-07-21 15:25:47 +0200635 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=(4, 20))
Harald Weltec91085e2022-02-10 18:05:45 +0100636
Harald Weltef6b37af2023-01-24 15:42:26 +0100637 def _decode_record_bin(self, in_bin, **kwargs):
Harald Welteff2d86d2022-01-21 15:19:47 +0100638 # mandatory parts
639 code = in_bin[:3]
640 if code == b'\xff\xff\xff':
641 return None
642 svc_category = in_bin[-1:]
643 ret = {'call_code': parse_construct(EF_ECC.cc_construct, code),
Harald Weltec91085e2022-02-10 18:05:45 +0100644 'service_category': parse_construct(EF_ECC.category_construct, svc_category)}
Harald Welteff2d86d2022-01-21 15:19:47 +0100645 # optional alpha identifier
646 if len(in_bin) > 4:
647 alpha_id = in_bin[3:-1]
648 ret['alpha_id'] = parse_construct(EF_ECC.alpha_construct, alpha_id)
649 return ret
Harald Weltec91085e2022-02-10 18:05:45 +0100650
Harald Weltef6b37af2023-01-24 15:42:26 +0100651 def _encode_record_bin(self, in_json, **kwargs):
Harald Welteff2d86d2022-01-21 15:19:47 +0100652 if in_json is None:
653 return b'\xff\xff\xff\xff'
654 code = EF_ECC.cc_construct.build(in_json['call_code'])
Harald Welte9b9efb62023-01-31 16:40:54 +0100655 svc_category = EF_ECC.category_construct.build(in_json['service_category'])
656 if 'alpha_id' in in_json:
657 alpha_id = EF_ECC.alpha_construct.build(in_json['alpha_id'])
658 # FIXME: alpha_id needs padding up to 'record_length - 4'
659 else:
660 alpha_id = b''
Harald Welteff2d86d2022-01-21 15:19:47 +0100661 return code + alpha_id + svc_category
662
Harald Welte89e59542021-04-02 21:33:13 +0200663
Harald Welte790b2702021-04-11 00:01:35 +0200664# TS 31.102 Section 4.2.17
665class EF_LOCI(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100666 _test_de_encode = [
667 ( '47d1264a62f21037211e00',
668 { "tmsi": "47d1264a", "lai": { "mcc_mnc": "262f01", "lac": "3721" },
669 "rfu": 30, "lu_status": 0 } ),
670 ]
Harald Welte13edf302022-07-21 15:19:23 +0200671 def __init__(self, fid='6f7e', sfid=0x0b, name='EF.LOCI', desc='Location information', size=(11, 11)):
Harald Welte790b2702021-04-11 00:01:35 +0200672 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Welte3a5afff2022-02-25 15:33:46 +0100673 Lai = Struct('mcc_mnc'/BcdAdapter(Bytes(3)), 'lac'/HexAdapter(Bytes(2)))
674 self._construct = Struct('tmsi'/HexAdapter(Bytes(4)), 'lai'/Lai, 'rfu'/Int8ub, 'lu_status'/Int8ub)
Harald Welte865eea62023-01-27 19:26:12 +0100675
Harald Welte592b32e2021-06-05 11:26:36 +0200676# TS 31.102 Section 4.2.18
677class EF_AD(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100678 _test_de_encode = [
679 ( '00000002', { "ms_operation_mode": "normal",
680 "additional_info": { "ciphering_indicator": False, "csg_display_control": False,
681 "prose_services": False, "extended_drx": False },
682 "rfu": 0, "mnc_len": 2, "extensions": b'' } ),
683 ( '01000102', { "ms_operation_mode": "normal_and_specific_facilities",
684 "additional_info": { "ciphering_indicator": True, "csg_display_control": False,
685 "prose_services": False, "extended_drx": False },
686 "rfu": 0, "mnc_len": 2, "extensions": b'' } ),
687 ]
Harald Welte592b32e2021-06-05 11:26:36 +0200688 class OP_MODE(enum.IntEnum):
Harald Weltec91085e2022-02-10 18:05:45 +0100689 normal = 0x00
690 type_approval = 0x80
691 normal_and_specific_facilities = 0x01
692 type_approval_and_specific_facilities = 0x81
693 maintenance_off_line = 0x02
694 cell_test = 0x04
Harald Welte592b32e2021-06-05 11:26:36 +0200695
Harald Welte13edf302022-07-21 15:19:23 +0200696 def __init__(self, fid='6fad', sfid=0x03, name='EF.AD', desc='Administrative Data', size=(4, 6)):
Harald Welte592b32e2021-06-05 11:26:36 +0200697 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
698 self._construct = BitStruct(
699 # Byte 1
700 'ms_operation_mode'/Bytewise(Enum(Byte, EF_AD.OP_MODE)),
701 # Byte 2 + 3
702 'additional_info'/Bytewise(FlagsEnum(Int16ub, ciphering_indicator=1, csg_display_control=2,
703 prose_services=4, extended_drx=8)),
704 'rfu'/BitsRFU(4),
705 'mnc_len'/BitsInteger(4),
706 'extensions'/COptional(Bytewise(GreedyBytesRFU))
707 )
Harald Welte790b2702021-04-11 00:01:35 +0200708
709# TS 31.102 Section 4.2.23
710class EF_PSLOCI(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200711 def __init__(self, fid='6f73', sfid=0x0c, name='EF.PSLOCI', desc='PS Location information', size=(14, 14)):
Harald Welte790b2702021-04-11 00:01:35 +0200712 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
713 self._construct = Struct('ptmsi'/HexAdapter(Bytes(4)), 'ptmsi_sig'/HexAdapter(Bytes(3)),
714 'rai'/HexAdapter(Bytes(6)), 'rau_status'/Int8ub)
715
716# TS 31.102 Section 4.2.33
717class EF_ICI(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200718 def __init__(self, fid='6f80', sfid=0x14, name='EF.ICI', rec_len=(28, 48),
Harald Welte6169c722022-02-12 09:05:15 +0100719 desc='Incoming Call Information', **kwargs):
720 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200721 self._construct = Struct('alpha_id'/HexAdapter(Bytes(this._.total_len-28)),
Harald Welte790b2702021-04-11 00:01:35 +0200722 'len_of_bcd_contents'/Int8ub,
723 'ton_npi'/Int8ub,
724 'call_number'/BcdAdapter(Bytes(10)),
725 'cap_cfg2_record_id'/Int8ub,
726 'ext5_record_id'/Int8ub,
727 'date_and_time'/BcdAdapter(Bytes(7)),
728 'duration'/Int24ub,
729 'status'/Byte,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200730 'link_to_phonebook'/HexAdapter(Bytes(3)))
Harald Welte790b2702021-04-11 00:01:35 +0200731
732# TS 31.102 Section 4.2.34
733class EF_OCI(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200734 def __init__(self, fid='6f81', sfid=0x15, name='EF.OCI', rec_len=(27, 47),
Harald Welte6169c722022-02-12 09:05:15 +0100735 desc='Outgoing Call Information', **kwargs):
736 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200737 self._construct = Struct('alpha_id'/HexAdapter(Bytes(this._.total_len-27)),
Harald Welte790b2702021-04-11 00:01:35 +0200738 'len_of_bcd_contents'/Int8ub,
739 'ton_npi'/Int8ub,
740 'call_number'/BcdAdapter(Bytes(10)),
741 'cap_cfg2_record_id'/Int8ub,
742 'ext5_record_id'/Int8ub,
743 'date_and_time'/BcdAdapter(Bytes(7)),
744 'duration'/Int24ub,
Harald Welte3c98d5e2022-07-20 07:40:05 +0200745 'link_to_phonebook'/HexAdapter(Bytes(3)))
Harald Welte790b2702021-04-11 00:01:35 +0200746
747# TS 31.102 Section 4.2.35
748class EF_ICT(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200749 def __init__(self, fid='6f82', sfid=None, name='EF.ICT', rec_len=(3, 3),
Harald Welte6169c722022-02-12 09:05:15 +0100750 desc='Incoming Call Timer', **kwargs):
751 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200752 self._construct = Struct('accumulated_call_timer'/Int24ub)
753
754# TS 31.102 Section 4.2.38
755class EF_CCP2(LinFixedEF):
Harald Welte6169c722022-02-12 09:05:15 +0100756 def __init__(self, fid='6f4f', sfid=0x16, name='EF.CCP2', desc='Capability Configuration Parameters 2', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200757 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(15, None), **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200758
Harald Welte6ca2fa72022-02-12 16:29:31 +0100759# TS 31.102 Section 4.2.47
760class EF_EST(EF_UServiceTable):
761 def __init__(self, **kwargs):
Harald Welte13edf302022-07-21 15:19:23 +0200762 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 +0100763 # add those commands to the general commands of a TransparentEF
764 self.shell_commands += [self.AddlShellCommands()]
765
766 @with_default_category('File-Specific Commands')
767 class AddlShellCommands(CommandSet):
768 def __init__(self):
769 super().__init__()
770
Harald Welte18b75392023-02-23 10:00:51 +0100771 def do_est_service_enable(self, arg):
772 """Enable a service within EF.UST"""
Harald Welte6ca2fa72022-02-12 16:29:31 +0100773 self._cmd.card.update_est(int(arg), 1)
774
Harald Welte18b75392023-02-23 10:00:51 +0100775 def do_est_service_disable(self, arg):
776 """Disable a service within EF.UST"""
Harald Welte6ca2fa72022-02-12 16:29:31 +0100777 self._cmd.card.update_est(int(arg), 0)
778
Harald Welte790b2702021-04-11 00:01:35 +0200779# TS 31.102 Section 4.2.48
780class EF_ACL(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200781 def __init__(self, fid='6f57', sfid=None, name='EF.ACL', size=(32, None),
Harald Welte6169c722022-02-12 09:05:15 +0100782 desc='Access Point Name Control List', **kwargs):
783 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200784 self._construct = Struct('num_of_apns'/Int8ub, 'tlvs'/HexAdapter(GreedyBytes))
Harald Welte790b2702021-04-11 00:01:35 +0200785
786# TS 31.102 Section 4.2.51
787class EF_START_HFN(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100788 _test_de_encode = [
789 ( 'f00000f00000', { "start_cs": 15728640, "start_ps": 15728640 } ),
790 ]
Harald Welte13edf302022-07-21 15:19:23 +0200791 def __init__(self, fid='6f5b', sfid=0x0f, name='EF.START-HFN', size=(6, 6),
Harald Welte6169c722022-02-12 09:05:15 +0100792 desc='Initialisation values for Hyperframe number', **kwargs):
793 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200794 self._construct = Struct('start_cs'/Int24ub, 'start_ps'/Int24ub)
795
796# TS 31.102 Section 4.2.52
797class EF_THRESHOLD(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100798 _test_de_encode = [
799 ( 'f01000', { "max_start": 15732736 } ),
800 ]
Harald Welte13edf302022-07-21 15:19:23 +0200801 def __init__(self, fid='6f5c', sfid=0x10, name='EF.THRESHOLD', size=(3, 3),
Harald Welte6169c722022-02-12 09:05:15 +0100802 desc='Maximum value of START', **kwargs):
803 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200804 self._construct = Struct('max_start'/Int24ub)
805
Harald Welte363edd92022-07-17 22:24:03 +0200806# TS 31.102 (old releases like 3.8.0) Section 4.2.56
807class EF_RPLMNAcT(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200808 def __init__(self, fid='6f65', sfid=None, name='EF.RPLMNAcTD', size=(2, 4), rec_len=2,
Harald Welte363edd92022-07-17 22:24:03 +0200809 desc='RPLMN Last used Access Technology', **kwargs):
810 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len, **kwargs)
Harald Weltef6b37af2023-01-24 15:42:26 +0100811 def _decode_record_hex(self, in_hex, **kwargs):
Harald Welte363edd92022-07-17 22:24:03 +0200812 return dec_act(in_hex)
813 # TODO: Encode
814
Harald Welte790b2702021-04-11 00:01:35 +0200815# TS 31.102 Section 4.2.77
816class EF_VGCSCA(TransRecEF):
Harald Welte13edf302022-07-21 15:19:23 +0200817 def __init__(self, fid='6fd4', sfid=None, name='EF.VGCSCA', size=(2, 100), rec_len=2,
Harald Welte6169c722022-02-12 09:05:15 +0100818 desc='Voice Group Call Service Ciphering Algorithm', **kwargs):
819 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200820 self._construct = Struct('alg_v_ki_1'/Int8ub, 'alg_v_ki_2'/Int8ub)
821
822# TS 31.102 Section 4.2.79
823class EF_GBABP(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200824 def __init__(self, fid='6fd6', sfid=None, name='EF.GBABP', size=(3, 50),
Harald Welte6169c722022-02-12 09:05:15 +0100825 desc='GBA Bootstrapping parameters', **kwargs):
826 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200827 self._construct = Struct('rand'/LV, 'b_tid'/LV, 'key_lifetime'/LV)
828
829# TS 31.102 Section 4.2.80
830class EF_MSK(LinFixedEF):
Harald Welte6169c722022-02-12 09:05:15 +0100831 def __init__(self, fid='6fd7', sfid=None, name='EF.MSK', desc='MBMS Service Key List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200832 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(20, None), **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200833 msk_ts_constr = Struct('msk_id'/Int32ub, 'timestamp_counter'/Int32ub)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200834 self._construct = Struct('key_domain_id'/HexAdapter(Bytes(3)),
Harald Welte790b2702021-04-11 00:01:35 +0200835 'num_msk_id'/Int8ub,
836 'msk_ids'/msk_ts_constr[this.num_msk_id])
Harald Welte14105dc2021-05-31 08:48:51 +0200837# TS 31.102 Section 4.2.81
838class EF_MUK(LinFixedEF):
839 class MUK_Idr(BER_TLV_IE, tag=0x80):
840 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100841
Harald Welte14105dc2021-05-31 08:48:51 +0200842 class MUK_Idi(BER_TLV_IE, tag=0x82):
843 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100844
Harald Welte14105dc2021-05-31 08:48:51 +0200845 class MUK_ID(BER_TLV_IE, tag=0xA0, nested=[MUK_Idr, MUK_Idi]):
846 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100847
Harald Welte14105dc2021-05-31 08:48:51 +0200848 class TimeStampCounter(BER_TLV_IE, tag=0x81):
849 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100850
Harald Welte14105dc2021-05-31 08:48:51 +0200851 class EF_MUK_Collection(TLV_IE_Collection, nested=[MUK_ID, TimeStampCounter]):
852 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100853
Harald Welte6169c722022-02-12 09:05:15 +0100854 def __init__(self, fid='6fd8', sfid=None, name='EF.MUK', desc='MBMS User Key', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200855 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(None, None), **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200856 self._tlv = EF_MUK.EF_MUK_Collection
857
858# TS 31.102 Section 4.2.83
859class EF_GBANL(LinFixedEF):
860 class NAF_ID(BER_TLV_IE, tag=0x80):
861 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100862
Harald Welte14105dc2021-05-31 08:48:51 +0200863 class B_TID(BER_TLV_IE, tag=0x81):
864 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100865
Harald Welte14105dc2021-05-31 08:48:51 +0200866 class EF_GBANL_Collection(BER_TLV_IE, nested=[NAF_ID, B_TID]):
867 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100868
Harald Welte6169c722022-02-12 09:05:15 +0100869 def __init__(self, fid='6fda', sfid=None, name='EF.GBANL', desc='GBA NAF List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +0200870 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(None, None), **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200871 self._tlv = EF_GBANL.EF_GBANL_Collection
Harald Welte790b2702021-04-11 00:01:35 +0200872
873# TS 31.102 Section 4.2.85
874class EF_EHPLMNPI(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100875 _test_de_encode = [
876 ( '02', { "presentation_ind": "display_all" } ),
877 ]
Harald Welte13edf302022-07-21 15:19:23 +0200878 def __init__(self, fid='6fdb', sfid=None, name='EF.EHPLMNPI', size=(1, 1),
Harald Welte6169c722022-02-12 09:05:15 +0100879 desc='Equivalent HPLMN Presentation Indication', **kwargs):
880 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100881 self._construct = Struct('presentation_ind' /
Harald Welte790b2702021-04-11 00:01:35 +0200882 Enum(Byte, no_preference=0, display_highest_prio_only=1, display_all=2))
Harald Welte14105dc2021-05-31 08:48:51 +0200883
884# TS 31.102 Section 4.2.87
885class EF_NAFKCA(LinFixedEF):
886 class NAF_KeyCentreAddress(BER_TLV_IE, tag=0x80):
887 _construct = HexAdapter(GreedyBytes)
Harald Welte99e4cc02022-07-21 15:25:47 +0200888 def __init__(self, fid='6fdd', sfid=None, name='EF.NAFKCA', rec_len=(None, None),
Harald Welte6169c722022-02-12 09:05:15 +0100889 desc='NAF Key Centre Address', **kwargs):
890 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200891 self._tlv = EF_NAFKCA.NAF_KeyCentreAddress
892
893# TS 31.102 Section 4.2.90
894class EF_NCP_IP(LinFixedEF):
895 class DataDestAddrRange(TLV_IE, tag=0x83):
896 _construct = Struct('type_of_address'/Enum(Byte, IPv4=0x21, IPv6=0x56),
897 'prefix_length'/Int8ub,
898 'prefix'/HexAdapter(GreedyBytes))
Harald Weltec91085e2022-02-10 18:05:45 +0100899
Harald Welte14105dc2021-05-31 08:48:51 +0200900 class AccessPointName(TLV_IE, tag=0x80):
901 # coded as per TS 23.003
902 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100903
Harald Welte14105dc2021-05-31 08:48:51 +0200904 class Login(TLV_IE, tag=0x81):
905 # as per SMS DCS TS 23.038
906 _construct = GsmStringAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100907
Harald Welte14105dc2021-05-31 08:48:51 +0200908 class Password(TLV_IE, tag=0x82):
909 # as per SMS DCS TS 23.038
910 _construct = GsmStringAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100911
Harald Welte14105dc2021-05-31 08:48:51 +0200912 class BearerDescription(TLV_IE, tag=0x84):
913 # Bearer descriptionTLV DO as per TS 31.111
914 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100915
Harald Welte14105dc2021-05-31 08:48:51 +0200916 class EF_NCP_IP_Collection(TLV_IE_Collection,
917 nested=[AccessPointName, Login, Password, BearerDescription]):
918 pass
Harald Welte99e4cc02022-07-21 15:25:47 +0200919 def __init__(self, fid='6fe2', sfid=None, name='EF.NCP-IP', rec_len=(None, None),
Harald Welte6169c722022-02-12 09:05:15 +0100920 desc='Network Connectivity Parameters for USIM IP connections', **kwargs):
921 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200922 self._tlv = EF_NCP_IP.EF_NCP_IP_Collection
923
Harald Welte790b2702021-04-11 00:01:35 +0200924# TS 31.102 Section 4.2.91
925class EF_EPSLOCI(TransparentEF):
Harald Welte12721292022-07-21 15:33:06 +0200926 def __init__(self, fid='6fe3', sfid=0x1e, name='EF.EPSLOCI',
927 desc='EPS Location Information', size=(18,18), **kwargs):
Harald Welte6169c722022-02-12 09:05:15 +0100928 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100929 upd_status_constr = Enum(
930 Byte, updated=0, not_updated=1, roaming_not_allowed=2)
Harald Welte3c98d5e2022-07-20 07:40:05 +0200931 self._construct = Struct('guti'/HexAdapter(Bytes(12)),
932 'last_visited_registered_tai'/HexAdapter(Bytes(5)),
Harald Welte790b2702021-04-11 00:01:35 +0200933 'eps_update_status'/upd_status_constr)
934
Harald Welte14105dc2021-05-31 08:48:51 +0200935# TS 31.102 Section 4.2.92
936class EF_EPSNSC(LinFixedEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100937 class KSI_ASME(BER_TLV_IE, tag=0x80):
Harald Welte14105dc2021-05-31 08:48:51 +0200938 _construct = Int8ub
Harald Weltec91085e2022-02-10 18:05:45 +0100939
940 class K_ASME(BER_TLV_IE, tag=0x81):
Harald Welte14105dc2021-05-31 08:48:51 +0200941 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100942
Harald Welte14105dc2021-05-31 08:48:51 +0200943 class UplinkNASCount(BER_TLV_IE, tag=0x82):
944 _construct = Int32ub
Harald Weltec91085e2022-02-10 18:05:45 +0100945
Harald Welte14105dc2021-05-31 08:48:51 +0200946 class DownlinkNASCount(BER_TLV_IE, tag=0x83):
947 _construct = Int32ub
Harald Weltec91085e2022-02-10 18:05:45 +0100948
Harald Welte14105dc2021-05-31 08:48:51 +0200949 class IDofNASAlgorithms(BER_TLV_IE, tag=0x84):
950 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100951
Harald Welte14105dc2021-05-31 08:48:51 +0200952 class EPS_NAS_Security_Context(BER_TLV_IE, tag=0xa0,
Harald Weltec91085e2022-02-10 18:05:45 +0100953 nested=[KSI_ASME, K_ASME, UplinkNASCount, DownlinkNASCount,
954 IDofNASAlgorithms]):
Harald Welte14105dc2021-05-31 08:48:51 +0200955 pass
Harald Welte99e4cc02022-07-21 15:25:47 +0200956 def __init__(self, fid='6fe4', sfid=0x18, name='EF.EPSNSC', rec_len=(54, 128),
Harald Welte6169c722022-02-12 09:05:15 +0100957 desc='EPS NAS Security Context', **kwargs):
958 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200959 self._tlv = EF_EPSNSC.EPS_NAS_Security_Context
960
Harald Welte790b2702021-04-11 00:01:35 +0200961# TS 31.102 Section 4.2.96
962class EF_PWS(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +0100963 _test_de_encode = [
964 ( '00', { "pws_configuration": { "ignore_pws_in_hplmn_and_equivalent": False,
965 "ignore_pws_in_vplmn": False } } ),
966 ]
Harald Welte13edf302022-07-21 15:19:23 +0200967 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 +0100968 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100969 pws_config = FlagsEnum(
970 Byte, ignore_pws_in_hplmn_and_equivalent=1, ignore_pws_in_vplmn=2)
Harald Welte790b2702021-04-11 00:01:35 +0200971 self._construct = Struct('pws_configuration'/pws_config)
972
973# TS 31.102 Section 4.2.101
974class EF_IPS(CyclicEF):
Harald Welte99e4cc02022-07-21 15:25:47 +0200975 def __init__(self, fid='6ff1', sfid=None, name='EF.IPS', rec_len=(4, 4),
Harald Welte6169c722022-02-12 09:05:15 +0100976 desc='IMEI(SV) Pairing Status', **kwargs):
977 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200978 self._construct = Struct('status'/PaddedString(2, 'ascii'),
979 'link_to_ef_ipd'/Int8ub, 'rfu'/Byte)
980
Harald Welte14105dc2021-05-31 08:48:51 +0200981# TS 31.102 Section 4.2.103
982class EF_ePDGId(TransparentEF):
983 class ePDGId(BER_TLV_IE, tag=0x80, nested=[]):
984 _construct = Struct('type_of_ePDG_address'/Enum(Byte, FQDN=0, IPv4=1, IPv6=2),
985 'ePDG_address'/Switch(this.type_of_address,
Harald Weltec91085e2022-02-10 18:05:45 +0100986 {'FQDN': GreedyString("utf8"),
987 'IPv4': HexAdapter(GreedyBytes),
988 'IPv6': HexAdapter(GreedyBytes)}))
989
Harald Welte6169c722022-02-12 09:05:15 +0100990 def __init__(self, fid='6ff3', sfid=None, name='EF.eDPDGId', desc='Home ePDG Identifier', **kwargs):
991 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200992 self._tlv = EF_ePDGId.ePDGId
993
Harald Welte71290072021-04-21 10:58:24 +0200994# TS 31.102 Section 4.2.106
995class EF_FromPreferred(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +0200996 def __init__(self, fid='6ff7', sfid=None, name='EF.FromPreferred', size=(1, 1),
Harald Welte6169c722022-02-12 09:05:15 +0100997 desc='From Preferred', **kwargs):
998 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte71290072021-04-21 10:58:24 +0200999 self._construct = BitStruct('rfu'/BitsRFU(7), 'from_preferred'/Bit)
1000
Harald Weltefc67de22023-05-23 20:29:49 +02001001# TS 31.102 Section 4.2.114
1002class EF_eAKA(TransparentEF):
1003 def __init__(self, fid='6f01', sfid=None, name='EF.eAKA', size=(1, 1),
1004 desc='enhanced AKA support', **kwargs):
1005 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
1006 self._construct = BitStruct('rfu'/BitsRFU(7), 'enhanced_sqn_calculation_supported'/Bit)
1007
Harald Welted90ceb82022-07-17 22:10:58 +02001008
1009######################################################################
1010# DF.GSM-ACCESS
1011######################################################################
1012
1013class DF_GSM_ACCESS(CardDF):
1014 def __init__(self, fid='5F3B', name='DF.GSM-ACCESS', desc='GSM Access', **kwargs):
1015 super().__init__(fid=fid, name=name, desc=desc, service=27, **kwargs)
1016 files = [
1017 EF_Kc(fid='4f20', sfid=0x01, service=27),
1018 EF_Kc(fid='4f52', sfid=0x02, name='EF.KcGPRS', desc='GPRS Ciphering key KcGPRS', service=27),
1019 EF_CPBCCH(fid='4f63', service=39),
1020 EF_InvScan(fid='4f64', service=40),
1021 ]
1022 self.add_files(files)
1023
1024
Harald Welte790b2702021-04-11 00:01:35 +02001025######################################################################
1026# DF.5GS
1027######################################################################
1028
1029# TS 31.102 Section 4.4.11.2
1030class EF_5GS3GPPLOCI(TransparentEF):
Harald Welte13edf302022-07-21 15:19:23 +02001031 def __init__(self, fid='4f01', sfid=0x01, name='EF.5GS3GPPLOCI', size=(20, 20),
Harald Welte419bb492022-02-12 21:39:35 +01001032 desc='5S 3GP location information', **kwargs):
1033 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +01001034 upd_status_constr = Enum(
1035 Byte, updated=0, not_updated=1, roaming_not_allowed=2)
Harald Welte3c98d5e2022-07-20 07:40:05 +02001036 self._construct = Struct('5g_guti'/HexAdapter(Bytes(13)),
1037 'last_visited_registered_tai_in_5gs'/HexAdapter(Bytes(6)),
Harald Welte790b2702021-04-11 00:01:35 +02001038 '5gs_update_status'/upd_status_constr)
1039
1040# TS 31.102 Section 4.4.11.7
1041class EF_UAC_AIC(TransparentEF):
Harald Welte865eea62023-01-27 19:26:12 +01001042 _test_de_encode = [
1043 ( '03', { "uac_access_id_config": { "multimedia_priority_service": True,
1044 "mission_critical_service": True } } ),
1045 ]
Harald Welte13edf302022-07-21 15:19:23 +02001046 def __init__(self, fid='4f06', sfid=0x06, name='EF.UAC_AIC', size=(4, 4),
Harald Welte419bb492022-02-12 21:39:35 +01001047 desc='UAC Access Identities Configuration', **kwargs):
1048 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +02001049 cfg_constr = FlagsEnum(Byte, multimedia_priority_service=1,
Harald Weltec91085e2022-02-10 18:05:45 +01001050 mission_critical_service=2)
Harald Welte790b2702021-04-11 00:01:35 +02001051 self._construct = Struct('uac_access_id_config'/cfg_constr)
1052
Harald Welte14105dc2021-05-31 08:48:51 +02001053# TS 31.102 Section 4.4.11.9
Harald Welte790b2702021-04-11 00:01:35 +02001054class EF_OPL5G(LinFixedEF):
Harald Welte52064292023-05-24 15:25:26 +02001055 def __init__(self, fid='4f08', sfid=0x08, name='EF.OPL5G', desc='5GS Operator PLMN List', **kwargs):
Harald Welte99e4cc02022-07-21 15:25:47 +02001056 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=(10, None), **kwargs)
Harald Welte3c98d5e2022-07-20 07:40:05 +02001057 Tai = Struct('mcc_mnc'/BcdAdapter(Bytes(3)), 'tac_min'/HexAdapter(Bytes(3)),
1058 'tac_max'/HexAdapter(Bytes(3)))
Harald Weltea0377622022-02-25 15:36:44 +01001059 self._construct = Struct('tai'/Tai, 'pnn_record_id'/Int8ub)
Harald Welte790b2702021-04-11 00:01:35 +02001060
Harald Welte14105dc2021-05-31 08:48:51 +02001061# TS 31.102 Section 4.4.11.10
1062class EF_SUPI_NAI(TransparentEF):
1063 class NetworkSpecificIdentifier(TLV_IE, tag=0x80):
1064 # RFC 7542 encoded as UTF-8 string
1065 _construct = GreedyString("utf8")
Harald Weltec91085e2022-02-10 18:05:45 +01001066
Harald Welte14105dc2021-05-31 08:48:51 +02001067 class GlobalLineIdentifier(TLV_IE, tag=0x81):
1068 # TS 23.003 clause 28.16.2
Harald Welteba6d6ab2023-05-27 13:45:01 +02001069 _construct = GreedyString("utf8")
Harald Weltec91085e2022-02-10 18:05:45 +01001070
Harald Welte14105dc2021-05-31 08:48:51 +02001071 class GlobalCableIdentifier(TLV_IE, tag=0x82):
1072 # TS 23.003 clause 28.15.2
Harald Welteba6d6ab2023-05-27 13:45:01 +02001073 _construct = GreedyString("utf8")
Harald Weltec91085e2022-02-10 18:05:45 +01001074
Harald Welte14105dc2021-05-31 08:48:51 +02001075 class NAI_TLV_Collection(TLV_IE_Collection,
Harald Weltec91085e2022-02-10 18:05:45 +01001076 nested=[NetworkSpecificIdentifier, GlobalLineIdentifier, GlobalCableIdentifier]):
Harald Welte14105dc2021-05-31 08:48:51 +02001077 pass
1078 def __init__(self, fid='4f09', sfid=0x09, name='EF.SUPI_NAI',
Harald Welte419bb492022-02-12 21:39:35 +01001079 desc='SUPI as Network Access Identifier', **kwargs):
1080 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +02001081 self._tlv = EF_SUPI_NAI.NAI_TLV_Collection
1082
Harald Welte455611c2023-05-27 12:48:54 +02001083# TS 31.102 Section 4.4.11.11
1084class EF_Routing_Indicator(TransparentEF):
1085 def __init__(self, fid='4f0a', sfid=0x0a, name='EF.Routing_Indicator', desc='Routing Indicator', **kwargs):
1086 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1087 # 3GPP TS 24.501 Table 9.11.3.4.1:
1088 # Routing Indicator shall consist of 1 to 4 digits. The coding of this field is the
1089 # responsibility of home network operator but BCD coding shall be used. If a network
1090 # operator decides to assign less than 4 digits to Routing Indicator, the remaining digits
1091 # shall be coded as "1111" to fill the 4 digits coding of Routing Indicator
Harald Weltef9a5ba52023-06-09 09:17:05 +02001092 self._construct = Struct('routing_indicator'/Rpad(BcdAdapter(Bytes(2)), 'f', 2),
1093 'rfu'/HexAdapter(Bytes(2)))
Harald Weltec91085e2022-02-10 18:05:45 +01001094
Harald Weltefc67de22023-05-23 20:29:49 +02001095# TS 31.102 Section 4.4.11.13
Harald Welte14105dc2021-05-31 08:48:51 +02001096class EF_TN3GPPSNN(TransparentEF):
1097 class ServingNetworkName(BER_TLV_IE, tag=0x80):
1098 _construct = GreedyString("utf8")
1099 def __init__(self, fid='4f0c', sfid=0x0c, name='EF.TN3GPPSNN',
Harald Welte419bb492022-02-12 21:39:35 +01001100 desc='Trusted non-3GPP Serving network names list', **kwargs):
1101 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +02001102 self._tlv = EF_TN3GPPSNN.ServingNetworkName
1103
Harald Weltefc67de22023-05-23 20:29:49 +02001104# TS 31.102 Section 4.4.11.14 (Rel 17)
1105class EF_CAG(TransparentEF):
1106 def __init__(self, fid='4f0d', sfid=0x0d, name='EF.CAG',
1107 desc='Pre-configured CAG information list EF', **kwargs):
1108 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1109 self._construct = HexAdapter(GreedyBytes)
1110
1111# TS 31.102 Section 4.4.11.15 (Rel 17)
1112class EF_SOR_CMCI(TransparentEF):
1113 def __init__(self, fid='4f0e', sfid=0x0e, name='EF.SOR-CMCI',
1114 desc='Steering Of Roaming - Connected Mode Control Information', **kwargs):
1115 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1116 self._construct = HexAdapter(GreedyBytes)
1117
1118# TS 31.102 Section 4.4.11.17 (Rel 17)
1119class EF_DRI(TransparentEF):
1120 def __init__(self, fid='4f0f', sfid=0x0f, name='EF.DRI',
1121 desc='Disaster roaming information EF', **kwargs):
1122 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1123 self._construct = Struct('disaster_roaming_enabled'/Byte,
1124 'parameters_indicator_status'/FlagsEnum(Byte, roaming_wait_range=1,
1125 return_wait_range=2,
1126 applicability_indicator=3),
1127 'roaming_wait_range'/HexAdapter(Bytes(2)),
1128 'return_wait_range'/HexAdapter(Bytes(2)),
1129 'applicability_indicator'/HexAdapter(Byte))
1130
1131# TS 31.102 Section 4.4.12.2 (Rel 17)
1132class EF_PWS_SNPN(TransparentEF):
1133 def __init__(self, fid='4f01', sfid=0x01, name='EF.PWS_SNPN',
1134 desc='Public Warning System in SNPNs', **kwargs):
1135 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1136 self._construct = Struct('pws_config_in_snpns'/FlagsEnum(Byte, ignore_all_pws_in_subscribed=1,
1137 ignore_all_pws_in_non_subscribed=2))
1138
1139# TS 31.102 Section 4.4.12.2 (Rel 17)
1140class EF_NID(LinFixedEF):
1141 def __init__(self, fid='4f02', sfid=0x02, name='EF.NID',
1142 desc='Network Identifier for SNPN', **kwargs):
1143 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=(6,6), **kwargs)
1144 self._construct = Struct('assignment_mode'/Enum(Byte, coordinated_ass_opt1=0,
1145 self_ass=1,
1146 coordinated_ass_opt2=2),
1147 'network_identifier'/HexAdapter(Bytes(5)))
1148
1149# TS 31.102 Section 4.4.12 (Rel 17)
1150class DF_SNPN(CardDF):
1151 def __init__(self, fid='5fe0', name='DF.SNPN', desc='Files for SNPN purpose', **kwargs):
1152 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1153 files = [
1154 EF_PWS_SNPN(service=143),
1155 EF_NID(service=146),
1156 ]
1157 self.add_files(files)
1158
1159# TS 31.102 Section 4.4.13.2 (Rel 17)
1160class EF_5G_PROSE_ST(EF_UServiceTable):
1161 def __init__(self, **kwargs):
1162 super().__init__(fid='4f01', sfid=0x01, name='EF.5G_PROSE_ST',
1163 desc='5G ProSe Service Table', size=(1,2), table=EF_5G_PROSE_ST_map, **kwargs)
1164 # add those commands to the general commands of a TransparentEF
1165 self.shell_commands += [self.AddlShellCommands()]
1166
1167 @with_default_category('File-Specific Commands')
1168 class AddlShellCommands(CommandSet):
1169 def __init__(self):
1170 super().__init__()
1171
1172 def do_prose_service_activate(self, arg):
1173 """Activate a service within EF.5G_PROSE_ST"""
1174 self._cmd.card.update_ust(int(arg), 1)
1175
1176 def do_prose_service_deactivate(self, arg):
1177 """Deactivate a service within EF.5G_PROSE_ST"""
1178 self._cmd.card.update_ust(int(arg), 0)
1179
1180# TS 31.102 Section 4.4.13.3 (Rel 17)
1181class EF_5G_PROSE_DD(TransparentEF):
1182 class ServedByNgRan(BER_TLV_IE, tag=0x80):
1183 pass
1184 class NotServedByNgran(BER_TLV_IE, tag=0x81):
1185 pass
1186 class ProSeIdentifiers(BER_TLV_IE, tag=0x82):
1187 pass
1188 class ProSeIdToDefaultDestL2Id(BER_TLV_IE, tag=0x83):
1189 pass
1190 class GroupMemberDiscoveryParameters(BER_TLV_IE, tag=0x84):
1191 pass
1192 class ValidityTimer(BER_TLV_IE, tag=0x85):
1193 pass
1194 class ProSeDirectDiscoveryUeId(BER_TLV_IE, tag=0x86):
1195 pass
1196 class Hplmn5GDdnmfAddressInformation(BER_TLV_IE, tag=0x87):
1197 pass
1198 class ProSeConfigForDirectDiscovery(BER_TLV_IE, tag=0xA0,
1199 nested=[ServedByNgRan, NotServedByNgran, ProSeIdentifiers,
1200 ProSeIdToDefaultDestL2Id, GroupMemberDiscoveryParameters,
1201 ValidityTimer, ProSeDirectDiscoveryUeId,
1202 Hplmn5GDdnmfAddressInformation]):
1203 pass
1204 def __init__(self, fid='4f02', sfid=0x02, name='EF.5G_PROSE_DD',
1205 desc='5G ProSe configuration data for direct discovery', **kwargs):
1206 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1207 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1208 self._tlv = EF_5G_PROSE_DD.ProSeConfigForDirectDiscovery
1209
1210# TS 31.102 Section 4.4.13.4 (Rel 17)
1211class EF_5G_PROSE_DC(TransparentEF):
1212 class PrivacyConfig(BER_TLV_IE, tag=0x87):
1213 pass
1214 class DirectCommInNrPc5(BER_TLV_IE, tag=0x88):
1215 pass
1216 class ApplicationToPathPreferenceMappingRules(BER_TLV_IE, tag=0x89):
1217 pass
1218 class ProSeIdToNrTxProfileForBroadcastAndGroupcastMappingRules(BER_TLV_IE, tag=0x91):
1219 pass
1220 class ProSeConfigForDirectCommunication(BER_TLV_IE, tag=0xA0,
1221 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1222 EF_5G_PROSE_DD.NotServedByNgran,
1223 PrivacyConfig, DirectCommInNrPc5,
1224 ApplicationToPathPreferenceMappingRules,
1225 EF_5G_PROSE_DD.ValidityTimer,
1226 ProSeIdToNrTxProfileForBroadcastAndGroupcastMappingRules]):
1227 pass
1228 def __init__(self, fid='4f03', sfid=0x03, name='EF.5G_PROSE_DC',
1229 desc='5G ProSe configuration data for direct communication', **kwargs):
1230 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1231 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1232 self._tlv = EF_5G_PROSE_DC.ProSeConfigForDirectCommunication
1233
1234# TS 31.102 Section 4.4.13.5 (Rel 17)
1235class EF_5G_PROSE_U2NRU(TransparentEF):
1236 class ProSeIdToDefaultDestL2Id(BER_TLV_IE, tag=0x8a):
1237 pass
1238 class RxcInfoList(BER_TLV_IE, tag=0x8b):
1239 pass
1240 class FiveQiToPc65QosParametersMappingRules(BER_TLV_IE, tag=0x8c):
1241 pass
1242 class ProSeIdToAppSrvAddrMappingRules(BER_TLV_IE, tag=0x8d):
1243 pass
1244 class UserInfoIdForDiscovery(BER_TLV_IE, tag=0x8e):
1245 pass
1246 class PrivacyTimer(BER_TLV_IE, tag=0x92):
1247 pass
1248 class FiveGPkkmfAddressInformation(BER_TLV_IE, tag=0x93):
1249 pass
1250 class ProSeConfigDataForUeToNetworkRelayUe(BER_TLV_IE, tag=0xA0,
1251 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1252 EF_5G_PROSE_DD.NotServedByNgran,
1253 ProSeIdToDefaultDestL2Id,
1254 RxcInfoList,
1255 FiveQiToPc65QosParametersMappingRules,
1256 ProSeIdToAppSrvAddrMappingRules,
1257 EF_5G_PROSE_DD.ValidityTimer,
1258 UserInfoIdForDiscovery,
1259 PrivacyTimer,
1260 FiveGPkkmfAddressInformation]):
1261 pass
1262 def __init__(self, fid='4f04', sfid=0x04, name='EF.5G_PROSE_U2NRU',
1263 desc='5G ProSe configuration data for UE-to-network relay UE', **kwargs):
1264 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1265 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1266 self._tlv = EF_5G_PROSE_U2NRU.ProSeConfigDataForUeToNetworkRelayUe
1267
1268# TS 31.102 Section 4.4.13.6 (Rel 17)
1269class EF_5G_PROSE_RU(TransparentEF):
1270 class DefaultDestL2Ids(BER_TLV_IE, tag=0x8f):
1271 pass
1272 class N3IwfSelectionInfoFor5GProSeL3RemoteUE(BER_TLV_IE, tag=0x90):
1273 pass
1274 class ProSeConfigDataForRemoteUe(BER_TLV_IE, tag=0xa0,
1275 nested=[EF_5G_PROSE_DD.ServedByNgRan,
1276 EF_5G_PROSE_DD.NotServedByNgran,
1277 DefaultDestL2Ids,
1278 EF_5G_PROSE_U2NRU.RxcInfoList,
1279 N3IwfSelectionInfoFor5GProSeL3RemoteUE,
1280 EF_5G_PROSE_DD.ValidityTimer,
1281 EF_5G_PROSE_U2NRU.UserInfoIdForDiscovery,
1282 EF_5G_PROSE_U2NRU.PrivacyTimer,
1283 EF_5G_PROSE_U2NRU.FiveGPkkmfAddressInformation]):
1284 pass
1285 def __init__(self, fid='4f05', sfid=0x05, name='EF.5G_PROSE_RU',
1286 desc='5G ProSe configuration data for remote UE', **kwargs):
1287 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1288 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1289 self._tlv = EF_5G_PROSE_RU.ProSeConfigDataForRemoteUe
1290
1291# TS 31.102 Section 4.4.13.7 (Rel 17)
1292class EF_5G_PROSE_UIR(TransparentEF):
1293 class CollectionPeriod(BER_TLV_IE, tag=0x94):
1294 pass
1295 class ReportingWindow(BER_TLV_IE, tag=0x95):
1296 pass
1297 class ReportingIndicators(BER_TLV_IE, tag=0x96):
1298 pass
1299 class FiveGDdnmfCtfAddrForUploading(BER_TLV_IE, tag=0x97):
1300 pass
1301 class ProSeConfigDataForUeToNetworkRelayUE(BER_TLV_IE, tag=0xa0,
1302 nested=[EF_5G_PROSE_DD.ValidityTimer,
1303 CollectionPeriod, ReportingWindow,
1304 ReportingIndicators,
1305 FiveGDdnmfCtfAddrForUploading]):
1306 pass
1307 def __init__(self, fid='4f06', sfid=0x06, name='EF.5G_PROSE_UIR',
1308 desc='5G ProSe configuration data for usage information reporting', **kwargs):
1309 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1310 # contains TLV structure despite being TransparentEF, not BER-TLV ?!?
1311 self._tlv = EF_5G_PROSE_UIR.ProSeConfigDataForUeToNetworkRelayUE
1312
1313# TS 31.102 Section 4.4.13 (Rel 17)
1314class DF_5G_ProSe(CardDF):
1315 def __init__(self, fid='5ff0', name='DF.5G_ProSe', desc='Files for 5G ProSe purpose', **kwargs):
1316 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1317 files = [
1318 EF_5G_PROSE_ST(),
1319 EF_5G_PROSE_DD(service=1),
1320 EF_5G_PROSE_DC(service=2),
1321 EF_5G_PROSE_U2NRU(service=3),
1322 EF_5G_PROSE_RU(service=4),
1323 EF_5G_PROSE_UIR(service=5),
1324 ]
1325 self.add_files(files)
1326
1327# TS 31.102 Section 4.4.11.18 (Rel 17)
1328class EF_5GSEDRX(TransparentEF):
1329 def __init__(self, fid='4f10', sfid=0x10, name='EF.5GSEDRX',
1330 desc='5GS eDRX Parameters', **kwargs):
1331 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1332 self._construct = Struct('5gs_rat_type'/FlagsEnum(Byte, ng_ran=1, sat_ng_ran=2),
1333 'edrx_cycle_length'/Int8ub)
1334
1335# TS 31.102 Section 4.4.11.19 (Rel 17)
1336class EF_5GNSWO_CONF(TransparentEF):
1337 def __init__(self, fid='4f11', sfid=0x11, name='EF.5GNSWO_CONF',
1338 desc='5G Non-Seamless WLAN Offload configuration', **kwargs):
1339 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1340 self._construct = Struct('5g_nswo_usage_ind'/Enum(Byte, disabled=0, enabled=1))
1341
1342# TS 31.102 Section 4.4.11.20 (Rel 17)
1343class EF_MCHPPLMN(TransparentEF):
Harald Welte24e77a72023-05-24 15:26:29 +02001344 def __init__(self, fid='4f15', sfid=0x15, name='EF.MCHPPLMN',
Harald Weltefc67de22023-05-23 20:29:49 +02001345 desc='Multiplier Coefficient for Higher Priority PLMN search', **kwargs):
1346 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1347 self._construct = Struct('multiplier_coefficient'/Int8ub)
1348
1349# TS 31.102 Section 4.4.11.21 (Rel 17)
1350class EF_KAUSF_DERIVATION(TransparentEF):
1351 def __init__(self, fid='4f16', sfid=0x16, name='EF.KAUSF_DERIVATION',
1352 desc='K_AUSF derivation configuration', **kwargs):
1353 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
1354 self._construct = Struct('k_ausf_deriv_cfg'/FlagsEnum(Byte, use_msk=1), 'rfu'/HexAdapter(GreedyBytes))
1355
Harald Welte3990ebb2021-04-20 23:55:14 +02001356# TS 31.102 Section 4.4.5
1357class DF_WLAN(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001358 def __init__(self, fid='5f40', name='DF.WLAN', desc='Files for WLAN purpose', **kwargs):
1359 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001360 files = [
Harald Welte419bb492022-02-12 21:39:35 +01001361 TransparentEF('4f41', 0x01, 'EF.Pseudo', 'Pseudonym', service=59),
Harald Weltec91085e2022-02-10 18:05:45 +01001362 TransparentEF('4f42', 0x02, 'EF.UPLMNWLAN',
Harald Welte419bb492022-02-12 21:39:35 +01001363 'User controlled PLMN selector for I-WLAN Access', service=60),
Harald Weltec91085e2022-02-10 18:05:45 +01001364 TransparentEF('4f43', 0x03, 'EF.OPLMNWLAN',
Harald Welte419bb492022-02-12 21:39:35 +01001365 'Operator controlled PLMN selector for I-WLAN Access', service=61),
Harald Weltec91085e2022-02-10 18:05:45 +01001366 LinFixedEF('4f44', 0x04, 'EF.UWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001367 'User controlled WLAN Specific Identifier List', service=62),
Harald Weltec91085e2022-02-10 18:05:45 +01001368 LinFixedEF('4f45', 0x05, 'EF.OWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001369 'Operator controlled WLAN Specific Identifier List', service=63),
Harald Weltec91085e2022-02-10 18:05:45 +01001370 TransparentEF('4f46', 0x06, 'EF.WRI',
Harald Welte419bb492022-02-12 21:39:35 +01001371 'WLAN Reauthentication Identity', service=66),
Harald Weltec91085e2022-02-10 18:05:45 +01001372 LinFixedEF('4f47', 0x07, 'EF.HWSIDL',
Harald Welte419bb492022-02-12 21:39:35 +01001373 'Home I-WLAN Specific Identifier List', service=81),
Harald Weltec91085e2022-02-10 18:05:45 +01001374 TransparentEF('4f48', 0x08, 'EF.WEHPLMNPI',
Harald Welte419bb492022-02-12 21:39:35 +01001375 'I-WLAN Equivalent HPLMN Presentation Indication', service=82),
Harald Weltec91085e2022-02-10 18:05:45 +01001376 TransparentEF('4f49', 0x09, 'EF.WHPI',
Harald Welte419bb492022-02-12 21:39:35 +01001377 'I-WLAN HPLMN Priority Indication', service=83),
Harald Weltec91085e2022-02-10 18:05:45 +01001378 TransparentEF('4f4a', 0x0a, 'EF.WLRPLMN',
Harald Welte419bb492022-02-12 21:39:35 +01001379 'I-WLAN Last Registered PLMN', service=84),
Harald Weltec91085e2022-02-10 18:05:45 +01001380 TransparentEF('4f4b', 0x0b, 'EF.HPLMNDAI',
Harald Welte419bb492022-02-12 21:39:35 +01001381 'HPLMN Direct Access Indicator', service=88),
Harald Weltec91085e2022-02-10 18:05:45 +01001382 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001383 self.add_files(files)
1384
1385# TS 31.102 Section 4.4.6
1386class DF_HNB(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001387 def __init__(self, fid='5f50', name='DF.HNB', desc='Files for HomeNodeB purpose', **kwargs):
1388 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001389 files = [
Harald Welteeb882052022-07-17 21:13:57 +02001390 LinFixedEF('4f81', 0x01, 'EF.ACSGL', 'Allowed CSG Lists', service=86),
1391 LinFixedEF('4f82', 0x02, 'EF.CSGTL', 'CSG Types', service=86),
1392 LinFixedEF('4f83', 0x03, 'EF.HNBN', 'Home NodeB Name', service=86),
1393 LinFixedEF('4f84', 0x04, 'EF.OCSGL', 'Operator CSG Lists', service=90),
1394 LinFixedEF('4f85', 0x05, 'EF.OCSGT', 'Operator CSG Type', service=90),
1395 LinFixedEF('4f86', 0x06, 'EF.OHNBN', 'Operator Home NodeB Name', service=90),
Harald Weltec91085e2022-02-10 18:05:45 +01001396 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001397 self.add_files(files)
1398
1399# TS 31.102 Section 4.4.8
1400class DF_ProSe(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001401 def __init__(self, fid='5f90', name='DF.ProSe', desc='Files for ProSe purpose', **kwargs):
1402 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001403 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001404 LinFixedEF('4f01', 0x01, 'EF.PROSE_MON',
1405 'ProSe Monitoring Parameters'),
1406 LinFixedEF('4f02', 0x02, 'EF.PROSE_ANN',
1407 'ProSe Announcing Parameters'),
Harald Welte3990ebb2021-04-20 23:55:14 +02001408 LinFixedEF('4f03', 0x03, 'EF.PROSEFUNC', 'HPLMN ProSe Function'),
Harald Weltec91085e2022-02-10 18:05:45 +01001409 TransparentEF('4f04', 0x04, 'EF.PROSE_RADIO_COM',
1410 'ProSe Direct Communication Radio Parameters'),
1411 TransparentEF('4f05', 0x05, 'EF.PROSE_RADIO_MON',
1412 'ProSe Direct Discovery Monitoring Radio Parameters'),
1413 TransparentEF('4f06', 0x06, 'EF.PROSE_RADIO_ANN',
1414 'ProSe Direct Discovery Announcing Radio Parameters'),
1415 LinFixedEF('4f07', 0x07, 'EF.PROSE_POLICY',
1416 'ProSe Policy Parameters'),
Harald Welte3990ebb2021-04-20 23:55:14 +02001417 LinFixedEF('4f08', 0x08, 'EF.PROSE_PLMN', 'ProSe PLMN Parameters'),
1418 TransparentEF('4f09', 0x09, 'EF.PROSE_GC', 'ProSe Group Counter'),
1419 TransparentEF('4f10', 0x10, 'EF.PST', 'ProSe Service Table'),
Harald Weltec91085e2022-02-10 18:05:45 +01001420 TransparentEF('4f11', 0x11, 'EF.UIRC',
1421 'ProSe UsageInformationReportingConfiguration'),
1422 LinFixedEF('4f12', 0x12, 'EF.PROSE_GM_DISCOVERY',
1423 'ProSe Group Member Discovery Parameters'),
1424 LinFixedEF('4f13', 0x13, 'EF.PROSE_RELAY',
1425 'ProSe Relay Parameters'),
1426 TransparentEF('4f14', 0x14, 'EF.PROSE_RELAY_DISCOVERY',
1427 'ProSe Relay Discovery Parameters'),
1428 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001429 self.add_files(files)
1430
Harald Weltec91085e2022-02-10 18:05:45 +01001431
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001432class DF_USIM_5GS(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001433 def __init__(self, fid='5FC0', name='DF.5GS', desc='5GS related files', **kwargs):
1434 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001435 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001436 # I'm looking at 31.102 R16.6
Harald Welte419bb492022-02-12 21:39:35 +01001437 EF_5GS3GPPLOCI(service=122),
Harald Weltec91085e2022-02-10 18:05:45 +01001438 EF_5GS3GPPLOCI('4f02', 0x02, 'EF.5GSN3GPPLOCI',
Harald Welte419bb492022-02-12 21:39:35 +01001439 '5GS non-3GPP location information', service=122),
1440 EF_5GS3GPPNSC(service=122),
Harald Weltec91085e2022-02-10 18:05:45 +01001441 EF_5GS3GPPNSC('4f04', 0x04, 'EF.5GSN3GPPNSC',
Harald Welte419bb492022-02-12 21:39:35 +01001442 '5GS non-3GPP Access NAS Security Context', service=122),
1443 EF_5GAUTHKEYS(service=123),
1444 EF_UAC_AIC(service=126),
1445 EF_SUCI_Calc_Info(service=124),
1446 EF_OPL5G(service=129),
1447 EF_SUPI_NAI(service=130),
Harald Welte455611c2023-05-27 12:48:54 +02001448 EF_Routing_Indicator(service=124),
Harald Weltec91085e2022-02-10 18:05:45 +01001449 TransparentEF('4F0B', 0x0b, 'EF.URSP',
Harald Welte419bb492022-02-12 21:39:35 +01001450 'UE Route Selector Policies per PLMN', service=132),
1451 EF_TN3GPPSNN(service=133),
Harald Weltefc67de22023-05-23 20:29:49 +02001452 # Rel-17 additions below
1453 EF_CAG(service=137),
1454 EF_SOR_CMCI(service=138),
1455 EF_DRI(service=140),
1456 EF_5GSEDRX(service=141),
1457 EF_5GNSWO_CONF(service=142),
1458 EF_MCHPPLMN(service=144),
1459 EF_KAUSF_DERIVATION(service=145),
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001460 ]
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001461 self.add_files(files)
1462
Harald Weltec91085e2022-02-10 18:05:45 +01001463
Harald Welte2bee70c2023-05-25 09:14:28 +02001464class DF_SAIP(CardDF):
1465 """This is not really TS 31.102 but part of the eUICC Profile Package: Interoperable Format Technical
1466 Specification as released by TCA (formerly SIMalliance)"""
1467 def __init__(self, fid='5FD0', name='DF.SAIP', desc='SIMalliance Interoperable Profile', **kwargs):
1468 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
1469 files = [
1470 # uses the same file format as DF.5GS/EF_SUCI_Calc_Info, but different FID
1471 EF_SUCI_Calc_Info(fid='4f01')
1472 ]
1473 self.add_files(files)
1474
1475
Harald Welteb2edd142021-01-08 23:29:35 +01001476class ADF_USIM(CardADF):
1477 def __init__(self, aid='a0000000871002', name='ADF.USIM', fid=None, sfid=None,
1478 desc='USIM Application'):
1479 super().__init__(aid=aid, fid=fid, sfid=sfid, name=name, desc=desc)
Harald Welte15fae982021-04-10 10:22:27 +02001480 # add those commands to the general commands of a TransparentEF
1481 self.shell_commands += [self.AddlShellCommands()]
Harald Welteb2edd142021-01-08 23:29:35 +01001482
1483 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001484 EF_LI(sfid=0x02),
1485 EF_IMSI(sfid=0x07),
1486 EF_Keys(),
1487 EF_Keys('6f09', 0x09, 'EF.KeysPS',
1488 desc='Ciphering and Integrity Keys for PS domain'),
1489 EF_xPLMNwAcT('6f60', 0x0a, 'EF.PLMNwAcT',
Harald Welte6169c722022-02-12 09:05:15 +01001490 'User controlled PLMN Selector with Access Technology', service=20),
Harald Weltec91085e2022-02-10 18:05:45 +01001491 EF_HPPLMN(),
Harald Welte6169c722022-02-12 09:05:15 +01001492 EF_ACMmax(service=13),
Harald Welte6ca2fa72022-02-12 16:29:31 +01001493 EF_UST(),
Harald Weltec91085e2022-02-10 18:05:45 +01001494 CyclicEF('6f39', None, 'EF.ACM',
Harald Welte99e4cc02022-07-21 15:25:47 +02001495 'Accumulated call meter', rec_len=(3, 3), service=13),
Harald Welte6169c722022-02-12 09:05:15 +01001496 TransparentEF('6f3e', None, 'EF.GID1', 'Group Identifier Level 1', service=17),
1497 TransparentEF('6f3f', None, 'EF.GID2', 'Group Identifier Level 2', service=18),
1498 EF_SPN(service=19),
Harald Weltec91085e2022-02-10 18:05:45 +01001499 TransparentEF('6f41', None, 'EF.PUCT',
Harald Welte13edf302022-07-21 15:19:23 +02001500 'Price per unit and currency table', size=(5, 5), service=13),
Harald Welte6169c722022-02-12 09:05:15 +01001501 EF_CBMI(service=15),
Harald Weltec91085e2022-02-10 18:05:45 +01001502 EF_ACC(sfid=0x06),
1503 EF_PLMNsel('6f7b', 0x0d, 'EF.FPLMN',
Harald Welte13edf302022-07-21 15:19:23 +02001504 'Forbidden PLMNs', size=(12, None)),
Harald Weltec91085e2022-02-10 18:05:45 +01001505 EF_LOCI(),
1506 EF_AD(),
Harald Welte6169c722022-02-12 09:05:15 +01001507 EF_CBMID(sfid=0x0e, service=29),
Harald Weltec91085e2022-02-10 18:05:45 +01001508 EF_ECC(),
Harald Welte6169c722022-02-12 09:05:15 +01001509 EF_CBMIR(service=16),
Harald Weltec91085e2022-02-10 18:05:45 +01001510 EF_PSLOCI(),
Harald Welte0dc6c202023-01-24 18:10:13 +01001511 EF_ADN('6f3b', None, 'EF.FDN', 'Fixed Dialling Numbers', service=[2, 89], ext=2),
Harald Welte6169c722022-02-12 09:05:15 +01001512 EF_SMS('6f3c', None, service=10),
1513 EF_MSISDN(service=21),
1514 EF_SMSP(service=12),
1515 EF_SMSS(service=10),
Harald Welte0dc6c202023-01-24 18:10:13 +01001516 EF_ADN('6f49', None, 'EF.SDN', 'Service Dialling Numbers', service=[4, 89], ext=3),
Harald Welte6169c722022-02-12 09:05:15 +01001517 EF_EXT('6f4b', None, 'EF.EXT2', 'Extension2 (FDN)', service=3),
1518 EF_EXT('6f4c', None, 'EF.EXT3', 'Extension2 (SDN)', service=5),
1519 EF_SMSR(service=11),
1520 EF_ICI(service=9),
1521 EF_OCI(service=8),
1522 EF_ICT(service=9),
1523 EF_ICT('6f83', None, 'EF.OCT', 'Outgoing Call Timer', service=8),
1524 EF_EXT('6f4e', None, 'EF.EXT5', 'Extension5 (ICI/OCI/MSISDN)', service=44),
1525 EF_CCP2(service=14),
1526 EF_eMLPP(service=24),
1527 EF_AAeM(service=25),
Harald Weltec91085e2022-02-10 18:05:45 +01001528 # EF_Hiddenkey
Harald Welte0dc6c202023-01-24 18:10:13 +01001529 EF_ADN('6f4d', None, 'EF.BDN', 'Barred Dialling Numbers', service=6, ext=4),
Harald Welte6169c722022-02-12 09:05:15 +01001530 EF_EXT('6f55', None, 'EF.EXT4', 'Extension4 (BDN/SSC)', service=7),
1531 EF_CMI(service=6),
Harald Welte6ca2fa72022-02-12 16:29:31 +01001532 EF_EST(service=[2, 6, 34, 35]),
Harald Welte6169c722022-02-12 09:05:15 +01001533 EF_ACL(service=35),
1534 EF_DCK(service=36),
1535 EF_CNL(service=37),
Harald Weltec91085e2022-02-10 18:05:45 +01001536 EF_START_HFN(),
1537 EF_THRESHOLD(),
Harald Welte6169c722022-02-12 09:05:15 +01001538 EF_xPLMNwAcT('6f61', 0x11, 'EF.OPLMNwAcT', 'User controlled PLMN Selector with Access Technology', service=42),
1539 EF_xPLMNwAcT('6f62', 0x13, 'EF.HPLMNwAcT', 'HPLMN Selector with Access Technology', service=43),
Harald Weltec91085e2022-02-10 18:05:45 +01001540 EF_ARR('6f06', 0x17),
Harald Welte363edd92022-07-17 22:24:03 +02001541 EF_RPLMNAcT(),
Harald Weltec91085e2022-02-10 18:05:45 +01001542 TransparentEF('6fc4', None, 'EF.NETPAR', 'Network Parameters'),
Harald Welte6169c722022-02-12 09:05:15 +01001543 EF_PNN('6fc5', 0x19, service=45),
1544 EF_OPL(service=46),
Harald Welte0dc6c202023-01-24 18:10:13 +01001545 EF_ADN('6fc7', None, 'EF.MBDN', 'Mailbox Dialling Numbers', service=47, ext=6),
Harald Welte6169c722022-02-12 09:05:15 +01001546 EF_EXT('6fc8', None, 'EF.EXT6', 'Extension6 (MBDN)'),
1547 EF_MBI(service=47),
1548 EF_MWIS(service=48),
Harald Welte0dc6c202023-01-24 18:10:13 +01001549 EF_ADN('6fcb', None, 'EF.CFIS', 'Call Forwarding Indication Status', service=49, ext=7),
Harald Weltec91085e2022-02-10 18:05:45 +01001550 EF_EXT('6fcc', None, 'EF.EXT7', 'Extension7 (CFIS)'),
Harald Welte6169c722022-02-12 09:05:15 +01001551 TransparentEF('6fcd', None, 'EF.SPDI', 'Service Provider Display Information', service=51),
1552 EF_MMSN(service=52),
1553 EF_EXT('6fcf', None, 'EF.EXT8', 'Extension8 (MMSN)', service=53),
1554 EF_MMSICP(service=52),
1555 EF_MMSUP(service=52),
1556 EF_MMSUCP(service=(52, 55)),
Harald Welte04bd5142023-05-24 15:23:53 +02001557 EF_NIA(service=56, fid='6fd3'),
Harald Welte6169c722022-02-12 09:05:15 +01001558 EF_VGCS(service=57),
1559 EF_VGCSS(service=57),
1560 EF_VGCS('6fb3', None, 'EF.VBS', 'Voice Broadcast Service', service=58),
1561 EF_VGCSS('6fb4', None, 'EF.VBSS', 'Voice Broadcast Service Status', service=58),
1562 EF_VGCSCA(service=64),
1563 EF_VGCSCA('6fd5', None, 'EF.VBCSCA', 'Voice Broadcast Service Ciphering Algorithm', service=65),
1564 EF_GBABP(service=68),
1565 EF_MSK(service=69),
1566 EF_MUK(service=69),
1567 EF_GBANL(service=68),
Harald Welte13edf302022-07-21 15:19:23 +02001568 EF_PLMNsel('6fd9', 0x1d, 'EF.EHPLMN', 'Equivalent HPLMN', size=(12, None), service=71),
Harald Welte6169c722022-02-12 09:05:15 +01001569 EF_EHPLMNPI(service=(71, 73)),
1570 # EF_LRPLMNSI ('6fdc', service=74)
1571 EF_NAFKCA(service=(68, 76)),
1572 TransparentEF('6fde', None, 'EF.SPNI', 'Service Provider Name Icon', service=78),
1573 LinFixedEF('6fdf', None, 'EF.PNNI', 'PLMN Network Name Icon', service=79),
1574 EF_NCP_IP(service=80),
1575 EF_EPSLOCI('6fe3', 0x1e, 'EF.EPSLOCI', 'EPS location information', service=85),
1576 EF_EPSNSC(service=85),
Harald Welte13edf302022-07-21 15:19:23 +02001577 TransparentEF('6fe6', None, 'EF.UFC', 'USAT Facility Control', size=(1, 16)),
Harald Welte6169c722022-02-12 09:05:15 +01001578 TransparentEF('6fe8', None, 'EF.NASCONFIG', 'Non Access Stratum Configuration', service=96),
1579 # UICC IARI (only in cards that have no ISIM) service=95
1580 EF_PWS(service=97),
1581 LinFixedEF('6fed', None, 'EF.FDNURI', 'Fixed Dialling Numbers URI', service=(2, 99)),
1582 LinFixedEF('6fee', None, 'EF.BDNURI', 'Barred Dialling Numbers URI', service=(6, 99)),
1583 LinFixedEF('6fef', None, 'EF.SDNURI', 'Service Dialling Numbers URI', service=(4, 99)),
1584 # EF_IWL (IMEI(SV) White List)
Harald Weltec91085e2022-02-10 18:05:45 +01001585 EF_IPS(),
Harald Welte6169c722022-02-12 09:05:15 +01001586 EF_ePDGId(service=(106, 107)),
Harald Weltec91085e2022-02-10 18:05:45 +01001587 # FIXME: from EF_ePDGSelection onwards
Harald Welte6169c722022-02-12 09:05:15 +01001588 EF_FromPreferred(service=114),
Harald Weltefc67de22023-05-23 20:29:49 +02001589 EF_eAKA(),
Harald Welte6169c722022-02-12 09:05:15 +01001590 # FIXME: DF_SoLSA service=23
Harald Weltede4c14c2022-07-16 11:53:59 +02001591 DF_PHONEBOOK(),
Harald Welted90ceb82022-07-17 22:10:58 +02001592 DF_GSM_ACCESS(),
Harald Welte6169c722022-02-12 09:05:15 +01001593 DF_WLAN(service=[59, 60, 61, 62, 63, 66, 81, 82, 83, 84, 88]),
1594 DF_HNB(service=[86, 90]),
1595 DF_ProSe(service=101),
1596 # FIXME: DF_ACDC service=108
1597 # FIXME: DF_TV service=116
1598 DF_USIM_5GS(service=[122, 123, 124, 125, 126, 127, 129, 130]),
Harald Weltefc67de22023-05-23 20:29:49 +02001599 DF_SNPN(service=[143,146]),
1600 DF_5G_ProSe(service=139),
Harald Welte2bee70c2023-05-25 09:14:28 +02001601 DF_SAIP(),
Harald Weltec91085e2022-02-10 18:05:45 +01001602 ]
Harald Welteb2edd142021-01-08 23:29:35 +01001603 self.add_files(files)
1604
1605 def decode_select_response(self, data_hex):
Philipp Maier5998a3a2021-11-16 15:16:39 +01001606 return pySim.ts_102_221.CardProfileUICC.decode_select_response(data_hex)
Harald Welteb2edd142021-01-08 23:29:35 +01001607
Harald Welte15fae982021-04-10 10:22:27 +02001608 @with_default_category('Application-Specific Commands')
1609 class AddlShellCommands(CommandSet):
1610 def __init__(self):
1611 super().__init__()
1612
1613 authenticate_parser = argparse.ArgumentParser()
1614 authenticate_parser.add_argument('rand', help='Random challenge')
1615 authenticate_parser.add_argument('autn', help='Authentication Nonce')
1616 #authenticate_parser.add_argument('--context', help='Authentication context', default='3G')
Harald Weltec91085e2022-02-10 18:05:45 +01001617
Harald Welte15fae982021-04-10 10:22:27 +02001618 @cmd2.with_argparser(authenticate_parser)
1619 def do_authenticate(self, opts):
1620 """Perform Authentication and Key Agreement (AKA)."""
1621 (data, sw) = self._cmd.card._scc.authenticate(opts.rand, opts.autn)
1622 self._cmd.poutput_json(data)
1623
Harald Welte12af7932022-02-15 16:39:08 +01001624 term_prof_parser = argparse.ArgumentParser()
1625 term_prof_parser.add_argument('PROFILE', help='Hexstring of encoded terminal profile')
1626
1627 @cmd2.with_argparser(term_prof_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001628 def do_terminal_profile(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001629 """Send a TERMINAL PROFILE command to the card.
1630 This is used to inform the card about which optional
1631 features the terminal (modem/phone) supports, particularly
1632 in the context of SIM Toolkit, Proactive SIM and OTA. You
1633 must specify a hex-string with the encoded terminal profile
1634 you want to send to the card."""
Harald Welte51b3abb2022-07-30 16:30:33 +02001635 (data, sw) = self._cmd.card._scc.terminal_profile(opts.PROFILE)
Harald Welte846a8982021-10-08 15:47:16 +02001636 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
Harald Welte15fae982021-04-10 10:22:27 +02001637
Harald Welte12af7932022-02-15 16:39:08 +01001638 envelope_parser = argparse.ArgumentParser()
1639 envelope_parser.add_argument('PAYLOAD', help='Hexstring of encoded payload to ENVELOPE')
1640
1641 @cmd2.with_argparser(envelope_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001642 def do_envelope(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001643 """Send an ENVELOPE command to the card. This is how a
1644 variety of information is communicated from the terminal
1645 (modem/phone) to the card, particularly in the context of
1646 SIM Toolkit, Proactive SIM and OTA."""
Harald Welte51b3abb2022-07-30 16:30:33 +02001647 (data, sw) = self._cmd.card._scc.envelope(opts.PAYLOAD)
Harald Welte7cb94e42021-10-08 15:47:57 +02001648 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
1649
Harald Welte12af7932022-02-15 16:39:08 +01001650 envelope_sms_parser = argparse.ArgumentParser()
1651 envelope_sms_parser.add_argument('TPDU', help='Hexstring of encoded SMS TPDU')
1652
1653 @cmd2.with_argparser(envelope_sms_parser)
Harald Welte51b3abb2022-07-30 16:30:33 +02001654 def do_envelope_sms(self, opts):
Harald Welte12af7932022-02-15 16:39:08 +01001655 """Send an ENVELOPE(SMS-PP-Download) command to the card.
1656 This emulates a terminal (modem/phone) having received a SMS
1657 with a PID of 'SMS for the SIM card'. You can use this
1658 command in the context of testing OTA related features
Philipp Maier4e5aa302023-06-06 19:22:19 +02001659 without a modem/phone or a cellular network."""
Harald Welte7cb94e42021-10-08 15:47:57 +02001660 tpdu_ie = SMS_TPDU()
Harald Welte51b3abb2022-07-30 16:30:33 +02001661 tpdu_ie.from_bytes(h2b(opts.TPDU))
Harald Weltec91085e2022-02-10 18:05:45 +01001662 dev_ids = DeviceIdentities(
1663 decoded={'source_dev_id': 'network', 'dest_dev_id': 'uicc'})
Harald Welte7cb94e42021-10-08 15:47:57 +02001664 sms_dl = SMSPPDownload(children=[dev_ids, tpdu_ie])
1665 (data, sw) = self._cmd.card._scc.envelope(b2h(sms_dl.to_tlv()))
1666 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
1667
Harald Welte7ec82232023-06-06 18:15:52 +02001668 get_id_parser = argparse.ArgumentParser()
1669 get_id_parser.add_argument("--nswo-context", action='store_true')
1670
1671 @cmd2.with_argparser(get_id_parser)
1672 def do_get_identity(self, opts):
1673 """Send a GET IDENTITY command to the card. This is part of the
1674 procedure for "SUCI calculation performed on USIM" supported
1675 by USIM with support for both EF.UST service 124 and 125."""
1676 context = 0x01 # SUCI
1677 if opts.nswo_context:
1678 context = 0x02 # SUCI 5G NSWO
1679 (data, sw) = self._cmd.card._scc.get_identity(context)
1680 do = SUCI_TlvDataObject()
1681 do.from_tlv(h2b(data))
1682 do_d = do.to_dict()
1683 self._cmd.poutput('SUCI TLV Data Object: %s' % do_d['suci__tlv_data_object'])
1684
Harald Welte15fae982021-04-10 10:22:27 +02001685
Harald Welteb2edd142021-01-08 23:29:35 +01001686# TS 31.102 Section 7.3
1687sw_usim = {
1688 'Security management': {
1689 '9862': 'Authentication error, incorrect MAC',
1690 '9864': 'Authentication error, security context not supported',
1691 '9865': 'Key freshness failure',
1692 '9866': 'Authentication error, no memory space available',
1693 '9867': 'Authentication error, no memory space available in EF MUK',
1694 }
1695}
1696
Harald Weltec91085e2022-02-10 18:05:45 +01001697
Philipp Maier57f65ee2021-10-18 14:09:02 +02001698class CardApplicationUSIM(CardApplication):
1699 def __init__(self):
Harald Weltec91085e2022-02-10 18:05:45 +01001700 super().__init__('USIM', adf=ADF_USIM(), sw=sw_usim)