blob: 30b65daba2c83add1b7af6886a9b322b8ef000d2 [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 Welte2f831032021-04-20 23:54:53 +02008Various constants from 3GPP TS 31.102 V16.6.0
Supreeth Herle475dcaa2020-03-20 18:57:39 +01009"""
10
11#
12# Copyright (C) 2020 Supreeth Herle <herlesupreeth@gmail.com>
Harald Welte790b2702021-04-11 00:01:35 +020013# Copyright (C) 2021 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
36from pySim.ts_102_221 import EF_ARR
37from pySim.tlv import *
38from pySim.filesystem import *
39from pySim.construct import *
40from construct import Optional as COptional
41from construct import *
42from typing import Tuple
43from struct import unpack, pack
44import enum
Supreeth Herle475dcaa2020-03-20 18:57:39 +010045EF_UST_map = {
Harald Weltec91085e2022-02-10 18:05:45 +010046 1: 'Local Phone Book',
47 2: 'Fixed Dialling Numbers (FDN)',
48 3: 'Extension 2',
49 4: 'Service Dialling Numbers (SDN)',
50 5: 'Extension3',
51 6: 'Barred Dialling Numbers (BDN)',
52 7: 'Extension4',
53 8: 'Outgoing Call Information (OCI and OCT)',
54 9: 'Incoming Call Information (ICI and ICT)',
55 10: 'Short Message Storage (SMS)',
56 11: 'Short Message Status Reports (SMSR)',
57 12: 'Short Message Service Parameters (SMSP)',
58 13: 'Advice of Charge (AoC)',
59 14: 'Capability Configuration Parameters 2 (CCP2)',
60 15: 'Cell Broadcast Message Identifier',
61 16: 'Cell Broadcast Message Identifier Ranges',
62 17: 'Group Identifier Level 1',
63 18: 'Group Identifier Level 2',
64 19: 'Service Provider Name',
65 20: 'User controlled PLMN selector with Access Technology',
66 21: 'MSISDN',
67 22: 'Image (IMG)',
68 23: 'Support of Localised Service Areas (SoLSA)',
69 24: 'Enhanced Multi-Level Precedence and Pre-emption Service',
70 25: 'Automatic Answer for eMLPP',
71 26: 'RFU',
72 27: 'GSM Access',
73 28: 'Data download via SMS-PP',
74 29: 'Data download via SMS-CB',
75 30: 'Call Control by USIM',
76 31: 'MO-SMS Control by USIM',
77 32: 'RUN AT COMMAND command',
78 33: 'shall be set to 1',
79 34: 'Enabled Services Table',
80 35: 'APN Control List (ACL)',
81 36: 'Depersonalisation Control Keys',
82 37: 'Co-operative Network List',
83 38: 'GSM security context',
84 39: 'CPBCCH Information',
85 40: 'Investigation Scan',
86 41: 'MexE',
87 42: 'Operator controlled PLMN selector with Access Technology',
88 43: 'HPLMN selector with Access Technology',
89 44: 'Extension 5',
90 45: 'PLMN Network Name',
91 46: 'Operator PLMN List',
92 47: 'Mailbox Dialling Numbers',
93 48: 'Message Waiting Indication Status',
94 49: 'Call Forwarding Indication Status',
95 50: 'Reserved and shall be ignored',
96 51: 'Service Provider Display Information',
97 52: 'Multimedia Messaging Service (MMS)',
98 53: 'Extension 8',
99 54: 'Call control on GPRS by USIM',
100 55: 'MMS User Connectivity Parameters',
101 56: 'Network\'s indication of alerting in the MS (NIA)',
102 57: 'VGCS Group Identifier List (EFVGCS and EFVGCSS)',
103 58: 'VBS Group Identifier List (EFVBS and EFVBSS)',
104 59: 'Pseudonym',
105 60: 'User Controlled PLMN selector for I-WLAN access',
106 61: 'Operator Controlled PLMN selector for I-WLAN access',
107 62: 'User controlled WSID list',
108 63: 'Operator controlled WSID list',
109 64: 'VGCS security',
110 65: 'VBS security',
111 66: 'WLAN Reauthentication Identity',
112 67: 'Multimedia Messages Storage',
113 68: 'Generic Bootstrapping Architecture (GBA)',
114 69: 'MBMS security',
115 70: 'Data download via USSD and USSD application mode',
116 71: 'Equivalent HPLMN',
117 72: 'Additional TERMINAL PROFILE after UICC activation',
118 73: 'Equivalent HPLMN Presentation Indication',
119 74: 'Last RPLMN Selection Indication',
120 75: 'OMA BCAST Smart Card Profile',
121 76: 'GBA-based Local Key Establishment Mechanism',
122 77: 'Terminal Applications',
123 78: 'Service Provider Name Icon',
124 79: 'PLMN Network Name Icon',
125 80: 'Connectivity Parameters for USIM IP connections',
126 81: 'Home I-WLAN Specific Identifier List',
127 82: 'I-WLAN Equivalent HPLMN Presentation Indication',
128 83: 'I-WLAN HPLMN Priority Indication',
129 84: 'I-WLAN Last Registered PLMN',
130 85: 'EPS Mobility Management Information',
131 86: 'Allowed CSG Lists and corresponding indications',
132 87: 'Call control on EPS PDN connection by USIM',
133 88: 'HPLMN Direct Access',
134 89: 'eCall Data',
135 90: 'Operator CSG Lists and corresponding indications',
136 91: 'Support for SM-over-IP',
137 92: 'Support of CSG Display Control',
138 93: 'Communication Control for IMS by USIM',
139 94: 'Extended Terminal Applications',
140 95: 'Support of UICC access to IMS',
141 96: 'Non-Access Stratum configuration by USIM',
142 97: 'PWS configuration by USIM',
143 98: 'RFU',
144 99: 'URI support by UICC',
145 100: 'Extended EARFCN support',
146 101: 'ProSe',
147 102: 'USAT Application Pairing',
148 103: 'Media Type support',
149 104: 'IMS call disconnection cause',
150 105: 'URI support for MO SHORT MESSAGE CONTROL',
151 106: 'ePDG configuration Information support',
152 107: 'ePDG configuration Information configured',
153 108: 'ACDC support',
154 109: 'MCPTT',
155 110: 'ePDG configuration Information for Emergency Service support',
156 111: 'ePDG configuration Information for Emergency Service configured',
157 112: 'eCall Data over IMS',
158 113: 'URI support for SMS-PP DOWNLOAD as defined in 3GPP TS 31.111 [12]',
159 114: 'From Preferred',
160 115: 'IMS configuration data',
161 116: 'TV configuration',
162 117: '3GPP PS Data Off',
163 118: '3GPP PS Data Off Service List',
164 119: 'V2X',
165 120: 'XCAP Configuration Data',
166 121: 'EARFCN list for MTC/NB-IOT UEs',
167 122: '5GS Mobility Management Information',
168 123: '5G Security Parameters',
169 124: 'Subscription identifier privacy support',
170 125: 'SUCI calculation by the USIM',
171 126: 'UAC Access Identities support',
172 127: 'Expect control plane-based Steering of Roaming information during initial registration in VPLMN',
173 128: 'Call control on PDU Session by USIM',
174 129: '5GS Operator PLMN List',
175 130: 'Support for SUPI of type NSI or GLI or GCI',
176 131: '3GPP PS Data Off separate Home and Roaming lists',
177 132: 'Support for URSP by USIM',
178 133: '5G Security Parameters extended',
179 134: 'MuD and MiD configuration data',
180 135: 'Support for Trusted non-3GPP access networks by USIM'
Sebastian Viviani0dc8f692020-05-29 00:14:55 +0100181}
182
Harald Weltee8947492022-02-10 10:33:20 +0100183# Mapping between USIM Enbled Service Number and its description
184EF_EST_map = {
185 1: 'Fixed Dialling Numbers (FDN)',
186 2: 'Barred Dialling Numbers (BDN)',
187 3: 'APN Control List (ACL)'
188}
189
Sebastian Vivianie61170c2020-06-03 08:57:00 +0100190LOCI_STATUS_map = {
Harald Weltec91085e2022-02-10 18:05:45 +0100191 0: 'updated',
192 1: 'not updated',
193 2: 'plmn not allowed',
194 3: 'locatation area not allowed'
Sebastian Vivianie61170c2020-06-03 08:57:00 +0100195}
herlesupreetha562ea02020-09-16 20:17:22 +0200196
Sebastian Viviani0dc8f692020-05-29 00:14:55 +0100197EF_USIM_ADF_map = {
Harald Weltec91085e2022-02-10 18:05:45 +0100198 'LI': '6F05',
199 'ARR': '6F06',
200 'IMSI': '6F07',
201 'Keys': '6F08',
202 'KeysPS': '6F09',
203 'DCK': '6F2C',
204 'HPPLMN': '6F31',
205 'CNL': '6F32',
206 'ACMmax': '6F37',
207 'UST': '6F38',
208 'ACM': '6F39',
209 'FDN': '6F3B',
210 'SMS': '6F3C',
211 'GID1': '6F3E',
212 'GID2': '6F3F',
213 'MSISDN': '6F40',
214 'PUCT': '6F41',
215 'SMSP': '6F42',
216 'SMSS': '6F42',
217 'CBMI': '6F45',
218 'SPN': '6F46',
219 'SMSR': '6F47',
220 'CBMID': '6F48',
221 'SDN': '6F49',
222 'EXT2': '6F4B',
223 'EXT3': '6F4C',
224 'BDN': '6F4D',
225 'EXT5': '6F4E',
226 'CCP2': '6F4F',
227 'CBMIR': '6F50',
228 'EXT4': '6F55',
229 'EST': '6F56',
230 'ACL': '6F57',
231 'CMI': '6F58',
232 'START-HFN': '6F5B',
233 'THRESHOLD': '6F5C',
234 'PLMNwAcT': '6F60',
235 'OPLMNwAcT': '6F61',
236 'HPLMNwAcT': '6F62',
237 'PSLOCI': '6F73',
238 'ACC': '6F78',
239 'FPLMN': '6F7B',
240 'LOCI': '6F7E',
241 'ICI': '6F80',
242 'OCI': '6F81',
243 'ICT': '6F82',
244 'OCT': '6F83',
245 'AD': '6FAD',
246 'VGCS': '6FB1',
247 'VGCSS': '6FB2',
248 'VBS': '6FB3',
249 'VBSS': '6FB4',
250 'eMLPP': '6FB5',
251 'AAeM': '6FB6',
252 'ECC': '6FB7',
253 'Hiddenkey': '6FC3',
254 'NETPAR': '6FC4',
255 'PNN': '6FC5',
256 'OPL': '6FC6',
257 'MBDN': '6FC7',
258 'EXT6': '6FC8',
259 'MBI': '6FC9',
260 'MWIS': '6FCA',
261 'CFIS': '6FCB',
262 'EXT7': '6FCC',
263 'SPDI': '6FCD',
264 'MMSN': '6FCE',
265 'EXT8': '6FCF',
266 'MMSICP': '6FD0',
267 'MMSUP': '6FD1',
268 'MMSUCP': '6FD2',
269 'NIA': '6FD3',
270 'VGCSCA': '6FD4',
271 'VBSCA': '6FD5',
272 'GBAP': '6FD6',
273 'MSK': '6FD7',
274 'MUK': '6FD8',
275 'EHPLMN': '6FD9',
276 'GBANL': '6FDA',
277 'EHPLMNPI': '6FDB',
278 'LRPLMNSI': '6FDC',
279 'NAFKCA': '6FDD',
280 'SPNI': '6FDE',
281 'PNNI': '6FDF',
282 'NCP-IP': '6FE2',
283 'EPSLOCI': '6FE3',
284 'EPSNSC': '6FE4',
285 'UFC': '6FE6',
286 'UICCIARI': '6FE7',
287 'NASCONFIG': '6FE8',
288 'PWC': '6FEC',
289 'FDNURI': '6FED',
290 'BDNURI': '6FEE',
291 'SDNURI': '6FEF',
292 'IWL': '6FF0',
293 'IPS': '6FF1',
294 'IPD': '6FF2',
295 'ePDGId': '6FF3',
296 'ePDGSelection': '6FF4',
297 'ePDGIdEm': '6FF5',
298 'ePDGSelectionEm': '6FF6',
Sebastian Viviani0dc8f692020-05-29 00:14:55 +0100299}
Harald Welteb2edd142021-01-08 23:29:35 +0100300
301######################################################################
302# ADF.USIM
303######################################################################
304
Harald Welteb2edd142021-01-08 23:29:35 +0100305
Harald Weltef12979d2021-05-29 21:47:13 +0200306# 3GPP TS 31.102 Section 4.4.11.4 (EF_5GS3GPPNSC)
Harald Weltec91085e2022-02-10 18:05:45 +0100307
Harald Weltef12979d2021-05-29 21:47:13 +0200308class EF_5GS3GPPNSC(LinFixedEF):
309 class NgKSI(BER_TLV_IE, tag=0x80):
310 _construct = Int8ub
311
312 class K_AMF(BER_TLV_IE, tag=0x81):
313 _construct = HexAdapter(Bytes(32))
314
315 class UplinkNASCount(BER_TLV_IE, tag=0x82):
316 _construct = Int32ub
317
318 class DownlinkNASCount(BER_TLV_IE, tag=0x83):
319 _construct = Int32ub
320
321 class IdsOfSelectedNasAlgos(BER_TLV_IE, tag=0x84):
322 # 3GPP TS 24.501 Section 9.11.3.34
323 _construct = BitStruct('ciphering'/Nibble, 'integrity'/Nibble)
324
325 class IdsOfSelectedEpsAlgos(BER_TLV_IE, tag=0x85):
326 # 3GPP TS 24.301 Section 9.9.3.23
327 _construct = BitStruct('ciphering'/Nibble, 'integrity'/Nibble)
328
329 class FiveGSNasSecurityContext(BER_TLV_IE, tag=0xA0,
Harald Weltec91085e2022-02-10 18:05:45 +0100330 nested=[NgKSI, K_AMF, UplinkNASCount,
331 DownlinkNASCount, IdsOfSelectedNasAlgos,
332 IdsOfSelectedEpsAlgos]):
Harald Weltef12979d2021-05-29 21:47:13 +0200333 pass
334
335 def __init__(self, fid="4f03", sfid=0x03, name='EF.5GS3GPPNSC', rec_len={57, None},
Harald Weltec91085e2022-02-10 18:05:45 +0100336 desc='5GS 3GPP Access NAS Security Context'):
Harald Weltef12979d2021-05-29 21:47:13 +0200337 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)
Harald Welte65516272022-02-10 17:51:05 +0100338 self._tlv = EF_5GS3GPPNSC.FiveGSNasSecurityContext
Harald Weltef12979d2021-05-29 21:47:13 +0200339
340# 3GPP TS 31.102 Section 4.4.11.6
Harald Weltec91085e2022-02-10 18:05:45 +0100341
342
Harald Weltef12979d2021-05-29 21:47:13 +0200343class EF_5GAUTHKEYS(TransparentEF):
344 class K_AUSF(BER_TLV_IE, tag=0x80):
345 _construct = HexAdapter(GreedyBytes)
346
347 class K_SEAF(BER_TLV_IE, tag=0x81):
348 _construct = HexAdapter(GreedyBytes)
349
350 class FiveGAuthKeys(TLV_IE_Collection, nested=[K_AUSF, K_SEAF]):
351 pass
352
353 def __init__(self, fid='4f05', sfid=0x05, name='EF.5GAUTHKEYS', size={68, None},
Harald Weltec91085e2022-02-10 18:05:45 +0100354 desc='5G authentication keys'):
Harald Weltef12979d2021-05-29 21:47:13 +0200355 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Welte65516272022-02-10 17:51:05 +0100356 self._tlv = EF_5GAUTHKEYS.FiveGAuthKeys
Harald Weltef12979d2021-05-29 21:47:13 +0200357
358# 3GPP TS 31.102 Section 4.4.11.8
Harald Weltec91085e2022-02-10 18:05:45 +0100359
360
Harald Weltef12979d2021-05-29 21:47:13 +0200361class ProtSchemeIdList(BER_TLV_IE, tag=0xa0):
362 # FIXME: 3GPP TS 24.501 Protection Scheme Identifier
363 # repeated sequence of (id, index) tuples
Harald Weltec91085e2022-02-10 18:05:45 +0100364 _construct = GreedyRange(
365 Struct('id'/Enum(Byte, null=0, A=1, B=2), 'index'/Int8ub))
366
Harald Weltef12979d2021-05-29 21:47:13 +0200367
368class HomeNetPubKeyId(BER_TLV_IE, tag=0x80):
369 # 3GPP TS 24.501 / 3GPP TS 23.003
370 _construct = Int8ub
371
Harald Weltec91085e2022-02-10 18:05:45 +0100372
Harald Weltef12979d2021-05-29 21:47:13 +0200373class HomeNetPubKey(BER_TLV_IE, tag=0x81):
374 # FIXME: RFC 5480
375 _construct = HexAdapter(GreedyBytes)
376
Harald Weltec91085e2022-02-10 18:05:45 +0100377
Harald Weltef12979d2021-05-29 21:47:13 +0200378class HomeNetPubKeyList(BER_TLV_IE, tag=0xa1,
Harald Weltec91085e2022-02-10 18:05:45 +0100379 nested=[HomeNetPubKeyId, HomeNetPubKey]):
Harald Weltef12979d2021-05-29 21:47:13 +0200380 pass
381
382# 3GPP TS 31.102 Section 4.4.11.6
Harald Weltec91085e2022-02-10 18:05:45 +0100383
384
385class SUCI_CalcInfo(TLV_IE_Collection, nested=[ProtSchemeIdList, HomeNetPubKeyList]):
Harald Weltef12979d2021-05-29 21:47:13 +0200386 pass
387
388
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200389# TS 31.102 4.4.11.8
390class EF_SUCI_Calc_Info(TransparentEF):
391 def __init__(self, fid="4f07", sfid=0x07, name='EF.SUCI_Calc_Info', size={2, None},
Harald Weltec91085e2022-02-10 18:05:45 +0100392 desc='SUCI Calc Info'):
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200393 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
394
395 def _encode_prot_scheme_id_list(self, in_list):
396 out_bytes = [0xa0]
Harald Weltec91085e2022-02-10 18:05:45 +0100397 out_bytes.append(len(in_list)*2) # two byte per entry
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200398
399 # position in list determines priority; high-priority items (low index) come first
400 for scheme in sorted(in_list, key=lambda item: item["priority"]):
401 out_bytes.append(scheme["identifier"])
402 out_bytes.append(scheme["key_index"])
403
404 return out_bytes
405
406 def _encode_hnet_pubkey_list(self, hnet_pubkey_list):
Harald Weltec91085e2022-02-10 18:05:45 +0100407 out_bytes = [0xa1] # pubkey list tag
408 out_bytes.append(0x00) # length filled later
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200409 length = 0
410
411 for key in hnet_pubkey_list:
Harald Weltec91085e2022-02-10 18:05:45 +0100412 out_bytes.append(0x80) # identifier tag
413 out_bytes.append(0x01) # TODO size, fixed to 1 byte
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200414 out_bytes.append(key["hnet_pubkey_identifier"])
Harald Weltec91085e2022-02-10 18:05:45 +0100415 out_bytes.append(0x81) # key tag
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200416 out_bytes.append(len(key["hnet_pubkey"])//2)
417 length += 5+len(key["hnet_pubkey"])//2
418
419 pubkey_bytes = h2b(key["hnet_pubkey"])
420 out_bytes += pubkey_bytes
421
422 # fill length
423 out_bytes[1] = length
424 return out_bytes
425
426 def _encode_hex(self, in_json):
Harald Weltec91085e2022-02-10 18:05:45 +0100427 out_bytes = self._encode_prot_scheme_id_list(
428 in_json['prot_scheme_id_list'])
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200429 out_bytes += self._encode_hnet_pubkey_list(in_json['hnet_pubkey_list'])
430 return "".join(["%02X" % i for i in out_bytes])
431
432 def _decode_prot_scheme_id_list(self, in_bytes):
433 prot_scheme_id_list = []
434 pos = 0
435 # two bytes per entry
436 while pos < len(in_bytes):
437 prot_scheme = {
Harald Weltec91085e2022-02-10 18:05:45 +0100438 'priority': pos//2, # first in list: high priority
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200439 'identifier': in_bytes[pos],
440 'key_index': in_bytes[pos+1]
441 }
442 pos += 2
443 prot_scheme_id_list.append(prot_scheme)
444 return prot_scheme_id_list
445
446 def _decode_hnet_pubkey_list(self, in_bytes):
447 hnet_pubkey_list = []
448 pos = 0
449 if in_bytes[pos] != 0xa1:
450 print("missing Home Network Public Key List data object")
451 return {}
452 pos += 1
453 hnet_pubkey_list_len = in_bytes[pos]
454 pos += 1
455
456 while pos < hnet_pubkey_list_len:
457 if in_bytes[pos] != 0x80:
458 print("missing Home Network Public Key Identifier tag")
459 return {}
460 pos += 1
Harald Weltec91085e2022-02-10 18:05:45 +0100461 # TODO might be more than 1 byte?
462 hnet_pubkey_id_len = in_bytes[pos]
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200463 pos += 1
464 hnet_pubkey_id = in_bytes[pos:pos+hnet_pubkey_id_len][0]
465 pos += hnet_pubkey_id_len
466 if in_bytes[pos] != 0x81:
467 print("missing Home Network Public Key tag")
468 return {}
469 pos += 1
470 hnet_pubkey_len = in_bytes[pos]
471 pos += 1
472 hnet_pubkey = in_bytes[pos:pos+hnet_pubkey_len]
473 pos += hnet_pubkey_len
474
475 hnet_pubkey_list.append({
476 'hnet_pubkey_identifier': hnet_pubkey_id,
477 'hnet_pubkey': b2h(hnet_pubkey)
478 })
479
480 return hnet_pubkey_list
481
482 def _decode_bin(self, in_bin):
Vadim Yanitskiy5e41eeb2021-05-02 02:20:33 +0200483 return self._decode_hex(b2h(in_bin))
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200484
485 def _decode_hex(self, in_hex):
486 in_bytes = h2b(in_hex)
487 pos = 0
488
489 if in_bytes[pos] != 0xa0:
490 print("missing Protection Scheme Identifier List data object tag")
491 return {}
492 pos += 1
493
Harald Weltec91085e2022-02-10 18:05:45 +0100494 prot_scheme_id_list_len = in_bytes[pos] # TODO maybe more than 1 byte
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200495 pos += 1
496 # decode Protection Scheme Identifier List data object
Harald Weltec91085e2022-02-10 18:05:45 +0100497 prot_scheme_id_list = self._decode_prot_scheme_id_list(
498 in_bytes[pos:pos+prot_scheme_id_list_len])
Merlin Chlosta05ca36b2021-04-01 16:15:28 +0200499 pos += prot_scheme_id_list_len
500
501 # remaining data holds Home Network Public Key Data Object
502 hnet_pubkey_list = self._decode_hnet_pubkey_list(in_bytes[pos:])
503
504 return {
505 'prot_scheme_id_list': prot_scheme_id_list,
506 'hnet_pubkey_list': hnet_pubkey_list
507 }
508
509 def _encode_bin(self, in_json):
510 return h2b(self._encode_hex(in_json))
511
Harald Weltec91085e2022-02-10 18:05:45 +0100512
Harald Welteb2edd142021-01-08 23:29:35 +0100513class EF_LI(TransRecEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100514 def __init__(self, fid='6f05', sfid=None, name='EF.LI', size={2, None}, rec_len=2,
Harald Welteb2edd142021-01-08 23:29:35 +0100515 desc='Language Indication'):
516 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)
Harald Weltec91085e2022-02-10 18:05:45 +0100517
Harald Welteb2edd142021-01-08 23:29:35 +0100518 def _decode_record_bin(self, in_bin):
519 if in_bin == b'\xff\xff':
520 return None
521 else:
522 # officially this is 7-bit GSM alphabet with one padding bit in each byte
523 return in_bin.decode('ascii')
Harald Weltec91085e2022-02-10 18:05:45 +0100524
Harald Welteb2edd142021-01-08 23:29:35 +0100525 def _encode_record_bin(self, in_json):
526 if in_json == None:
527 return b'\xff\xff'
528 else:
529 # officially this is 7-bit GSM alphabet with one padding bit in each byte
530 return in_json.encode('ascii')
531
Harald Weltec91085e2022-02-10 18:05:45 +0100532
Harald Welteb2edd142021-01-08 23:29:35 +0100533class EF_Keys(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100534 def __init__(self, fid='6f08', sfid=0x08, name='EF.Keys', size={33, 33},
Harald Welteb2edd142021-01-08 23:29:35 +0100535 desc='Ciphering and Integrity Keys'):
536 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Weltec91085e2022-02-10 18:05:45 +0100537 self._construct = Struct(
538 'ksi'/Int8ub, 'ck'/HexAdapter(Bytes(16)), 'ik'/HexAdapter(Bytes(16)))
Harald Welteb2edd142021-01-08 23:29:35 +0100539
Harald Welte14105dc2021-05-31 08:48:51 +0200540# TS 31.102 Section 4.2.6
Harald Weltec91085e2022-02-10 18:05:45 +0100541
542
Harald Welte14105dc2021-05-31 08:48:51 +0200543class EF_HPPLMN(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100544 def __init__(self, fid='6f31', sfid=0x12, name='EF.HPPLMN', size={1, 1},
Harald Welte14105dc2021-05-31 08:48:51 +0200545 desc='Higher Priority PLMN search period'):
546 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
547 self._construct = Int8ub
548
549# TS 31.102 Section 4.2.8
Harald Weltec91085e2022-02-10 18:05:45 +0100550
551
Harald Weltee8947492022-02-10 10:33:20 +0100552class EF_UServiceTable(TransparentEF):
Harald Welte6169c722022-02-12 09:05:15 +0100553 def __init__(self, fid, sfid, name, desc, size, table, **kwargs):
554 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltee8947492022-02-10 10:33:20 +0100555 self.table = table
Harald Welteb2edd142021-01-08 23:29:35 +0100556 # add those commands to the general commands of a TransparentEF
557 self.shell_commands += [self.AddlShellCommands()]
Harald Weltec91085e2022-02-10 18:05:45 +0100558
Harald Weltee8947492022-02-10 10:33:20 +0100559 @staticmethod
Harald Weltec91085e2022-02-10 18:05:45 +0100560 def _bit_byte_offset_for_service(service: int) -> Tuple[int, int]:
Harald Weltee8947492022-02-10 10:33:20 +0100561 i = service - 1
562 byte_offset = i//8
563 bit_offset = (i % 8)
564 return (byte_offset, bit_offset)
Harald Weltec91085e2022-02-10 18:05:45 +0100565
Harald Welteb2edd142021-01-08 23:29:35 +0100566 def _decode_bin(self, in_bin):
Harald Weltee8947492022-02-10 10:33:20 +0100567 ret = {}
Harald Weltec91085e2022-02-10 18:05:45 +0100568 for i in range(0, len(in_bin)):
Harald Welteb2edd142021-01-08 23:29:35 +0100569 byte = in_bin[i]
Harald Weltec91085e2022-02-10 18:05:45 +0100570 for bitno in range(0, 7):
Harald Weltee8947492022-02-10 10:33:20 +0100571 service_nr = i * 8 + bitno + 1
572 ret[service_nr] = {
Harald Weltec91085e2022-02-10 18:05:45 +0100573 'activated': True if byte & (1 << bitno) else False
Harald Weltee8947492022-02-10 10:33:20 +0100574 }
575 if service_nr in self.table:
576 ret[service_nr]['description'] = self.table[service_nr]
Harald Welteb2edd142021-01-08 23:29:35 +0100577 return ret
Harald Weltec91085e2022-02-10 18:05:45 +0100578
Harald Welteb2edd142021-01-08 23:29:35 +0100579 def _encode_bin(self, in_json):
Harald Weltee8947492022-02-10 10:33:20 +0100580 # compute the required binary size
581 bin_len = 0
582 for srv in in_json.keys():
583 service_nr = int(srv)
Harald Weltec91085e2022-02-10 18:05:45 +0100584 (byte_offset, bit_offset) = EF_UServiceTable._bit_byte_offset_for_service(
585 service_nr)
Harald Weltee8947492022-02-10 10:33:20 +0100586 if byte_offset >= bin_len:
587 bin_len = byte_offset+1
588 # encode the actual data
589 out = bytearray(b'\x00' * bin_len)
590 for srv in in_json.keys():
591 service_nr = int(srv)
Harald Weltec91085e2022-02-10 18:05:45 +0100592 (byte_offset, bit_offset) = EF_UServiceTable._bit_byte_offset_for_service(
593 service_nr)
Harald Weltee8947492022-02-10 10:33:20 +0100594 if in_json[srv]['activated'] == True:
595 bit = 1
596 else:
597 bit = 0
598 out[byte_offset] |= (bit) << bit_offset
599 return out
Harald Weltec91085e2022-02-10 18:05:45 +0100600
Harald Welteb2edd142021-01-08 23:29:35 +0100601 @with_default_category('File-Specific Commands')
602 class AddlShellCommands(CommandSet):
603 def __init__(self):
604 super().__init__()
605
606 def do_ust_service_activate(self, arg):
607 """Activate a service within EF.UST"""
608 self._cmd.card.update_ust(int(arg), 1)
609
610 def do_ust_service_deactivate(self, arg):
611 """Deactivate a service within EF.UST"""
612 self._cmd.card.update_ust(int(arg), 0)
613
Harald Welte89e59542021-04-02 21:33:13 +0200614# TS 31.103 Section 4.2.7 - *not* the same as DF.GSM/EF.ECC!
Harald Weltec91085e2022-02-10 18:05:45 +0100615
616
Harald Welte89e59542021-04-02 21:33:13 +0200617class EF_ECC(LinFixedEF):
Harald Welteff2d86d2022-01-21 15:19:47 +0100618 cc_construct = Rpad(BcdAdapter(Rpad(Bytes(3))), pattern='f')
619 category_construct = FlagsEnum(Byte, police=1, ambulance=2, fire_brigade=3, marine_guard=4,
620 mountain_rescue=5, manual_ecall=6, automatic_ecall=7)
621 alpha_construct = GsmStringAdapter(Rpad(GreedyBytes))
Harald Weltec91085e2022-02-10 18:05:45 +0100622
Harald Welte89e59542021-04-02 21:33:13 +0200623 def __init__(self, fid='6fb7', sfid=0x01, name='EF.ECC',
624 desc='Emergency Call Codes'):
Harald Weltec91085e2022-02-10 18:05:45 +0100625 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len={4, 20})
626
Harald Welteff2d86d2022-01-21 15:19:47 +0100627 def _decode_record_bin(self, in_bin):
628 # mandatory parts
629 code = in_bin[:3]
630 if code == b'\xff\xff\xff':
631 return None
632 svc_category = in_bin[-1:]
633 ret = {'call_code': parse_construct(EF_ECC.cc_construct, code),
Harald Weltec91085e2022-02-10 18:05:45 +0100634 'service_category': parse_construct(EF_ECC.category_construct, svc_category)}
Harald Welteff2d86d2022-01-21 15:19:47 +0100635 # optional alpha identifier
636 if len(in_bin) > 4:
637 alpha_id = in_bin[3:-1]
638 ret['alpha_id'] = parse_construct(EF_ECC.alpha_construct, alpha_id)
639 return ret
Harald Weltec91085e2022-02-10 18:05:45 +0100640
Harald Welteff2d86d2022-01-21 15:19:47 +0100641 def _encode_record_bin(self, in_json):
642 if in_json is None:
643 return b'\xff\xff\xff\xff'
644 code = EF_ECC.cc_construct.build(in_json['call_code'])
645 svc_category = EF_ECC.category_construct.build(in_json['category'])
646 alpha_id = EF_ECC.alpha_construct.build(in_json['alpha_id'])
647 # FIXME: alpha_id needs padding up to 'record_length - 4'
648 return code + alpha_id + svc_category
649
Harald Welte89e59542021-04-02 21:33:13 +0200650
Harald Welte790b2702021-04-11 00:01:35 +0200651# TS 31.102 Section 4.2.17
652class EF_LOCI(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100653 def __init__(self, fid='6f7e', sfid=0x0b, name='EF.LOCI', desc='Location information', size={11, 11}):
Harald Welte790b2702021-04-11 00:01:35 +0200654 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
655 self._construct = Struct('tmsi'/HexAdapter(Bytes(4)), 'lai'/HexAdapter(Bytes(5)), 'rfu'/Int8ub,
656 'lu_status'/Int8ub)
Harald Welte592b32e2021-06-05 11:26:36 +0200657# TS 31.102 Section 4.2.18
Harald Weltec91085e2022-02-10 18:05:45 +0100658
659
Harald Welte592b32e2021-06-05 11:26:36 +0200660class EF_AD(TransparentEF):
661 class OP_MODE(enum.IntEnum):
Harald Weltec91085e2022-02-10 18:05:45 +0100662 normal = 0x00
663 type_approval = 0x80
664 normal_and_specific_facilities = 0x01
665 type_approval_and_specific_facilities = 0x81
666 maintenance_off_line = 0x02
667 cell_test = 0x04
Harald Welte592b32e2021-06-05 11:26:36 +0200668
Harald Weltec91085e2022-02-10 18:05:45 +0100669 def __init__(self, fid='6fad', sfid=0x03, name='EF.AD', desc='Administrative Data', size={4, 6}):
Harald Welte592b32e2021-06-05 11:26:36 +0200670 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
671 self._construct = BitStruct(
672 # Byte 1
673 'ms_operation_mode'/Bytewise(Enum(Byte, EF_AD.OP_MODE)),
674 # Byte 2 + 3
675 'additional_info'/Bytewise(FlagsEnum(Int16ub, ciphering_indicator=1, csg_display_control=2,
676 prose_services=4, extended_drx=8)),
677 'rfu'/BitsRFU(4),
678 'mnc_len'/BitsInteger(4),
679 'extensions'/COptional(Bytewise(GreedyBytesRFU))
680 )
Harald Welte790b2702021-04-11 00:01:35 +0200681
682# TS 31.102 Section 4.2.23
Harald Weltec91085e2022-02-10 18:05:45 +0100683
684
Harald Welte790b2702021-04-11 00:01:35 +0200685class EF_PSLOCI(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100686 def __init__(self, fid='6f73', sfid=0x0c, name='EF.PSLOCI', desc='PS Location information', size={14, 14}):
Harald Welte790b2702021-04-11 00:01:35 +0200687 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
688 self._construct = Struct('ptmsi'/HexAdapter(Bytes(4)), 'ptmsi_sig'/HexAdapter(Bytes(3)),
689 'rai'/HexAdapter(Bytes(6)), 'rau_status'/Int8ub)
690
691# TS 31.102 Section 4.2.33
Harald Weltec91085e2022-02-10 18:05:45 +0100692
693
Harald Welte790b2702021-04-11 00:01:35 +0200694class EF_ICI(CyclicEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100695 def __init__(self, fid='6f80', sfid=0x14, name='EF.ICI', rec_len={28, 48},
Harald Welte6169c722022-02-12 09:05:15 +0100696 desc='Incoming Call Information', **kwargs):
697 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200698 self._construct = Struct('alpha_id'/Bytes(this._.total_len-28),
699 'len_of_bcd_contents'/Int8ub,
700 'ton_npi'/Int8ub,
701 'call_number'/BcdAdapter(Bytes(10)),
702 'cap_cfg2_record_id'/Int8ub,
703 'ext5_record_id'/Int8ub,
704 'date_and_time'/BcdAdapter(Bytes(7)),
705 'duration'/Int24ub,
706 'status'/Byte,
707 'link_to_phonebook'/Bytes(3))
708
709# TS 31.102 Section 4.2.34
Harald Weltec91085e2022-02-10 18:05:45 +0100710
711
Harald Welte790b2702021-04-11 00:01:35 +0200712class EF_OCI(CyclicEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100713 def __init__(self, fid='6f81', sfid=0x15, name='EF.OCI', rec_len={27, 47},
Harald Welte6169c722022-02-12 09:05:15 +0100714 desc='Outgoing Call Information', **kwargs):
715 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200716 self._construct = Struct('alpha_id'/Bytes(this._.total_len-27),
717 'len_of_bcd_contents'/Int8ub,
718 'ton_npi'/Int8ub,
719 'call_number'/BcdAdapter(Bytes(10)),
720 'cap_cfg2_record_id'/Int8ub,
721 'ext5_record_id'/Int8ub,
722 'date_and_time'/BcdAdapter(Bytes(7)),
723 'duration'/Int24ub,
724 'link_to_phonebook'/Bytes(3))
725
726# TS 31.102 Section 4.2.35
Harald Weltec91085e2022-02-10 18:05:45 +0100727
728
Harald Welte790b2702021-04-11 00:01:35 +0200729class EF_ICT(CyclicEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100730 def __init__(self, fid='6f82', sfid=None, name='EF.ICT', rec_len={3, 3},
Harald Welte6169c722022-02-12 09:05:15 +0100731 desc='Incoming Call Timer', **kwargs):
732 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200733 self._construct = Struct('accumulated_call_timer'/Int24ub)
734
735# TS 31.102 Section 4.2.38
Harald Weltec91085e2022-02-10 18:05:45 +0100736
737
Harald Welte790b2702021-04-11 00:01:35 +0200738class EF_CCP2(LinFixedEF):
Harald Welte6169c722022-02-12 09:05:15 +0100739 def __init__(self, fid='6f4f', sfid=0x16, name='EF.CCP2', desc='Capability Configuration Parameters 2', **kwargs):
740 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={15, None}, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200741
742# TS 31.102 Section 4.2.48
Harald Weltec91085e2022-02-10 18:05:45 +0100743
744
Harald Welte790b2702021-04-11 00:01:35 +0200745class EF_ACL(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100746 def __init__(self, fid='6f57', sfid=None, name='EF.ACL', size={32, None},
Harald Welte6169c722022-02-12 09:05:15 +0100747 desc='Access Point Name Control List', **kwargs):
748 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200749 self._construct = Struct('num_of_apns'/Int8ub, 'tlvs'/GreedyBytes)
750
751# TS 31.102 Section 4.2.51
Harald Weltec91085e2022-02-10 18:05:45 +0100752
753
Harald Welte790b2702021-04-11 00:01:35 +0200754class EF_START_HFN(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100755 def __init__(self, fid='6f5b', sfid=0x0f, name='EF.START-HFN', size={6, 6},
Harald Welte6169c722022-02-12 09:05:15 +0100756 desc='Initialisation values for Hyperframe number', **kwargs):
757 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200758 self._construct = Struct('start_cs'/Int24ub, 'start_ps'/Int24ub)
759
760# TS 31.102 Section 4.2.52
Harald Weltec91085e2022-02-10 18:05:45 +0100761
762
Harald Welte790b2702021-04-11 00:01:35 +0200763class EF_THRESHOLD(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100764 def __init__(self, fid='6f5c', sfid=0x10, name='EF.THRESHOLD', size={3, 3},
Harald Welte6169c722022-02-12 09:05:15 +0100765 desc='Maximum value of START', **kwargs):
766 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200767 self._construct = Struct('max_start'/Int24ub)
768
769# TS 31.102 Section 4.2.77
Harald Weltec91085e2022-02-10 18:05:45 +0100770
771
Harald Welte790b2702021-04-11 00:01:35 +0200772class EF_VGCSCA(TransRecEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100773 def __init__(self, fid='6fd4', sfid=None, name='EF.VGCSCA', size={2, 100}, rec_len=2,
Harald Welte6169c722022-02-12 09:05:15 +0100774 desc='Voice Group Call Service Ciphering Algorithm', **kwargs):
775 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200776 self._construct = Struct('alg_v_ki_1'/Int8ub, 'alg_v_ki_2'/Int8ub)
777
778# TS 31.102 Section 4.2.79
Harald Weltec91085e2022-02-10 18:05:45 +0100779
780
Harald Welte790b2702021-04-11 00:01:35 +0200781class EF_GBABP(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100782 def __init__(self, fid='6fd6', sfid=None, name='EF.GBABP', size={3, 50},
Harald Welte6169c722022-02-12 09:05:15 +0100783 desc='GBA Bootstrapping parameters', **kwargs):
784 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200785 self._construct = Struct('rand'/LV, 'b_tid'/LV, 'key_lifetime'/LV)
786
787# TS 31.102 Section 4.2.80
Harald Weltec91085e2022-02-10 18:05:45 +0100788
789
Harald Welte790b2702021-04-11 00:01:35 +0200790class EF_MSK(LinFixedEF):
Harald Welte6169c722022-02-12 09:05:15 +0100791 def __init__(self, fid='6fd7', sfid=None, name='EF.MSK', desc='MBMS Service Key List', **kwargs):
792 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={20, None}, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200793 msk_ts_constr = Struct('msk_id'/Int32ub, 'timestamp_counter'/Int32ub)
794 self._construct = Struct('key_domain_id'/Bytes(3),
795 'num_msk_id'/Int8ub,
796 'msk_ids'/msk_ts_constr[this.num_msk_id])
Harald Welte14105dc2021-05-31 08:48:51 +0200797# TS 31.102 Section 4.2.81
Harald Weltec91085e2022-02-10 18:05:45 +0100798
799
Harald Welte14105dc2021-05-31 08:48:51 +0200800class EF_MUK(LinFixedEF):
801 class MUK_Idr(BER_TLV_IE, tag=0x80):
802 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100803
Harald Welte14105dc2021-05-31 08:48:51 +0200804 class MUK_Idi(BER_TLV_IE, tag=0x82):
805 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100806
Harald Welte14105dc2021-05-31 08:48:51 +0200807 class MUK_ID(BER_TLV_IE, tag=0xA0, nested=[MUK_Idr, MUK_Idi]):
808 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100809
Harald Welte14105dc2021-05-31 08:48:51 +0200810 class TimeStampCounter(BER_TLV_IE, tag=0x81):
811 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100812
Harald Welte14105dc2021-05-31 08:48:51 +0200813 class EF_MUK_Collection(TLV_IE_Collection, nested=[MUK_ID, TimeStampCounter]):
814 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100815
Harald Welte6169c722022-02-12 09:05:15 +0100816 def __init__(self, fid='6fd8', sfid=None, name='EF.MUK', desc='MBMS User Key', **kwargs):
817 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={None, None}, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200818 self._tlv = EF_MUK.EF_MUK_Collection
819
820# TS 31.102 Section 4.2.83
Harald Weltec91085e2022-02-10 18:05:45 +0100821
822
Harald Welte14105dc2021-05-31 08:48:51 +0200823class EF_GBANL(LinFixedEF):
824 class NAF_ID(BER_TLV_IE, tag=0x80):
825 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100826
Harald Welte14105dc2021-05-31 08:48:51 +0200827 class B_TID(BER_TLV_IE, tag=0x81):
828 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100829
Harald Welte14105dc2021-05-31 08:48:51 +0200830 class EF_GBANL_Collection(BER_TLV_IE, nested=[NAF_ID, B_TID]):
831 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100832
Harald Welte6169c722022-02-12 09:05:15 +0100833 def __init__(self, fid='6fda', sfid=None, name='EF.GBANL', desc='GBA NAF List', **kwargs):
834 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={None, None}, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200835 self._tlv = EF_GBANL.EF_GBANL_Collection
Harald Welte790b2702021-04-11 00:01:35 +0200836
837# TS 31.102 Section 4.2.85
Harald Weltec91085e2022-02-10 18:05:45 +0100838
839
Harald Welte790b2702021-04-11 00:01:35 +0200840class EF_EHPLMNPI(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100841 def __init__(self, fid='6fdb', sfid=None, name='EF.EHPLMNPI', size={1, 1},
Harald Welte6169c722022-02-12 09:05:15 +0100842 desc='Equivalent HPLMN Presentation Indication', **kwargs):
843 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100844 self._construct = Struct('presentation_ind' /
Harald Welte790b2702021-04-11 00:01:35 +0200845 Enum(Byte, no_preference=0, display_highest_prio_only=1, display_all=2))
Harald Welte14105dc2021-05-31 08:48:51 +0200846
847# TS 31.102 Section 4.2.87
Harald Weltec91085e2022-02-10 18:05:45 +0100848
849
Harald Welte14105dc2021-05-31 08:48:51 +0200850class EF_NAFKCA(LinFixedEF):
851 class NAF_KeyCentreAddress(BER_TLV_IE, tag=0x80):
852 _construct = HexAdapter(GreedyBytes)
853 def __init__(self, fid='6fdd', sfid=None, name='EF.NAFKCA', rec_len={None, None},
Harald Welte6169c722022-02-12 09:05:15 +0100854 desc='NAF Key Centre Address', **kwargs):
855 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200856 self._tlv = EF_NAFKCA.NAF_KeyCentreAddress
857
858# TS 31.102 Section 4.2.90
Harald Weltec91085e2022-02-10 18:05:45 +0100859
860
Harald Welte14105dc2021-05-31 08:48:51 +0200861class EF_NCP_IP(LinFixedEF):
862 class DataDestAddrRange(TLV_IE, tag=0x83):
863 _construct = Struct('type_of_address'/Enum(Byte, IPv4=0x21, IPv6=0x56),
864 'prefix_length'/Int8ub,
865 'prefix'/HexAdapter(GreedyBytes))
Harald Weltec91085e2022-02-10 18:05:45 +0100866
Harald Welte14105dc2021-05-31 08:48:51 +0200867 class AccessPointName(TLV_IE, tag=0x80):
868 # coded as per TS 23.003
869 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100870
Harald Welte14105dc2021-05-31 08:48:51 +0200871 class Login(TLV_IE, tag=0x81):
872 # as per SMS DCS TS 23.038
873 _construct = GsmStringAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100874
Harald Welte14105dc2021-05-31 08:48:51 +0200875 class Password(TLV_IE, tag=0x82):
876 # as per SMS DCS TS 23.038
877 _construct = GsmStringAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100878
Harald Welte14105dc2021-05-31 08:48:51 +0200879 class BearerDescription(TLV_IE, tag=0x84):
880 # Bearer descriptionTLV DO as per TS 31.111
881 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100882
Harald Welte14105dc2021-05-31 08:48:51 +0200883 class EF_NCP_IP_Collection(TLV_IE_Collection,
884 nested=[AccessPointName, Login, Password, BearerDescription]):
885 pass
886 def __init__(self, fid='6fe2', sfid=None, name='EF.NCP-IP', rec_len={None, None},
Harald Welte6169c722022-02-12 09:05:15 +0100887 desc='Network Connectivity Parameters for USIM IP connections', **kwargs):
888 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200889 self._tlv = EF_NCP_IP.EF_NCP_IP_Collection
890
Harald Welte790b2702021-04-11 00:01:35 +0200891# TS 31.102 Section 4.2.91
Harald Weltec91085e2022-02-10 18:05:45 +0100892
893
Harald Welte790b2702021-04-11 00:01:35 +0200894class EF_EPSLOCI(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100895 def __init__(self, fid='6fe3', sfid=0x1e, name='EF.EPSLOCI', size={18, 18},
Harald Welte6169c722022-02-12 09:05:15 +0100896 desc='EPS Location Information', **kwargs):
897 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100898 upd_status_constr = Enum(
899 Byte, updated=0, not_updated=1, roaming_not_allowed=2)
Harald Welte790b2702021-04-11 00:01:35 +0200900 self._construct = Struct('guti'/Bytes(12), 'last_visited_registered_tai'/Bytes(5),
901 'eps_update_status'/upd_status_constr)
902
Harald Welte14105dc2021-05-31 08:48:51 +0200903# TS 31.102 Section 4.2.92
Harald Weltec91085e2022-02-10 18:05:45 +0100904
905
Harald Welte14105dc2021-05-31 08:48:51 +0200906class EF_EPSNSC(LinFixedEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100907 class KSI_ASME(BER_TLV_IE, tag=0x80):
Harald Welte14105dc2021-05-31 08:48:51 +0200908 _construct = Int8ub
Harald Weltec91085e2022-02-10 18:05:45 +0100909
910 class K_ASME(BER_TLV_IE, tag=0x81):
Harald Welte14105dc2021-05-31 08:48:51 +0200911 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100912
Harald Welte14105dc2021-05-31 08:48:51 +0200913 class UplinkNASCount(BER_TLV_IE, tag=0x82):
914 _construct = Int32ub
Harald Weltec91085e2022-02-10 18:05:45 +0100915
Harald Welte14105dc2021-05-31 08:48:51 +0200916 class DownlinkNASCount(BER_TLV_IE, tag=0x83):
917 _construct = Int32ub
Harald Weltec91085e2022-02-10 18:05:45 +0100918
Harald Welte14105dc2021-05-31 08:48:51 +0200919 class IDofNASAlgorithms(BER_TLV_IE, tag=0x84):
920 _construct = HexAdapter(GreedyBytes)
Harald Weltec91085e2022-02-10 18:05:45 +0100921
Harald Welte14105dc2021-05-31 08:48:51 +0200922 class EPS_NAS_Security_Context(BER_TLV_IE, tag=0xa0,
Harald Weltec91085e2022-02-10 18:05:45 +0100923 nested=[KSI_ASME, K_ASME, UplinkNASCount, DownlinkNASCount,
924 IDofNASAlgorithms]):
Harald Welte14105dc2021-05-31 08:48:51 +0200925 pass
Harald Weltec91085e2022-02-10 18:05:45 +0100926 def __init__(self, fid='6fe4', sfid=0x18, name='EF.EPSNSC', rec_len={54, 128},
Harald Welte6169c722022-02-12 09:05:15 +0100927 desc='EPS NAS Security Context', **kwargs):
928 super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200929 self._tlv = EF_EPSNSC.EPS_NAS_Security_Context
930
Harald Welte790b2702021-04-11 00:01:35 +0200931# TS 31.102 Section 4.2.96
Harald Weltec91085e2022-02-10 18:05:45 +0100932
933
Harald Welte790b2702021-04-11 00:01:35 +0200934class EF_PWS(TransparentEF):
Harald Welte6169c722022-02-12 09:05:15 +0100935 def __init__(self, fid='6fec', sfid=None, name='EF.PWS', desc='Public Warning System', size={1, 1}, **kwargs):
936 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Weltec91085e2022-02-10 18:05:45 +0100937 pws_config = FlagsEnum(
938 Byte, ignore_pws_in_hplmn_and_equivalent=1, ignore_pws_in_vplmn=2)
Harald Welte790b2702021-04-11 00:01:35 +0200939 self._construct = Struct('pws_configuration'/pws_config)
940
941# TS 31.102 Section 4.2.101
Harald Weltec91085e2022-02-10 18:05:45 +0100942
943
Harald Welte790b2702021-04-11 00:01:35 +0200944class EF_IPS(CyclicEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100945 def __init__(self, fid='6ff1', sfid=None, name='EF.IPS', rec_len={4, 4},
Harald Welte6169c722022-02-12 09:05:15 +0100946 desc='IMEI(SV) Pairing Status', **kwargs):
947 super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len, **kwargs)
Harald Welte790b2702021-04-11 00:01:35 +0200948 self._construct = Struct('status'/PaddedString(2, 'ascii'),
949 'link_to_ef_ipd'/Int8ub, 'rfu'/Byte)
950
Harald Welte14105dc2021-05-31 08:48:51 +0200951# TS 31.102 Section 4.2.103
Harald Weltec91085e2022-02-10 18:05:45 +0100952
953
Harald Welte14105dc2021-05-31 08:48:51 +0200954class EF_ePDGId(TransparentEF):
955 class ePDGId(BER_TLV_IE, tag=0x80, nested=[]):
956 _construct = Struct('type_of_ePDG_address'/Enum(Byte, FQDN=0, IPv4=1, IPv6=2),
957 'ePDG_address'/Switch(this.type_of_address,
Harald Weltec91085e2022-02-10 18:05:45 +0100958 {'FQDN': GreedyString("utf8"),
959 'IPv4': HexAdapter(GreedyBytes),
960 'IPv6': HexAdapter(GreedyBytes)}))
961
Harald Welte6169c722022-02-12 09:05:15 +0100962 def __init__(self, fid='6ff3', sfid=None, name='EF.eDPDGId', desc='Home ePDG Identifier', **kwargs):
963 super().__init__(fid, sfid=sfid, name=name, desc=desc, **kwargs)
Harald Welte14105dc2021-05-31 08:48:51 +0200964 self._tlv = EF_ePDGId.ePDGId
965
Harald Welte71290072021-04-21 10:58:24 +0200966# TS 31.102 Section 4.2.106
Harald Weltec91085e2022-02-10 18:05:45 +0100967
968
Harald Welte71290072021-04-21 10:58:24 +0200969class EF_FromPreferred(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100970 def __init__(self, fid='6ff7', sfid=None, name='EF.FromPreferred', size={1, 1},
Harald Welte6169c722022-02-12 09:05:15 +0100971 desc='From Preferred', **kwargs):
972 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
Harald Welte71290072021-04-21 10:58:24 +0200973 self._construct = BitStruct('rfu'/BitsRFU(7), 'from_preferred'/Bit)
974
Harald Welte790b2702021-04-11 00:01:35 +0200975######################################################################
976# DF.5GS
977######################################################################
978
979# TS 31.102 Section 4.4.11.2
Harald Weltec91085e2022-02-10 18:05:45 +0100980
981
Harald Welte790b2702021-04-11 00:01:35 +0200982class EF_5GS3GPPLOCI(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100983 def __init__(self, fid='4f01', sfid=0x01, name='EF.5GS3GPPLOCI', size={20, 20},
Harald Welte790b2702021-04-11 00:01:35 +0200984 desc='5S 3GP location information'):
985 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
Harald Weltec91085e2022-02-10 18:05:45 +0100986 upd_status_constr = Enum(
987 Byte, updated=0, not_updated=1, roaming_not_allowed=2)
Harald Welte790b2702021-04-11 00:01:35 +0200988 self._construct = Struct('5g_guti'/Bytes(13), 'last_visited_registered_tai_in_5gs'/Bytes(6),
989 '5gs_update_status'/upd_status_constr)
990
991# TS 31.102 Section 4.4.11.7
Harald Weltec91085e2022-02-10 18:05:45 +0100992
993
Harald Welte790b2702021-04-11 00:01:35 +0200994class EF_UAC_AIC(TransparentEF):
Harald Weltec91085e2022-02-10 18:05:45 +0100995 def __init__(self, fid='4f06', sfid=0x06, name='EF.UAC_AIC', size={4, 4},
Harald Welte790b2702021-04-11 00:01:35 +0200996 desc='UAC Access Identities Configuration'):
997 super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)
998 cfg_constr = FlagsEnum(Byte, multimedia_priority_service=1,
Harald Weltec91085e2022-02-10 18:05:45 +0100999 mission_critical_service=2)
Harald Welte790b2702021-04-11 00:01:35 +02001000 self._construct = Struct('uac_access_id_config'/cfg_constr)
1001
Harald Welte14105dc2021-05-31 08:48:51 +02001002# TS 31.102 Section 4.4.11.9
Harald Weltec91085e2022-02-10 18:05:45 +01001003
1004
Harald Welte790b2702021-04-11 00:01:35 +02001005class EF_OPL5G(LinFixedEF):
1006 def __init__(self, fid='6f08', sfid=0x08, name='EF.OPL5G', desc='5GS Operator PLMN List'):
Harald Weltec91085e2022-02-10 18:05:45 +01001007 super().__init__(fid=fid, sfid=sfid,
1008 name=name, desc=desc, rec_len={10, None})
Harald Welte790b2702021-04-11 00:01:35 +02001009 self._construct = Struct('tai'/Bytes(9), 'pnn_record_id'/Int8ub)
1010
Harald Welte14105dc2021-05-31 08:48:51 +02001011# TS 31.102 Section 4.4.11.10
Harald Weltec91085e2022-02-10 18:05:45 +01001012
1013
Harald Welte14105dc2021-05-31 08:48:51 +02001014class EF_SUPI_NAI(TransparentEF):
1015 class NetworkSpecificIdentifier(TLV_IE, tag=0x80):
1016 # RFC 7542 encoded as UTF-8 string
1017 _construct = GreedyString("utf8")
Harald Weltec91085e2022-02-10 18:05:45 +01001018
Harald Welte14105dc2021-05-31 08:48:51 +02001019 class GlobalLineIdentifier(TLV_IE, tag=0x81):
1020 # TS 23.003 clause 28.16.2
1021 pass
Harald Weltec91085e2022-02-10 18:05:45 +01001022
Harald Welte14105dc2021-05-31 08:48:51 +02001023 class GlobalCableIdentifier(TLV_IE, tag=0x82):
1024 # TS 23.003 clause 28.15.2
1025 pass
Harald Weltec91085e2022-02-10 18:05:45 +01001026
Harald Welte14105dc2021-05-31 08:48:51 +02001027 class NAI_TLV_Collection(TLV_IE_Collection,
Harald Weltec91085e2022-02-10 18:05:45 +01001028 nested=[NetworkSpecificIdentifier, GlobalLineIdentifier, GlobalCableIdentifier]):
Harald Welte14105dc2021-05-31 08:48:51 +02001029 pass
1030 def __init__(self, fid='4f09', sfid=0x09, name='EF.SUPI_NAI',
Harald Weltec91085e2022-02-10 18:05:45 +01001031 desc='SUPI as Network Access Identifier'):
Harald Welte14105dc2021-05-31 08:48:51 +02001032 super().__init__(fid, sfid=sfid, name=name, desc=desc)
1033 self._tlv = EF_SUPI_NAI.NAI_TLV_Collection
1034
Harald Weltec91085e2022-02-10 18:05:45 +01001035
Harald Welte14105dc2021-05-31 08:48:51 +02001036class EF_TN3GPPSNN(TransparentEF):
1037 class ServingNetworkName(BER_TLV_IE, tag=0x80):
1038 _construct = GreedyString("utf8")
1039 def __init__(self, fid='4f0c', sfid=0x0c, name='EF.TN3GPPSNN',
Harald Weltec91085e2022-02-10 18:05:45 +01001040 desc='Trusted non-3GPP Serving network names list'):
Harald Welte14105dc2021-05-31 08:48:51 +02001041 super().__init__(fid, sfid=sfid, name=name, desc=desc)
1042 self._tlv = EF_TN3GPPSNN.ServingNetworkName
1043
Harald Welte3990ebb2021-04-20 23:55:14 +02001044# TS 31.102 Section 4.4.5
Harald Weltec91085e2022-02-10 18:05:45 +01001045
1046
Harald Welte3990ebb2021-04-20 23:55:14 +02001047class DF_WLAN(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001048 def __init__(self, fid='5f40', name='DF.WLAN', desc='Files for WLAN purpose', **kwargs):
1049 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001050 files = [
1051 TransparentEF('4f41', 0x01, 'EF.Pseudo', 'Pseudonym'),
Harald Weltec91085e2022-02-10 18:05:45 +01001052 TransparentEF('4f42', 0x02, 'EF.UPLMNWLAN',
1053 'User controlled PLMN selector for I-WLAN Access'),
1054 TransparentEF('4f43', 0x03, 'EF.OPLMNWLAN',
1055 'Operator controlled PLMN selector for I-WLAN Access'),
1056 LinFixedEF('4f44', 0x04, 'EF.UWSIDL',
1057 'User controlled WLAN Specific Identifier List'),
1058 LinFixedEF('4f45', 0x05, 'EF.OWSIDL',
1059 'Operator controlled WLAN Specific Identifier List'),
1060 TransparentEF('4f46', 0x06, 'EF.WRI',
1061 'WLAN Reauthentication Identity'),
1062 LinFixedEF('4f47', 0x07, 'EF.HWSIDL',
1063 'Home I-WLAN Specific Identifier List'),
1064 TransparentEF('4f48', 0x08, 'EF.WEHPLMNPI',
1065 'I-WLAN Equivalent HPLMN Presentation Indication'),
1066 TransparentEF('4f49', 0x09, 'EF.WHPI',
1067 'I-WLAN HPLMN Priority Indication'),
1068 TransparentEF('4f4a', 0x0a, 'EF.WLRPLMN',
1069 'I-WLAN Last Registered PLMN'),
1070 TransparentEF('4f4b', 0x0b, 'EF.HPLMNDAI',
1071 'HPLMN Direct Access Indicator'),
1072 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001073 self.add_files(files)
1074
1075# TS 31.102 Section 4.4.6
Harald Weltec91085e2022-02-10 18:05:45 +01001076
1077
Harald Welte3990ebb2021-04-20 23:55:14 +02001078class DF_HNB(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001079 def __init__(self, fid='5f50', name='DF.HNB', desc='Files for HomeNodeB purpose', **kwargs):
1080 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001081 files = [
1082 LinFixedEF('4f01', 0x01, 'EF.ACSGL', 'Allowed CSG Lists'),
1083 LinFixedEF('4f02', 0x02, 'EF.CSGTL', 'CSG Types'),
1084 LinFixedEF('4f03', 0x03, 'EF.HNBN', 'Home NodeB Name'),
1085 LinFixedEF('4f04', 0x04, 'EF.OCSGL', 'Operator CSG Lists'),
1086 LinFixedEF('4f05', 0x05, 'EF.OCSGT', 'Operator CSG Type'),
1087 LinFixedEF('4f06', 0x06, 'EF.OHNBN', 'Operator Home NodeB Name'),
Harald Weltec91085e2022-02-10 18:05:45 +01001088 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001089 self.add_files(files)
1090
1091# TS 31.102 Section 4.4.8
Harald Weltec91085e2022-02-10 18:05:45 +01001092
1093
Harald Welte3990ebb2021-04-20 23:55:14 +02001094class DF_ProSe(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001095 def __init__(self, fid='5f90', name='DF.ProSe', desc='Files for ProSe purpose', **kwargs):
1096 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Harald Welte3990ebb2021-04-20 23:55:14 +02001097 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001098 LinFixedEF('4f01', 0x01, 'EF.PROSE_MON',
1099 'ProSe Monitoring Parameters'),
1100 LinFixedEF('4f02', 0x02, 'EF.PROSE_ANN',
1101 'ProSe Announcing Parameters'),
Harald Welte3990ebb2021-04-20 23:55:14 +02001102 LinFixedEF('4f03', 0x03, 'EF.PROSEFUNC', 'HPLMN ProSe Function'),
Harald Weltec91085e2022-02-10 18:05:45 +01001103 TransparentEF('4f04', 0x04, 'EF.PROSE_RADIO_COM',
1104 'ProSe Direct Communication Radio Parameters'),
1105 TransparentEF('4f05', 0x05, 'EF.PROSE_RADIO_MON',
1106 'ProSe Direct Discovery Monitoring Radio Parameters'),
1107 TransparentEF('4f06', 0x06, 'EF.PROSE_RADIO_ANN',
1108 'ProSe Direct Discovery Announcing Radio Parameters'),
1109 LinFixedEF('4f07', 0x07, 'EF.PROSE_POLICY',
1110 'ProSe Policy Parameters'),
Harald Welte3990ebb2021-04-20 23:55:14 +02001111 LinFixedEF('4f08', 0x08, 'EF.PROSE_PLMN', 'ProSe PLMN Parameters'),
1112 TransparentEF('4f09', 0x09, 'EF.PROSE_GC', 'ProSe Group Counter'),
1113 TransparentEF('4f10', 0x10, 'EF.PST', 'ProSe Service Table'),
Harald Weltec91085e2022-02-10 18:05:45 +01001114 TransparentEF('4f11', 0x11, 'EF.UIRC',
1115 'ProSe UsageInformationReportingConfiguration'),
1116 LinFixedEF('4f12', 0x12, 'EF.PROSE_GM_DISCOVERY',
1117 'ProSe Group Member Discovery Parameters'),
1118 LinFixedEF('4f13', 0x13, 'EF.PROSE_RELAY',
1119 'ProSe Relay Parameters'),
1120 TransparentEF('4f14', 0x14, 'EF.PROSE_RELAY_DISCOVERY',
1121 'ProSe Relay Discovery Parameters'),
1122 ]
Harald Welte3990ebb2021-04-20 23:55:14 +02001123 self.add_files(files)
1124
Harald Weltec91085e2022-02-10 18:05:45 +01001125
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001126class DF_USIM_5GS(CardDF):
Harald Welte6169c722022-02-12 09:05:15 +01001127 def __init__(self, fid='5FC0', name='DF.5GS', desc='5GS related files', **kwargs):
1128 super().__init__(fid=fid, name=name, desc=desc, **kwargs)
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001129 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001130 # I'm looking at 31.102 R16.6
1131 EF_5GS3GPPLOCI(),
1132 EF_5GS3GPPLOCI('4f02', 0x02, 'EF.5GSN3GPPLOCI',
1133 '5GS non-3GPP location information'),
1134 EF_5GS3GPPNSC(),
1135 EF_5GS3GPPNSC('4f04', 0x04, 'EF.5GSN3GPPNSC',
1136 '5GS non-3GPP Access NAS Security Context'),
1137 EF_5GAUTHKEYS(),
1138 EF_UAC_AIC(),
1139 EF_SUCI_Calc_Info(),
1140 EF_OPL5G(),
1141 EF_SUPI_NAI(),
1142 TransparentEF('4F0A', 0x0a, 'EF.Routing_Indicator',
1143 'Routing Indicator', size={4, 4}),
1144 TransparentEF('4F0B', 0x0b, 'EF.URSP',
1145 'UE Route Selector Policies per PLMN'),
1146 EF_TN3GPPSNN(),
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001147 ]
Merlin Chlosta05ca36b2021-04-01 16:15:28 +02001148 self.add_files(files)
1149
Harald Weltec91085e2022-02-10 18:05:45 +01001150
Harald Welteb2edd142021-01-08 23:29:35 +01001151class ADF_USIM(CardADF):
1152 def __init__(self, aid='a0000000871002', name='ADF.USIM', fid=None, sfid=None,
1153 desc='USIM Application'):
1154 super().__init__(aid=aid, fid=fid, sfid=sfid, name=name, desc=desc)
Harald Welte15fae982021-04-10 10:22:27 +02001155 # add those commands to the general commands of a TransparentEF
1156 self.shell_commands += [self.AddlShellCommands()]
Harald Welteb2edd142021-01-08 23:29:35 +01001157
1158 files = [
Harald Weltec91085e2022-02-10 18:05:45 +01001159 EF_LI(sfid=0x02),
1160 EF_IMSI(sfid=0x07),
1161 EF_Keys(),
1162 EF_Keys('6f09', 0x09, 'EF.KeysPS',
1163 desc='Ciphering and Integrity Keys for PS domain'),
1164 EF_xPLMNwAcT('6f60', 0x0a, 'EF.PLMNwAcT',
Harald Welte6169c722022-02-12 09:05:15 +01001165 'User controlled PLMN Selector with Access Technology', service=20),
Harald Weltec91085e2022-02-10 18:05:45 +01001166 EF_HPPLMN(),
Harald Welte6169c722022-02-12 09:05:15 +01001167 EF_ACMmax(service=13),
Harald Weltec91085e2022-02-10 18:05:45 +01001168 EF_UServiceTable('6f38', 0x04, 'EF.UST', 'USIM Service Table', size={
1169 1, 17}, table=EF_UST_map),
1170 CyclicEF('6f39', None, 'EF.ACM',
Harald Welte6169c722022-02-12 09:05:15 +01001171 'Accumulated call meter', rec_len={3, 3}, service=13),
1172 TransparentEF('6f3e', None, 'EF.GID1', 'Group Identifier Level 1', service=17),
1173 TransparentEF('6f3f', None, 'EF.GID2', 'Group Identifier Level 2', service=18),
1174 EF_SPN(service=19),
Harald Weltec91085e2022-02-10 18:05:45 +01001175 TransparentEF('6f41', None, 'EF.PUCT',
Harald Welte6169c722022-02-12 09:05:15 +01001176 'Price per unit and currency table', size={5, 5}, service=13),
1177 EF_CBMI(service=15),
Harald Weltec91085e2022-02-10 18:05:45 +01001178 EF_ACC(sfid=0x06),
1179 EF_PLMNsel('6f7b', 0x0d, 'EF.FPLMN',
1180 'Forbidden PLMNs', size={12, None}),
1181 EF_LOCI(),
1182 EF_AD(),
Harald Welte6169c722022-02-12 09:05:15 +01001183 EF_CBMID(sfid=0x0e, service=29),
Harald Weltec91085e2022-02-10 18:05:45 +01001184 EF_ECC(),
Harald Welte6169c722022-02-12 09:05:15 +01001185 EF_CBMIR(service=16),
Harald Weltec91085e2022-02-10 18:05:45 +01001186 EF_PSLOCI(),
Harald Welte6169c722022-02-12 09:05:15 +01001187 EF_ADN('6f3b', None, 'EF.FDN', 'Fixed Dialling Numbers', service=[2, 89]),
1188 EF_SMS('6f3c', None, service=10),
1189 EF_MSISDN(service=21),
1190 EF_SMSP(service=12),
1191 EF_SMSS(service=10),
1192 EF_ADN('6f49', None, 'EF.SDN', 'Service Dialling Numbers', service=[4, 89]),
1193 EF_EXT('6f4b', None, 'EF.EXT2', 'Extension2 (FDN)', service=3),
1194 EF_EXT('6f4c', None, 'EF.EXT3', 'Extension2 (SDN)', service=5),
1195 EF_SMSR(service=11),
1196 EF_ICI(service=9),
1197 EF_OCI(service=8),
1198 EF_ICT(service=9),
1199 EF_ICT('6f83', None, 'EF.OCT', 'Outgoing Call Timer', service=8),
1200 EF_EXT('6f4e', None, 'EF.EXT5', 'Extension5 (ICI/OCI/MSISDN)', service=44),
1201 EF_CCP2(service=14),
1202 EF_eMLPP(service=24),
1203 EF_AAeM(service=25),
Harald Weltec91085e2022-02-10 18:05:45 +01001204 # EF_Hiddenkey
Harald Welte6169c722022-02-12 09:05:15 +01001205 EF_ADN('6f4d', None, 'EF.BDN', 'Barred Dialling Numbers', service=6),
1206 EF_EXT('6f55', None, 'EF.EXT4', 'Extension4 (BDN/SSC)', service=7),
1207 EF_CMI(service=6),
Harald Weltec91085e2022-02-10 18:05:45 +01001208 EF_UServiceTable('6f56', 0x05, 'EF.EST', 'Enabled Services Table', size={
Harald Welte6169c722022-02-12 09:05:15 +01001209 1, None}, table=EF_EST_map, service=[2, 6, 34, 35]),
1210 EF_ACL(service=35),
1211 EF_DCK(service=36),
1212 EF_CNL(service=37),
Harald Weltec91085e2022-02-10 18:05:45 +01001213 EF_START_HFN(),
1214 EF_THRESHOLD(),
Harald Welte6169c722022-02-12 09:05:15 +01001215 EF_xPLMNwAcT('6f61', 0x11, 'EF.OPLMNwAcT', 'User controlled PLMN Selector with Access Technology', service=42),
1216 EF_xPLMNwAcT('6f62', 0x13, 'EF.HPLMNwAcT', 'HPLMN Selector with Access Technology', service=43),
Harald Weltec91085e2022-02-10 18:05:45 +01001217 EF_ARR('6f06', 0x17),
1218 TransparentEF('6fc4', None, 'EF.NETPAR', 'Network Parameters'),
Harald Welte6169c722022-02-12 09:05:15 +01001219 EF_PNN('6fc5', 0x19, service=45),
1220 EF_OPL(service=46),
1221 EF_ADN('6fc7', None, 'EF.MBDN', 'Mailbox Dialling Numbers', service=47),
1222 EF_EXT('6fc8', None, 'EF.EXT6', 'Extension6 (MBDN)'),
1223 EF_MBI(service=47),
1224 EF_MWIS(service=48),
1225 EF_ADN('6fcb', None, 'EF.CFIS', 'Call Forwarding Indication Status', service=49),
Harald Weltec91085e2022-02-10 18:05:45 +01001226 EF_EXT('6fcc', None, 'EF.EXT7', 'Extension7 (CFIS)'),
Harald Welte6169c722022-02-12 09:05:15 +01001227 TransparentEF('6fcd', None, 'EF.SPDI', 'Service Provider Display Information', service=51),
1228 EF_MMSN(service=52),
1229 EF_EXT('6fcf', None, 'EF.EXT8', 'Extension8 (MMSN)', service=53),
1230 EF_MMSICP(service=52),
1231 EF_MMSUP(service=52),
1232 EF_MMSUCP(service=(52, 55)),
1233 EF_NIA(service=56),
1234 EF_VGCS(service=57),
1235 EF_VGCSS(service=57),
1236 EF_VGCS('6fb3', None, 'EF.VBS', 'Voice Broadcast Service', service=58),
1237 EF_VGCSS('6fb4', None, 'EF.VBSS', 'Voice Broadcast Service Status', service=58),
1238 EF_VGCSCA(service=64),
1239 EF_VGCSCA('6fd5', None, 'EF.VBCSCA', 'Voice Broadcast Service Ciphering Algorithm', service=65),
1240 EF_GBABP(service=68),
1241 EF_MSK(service=69),
1242 EF_MUK(service=69),
1243 EF_GBANL(service=68),
1244 EF_PLMNsel('6fd9', 0x1d, 'EF.EHPLMN', 'Equivalent HPLMN', size={12, None}, service=71),
1245 EF_EHPLMNPI(service=(71, 73)),
1246 # EF_LRPLMNSI ('6fdc', service=74)
1247 EF_NAFKCA(service=(68, 76)),
1248 TransparentEF('6fde', None, 'EF.SPNI', 'Service Provider Name Icon', service=78),
1249 LinFixedEF('6fdf', None, 'EF.PNNI', 'PLMN Network Name Icon', service=79),
1250 EF_NCP_IP(service=80),
1251 EF_EPSLOCI('6fe3', 0x1e, 'EF.EPSLOCI', 'EPS location information', service=85),
1252 EF_EPSNSC(service=85),
1253 TransparentEF('6fe6', None, 'EF.UFC', 'USAT Facility Control', size={1, 16}),
1254 TransparentEF('6fe8', None, 'EF.NASCONFIG', 'Non Access Stratum Configuration', service=96),
1255 # UICC IARI (only in cards that have no ISIM) service=95
1256 EF_PWS(service=97),
1257 LinFixedEF('6fed', None, 'EF.FDNURI', 'Fixed Dialling Numbers URI', service=(2, 99)),
1258 LinFixedEF('6fee', None, 'EF.BDNURI', 'Barred Dialling Numbers URI', service=(6, 99)),
1259 LinFixedEF('6fef', None, 'EF.SDNURI', 'Service Dialling Numbers URI', service=(4, 99)),
1260 # EF_IWL (IMEI(SV) White List)
Harald Weltec91085e2022-02-10 18:05:45 +01001261 EF_IPS(),
Harald Welte6169c722022-02-12 09:05:15 +01001262 EF_ePDGId(service=(106, 107)),
Harald Weltec91085e2022-02-10 18:05:45 +01001263 # FIXME: from EF_ePDGSelection onwards
Harald Welte6169c722022-02-12 09:05:15 +01001264 EF_FromPreferred(service=114),
1265 # FIXME: DF_SoLSA service=23
Harald Weltec91085e2022-02-10 18:05:45 +01001266 # FIXME: DF_PHONEBOOK
Harald Welte6169c722022-02-12 09:05:15 +01001267 # FIXME: DF_GSM_ACCESS service=27
1268 DF_WLAN(service=[59, 60, 61, 62, 63, 66, 81, 82, 83, 84, 88]),
1269 DF_HNB(service=[86, 90]),
1270 DF_ProSe(service=101),
1271 # FIXME: DF_ACDC service=108
1272 # FIXME: DF_TV service=116
1273 DF_USIM_5GS(service=[122, 123, 124, 125, 126, 127, 129, 130]),
Harald Weltec91085e2022-02-10 18:05:45 +01001274 ]
Harald Welteb2edd142021-01-08 23:29:35 +01001275 self.add_files(files)
1276
1277 def decode_select_response(self, data_hex):
Philipp Maier5998a3a2021-11-16 15:16:39 +01001278 return pySim.ts_102_221.CardProfileUICC.decode_select_response(data_hex)
Harald Welteb2edd142021-01-08 23:29:35 +01001279
Harald Welte15fae982021-04-10 10:22:27 +02001280 @with_default_category('Application-Specific Commands')
1281 class AddlShellCommands(CommandSet):
1282 def __init__(self):
1283 super().__init__()
1284
1285 authenticate_parser = argparse.ArgumentParser()
1286 authenticate_parser.add_argument('rand', help='Random challenge')
1287 authenticate_parser.add_argument('autn', help='Authentication Nonce')
1288 #authenticate_parser.add_argument('--context', help='Authentication context', default='3G')
Harald Weltec91085e2022-02-10 18:05:45 +01001289
Harald Welte15fae982021-04-10 10:22:27 +02001290 @cmd2.with_argparser(authenticate_parser)
1291 def do_authenticate(self, opts):
1292 """Perform Authentication and Key Agreement (AKA)."""
1293 (data, sw) = self._cmd.card._scc.authenticate(opts.rand, opts.autn)
1294 self._cmd.poutput_json(data)
1295
Harald Welte846a8982021-10-08 15:47:16 +02001296 def do_terminal_profile(self, arg):
1297 """Send a TERMINAL PROFILE command to the card."""
1298 (data, sw) = self._cmd.card._scc.terminal_profile(arg)
1299 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
Harald Welte15fae982021-04-10 10:22:27 +02001300
Harald Welte7cb94e42021-10-08 15:47:57 +02001301 def do_envelope(self, arg):
1302 """Send an ENVELOPE command to the card."""
1303 (data, sw) = self._cmd.card._scc.envelope(arg)
1304 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
1305
1306 def do_envelope_sms(self, arg):
1307 """Send an ENVELOPE command to the card."""
1308 tpdu_ie = SMS_TPDU()
1309 tpdu_ie.from_bytes(h2b(arg))
Harald Weltec91085e2022-02-10 18:05:45 +01001310 dev_ids = DeviceIdentities(
1311 decoded={'source_dev_id': 'network', 'dest_dev_id': 'uicc'})
Harald Welte7cb94e42021-10-08 15:47:57 +02001312 sms_dl = SMSPPDownload(children=[dev_ids, tpdu_ie])
1313 (data, sw) = self._cmd.card._scc.envelope(b2h(sms_dl.to_tlv()))
1314 self._cmd.poutput('SW: %s, data: %s' % (sw, data))
1315
Harald Welte15fae982021-04-10 10:22:27 +02001316
Harald Welteb2edd142021-01-08 23:29:35 +01001317# TS 31.102 Section 7.3
1318sw_usim = {
1319 'Security management': {
1320 '9862': 'Authentication error, incorrect MAC',
1321 '9864': 'Authentication error, security context not supported',
1322 '9865': 'Key freshness failure',
1323 '9866': 'Authentication error, no memory space available',
1324 '9867': 'Authentication error, no memory space available in EF MUK',
1325 }
1326}
1327
Harald Weltec91085e2022-02-10 18:05:45 +01001328
Philipp Maier57f65ee2021-10-18 14:09:02 +02001329class CardApplicationUSIM(CardApplication):
1330 def __init__(self):
Harald Weltec91085e2022-02-10 18:05:45 +01001331 super().__init__('USIM', adf=ADF_USIM(), sw=sw_usim)