<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/24654">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">implement more files with TLV + construct<br><br>This adds encoding/decoding for more files, from 51.011 (SIM)<br>to 31.102 (USIM) and 31.103 (ISIM)<br><br>Change-Id: I6083d2bb0a307f660f09af384803f84e4098a5ed<br>---<br>M pySim/ts_31_102.py<br>M pySim/ts_31_103.py<br>M pySim/ts_51_011.py<br>3 files changed, 220 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim/ts_31_102.py b/pySim/ts_31_102.py</span><br><span>index 24d0f52..f3628ad 100644</span><br><span>--- a/pySim/ts_31_102.py</span><br><span>+++ b/pySim/ts_31_102.py</span><br><span>@@ -511,7 +511,14 @@</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span>         self._construct = Struct('ksi'/Int8ub, 'ck'/HexAdapter(Bytes(16)), 'ik'/HexAdapter(Bytes(16)))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# TS 31.103 Section 4.2.7</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.6</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_HPPLMN(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6f31', sfid=0x12, name='EF.HPPLMN', size={1,1},</span><br><span style="color: hsl(120, 100%, 40%);">+                 desc='Higher Priority PLMN search period'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = Int8ub</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.8</span><br><span> class EF_UST(TransparentEF):</span><br><span>     def __init__(self, fid='6f38', sfid=0x04, name='EF.UST', desc='USIM Service Table', size={1,17}):</span><br><span>         super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span>@@ -677,6 +684,33 @@</span><br><span>         self._construct = Struct('key_domain_id'/Bytes(3),</span><br><span>                                  'num_msk_id'/Int8ub,</span><br><span>                                  'msk_ids'/msk_ts_constr[this.num_msk_id])</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.81</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_MUK(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class MUK_Idr(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = HexAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class MUK_Idi(BER_TLV_IE, tag=0x82):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = HexAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class MUK_ID(BER_TLV_IE, tag=0xA0, nested=[MUK_Idr, MUK_Idi]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class TimeStampCounter(BER_TLV_IE, tag=0x81):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class EF_MUK_Collection(TLV_IE_Collection, nested=[MUK_ID, TimeStampCounter]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fd8', sfid=None, name='EF.MUK', desc='MBMS User Key'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={None,None})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_MUK.EF_MUK_Collection</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.83</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_GBANL(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class NAF_ID(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = HexAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class B_TID(BER_TLV_IE, tag=0x81):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = HexAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class EF_GBANL_Collection(BER_TLV_IE, nested=[NAF_ID, B_TID]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fda', sfid=None, name='EF.GBANL', desc='GBA NAF List'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={None,None})</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_GBANL.EF_GBANL_Collection</span><br><span> </span><br><span> # TS 31.102 Section 4.2.85</span><br><span> class EF_EHPLMNPI(TransparentEF):</span><br><span>@@ -685,6 +719,42 @@</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span>         self._construct = Struct('presentation_ind'/</span><br><span>                                  Enum(Byte, no_preference=0, display_highest_prio_only=1, display_all=2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.87</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_NAFKCA(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class NAF_KeyCentreAddress(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = HexAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fdd', sfid=None, name='EF.NAFKCA', rec_len={None, None},</span><br><span style="color: hsl(120, 100%, 40%);">+            desc='NAF Key Centre Address'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_NAFKCA.NAF_KeyCentreAddress</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.90</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_NCP_IP(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class DataDestAddrRange(TLV_IE, tag=0x83):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = Struct('type_of_address'/Enum(Byte, IPv4=0x21, IPv6=0x56),</span><br><span style="color: hsl(120, 100%, 40%);">+                            'prefix_length'/Int8ub,</span><br><span style="color: hsl(120, 100%, 40%);">+                            'prefix'/HexAdapter(GreedyBytes))</span><br><span style="color: hsl(120, 100%, 40%);">+    class AccessPointName(TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        # coded as per TS 23.003</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = HexAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class Login(TLV_IE, tag=0x81):</span><br><span style="color: hsl(120, 100%, 40%);">+        # as per SMS DCS TS 23.038</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GsmStringAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class Password(TLV_IE, tag=0x82):</span><br><span style="color: hsl(120, 100%, 40%);">+        # as per SMS DCS TS 23.038</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GsmStringAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class BearerDescription(TLV_IE, tag=0x84):</span><br><span style="color: hsl(120, 100%, 40%);">+        # Bearer descriptionTLV DO as per TS 31.111</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class EF_NCP_IP_Collection(TLV_IE_Collection,</span><br><span style="color: hsl(120, 100%, 40%);">+                               nested=[AccessPointName, Login, Password, BearerDescription]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fe2', sfid=None, name='EF.NCP-IP', rec_len={None, None},</span><br><span style="color: hsl(120, 100%, 40%);">+            desc='Network Connectivity Parameters for USIM IP connections'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_NCP_IP.EF_NCP_IP_Collection</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 31.102 Section 4.2.91</span><br><span> class EF_EPSLOCI(TransparentEF):</span><br><span>     def __init__(self, fid='6fe3', sfid=0x1e, name='EF.EPSLOCI', size={18,18},</span><br><span>@@ -694,6 +764,27 @@</span><br><span>         self._construct = Struct('guti'/Bytes(12), 'last_visited_registered_tai'/Bytes(5),</span><br><span>                                  'eps_update_status'/upd_status_constr)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.92</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_EPSNSC(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class KSI_ASME(BER_TLV_IE, tag= 0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = Int8ub</span><br><span style="color: hsl(120, 100%, 40%);">+    class K_ASME(BER_TLV_IE, tag= 0x81):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = HexAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class UplinkNASCount(BER_TLV_IE, tag=0x82):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = Int32ub</span><br><span style="color: hsl(120, 100%, 40%);">+    class DownlinkNASCount(BER_TLV_IE, tag=0x83):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = Int32ub</span><br><span style="color: hsl(120, 100%, 40%);">+    class IDofNASAlgorithms(BER_TLV_IE, tag=0x84):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = HexAdapter(GreedyBytes)</span><br><span style="color: hsl(120, 100%, 40%);">+    class EPS_NAS_Security_Context(BER_TLV_IE, tag=0xa0,</span><br><span style="color: hsl(120, 100%, 40%);">+                               nested=[KSI_ASME, K_ASME, UplinkNASCount, DownlinkNASCount,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   IDofNASAlgorithms]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self,fid='6fe4', sfid=0x18, name='EF.EPSNSC', rec_len={54,128},</span><br><span style="color: hsl(120, 100%, 40%);">+            desc='EPS NAS Security Context'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_EPSNSC.EPS_NAS_Security_Context</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 31.102 Section 4.2.96</span><br><span> class EF_PWS(TransparentEF):</span><br><span>     def __init__(self, fid='6fec', sfid=None, name='EF.PWS', desc='Public Warning System', size={1,1}):</span><br><span>@@ -709,6 +800,18 @@</span><br><span>         self._construct = Struct('status'/PaddedString(2, 'ascii'),</span><br><span>                                  'link_to_ef_ipd'/Int8ub, 'rfu'/Byte)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.2.103</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_ePDGId(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class ePDGId(BER_TLV_IE, tag=0x80, nested=[]):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = Struct('type_of_ePDG_address'/Enum(Byte, FQDN=0, IPv4=1, IPv6=2),</span><br><span style="color: hsl(120, 100%, 40%);">+                            'ePDG_address'/Switch(this.type_of_address,</span><br><span style="color: hsl(120, 100%, 40%);">+                                { 'FQDN': GreedyString("utf8"),</span><br><span style="color: hsl(120, 100%, 40%);">+                                  'IPv4': HexAdapter(GreedyBytes),</span><br><span style="color: hsl(120, 100%, 40%);">+                                  'IPv6': HexAdapter(GreedyBytes) }))</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6ff3', sfid=None, name='EF.eDPDGId', desc='Home ePDG Identifier'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_ePDGId.ePDGId</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 31.102 Section 4.2.106</span><br><span> class EF_FromPreferred(TransparentEF):</span><br><span>     def __init__(self, fid='6ff7', sfid=None, name='EF.FromPreferred', size={1,1},</span><br><span>@@ -738,12 +841,39 @@</span><br><span>                                      mission_critical_service=2)</span><br><span>         self._construct = Struct('uac_access_id_config'/cfg_constr)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# TS 31.102 Section 4.4.11.10</span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.4.11.9</span><br><span> class EF_OPL5G(LinFixedEF):</span><br><span>     def __init__(self, fid='6f08', sfid=0x08, name='EF.OPL5G', desc='5GS Operator PLMN List'):</span><br><span>         super().__init__(fid=fid, sfid=sfid, name=name, desc=desc, rec_len={10,None})</span><br><span>         self._construct = Struct('tai'/Bytes(9), 'pnn_record_id'/Int8ub)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 31.102 Section 4.4.11.10</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_SUPI_NAI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class NetworkSpecificIdentifier(TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        # RFC 7542 encoded as UTF-8 string</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GreedyString("utf8")</span><br><span style="color: hsl(120, 100%, 40%);">+    class GlobalLineIdentifier(TLV_IE, tag=0x81):</span><br><span style="color: hsl(120, 100%, 40%);">+        # TS 23.003 clause 28.16.2</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class GlobalCableIdentifier(TLV_IE, tag=0x82):</span><br><span style="color: hsl(120, 100%, 40%);">+        # TS 23.003 clause 28.15.2</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class NAI_TLV_Collection(TLV_IE_Collection,</span><br><span style="color: hsl(120, 100%, 40%);">+            nested=[NetworkSpecificIdentifier, GlobalLineIdentifier, GlobalCableIdentifier]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='4f09', sfid=0x09, name='EF.SUPI_NAI',</span><br><span style="color: hsl(120, 100%, 40%);">+            desc='SUPI as Network Access Identifier'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_SUPI_NAI.NAI_TLV_Collection</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_TN3GPPSNN(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class ServingNetworkName(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GreedyString("utf8")</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='4f0c', sfid=0x0c, name='EF.TN3GPPSNN',</span><br><span style="color: hsl(120, 100%, 40%);">+            desc='Trusted non-3GPP Serving network names list'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_TN3GPPSNN.ServingNetworkName</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 31.102 Section 4.4.5</span><br><span> class DF_WLAN(CardDF):</span><br><span>     def __init__(self, fid='5f40', name='DF.WLAN', desc='Files for WLAN purpose'):</span><br><span>@@ -812,10 +942,10 @@</span><br><span>           EF_UAC_AIC(),</span><br><span>           EF_SUCI_Calc_Info(),</span><br><span>           EF_OPL5G(),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('4F09', 0x09, 'EF.SUPI_NAI', 'SUPI as Network Access Identifier'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SUPI_NAI(),</span><br><span>           TransparentEF('4F0A', 0x0a, 'EF.Routing_Indicator', 'Routing Indicator', size={4,4}),</span><br><span>           TransparentEF('4F0B', 0x0b, 'EF.URSP', 'UE Route Selector Policies per PLMN'),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('4F0C', 0x0c, 'EF.TN3GPPSNN', 'Trusted non-3GPP Serving network names list'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_TN3GPPSNN(),</span><br><span>         ]</span><br><span>         self.add_files(files)</span><br><span> </span><br><span>@@ -833,7 +963,7 @@</span><br><span>           EF_Keys('6f09', 0x09, 'EF.KeysPS', desc='Ciphering and Integrity Keys for PS domain'),</span><br><span>           EF_xPLMNwAcT('6f60', 0x0a, 'EF.PLMNwAcT',</span><br><span>                        'User controlled PLMN Selector with Access Technology'),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('6f31', 0x12, 'EF.HPPLMN', 'Higher Priority PLMN search period'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_HPPLMN(),</span><br><span>           EF_ACMmax(),</span><br><span>           EF_UST(),</span><br><span>           CyclicEF('6f39', None, 'EF.ACM', 'Accumulated call meter', rec_len={3,3}),</span><br><span>@@ -903,16 +1033,16 @@</span><br><span>           EF_VGCSCA('6fd5', None, 'EF.VBCSCA', 'Voice Broadcast Service Ciphering Algorithm'),</span><br><span>           EF_GBABP(),</span><br><span>           EF_MSK(),</span><br><span style="color: hsl(0, 100%, 40%);">-          LinFixedEF('6fd8', None, 'EF.MUK', 'MBMS User Key'),</span><br><span style="color: hsl(0, 100%, 40%);">-          LinFixedEF('6fda', None, 'EF.GBANL', 'GBA NFA List'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_MUK(),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_GBANL(),</span><br><span>           EF_PLMNsel('6fd9', 0x1d, 'EF.EHPLMN', 'Equivalent HPLMN', size={12,None}),</span><br><span>           EF_EHPLMNPI(),</span><br><span style="color: hsl(0, 100%, 40%);">-          LinFixedEF('6fdd', None, 'EF.NAFKCA', 'NAF Key Centre Address'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_NAFKCA(),</span><br><span>           TransparentEF('6fde', None, 'EF.SPNI', 'Service Provider Name Icon'),</span><br><span>           LinFixedEF('6fdf', None, 'EF.PNNI', 'PLMN Network Name Icon'),</span><br><span style="color: hsl(0, 100%, 40%);">-          LinFixedEF('6fe2', None, 'EF.NCP-IP', 'Network Connectivity Parameters for USIM IP connections'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_NCP_IP(),</span><br><span>           EF_EPSLOCI('6fe3', 0x1e, 'EF.EPSLOCI', 'EPS location information'),</span><br><span style="color: hsl(0, 100%, 40%);">-          LinFixedEF('6fe4', 0x18, 'EF.EPSNSC', 'EPS NAS Security Context', rec_len={54,128}),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_EPSNSC(),</span><br><span>           TransparentEF('6fe6', None, 'EF.UFC', 'USAT Facility Control', size={1,16}),</span><br><span>           TransparentEF('6fe8', None, 'EF.NASCONFIG', 'Non Access Stratum Configuration'),</span><br><span>           # UICC IARI (only in cards that have no ISIM)</span><br><span>@@ -921,7 +1051,8 @@</span><br><span>           LinFixedEF('6fee', None, 'EF.BDNURI', 'Barred Dialling Numbers URI'),</span><br><span>           LinFixedEF('6fef', None, 'EF.SDNURI', 'Service Dialling Numbers URI'),</span><br><span>           EF_IPS(),</span><br><span style="color: hsl(0, 100%, 40%);">-          # FIXME: from EF_ePDGid onwards</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_ePDGId(),</span><br><span style="color: hsl(120, 100%, 40%);">+          # FIXME: from EF_ePDGSelection onwards</span><br><span>           EF_FromPreferred(),</span><br><span>           # FIXME: DF_SoLSA</span><br><span>           # FIXME: DF_PHONEBOOK</span><br><span>diff --git a/pySim/ts_31_103.py b/pySim/ts_31_103.py</span><br><span>index 5ca8279..e1f552f 100644</span><br><span>--- a/pySim/ts_31_103.py</span><br><span>+++ b/pySim/ts_31_103.py</span><br><span>@@ -24,6 +24,7 @@</span><br><span> </span><br><span> from pySim.filesystem import *</span><br><span> from pySim.utils import *</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.tlv import *</span><br><span> from pySim.ts_51_011 import EF_AD, EF_SMS, EF_SMSS, EF_SMSR, EF_SMSP</span><br><span> from pySim.ts_31_102 import ADF_USIM, EF_FromPreferred</span><br><span> import pySim.ts_102_221</span><br><span>@@ -78,18 +79,27 @@</span><br><span> </span><br><span> # TS 31.103 Section 4.2.2</span><br><span> class EF_IMPI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class nai(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GreedyString("utf8")</span><br><span>     def __init__(self, fid='6f02', sfid=0x02, name='EF.IMPI', desc='IMS private user identity'):</span><br><span>         super().__init__(fid=fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_IMPI.nai</span><br><span> </span><br><span> # TS 31.103 Section 4.2.3</span><br><span> class EF_DOMAIN(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class domain(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GreedyString("utf8")</span><br><span>     def __init__(self, fid='6f05', sfid=0x05, name='EF.DOMAIN', desc='Home Network Domain Name'):</span><br><span>         super().__init__(fid=fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_DOMAIN.domain</span><br><span> </span><br><span> # TS 31.103 Section 4.2.4</span><br><span> class EF_IMPU(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class impu(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GreedyString("utf8")</span><br><span>     def __init__(self, fid='6f04', sfid=0x04, name='EF.IMPU', desc='IMS public user identity'):</span><br><span>         super().__init__(fid=fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_IMPU.impu</span><br><span> </span><br><span> # TS 31.103 Section 4.2.7</span><br><span> class EF_IST(TransparentEF):</span><br><span>@@ -140,8 +150,11 @@</span><br><span> </span><br><span> # TS 31.103 Section 4.2.16</span><br><span> class EF_UICCIARI(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class iari(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GreedyString("utf8")</span><br><span>     def __init__(self, fid='6fe7', sfid=None, name='EF.UICCIARI', desc='UICC IARI'):</span><br><span>         super().__init__(fid=fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_UICCIARI.iari</span><br><span> </span><br><span> # TS 31.103 Section 4.2.18</span><br><span> class EF_IMSConfigData(BerTlvEF):</span><br><span>@@ -155,8 +168,11 @@</span><br><span> </span><br><span> # TS 31.103 Section 4.2.20</span><br><span> class EF_WebRTCURI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class uri(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GreedyString("utf8")</span><br><span>     def __init__(self, fid='6ffa', sfid=None, name='EF.WebRTCURI', desc='WebRTC URI'):</span><br><span>         super().__init__(fid=fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_WebRTCURI.uri</span><br><span> </span><br><span> # TS 31.103 Section 4.2.21</span><br><span> class EF_MuDMiDConfigData(BerTlvEF):</span><br><span>diff --git a/pySim/ts_51_011.py b/pySim/ts_51_011.py</span><br><span>index 6ab07f0..65be06a 100644</span><br><span>--- a/pySim/ts_51_011.py</span><br><span>+++ b/pySim/ts_51_011.py</span><br><span>@@ -1,5 +1,9 @@</span><br><span> # -*- coding: utf-8 -*-</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# without this, pylint will fail when inner classes are used</span><br><span style="color: hsl(120, 100%, 40%);">+# within the 'nested' kwarg of our TlvMeta metaclass on python 3.7 :(</span><br><span style="color: hsl(120, 100%, 40%);">+# pylint: disable=undefined-variable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> """ Various constants from ETSI TS 151.011 +</span><br><span> Representation of the GSM SIM/USIM/ISIM filesystem hierarchy.</span><br><span> </span><br><span>@@ -320,6 +324,7 @@</span><br><span> }</span><br><span> </span><br><span> from pySim.utils import *</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.tlv import *</span><br><span> from struct import pack, unpack</span><br><span> from construct import *</span><br><span> from construct import Optional as COptional</span><br><span>@@ -533,6 +538,7 @@</span><br><span>     def __init__(self, fid='6f45', sfid=None, name='EF.CBMI', size={2,None}, rec_len=2,</span><br><span>                  desc='Cell Broadcast message identifier selection'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = GreedyRange(Int16ub)</span><br><span> </span><br><span> # TS 51.011 Section 10.3.15</span><br><span> class EF_ACC(TransparentEF):</span><br><span>@@ -617,18 +623,21 @@</span><br><span>     def __init__(self, fid='6f48', sfid=None, name='EF.CBMID', size={2,None}, rec_len=2,</span><br><span>                  desc='Cell Broadcast Message Identifier for Data Download'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = GreedyRange(Int16ub)</span><br><span> </span><br><span> # TS 51.011 Section 10.3.27</span><br><span> class EF_ECC(TransRecEF):</span><br><span>     def __init__(self, fid='6fb7', sfid=None, name='EF.ECC', size={3,15}, rec_len=3,</span><br><span>                  desc='Emergency Call Codes'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = GreedyRange(BcdAdapter(Bytes(3)))</span><br><span> </span><br><span> # TS 51.011 Section 10.3.28</span><br><span> class EF_CBMIR(TransRecEF):</span><br><span>     def __init__(self, fid='6f50', sfid=None, name='EF.CBMIR', size={4,None}, rec_len=4,</span><br><span>                  desc='Cell Broadcast message identifier range selection'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = GreedyRange(Struct('lower'/Int16ub, 'upper'/Int16ub))</span><br><span> </span><br><span> # TS 51.011 Section 10.3.29</span><br><span> class EF_DCK(TransparentEF):</span><br><span>@@ -740,6 +749,20 @@</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span>         self._construct = FlagsEnum(Byte, in_limited_service_mode=1, after_successful_plmn_selection=2)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 4.2.58</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_PNN(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class FullNameForNetwork(BER_TLV_IE, tag=0x43):</span><br><span style="color: hsl(120, 100%, 40%);">+        # TS 24.008 10.5.3.5a</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class ShortNameForNetwork(BER_TLV_IE, tag=0x45):</span><br><span style="color: hsl(120, 100%, 40%);">+        # TS 24.008 10.5.3.5a</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class NetworkNameCollection(TLV_IE_Collection, nested=[FullNameForNetwork, ShortNameForNetwork]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fc5', sfid=None, name='EF.PNN', desc='PLMN Network Name'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_PNN.NetworkNameCollection</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 51.011 Section 10.3.42</span><br><span> class EF_OPL(LinFixedEF):</span><br><span>     def __init__(self, fid='6fc6', sfid=None, name='EF.OPL', rec_len={8,8}, desc='Operator PLMN List'):</span><br><span>@@ -763,6 +786,18 @@</span><br><span>                                  'num_waiting_fax'/Int8ub, 'num_waiting_email'/Int8ub,</span><br><span>                                  'num_waiting_other'/Int8ub, 'num_waiting_videomail'/COptional(Int8ub))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Section 10.3.66</span><br><span style="color: hsl(120, 100%, 40%);">+class EF_SPDI(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class ServiceProviderPLMN(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+        # flexible numbers of 3-byte PLMN records</span><br><span style="color: hsl(120, 100%, 40%);">+        _construct = GreedyRange(BcdAdapter(Bytes(3)))</span><br><span style="color: hsl(120, 100%, 40%);">+    class SPDI(BER_TLV_IE, tag=0xA3, nested=[ServiceProviderPLMN]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, fid='6fcd', sfid=None, name='EF.SPDI',</span><br><span style="color: hsl(120, 100%, 40%);">+            desc='Service Provider Display Information'):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(fid, sfid=sfid, name=name, desc=desc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_SPDI.SPDI</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 51.011 Section 10.3.51</span><br><span> class EF_MMSN(LinFixedEF):</span><br><span>     def __init__(self, fid='6fce', sfid=None, name='EF.MMSN', rec_len={4,20}, desc='MMS Notification'):</span><br><span>@@ -770,17 +805,42 @@</span><br><span>         self._construct = Struct('mms_status'/Bytes(2), 'mms_implementation'/Bytes(1),</span><br><span>                                  'mms_notification'/Bytes(this._.total_len-4), 'ext_record_nr'/Byte)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# TS 51.011 Annex K.1</span><br><span style="color: hsl(120, 100%, 40%);">+class MMS_Implementation(BER_TLV_IE, tag=0x80):</span><br><span style="color: hsl(120, 100%, 40%);">+    _construct = FlagsEnum(Byte, WAP=1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # TS 51.011 Section 10.3.53</span><br><span> class EF_MMSICP(TransparentEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class MMS_Relay_Server(BER_TLV_IE, tag=0x81):</span><br><span style="color: hsl(120, 100%, 40%);">+        # 3GPP TS 23.140</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class Interface_to_CN(BER_TLV_IE, tag=0x82):</span><br><span style="color: hsl(120, 100%, 40%);">+        # 3GPP TS 23.140</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class Gateway(BER_TLV_IE, tag=0x83):</span><br><span style="color: hsl(120, 100%, 40%);">+        # Address, Type of address, Port, Service, AuthType, AuthId, AuthPass / 3GPP TS 23.140</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class MMS_ConnectivityParamters(TLV_IE_Collection,</span><br><span style="color: hsl(120, 100%, 40%);">+            nested=[MMS_Implementation, MMS_Relay_Server, Interface_to_CN, Gateway]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span>     def __init__(self, fid='6fd0', sfid=None, name='EF.MMSICP', size={1,None},</span><br><span>                  desc='MMS Issuer Connectivity Parameters'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(120, 100%, 40%);">+        self._tlv = EF_MMSICP.MMS_ConnectivityParamters</span><br><span> </span><br><span> # TS 51.011 Section 10.3.54</span><br><span> class EF_MMSUP(LinFixedEF):</span><br><span style="color: hsl(120, 100%, 40%);">+    class MMS_UserPref_ProfileName(BER_TLV_IE, tag=0x81):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class MMS_UserPref_Info(BER_TLV_IE, tag=0x82):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span style="color: hsl(120, 100%, 40%);">+    class MMS_User_Preferences(TLV_IE_Collection,</span><br><span style="color: hsl(120, 100%, 40%);">+            nested=[MMS_Implementation,MMS_UserPref_ProfileName,MMS_UserPref_Info]):</span><br><span style="color: hsl(120, 100%, 40%);">+        pass</span><br><span>     def __init__(self, fid='6fd1', sfid=None, name='EF.MMSUP', rec_len={1,None},</span><br><span>                  desc='MMS User Preferences'):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, rec_len=rec_len)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.tlv = EF_MMSUP.MMS_User_Preferences</span><br><span> </span><br><span> # TS 51.011 Section 10.3.55</span><br><span> class EF_MMSUCP(TransparentEF):</span><br><span>@@ -834,7 +894,7 @@</span><br><span>           EF_xPLMNwAcT('6f62', None, 'EF.HPLMNwAcT', 'HPLMN Selector with Access Technology'),</span><br><span>           EF_CPBCCH(),</span><br><span>           EF_InvScan(),</span><br><span style="color: hsl(0, 100%, 40%);">-          LinFixedEF('6fc5', None,'EF.PNN', 'PLMN Network Name'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_PNN(),</span><br><span>           EF_OPL(),</span><br><span>           EF_ADN('6fc7', None, 'EF.MBDN', 'Mailbox Dialling Numbers'),</span><br><span>           EF_MBI(),</span><br><span>@@ -842,7 +902,7 @@</span><br><span>           EF_ADN('6fcb', None, 'EF.CFIS', 'Call Forwarding Indication Status'),</span><br><span>           EF_EXT('6fc8', None, 'EF.EXT6', 'Externsion6 (MBDN)'),</span><br><span>           EF_EXT('6fcc', None, 'EF.EXT7', 'Externsion7 (CFIS)'),</span><br><span style="color: hsl(0, 100%, 40%);">-          TransparentEF('6fcd', None, 'EF.SPDI', 'Service Provider Display Information'),</span><br><span style="color: hsl(120, 100%, 40%);">+          EF_SPDI(),</span><br><span>           EF_MMSN(),</span><br><span>           EF_EXT('6fcf', None, 'EF.EXT8', 'Extension8 (MMSN)'),</span><br><span>           EF_MMSICP(),</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/24654">change 24654</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/24654"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6083d2bb0a307f660f09af384803f84e4098a5ed </div>
<div style="display:none"> Gerrit-Change-Number: 24654 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>