pySim.ts_31_102: Add support for EF.EARFCNList

This adds a construct + pyosmocore.tlv based declarative encoder/decoder
for the EF.EARFCNList file used in the context of NB-IoT in later
release USIMs.

Change-Id: I16797ca58c3ad6ebaf588d04fec011a0cbcfcef3
This commit is contained in:
Harald Welte
2024-10-20 10:12:03 +02:00
committed by Philipp Maier
parent ba22e238f3
commit 12328c090d
4 changed files with 103 additions and 4 deletions

View File

@@ -30,7 +30,7 @@ import enum
from construct import Optional as COptional
from construct import Int32ub, Nibble, GreedyRange, Struct, FlagsEnum, Switch, this, Int16ub, Padding
from construct import Bytewise, Int24ub, PaddedString, PrefixedArray, If
from construct import Bytewise, Int24ub, Int24sb, PaddedString, PrefixedArray, If
from osmocom.utils import is_hexstr
from osmocom.tlv import *
@@ -893,6 +893,54 @@ class EF_FromPreferred(TransparentEF):
super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
self._construct = BitStruct('rfu'/BitsRFU(7), 'from_preferred'/Flag)
# TS 31.102 Section 4.2.112 + TS 23.032 Section 6.1
GadPoint = Struct('latitude'/Int24sb, 'longitude'/Int24sb)
# TS 31.102 Section 4.2.112 (Rel ??)
class EF_EARFCNList(TransparentEF):
_test_de_encode = [
# single data object with one EARFCN + one area of 3 points
('a01a8004000100008112000001100001000002100002000003100003',
[{'earfcn_list_tlv': [{'earfcn': 65536},
{'geographical_area': [{'latitude': 1, 'longitude': 1048577},
{'latitude': 2, 'longitude': 1048578},
{'latitude': 3, 'longitude': 1048579}] }]}] ),
# single data object with one EARFCN + two areas of 3 + 4 points
('a03480040001000081120000011000010000021000020000031000038118000001100001000002100002000003100003000004100004',
[{'earfcn_list_tlv': [{'earfcn': 65536},
{'geographical_area': [{'latitude': 1, 'longitude': 1048577},
{'latitude': 2, 'longitude': 1048578},
{'latitude': 3, 'longitude': 1048579}] },
{'geographical_area': [{'latitude': 1, 'longitude': 1048577},
{'latitude': 2, 'longitude': 1048578},
{'latitude': 3, 'longitude': 1048579},
{'latitude': 4, 'longitude': 1048580}] }
] }] ),
# two concatenated data objects with 3 points each
('a01a8004000100008112000001100001000002100002000003100003a01a8004000200008112000011100011000012100012000013100013',
[{'earfcn_list_tlv': [{'earfcn': 65536},
{'geographical_area': [{'latitude': 1, 'longitude': 1048577},
{'latitude': 2, 'longitude': 1048578},
{'latitude': 3, 'longitude': 1048579}] }]},
{'earfcn_list_tlv': [{'earfcn': 131072},
{'geographical_area': [{'latitude': 17, 'longitude': 1048593},
{'latitude': 18, 'longitude': 1048594},
{'latitude': 19, 'longitude': 1048595}] }]} ]),
]
class Earfcn(BER_TLV_IE, tag=0x80):
_construct = Int32ub
class GeographicalArea(BER_TLV_IE, tag=0x81):
_construct = GreedyRange(GadPoint)
class EarfcnListTlv(BER_TLV_IE, tag=0xa0, nested=[Earfcn,GeographicalArea]):
pass
# we need a collection as there might be multiple concatenated instances
class EarfcnListTlvCollection(TLV_IE_Collection, nested=[EarfcnListTlv]):
pass
def __init__(self, fid='6ffd', sfid=None, name='EF.EARFCNList', size=(30, 100),
desc='EARFCN list for MTC/NB-IOT UEs', **kwargs):
super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, **kwargs)
self._tlv = self.EarfcnListTlvCollection
# TS 31.102 Section 4.2.114 (Rel 18)
class EF_eAKA(TransparentEF):
def __init__(self, fid='6f01', sfid=None, name='EF.eAKA', size=(1, 1),
@@ -1675,7 +1723,7 @@ class ADF_USIM(CardADF):
# TODO: EF.3GPPPSDATAOFF
# TODO: EF.3GPPPSDATAOFFservicelist
EF_XCAPConfigData(service=120),
# TODO: EF.EARFCNList
EF_EARFCNList(service=121),
EF_MuDMiDConfigData(service=134),
EF_eAKA(),
EF_OCST(service=148),

View File

@@ -3604,6 +3604,17 @@ update_binary ff
# bad file: MF/ADF.USIM/EF.XCAPConfigData/EF.XCAPConfigData, SW match failed! Expected 9000 and got 6a82: Wrong parameters - File not found
#
################################################################################
# MF/ADF.USIM/EF.EARFCNList #
################################################################################
# directory: MF/ADF.USIM/EF.EARFCNList (3f00/a0000000871002/6ffd)
# file: EF.EARFCNList (6ffd)
# structure: transparent
# RAW FCP Template: 621e8202412183026ffda506d00120d2010f8a01058b036f0606800200808800
# Decoded FCP Template: {'file_descriptor': {'file_descriptor_byte': {'shareable': True, 'file_type': 'working_ef', 'structure': 'transparent'}, 'record_len': None, 'num_of_rec': None}, 'file_identifier': '6ffd', 'proprietary_information': {'unknown_ber_tlv_ie_d0': {'raw': '20'}, 'toolkit_access_conditions': {'rfm_create': True, 'rfm_delete_terminate': True, 'other_applet_create': True, 'other_applet_delete_terminate': True}}, 'life_cycle_status_integer': 'operational_activated', 'security_attrib_referenced': {'ef_arr_file_id': '6f06', 'ef_arr_record_nr': 6}, 'file_size': 128, 'short_file_identifier': None}
select MF/ADF.USIM/EF.EARFCNList
update_binary ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
#
################################################################################
# MF/ADF.USIM/EF.MuDMiDConfigData #
################################################################################
# directory: MF/ADF.USIM/EF.MuDMiDConfigData (3f00/a0000000871002/6ffe)
@@ -4873,7 +4884,7 @@ aram_delete_all
################################################################################
# Export summary #
################################################################################
# total files visited: 345
# total files visited: 346
# bad files: 63
# MF/DF.GSM/EF.SUME/EF.SUME, SW match failed! Expected 9000 and got 6982: Command not allowed - Security status not satisfied
# MF/DF.GSM/EF.CPBCCH/EF.CPBCCH, SW match failed! Expected 9000 and got 6a82: Wrong parameters - File not found

View File

@@ -80,6 +80,7 @@ Checking service No 111 (inactive)
Checking service No 114 (inactive)
Checking service No 115 (inactive)
Checking service No 120 (inactive)
Checking service No 121 (inactive)
Checking service No 122 (active)
Checking service No 123 (active)
Checking service No 124 (inactive)
@@ -104,7 +105,7 @@ Checking service No 146 (inactive)
Checking service No 147 (inactive)
Checking service No 148 (inactive)
Checking service No 150 (inactive)
===> 75 service / file inconsistencies detected
===> 76 service / file inconsistencies detected
beff9f9de73e04080000ff730000000600000000
beff9f9de73e04080000ff730000000600002000
beff9f9de73e04080000ff730000000600000000

View File

@@ -10105,6 +10105,45 @@
"message": "Wrong parameters - File not found"
}
},
"MF/ADF.USIM/EF.EARFCNList": {
"path": [
"MF",
"ADF.USIM",
"EF.EARFCNList"
],
"fcp_raw": "621e8202412183026ffda506d00120d2010f8a01058b036f0606800200808800",
"fcp": {
"file_descriptor": {
"file_descriptor_byte": {
"shareable": true,
"file_type": "working_ef",
"structure": "transparent"
},
"record_len": null,
"num_of_rec": null
},
"file_identifier": "6ffd",
"proprietary_information": {
"unknown_ber_tlv_ie_d0": {
"raw": "20"
},
"toolkit_access_conditions": {
"rfm_create": true,
"rfm_delete_terminate": true,
"other_applet_create": true,
"other_applet_delete_terminate": true
}
},
"life_cycle_status_integer": "operational_activated",
"security_attrib_referenced": {
"ef_arr_file_id": "6f06",
"ef_arr_record_nr": 6
},
"file_size": 128,
"short_file_identifier": null
},
"body": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
},
"MF/ADF.USIM/EF.MuDMiDConfigData": {
"path": [
"MF",