<p>Falkenber9 has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/23723">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use construct for EF_AD in pySim-{shepp, prog, read}.py, cards.py<br><br>Also serves as example for RFU (reserved for future use) fields<br>which should not always be reset to zero in case they have been<br>set on the uSIM for some reason.<br>See pySim/ts_51_011.py, class EF_AD.<br><br>* Add definitions for RFU {Flag, Bits, Byte, Bytes}<br>* Use IntEnum for OP_MODE (convenient auto completion)<br>* Remove obsolete definitions and imports<br>* Update test results for all SIMs (opmode strings are shortened)<br><br>Change-Id: I65e0a426f80a619fec38856a30e590f0e726b554<br>---<br>M pySim-prog.py<br>M pySim-read.py<br>M pySim-shell.py<br>M pySim/cards.py<br>M pySim/construct.py<br>M pySim/ts_51_011.py<br>M pysim-testdata/Fairwaves-SIM.ok<br>M pysim-testdata/Wavemobile-SIM.ok<br>M pysim-testdata/fakemagicsim.ok<br>M pysim-testdata/sysmoISIM-SJA2.ok<br>M pysim-testdata/sysmoUSIM-SJS1.ok<br>M pysim-testdata/sysmosim-gr1.ok<br>12 files changed, 81 insertions(+), 57 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/23/23723/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim-prog.py b/pySim-prog.py</span><br><span>index 0abd190..4c85be7 100755</span><br><span>--- a/pySim-prog.py</span><br><span>+++ b/pySim-prog.py</span><br><span>@@ -146,7 +146,7 @@</span><br><span>     parser.add_option("--opmode", dest="opmode", type="choice",</span><br><span>                    help="Set UE Operation Mode in EF.AD (Administrative Data)",</span><br><span>                       default=None,</span><br><span style="color: hsl(0, 100%, 40%);">-                   choices=['{:02X}'.format(m) for m in list(EF_AD.OP_MODE.keys())],</span><br><span style="color: hsl(120, 100%, 40%);">+                     choices=['{:02X}'.format(int(m)) for m in EF_AD.OP_MODE],</span><br><span>            )</span><br><span>    parser.add_option("--epdgid", dest="epdgid",</span><br><span>                     help="Set Home Evolved Packet Data Gateway (ePDG) Identifier. (Only FQDN format supported)",</span><br><span>diff --git a/pySim-read.py b/pySim-read.py</span><br><span>index 59c5762..85a0952 100755</span><br><span>--- a/pySim-read.py</span><br><span>+++ b/pySim-read.py</span><br><span>@@ -28,7 +28,7 @@</span><br><span> import random</span><br><span> import re</span><br><span> import sys</span><br><span style="color: hsl(0, 100%, 40%);">-from pySim.ts_51_011 import EF, DF, EF_SST_map, EF_AD_mode_map</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_51_011 import EF, DF, EF_SST_map, EF_AD</span><br><span> from pySim.ts_31_102 import EF_UST_map, EF_USIM_ADF_map</span><br><span> from pySim.ts_31_103 import EF_IST_map, EF_ISIM_ADF_map</span><br><span> </span><br><span>@@ -230,11 +230,10 @@</span><br><span>       (res, sw) = card.read_binary('AD')</span><br><span>   if sw == '9000':</span><br><span>             print("Administrative data: %s" % (res,))</span><br><span style="color: hsl(0, 100%, 40%);">-             if res[:2] in EF_AD_mode_map:</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("\tMS operation mode: %s" % (EF_AD_mode_map[res[:2]],))</span><br><span style="color: hsl(0, 100%, 40%);">-         else:</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("\tMS operation mode: (unknown 0x%s)" % (res[:2],))</span><br><span style="color: hsl(0, 100%, 40%);">-             if int(res[4:6], 16) & 0x01:</span><br><span style="color: hsl(120, 100%, 40%);">+              ad = EF_AD()</span><br><span style="color: hsl(120, 100%, 40%);">+          data = ad.decode_hex(res)</span><br><span style="color: hsl(120, 100%, 40%);">+             print("\tMS operation mode: %s" % data['ms_operation_mode'])</span><br><span style="color: hsl(120, 100%, 40%);">+                if data['ofm']:</span><br><span>                      print("\tCiphering Indicator: enabled")</span><br><span>            else:</span><br><span>                        print("\tCiphering Indicator: disabled")</span><br><span>diff --git a/pySim-shell.py b/pySim-shell.py</span><br><span>index 6bc9a95..acb1822 100755</span><br><span>--- a/pySim-shell.py</span><br><span>+++ b/pySim-shell.py</span><br><span>@@ -30,7 +30,7 @@</span><br><span> import sys</span><br><span> from pathlib import Path</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-from pySim.ts_51_011 import EF, DF, EF_SST_map, EF_AD_mode_map</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.ts_51_011 import EF, DF, EF_SST_map</span><br><span> from pySim.ts_31_102 import EF_UST_map, EF_USIM_ADF_map</span><br><span> from pySim.ts_31_103 import EF_IST_map, EF_ISIM_ADF_map</span><br><span> </span><br><span>diff --git a/pySim/cards.py b/pySim/cards.py</span><br><span>index 5a39bda..1334cc6 100644</span><br><span>--- a/pySim/cards.py</span><br><span>+++ b/pySim/cards.py</span><br><span>@@ -175,8 +175,7 @@</span><br><span> </span><br><span>             # read from card</span><br><span>             raw_hex_data, sw = self._scc.read_binary(EF['AD'], length=None, offset=0)</span><br><span style="color: hsl(0, 100%, 40%);">-               raw_bin_data = h2b(raw_hex_data)</span><br><span style="color: hsl(0, 100%, 40%);">-                abstract_data = ad.decode_bin(raw_bin_data)</span><br><span style="color: hsl(120, 100%, 40%);">+           abstract_data = ad.decode_hex(raw_hex_data)</span><br><span> </span><br><span>              # perform updates</span><br><span>            if mnc:</span><br><span>@@ -185,19 +184,18 @@</span><br><span>                              mnclen = 2</span><br><span>                   if mnclen > 3:</span><br><span>                            raise RuntimeError('invalid length of mnc "{}"'.format(mnc))</span><br><span style="color: hsl(0, 100%, 40%);">-                  abstract_data['len_of_mnc_in_imsi'] = mnclen</span><br><span style="color: hsl(120, 100%, 40%);">+                  abstract_data['mnc_len'] = mnclen</span><br><span>            if opmode:</span><br><span style="color: hsl(0, 100%, 40%);">-                      opmode_symb = ad.OP_MODE.get(int(opmode, 16))</span><br><span style="color: hsl(0, 100%, 40%);">-                   if opmode_symb:</span><br><span style="color: hsl(0, 100%, 40%);">-                         abstract_data['ms_operation_mode'] = opmode_symb</span><br><span style="color: hsl(120, 100%, 40%);">+                      opmode_num = int(opmode, 16)</span><br><span style="color: hsl(120, 100%, 40%);">+                  if opmode_num in [int(v) for v in EF_AD.OP_MODE]:</span><br><span style="color: hsl(120, 100%, 40%);">+                             abstract_data['ms_operation_mode'] = opmode_num</span><br><span>                      else:</span><br><span>                                raise RuntimeError('invalid opmode "{}"'.format(opmode))</span><br><span>           if ofm:</span><br><span style="color: hsl(0, 100%, 40%);">-                 abstract_data['specific_facilities']['ofm'] = bool(int(ofm, 16))</span><br><span style="color: hsl(120, 100%, 40%);">+                      abstract_data['ofm'] = bool(int(ofm, 16))</span><br><span> </span><br><span>                # write to card</span><br><span style="color: hsl(0, 100%, 40%);">-         raw_bin_data = ad.encode_bin(abstract_data)</span><br><span style="color: hsl(0, 100%, 40%);">-             raw_hex_data = b2h(raw_bin_data)</span><br><span style="color: hsl(120, 100%, 40%);">+              raw_hex_data = ad.encode_hex(abstract_data)</span><br><span>          data, sw = self._scc.update_binary(EF['AD'], raw_hex_data)</span><br><span>           return sw</span><br><span> </span><br><span>diff --git a/pySim/construct.py b/pySim/construct.py</span><br><span>index 839497c..dd00c63 100644</span><br><span>--- a/pySim/construct.py</span><br><span>+++ b/pySim/construct.py</span><br><span>@@ -47,3 +47,40 @@</span><br><span> </span><br><span> # here we collect some shared / common definitions of data types</span><br><span> LV = Prefixed(Int8ub, HexAdapter(GreedyBytes))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Default value for Reserved for Future Use (RFU) bits/bytes</span><br><span style="color: hsl(120, 100%, 40%);">+# See TS 31.101 Sec. "3.4 Coding Conventions"</span><br><span style="color: hsl(120, 100%, 40%);">+__RFU_VALUE = 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Field that packs Reserved for Future Use (RFU) bit</span><br><span style="color: hsl(120, 100%, 40%);">+FlagRFU=Default(Flag,__RFU_VALUE)</span><br><span style="color: hsl(120, 100%, 40%);">+# Field that packs Reserved for Future Use (RFU) byte</span><br><span style="color: hsl(120, 100%, 40%);">+ByteRFU = Default(Byte,__RFU_VALUE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def BitsRFU(n=1):</span><br><span style="color: hsl(120, 100%, 40%);">+    '''</span><br><span style="color: hsl(120, 100%, 40%);">+    Field that packs Reserved for Future Use (RFU) bit(s)</span><br><span style="color: hsl(120, 100%, 40%);">+    as defined in TS 31.101 Sec. "3.4 Coding Conventions"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    Use this for (currently) unused/reserved bits whose contents</span><br><span style="color: hsl(120, 100%, 40%);">+    should be initialized automatically but should not be cleared</span><br><span style="color: hsl(120, 100%, 40%);">+    in the future or when restoring read data (unlike padding).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    Parameters:</span><br><span style="color: hsl(120, 100%, 40%);">+        n (Integer): Number of bits (default: 1)</span><br><span style="color: hsl(120, 100%, 40%);">+    '''</span><br><span style="color: hsl(120, 100%, 40%);">+    return Default(BitsInteger(n),__RFU_VALUE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def BytesRFU(n=1):</span><br><span style="color: hsl(120, 100%, 40%);">+    '''</span><br><span style="color: hsl(120, 100%, 40%);">+    Field that packs Reserved for Future Use (RFU) byte(s)</span><br><span style="color: hsl(120, 100%, 40%);">+    as defined in TS 31.101 Sec. "3.4 Coding Conventions"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    Use this for (currently) unused/reserved bytes whose contents</span><br><span style="color: hsl(120, 100%, 40%);">+    should be initialized automatically but should not be cleared</span><br><span style="color: hsl(120, 100%, 40%);">+    in the future or when restoring read data (unlike padding).</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    Parameters:</span><br><span style="color: hsl(120, 100%, 40%);">+        n (Integer): Number of bytes (default: 1)</span><br><span style="color: hsl(120, 100%, 40%);">+    '''</span><br><span style="color: hsl(120, 100%, 40%);">+    return Default(Bytes(n),__RFU_VALUE)</span><br><span>diff --git a/pySim/ts_51_011.py b/pySim/ts_51_011.py</span><br><span>index c21e86c..7ab6885 100644</span><br><span>--- a/pySim/ts_51_011.py</span><br><span>+++ b/pySim/ts_51_011.py</span><br><span>@@ -319,22 +319,12 @@</span><br><span>        59: 'MMS User Connectivity Parameters',</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# 10.3.18 "EF.AD (Administrative data) "</span><br><span style="color: hsl(0, 100%, 40%);">-EF_AD_mode_map = {</span><br><span style="color: hsl(0, 100%, 40%);">-    '00' : 'normal operation',</span><br><span style="color: hsl(0, 100%, 40%);">-      '80' : 'type approval operations',</span><br><span style="color: hsl(0, 100%, 40%);">-      '01' : 'normal operation + specific facilities',</span><br><span style="color: hsl(0, 100%, 40%);">-        '81' : 'type approval operations + specific facilities',</span><br><span style="color: hsl(0, 100%, 40%);">-        '02' : 'maintenance (off line)',</span><br><span style="color: hsl(0, 100%, 40%);">-        '04' : 'cell test operation',</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> from pySim.utils 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 style="color: hsl(0, 100%, 40%);">-from pySim.construct import HexAdapter, BcdAdapter</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.construct import HexAdapter, BcdAdapter, FlagRFU, ByteRFU, BitsRFU, BytesRFU</span><br><span style="color: hsl(120, 100%, 40%);">+import enum</span><br><span> </span><br><span> from pySim.filesystem import *</span><br><span> import pySim.ts_102_221</span><br><span>@@ -553,30 +543,30 @@</span><br><span> </span><br><span> # TS 51.011 Section 10.3.18</span><br><span> class EF_AD(TransparentEF):</span><br><span style="color: hsl(0, 100%, 40%);">-    OP_MODE = {</span><br><span style="color: hsl(0, 100%, 40%);">-            0x00: 'normal',</span><br><span style="color: hsl(0, 100%, 40%);">-            0x80: 'type_approval',</span><br><span style="color: hsl(0, 100%, 40%);">-            0x01: 'normal_and_specific_facilities',</span><br><span style="color: hsl(0, 100%, 40%);">-            0x81: 'type_approval_and_specific_facilities',</span><br><span style="color: hsl(0, 100%, 40%);">-            0x02: 'maintenance_off_line',</span><br><span style="color: hsl(0, 100%, 40%);">-            0x04: 'cell_test',</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-    OP_MODE_reverse = dict(map(reversed, OP_MODE.items()))</span><br><span style="color: hsl(120, 100%, 40%);">+    class OP_MODE(enum.IntEnum):</span><br><span style="color: hsl(120, 100%, 40%);">+        normal                                  = 0x00</span><br><span style="color: hsl(120, 100%, 40%);">+        type_approval                           = 0x80</span><br><span style="color: hsl(120, 100%, 40%);">+        normal_and_specific_facilities          = 0x01</span><br><span style="color: hsl(120, 100%, 40%);">+        type_approval_and_specific_facilities   = 0x81</span><br><span style="color: hsl(120, 100%, 40%);">+        maintenance_off_line                    = 0x02</span><br><span style="color: hsl(120, 100%, 40%);">+        cell_test                               = 0x04</span><br><span style="color: hsl(120, 100%, 40%);">+    #OP_MODE_DICT = {int(v) : str(v) for v in EF_AD.OP_MODE}</span><br><span style="color: hsl(120, 100%, 40%);">+    #OP_MODE_DICT_REVERSED = {str(v) : int(v) for v in EF_AD.OP_MODE}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def __init__(self, fid='6fad', sfid=None, name='EF.AD', desc='Administrative Data', size={3,4}):</span><br><span>         super().__init__(fid, sfid=sfid, name=name, desc=desc, size=size)</span><br><span style="color: hsl(0, 100%, 40%);">-    def _decode_bin(self, raw_bin):</span><br><span style="color: hsl(0, 100%, 40%);">-        u = unpack('!BH', raw_bin[:3])</span><br><span style="color: hsl(0, 100%, 40%);">-        ofm = True if u[1] & 1 else False</span><br><span style="color: hsl(0, 100%, 40%);">-        res = {'ms_operation_mode': self.OP_MODE.get(u[0], u[0]), 'specific_facilities': { 'ofm': ofm } }</span><br><span style="color: hsl(0, 100%, 40%);">-        if len(raw_bin) > 3:</span><br><span style="color: hsl(0, 100%, 40%);">-            res['len_of_mnc_in_imsi'] = int(raw_bin[3]) & 0xf</span><br><span style="color: hsl(0, 100%, 40%);">-        return res</span><br><span style="color: hsl(0, 100%, 40%);">-    def _encode_bin(self, abstract):</span><br><span style="color: hsl(0, 100%, 40%);">-        op_mode = self.OP_MODE_reverse[abstract['ms_operation_mode']]</span><br><span style="color: hsl(0, 100%, 40%);">-        res = pack('!BH', op_mode, abstract['specific_facilities']['ofm'])</span><br><span style="color: hsl(0, 100%, 40%);">-        if 'len_of_mnc_in_imsi' in abstract:</span><br><span style="color: hsl(0, 100%, 40%);">-            res += pack('!B', abstract['len_of_mnc_in_imsi'])</span><br><span style="color: hsl(0, 100%, 40%);">-        return res</span><br><span style="color: hsl(120, 100%, 40%);">+        self._construct = BitStruct(</span><br><span style="color: hsl(120, 100%, 40%);">+            # Byte 1</span><br><span style="color: hsl(120, 100%, 40%);">+            'ms_operation_mode'/Bytewise(Enum(Byte, EF_AD.OP_MODE)),</span><br><span style="color: hsl(120, 100%, 40%);">+            # Byte 2</span><br><span style="color: hsl(120, 100%, 40%);">+            'rfu1'/Bytewise(ByteRFU),</span><br><span style="color: hsl(120, 100%, 40%);">+            # Byte 3</span><br><span style="color: hsl(120, 100%, 40%);">+            'rfu2'/BitsRFU(7),</span><br><span style="color: hsl(120, 100%, 40%);">+            'ofm'/Flag,</span><br><span style="color: hsl(120, 100%, 40%);">+            # Byte 4</span><br><span style="color: hsl(120, 100%, 40%);">+            'rfu3'/BitsRFU(4),</span><br><span style="color: hsl(120, 100%, 40%);">+            'mnc_len'/BitsInteger(4)</span><br><span style="color: hsl(120, 100%, 40%);">+        )</span><br><span> </span><br><span> # TS 51.011 Section 10.3.20 / 10.3.22</span><br><span> class EF_VGCS(TransRecEF):</span><br><span>diff --git a/pysim-testdata/Fairwaves-SIM.ok b/pysim-testdata/Fairwaves-SIM.ok</span><br><span>index e6fcfe3..f83f415 100644</span><br><span>--- a/pysim-testdata/Fairwaves-SIM.ok</span><br><span>+++ b/pysim-testdata/Fairwaves-SIM.ok</span><br><span>@@ -43,7 +43,7 @@</span><br><span> ACC: 0008</span><br><span> MSISDN: Not available</span><br><span> Administrative data: 00000002</span><br><span style="color: hsl(0, 100%, 40%);">- MS operation mode: normal operation</span><br><span style="color: hsl(120, 100%, 40%);">+   MS operation mode: normal</span><br><span>    Ciphering Indicator: disabled</span><br><span> SIM Service Table: ff3cc3ff030fff0f000fff03f0c0</span><br><span>     Service 1 - CHV1 disable function</span><br><span>diff --git a/pysim-testdata/Wavemobile-SIM.ok b/pysim-testdata/Wavemobile-SIM.ok</span><br><span>index 1c78cc9..0682a70 100644</span><br><span>--- a/pysim-testdata/Wavemobile-SIM.ok</span><br><span>+++ b/pysim-testdata/Wavemobile-SIM.ok</span><br><span>@@ -50,7 +50,7 @@</span><br><span> ACC: abce</span><br><span> MSISDN: Not available</span><br><span> Administrative data: 00000102</span><br><span style="color: hsl(0, 100%, 40%);">-       MS operation mode: normal operation</span><br><span style="color: hsl(120, 100%, 40%);">+   MS operation mode: normal</span><br><span>    Ciphering Indicator: enabled</span><br><span> SIM Service Table: ff33ff0f3c00ff0f000cf0c0f0030000</span><br><span>  Service 1 - CHV1 disable function</span><br><span>diff --git a/pysim-testdata/fakemagicsim.ok b/pysim-testdata/fakemagicsim.ok</span><br><span>index 1d1714f..11296f5 100644</span><br><span>--- a/pysim-testdata/fakemagicsim.ok</span><br><span>+++ b/pysim-testdata/fakemagicsim.ok</span><br><span>@@ -17,7 +17,7 @@</span><br><span> ACC: ffff</span><br><span> MSISDN: Not available</span><br><span> Administrative data: 000000</span><br><span style="color: hsl(0, 100%, 40%);">- MS operation mode: normal operation</span><br><span style="color: hsl(120, 100%, 40%);">+   MS operation mode: normal</span><br><span>    Ciphering Indicator: disabled</span><br><span> SIM Service Table: ff3fff0f0300f003000c</span><br><span>     Service 1 - CHV1 disable function</span><br><span>diff --git a/pysim-testdata/sysmoISIM-SJA2.ok b/pysim-testdata/sysmoISIM-SJA2.ok</span><br><span>index ae332a8..dc7b865 100644</span><br><span>--- a/pysim-testdata/sysmoISIM-SJA2.ok</span><br><span>+++ b/pysim-testdata/sysmoISIM-SJA2.ok</span><br><span>@@ -55,7 +55,7 @@</span><br><span> ACC: 0200</span><br><span> MSISDN (NPI=1 ToN=3): 6766266</span><br><span> Administrative data: 00000002</span><br><span style="color: hsl(0, 100%, 40%);">-       MS operation mode: normal operation</span><br><span style="color: hsl(120, 100%, 40%);">+   MS operation mode: normal</span><br><span>    Ciphering Indicator: disabled</span><br><span> SIM Service Table: ff33ffff3f003f0f300cf0c3f00000</span><br><span>   Service 1 - CHV1 disable function</span><br><span>diff --git a/pysim-testdata/sysmoUSIM-SJS1.ok b/pysim-testdata/sysmoUSIM-SJS1.ok</span><br><span>index 95f6967..bce3c9d 100644</span><br><span>--- a/pysim-testdata/sysmoUSIM-SJS1.ok</span><br><span>+++ b/pysim-testdata/sysmoUSIM-SJS1.ok</span><br><span>@@ -55,7 +55,7 @@</span><br><span> ACC: 0008</span><br><span> MSISDN (NPI=1 ToN=1): +77776336143</span><br><span> Administrative data: 00000002</span><br><span style="color: hsl(0, 100%, 40%);">-  MS operation mode: normal operation</span><br><span style="color: hsl(120, 100%, 40%);">+   MS operation mode: normal</span><br><span>    Ciphering Indicator: disabled</span><br><span> SIM Service Table: ff3fffff3f003f1ff00c00c0f00000</span><br><span>   Service 1 - CHV1 disable function</span><br><span>diff --git a/pysim-testdata/sysmosim-gr1.ok b/pysim-testdata/sysmosim-gr1.ok</span><br><span>index f4b09c8..3aff2a3 100644</span><br><span>--- a/pysim-testdata/sysmosim-gr1.ok</span><br><span>+++ b/pysim-testdata/sysmosim-gr1.ok</span><br><span>@@ -17,7 +17,7 @@</span><br><span> ACC: 0008</span><br><span> MSISDN: Not available</span><br><span> Administrative data: 000000</span><br><span style="color: hsl(0, 100%, 40%);">- MS operation mode: normal operation</span><br><span style="color: hsl(120, 100%, 40%);">+   MS operation mode: normal</span><br><span>    Ciphering Indicator: disabled</span><br><span> SIM Service Table: ff3fff0f0f0000030000</span><br><span>     Service 1 - CHV1 disable function</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/23723">change 23723</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/+/23723"/><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: I65e0a426f80a619fec38856a30e590f0e726b554 </div>
<div style="display:none"> Gerrit-Change-Number: 23723 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Falkenber9 <robert.falkenberg@tu-dortmund.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>